serialises dungeon map

This commit is contained in:
Llywelwyn 2023-08-13 10:03:30 +01:00
parent 2a8691efff
commit 7460ddee05
3 changed files with 27 additions and 7 deletions

View file

@ -13,6 +13,11 @@ pub struct SerializeMe;
#[derive(Component, Serialize, Deserialize, Clone)]
pub struct SerializationHelper {
pub map: super::map::Map,
}
#[derive(Component, Serialize, Deserialize, Clone)]
pub struct DMSerializationHelper {
pub map: super::map::MasterDungeonMap,
pub log: Vec<Vec<crate::gamelog::LogFragment>>,
pub events: HashMap<String, i32>,
}

View file

@ -520,6 +520,7 @@ fn main() -> rltk::BError {
gs.ecs.register::<ParticleLifetime>();
gs.ecs.register::<SimpleMarker<SerializeMe>>();
gs.ecs.register::<SerializationHelper>();
gs.ecs.register::<DMSerializationHelper>();
gs.ecs.insert(SimpleMarkerAllocator::<SerializeMe>::new());
raws::load_raws();

View file

@ -27,10 +27,13 @@ pub fn save_game(_ecs: &mut World) {}
pub fn save_game(ecs: &mut World) {
// Create helper
let mapcopy = ecs.get_mut::<super::map::Map>().unwrap().clone();
let savehelper = ecs
let dungeon_master = ecs.get_mut::<super::map::MasterDungeonMap>().unwrap().clone();
let savehelper =
ecs.create_entity().with(SerializationHelper { map: mapcopy }).marked::<SimpleMarker<SerializeMe>>().build();
let savehelper2 = ecs
.create_entity()
.with(SerializationHelper {
map: mapcopy,
.with(DMSerializationHelper {
map: dungeon_master,
log: crate::gamelog::clone_log(),
events: crate::gamelog::clone_events(),
})
@ -102,12 +105,14 @@ pub fn save_game(ecs: &mut World) {
WantsToPickupItem,
WantsToRemoveItem,
WantsToUseItem,
SerializationHelper
SerializationHelper,
DMSerializationHelper
);
}
// Clean up
ecs.delete_entity(savehelper).expect("Crash on cleanup");
ecs.delete_entity(savehelper).expect("<savehelper> Crash on cleanup");
ecs.delete_entity(savehelper2).expect("<savehelper2> Crash on cleanup");
}
pub fn does_save_exist() -> bool {
@ -210,14 +215,17 @@ pub fn load_game(ecs: &mut World) {
WantsToPickupItem,
WantsToRemoveItem,
WantsToUseItem,
SerializationHelper
SerializationHelper,
DMSerializationHelper
);
}
let mut deleteme: Option<Entity> = None;
let mut deleteme2: Option<Entity> = None;
{
let entities = ecs.entities();
let helper = ecs.read_storage::<SerializationHelper>();
let helper2 = ecs.read_storage::<DMSerializationHelper>();
let player = ecs.read_storage::<Player>();
let position = ecs.read_storage::<Position>();
for (e, h) in (&entities, &helper).join() {
@ -225,6 +233,11 @@ pub fn load_game(ecs: &mut World) {
*worldmap = h.map.clone();
worldmap.tile_content = vec![Vec::new(); (worldmap.width * worldmap.height) as usize];
deleteme = Some(e);
}
for (e, h) in (&entities, &helper2).join() {
let mut dungeonmaster = ecs.write_resource::<super::map::MasterDungeonMap>();
*dungeonmaster = h.map.clone();
deleteme2 = Some(e);
crate::gamelog::restore_log(&mut h.log.clone());
crate::gamelog::load_events(h.events.clone());
}
@ -235,7 +248,8 @@ pub fn load_game(ecs: &mut World) {
*player_resource = e;
}
}
ecs.delete_entity(deleteme.unwrap()).expect("Unable to delete helper");
ecs.delete_entity(deleteme.unwrap()).expect("<deleteme> Unable to delete helper");
ecs.delete_entity(deleteme2.unwrap()).expect("<deleteme2> Unable to delete helper");
}
pub fn delete_save() {