diff --git a/src/features/inventory/components.rs b/src/features/inventory/components.rs index 009269f..bbb5ff5 100644 --- a/src/features/inventory/components.rs +++ b/src/features/inventory/components.rs @@ -3,7 +3,18 @@ use crate::prelude::*; #[derive(Component)] pub struct Item; -#[derive(Resource, Default)] +#[derive(Serialize, Deserialize, Clone)] +pub enum ItemType { + Berry, +} + +#[derive(Component, Serialize, Deserialize, Clone)] +pub struct ItemStack { + pub item_type: ItemType, + pub amount: u32, +} + +#[derive(Resource, Default, Serialize, Deserialize)] pub struct Inventory { pub items: Vec, } diff --git a/src/features/savegame/mod.rs b/src/features/savegame/mod.rs index d52d6b6..a492b1c 100644 --- a/src/features/savegame/mod.rs +++ b/src/features/savegame/mod.rs @@ -28,6 +28,7 @@ struct SaveData { session_tracker: SessionTracker, timer_settings: TimerSettings, pom_position: GridPosition, + inventory: Vec, } fn dump_savegame( @@ -39,6 +40,8 @@ fn dump_savegame( tracker: Res, settings: Res, pom_query: Query<&GridPosition, With>, + inventory: Res, + item_query: Query<&ItemStack>, ) { for _ in messages.read() { let mut tile_states = Vec::new(); @@ -61,6 +64,12 @@ fn dump_savegame( let pom_pos = pom_query.single().unwrap(); + let item_stacks: Vec = inventory + .items + .iter() + .filter_map(|entity| item_query.get(*entity).ok().cloned()) + .collect(); + let save_data = SaveData { grid_width: grid.width, grid_height: grid.height, @@ -69,6 +78,7 @@ fn dump_savegame( session_tracker: tracker.clone(), timer_settings: settings.clone(), pom_position: *pom_pos, + inventory: item_stacks, }; match serde_json::to_string_pretty(&save_data) { @@ -91,6 +101,7 @@ fn dump_savegame( } fn load_savegame( + mut commands: Commands, mut messages: MessageReader, save_path: Res, grid: Res, @@ -99,6 +110,7 @@ fn load_savegame( mut tracker: ResMut, mut settings: ResMut, mut pom_query: Query<(&mut GridPosition, &mut Transform), With>, + mut inventory: ResMut, ) { for _ in messages.read() { if let Ok(mut file) = File::open(&save_path.0) { @@ -136,6 +148,14 @@ fn load_savegame( } } } + + let stack_entities: Vec = save_data + .inventory + .iter() + .map(|stack| commands.spawn(stack.clone()).id()) + .collect(); + inventory.items = stack_entities; + println!("Game loaded from {}", save_path.0.display()); } Err(e) => { diff --git a/src/prelude.rs b/src/prelude.rs index 5bfe8e3..51be80d 100644 --- a/src/prelude.rs +++ b/src/prelude.rs @@ -7,7 +7,7 @@ pub use crate::features::{ consts::TILE_SIZE, utils::{grid_to_world_coords, world_to_grid_coords}, }, - inventory::components::{Inventory, Item}, + inventory::components::{Inventory, Item, ItemStack, ItemType}, phase::components::{CurrentPhase, Phase}, pom::{ components::{GridPosition, MovingState, Pom},