changeset 256:9827ce469834

Add more validation exceptions to new map loading code. Handle trying to load when display hasn't been initiliased better
author Neil Muller <drnlmuller@gmail.com>
date Thu, 15 Sep 2011 01:34:42 +0200
parents 59166ae6e864
children 232c183346e9
files mamba/data.py mamba/level.py
diffstat 2 files changed, 24 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/mamba/data.py	Thu Sep 15 01:32:50 2011 +0200
+++ b/mamba/data.py	Thu Sep 15 01:34:42 2011 +0200
@@ -37,6 +37,11 @@
 
 
 def load_image(filename, mutators=()):
+    if not pygame.display.get_init():
+        # Just check image exists
+        testfile = open(filepath(filename), 'rb')
+        testfile.close()
+        return None
     key = (filename, mutators)
     if key in MUTATED_IMAGES:
         return MUTATED_IMAGES[key]
--- a/mamba/level.py	Thu Sep 15 01:32:50 2011 +0200
+++ b/mamba/level.py	Thu Sep 15 01:34:42 2011 +0200
@@ -2,6 +2,7 @@
 Level for our shiny game.
 """
 
+import pygame
 from pygame.surface import Surface
 from pygame.sprite import RenderUpdates
 
@@ -179,15 +180,28 @@
 
     def setup_sprites(self, sprites_ascii):
         self.extra_sprites = {}
+        sprite_positions = []
         for sprite_ascii in sprites_ascii:
             pos, _sep, rest = sprite_ascii.partition(':')
-            pos = [int(x.strip()) for x in pos.split(',')]
+            try:
+                pos = [int(x.strip()) for x in pos.split(',')]
+            except ValueError:
+                raise InvalidMapError("Sprite position must be two integers."
+                        "Got %s" % pos)
             class_name, rest = rest.split(None, 1)
             args = rest.split()
             sprite_id, args = args[0], args[1:]
-            cls = sprites.find_sprite(class_name)
+            try:
+                cls = sprites.find_sprite(class_name)
+            except KeyError:
+                raise InvalidMapError("Unknown Sprite class: %s" % class_name)
             sprite = cls(*args)
+            if pos in sprite_positions:
+                raise InvalidMapError('Multiple sprites at %s.' % pos)
+            sprite_positions.append(pos)
             sprite.set_tile_pos(pos)
+            if sprite_id in self.extra_sprites:
+                raise InvalidMapError('Duplicate sprite id: %s.' % sprite_id)
             self.extra_sprites[sprite_id] = sprite
             self.sprites.add(sprite)
 
@@ -225,6 +239,9 @@
         return sprites.tile_sizify((x, y))
 
     def make_background(self):
+        if not pygame.display.init():
+            # Skip if we're not actuallt in pygame
+            return
         sx, sy = self.get_tile_size()
         self.background = Surface(self.get_size())
         [self.background.blit(self.tileset.floor, sprites.tile_sizify((x, y)))