From 715031d57015cc6c9de48fde2d8f9a40624c3923 Mon Sep 17 00:00:00 2001 From: demenik Date: Tue, 2 Dec 2025 17:04:57 +0100 Subject: [PATCH] feat: Visualise crop growth --- src/features/grid/mod.rs | 36 ++++++++++++++++++++++++++++++++---- 1 file changed, 32 insertions(+), 4 deletions(-) diff --git a/src/features/grid/mod.rs b/src/features/grid/mod.rs index 3357d7a..e94af2b 100644 --- a/src/features/grid/mod.rs +++ b/src/features/grid/mod.rs @@ -89,9 +89,16 @@ fn cleanup(mut commands: Commands, tile_query: Query>) { fn update_tiles( mut query: Query<(&TileState, &mut AseSlice, &Children)>, - mut crop_query: Query<&mut Visibility, (With, Without)>, - mut water_query: Query<&mut Visibility, (With, Without)>, + mut crop_query: Query< + (&mut Visibility, &mut Transform), + (With, Without), + >, + mut water_query: Query< + (&mut Visibility, &mut Transform), + (With, Without), + >, asset_server: Res, + game_config: Res, ) { for (state, mut slice, children) in &mut query { slice.name = match state { @@ -107,18 +114,39 @@ fn update_tiles( TileState::Occupied { .. } => asset_server.load("tiles/tile-occupied.aseprite"), }; + let scale: Vec3 = match state { + TileState::Occupied { + seed, growth_stage, .. + } => { + let max_stages = seed + .get_seed_config(&game_config) + .map(|config| config.growth_stages) + .unwrap_or(0); + + if max_stages > 0 { + let progress = (*growth_stage as f32 / max_stages as f32).min(1.0); + Vec3::splat(0.3 + (progress * 0.7)) + } else { + Vec3::ONE + } + } + _ => Vec3::ONE, + }; + for child in children.iter() { - if let Ok(mut visibility) = crop_query.get_mut(child) { + if let Ok((mut visibility, mut transform)) = crop_query.get_mut(child) { *visibility = match state { TileState::Occupied { .. } => Visibility::Visible, _ => Visibility::Hidden, }; + transform.scale = scale; } - if let Ok(mut visibility) = water_query.get_mut(child) { + if let Ok((mut visibility, mut transform)) = water_query.get_mut(child) { *visibility = match state { TileState::Occupied { watered: true, .. } => Visibility::Visible, _ => Visibility::Hidden, }; + transform.scale = scale; } } }