changeset 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
files mamba/habitats/editor.py
diffstat 1 files changed, 24 insertions(+), 16 deletions(-) [+]
line wrap: on
line diff
--- a/mamba/habitats/editor.py	Thu Sep 15 18:01:43 2011 +0200
+++ b/mamba/habitats/editor.py	Thu Sep 15 18:11:55 2011 +0200
@@ -11,7 +11,7 @@
 from mamba.widgets.entrybox import EntryBox
 from mamba.widgets.listbox import ListBox
 from mamba.widgets.toollist import ToolListWidget
-from mamba.level import Level, Tileset, TILE_MAP, THING_MAP
+from mamba.level import Level, Tileset, TILE_MAP, THING_MAP, InvalidMapError
 from mamba.data import check_level_exists, list_levels, list_tilesets
 from mamba.constants import (SCREEN, EDIT_SCREEN, NAME, ESCAPE_KEYS,
         RESERVED_NAMES)
@@ -148,14 +148,14 @@
         self.current_tool.prepare()
 
     def save(self, ev, widget):
-        messagebox = None
+        message = None
         if not self.level.level_name:
-            messagebox = MessageBox((300, 300), 'Please enter a name')
+            message = MessageBox((300, 300), 'Please enter a name')
         elif self.level.level_name in RESERVED_NAMES:
-            messagebox = MessageBox((300, 300), 'Reserved level name')
-        if messagebox:
-            self.container.add(messagebox)
-            messagebox.grab_focus()
+            message = MessageBox((300, 300), 'Reserved level name')
+        if message:
+            self.container.add(message)
+            message.grab_focus()
             return
         self.level.save_level()
 
@@ -176,8 +176,16 @@
         load_dialog.grab_focus()
 
     def load_level(self, ev, widget, level_name):
+        try:
+            new_level = Level(level_name)
+        except (IOError, InvalidMapError, pygame.error), error:
+            message = MessageBox((300, 300),
+                    'Loading Level Failed: %s' % error, color='red')
+            self.container.add(message)
+            message.grab_focus()
+            return False
         self.container.remove(self.edit_widget)
-        self.level = Level(level_name)
+        self.level = new_level
         if level_name in RESERVED_NAMES:
             self.level.level_name = ''  # Special case for new level
         self.edit_widget = EditLevelWidget(self.level)
@@ -224,29 +232,29 @@
         load_dialog.grab_focus()
 
     def change_tileset(self, ev, widget, new_name):
+        self.level.update_tiles_ascii()
         self.level.tileset = Tileset(new_name)
-        self.level.update_tiles_ascii()
         self.level.restart()
         self.clear_toolbar()
         self.setup_toolbar()
         return True
 
     def check_file(self, new_name):
-        messagebox = None
+        message = None
         if new_name == self.level.level_name:
             return True  # No-op change
         if not new_name:
-            messagebox = MessageBox((300, 300), 'Please enter a name')
+            message = MessageBox((300, 300), 'Please enter a name')
         if new_name in RESERVED_NAMES:
             # This case is caught by the existance check, but the
             # importance of the reserved names means we use a different
             # message
-            messagebox = MessageBox((300, 300), 'Reserved level name')
+            message = MessageBox((300, 300), 'Reserved level name')
         elif check_level_exists(new_name):
-            messagebox = MessageBox((300, 300), 'Name already in use')
-        if messagebox:
-            self.container.add(messagebox)
-            messagebox.grab_focus()
+            message = MessageBox((300, 300), 'Name already in use')
+        if message:
+            self.container.add(message)
+            message.grab_focus()
             return False
         self.level.level_name = new_name
         self.clear_toolbar()