changeset 343:5bf35267ddc0

Hook up sprite deletion. Framework work for sprite editing & adding
author Neil Muller <drnlmuller@gmail.com>
date Fri, 16 Sep 2011 22:24:39 +0200
parents 868a53b96c29
children 214b2bd173a8
files mamba/habitats/editor.py mamba/level.py
diffstat 2 files changed, 61 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/mamba/habitats/editor.py	Fri Sep 16 22:02:38 2011 +0200
+++ b/mamba/habitats/editor.py	Fri Sep 16 22:24:39 2011 +0200
@@ -1,7 +1,7 @@
 """Habitat for editing levels."""
 
 import pygame.display
-from pygame.locals import SWSURFACE, KEYDOWN, K_1, K_2
+from pygame.locals import SWSURFACE, KEYDOWN, K_1, K_2, MOUSEBUTTONDOWN
 
 from mamba.engine import Habitat, NewHabitatEvent
 from mamba.widgets.level import EditLevelWidget
@@ -29,6 +29,7 @@
         self.edit_widget = EditLevelWidget(self.level)
         self.container.add(self.edit_widget)
         self.container.add_callback(KEYDOWN, self.keydown_event)
+        self.container.add_callback(MOUSEBUTTONDOWN, self.mouse_event)
         self.mode = 'Tiles'
         self.sprite_mode = 'Add'
 
@@ -359,6 +360,31 @@
     def sprite_tool(self, ev, widget, sprite_mode):
         """Handle sprite stuff"""
         self.sprite_mode = sprite_mode
+        self.level.update_tiles_ascii()  # commit any changes
         self.clear_toolbar()
         self.setup_toolbar()
         return True
+
+    def mouse_event(self, ev, widget):
+        """Handle mouse clicks when we are in sprite mode"""
+        if self.mode != 'Sprites':
+            return False
+        if self.container.paused:
+            return False
+        tile_pos = self.edit_widget.convert_pos(ev.pos)
+        sprite = self.level.get_sprite_at(tile_pos)
+        if self.sprite_mode == 'Delete' and sprite:
+            self.level.remove_sprite(sprite)
+        elif self.sprite_mode == 'Edit' and sprite:
+            self.edit_sprite(tile_pos, sprite)
+        elif self.sprite_mode == 'Add' and sprite is None:
+            self.edit_sprite(tile_pos, sprite)
+        else:
+            return True  # Don't refresh the level if we're doing nothing
+        self.level.restart()
+        # edit sprite can pause the container, so unpause here
+        self.container.paused = False
+        return True
+
+    def edit_sprite(self, tile_pos, sprite_line):
+        pass
--- a/mamba/level.py	Fri Sep 16 22:02:38 2011 +0200
+++ b/mamba/level.py	Fri Sep 16 22:24:39 2011 +0200
@@ -307,3 +307,37 @@
         """Reset the level state"""
         self.setup_level(self.tiles_ascii, self.sprites_ascii)
         self.make_background()
+
+    def get_sprite_at(self, sprite_pos):
+        """Return the sprite line at the given pos, or none if it doesn't
+           exist"""
+        for sprite_ascii in self.sprites_ascii:
+            try:
+                pos, _sep, rest = sprite_ascii.partition(':')
+                pos = [int(x.strip()) for x in pos.split(',')]
+            except ValueError:
+                continue
+            if pos[0] == sprite_pos[0] and pos[1] == sprite_pos[1]:
+                return sprite_ascii
+        return None
+
+    def remove_sprite(self, sprite):
+        """Remove the given sprite line from the list of sprites"""
+        self.sprites_ascii.remove(sprite)
+
+    def validate_sprite(self, sprite):
+        """Check that the sprite line is valid"""
+        pos, _sep, rest = sprite.partition(':')
+        pos = [int(x.strip()) for x in pos.split(',')]
+        class_name, rest = rest.split(None, 1)
+        args = rest.split()
+        sprite_id, args = args[0], args[1:]
+        try:
+            cls = sprites.find_sprite(class_name)
+        except KeyError:
+            raise InvalidMapError("Unknown Sprite class: %s" % class_name)
+        sprite = cls(*args)
+        if sprite_id in self.extra_sprites:
+            # Check that duplicate id is not at the same position
+            if self.extra[sprite_id].tile_pos != pos:
+                raise InvalidMapError('Duplicate sprite id: %s.' % sprite_id)