diff --git a/assets/berry.aseprite b/assets/berry.aseprite new file mode 100644 index 0000000..2675e6e Binary files /dev/null and b/assets/berry.aseprite differ diff --git a/assets/config.json b/assets/config.json index 2695fb3..0eb9d0b 100644 --- a/assets/config.json +++ b/assets/config.json @@ -1,5 +1,28 @@ { "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", + "growth_stages": 2 + }, + { + "name": "Super-Samen", + "cost": 3, + "grants": 9, + "slice": "Seed2", + "growth_stages": 4 + }, + { + "name": "Zauber-Samen", + "cost": 5, + "grants": 20, + "slice": "Seed3", + "growth_stages": 6 + } + ] +} \ No newline at end of file diff --git a/assets/seed.aseprite b/assets/seed.aseprite new file mode 100644 index 0000000..2bf5839 Binary files /dev/null and b/assets/seed.aseprite differ diff --git a/src/features/config/components.rs b/src/features/config/components.rs index 63c4fc6..5319dbe 100644 --- a/src/features/config/components.rs +++ b/src/features/config/components.rs @@ -7,6 +7,16 @@ 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, + pub growth_stages: u32, } impl Default for GameConfig { @@ -15,6 +25,29 @@ 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(), + growth_stages: 2, + }, + BerrySeedConfig { + name: "Super-Samen".to_string(), + cost: 3, + grants: 9, + slice: "Seed2".to_string(), + growth_stages: 4, + }, + BerrySeedConfig { + name: "Zauber-Samen".to_string(), + cost: 5, + grants: 20, + slice: "Seed3".to_string(), + growth_stages: 6, + }, + ], } } } diff --git a/src/features/inventory/components.rs b/src/features/inventory/components.rs index bf2e418..0008095 100644 --- a/src/features/inventory/components.rs +++ b/src/features/inventory/components.rs @@ -1,30 +1,91 @@ -use crate::prelude::*; +use crate::{features::config::components::BerrySeedConfig, prelude::*}; -#[derive(Serialize, Deserialize, Clone)] +#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, Hash)] pub enum ItemType { Berry, + BerrySeed { name: String }, } impl ItemType { - pub fn singular(&self) -> String { + pub fn singular(&self, game_config: &GameConfig) -> String { match self { - ItemType::Berry => "Beere", + ItemType::Berry => "Beere".into(), + 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)) + } } - .into() } - pub fn plural(&self) -> String { + pub fn plural(&self, game_config: &GameConfig) -> String { match self { - ItemType::Berry => "Beeren", + ItemType::Berry => "Beeren".into(), + 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)) + } } - .into() } - 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.", + ItemType::Berry => { + "Von Pflanzen erntbar. Kann im Shop zum Einkaufen benutzt werden.".into() + } + 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. Benötigt {} Fokus-Phasen zum Wachsen. Erhalte beim Ernten {} {}.", + s.growth_stages, + s.grants, + match s.grants { + 1 => ItemType::Berry.singular(game_config), + _ => ItemType::Berry.plural(game_config), + } + ) + } else { + format!("Unbekannter Samen ({})", name) + } + } + } + } + + pub fn get_seed_config<'a>(&self, game_config: &'a GameConfig) -> Option<&'a BerrySeedConfig> { + match self { + ItemType::Berry => None, + ItemType::BerrySeed { name } => { + game_config.berry_seeds.iter().find(|s| s.name == *name) + } + } + } + + 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 { 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"), + } + } + } } - .into() } } 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