feat: Add inventory savegame loading (#48)

This commit is contained in:
demenik
2025-11-27 18:08:35 +01:00
parent afe3b97894
commit 78997acf31
3 changed files with 33 additions and 2 deletions

View File

@@ -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<Entity>,
}

View File

@@ -28,6 +28,7 @@ struct SaveData {
session_tracker: SessionTracker,
timer_settings: TimerSettings,
pom_position: GridPosition,
inventory: Vec<ItemStack>,
}
fn dump_savegame(
@@ -39,6 +40,8 @@ fn dump_savegame(
tracker: Res<SessionTracker>,
settings: Res<TimerSettings>,
pom_query: Query<&GridPosition, With<Pom>>,
inventory: Res<Inventory>,
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<ItemStack> = 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<SavegameLoadMessage>,
save_path: Res<SavegamePath>,
grid: Res<Grid>,
@@ -99,6 +110,7 @@ fn load_savegame(
mut tracker: ResMut<SessionTracker>,
mut settings: ResMut<TimerSettings>,
mut pom_query: Query<(&mut GridPosition, &mut Transform), With<Pom>>,
mut inventory: ResMut<Inventory>,
) {
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<Entity> = 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) => {

View File

@@ -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},