diff options
| author | troido <troido@protonmail.com> | 2020-03-09 16:54:26 +0100 |
|---|---|---|
| committer | troido <troido@protonmail.com> | 2020-03-09 16:54:26 +0100 |
| commit | 69ac6eb6153b016c39bbe55c85f15e3478032182 (patch) | |
| tree | 31a0a5cf3d768688c7600902364446d55e3f4395 /src/room.rs | |
| parent | a1f45d1b40b23cb7e9f0b277f24ad66880b0bc56 (diff) | |
can now include variables (like health) in serialisation
Diffstat (limited to 'src/room.rs')
| -rw-r--r-- | src/room.rs | 14 |
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 } |
