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)] #[derive(Component, Serialize, Deserialize, Clone)]
pub struct SerializationHelper { pub struct SerializationHelper {
pub map: super::map::Map, 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 log: Vec<Vec<crate::gamelog::LogFragment>>,
pub events: HashMap<String, i32>, pub events: HashMap<String, i32>,
} }

View file

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

View file

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