diff gamelib/gamestate.py @ 22:296ce36fa7d9

Serialize and unserialize game state and missions
author Neil Muller <drnlmuller@gmail.com>
date Sun, 06 May 2012 18:38:54 +0200
parents af1bfeb648cb
children f6a3b213857b
line wrap: on
line diff
--- a/gamelib/gamestate.py	Sun May 06 18:34:28 2012 +0200
+++ b/gamelib/gamestate.py	Sun May 06 18:38:54 2012 +0200
@@ -8,19 +8,24 @@
 
 class Game(object):
 
-    def __init__(self):
-        self.lab = lab.Lab()
-        # FIXME: Generate the initial tech set
+    def __init__(self, init_data=None):
         self.money = 1000
         # Will be updated on the next turn
         self.points = 0
         self.reputation = 0
-        # instantiate the available missions
-        self.missions = [cls() for cls in missions.Mission.__subclasses__()]
         # Missions being attempted
         self.cur_missions = []
         # Science allocation for the current turn
         self.cur_allocation = []
+        self.lab = None
+        self.missions = []
+        if init_data:
+            self._load_data(init_data)
+        else:
+            self.lab = lab.Lab()
+            # instantiate all the available missions
+            self.missions = [cls() for cls in
+                    missions.Mission.__subclasses__()]
 
     def start_turn(self):
         # Make more flexible?
@@ -51,3 +56,28 @@
         for science in new_stuff:
             self.lab.science.append(science)
         # FIXME: Update UI
+
+    def save_data(self):
+        """Serialize the game state into a dict"""
+        data = {}
+        data['money'] = self.money
+        data['reputation'] = self.reputation
+        data['points'] = self.points
+        data['lab'] = self.lab.serialize()
+        # Save mission state
+        data['missions'] = {}
+        for mission in self.missions:
+            miss_name = type(mission).__name__
+            data['missions'][miss_name] = mission.save_data()
+        return data
+
+    def _load_data(self, data):
+        """Restore the game state"""
+        self.money = data['money']
+        self.reputation = data['reputation']
+        self.points = data['points']
+        self.lab = lab.Lab(data['lab'])
+        for mis_class in missions.Mission.__subclasses__():
+            miss_name = mis_class.__name__
+            if miss_name in data['missions']:
+                self.missions.append(mis_class(data['missions'][miss_name]))