feat: Add watering (#27)

This commit is contained in:
demenik
2025-12-02 15:46:48 +01:00
parent d07dcc3e7c
commit 4df968af2e
7 changed files with 159 additions and 5 deletions

View File

@@ -91,7 +91,7 @@ fn test_plant_seed_interaction() {
let tile_entity = grid.get_tile((1, 1)).unwrap();
let tile_state = app.world().entity(tile_entity).get::<TileState>().unwrap();
if let TileState::Occupied { seed } = tile_state {
if let TileState::Occupied { seed, .. } = tile_state {
assert_eq!(
*seed,
ItemType::BerrySeed {
@@ -164,3 +164,89 @@ fn test_plant_seed_no_inventory() {
panic!("Tile should remain Empty, found {:?}", tile_state);
}
}
#[test]
fn test_water_crop() {
let seed_type = ItemType::BerrySeed {
name: "TestSeed".into(),
};
let mut app = setup_interaction_app(
3,
3,
&[(
1,
1,
TileState::Occupied {
seed: seed_type.clone(),
watered: false,
},
)],
vec![],
);
// Verify Water option is available
let _ = app.world_mut().run_system_once(
move |grid: Res<Grid>,
tile_query: Query<&TileState>,
inventory: Res<Inventory>,
item_query: Query<&ItemStack>| {
let tile_entity = grid.get_tile((1, 1)).unwrap();
let tile_state = tile_query.get(tile_entity).unwrap();
let options = InteractionAction::list_options(tile_state, &inventory, item_query);
assert!(
options.contains(&InteractionAction::Water),
"Water option should be available"
);
},
);
// Execute Water
let _ = app.world_mut().run_system_once(
move |grid: Res<Grid>,
mut tile_query: Query<&mut TileState>,
mut inventory: ResMut<Inventory>,
mut item_stack_query: Query<&mut ItemStack>,
mut commands: Commands| {
let action = InteractionAction::Water;
action.execute(
(1, 1),
&grid,
&mut tile_query,
&mut inventory,
&mut item_stack_query,
&mut commands,
);
},
);
app.update();
// Assert Tile State Watered
let grid = app.world().resource::<Grid>();
let tile_entity = grid.get_tile((1, 1)).unwrap();
let tile_state = app.world().entity(tile_entity).get::<TileState>().unwrap();
if let TileState::Occupied { watered, .. } = tile_state {
assert!(watered, "Tile should be watered");
} else {
panic!("Tile should be Occupied, found {:?}", tile_state);
}
// Verify Water option is NOT available
let _ = app.world_mut().run_system_once(
move |grid: Res<Grid>,
tile_query: Query<&TileState>,
inventory: Res<Inventory>,
item_query: Query<&ItemStack>| {
let tile_entity = grid.get_tile((1, 1)).unwrap();
let tile_state = tile_query.get(tile_entity).unwrap();
let options = InteractionAction::list_options(tile_state, &inventory, item_query);
assert!(
!options.contains(&InteractionAction::Water),
"Water option should NOT be available"
);
},
);
}

View File

@@ -91,8 +91,9 @@ fn test_find_path_simple() {
fn test_find_path_around_obstacle() {
let obstacle: TileState = TileState::Occupied {
seed: ItemType::BerrySeed {
name: "test".into(),
name: "Test".into(),
},
watered: false,
};
let obstacles = vec![
(2, 2, obstacle.clone()),
@@ -142,8 +143,9 @@ fn test_find_path_around_obstacle() {
fn test_find_path_no_path() {
let obstacle: TileState = TileState::Occupied {
seed: ItemType::BerrySeed {
name: "test".into(),
name: "Test".into(),
},
watered: false,
};
let obstacles = vec![
(2, 0, obstacle.clone()),