Mercurial > mamba
annotate mamba/habitats/editor.py @ 180:d9ee0e50a78f
Teach editor about THING_MAP
author | Neil Muller <drnlmuller@gmail.com> |
---|---|
date | Wed, 14 Sep 2011 14:08:37 +0200 |
parents | b498f76a455f |
children | b0ef7eecc67a |
rev | line source |
---|---|
42
8521c142cd43
Add habitat for editor and reshuffle when options are checked to before initializing the display window.
Simon Cross <hodgestar@gmail.com>
parents:
diff
changeset
|
1 """Habitat for editing levels.""" |
8521c142cd43
Add habitat for editor and reshuffle when options are checked to before initializing the display window.
Simon Cross <hodgestar@gmail.com>
parents:
diff
changeset
|
2 |
52
d09f63429b80
Add screen size fiddling to editor habitat
Neil Muller <drnlmuller@gmail.com>
parents:
42
diff
changeset
|
3 import pygame.display |
64
fbb5cc655b47
More screen size fiddling hackery
Neil Muller <drnlmuller@gmail.com>
parents:
52
diff
changeset
|
4 from pygame.locals import SWSURFACE, KEYDOWN |
52
d09f63429b80
Add screen size fiddling to editor habitat
Neil Muller <drnlmuller@gmail.com>
parents:
42
diff
changeset
|
5 |
64
fbb5cc655b47
More screen size fiddling hackery
Neil Muller <drnlmuller@gmail.com>
parents:
52
diff
changeset
|
6 from mamba.engine import Habitat, NewHabitatEvent |
120 | 7 from mamba.widgets.level import EditLevelWidget |
174 | 8 from mamba.widgets.text import TextWidget, TextButton |
94
aba653f8383e
Start adding editor toolbar
Neil Muller <drnlmuller@gmail.com>
parents:
64
diff
changeset
|
9 from mamba.widgets.imagebutton import ImageButtonWidget |
180
d9ee0e50a78f
Teach editor about THING_MAP
Neil Muller <drnlmuller@gmail.com>
parents:
175
diff
changeset
|
10 from mamba.level import Level, TILE_MAP, THING_MAP |
64
fbb5cc655b47
More screen size fiddling hackery
Neil Muller <drnlmuller@gmail.com>
parents:
52
diff
changeset
|
11 from mamba.constants import SCREEN, EDIT_SCREEN, NAME, ESCAPE_KEYS |
42
8521c142cd43
Add habitat for editor and reshuffle when options are checked to before initializing the display window.
Simon Cross <hodgestar@gmail.com>
parents:
diff
changeset
|
12 |
8521c142cd43
Add habitat for editor and reshuffle when options are checked to before initializing the display window.
Simon Cross <hodgestar@gmail.com>
parents:
diff
changeset
|
13 |
8521c142cd43
Add habitat for editor and reshuffle when options are checked to before initializing the display window.
Simon Cross <hodgestar@gmail.com>
parents:
diff
changeset
|
14 class EditorHabitat(Habitat): |
8521c142cd43
Add habitat for editor and reshuffle when options are checked to before initializing the display window.
Simon Cross <hodgestar@gmail.com>
parents:
diff
changeset
|
15 def __init__(self, level_name): |
94
aba653f8383e
Start adding editor toolbar
Neil Muller <drnlmuller@gmail.com>
parents:
64
diff
changeset
|
16 super(EditorHabitat, self).__init__(EDIT_SCREEN) |
42
8521c142cd43
Add habitat for editor and reshuffle when options are checked to before initializing the display window.
Simon Cross <hodgestar@gmail.com>
parents:
diff
changeset
|
17 self.level = Level(level_name) |
172
dabf13abb3fd
Add basic drawing to level editor
Neil Muller <drnlmuller@gmail.com>
parents:
170
diff
changeset
|
18 self.edit_widget = EditLevelWidget(self.level) |
dabf13abb3fd
Add basic drawing to level editor
Neil Muller <drnlmuller@gmail.com>
parents:
170
diff
changeset
|
19 self.container.add(self.edit_widget) |
64
fbb5cc655b47
More screen size fiddling hackery
Neil Muller <drnlmuller@gmail.com>
parents:
52
diff
changeset
|
20 self.container.add_callback(KEYDOWN, self.keydown_event) |
180
d9ee0e50a78f
Teach editor about THING_MAP
Neil Muller <drnlmuller@gmail.com>
parents:
175
diff
changeset
|
21 self.mode = 'Tile' |
52
d09f63429b80
Add screen size fiddling to editor habitat
Neil Muller <drnlmuller@gmail.com>
parents:
42
diff
changeset
|
22 |
d09f63429b80
Add screen size fiddling to editor habitat
Neil Muller <drnlmuller@gmail.com>
parents:
42
diff
changeset
|
23 def on_enter(self): |
d09f63429b80
Add screen size fiddling to editor habitat
Neil Muller <drnlmuller@gmail.com>
parents:
42
diff
changeset
|
24 # We need to juggle the display to the correct size |
d09f63429b80
Add screen size fiddling to editor habitat
Neil Muller <drnlmuller@gmail.com>
parents:
42
diff
changeset
|
25 # This is a horrible hack |
d09f63429b80
Add screen size fiddling to editor habitat
Neil Muller <drnlmuller@gmail.com>
parents:
42
diff
changeset
|
26 pygame.display.quit() |
d09f63429b80
Add screen size fiddling to editor habitat
Neil Muller <drnlmuller@gmail.com>
parents:
42
diff
changeset
|
27 pygame.display.init() |
d09f63429b80
Add screen size fiddling to editor habitat
Neil Muller <drnlmuller@gmail.com>
parents:
42
diff
changeset
|
28 pygame.display.set_mode(EDIT_SCREEN, SWSURFACE) |
d09f63429b80
Add screen size fiddling to editor habitat
Neil Muller <drnlmuller@gmail.com>
parents:
42
diff
changeset
|
29 pygame.display.set_caption('%s Level editor' % NAME) |
64
fbb5cc655b47
More screen size fiddling hackery
Neil Muller <drnlmuller@gmail.com>
parents:
52
diff
changeset
|
30 super(EditorHabitat, self).on_enter() |
94
aba653f8383e
Start adding editor toolbar
Neil Muller <drnlmuller@gmail.com>
parents:
64
diff
changeset
|
31 self.setup_toolbar() |
52
d09f63429b80
Add screen size fiddling to editor habitat
Neil Muller <drnlmuller@gmail.com>
parents:
42
diff
changeset
|
32 |
d09f63429b80
Add screen size fiddling to editor habitat
Neil Muller <drnlmuller@gmail.com>
parents:
42
diff
changeset
|
33 def on_exit(self): |
d09f63429b80
Add screen size fiddling to editor habitat
Neil Muller <drnlmuller@gmail.com>
parents:
42
diff
changeset
|
34 # We need to juggle the display to the correct size |
d09f63429b80
Add screen size fiddling to editor habitat
Neil Muller <drnlmuller@gmail.com>
parents:
42
diff
changeset
|
35 # This is a horrible hack |
64
fbb5cc655b47
More screen size fiddling hackery
Neil Muller <drnlmuller@gmail.com>
parents:
52
diff
changeset
|
36 super(EditorHabitat, self).on_exit() |
52
d09f63429b80
Add screen size fiddling to editor habitat
Neil Muller <drnlmuller@gmail.com>
parents:
42
diff
changeset
|
37 pygame.display.quit() |
d09f63429b80
Add screen size fiddling to editor habitat
Neil Muller <drnlmuller@gmail.com>
parents:
42
diff
changeset
|
38 pygame.display.init() |
d09f63429b80
Add screen size fiddling to editor habitat
Neil Muller <drnlmuller@gmail.com>
parents:
42
diff
changeset
|
39 pygame.display.set_mode(SCREEN, SWSURFACE) |
d09f63429b80
Add screen size fiddling to editor habitat
Neil Muller <drnlmuller@gmail.com>
parents:
42
diff
changeset
|
40 pygame.display.set_caption(NAME) |
64
fbb5cc655b47
More screen size fiddling hackery
Neil Muller <drnlmuller@gmail.com>
parents:
52
diff
changeset
|
41 |
fbb5cc655b47
More screen size fiddling hackery
Neil Muller <drnlmuller@gmail.com>
parents:
52
diff
changeset
|
42 def keydown_event(self, ev, widget): |
fbb5cc655b47
More screen size fiddling hackery
Neil Muller <drnlmuller@gmail.com>
parents:
52
diff
changeset
|
43 if ev.key in ESCAPE_KEYS: |
fbb5cc655b47
More screen size fiddling hackery
Neil Muller <drnlmuller@gmail.com>
parents:
52
diff
changeset
|
44 from mamba.habitats.mainmenu import MainMenu |
fbb5cc655b47
More screen size fiddling hackery
Neil Muller <drnlmuller@gmail.com>
parents:
52
diff
changeset
|
45 NewHabitatEvent.post(MainMenu()) |
94
aba653f8383e
Start adding editor toolbar
Neil Muller <drnlmuller@gmail.com>
parents:
64
diff
changeset
|
46 |
aba653f8383e
Start adding editor toolbar
Neil Muller <drnlmuller@gmail.com>
parents:
64
diff
changeset
|
47 def setup_toolbar(self): |
aba653f8383e
Start adding editor toolbar
Neil Muller <drnlmuller@gmail.com>
parents:
64
diff
changeset
|
48 """Draw the editor toolbar""" |
aba653f8383e
Start adding editor toolbar
Neil Muller <drnlmuller@gmail.com>
parents:
64
diff
changeset
|
49 button_height = 20 |
aba653f8383e
Start adding editor toolbar
Neil Muller <drnlmuller@gmail.com>
parents:
64
diff
changeset
|
50 button_left = 820 |
180
d9ee0e50a78f
Teach editor about THING_MAP
Neil Muller <drnlmuller@gmail.com>
parents:
175
diff
changeset
|
51 button_padding = 5 |
d9ee0e50a78f
Teach editor about THING_MAP
Neil Muller <drnlmuller@gmail.com>
parents:
175
diff
changeset
|
52 |
d9ee0e50a78f
Teach editor about THING_MAP
Neil Muller <drnlmuller@gmail.com>
parents:
175
diff
changeset
|
53 filename = TextWidget( |
d9ee0e50a78f
Teach editor about THING_MAP
Neil Muller <drnlmuller@gmail.com>
parents:
175
diff
changeset
|
54 (button_left, button_height), |
d9ee0e50a78f
Teach editor about THING_MAP
Neil Muller <drnlmuller@gmail.com>
parents:
175
diff
changeset
|
55 'File: %s' % self.level.level_name, color='white') |
d9ee0e50a78f
Teach editor about THING_MAP
Neil Muller <drnlmuller@gmail.com>
parents:
175
diff
changeset
|
56 self.container.add(filename) |
d9ee0e50a78f
Teach editor about THING_MAP
Neil Muller <drnlmuller@gmail.com>
parents:
175
diff
changeset
|
57 button_height += filename.surface.get_height() + button_padding |
172
dabf13abb3fd
Add basic drawing to level editor
Neil Muller <drnlmuller@gmail.com>
parents:
170
diff
changeset
|
58 |
94
aba653f8383e
Start adding editor toolbar
Neil Muller <drnlmuller@gmail.com>
parents:
64
diff
changeset
|
59 levelname = TextWidget( |
aba653f8383e
Start adding editor toolbar
Neil Muller <drnlmuller@gmail.com>
parents:
64
diff
changeset
|
60 (button_left, button_height), |
170 | 61 'Level: %s' % self.level.name, color='white') |
94
aba653f8383e
Start adding editor toolbar
Neil Muller <drnlmuller@gmail.com>
parents:
64
diff
changeset
|
62 self.container.add(levelname) |
aba653f8383e
Start adding editor toolbar
Neil Muller <drnlmuller@gmail.com>
parents:
64
diff
changeset
|
63 button_height += levelname.surface.get_height() + button_padding |
aba653f8383e
Start adding editor toolbar
Neil Muller <drnlmuller@gmail.com>
parents:
64
diff
changeset
|
64 |
aba653f8383e
Start adding editor toolbar
Neil Muller <drnlmuller@gmail.com>
parents:
64
diff
changeset
|
65 tilesetname = TextWidget( |
aba653f8383e
Start adding editor toolbar
Neil Muller <drnlmuller@gmail.com>
parents:
64
diff
changeset
|
66 (button_left, button_height), |
aba653f8383e
Start adding editor toolbar
Neil Muller <drnlmuller@gmail.com>
parents:
64
diff
changeset
|
67 'Tileset: %s' % self.level.tileset.name, color='white') |
aba653f8383e
Start adding editor toolbar
Neil Muller <drnlmuller@gmail.com>
parents:
64
diff
changeset
|
68 self.container.add(tilesetname) |
aba653f8383e
Start adding editor toolbar
Neil Muller <drnlmuller@gmail.com>
parents:
64
diff
changeset
|
69 button_height += tilesetname.surface.get_height() + button_padding |
172
dabf13abb3fd
Add basic drawing to level editor
Neil Muller <drnlmuller@gmail.com>
parents:
170
diff
changeset
|
70 # TODO: Add Image widget for the current tool |
dabf13abb3fd
Add basic drawing to level editor
Neil Muller <drnlmuller@gmail.com>
parents:
170
diff
changeset
|
71 self.current_tool = TextWidget((button_left, button_height), |
dabf13abb3fd
Add basic drawing to level editor
Neil Muller <drnlmuller@gmail.com>
parents:
170
diff
changeset
|
72 'Tool: Floor', color='white') |
dabf13abb3fd
Add basic drawing to level editor
Neil Muller <drnlmuller@gmail.com>
parents:
170
diff
changeset
|
73 self.container.add(self.current_tool) |
dabf13abb3fd
Add basic drawing to level editor
Neil Muller <drnlmuller@gmail.com>
parents:
170
diff
changeset
|
74 button_height += self.current_tool.surface.get_height() |
dabf13abb3fd
Add basic drawing to level editor
Neil Muller <drnlmuller@gmail.com>
parents:
170
diff
changeset
|
75 button_height += button_padding |
94
aba653f8383e
Start adding editor toolbar
Neil Muller <drnlmuller@gmail.com>
parents:
64
diff
changeset
|
76 floor_button = ImageButtonWidget( |
aba653f8383e
Start adding editor toolbar
Neil Muller <drnlmuller@gmail.com>
parents:
64
diff
changeset
|
77 (button_left, button_height), self.level.tileset.floor, |
aba653f8383e
Start adding editor toolbar
Neil Muller <drnlmuller@gmail.com>
parents:
64
diff
changeset
|
78 'Floor', color='white') |
aba653f8383e
Start adding editor toolbar
Neil Muller <drnlmuller@gmail.com>
parents:
64
diff
changeset
|
79 self.container.add(floor_button) |
172
dabf13abb3fd
Add basic drawing to level editor
Neil Muller <drnlmuller@gmail.com>
parents:
170
diff
changeset
|
80 floor_button.add_callback('clicked', self.change_tool, |
dabf13abb3fd
Add basic drawing to level editor
Neil Muller <drnlmuller@gmail.com>
parents:
170
diff
changeset
|
81 '.', 'Floor') |
175
b498f76a455f
Set initial tool correctly
Neil Muller <drnlmuller@gmail.com>
parents:
174
diff
changeset
|
82 self.edit_widget.set_tool('.') |
113
c5d6d0ba3b2b
Fill in more toolbar stuff
Neil Muller <drnlmuller@gmail.com>
parents:
103
diff
changeset
|
83 button_height += floor_button.surface.get_height() + button_padding |
180
d9ee0e50a78f
Teach editor about THING_MAP
Neil Muller <drnlmuller@gmail.com>
parents:
175
diff
changeset
|
84 if self.mode == 'Tile': |
d9ee0e50a78f
Teach editor about THING_MAP
Neil Muller <drnlmuller@gmail.com>
parents:
175
diff
changeset
|
85 tile_map = TILE_MAP |
d9ee0e50a78f
Teach editor about THING_MAP
Neil Muller <drnlmuller@gmail.com>
parents:
175
diff
changeset
|
86 change_mode_text = 'Switch to Things' |
d9ee0e50a78f
Teach editor about THING_MAP
Neil Muller <drnlmuller@gmail.com>
parents:
175
diff
changeset
|
87 elif self.mode == 'Thing': |
d9ee0e50a78f
Teach editor about THING_MAP
Neil Muller <drnlmuller@gmail.com>
parents:
175
diff
changeset
|
88 tile_map = THING_MAP |
d9ee0e50a78f
Teach editor about THING_MAP
Neil Muller <drnlmuller@gmail.com>
parents:
175
diff
changeset
|
89 change_mode_text = 'Switch to Tiles' |
d9ee0e50a78f
Teach editor about THING_MAP
Neil Muller <drnlmuller@gmail.com>
parents:
175
diff
changeset
|
90 for tile_char in tile_map: |
113
c5d6d0ba3b2b
Fill in more toolbar stuff
Neil Muller <drnlmuller@gmail.com>
parents:
103
diff
changeset
|
91 try: |
c5d6d0ba3b2b
Fill in more toolbar stuff
Neil Muller <drnlmuller@gmail.com>
parents:
103
diff
changeset
|
92 tile = self.level.tileset[tile_char] |
c5d6d0ba3b2b
Fill in more toolbar stuff
Neil Muller <drnlmuller@gmail.com>
parents:
103
diff
changeset
|
93 except pygame.error: |
c5d6d0ba3b2b
Fill in more toolbar stuff
Neil Muller <drnlmuller@gmail.com>
parents:
103
diff
changeset
|
94 # Ignore stuff we can't load for now |
c5d6d0ba3b2b
Fill in more toolbar stuff
Neil Muller <drnlmuller@gmail.com>
parents:
103
diff
changeset
|
95 continue |
c5d6d0ba3b2b
Fill in more toolbar stuff
Neil Muller <drnlmuller@gmail.com>
parents:
103
diff
changeset
|
96 if tile is None: |
c5d6d0ba3b2b
Fill in more toolbar stuff
Neil Muller <drnlmuller@gmail.com>
parents:
103
diff
changeset
|
97 continue |
170 | 98 if tile.name: |
99 text = tile.name | |
100 else: | |
101 text = 'Tile' | |
113
c5d6d0ba3b2b
Fill in more toolbar stuff
Neil Muller <drnlmuller@gmail.com>
parents:
103
diff
changeset
|
102 tile_button = ImageButtonWidget( |
c5d6d0ba3b2b
Fill in more toolbar stuff
Neil Muller <drnlmuller@gmail.com>
parents:
103
diff
changeset
|
103 (button_left, button_height), tile.image, |
170 | 104 text, color='white') |
172
dabf13abb3fd
Add basic drawing to level editor
Neil Muller <drnlmuller@gmail.com>
parents:
170
diff
changeset
|
105 tile_button.add_callback('clicked', self.change_tool, |
dabf13abb3fd
Add basic drawing to level editor
Neil Muller <drnlmuller@gmail.com>
parents:
170
diff
changeset
|
106 tile_char, text) |
113
c5d6d0ba3b2b
Fill in more toolbar stuff
Neil Muller <drnlmuller@gmail.com>
parents:
103
diff
changeset
|
107 self.container.add(tile_button) |
c5d6d0ba3b2b
Fill in more toolbar stuff
Neil Muller <drnlmuller@gmail.com>
parents:
103
diff
changeset
|
108 button_height += \ |
c5d6d0ba3b2b
Fill in more toolbar stuff
Neil Muller <drnlmuller@gmail.com>
parents:
103
diff
changeset
|
109 tile_button.surface.get_height() + button_padding |
174 | 110 button_height += 10 |
180
d9ee0e50a78f
Teach editor about THING_MAP
Neil Muller <drnlmuller@gmail.com>
parents:
175
diff
changeset
|
111 |
d9ee0e50a78f
Teach editor about THING_MAP
Neil Muller <drnlmuller@gmail.com>
parents:
175
diff
changeset
|
112 mode_button = TextButton((button_left, button_height), |
d9ee0e50a78f
Teach editor about THING_MAP
Neil Muller <drnlmuller@gmail.com>
parents:
175
diff
changeset
|
113 change_mode_text) |
d9ee0e50a78f
Teach editor about THING_MAP
Neil Muller <drnlmuller@gmail.com>
parents:
175
diff
changeset
|
114 mode_button.add_callback('clicked', self.change_toolbar) |
d9ee0e50a78f
Teach editor about THING_MAP
Neil Muller <drnlmuller@gmail.com>
parents:
175
diff
changeset
|
115 self.container.add(mode_button) |
d9ee0e50a78f
Teach editor about THING_MAP
Neil Muller <drnlmuller@gmail.com>
parents:
175
diff
changeset
|
116 button_height += mode_button.surface.get_height() + button_padding |
d9ee0e50a78f
Teach editor about THING_MAP
Neil Muller <drnlmuller@gmail.com>
parents:
175
diff
changeset
|
117 button_height += 10 |
d9ee0e50a78f
Teach editor about THING_MAP
Neil Muller <drnlmuller@gmail.com>
parents:
175
diff
changeset
|
118 |
174 | 119 save_button = TextButton((button_left, button_height), "Save Level") |
120 save_button.add_callback('clicked', self.save) | |
121 self.container.add(save_button) | |
172
dabf13abb3fd
Add basic drawing to level editor
Neil Muller <drnlmuller@gmail.com>
parents:
170
diff
changeset
|
122 |
dabf13abb3fd
Add basic drawing to level editor
Neil Muller <drnlmuller@gmail.com>
parents:
170
diff
changeset
|
123 def change_tool(self, ev, widget, new_tool, text): |
dabf13abb3fd
Add basic drawing to level editor
Neil Muller <drnlmuller@gmail.com>
parents:
170
diff
changeset
|
124 self.edit_widget.set_tool(new_tool) |
dabf13abb3fd
Add basic drawing to level editor
Neil Muller <drnlmuller@gmail.com>
parents:
170
diff
changeset
|
125 self.current_tool.text = 'Tool: %s' % text |
dabf13abb3fd
Add basic drawing to level editor
Neil Muller <drnlmuller@gmail.com>
parents:
170
diff
changeset
|
126 self.current_tool.prepare() |
174 | 127 |
128 def save(self, ev, widget): | |
129 self.level.save_level() | |
180
d9ee0e50a78f
Teach editor about THING_MAP
Neil Muller <drnlmuller@gmail.com>
parents:
175
diff
changeset
|
130 |
d9ee0e50a78f
Teach editor about THING_MAP
Neil Muller <drnlmuller@gmail.com>
parents:
175
diff
changeset
|
131 def change_toolbar(self, ev, widget): |
d9ee0e50a78f
Teach editor about THING_MAP
Neil Muller <drnlmuller@gmail.com>
parents:
175
diff
changeset
|
132 if self.mode == 'Tile': |
d9ee0e50a78f
Teach editor about THING_MAP
Neil Muller <drnlmuller@gmail.com>
parents:
175
diff
changeset
|
133 self.mode = 'Thing' |
d9ee0e50a78f
Teach editor about THING_MAP
Neil Muller <drnlmuller@gmail.com>
parents:
175
diff
changeset
|
134 elif self.mode == 'Thing': |
d9ee0e50a78f
Teach editor about THING_MAP
Neil Muller <drnlmuller@gmail.com>
parents:
175
diff
changeset
|
135 self.mode = 'Tile' |
d9ee0e50a78f
Teach editor about THING_MAP
Neil Muller <drnlmuller@gmail.com>
parents:
175
diff
changeset
|
136 self.clear_toolbar() |
d9ee0e50a78f
Teach editor about THING_MAP
Neil Muller <drnlmuller@gmail.com>
parents:
175
diff
changeset
|
137 self.setup_toolbar() |
d9ee0e50a78f
Teach editor about THING_MAP
Neil Muller <drnlmuller@gmail.com>
parents:
175
diff
changeset
|
138 |
d9ee0e50a78f
Teach editor about THING_MAP
Neil Muller <drnlmuller@gmail.com>
parents:
175
diff
changeset
|
139 def clear_toolbar(self): |
d9ee0e50a78f
Teach editor about THING_MAP
Neil Muller <drnlmuller@gmail.com>
parents:
175
diff
changeset
|
140 """Remove every non-edit widget from the container""" |
d9ee0e50a78f
Teach editor about THING_MAP
Neil Muller <drnlmuller@gmail.com>
parents:
175
diff
changeset
|
141 for widget in self.container.children[:]: |
d9ee0e50a78f
Teach editor about THING_MAP
Neil Muller <drnlmuller@gmail.com>
parents:
175
diff
changeset
|
142 if widget is not self.edit_widget: |
d9ee0e50a78f
Teach editor about THING_MAP
Neil Muller <drnlmuller@gmail.com>
parents:
175
diff
changeset
|
143 self.container.remove(widget) |