summaryrefslogtreecommitdiff
path: root/src/room.rs
diff options
context:
space:
mode:
authortroido <troido@protonmail.com>2020-03-09 16:54:26 +0100
committertroido <troido@protonmail.com>2020-03-09 16:54:26 +0100
commit69ac6eb6153b016c39bbe55c85f15e3478032182 (patch)
tree31a0a5cf3d768688c7600902364446d55e3f4395 /src/room.rs
parenta1f45d1b40b23cb7e9f0b277f24ad66880b0bc56 (diff)
can now include variables (like health) in serialisation
Diffstat (limited to 'src/room.rs')
-rw-r--r--src/room.rs14
1 files changed, 12 insertions, 2 deletions
diff --git a/src/room.rs b/src/room.rs
index e78cbd5..983ba11 100644
--- a/src/room.rs
+++ b/src/room.rs
@@ -38,6 +38,7 @@ use crate::{
savestate::SaveState,
Template,
playerstate::{PlayerState, RoomPos},
+ componentwrapper::extract_parameter,
Pos,
PlayerId,
RoomId,
@@ -201,11 +202,20 @@ impl <'a, 'b>Room<'a, 'b> {
}
pub fn save(&self) -> SaveState {
+ let entities = self.world.entities();
let positions = self.world.read_component::<Position>();
let serialisers = self.world.read_component::<Serialise>();
let mut state = SaveState::new();
- for (pos, serialiser) in (&positions, &serialisers).join() {
- state.changes.entry(pos.pos).or_insert_with(Vec::new).push(serialiser.template.clone());
+ for (entity, pos, serialiser) in (&entities, &positions, &serialisers).join() {
+ let mut template = serialiser.template.clone();
+ for (argument, component, member) in &serialiser.extract {
+ if let Some(parameter) = extract_parameter(*component, member.as_str(), &self.world, entity){
+ template.kwargs.insert(argument.clone(), parameter);
+ } else {
+ println!("failed to extract parameter {:?} from {:?}", member, component);
+ }
+ }
+ state.changes.entry(pos.pos).or_insert_with(Vec::new).push(template);
}
state
}