serialises dungeon map
This commit is contained in:
parent
2a8691efff
commit
7460ddee05
3 changed files with 27 additions and 7 deletions
|
|
@ -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>,
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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();
|
||||||
|
|
|
||||||
|
|
@ -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() {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue