Mercurial > pyntnclick
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() |