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)]
|
||||
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>,
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
|
|
|||
|
|
@ -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() {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue