feat: Allow TileState to hold ItemType (Seeds)

This commit is contained in:
demenik
2025-12-02 12:53:58 +01:00
parent 3009d09720
commit 3da9931513
5 changed files with 27 additions and 19 deletions

View File

@@ -7,18 +7,20 @@ pub struct Tile {
pub y: u32,
}
#[derive(Component, Default, Serialize, Deserialize, Clone, Copy, Debug)]
#[derive(Component, Default, Serialize, Deserialize, Clone, Debug)]
pub enum TileState {
#[default]
Unclaimed,
Empty,
Occupied,
Occupied {
seed: ItemType,
},
}
impl TileState {
pub fn is_blocking(&self) -> bool {
match self {
TileState::Occupied => true,
TileState::Occupied { .. } => true,
_ => false,
}
}

View File

@@ -73,14 +73,14 @@ fn update_tile_colors(
slice.name = match state {
TileState::Unclaimed => "Unclaimed",
TileState::Empty => "Empty",
TileState::Occupied => "Occupied",
TileState::Occupied { .. } => "Occupied",
}
.into();
slice.aseprite = match state {
TileState::Unclaimed => asset_server.load("tiles/tile-unclaimed.aseprite"),
TileState::Empty => asset_server.load("tiles/tile-empty.aseprite"),
TileState::Occupied => asset_server.load("tiles/tile-occupied.aseprite"),
TileState::Occupied { .. } => asset_server.load("tiles/tile-occupied.aseprite"),
};
}
}

View File

@@ -121,8 +121,12 @@ fn debug_click(
(x, y),
|state| match state {
TileState::Unclaimed => TileState::Empty,
TileState::Empty => TileState::Occupied,
TileState::Occupied => TileState::Unclaimed,
TileState::Empty => TileState::Occupied {
seed: ItemType::BerrySeed {
name: "Debug".into(),
},
},
TileState::Occupied { .. } => TileState::Unclaimed,
},
tile_query,
)

View File

@@ -55,7 +55,7 @@ fn dump_savegame(
for y in 0..grid.height {
if let Ok(entity) = grid.get_tile((x, y)) {
if let Ok(state) = tile_query.get(entity) {
col.push(*state);
col.push(state.clone());
} else {
col.push(TileState::Unclaimed);
}
@@ -146,7 +146,7 @@ fn load_savegame(
if x < grid.width && y < grid.height {
if let Ok(entity) = grid.get_tile((x, y)) {
if let Ok(mut state) = tile_query.get_mut(entity) {
*state = save_data.tiles[x as usize][y as usize];
*state = save_data.tiles[x as usize][y as usize].clone();
}
}
}

View File

@@ -4,6 +4,12 @@ use pomomon_garden::features::pom::utils::find_path;
use pomomon_garden::prelude::*;
use std::collections::VecDeque;
const OBSTACLE: TileState = TileState::Occupied {
seed: ItemType::BerrySeed {
name: "test".into(),
},
};
// Helper to set up a Bevy App for pathfinding tests
fn setup_pathfinding_app(
grid_width: u32,
@@ -89,11 +95,7 @@ fn test_find_path_simple() {
#[test]
fn test_find_path_around_obstacle() {
let obstacles = vec![
(2, 2, TileState::Occupied),
(2, 3, TileState::Occupied),
(2, 4, TileState::Occupied),
];
let obstacles = vec![(2, 2, OBSTACLE), (2, 3, OBSTACLE), (2, 4, OBSTACLE)];
let mut app = setup_pathfinding_app(5, 5, &obstacles);
let _ = app.world_mut().insert_resource(PathResult(None));
@@ -136,11 +138,11 @@ fn test_find_path_around_obstacle() {
#[test]
fn test_find_path_no_path() {
let obstacles = vec![
(2, 0, TileState::Occupied),
(2, 1, TileState::Occupied),
(2, 2, TileState::Occupied),
(2, 3, TileState::Occupied),
(2, 4, TileState::Occupied),
(2, 0, OBSTACLE),
(2, 1, OBSTACLE),
(2, 2, OBSTACLE),
(2, 3, OBSTACLE),
(2, 4, OBSTACLE),
];
let mut app = setup_pathfinding_app(5, 5, &obstacles);