From 4a4cdf7d148be0a2a756f323d27c0ee5b7976438 Mon Sep 17 00:00:00 2001 From: troido Date: Fri, 14 Feb 2020 14:36:32 +0100 Subject: extract the state to save --- src/room.rs | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) (limited to 'src/room.rs') diff --git a/src/room.rs b/src/room.rs index 9aad22d..dbcfe0d 100644 --- a/src/room.rs +++ b/src/room.rs @@ -5,7 +5,8 @@ use specs::{ World, WorldExt, DispatcherBuilder, - Dispatcher + Dispatcher, + Join }; use super::controls::Action; @@ -27,8 +28,10 @@ use super::systems::{ create::Create, take::Take }; +use crate::components::{Position, Serialise}; use crate::encyclopedia::Encyclopedia; use crate::roomtemplate::RoomTemplate; +use crate::savestate::SaveState; @@ -45,6 +48,7 @@ impl <'a, 'b>Room<'a, 'b> { templates: Vec::new(), encyclopedia }); + world.register::(); let mut dispatcher = DispatcherBuilder::new() .with(RegisterNew::default(), "registernew", &[]) @@ -78,7 +82,9 @@ impl <'a, 'b>Room<'a, 'b> { let y = (idx as i64) / width; for template in templates { - self.world.fetch_mut::().templates.push((Pos{x, y}, template.clone())); + let mut obj = template.clone(); + obj.save = false; + self.world.fetch_mut::().templates.push((Pos{x, y}, obj)); } } } @@ -96,6 +102,16 @@ impl <'a, 'b>Room<'a, 'b> { self.world.fetch_mut::().actions = actions; } + pub fn save(&self) -> SaveState { + let positions = self.world.read_component::(); + let serialisers = self.world.write_component::(); + let mut state = SaveState::new(); + for (pos, serialiser) in (&positions, &serialisers).join() { + state.changes.entry(pos.pos).or_insert(Vec::new()).push(serialiser.template.clone()); + } + state + } + } -- cgit