diff --git a/assets/config.json b/assets/config.json index 2695fb3..43ea227 100644 --- a/assets/config.json +++ b/assets/config.json @@ -1,5 +1,25 @@ { "grid_width": 12, "grid_height": 4, - "pom_speed": 1.5 + "pom_speed": 1.5, + "berry_seeds": [ + { + "name": "Normale Samen", + "cost": 1, + "grants": 2, + "slice": "Seed1" + }, + { + "name": "Super-Samen", + "cost": 3, + "grants": 9, + "slice": "Seed2" + }, + { + "name": "Zauber-Samen", + "cost": 5, + "grants": 20, + "slice": "Seed3" + } + ] } diff --git a/src/features/config/components.rs b/src/features/config/components.rs index 63c4fc6..652e70e 100644 --- a/src/features/config/components.rs +++ b/src/features/config/components.rs @@ -7,6 +7,15 @@ pub struct GameConfig { pub grid_width: u32, pub grid_height: u32, pub pom_speed: f32, + pub berry_seeds: Vec, +} + +#[derive(Deserialize, Debug, Clone)] +pub struct BerrySeedConfig { + pub name: String, + pub cost: u32, + pub grants: u32, + pub slice: String, } impl Default for GameConfig { @@ -15,6 +24,26 @@ impl Default for GameConfig { grid_width: 12, grid_height: 4, pom_speed: 1.5, + berry_seeds: vec![ + BerrySeedConfig { + name: "Normale Samen".to_string(), + cost: 1, + grants: 2, + slice: "Seed1".to_string(), + }, + BerrySeedConfig { + name: "Super-Samen".to_string(), + cost: 3, + grants: 9, + slice: "Seed2".to_string(), + }, + BerrySeedConfig { + name: "Zauber-Samen".to_string(), + cost: 5, + grants: 20, + slice: "Seed3".to_string(), + }, + ], } } } diff --git a/src/features/inventory/components.rs b/src/features/inventory/components.rs index cc41777..7b793c7 100644 --- a/src/features/inventory/components.rs +++ b/src/features/inventory/components.rs @@ -1,57 +1,80 @@ use crate::prelude::*; -#[derive(Serialize, Deserialize, Clone)] +#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, Hash)] pub enum ItemType { Berry, - BerrySeed { - prefix: String, - cost: u32, - grants: u32, - slice: String, - }, + BerrySeed { name: String }, } impl ItemType { - pub fn singular(&self) -> String { + pub fn singular(&self, game_config: &GameConfig) -> String { match self { ItemType::Berry => "Beere".into(), - ItemType::BerrySeed { prefix, .. } => format!("{}samen", prefix), + ItemType::BerrySeed { name } => { + let seed_config = game_config.berry_seeds.iter().find(|s| s.name == *name); + seed_config + .map(|s| s.name.clone()) + .unwrap_or_else(|| format!("Unbekannter Samen ({})", name)) + } } } - pub fn plural(&self) -> String { + pub fn plural(&self, game_config: &GameConfig) -> String { match self { ItemType::Berry => "Beeren".into(), - ItemType::BerrySeed { prefix, .. } => format!("{}samen", prefix), + ItemType::BerrySeed { name } => { + let seed_config = game_config.berry_seeds.iter().find(|s| s.name == *name); + seed_config + .map(|s| s.name.clone()) + .unwrap_or_else(|| format!("Unbekannte Samen ({})", name)) + } } } - pub fn description(&self) -> String { + pub fn description(&self, game_config: &GameConfig) -> String { match self { ItemType::Berry => { "Von Pflanzen erntbar. Kann im Shop zum Einkaufen benutzt werden.".into() } - ItemType::BerrySeed { grants, .. } => format!( - "Im Shop kaufbar. Kann eingepflanzt werden. Erhalte beim Ernten {} {}.", - grants, - match grants { - 1 => ItemType::Berry.singular(), - _ => ItemType::Berry.plural(), + ItemType::BerrySeed { name } => { + let seed_config = game_config.berry_seeds.iter().find(|s| s.name == *name); + if let Some(s) = seed_config { + format!( + "Im Shop kaufbar. Kann eingepflanzt werden. Erhalte beim Ernten {} {}.", + s.grants, + match s.grants { + 1 => ItemType::Berry.singular(game_config), + _ => ItemType::Berry.plural(game_config), + } + ) + } else { + format!("Unbekannter Samen ({})", name) } - ), + } } } - pub fn get_sprite(&self, asset_server: Res) -> AseSlice { + pub fn get_sprite(&self, asset_server: Res, game_config: &GameConfig) -> AseSlice { match self { ItemType::Berry => AseSlice { name: "Berry".into(), aseprite: asset_server.load("berry.aseprite"), }, - ItemType::BerrySeed { slice, .. } => AseSlice { - name: slice.into(), - aseprite: asset_server.load("seed.aseprite"), - }, + ItemType::BerrySeed { name } => { + let seed_config = game_config.berry_seeds.iter().find(|s| s.name == *name); + if let Some(s) = seed_config { + AseSlice { + name: s.slice.clone(), + aseprite: asset_server.load("seed.aseprite"), + } + } else { + // Fallback for unknown seed + AseSlice { + name: "Seed1".into(), + aseprite: asset_server.load("seed.aseprite"), + } + } + } } } } diff --git a/src/features/inventory/mod.rs b/src/features/inventory/mod.rs index 1b60ee8..2915d40 100644 --- a/src/features/inventory/mod.rs +++ b/src/features/inventory/mod.rs @@ -19,12 +19,13 @@ fn buttons( mut interaction_query: Query<(&Interaction, &ButtonType), (Changed, With