Mercurial > sypikslang
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]))