feat: Add inventory savegame loading (#48)
This commit is contained in:
@@ -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>,
|
||||
}
|
||||
|
||||
@@ -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) => {
|
||||
|
||||
@@ -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},
|
||||
|
||||
Reference in New Issue
Block a user