diff --git a/src/features/grid/components.rs b/src/features/grid/components.rs index 571e63f..94f1e5a 100644 --- a/src/features/grid/components.rs +++ b/src/features/grid/components.rs @@ -74,4 +74,19 @@ impl Grid { *tile_state = mapper(&*tile_state); Ok(()) } -} \ No newline at end of file + + pub fn count_claimed_tiles(&self, tile_query: &Query<&TileState>) -> u32 { + self.tiles + .iter() + .flatten() + .filter(|&entity| { + if let Ok(state) = tile_query.get(*entity) { + !matches!(state, TileState::Unclaimed) + } else { + false + } + }) + .count() as u32 + } +} + diff --git a/src/features/input/mod.rs b/src/features/input/mod.rs index 3b7158b..0059c66 100644 --- a/src/features/input/mod.rs +++ b/src/features/input/mod.rs @@ -162,9 +162,17 @@ fn shop_keybind( mut commands: Commands, game_config: Res, asset_server: Res, + grid: Res, + tile_query: Query<&TileState>, ) { if keys.just_pressed(KeyCode::KeyP) { - open_shop(&mut commands, &game_config, &asset_server); + open_shop( + &mut commands, + &game_config, + &asset_server, + &grid, + &tile_query, + ); } } diff --git a/src/features/shop/mod.rs b/src/features/shop/mod.rs index ccb0cfa..b347b56 100644 --- a/src/features/shop/mod.rs +++ b/src/features/shop/mod.rs @@ -21,12 +21,14 @@ fn buttons( asset_server: Res, mut inventory: ResMut, mut items: Query<&mut ItemStack>, + grid: Res, + tile_query: Query<&TileState>, ) { for (interaction, button_type) in &mut interaction_query { match *interaction { Interaction::Pressed => match button_type { ButtonType::ShopOpen => { - open_shop(&mut commands, &game_config, &asset_server); + open_shop(&mut commands, &game_config, &asset_server, &grid, &tile_query); } ButtonType::ShopBuyItem(offer) => { if offer.buy(&mut inventory, &mut commands, &mut items) { diff --git a/src/features/shop/ui/shop.rs b/src/features/shop/ui/shop.rs index 0b260ab..4983b00 100644 --- a/src/features/shop/ui/shop.rs +++ b/src/features/shop/ui/shop.rs @@ -5,9 +5,11 @@ pub fn open_shop( commands: &mut Commands, game_config: &GameConfig, asset_server: &Res, + grid: &Grid, + tile_query: &Query<&TileState>, ) { - // TODO: calculate tile_count - let offers = ShopOffer::list_all(game_config, 0); + let tile_count = grid.count_claimed_tiles(tile_query); + let offers = ShopOffer::list_all(game_config, tile_count); spawn_popup( commands,