Browse Source

Fix previous commit.

Herbert Wolverson 4 years ago
parent
commit
f0a94e1ec4
2 changed files with 33 additions and 0 deletions
  1. 1 0
      .gitignore
  2. 32 0
      chapter-11-loadsave/src/saveload_system.rs

+ 1 - 0
.gitignore

@@ -1,3 +1,4 @@
 /target
 **/*.rs.bk
 book/book
+savegame.json

+ 32 - 0
chapter-11-loadsave/src/saveload_system.rs

@@ -0,0 +1,32 @@
+use specs::prelude::*;
+use specs::saveload::{SimpleMarker, SerializeComponents};
+use specs::error::NoError;
+use super::components::*;
+use std::fs::File;
+use std::io::Write;
+
+macro_rules! serialize_individually {
+    ($ecs:expr, $ser:expr, $data:expr, $( $type:ty),*) => {
+        $(
+        SerializeComponents::<NoError, SimpleMarker<SerializeMe>>::serialize(
+            &( $ecs.read_storage::<$type>(), ),
+            &$data.0,
+            &$data.1,
+            &mut $ser,
+        )
+        .unwrap();
+        )*
+    };
+}
+
+pub fn save_game(ecs : &World) {
+    let data = ( ecs.entities(), ecs.read_storage::<SimpleMarker<SerializeMe>>() );
+
+    let writer = File::create("./savegame.json").unwrap();
+    let mut serializer = serde_json::Serializer::new(writer);
+    serialize_individually!(ecs, serializer, data, Position, Renderable, Player, Viewshed, Monster, 
+        Name, BlocksTile, CombatStats, SufferDamage, WantsToMelee, Item, Consumable, Ranged, InflictsDamage, 
+        AreaOfEffect, Confusion, ProvidesHealing, InBackpack, WantsToPickupItem, WantsToUseItem,
+        WantsToDropItem
+    );
+}