comparison mamba/habitats/editor.py @ 278:f10d06fc64b2

Add some robustness against broken levels
author Neil Muller <drnlmuller@gmail.com>
date Thu, 15 Sep 2011 18:11:55 +0200
parents 82aa91664e27
children 162bddbbc5d0
comparison
equal deleted inserted replaced
277:82aa91664e27 278:f10d06fc64b2
9 from mamba.widgets.imagebutton import ImageButtonWidget 9 from mamba.widgets.imagebutton import ImageButtonWidget
10 from mamba.widgets.messagebox import MessageBox 10 from mamba.widgets.messagebox import MessageBox
11 from mamba.widgets.entrybox import EntryBox 11 from mamba.widgets.entrybox import EntryBox
12 from mamba.widgets.listbox import ListBox 12 from mamba.widgets.listbox import ListBox
13 from mamba.widgets.toollist import ToolListWidget 13 from mamba.widgets.toollist import ToolListWidget
14 from mamba.level import Level, Tileset, TILE_MAP, THING_MAP 14 from mamba.level import Level, Tileset, TILE_MAP, THING_MAP, InvalidMapError
15 from mamba.data import check_level_exists, list_levels, list_tilesets 15 from mamba.data import check_level_exists, list_levels, list_tilesets
16 from mamba.constants import (SCREEN, EDIT_SCREEN, NAME, ESCAPE_KEYS, 16 from mamba.constants import (SCREEN, EDIT_SCREEN, NAME, ESCAPE_KEYS,
17 RESERVED_NAMES) 17 RESERVED_NAMES)
18 18
19 MAX_TOOLS = 6 19 MAX_TOOLS = 6
146 self.edit_widget.set_tool(new_tool) 146 self.edit_widget.set_tool(new_tool)
147 self.current_tool.text = 'Tool: %s' % text 147 self.current_tool.text = 'Tool: %s' % text
148 self.current_tool.prepare() 148 self.current_tool.prepare()
149 149
150 def save(self, ev, widget): 150 def save(self, ev, widget):
151 messagebox = None 151 message = None
152 if not self.level.level_name: 152 if not self.level.level_name:
153 messagebox = MessageBox((300, 300), 'Please enter a name') 153 message = MessageBox((300, 300), 'Please enter a name')
154 elif self.level.level_name in RESERVED_NAMES: 154 elif self.level.level_name in RESERVED_NAMES:
155 messagebox = MessageBox((300, 300), 'Reserved level name') 155 message = MessageBox((300, 300), 'Reserved level name')
156 if messagebox: 156 if message:
157 self.container.add(messagebox) 157 self.container.add(message)
158 messagebox.grab_focus() 158 message.grab_focus()
159 return 159 return
160 self.level.save_level() 160 self.level.save_level()
161 161
162 def new(self, ev, widget): 162 def new(self, ev, widget):
163 self.load_level(ev, widget, 'blank') 163 self.load_level(ev, widget, 'blank')
174 load_dialog = ListBox((200, 200), 'Select Level', load_list) 174 load_dialog = ListBox((200, 200), 'Select Level', load_list)
175 self.container.add(load_dialog) 175 self.container.add(load_dialog)
176 load_dialog.grab_focus() 176 load_dialog.grab_focus()
177 177
178 def load_level(self, ev, widget, level_name): 178 def load_level(self, ev, widget, level_name):
179 try:
180 new_level = Level(level_name)
181 except (IOError, InvalidMapError, pygame.error), error:
182 message = MessageBox((300, 300),
183 'Loading Level Failed: %s' % error, color='red')
184 self.container.add(message)
185 message.grab_focus()
186 return False
179 self.container.remove(self.edit_widget) 187 self.container.remove(self.edit_widget)
180 self.level = Level(level_name) 188 self.level = new_level
181 if level_name in RESERVED_NAMES: 189 if level_name in RESERVED_NAMES:
182 self.level.level_name = '' # Special case for new level 190 self.level.level_name = '' # Special case for new level
183 self.edit_widget = EditLevelWidget(self.level) 191 self.edit_widget = EditLevelWidget(self.level)
184 self.container.add(self.edit_widget) 192 self.container.add(self.edit_widget)
185 self.clear_toolbar() 193 self.clear_toolbar()
222 load_dialog = ListBox((200, 200), 'Select Level', load_list) 230 load_dialog = ListBox((200, 200), 'Select Level', load_list)
223 self.container.add(load_dialog) 231 self.container.add(load_dialog)
224 load_dialog.grab_focus() 232 load_dialog.grab_focus()
225 233
226 def change_tileset(self, ev, widget, new_name): 234 def change_tileset(self, ev, widget, new_name):
235 self.level.update_tiles_ascii()
227 self.level.tileset = Tileset(new_name) 236 self.level.tileset = Tileset(new_name)
228 self.level.update_tiles_ascii()
229 self.level.restart() 237 self.level.restart()
230 self.clear_toolbar() 238 self.clear_toolbar()
231 self.setup_toolbar() 239 self.setup_toolbar()
232 return True 240 return True
233 241
234 def check_file(self, new_name): 242 def check_file(self, new_name):
235 messagebox = None 243 message = None
236 if new_name == self.level.level_name: 244 if new_name == self.level.level_name:
237 return True # No-op change 245 return True # No-op change
238 if not new_name: 246 if not new_name:
239 messagebox = MessageBox((300, 300), 'Please enter a name') 247 message = MessageBox((300, 300), 'Please enter a name')
240 if new_name in RESERVED_NAMES: 248 if new_name in RESERVED_NAMES:
241 # This case is caught by the existance check, but the 249 # This case is caught by the existance check, but the
242 # importance of the reserved names means we use a different 250 # importance of the reserved names means we use a different
243 # message 251 # message
244 messagebox = MessageBox((300, 300), 'Reserved level name') 252 message = MessageBox((300, 300), 'Reserved level name')
245 elif check_level_exists(new_name): 253 elif check_level_exists(new_name):
246 messagebox = MessageBox((300, 300), 'Name already in use') 254 message = MessageBox((300, 300), 'Name already in use')
247 if messagebox: 255 if message:
248 self.container.add(messagebox) 256 self.container.add(message)
249 messagebox.grab_focus() 257 message.grab_focus()
250 return False 258 return False
251 self.level.level_name = new_name 259 self.level.level_name = new_name
252 self.clear_toolbar() 260 self.clear_toolbar()
253 self.setup_toolbar() 261 self.setup_toolbar()
254 return True 262 return True