From 8904177869eff675e6bb602688868176a17e74b9 Mon Sep 17 00:00:00 2001 From: demenik Date: Wed, 3 Dec 2025 22:33:36 +0100 Subject: [PATCH] feat: Implement crop harvesting mechanics --- src/features/pom/actions.rs | 60 +++++++++++++++++++++++++++-- src/features/pom/mod.rs | 2 + src/features/pom/ui/context_menu.rs | 3 +- 3 files changed, 61 insertions(+), 4 deletions(-) diff --git a/src/features/pom/actions.rs b/src/features/pom/actions.rs index d88a62e..de80406 100644 --- a/src/features/pom/actions.rs +++ b/src/features/pom/actions.rs @@ -4,6 +4,7 @@ use crate::prelude::*; pub enum InteractionAction { Plant(ItemType), Water, + Harvest, } impl InteractionAction { @@ -11,6 +12,7 @@ impl InteractionAction { match self { InteractionAction::Plant(item) => format!("Pflanze {}", item.singular(game_config)), InteractionAction::Water => "Gießen".into(), + InteractionAction::Harvest => "Ernten".into(), } } @@ -22,6 +24,7 @@ impl InteractionAction { match self { InteractionAction::Plant(item) => Some(item.get_sprite(asset_server, game_config)), InteractionAction::Water => None, + InteractionAction::Harvest => Some(ItemType::Berry.get_sprite(asset_server, game_config)), } } @@ -29,13 +32,28 @@ impl InteractionAction { tile_state: &TileState, inventory: &Inventory, item_query: Query<&ItemStack>, + game_config: &GameConfig, ) -> Vec { let mut options: Vec = vec![]; match tile_state { - TileState::Occupied { watered, .. } => { - if !*watered { - options.push(InteractionAction::Water); + TileState::Occupied { + watered, + withered, + seed, + growth_stage, + .. + } => { + if *withered { + options.push(InteractionAction::Harvest); + } else if let ItemType::BerrySeed { name } = seed { + if let Some(config) = game_config.berry_seeds.iter().find(|s| s.name == *name) { + if *growth_stage >= config.growth_stages { + options.push(InteractionAction::Harvest); + } else if !*watered { + options.push(InteractionAction::Water); + } + } } } TileState::Empty => { @@ -69,6 +87,7 @@ impl InteractionAction { inventory: &mut Inventory, item_stack_query: &mut Query<&mut ItemStack>, commands: &mut Commands, + game_config: &GameConfig, ) { let Ok(tile_entity) = grid.get_tile(pos) else { println!("Error during interaction: Couldn't get tile_entity"); @@ -123,6 +142,41 @@ impl InteractionAction { println!("Tile is not occupied, cannot water."); } } + InteractionAction::Harvest => { + if let TileState::Occupied { + seed, + withered, + growth_stage, + .. + } = &*tile_state + { + let mut can_harvest = *withered; + + if !can_harvest { + if let ItemType::BerrySeed { name } = seed { + if let Some(config) = + game_config.berry_seeds.iter().find(|s| s.name == *name) + { + if *growth_stage >= config.growth_stages { + can_harvest = true; + inventory.update_item_stack( + commands, + item_stack_query, + ItemType::Berry, + config.grants as i32, + ); + } + } + } + } + + if can_harvest { + *tile_state = TileState::Empty; + } else { + println!("Cannot harvest: not withered and not fully grown."); + } + } + } } } } diff --git a/src/features/pom/mod.rs b/src/features/pom/mod.rs index 865acae..328df1d 100644 --- a/src/features/pom/mod.rs +++ b/src/features/pom/mod.rs @@ -191,6 +191,7 @@ fn perform_interaction( mut inventory: ResMut, mut item_stack_query: Query<&mut ItemStack>, mut commands: Commands, + config: Res, ) { for (pos, mut target_component, path_queue) in pom_query.iter_mut() { if let Some(target) = target_component.target { @@ -213,6 +214,7 @@ fn perform_interaction( &mut inventory, &mut item_stack_query, &mut commands, + &config, ); } } diff --git a/src/features/pom/ui/context_menu.rs b/src/features/pom/ui/context_menu.rs index 289bb52..580dbaf 100644 --- a/src/features/pom/ui/context_menu.rs +++ b/src/features/pom/ui/context_menu.rs @@ -53,7 +53,8 @@ pub fn spawn_context_menu( let Ok(tile_state) = tile_query.get(tile_entity) else { return; }; - let options = InteractionAction::list_options(tile_state, &inventory, item_query); + let options = + InteractionAction::list_options(tile_state, &inventory, item_query, &game_config); commands .spawn((