saveload_system.rs 1.1 KB

1234567891011121314151617181920212223242526272829303132
  1. use specs::prelude::*;
  2. use specs::saveload::{SimpleMarker, SerializeComponents};
  3. use specs::error::NoError;
  4. use super::components::*;
  5. use std::fs::File;
  6. use std::io::Write;
  7. macro_rules! serialize_individually {
  8. ($ecs:expr, $ser:expr, $data:expr, $( $type:ty),*) => {
  9. $(
  10. SerializeComponents::<NoError, SimpleMarker<SerializeMe>>::serialize(
  11. &( $ecs.read_storage::<$type>(), ),
  12. &$data.0,
  13. &$data.1,
  14. &mut $ser,
  15. )
  16. .unwrap();
  17. )*
  18. };
  19. }
  20. pub fn save_game(ecs : &World) {
  21. let data = ( ecs.entities(), ecs.read_storage::<SimpleMarker<SerializeMe>>() );
  22. let writer = File::create("./savegame.json").unwrap();
  23. let mut serializer = serde_json::Serializer::new(writer);
  24. serialize_individually!(ecs, serializer, data, Position, Renderable, Player, Viewshed, Monster,
  25. Name, BlocksTile, CombatStats, SufferDamage, WantsToMelee, Item, Consumable, Ranged, InflictsDamage,
  26. AreaOfEffect, Confusion, ProvidesHealing, InBackpack, WantsToPickupItem, WantsToUseItem,
  27. WantsToDropItem
  28. );
  29. }