From 746f57e170570273eafff2cd3f5255fe1c7fe0ed Mon Sep 17 00:00:00 2001 From: demenik Date: Sun, 30 Nov 2025 15:57:33 +0100 Subject: [PATCH 1/7] feat: Add seed texture (#51) --- assets/seed.aseprite | Bin 0 -> 528 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 assets/seed.aseprite diff --git a/assets/seed.aseprite b/assets/seed.aseprite new file mode 100644 index 0000000000000000000000000000000000000000..c4b2d1c4f74e7808f4a22b429d557132ed4bcbb5 GIT binary patch literal 528 zcmWe&Vqkc%l#xLJ3>g_17*c>30n`~7L4phdKu8NP0ciTKk1SwYS%4OZ0WrG**h(bp z>Va$)2B4@qkfEet;;LbjW@*?TW_`a@#`U3+F$R%BREnN!yqBcq$)$=9oQ^-uTe z$~X9I!LwGJA%>U1K!)8*iZ5ABq{-h(9%Q`&Gm?Y;1KI2hK8cm7MGA&zfE-o@AO^z! z!0?0sF`!>6=A4~k%hh1O(|Y&LoH<8s-n^;2qk<#<(NS$p7CFVg*rH!c4CUEgZQwTb%_gJ-Mf$7h{UKRc~_%443rZ@q68A35-SYr)o7#n(-rJ3r_B sY=~NO^YGlJ@(8&pTfB5l|7!0Hsy?Epw(N_37W=~b`1cE>d(0y{0aKiuDF6Tf literal 0 HcmV?d00001 From 4412246f2db57db38e8c523b5f1808eacec8f0d9 Mon Sep 17 00:00:00 2001 From: demenik Date: Sun, 30 Nov 2025 16:26:47 +0100 Subject: [PATCH 2/7] feat: Add berry sprite (#51) --- assets/berry.aseprite | Bin 0 -> 555 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 assets/berry.aseprite diff --git a/assets/berry.aseprite b/assets/berry.aseprite new file mode 100644 index 0000000000000000000000000000000000000000..c5eba74350897c75b826e4d6b1251185c4c5b34a GIT binary patch literal 555 zcmdO9Vqkc%l#xLJ3>g_17*c>30W=vHL4phdKu8O)8ff~jk1SwYS%4OZ0WrG**h(bp zT7hg92B4@WkfEet;;LbjW@*?TW_`a@#`U3+F$R%BREnN!yqBcq$)$=9oQ^-uTe z$~Sl+nb^i}9k|2ojAY^q-{u#RrGb;&0;}8tm$}J<9HGFBxfgI`E#Tl< z$Ze7+%*+-x^CZLPd()@?y=hh}S-ws8$&AN3V&GJmsio_O8RVe#4m^DL>b3 zoFmAt_V)XSxo7`?Yf0?-F#G>cH#_ewmvr~*e?|W>THf`suz*P13 X1z-Ekw*9Yj?@39`oF{&vF`^RyLnx_u literal 0 HcmV?d00001 From 5d73ae30364f0a5b4df6caf7ca6be53f8cca1f91 Mon Sep 17 00:00:00 2001 From: demenik Date: Sun, 30 Nov 2025 16:28:56 +0100 Subject: [PATCH 3/7] fix: Add slice names --- assets/berry.aseprite | Bin 555 -> 614 bytes assets/seed.aseprite | Bin 528 -> 586 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/assets/berry.aseprite b/assets/berry.aseprite index c5eba74350897c75b826e4d6b1251185c4c5b34a..2675e6e86707a53414550a34bfe1807f871953d9 100644 GIT binary patch delta 90 zcmZ3@@{ENsZ6aem?=waQhF>4q7*ZG*7}zHE?zPqhGL#g6qHw^<;FMZaR0-z;846I$ T2ci|2fFuLM|NoP{7#{)v6}=BV delta 30 mcmaFHvYLfadm>{!?`lQ{hF>397*ZG*7+5Cu?w#Dq_z(b$hY7p@ diff --git a/assets/seed.aseprite b/assets/seed.aseprite index c4b2d1c4f74e7808f4a22b429d557132ed4bcbb5..401ea6b354fef561785d12aa7ccc71e0dccd197c 100644 GIT binary patch delta 89 zcmbQha*Bn~Ya(Mk?4q7*ZG*7}zHEZnx3_GL#g6qHw^%5S*F{l7|BYAPa=~ SK(qoAkYr%^|9`Rz;~4397*ZG*7+5CuZl7Gocm@E0L Date: Sun, 30 Nov 2025 16:31:23 +0100 Subject: [PATCH 4/7] feat: Add BerrySeed ItemType (#51) --- src/features/inventory/components.rs | 40 +++++++++++++++++++++++----- 1 file changed, 34 insertions(+), 6 deletions(-) diff --git a/src/features/inventory/components.rs b/src/features/inventory/components.rs index bf2e418..cc41777 100644 --- a/src/features/inventory/components.rs +++ b/src/features/inventory/components.rs @@ -3,28 +3,56 @@ use crate::prelude::*; #[derive(Serialize, Deserialize, Clone)] pub enum ItemType { Berry, + BerrySeed { + prefix: String, + cost: u32, + grants: u32, + slice: String, + }, } impl ItemType { pub fn singular(&self) -> String { match self { - ItemType::Berry => "Beere", + ItemType::Berry => "Beere".into(), + ItemType::BerrySeed { prefix, .. } => format!("{}samen", prefix), } - .into() } pub fn plural(&self) -> String { match self { - ItemType::Berry => "Beeren", + ItemType::Berry => "Beeren".into(), + ItemType::BerrySeed { prefix, .. } => format!("{}samen", prefix), } - .into() } pub fn description(&self) -> 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 { grants, .. } => format!( + "Im Shop kaufbar. Kann eingepflanzt werden. Erhalte beim Ernten {} {}.", + grants, + match grants { + 1 => ItemType::Berry.singular(), + _ => ItemType::Berry.plural(), + } + ), + } + } + + pub fn get_sprite(&self, asset_server: Res) -> 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"), + }, } - .into() } } From 7337b553ba134390407365944b0329fd3f434f1b Mon Sep 17 00:00:00 2001 From: demenik Date: Sun, 30 Nov 2025 16:40:36 +0100 Subject: [PATCH 5/7] fix: Add 3 seed variants (#51) --- assets/seed.aseprite | Bin 586 -> 1026 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/assets/seed.aseprite b/assets/seed.aseprite index 401ea6b354fef561785d12aa7ccc71e0dccd197c..2bf58399ff97626cf097e0fe9cd72093c37d8ccc 100644 GIT binary patch delta 648 zcmX@b(!{~Z#KOSvU@0R*!bHw;-X>-ShF>4K7*ZG*7`P_(ZkN;rGL#e;fg}vDG6bil zrWj6+VN{aCC2IsytS~u|Q5L5XV~`RDkP;?drpXPABK2VmVhj~?-p(-eJ7OT_@2k}T4>v;`Y8)*RQu9a`$(P&f0VK96o^}NGiddx(66r+MrMWXToq?);=NWY z{AzY*TC4Q`+H-q%e7gVqPPaCYnO(3n&hq;suf0X@j!vz5y5|ae(#1pZlDdDU2EKm# z>B_6~KNDWByn6q0e(2U;>FTt%H^$9 zr?l&%svqxtrLk$t*O1J(UB|xIpS|{>Pa^#9v`0~gt&?KDMt5bOvTk9`Ua_`v<=LGn z{W7)O+}8r4KL^b&J}GDUOH6Fd!fnr%nmwOnyW+jfy6nA8G4baf?z*OZ;_Fiom+AHC zHU5$Bm)A6u2S!zIv`gJP|5Fv?J=e^)M}JNET6c=QLVV?|Zd*|!ze)$6)s~ek)mkZY zJ~hk;EB?gsE#!p7Q%1wJw|3w7%oe#WZ1>Lh*RPqMDB61KZ0-JS&(=>{eKoH)ZjHg# xe-CeVi!QrnZ&SVT(3M~AYvp+UE_UT_`*(2>yYqjGY6H`A{nf|K-%nGx3IGCXDeV9N delta 269 zcmZqTIK{&0#l*nyU@0Sm!bHw;-cyVW48K0IF{CgsFtAPR-7cX6WGE>BMd5&jAviTP zWpXT|QvDgAAgclp1L1$5F%TfeAjVKJ=j;?)t_B01*1LD+%sF!N=1t`t6&(4Gj%sVN z$SL-2>r7A-VBf!Q-=C7$yOGcBPOflSapv`nOFMfkzh$1dFK1?KIK%(qDYvy}QuoT8 z{UX0l_A`gxtD|>bJ8Le=5?>g)Y4Pvx`c}R>u1(yh7(81&KR)Y>`q^paQy%l|ed~R* z_{f3pTMM?vD!y*|-1#~0XG7GQn}_E%l}E@;+2W;Z`d52rQ1uZ#wPj!Qv)C8b$G=}7 J-D4iv2>=}gZFm3x From 710f7beb5ad6d5258753d44fbf7f1142a1d7d280 Mon Sep 17 00:00:00 2001 From: demenik Date: Sun, 30 Nov 2025 16:59:23 +0100 Subject: [PATCH 6/7] feat: Add seed game config entries (#51) --- assets/config.json | 22 +++++++- src/features/config/components.rs | 29 +++++++++++ src/features/inventory/components.rs | 71 +++++++++++++++++--------- src/features/inventory/mod.rs | 3 +- src/features/inventory/ui/inventory.rs | 5 +- src/features/inventory/ui/item.rs | 12 +++-- 6 files changed, 110 insertions(+), 32 deletions(-) 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