comparison pyntnclick/state.py @ 750:ef4bda7d623d pyntnclick

Better state and inventory management.
author Jeremy Thurgood <firxen@gmail.com>
date Sun, 20 Jan 2013 20:20:36 +0200
parents a453731e4531
children d5afaadbd821
comparison
equal deleted inserted replaced
749:a453731e4531 750:ef4bda7d623d
43 screen.game.show_detail(self.detail_view) 43 screen.game.show_detail(self.detail_view)
44 if self.end_game: 44 if self.end_game:
45 screen.end_game() 45 screen.end_game()
46 46
47 47
48 class GameState(dict): 48 class GameState(object):
49 """This holds the serializable game state. 49 """This holds the serializable game state.
50 50
51 Games wanting to do fancier stuff with the state should 51 Games wanting to do fancier stuff with the state should
52 sub-class this and feed the subclass into 52 sub-class this and feed the subclass into
53 GameDescription via the custom_data parameter.""" 53 GameDescription via the custom_data parameter."""
54 54
55 def __init__(self):
56 self._game_state = {'inventories': {'main': []}}
57
58 def __getitem__(self, key):
59 return self._game_state[key]
60
55 def get_all_gizmo_data(self, state_key): 61 def get_all_gizmo_data(self, state_key):
56 """Get all state for a gizmo - returns a dict""" 62 """Get all state for a gizmo - returns a dict"""
57 return self[state_key] 63 return self[state_key]
58 64
59 def get_data(self, state_key, data_key): 65 def get_data(self, state_key, data_key):
64 """Set a single value""" 70 """Set a single value"""
65 self[state_key][data_key] = value 71 self[state_key][data_key] = value
66 72
67 def initialize_state(self, state_key, initial_data): 73 def initialize_state(self, state_key, initial_data):
68 """Initialize a gizmo entry""" 74 """Initialize a gizmo entry"""
69 if state_key not in self: 75 if state_key not in self._game_state:
70 self[state_key] = {} 76 self._game_state[state_key] = {}
71 if initial_data: 77 if initial_data:
72 # deep copy of INITIAL_DATA allows lists, sets and 78 # deep copy of INITIAL_DATA allows lists, sets and
73 # other mutable types to safely be used in INITIAL_DATA 79 # other mutable types to safely be used in INITIAL_DATA
74 self[state_key].update(copy.deepcopy(initial_data)) 80 self._game_state[state_key].update(copy.deepcopy(initial_data))
81
82 def inventory(self, name='main'):
83 return self['inventories'][name]
75 84
76 85
77 class Game(object): 86 class Game(object):
78 """Complete game state. 87 """Complete game state.
79 88
90 # map of detail view name -> DetailView object 99 # map of detail view name -> DetailView object
91 self.detail_views = {} 100 self.detail_views = {}
92 # map of item name -> Item object 101 # map of item name -> Item object
93 self.items = {} 102 self.items = {}
94 # list of item objects in inventory 103 # list of item objects in inventory
95 self.inventory = [] 104 self.current_inventory = 'main'
96 # currently selected tool (item) 105 # currently selected tool (item)
97 self.tool = None 106 self.tool = None
98 # Global game data 107 # Global game data
99 self.data = GameState() 108 self.data = self.gd.game_state()
100 # current scene 109 # current scene
101 self.current_scene = None 110 self.current_scene = None
102 # debug rects 111 # debug rects
103 self.debug_rects = False 112 self.debug_rects = False
113
114 def inventory(self, name=None):
115 if name is None:
116 name = self.current_inventory
117 return self.data.inventory(name)
104 118
105 def set_custom_data(self, data_object): 119 def set_custom_data(self, data_object):
106 self.data = data_object 120 self.data = data_object
107 121
108 def set_debug_rects(self, value=True): 122 def set_debug_rects(self, value=True):
141 155
142 def _update_inventory(self): 156 def _update_inventory(self):
143 ScreenEvent.post('game', 'inventory', None) 157 ScreenEvent.post('game', 'inventory', None)
144 158
145 def add_inventory_item(self, name): 159 def add_inventory_item(self, name):
146 self.inventory.append(self.items[name]) 160 self.inventory().append(self.items[name])
147 self._update_inventory() 161 self._update_inventory()
148 162
149 def is_in_inventory(self, name): 163 def is_in_inventory(self, name):
150 if name in self.items: 164 if name in self.items:
151 return self.items[name] in self.inventory 165 return self.items[name] in self.inventory()
152 return False 166 return False
153 167
154 def remove_inventory_item(self, name): 168 def remove_inventory_item(self, name):
155 self.inventory.remove(self.items[name]) 169 self.inventory().remove(self.items[name])
156 # Unselect tool if it's removed 170 # Unselect tool if it's removed
157 if self.tool == self.items[name]: 171 if self.tool == self.items[name]:
158 self.set_tool(None) 172 self.set_tool(None)
159 self._update_inventory() 173 self._update_inventory()
160 174
161 def replace_inventory_item(self, old_item_name, new_item_name): 175 def replace_inventory_item(self, old_item_name, new_item_name):
162 """Try to replace an item in the inventory with a new one""" 176 """Try to replace an item in the inventory with a new one"""
163 try: 177 try:
164 index = self.inventory.index(self.items[old_item_name]) 178 index = self.inventory().index(self.items[old_item_name])
165 self.inventory[index] = self.items[new_item_name] 179 self.inventory()[index] = self.items[new_item_name]
166 if self.tool == self.items[old_item_name]: 180 if self.tool == self.items[old_item_name]:
167 self.set_tool(self.items[new_item_name]) 181 self.set_tool(self.items[new_item_name])
168 except ValueError: 182 except ValueError:
169 return False 183 return False
170 self._update_inventory() 184 self._update_inventory()