annotate mamba/habitats/editor.py @ 552:b2e0f1267282

Add test mode to README. Tweak help text
author Neil Muller <drnlmuller@gmail.com>
date Wed, 21 Sep 2011 14:19:45 +0200
parents 9d3ed4d05f55
children a2648295b7cf
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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
551
9d3ed4d05f55 Hack in test level mode to editor
Neil Muller <drnlmuller@gmail.com>
parents: 544
diff changeset
4 from pygame.locals import (SWSURFACE, KEYDOWN, K_1, K_2, MOUSEBUTTONDOWN,
9d3ed4d05f55 Hack in test level mode to editor
Neil Muller <drnlmuller@gmail.com>
parents: 544
diff changeset
5 K_LEFT, K_RIGHT, K_DOWN, K_UP, K_SPACE)
353
62a2a659c69b Call sprite editor dialog
Neil Muller <drnlmuller@gmail.com>
parents: 343
diff changeset
6 import sys
62a2a659c69b Call sprite editor dialog
Neil Muller <drnlmuller@gmail.com>
parents: 343
diff changeset
7 import traceback
489
e522db37e5c5 Refactor level saving to allow saving to a passed in file (e.g. StringIO object).
Simon Cross <hodgestar@gmail.com>
parents: 485
diff changeset
8 from StringIO import StringIO
490
be1e22e3f17c Finish hooking up level uploading.
Simon Cross <hodgestar@gmail.com>
parents: 489
diff changeset
9 import urllib
be1e22e3f17c Finish hooking up level uploading.
Simon Cross <hodgestar@gmail.com>
parents: 489
diff changeset
10 import urllib2
52
d09f63429b80 Add screen size fiddling to editor habitat
Neil Muller <drnlmuller@gmail.com>
parents: 42
diff changeset
11
551
9d3ed4d05f55 Hack in test level mode to editor
Neil Muller <drnlmuller@gmail.com>
parents: 544
diff changeset
12 from mamba.engine import (Habitat, NewHabitatEvent, SnakeDiedEvent,
9d3ed4d05f55 Hack in test level mode to editor
Neil Muller <drnlmuller@gmail.com>
parents: 544
diff changeset
13 LevelCompletedEvent)
508
6c61d5862310 Massive speical sprite editor rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 494
diff changeset
14 from mamba.sprites import find_special_sprites
120
6b1cdbdd34ca Rename LevelWidget
Neil Muller <drnlmuller@gmail.com>
parents: 113
diff changeset
15 from mamba.widgets.level import EditLevelWidget
174
893fb9f8f468 Hook up basic saving
Neil Muller <drnlmuller@gmail.com>
parents: 172
diff changeset
16 from mamba.widgets.text import TextWidget, TextButton
94
aba653f8383e Start adding editor toolbar
Neil Muller <drnlmuller@gmail.com>
parents: 64
diff changeset
17 from mamba.widgets.imagebutton import ImageButtonWidget
276
9c57025781e7 Warn on enter filename results
Neil Muller <drnlmuller@gmail.com>
parents: 275
diff changeset
18 from mamba.widgets.messagebox import MessageBox
229
b0ef7eecc67a Make filename editable
Neil Muller <drnlmuller@gmail.com>
parents: 180
diff changeset
19 from mamba.widgets.entrybox import EntryBox
272
a061dd62127c Hook up load and new buttons
Neil Muller <drnlmuller@gmail.com>
parents: 270
diff changeset
20 from mamba.widgets.listbox import ListBox
265
74ae1645df6e Move hackery into list widget
Neil Muller <drnlmuller@gmail.com>
parents: 240
diff changeset
21 from mamba.widgets.toollist import ToolListWidget
353
62a2a659c69b Call sprite editor dialog
Neil Muller <drnlmuller@gmail.com>
parents: 343
diff changeset
22 from mamba.widgets.editsprite import EditSpriteBox
454
8cfa757dd7d3 Epic level editor reworking.
Jeremy Thurgood <firxen@gmail.com>
parents: 423
diff changeset
23 from mamba.widgets.editlevel import EditLevelBox
278
f10d06fc64b2 Add some robustness against broken levels
Neil Muller <drnlmuller@gmail.com>
parents: 277
diff changeset
24 from mamba.level import Level, Tileset, TILE_MAP, THING_MAP, InvalidMapError
475
4986c22fe5fd Re-set window icon when the editor re-creates windows.
Simon Cross <hodgestar@gmail.com>
parents: 454
diff changeset
25 from mamba.data import (check_level_exists, get_level_list, load_file,
508
6c61d5862310 Massive speical sprite editor rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 494
diff changeset
26 load_image, load_tile_image)
270
3c95ba7408f1 Add protected level name list. Add load & new buttons
Neil Muller <drnlmuller@gmail.com>
parents: 267
diff changeset
27 from mamba.constants import (SCREEN, EDIT_SCREEN, NAME, ESCAPE_KEYS,
551
9d3ed4d05f55 Hack in test level mode to editor
Neil Muller <drnlmuller@gmail.com>
parents: 544
diff changeset
28 RESERVED_NAMES, WINDOW_ICON, LEVEL_SERVER, UP, DOWN, LEFT, RIGHT)
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
29
270
3c95ba7408f1 Add protected level name list. Add load & new buttons
Neil Muller <drnlmuller@gmail.com>
parents: 267
diff changeset
30 MAX_TOOLS = 6
481
68898de788cc Add upload button to editor.
Simon Cross <hodgestar@gmail.com>
parents: 479
diff changeset
31 MODE_HEIGHT = 370
68898de788cc Add upload button to editor.
Simon Cross <hodgestar@gmail.com>
parents: 479
diff changeset
32 LOAD_SAVE_HEIGHT = 500
240
f0c14d9abd84 Hack in multi-page toolbar
Neil Muller <drnlmuller@gmail.com>
parents: 237
diff changeset
33
544
13d02d1f5ae0 Add help to editor.
Simon Cross <hodgestar@gmail.com>
parents: 540
diff changeset
34 # hghooks: no-pep8
13d02d1f5ae0 Add help to editor.
Simon Cross <hodgestar@gmail.com>
parents: 540
diff changeset
35 HELP_MSG = (
13d02d1f5ae0 Add help to editor.
Simon Cross <hodgestar@gmail.com>
parents: 540
diff changeset
36 """Levels are saved as user levels, and stored in $XDG_DATA_HOME/.mamba/user_levels (i.e.
13d02d1f5ae0 Add help to editor.
Simon Cross <hodgestar@gmail.com>
parents: 540
diff changeset
37 ~/.local/share/.mamba/user_levels) or $APPDATA/.mamba/user_levels on Windows.
13d02d1f5ae0 Add help to editor.
Simon Cross <hodgestar@gmail.com>
parents: 540
diff changeset
38
13d02d1f5ae0 Add help to editor.
Simon Cross <hodgestar@gmail.com>
parents: 540
diff changeset
39 A new level can be created from one of the existing templates using "New". Level properties, such as the
13d02d1f5ae0 Add help to editor.
Simon Cross <hodgestar@gmail.com>
parents: 540
diff changeset
40 name, filename and background music track can be changed using the "Edit Level Metadata" button.
13d02d1f5ae0 Add help to editor.
Simon Cross <hodgestar@gmail.com>
parents: 540
diff changeset
41
551
9d3ed4d05f55 Hack in test level mode to editor
Neil Muller <drnlmuller@gmail.com>
parents: 544
diff changeset
42 The level editor has 4 modes: placing tiles, placing things, editing sprites and testing the level.
544
13d02d1f5ae0 Add help to editor.
Simon Cross <hodgestar@gmail.com>
parents: 540
diff changeset
43
13d02d1f5ae0 Add help to editor.
Simon Cross <hodgestar@gmail.com>
parents: 540
diff changeset
44 Tiles are level geography, such as floors, walls and so forth. Things are items that the snake can eat, such as rats.
13d02d1f5ae0 Add help to editor.
Simon Cross <hodgestar@gmail.com>
parents: 540
diff changeset
45 Sprites are special elements with more complex items which require extra configuration information, such as tunnels.
13d02d1f5ae0 Add help to editor.
Simon Cross <hodgestar@gmail.com>
parents: 540
diff changeset
46
551
9d3ed4d05f55 Hack in test level mode to editor
Neil Muller <drnlmuller@gmail.com>
parents: 544
diff changeset
47 To place tiles and things, select the desired element and click on the map to place the tile or thing. Deleting anything
9d3ed4d05f55 Hack in test level mode to editor
Neil Muller <drnlmuller@gmail.com>
parents: 544
diff changeset
48 replaces the space with a floor tile (Right click also deletes). The selection of tiles can be scrolled using the arrow buttons.
544
13d02d1f5ae0 Add help to editor.
Simon Cross <hodgestar@gmail.com>
parents: 540
diff changeset
49
551
9d3ed4d05f55 Hack in test level mode to editor
Neil Muller <drnlmuller@gmail.com>
parents: 544
diff changeset
50 Sprites can be placed as well. Sprites require parameters. Each sprite needs a unique id tag, which can be any string
9d3ed4d05f55 Hack in test level mode to editor
Neil Muller <drnlmuller@gmail.com>
parents: 544
diff changeset
51 without spaces, and then additional parameters that depend on the type of sprite, usually the id of another sprite.
9d3ed4d05f55 Hack in test level mode to editor
Neil Muller <drnlmuller@gmail.com>
parents: 544
diff changeset
52 Sprites can be added, edited and deleted. Look at existing maps to see how the parameters can be used.
9d3ed4d05f55 Hack in test level mode to editor
Neil Muller <drnlmuller@gmail.com>
parents: 544
diff changeset
53
552
b2e0f1267282 Add test mode to README. Tweak help text
Neil Muller <drnlmuller@gmail.com>
parents: 551
diff changeset
54 Test mode allows you to test the level without any clock running. The snake is moved using the cursor keys, or by pressing
b2e0f1267282 Add test mode to README. Tweak help text
Neil Muller <drnlmuller@gmail.com>
parents: 551
diff changeset
55 space, but interacts with the level as in the actual game. Space will advance the snake one step, useful for testing arrows.
544
13d02d1f5ae0 Add help to editor.
Simon Cross <hodgestar@gmail.com>
parents: 540
diff changeset
56
13d02d1f5ae0 Add help to editor.
Simon Cross <hodgestar@gmail.com>
parents: 540
diff changeset
57 Levels can be saved, and uploaded to be shared with other people. Shared levels
13d02d1f5ae0 Add help to editor.
Simon Cross <hodgestar@gmail.com>
parents: 540
diff changeset
58 only become available after the levels have been curated by the Mamba team.""")
13d02d1f5ae0 Add help to editor.
Simon Cross <hodgestar@gmail.com>
parents: 540
diff changeset
59
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
60
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
61 class EditorHabitat(Habitat):
314
fba74abad7b7 Pass Level() objects to LevelHabitat and LevelEditorHabitat, in preparation for generating thumbnails from levels in levelmenu
Stefano Rivera <stefano@rivera.za.net>
parents: 284
diff changeset
62 def __init__(self, level):
94
aba653f8383e Start adding editor toolbar
Neil Muller <drnlmuller@gmail.com>
parents: 64
diff changeset
63 super(EditorHabitat, self).__init__(EDIT_SCREEN)
479
3f37e011c3b6 Neater buttons
Neil Muller <drnlmuller@gmail.com>
parents: 475
diff changeset
64 self.toolbar = {}
314
fba74abad7b7 Pass Level() objects to LevelHabitat and LevelEditorHabitat, in preparation for generating thumbnails from levels in levelmenu
Stefano Rivera <stefano@rivera.za.net>
parents: 284
diff changeset
65 self.level = level
337
170d4a43c00e Don't edit the level when interacting with dialogs
Neil Muller <drnlmuller@gmail.com>
parents: 325
diff changeset
66 self.container.paused = False
172
dabf13abb3fd Add basic drawing to level editor
Neil Muller <drnlmuller@gmail.com>
parents: 170
diff changeset
67 self.edit_widget = EditLevelWidget(self.level)
dabf13abb3fd Add basic drawing to level editor
Neil Muller <drnlmuller@gmail.com>
parents: 170
diff changeset
68 self.container.add(self.edit_widget)
64
fbb5cc655b47 More screen size fiddling hackery
Neil Muller <drnlmuller@gmail.com>
parents: 52
diff changeset
69 self.container.add_callback(KEYDOWN, self.keydown_event)
343
5bf35267ddc0 Hook up sprite deletion. Framework work for sprite editing & adding
Neil Muller <drnlmuller@gmail.com>
parents: 337
diff changeset
70 self.container.add_callback(MOUSEBUTTONDOWN, self.mouse_event)
551
9d3ed4d05f55 Hack in test level mode to editor
Neil Muller <drnlmuller@gmail.com>
parents: 544
diff changeset
71 self.edit_widget.add_callback(SnakeDiedEvent, self.halt_test)
9d3ed4d05f55 Hack in test level mode to editor
Neil Muller <drnlmuller@gmail.com>
parents: 544
diff changeset
72 self.edit_widget.add_callback(LevelCompletedEvent, self.halt_test)
284
96b4ad9b4d30 Start work on sprite editor. Tweak layout issues
Neil Muller <drnlmuller@gmail.com>
parents: 279
diff changeset
73 self.mode = 'Tiles'
96b4ad9b4d30 Start work on sprite editor. Tweak layout issues
Neil Muller <drnlmuller@gmail.com>
parents: 279
diff changeset
74 self.sprite_mode = 'Add'
508
6c61d5862310 Massive speical sprite editor rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 494
diff changeset
75 self.sprite_cls = None
551
9d3ed4d05f55 Hack in test level mode to editor
Neil Muller <drnlmuller@gmail.com>
parents: 544
diff changeset
76 # Map for test mode lookups
9d3ed4d05f55 Hack in test level mode to editor
Neil Muller <drnlmuller@gmail.com>
parents: 544
diff changeset
77 self.action_map = {
9d3ed4d05f55 Hack in test level mode to editor
Neil Muller <drnlmuller@gmail.com>
parents: 544
diff changeset
78 K_UP: UP,
9d3ed4d05f55 Hack in test level mode to editor
Neil Muller <drnlmuller@gmail.com>
parents: 544
diff changeset
79 K_DOWN: DOWN,
9d3ed4d05f55 Hack in test level mode to editor
Neil Muller <drnlmuller@gmail.com>
parents: 544
diff changeset
80 K_LEFT: LEFT,
9d3ed4d05f55 Hack in test level mode to editor
Neil Muller <drnlmuller@gmail.com>
parents: 544
diff changeset
81 K_RIGHT: RIGHT,
9d3ed4d05f55 Hack in test level mode to editor
Neil Muller <drnlmuller@gmail.com>
parents: 544
diff changeset
82 K_SPACE: None,
9d3ed4d05f55 Hack in test level mode to editor
Neil Muller <drnlmuller@gmail.com>
parents: 544
diff changeset
83 }
52
d09f63429b80 Add screen size fiddling to editor habitat
Neil Muller <drnlmuller@gmail.com>
parents: 42
diff changeset
84
d09f63429b80 Add screen size fiddling to editor habitat
Neil Muller <drnlmuller@gmail.com>
parents: 42
diff changeset
85 def on_enter(self):
d09f63429b80 Add screen size fiddling to editor habitat
Neil Muller <drnlmuller@gmail.com>
parents: 42
diff changeset
86 # 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
87 # This is a horrible hack
d09f63429b80 Add screen size fiddling to editor habitat
Neil Muller <drnlmuller@gmail.com>
parents: 42
diff changeset
88 pygame.display.quit()
d09f63429b80 Add screen size fiddling to editor habitat
Neil Muller <drnlmuller@gmail.com>
parents: 42
diff changeset
89 pygame.display.init()
d09f63429b80 Add screen size fiddling to editor habitat
Neil Muller <drnlmuller@gmail.com>
parents: 42
diff changeset
90 pygame.display.set_mode(EDIT_SCREEN, SWSURFACE)
475
4986c22fe5fd Re-set window icon when the editor re-creates windows.
Simon Cross <hodgestar@gmail.com>
parents: 454
diff changeset
91 pygame.display.set_icon(load_image(WINDOW_ICON))
52
d09f63429b80 Add screen size fiddling to editor habitat
Neil Muller <drnlmuller@gmail.com>
parents: 42
diff changeset
92 pygame.display.set_caption('%s Level editor' % NAME)
64
fbb5cc655b47 More screen size fiddling hackery
Neil Muller <drnlmuller@gmail.com>
parents: 52
diff changeset
93 super(EditorHabitat, self).on_enter()
94
aba653f8383e Start adding editor toolbar
Neil Muller <drnlmuller@gmail.com>
parents: 64
diff changeset
94 self.setup_toolbar()
52
d09f63429b80 Add screen size fiddling to editor habitat
Neil Muller <drnlmuller@gmail.com>
parents: 42
diff changeset
95
d09f63429b80 Add screen size fiddling to editor habitat
Neil Muller <drnlmuller@gmail.com>
parents: 42
diff changeset
96 def on_exit(self):
d09f63429b80 Add screen size fiddling to editor habitat
Neil Muller <drnlmuller@gmail.com>
parents: 42
diff changeset
97 # 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
98 # This is a horrible hack
64
fbb5cc655b47 More screen size fiddling hackery
Neil Muller <drnlmuller@gmail.com>
parents: 52
diff changeset
99 super(EditorHabitat, self).on_exit()
52
d09f63429b80 Add screen size fiddling to editor habitat
Neil Muller <drnlmuller@gmail.com>
parents: 42
diff changeset
100 pygame.display.quit()
d09f63429b80 Add screen size fiddling to editor habitat
Neil Muller <drnlmuller@gmail.com>
parents: 42
diff changeset
101 pygame.display.init()
d09f63429b80 Add screen size fiddling to editor habitat
Neil Muller <drnlmuller@gmail.com>
parents: 42
diff changeset
102 pygame.display.set_mode(SCREEN, SWSURFACE)
475
4986c22fe5fd Re-set window icon when the editor re-creates windows.
Simon Cross <hodgestar@gmail.com>
parents: 454
diff changeset
103 pygame.display.set_icon(load_image(WINDOW_ICON))
52
d09f63429b80 Add screen size fiddling to editor habitat
Neil Muller <drnlmuller@gmail.com>
parents: 42
diff changeset
104 pygame.display.set_caption(NAME)
64
fbb5cc655b47 More screen size fiddling hackery
Neil Muller <drnlmuller@gmail.com>
parents: 52
diff changeset
105
fbb5cc655b47 More screen size fiddling hackery
Neil Muller <drnlmuller@gmail.com>
parents: 52
diff changeset
106 def keydown_event(self, ev, widget):
fbb5cc655b47 More screen size fiddling hackery
Neil Muller <drnlmuller@gmail.com>
parents: 52
diff changeset
107 if ev.key in ESCAPE_KEYS:
fbb5cc655b47 More screen size fiddling hackery
Neil Muller <drnlmuller@gmail.com>
parents: 52
diff changeset
108 from mamba.habitats.mainmenu import MainMenu
fbb5cc655b47 More screen size fiddling hackery
Neil Muller <drnlmuller@gmail.com>
parents: 52
diff changeset
109 NewHabitatEvent.post(MainMenu())
337
170d4a43c00e Don't edit the level when interacting with dialogs
Neil Muller <drnlmuller@gmail.com>
parents: 325
diff changeset
110 return True
267
1e8dca95c48a Hook up hot-keys in editor for jerith
Neil Muller <drnlmuller@gmail.com>
parents: 265
diff changeset
111 elif ev.key == K_1:
1e8dca95c48a Hook up hot-keys in editor for jerith
Neil Muller <drnlmuller@gmail.com>
parents: 265
diff changeset
112 # Activate floor button
1e8dca95c48a Hook up hot-keys in editor for jerith
Neil Muller <drnlmuller@gmail.com>
parents: 265
diff changeset
113 self.floor_button.forced_click()
337
170d4a43c00e Don't edit the level when interacting with dialogs
Neil Muller <drnlmuller@gmail.com>
parents: 325
diff changeset
114 return True
551
9d3ed4d05f55 Hack in test level mode to editor
Neil Muller <drnlmuller@gmail.com>
parents: 544
diff changeset
115 elif self.mode == 'Test' and ev.key in self.action_map:
9d3ed4d05f55 Hack in test level mode to editor
Neil Muller <drnlmuller@gmail.com>
parents: 544
diff changeset
116 self.edit_widget.apply_action(self.action_map[ev.key])
9d3ed4d05f55 Hack in test level mode to editor
Neil Muller <drnlmuller@gmail.com>
parents: 544
diff changeset
117 return True
9d3ed4d05f55 Hack in test level mode to editor
Neil Muller <drnlmuller@gmail.com>
parents: 544
diff changeset
118
9d3ed4d05f55 Hack in test level mode to editor
Neil Muller <drnlmuller@gmail.com>
parents: 544
diff changeset
119 def halt_test(self, ev, widget):
9d3ed4d05f55 Hack in test level mode to editor
Neil Muller <drnlmuller@gmail.com>
parents: 544
diff changeset
120 if SnakeDiedEvent.matches(ev):
9d3ed4d05f55 Hack in test level mode to editor
Neil Muller <drnlmuller@gmail.com>
parents: 544
diff changeset
121 text = 'Snake died: %s' % ev.reason
9d3ed4d05f55 Hack in test level mode to editor
Neil Muller <drnlmuller@gmail.com>
parents: 544
diff changeset
122 else:
9d3ed4d05f55 Hack in test level mode to editor
Neil Muller <drnlmuller@gmail.com>
parents: 544
diff changeset
123 text = 'Level completed'
9d3ed4d05f55 Hack in test level mode to editor
Neil Muller <drnlmuller@gmail.com>
parents: 544
diff changeset
124 if self.edit_widget.snake_alive:
9d3ed4d05f55 Hack in test level mode to editor
Neil Muller <drnlmuller@gmail.com>
parents: 544
diff changeset
125 self.edit_widget.kill_snake()
9d3ed4d05f55 Hack in test level mode to editor
Neil Muller <drnlmuller@gmail.com>
parents: 544
diff changeset
126 message = MessageBox((300, 200), text,
9d3ed4d05f55 Hack in test level mode to editor
Neil Muller <drnlmuller@gmail.com>
parents: 544
diff changeset
127 post_callback=self.test_restart)
9d3ed4d05f55 Hack in test level mode to editor
Neil Muller <drnlmuller@gmail.com>
parents: 544
diff changeset
128 self.display_dialog(message)
9d3ed4d05f55 Hack in test level mode to editor
Neil Muller <drnlmuller@gmail.com>
parents: 544
diff changeset
129 return True
9d3ed4d05f55 Hack in test level mode to editor
Neil Muller <drnlmuller@gmail.com>
parents: 544
diff changeset
130
9d3ed4d05f55 Hack in test level mode to editor
Neil Muller <drnlmuller@gmail.com>
parents: 544
diff changeset
131 def test_restart(self):
9d3ed4d05f55 Hack in test level mode to editor
Neil Muller <drnlmuller@gmail.com>
parents: 544
diff changeset
132 self.unpause()
9d3ed4d05f55 Hack in test level mode to editor
Neil Muller <drnlmuller@gmail.com>
parents: 544
diff changeset
133 self.edit_widget.restart()
9d3ed4d05f55 Hack in test level mode to editor
Neil Muller <drnlmuller@gmail.com>
parents: 544
diff changeset
134 return True
94
aba653f8383e Start adding editor toolbar
Neil Muller <drnlmuller@gmail.com>
parents: 64
diff changeset
135
aba653f8383e Start adding editor toolbar
Neil Muller <drnlmuller@gmail.com>
parents: 64
diff changeset
136 def setup_toolbar(self):
aba653f8383e Start adding editor toolbar
Neil Muller <drnlmuller@gmail.com>
parents: 64
diff changeset
137 """Draw the editor toolbar"""
236
09247e08aeda Refactor edit calling code. Tweak toolbar layout
Neil Muller <drnlmuller@gmail.com>
parents: 229
diff changeset
138 button_height = 5
94
aba653f8383e Start adding editor toolbar
Neil Muller <drnlmuller@gmail.com>
parents: 64
diff changeset
139 button_left = 820
236
09247e08aeda Refactor edit calling code. Tweak toolbar layout
Neil Muller <drnlmuller@gmail.com>
parents: 229
diff changeset
140 button_padding = 2
180
d9ee0e50a78f Teach editor about THING_MAP
Neil Muller <drnlmuller@gmail.com>
parents: 175
diff changeset
141
454
8cfa757dd7d3 Epic level editor reworking.
Jeremy Thurgood <firxen@gmail.com>
parents: 423
diff changeset
142 level_name = TextWidget((button_left, button_height),
8cfa757dd7d3 Epic level editor reworking.
Jeremy Thurgood <firxen@gmail.com>
parents: 423
diff changeset
143 'Level: %s' % self.level.level_name)
8cfa757dd7d3 Epic level editor reworking.
Jeremy Thurgood <firxen@gmail.com>
parents: 423
diff changeset
144 self.container.add(level_name)
8cfa757dd7d3 Epic level editor reworking.
Jeremy Thurgood <firxen@gmail.com>
parents: 423
diff changeset
145 button_height += level_name.rect.height + button_padding
8cfa757dd7d3 Epic level editor reworking.
Jeremy Thurgood <firxen@gmail.com>
parents: 423
diff changeset
146
8cfa757dd7d3 Epic level editor reworking.
Jeremy Thurgood <firxen@gmail.com>
parents: 423
diff changeset
147 edit_level = TextButton((button_left, button_height),
8cfa757dd7d3 Epic level editor reworking.
Jeremy Thurgood <firxen@gmail.com>
parents: 423
diff changeset
148 'Edit Level Metadata')
8cfa757dd7d3 Epic level editor reworking.
Jeremy Thurgood <firxen@gmail.com>
parents: 423
diff changeset
149 edit_level.add_callback('clicked', self.edit_level_data)
8cfa757dd7d3 Epic level editor reworking.
Jeremy Thurgood <firxen@gmail.com>
parents: 423
diff changeset
150 self.container.add(edit_level)
8cfa757dd7d3 Epic level editor reworking.
Jeremy Thurgood <firxen@gmail.com>
parents: 423
diff changeset
151 button_height += edit_level.rect.height + button_padding
94
aba653f8383e Start adding editor toolbar
Neil Muller <drnlmuller@gmail.com>
parents: 64
diff changeset
152
172
dabf13abb3fd Add basic drawing to level editor
Neil Muller <drnlmuller@gmail.com>
parents: 170
diff changeset
153 # TODO: Add Image widget for the current tool
284
96b4ad9b4d30 Start work on sprite editor. Tweak layout issues
Neil Muller <drnlmuller@gmail.com>
parents: 279
diff changeset
154 if self.mode != 'Sprites':
96b4ad9b4d30 Start work on sprite editor. Tweak layout issues
Neil Muller <drnlmuller@gmail.com>
parents: 279
diff changeset
155 self.current_tool = TextWidget((button_left, button_height),
96b4ad9b4d30 Start work on sprite editor. Tweak layout issues
Neil Muller <drnlmuller@gmail.com>
parents: 279
diff changeset
156 'Tool: Floor', color='white')
96b4ad9b4d30 Start work on sprite editor. Tweak layout issues
Neil Muller <drnlmuller@gmail.com>
parents: 279
diff changeset
157 else:
96b4ad9b4d30 Start work on sprite editor. Tweak layout issues
Neil Muller <drnlmuller@gmail.com>
parents: 279
diff changeset
158 self.current_tool = TextWidget((button_left, button_height),
96b4ad9b4d30 Start work on sprite editor. Tweak layout issues
Neil Muller <drnlmuller@gmail.com>
parents: 279
diff changeset
159 '%s Sprite' % self.sprite_mode, color='white')
172
dabf13abb3fd Add basic drawing to level editor
Neil Muller <drnlmuller@gmail.com>
parents: 170
diff changeset
160 self.container.add(self.current_tool)
dabf13abb3fd Add basic drawing to level editor
Neil Muller <drnlmuller@gmail.com>
parents: 170
diff changeset
161 button_height += self.current_tool.surface.get_height()
dabf13abb3fd Add basic drawing to level editor
Neil Muller <drnlmuller@gmail.com>
parents: 170
diff changeset
162 button_height += button_padding
284
96b4ad9b4d30 Start work on sprite editor. Tweak layout issues
Neil Muller <drnlmuller@gmail.com>
parents: 279
diff changeset
163 if self.mode != 'Sprites':
96b4ad9b4d30 Start work on sprite editor. Tweak layout issues
Neil Muller <drnlmuller@gmail.com>
parents: 279
diff changeset
164 self.floor_button = ImageButtonWidget(
96b4ad9b4d30 Start work on sprite editor. Tweak layout issues
Neil Muller <drnlmuller@gmail.com>
parents: 279
diff changeset
165 (button_left, button_height), self.level.tileset.floor,
96b4ad9b4d30 Start work on sprite editor. Tweak layout issues
Neil Muller <drnlmuller@gmail.com>
parents: 279
diff changeset
166 'Floor', color='white')
96b4ad9b4d30 Start work on sprite editor. Tweak layout issues
Neil Muller <drnlmuller@gmail.com>
parents: 279
diff changeset
167 self.container.add(self.floor_button)
96b4ad9b4d30 Start work on sprite editor. Tweak layout issues
Neil Muller <drnlmuller@gmail.com>
parents: 279
diff changeset
168 self.floor_button.add_callback('clicked', self.change_tool,
96b4ad9b4d30 Start work on sprite editor. Tweak layout issues
Neil Muller <drnlmuller@gmail.com>
parents: 279
diff changeset
169 '.', 'Floor')
96b4ad9b4d30 Start work on sprite editor. Tweak layout issues
Neil Muller <drnlmuller@gmail.com>
parents: 279
diff changeset
170 self.edit_widget.set_tool('.')
96b4ad9b4d30 Start work on sprite editor. Tweak layout issues
Neil Muller <drnlmuller@gmail.com>
parents: 279
diff changeset
171 button_height += (self.floor_button.surface.get_height()
96b4ad9b4d30 Start work on sprite editor. Tweak layout issues
Neil Muller <drnlmuller@gmail.com>
parents: 279
diff changeset
172 + button_padding)
479
3f37e011c3b6 Neater buttons
Neil Muller <drnlmuller@gmail.com>
parents: 475
diff changeset
173 if self.mode in self.toolbar:
3f37e011c3b6 Neater buttons
Neil Muller <drnlmuller@gmail.com>
parents: 475
diff changeset
174 # FIXME: This needs to be recreated on tileset changes
3f37e011c3b6 Neater buttons
Neil Muller <drnlmuller@gmail.com>
parents: 475
diff changeset
175 self.tool_widget = self.toolbar[self.mode]
284
96b4ad9b4d30 Start work on sprite editor. Tweak layout issues
Neil Muller <drnlmuller@gmail.com>
parents: 279
diff changeset
176 else:
479
3f37e011c3b6 Neater buttons
Neil Muller <drnlmuller@gmail.com>
parents: 475
diff changeset
177 if self.mode == 'Tiles':
3f37e011c3b6 Neater buttons
Neil Muller <drnlmuller@gmail.com>
parents: 475
diff changeset
178 tile_map = TILE_MAP
3f37e011c3b6 Neater buttons
Neil Muller <drnlmuller@gmail.com>
parents: 475
diff changeset
179 elif self.mode == 'Things':
3f37e011c3b6 Neater buttons
Neil Muller <drnlmuller@gmail.com>
parents: 475
diff changeset
180 tile_map = THING_MAP
170
77f1dae64019 Use name in editor
Neil Muller <drnlmuller@gmail.com>
parents: 120
diff changeset
181 else:
479
3f37e011c3b6 Neater buttons
Neil Muller <drnlmuller@gmail.com>
parents: 475
diff changeset
182 tile_map = []
3f37e011c3b6 Neater buttons
Neil Muller <drnlmuller@gmail.com>
parents: 475
diff changeset
183 tool_list = []
3f37e011c3b6 Neater buttons
Neil Muller <drnlmuller@gmail.com>
parents: 475
diff changeset
184 for tile_char in sorted(tile_map):
3f37e011c3b6 Neater buttons
Neil Muller <drnlmuller@gmail.com>
parents: 475
diff changeset
185 try:
3f37e011c3b6 Neater buttons
Neil Muller <drnlmuller@gmail.com>
parents: 475
diff changeset
186 tile = self.level.tileset[tile_char]
3f37e011c3b6 Neater buttons
Neil Muller <drnlmuller@gmail.com>
parents: 475
diff changeset
187 except pygame.error:
3f37e011c3b6 Neater buttons
Neil Muller <drnlmuller@gmail.com>
parents: 475
diff changeset
188 # Ignore stuff we can't load for now
3f37e011c3b6 Neater buttons
Neil Muller <drnlmuller@gmail.com>
parents: 475
diff changeset
189 continue
3f37e011c3b6 Neater buttons
Neil Muller <drnlmuller@gmail.com>
parents: 475
diff changeset
190 if tile is None:
3f37e011c3b6 Neater buttons
Neil Muller <drnlmuller@gmail.com>
parents: 475
diff changeset
191 continue
3f37e011c3b6 Neater buttons
Neil Muller <drnlmuller@gmail.com>
parents: 475
diff changeset
192 if tile.name:
3f37e011c3b6 Neater buttons
Neil Muller <drnlmuller@gmail.com>
parents: 475
diff changeset
193 text = tile.name
3f37e011c3b6 Neater buttons
Neil Muller <drnlmuller@gmail.com>
parents: 475
diff changeset
194 else:
3f37e011c3b6 Neater buttons
Neil Muller <drnlmuller@gmail.com>
parents: 475
diff changeset
195 text = 'Tile'
3f37e011c3b6 Neater buttons
Neil Muller <drnlmuller@gmail.com>
parents: 475
diff changeset
196 tile_button = ImageButtonWidget((0, 0), tile.image, text,
3f37e011c3b6 Neater buttons
Neil Muller <drnlmuller@gmail.com>
parents: 475
diff changeset
197 color='white')
3f37e011c3b6 Neater buttons
Neil Muller <drnlmuller@gmail.com>
parents: 475
diff changeset
198 tile_button.add_callback('clicked', self.change_tool,
3f37e011c3b6 Neater buttons
Neil Muller <drnlmuller@gmail.com>
parents: 475
diff changeset
199 tile_char, text)
284
96b4ad9b4d30 Start work on sprite editor. Tweak layout issues
Neil Muller <drnlmuller@gmail.com>
parents: 279
diff changeset
200 tool_list.append(tile_button)
479
3f37e011c3b6 Neater buttons
Neil Muller <drnlmuller@gmail.com>
parents: 475
diff changeset
201 if self.mode == "Sprites":
508
6c61d5862310 Massive speical sprite editor rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 494
diff changeset
202 for cls_name, sprite_cls in find_special_sprites():
6c61d5862310 Massive speical sprite editor rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 494
diff changeset
203 image = load_tile_image(sprite_cls.image_name,
6c61d5862310 Massive speical sprite editor rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 494
diff changeset
204 self.level.tileset.name)
6c61d5862310 Massive speical sprite editor rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 494
diff changeset
205 name = sprite_cls.name
6c61d5862310 Massive speical sprite editor rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 494
diff changeset
206 tile_button = ImageButtonWidget((0, 0), image, name,
6c61d5862310 Massive speical sprite editor rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 494
diff changeset
207 color='white')
6c61d5862310 Massive speical sprite editor rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 494
diff changeset
208 tile_button.add_callback('clicked', self.sprite_tool,
6c61d5862310 Massive speical sprite editor rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 494
diff changeset
209 'Add', cls_name, sprite_cls)
6c61d5862310 Massive speical sprite editor rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 494
diff changeset
210 tool_list.append(tile_button)
6c61d5862310 Massive speical sprite editor rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 494
diff changeset
211 for name in ['Edit', 'Delete']:
479
3f37e011c3b6 Neater buttons
Neil Muller <drnlmuller@gmail.com>
parents: 475
diff changeset
212 tile_button = TextButton((0, 0), '%s Sprite' % name)
3f37e011c3b6 Neater buttons
Neil Muller <drnlmuller@gmail.com>
parents: 475
diff changeset
213 tile_button.add_callback('clicked', self.sprite_tool,
508
6c61d5862310 Massive speical sprite editor rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 494
diff changeset
214 name, None, None)
479
3f37e011c3b6 Neater buttons
Neil Muller <drnlmuller@gmail.com>
parents: 475
diff changeset
215 tool_list.append(tile_button)
3f37e011c3b6 Neater buttons
Neil Muller <drnlmuller@gmail.com>
parents: 475
diff changeset
216 self.tool_widget = ToolListWidget((button_left, button_height),
3f37e011c3b6 Neater buttons
Neil Muller <drnlmuller@gmail.com>
parents: 475
diff changeset
217 tool_list, MAX_TOOLS, start_key=K_2)
3f37e011c3b6 Neater buttons
Neil Muller <drnlmuller@gmail.com>
parents: 475
diff changeset
218 self.toolbar[self.mode] = self.tool_widget
267
1e8dca95c48a Hook up hot-keys in editor for jerith
Neil Muller <drnlmuller@gmail.com>
parents: 265
diff changeset
219 self.container.add(self.tool_widget)
481
68898de788cc Add upload button to editor.
Simon Cross <hodgestar@gmail.com>
parents: 479
diff changeset
220
284
96b4ad9b4d30 Start work on sprite editor. Tweak layout issues
Neil Muller <drnlmuller@gmail.com>
parents: 279
diff changeset
221 button_height = self.container.rect.top + MODE_HEIGHT
481
68898de788cc Add upload button to editor.
Simon Cross <hodgestar@gmail.com>
parents: 479
diff changeset
222 tile_button = TextButton((button_left, button_height),
68898de788cc Add upload button to editor.
Simon Cross <hodgestar@gmail.com>
parents: 479
diff changeset
223 'Tiles')
68898de788cc Add upload button to editor.
Simon Cross <hodgestar@gmail.com>
parents: 479
diff changeset
224 tile_button.add_callback('clicked', self.change_toolbar, 'Tiles')
68898de788cc Add upload button to editor.
Simon Cross <hodgestar@gmail.com>
parents: 479
diff changeset
225 thing_button = TextButton((button_left + tile_button.rect.width +
68898de788cc Add upload button to editor.
Simon Cross <hodgestar@gmail.com>
parents: 479
diff changeset
226 button_padding, button_height),
68898de788cc Add upload button to editor.
Simon Cross <hodgestar@gmail.com>
parents: 479
diff changeset
227 'Things')
68898de788cc Add upload button to editor.
Simon Cross <hodgestar@gmail.com>
parents: 479
diff changeset
228 thing_button.add_callback('clicked', self.change_toolbar, 'Things')
68898de788cc Add upload button to editor.
Simon Cross <hodgestar@gmail.com>
parents: 479
diff changeset
229 sprite_button = TextButton((button_left,
540
efe1b61aad08 Start of help and an exit button.
Simon Cross <hodgestar@gmail.com>
parents: 533
diff changeset
230 thing_button.rect.bottom +
481
68898de788cc Add upload button to editor.
Simon Cross <hodgestar@gmail.com>
parents: 479
diff changeset
231 button_padding),
68898de788cc Add upload button to editor.
Simon Cross <hodgestar@gmail.com>
parents: 479
diff changeset
232 'Sprites')
68898de788cc Add upload button to editor.
Simon Cross <hodgestar@gmail.com>
parents: 479
diff changeset
233 sprite_button.add_callback('clicked', self.change_toolbar,
68898de788cc Add upload button to editor.
Simon Cross <hodgestar@gmail.com>
parents: 479
diff changeset
234 'Sprites')
551
9d3ed4d05f55 Hack in test level mode to editor
Neil Muller <drnlmuller@gmail.com>
parents: 544
diff changeset
235 test_button = TextButton((sprite_button.rect.right + button_padding,
540
efe1b61aad08 Start of help and an exit button.
Simon Cross <hodgestar@gmail.com>
parents: 533
diff changeset
236 thing_button.rect.bottom + button_padding),
551
9d3ed4d05f55 Hack in test level mode to editor
Neil Muller <drnlmuller@gmail.com>
parents: 544
diff changeset
237 'Test')
9d3ed4d05f55 Hack in test level mode to editor
Neil Muller <drnlmuller@gmail.com>
parents: 544
diff changeset
238 test_button.add_callback('clicked', self.change_toolbar, 'Test')
9d3ed4d05f55 Hack in test level mode to editor
Neil Muller <drnlmuller@gmail.com>
parents: 544
diff changeset
239 help_button = TextButton((button_left,
9d3ed4d05f55 Hack in test level mode to editor
Neil Muller <drnlmuller@gmail.com>
parents: 544
diff changeset
240 test_button.rect.bottom + button_padding),
540
efe1b61aad08 Start of help and an exit button.
Simon Cross <hodgestar@gmail.com>
parents: 533
diff changeset
241 'Help')
efe1b61aad08 Start of help and an exit button.
Simon Cross <hodgestar@gmail.com>
parents: 533
diff changeset
242 help_button.add_callback('clicked', self.show_help)
efe1b61aad08 Start of help and an exit button.
Simon Cross <hodgestar@gmail.com>
parents: 533
diff changeset
243
481
68898de788cc Add upload button to editor.
Simon Cross <hodgestar@gmail.com>
parents: 479
diff changeset
244 if self.mode == "Tiles":
68898de788cc Add upload button to editor.
Simon Cross <hodgestar@gmail.com>
parents: 479
diff changeset
245 tile_button.disable()
68898de788cc Add upload button to editor.
Simon Cross <hodgestar@gmail.com>
parents: 479
diff changeset
246 elif self.mode == "Things":
68898de788cc Add upload button to editor.
Simon Cross <hodgestar@gmail.com>
parents: 479
diff changeset
247 thing_button.disable()
68898de788cc Add upload button to editor.
Simon Cross <hodgestar@gmail.com>
parents: 479
diff changeset
248 elif self.mode == "Sprites":
68898de788cc Add upload button to editor.
Simon Cross <hodgestar@gmail.com>
parents: 479
diff changeset
249 sprite_button.disable()
551
9d3ed4d05f55 Hack in test level mode to editor
Neil Muller <drnlmuller@gmail.com>
parents: 544
diff changeset
250 elif self.mode == 'Test':
9d3ed4d05f55 Hack in test level mode to editor
Neil Muller <drnlmuller@gmail.com>
parents: 544
diff changeset
251 test_button.disable()
481
68898de788cc Add upload button to editor.
Simon Cross <hodgestar@gmail.com>
parents: 479
diff changeset
252 self.container.add(tile_button)
68898de788cc Add upload button to editor.
Simon Cross <hodgestar@gmail.com>
parents: 479
diff changeset
253 self.container.add(thing_button)
68898de788cc Add upload button to editor.
Simon Cross <hodgestar@gmail.com>
parents: 479
diff changeset
254 self.container.add(sprite_button)
551
9d3ed4d05f55 Hack in test level mode to editor
Neil Muller <drnlmuller@gmail.com>
parents: 544
diff changeset
255 self.container.add(test_button)
540
efe1b61aad08 Start of help and an exit button.
Simon Cross <hodgestar@gmail.com>
parents: 533
diff changeset
256 self.container.add(help_button)
481
68898de788cc Add upload button to editor.
Simon Cross <hodgestar@gmail.com>
parents: 479
diff changeset
257
68898de788cc Add upload button to editor.
Simon Cross <hodgestar@gmail.com>
parents: 479
diff changeset
258 button_height = LOAD_SAVE_HEIGHT
68898de788cc Add upload button to editor.
Simon Cross <hodgestar@gmail.com>
parents: 479
diff changeset
259
68898de788cc Add upload button to editor.
Simon Cross <hodgestar@gmail.com>
parents: 479
diff changeset
260 upload = TextButton((button_left, button_height), "Upload Level")
68898de788cc Add upload button to editor.
Simon Cross <hodgestar@gmail.com>
parents: 479
diff changeset
261 upload.add_callback('clicked', self.upload)
68898de788cc Add upload button to editor.
Simon Cross <hodgestar@gmail.com>
parents: 479
diff changeset
262 self.container.add(upload)
68898de788cc Add upload button to editor.
Simon Cross <hodgestar@gmail.com>
parents: 479
diff changeset
263
540
efe1b61aad08 Start of help and an exit button.
Simon Cross <hodgestar@gmail.com>
parents: 533
diff changeset
264 mainmenu = TextButton((upload.rect.right + button_padding,
efe1b61aad08 Start of help and an exit button.
Simon Cross <hodgestar@gmail.com>
parents: 533
diff changeset
265 button_height), 'Exit')
efe1b61aad08 Start of help and an exit button.
Simon Cross <hodgestar@gmail.com>
parents: 533
diff changeset
266 mainmenu.add_callback('clicked', self.go_mainmenu)
efe1b61aad08 Start of help and an exit button.
Simon Cross <hodgestar@gmail.com>
parents: 533
diff changeset
267 self.container.add(mainmenu)
efe1b61aad08 Start of help and an exit button.
Simon Cross <hodgestar@gmail.com>
parents: 533
diff changeset
268
481
68898de788cc Add upload button to editor.
Simon Cross <hodgestar@gmail.com>
parents: 479
diff changeset
269 button_height = upload.rect.bottom + button_padding
180
d9ee0e50a78f Teach editor about THING_MAP
Neil Muller <drnlmuller@gmail.com>
parents: 175
diff changeset
270
270
3c95ba7408f1 Add protected level name list. Add load & new buttons
Neil Muller <drnlmuller@gmail.com>
parents: 267
diff changeset
271 new = TextButton((button_left, button_height), "New")
3c95ba7408f1 Add protected level name list. Add load & new buttons
Neil Muller <drnlmuller@gmail.com>
parents: 267
diff changeset
272 new.add_callback('clicked', self.new)
3c95ba7408f1 Add protected level name list. Add load & new buttons
Neil Muller <drnlmuller@gmail.com>
parents: 267
diff changeset
273 self.container.add(new)
481
68898de788cc Add upload button to editor.
Simon Cross <hodgestar@gmail.com>
parents: 479
diff changeset
274
68898de788cc Add upload button to editor.
Simon Cross <hodgestar@gmail.com>
parents: 479
diff changeset
275 load = TextButton((new.rect.right + button_padding, button_height),
68898de788cc Add upload button to editor.
Simon Cross <hodgestar@gmail.com>
parents: 479
diff changeset
276 "Load")
270
3c95ba7408f1 Add protected level name list. Add load & new buttons
Neil Muller <drnlmuller@gmail.com>
parents: 267
diff changeset
277 load.add_callback('clicked', self.load)
3c95ba7408f1 Add protected level name list. Add load & new buttons
Neil Muller <drnlmuller@gmail.com>
parents: 267
diff changeset
278 self.container.add(load)
3c95ba7408f1 Add protected level name list. Add load & new buttons
Neil Muller <drnlmuller@gmail.com>
parents: 267
diff changeset
279
481
68898de788cc Add upload button to editor.
Simon Cross <hodgestar@gmail.com>
parents: 479
diff changeset
280 save = TextButton((load.rect.right + button_padding, button_height),
68898de788cc Add upload button to editor.
Simon Cross <hodgestar@gmail.com>
parents: 479
diff changeset
281 "Save")
270
3c95ba7408f1 Add protected level name list. Add load & new buttons
Neil Muller <drnlmuller@gmail.com>
parents: 267
diff changeset
282 save.add_callback('clicked', self.save)
3c95ba7408f1 Add protected level name list. Add load & new buttons
Neil Muller <drnlmuller@gmail.com>
parents: 267
diff changeset
283 self.container.add(save)
172
dabf13abb3fd Add basic drawing to level editor
Neil Muller <drnlmuller@gmail.com>
parents: 170
diff changeset
284
551
9d3ed4d05f55 Hack in test level mode to editor
Neil Muller <drnlmuller@gmail.com>
parents: 544
diff changeset
285 if self.mode == 'Test':
9d3ed4d05f55 Hack in test level mode to editor
Neil Muller <drnlmuller@gmail.com>
parents: 544
diff changeset
286 save.disable()
9d3ed4d05f55 Hack in test level mode to editor
Neil Muller <drnlmuller@gmail.com>
parents: 544
diff changeset
287 load.disable()
9d3ed4d05f55 Hack in test level mode to editor
Neil Muller <drnlmuller@gmail.com>
parents: 544
diff changeset
288 new.disable()
9d3ed4d05f55 Hack in test level mode to editor
Neil Muller <drnlmuller@gmail.com>
parents: 544
diff changeset
289
172
dabf13abb3fd Add basic drawing to level editor
Neil Muller <drnlmuller@gmail.com>
parents: 170
diff changeset
290 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
291 self.edit_widget.set_tool(new_tool)
dabf13abb3fd Add basic drawing to level editor
Neil Muller <drnlmuller@gmail.com>
parents: 170
diff changeset
292 self.current_tool.text = 'Tool: %s' % text
dabf13abb3fd Add basic drawing to level editor
Neil Muller <drnlmuller@gmail.com>
parents: 170
diff changeset
293 self.current_tool.prepare()
337
170d4a43c00e Don't edit the level when interacting with dialogs
Neil Muller <drnlmuller@gmail.com>
parents: 325
diff changeset
294 return True
174
893fb9f8f468 Hook up basic saving
Neil Muller <drnlmuller@gmail.com>
parents: 172
diff changeset
295
540
efe1b61aad08 Start of help and an exit button.
Simon Cross <hodgestar@gmail.com>
parents: 533
diff changeset
296 def show_help(self, ev, widget):
551
9d3ed4d05f55 Hack in test level mode to editor
Neil Muller <drnlmuller@gmail.com>
parents: 544
diff changeset
297 message = MessageBox((20, 20), HELP_MSG, color="black",
544
13d02d1f5ae0 Add help to editor.
Simon Cross <hodgestar@gmail.com>
parents: 540
diff changeset
298 fontsize=12)
13d02d1f5ae0 Add help to editor.
Simon Cross <hodgestar@gmail.com>
parents: 540
diff changeset
299 self.display_dialog(message)
540
efe1b61aad08 Start of help and an exit button.
Simon Cross <hodgestar@gmail.com>
parents: 533
diff changeset
300 return True
efe1b61aad08 Start of help and an exit button.
Simon Cross <hodgestar@gmail.com>
parents: 533
diff changeset
301
efe1b61aad08 Start of help and an exit button.
Simon Cross <hodgestar@gmail.com>
parents: 533
diff changeset
302 def go_mainmenu(self, ev, widget):
efe1b61aad08 Start of help and an exit button.
Simon Cross <hodgestar@gmail.com>
parents: 533
diff changeset
303 from mamba.habitats.mainmenu import MainMenu
efe1b61aad08 Start of help and an exit button.
Simon Cross <hodgestar@gmail.com>
parents: 533
diff changeset
304 NewHabitatEvent.post(MainMenu())
efe1b61aad08 Start of help and an exit button.
Simon Cross <hodgestar@gmail.com>
parents: 533
diff changeset
305 return True
efe1b61aad08 Start of help and an exit button.
Simon Cross <hodgestar@gmail.com>
parents: 533
diff changeset
306
485
e4e9e607e6f9 Factor out level checking messages for re-use in upload.
Simon Cross <hodgestar@gmail.com>
parents: 481
diff changeset
307 def check_level(self):
278
f10d06fc64b2 Add some robustness against broken levels
Neil Muller <drnlmuller@gmail.com>
parents: 277
diff changeset
308 message = None
277
82aa91664e27 Warn on save failures
Neil Muller <drnlmuller@gmail.com>
parents: 276
diff changeset
309 if not self.level.level_name:
278
f10d06fc64b2 Add some robustness against broken levels
Neil Muller <drnlmuller@gmail.com>
parents: 277
diff changeset
310 message = MessageBox((300, 300), 'Please enter a name')
277
82aa91664e27 Warn on save failures
Neil Muller <drnlmuller@gmail.com>
parents: 276
diff changeset
311 elif self.level.level_name in RESERVED_NAMES:
278
f10d06fc64b2 Add some robustness against broken levels
Neil Muller <drnlmuller@gmail.com>
parents: 277
diff changeset
312 message = MessageBox((300, 300), 'Reserved level name')
402
001c3797a63b Editor now uses templates and the user level directory.
Jeremy Thurgood <firxen@gmail.com>
parents: 396
diff changeset
313 elif '/' in self.level.level_name:
001c3797a63b Editor now uses templates and the user level directory.
Jeremy Thurgood <firxen@gmail.com>
parents: 396
diff changeset
314 message = MessageBox((300, 300), 'Illegal level name')
485
e4e9e607e6f9 Factor out level checking messages for re-use in upload.
Simon Cross <hodgestar@gmail.com>
parents: 481
diff changeset
315
e4e9e607e6f9 Factor out level checking messages for re-use in upload.
Simon Cross <hodgestar@gmail.com>
parents: 481
diff changeset
316 if message is None:
e4e9e607e6f9 Factor out level checking messages for re-use in upload.
Simon Cross <hodgestar@gmail.com>
parents: 481
diff changeset
317 try:
e4e9e607e6f9 Factor out level checking messages for re-use in upload.
Simon Cross <hodgestar@gmail.com>
parents: 481
diff changeset
318 self.level.validate_level()
e4e9e607e6f9 Factor out level checking messages for re-use in upload.
Simon Cross <hodgestar@gmail.com>
parents: 481
diff changeset
319 except InvalidMapError, error:
e4e9e607e6f9 Factor out level checking messages for re-use in upload.
Simon Cross <hodgestar@gmail.com>
parents: 481
diff changeset
320 message = MessageBox((300, 300), "Map isn't valid\n%s" % error)
e4e9e607e6f9 Factor out level checking messages for re-use in upload.
Simon Cross <hodgestar@gmail.com>
parents: 481
diff changeset
321
e4e9e607e6f9 Factor out level checking messages for re-use in upload.
Simon Cross <hodgestar@gmail.com>
parents: 481
diff changeset
322 return message
e4e9e607e6f9 Factor out level checking messages for re-use in upload.
Simon Cross <hodgestar@gmail.com>
parents: 481
diff changeset
323
e4e9e607e6f9 Factor out level checking messages for re-use in upload.
Simon Cross <hodgestar@gmail.com>
parents: 481
diff changeset
324 def save(self, ev, widget):
e4e9e607e6f9 Factor out level checking messages for re-use in upload.
Simon Cross <hodgestar@gmail.com>
parents: 481
diff changeset
325 message = self.check_level()
278
f10d06fc64b2 Add some robustness against broken levels
Neil Muller <drnlmuller@gmail.com>
parents: 277
diff changeset
326 if message:
404
38f95fbc3710 Better dialog handling.
Jeremy Thurgood <firxen@gmail.com>
parents: 402
diff changeset
327 self.display_dialog(message)
544
13d02d1f5ae0 Add help to editor.
Simon Cross <hodgestar@gmail.com>
parents: 540
diff changeset
328 return True
402
001c3797a63b Editor now uses templates and the user level directory.
Jeremy Thurgood <firxen@gmail.com>
parents: 396
diff changeset
329 self.level.save_level('user_levels', is_user_dir=True)
396
171c3d817c48 Refresh display after saving level. (A hack, but it does the job.)
Jeremy Thurgood <firxen@gmail.com>
parents: 387
diff changeset
330 self.refresh_display()
521
8a3884201d00 Save success dialog
Neil Muller <drnlmuller@gmail.com>
parents: 512
diff changeset
331 message = MessageBox((300, 300),
8a3884201d00 Save success dialog
Neil Muller <drnlmuller@gmail.com>
parents: 512
diff changeset
332 'Success!\nYou have saved a user level')
8a3884201d00 Save success dialog
Neil Muller <drnlmuller@gmail.com>
parents: 512
diff changeset
333 self.display_dialog(message)
337
170d4a43c00e Don't edit the level when interacting with dialogs
Neil Muller <drnlmuller@gmail.com>
parents: 325
diff changeset
334 return True
180
d9ee0e50a78f Teach editor about THING_MAP
Neil Muller <drnlmuller@gmail.com>
parents: 175
diff changeset
335
270
3c95ba7408f1 Add protected level name list. Add load & new buttons
Neil Muller <drnlmuller@gmail.com>
parents: 267
diff changeset
336 def new(self, ev, widget):
402
001c3797a63b Editor now uses templates and the user level directory.
Jeremy Thurgood <firxen@gmail.com>
parents: 396
diff changeset
337 return self.load(ev, widget, 'levels', subdir='templates')
270
3c95ba7408f1 Add protected level name list. Add load & new buttons
Neil Muller <drnlmuller@gmail.com>
parents: 267
diff changeset
338
481
68898de788cc Add upload button to editor.
Simon Cross <hodgestar@gmail.com>
parents: 479
diff changeset
339 def upload(self, ev, widget):
485
e4e9e607e6f9 Factor out level checking messages for re-use in upload.
Simon Cross <hodgestar@gmail.com>
parents: 481
diff changeset
340 message = self.check_level()
e4e9e607e6f9 Factor out level checking messages for re-use in upload.
Simon Cross <hodgestar@gmail.com>
parents: 481
diff changeset
341 if message:
e4e9e607e6f9 Factor out level checking messages for re-use in upload.
Simon Cross <hodgestar@gmail.com>
parents: 481
diff changeset
342 self.display_dialog(message)
490
be1e22e3f17c Finish hooking up level uploading.
Simon Cross <hodgestar@gmail.com>
parents: 489
diff changeset
343 return True
489
e522db37e5c5 Refactor level saving to allow saving to a passed in file (e.g. StringIO object).
Simon Cross <hodgestar@gmail.com>
parents: 485
diff changeset
344 save_file = StringIO()
e522db37e5c5 Refactor level saving to allow saving to a passed in file (e.g. StringIO object).
Simon Cross <hodgestar@gmail.com>
parents: 485
diff changeset
345 self.level.save_level(save_file=save_file)
490
be1e22e3f17c Finish hooking up level uploading.
Simon Cross <hodgestar@gmail.com>
parents: 489
diff changeset
346
494
72976997bdd9 Use LEVEL_SERVER from constants.
Simon Cross <hodgestar@gmail.com>
parents: 490
diff changeset
347 url = "%s/save/%s" % (LEVEL_SERVER, self.level.level_name)
490
be1e22e3f17c Finish hooking up level uploading.
Simon Cross <hodgestar@gmail.com>
parents: 489
diff changeset
348 args = urllib.urlencode([('data', save_file.getvalue())])
be1e22e3f17c Finish hooking up level uploading.
Simon Cross <hodgestar@gmail.com>
parents: 489
diff changeset
349 try:
be1e22e3f17c Finish hooking up level uploading.
Simon Cross <hodgestar@gmail.com>
parents: 489
diff changeset
350 result = urllib2.urlopen(url, args)
be1e22e3f17c Finish hooking up level uploading.
Simon Cross <hodgestar@gmail.com>
parents: 489
diff changeset
351 mtxt = result.read()
be1e22e3f17c Finish hooking up level uploading.
Simon Cross <hodgestar@gmail.com>
parents: 489
diff changeset
352 except:
be1e22e3f17c Finish hooking up level uploading.
Simon Cross <hodgestar@gmail.com>
parents: 489
diff changeset
353 mtxt = "Failed to upload level. :("
be1e22e3f17c Finish hooking up level uploading.
Simon Cross <hodgestar@gmail.com>
parents: 489
diff changeset
354 else:
533
cb9ee0ba01ce Explain curation in upload dialog box.
Simon Cross <hodgestar@gmail.com>
parents: 521
diff changeset
355 mtxt = "Success! %s\n%s" % (mtxt,
cb9ee0ba01ce Explain curation in upload dialog box.
Simon Cross <hodgestar@gmail.com>
parents: 521
diff changeset
356 "Your level is now awaiting curation.")
490
be1e22e3f17c Finish hooking up level uploading.
Simon Cross <hodgestar@gmail.com>
parents: 489
diff changeset
357
be1e22e3f17c Finish hooking up level uploading.
Simon Cross <hodgestar@gmail.com>
parents: 489
diff changeset
358 message = MessageBox((300, 300), mtxt)
be1e22e3f17c Finish hooking up level uploading.
Simon Cross <hodgestar@gmail.com>
parents: 489
diff changeset
359 self.display_dialog(message)
485
e4e9e607e6f9 Factor out level checking messages for re-use in upload.
Simon Cross <hodgestar@gmail.com>
parents: 481
diff changeset
360 return True
481
68898de788cc Add upload button to editor.
Simon Cross <hodgestar@gmail.com>
parents: 479
diff changeset
361
402
001c3797a63b Editor now uses templates and the user level directory.
Jeremy Thurgood <firxen@gmail.com>
parents: 396
diff changeset
362 def load(self, ev, widget, level_dir=None, is_user_dir=False, subdir=''):
001c3797a63b Editor now uses templates and the user level directory.
Jeremy Thurgood <firxen@gmail.com>
parents: 396
diff changeset
363 if level_dir is None:
001c3797a63b Editor now uses templates and the user level directory.
Jeremy Thurgood <firxen@gmail.com>
parents: 396
diff changeset
364 level_dir = 'user_levels'
001c3797a63b Editor now uses templates and the user level directory.
Jeremy Thurgood <firxen@gmail.com>
parents: 396
diff changeset
365 is_user_dir = True
337
170d4a43c00e Don't edit the level when interacting with dialogs
Neil Muller <drnlmuller@gmail.com>
parents: 325
diff changeset
366 self.container.paused = True
402
001c3797a63b Editor now uses templates and the user level directory.
Jeremy Thurgood <firxen@gmail.com>
parents: 396
diff changeset
367 levels = get_level_list('/'.join([level_dir, subdir]), is_user_dir)
272
a061dd62127c Hook up load and new buttons
Neil Muller <drnlmuller@gmail.com>
parents: 270
diff changeset
368 load_list = []
a061dd62127c Hook up load and new buttons
Neil Muller <drnlmuller@gmail.com>
parents: 270
diff changeset
369 for level_name in levels:
a061dd62127c Hook up load and new buttons
Neil Muller <drnlmuller@gmail.com>
parents: 270
diff changeset
370 if level_name in RESERVED_NAMES:
a061dd62127c Hook up load and new buttons
Neil Muller <drnlmuller@gmail.com>
parents: 270
diff changeset
371 continue
402
001c3797a63b Editor now uses templates and the user level directory.
Jeremy Thurgood <firxen@gmail.com>
parents: 396
diff changeset
372 if subdir:
001c3797a63b Editor now uses templates and the user level directory.
Jeremy Thurgood <firxen@gmail.com>
parents: 396
diff changeset
373 level_name = '/'.join([subdir, level_name])
272
a061dd62127c Hook up load and new buttons
Neil Muller <drnlmuller@gmail.com>
parents: 270
diff changeset
374 load_button = TextButton((0, 0), level_name)
402
001c3797a63b Editor now uses templates and the user level directory.
Jeremy Thurgood <firxen@gmail.com>
parents: 396
diff changeset
375 load_button.add_callback(
001c3797a63b Editor now uses templates and the user level directory.
Jeremy Thurgood <firxen@gmail.com>
parents: 396
diff changeset
376 'clicked', self.load_level, level_name, level_dir, is_user_dir)
272
a061dd62127c Hook up load and new buttons
Neil Muller <drnlmuller@gmail.com>
parents: 270
diff changeset
377 load_list.append(load_button)
404
38f95fbc3710 Better dialog handling.
Jeremy Thurgood <firxen@gmail.com>
parents: 402
diff changeset
378 self.display_dialog(ListBox((200, 200), 'Select Level', load_list, 6))
337
170d4a43c00e Don't edit the level when interacting with dialogs
Neil Muller <drnlmuller@gmail.com>
parents: 325
diff changeset
379 return True
272
a061dd62127c Hook up load and new buttons
Neil Muller <drnlmuller@gmail.com>
parents: 270
diff changeset
380
402
001c3797a63b Editor now uses templates and the user level directory.
Jeremy Thurgood <firxen@gmail.com>
parents: 396
diff changeset
381 def load_level(self, ev, widget, level_name, level_dir, is_user_dir):
278
f10d06fc64b2 Add some robustness against broken levels
Neil Muller <drnlmuller@gmail.com>
parents: 277
diff changeset
382 try:
402
001c3797a63b Editor now uses templates and the user level directory.
Jeremy Thurgood <firxen@gmail.com>
parents: 396
diff changeset
383 source = load_file("%s/%s.txt" % (level_dir, level_name),
001c3797a63b Editor now uses templates and the user level directory.
Jeremy Thurgood <firxen@gmail.com>
parents: 396
diff changeset
384 is_user_dir=is_user_dir)
001c3797a63b Editor now uses templates and the user level directory.
Jeremy Thurgood <firxen@gmail.com>
parents: 396
diff changeset
385 new_level = Level(level_name, 'user', source.read())
278
f10d06fc64b2 Add some robustness against broken levels
Neil Muller <drnlmuller@gmail.com>
parents: 277
diff changeset
386 except (IOError, InvalidMapError, pygame.error), error:
f10d06fc64b2 Add some robustness against broken levels
Neil Muller <drnlmuller@gmail.com>
parents: 277
diff changeset
387 message = MessageBox((300, 300),
f10d06fc64b2 Add some robustness against broken levels
Neil Muller <drnlmuller@gmail.com>
parents: 277
diff changeset
388 'Loading Level Failed: %s' % error, color='red')
404
38f95fbc3710 Better dialog handling.
Jeremy Thurgood <firxen@gmail.com>
parents: 402
diff changeset
389 self.display_dialog(message)
278
f10d06fc64b2 Add some robustness against broken levels
Neil Muller <drnlmuller@gmail.com>
parents: 277
diff changeset
390 return False
272
a061dd62127c Hook up load and new buttons
Neil Muller <drnlmuller@gmail.com>
parents: 270
diff changeset
391 self.container.remove(self.edit_widget)
278
f10d06fc64b2 Add some robustness against broken levels
Neil Muller <drnlmuller@gmail.com>
parents: 277
diff changeset
392 self.level = new_level
272
a061dd62127c Hook up load and new buttons
Neil Muller <drnlmuller@gmail.com>
parents: 270
diff changeset
393 if level_name in RESERVED_NAMES:
a061dd62127c Hook up load and new buttons
Neil Muller <drnlmuller@gmail.com>
parents: 270
diff changeset
394 self.level.level_name = '' # Special case for new level
337
170d4a43c00e Don't edit the level when interacting with dialogs
Neil Muller <drnlmuller@gmail.com>
parents: 325
diff changeset
395 self.container.paused = False
272
a061dd62127c Hook up load and new buttons
Neil Muller <drnlmuller@gmail.com>
parents: 270
diff changeset
396 self.edit_widget = EditLevelWidget(self.level)
551
9d3ed4d05f55 Hack in test level mode to editor
Neil Muller <drnlmuller@gmail.com>
parents: 544
diff changeset
397 self.edit_widget.add_callback(SnakeDiedEvent, self.halt_test)
9d3ed4d05f55 Hack in test level mode to editor
Neil Muller <drnlmuller@gmail.com>
parents: 544
diff changeset
398 self.edit_widget.add_callback(LevelCompletedEvent, self.halt_test)
272
a061dd62127c Hook up load and new buttons
Neil Muller <drnlmuller@gmail.com>
parents: 270
diff changeset
399 self.container.add(self.edit_widget)
a061dd62127c Hook up load and new buttons
Neil Muller <drnlmuller@gmail.com>
parents: 270
diff changeset
400 self.clear_toolbar()
a061dd62127c Hook up load and new buttons
Neil Muller <drnlmuller@gmail.com>
parents: 270
diff changeset
401 self.setup_toolbar()
387
f86188a0f259 Tweak load list length
Neil Muller <drnlmuller@gmail.com>
parents: 363
diff changeset
402 return True
270
3c95ba7408f1 Add protected level name list. Add load & new buttons
Neil Muller <drnlmuller@gmail.com>
parents: 267
diff changeset
403
284
96b4ad9b4d30 Start work on sprite editor. Tweak layout issues
Neil Muller <drnlmuller@gmail.com>
parents: 279
diff changeset
404 def change_toolbar(self, ev, widget, new_mode):
551
9d3ed4d05f55 Hack in test level mode to editor
Neil Muller <drnlmuller@gmail.com>
parents: 544
diff changeset
405 if new_mode == 'Test':
9d3ed4d05f55 Hack in test level mode to editor
Neil Muller <drnlmuller@gmail.com>
parents: 544
diff changeset
406 try:
9d3ed4d05f55 Hack in test level mode to editor
Neil Muller <drnlmuller@gmail.com>
parents: 544
diff changeset
407 self.level.validate_level()
9d3ed4d05f55 Hack in test level mode to editor
Neil Muller <drnlmuller@gmail.com>
parents: 544
diff changeset
408 except InvalidMapError, error:
9d3ed4d05f55 Hack in test level mode to editor
Neil Muller <drnlmuller@gmail.com>
parents: 544
diff changeset
409 # Fail to change mode on invalid maps
9d3ed4d05f55 Hack in test level mode to editor
Neil Muller <drnlmuller@gmail.com>
parents: 544
diff changeset
410 message = MessageBox((300, 300), "Map isn't valid\n%s" % error)
9d3ed4d05f55 Hack in test level mode to editor
Neil Muller <drnlmuller@gmail.com>
parents: 544
diff changeset
411 self.display_dialog(message)
9d3ed4d05f55 Hack in test level mode to editor
Neil Muller <drnlmuller@gmail.com>
parents: 544
diff changeset
412 return True
284
96b4ad9b4d30 Start work on sprite editor. Tweak layout issues
Neil Muller <drnlmuller@gmail.com>
parents: 279
diff changeset
413 self.mode = new_mode
551
9d3ed4d05f55 Hack in test level mode to editor
Neil Muller <drnlmuller@gmail.com>
parents: 544
diff changeset
414 self.edit_widget.tile_mode = (self.mode in ('Tiles', 'Sprites'))
180
d9ee0e50a78f Teach editor about THING_MAP
Neil Muller <drnlmuller@gmail.com>
parents: 175
diff changeset
415 self.clear_toolbar()
d9ee0e50a78f Teach editor about THING_MAP
Neil Muller <drnlmuller@gmail.com>
parents: 175
diff changeset
416 self.setup_toolbar()
551
9d3ed4d05f55 Hack in test level mode to editor
Neil Muller <drnlmuller@gmail.com>
parents: 544
diff changeset
417 if self.mode == 'Test':
9d3ed4d05f55 Hack in test level mode to editor
Neil Muller <drnlmuller@gmail.com>
parents: 544
diff changeset
418 self.edit_widget.start_test()
9d3ed4d05f55 Hack in test level mode to editor
Neil Muller <drnlmuller@gmail.com>
parents: 544
diff changeset
419 else:
9d3ed4d05f55 Hack in test level mode to editor
Neil Muller <drnlmuller@gmail.com>
parents: 544
diff changeset
420 self.edit_widget.stop_test()
337
170d4a43c00e Don't edit the level when interacting with dialogs
Neil Muller <drnlmuller@gmail.com>
parents: 325
diff changeset
421 return True
180
d9ee0e50a78f Teach editor about THING_MAP
Neil Muller <drnlmuller@gmail.com>
parents: 175
diff changeset
422
d9ee0e50a78f Teach editor about THING_MAP
Neil Muller <drnlmuller@gmail.com>
parents: 175
diff changeset
423 def clear_toolbar(self):
d9ee0e50a78f Teach editor about THING_MAP
Neil Muller <drnlmuller@gmail.com>
parents: 175
diff changeset
424 """Remove every non-edit widget from the container"""
d9ee0e50a78f Teach editor about THING_MAP
Neil Muller <drnlmuller@gmail.com>
parents: 175
diff changeset
425 for widget in self.container.children[:]:
d9ee0e50a78f Teach editor about THING_MAP
Neil Muller <drnlmuller@gmail.com>
parents: 175
diff changeset
426 if widget is not self.edit_widget:
d9ee0e50a78f Teach editor about THING_MAP
Neil Muller <drnlmuller@gmail.com>
parents: 175
diff changeset
427 self.container.remove(widget)
229
b0ef7eecc67a Make filename editable
Neil Muller <drnlmuller@gmail.com>
parents: 180
diff changeset
428
236
09247e08aeda Refactor edit calling code. Tweak toolbar layout
Neil Muller <drnlmuller@gmail.com>
parents: 229
diff changeset
429 def do_edit(self, ev, widget, message, init_value, callback):
404
38f95fbc3710 Better dialog handling.
Jeremy Thurgood <firxen@gmail.com>
parents: 402
diff changeset
430 self.display_dialog(
38f95fbc3710 Better dialog handling.
Jeremy Thurgood <firxen@gmail.com>
parents: 402
diff changeset
431 EntryBox((200, 200), message, init_value, callback))
337
170d4a43c00e Don't edit the level when interacting with dialogs
Neil Muller <drnlmuller@gmail.com>
parents: 325
diff changeset
432 return True
229
b0ef7eecc67a Make filename editable
Neil Muller <drnlmuller@gmail.com>
parents: 180
diff changeset
433
512
0ccdcc970ae2 Improved unpausing in the level editor.
Jeremy Thurgood <firxen@gmail.com>
parents: 508
diff changeset
434 def unpause(self):
0ccdcc970ae2 Improved unpausing in the level editor.
Jeremy Thurgood <firxen@gmail.com>
parents: 508
diff changeset
435 self.container.paused = False
0ccdcc970ae2 Improved unpausing in the level editor.
Jeremy Thurgood <firxen@gmail.com>
parents: 508
diff changeset
436
454
8cfa757dd7d3 Epic level editor reworking.
Jeremy Thurgood <firxen@gmail.com>
parents: 423
diff changeset
437 def update_level_data(self, filename, name, tileset, track):
8cfa757dd7d3 Epic level editor reworking.
Jeremy Thurgood <firxen@gmail.com>
parents: 423
diff changeset
438
8cfa757dd7d3 Epic level editor reworking.
Jeremy Thurgood <firxen@gmail.com>
parents: 423
diff changeset
439 self.level.name = name
8cfa757dd7d3 Epic level editor reworking.
Jeremy Thurgood <firxen@gmail.com>
parents: 423
diff changeset
440 self.level.background_track = track
8cfa757dd7d3 Epic level editor reworking.
Jeremy Thurgood <firxen@gmail.com>
parents: 423
diff changeset
441 # err_ts = self.change_tileset(tileset)
8cfa757dd7d3 Epic level editor reworking.
Jeremy Thurgood <firxen@gmail.com>
parents: 423
diff changeset
442 err_fn = self.check_file(filename)
8cfa757dd7d3 Epic level editor reworking.
Jeremy Thurgood <firxen@gmail.com>
parents: 423
diff changeset
443
236
09247e08aeda Refactor edit calling code. Tweak toolbar layout
Neil Muller <drnlmuller@gmail.com>
parents: 229
diff changeset
444 self.clear_toolbar()
09247e08aeda Refactor edit calling code. Tweak toolbar layout
Neil Muller <drnlmuller@gmail.com>
parents: 229
diff changeset
445 self.setup_toolbar()
09247e08aeda Refactor edit calling code. Tweak toolbar layout
Neil Muller <drnlmuller@gmail.com>
parents: 229
diff changeset
446
454
8cfa757dd7d3 Epic level editor reworking.
Jeremy Thurgood <firxen@gmail.com>
parents: 423
diff changeset
447 if err_fn:
512
0ccdcc970ae2 Improved unpausing in the level editor.
Jeremy Thurgood <firxen@gmail.com>
parents: 508
diff changeset
448 err_fn.post_callback = self.unpause
454
8cfa757dd7d3 Epic level editor reworking.
Jeremy Thurgood <firxen@gmail.com>
parents: 423
diff changeset
449 self.display_dialog(err_fn)
512
0ccdcc970ae2 Improved unpausing in the level editor.
Jeremy Thurgood <firxen@gmail.com>
parents: 508
diff changeset
450 else:
0ccdcc970ae2 Improved unpausing in the level editor.
Jeremy Thurgood <firxen@gmail.com>
parents: 508
diff changeset
451 self.container.paused = False
325
00c36ff53de9 Teach editor about background tracks
Neil Muller <drnlmuller@gmail.com>
parents: 314
diff changeset
452
279
162bddbbc5d0 Protect against bad tilesets as well
Neil Muller <drnlmuller@gmail.com>
parents: 278
diff changeset
453 def refresh_display(self):
275
51bec5e6191e Rework selecting tilesets
Neil Muller <drnlmuller@gmail.com>
parents: 272
diff changeset
454 self.level.restart()
51bec5e6191e Rework selecting tilesets
Neil Muller <drnlmuller@gmail.com>
parents: 272
diff changeset
455 self.clear_toolbar()
51bec5e6191e Rework selecting tilesets
Neil Muller <drnlmuller@gmail.com>
parents: 272
diff changeset
456 self.setup_toolbar()
51bec5e6191e Rework selecting tilesets
Neil Muller <drnlmuller@gmail.com>
parents: 272
diff changeset
457 return True
236
09247e08aeda Refactor edit calling code. Tweak toolbar layout
Neil Muller <drnlmuller@gmail.com>
parents: 229
diff changeset
458
454
8cfa757dd7d3 Epic level editor reworking.
Jeremy Thurgood <firxen@gmail.com>
parents: 423
diff changeset
459 def change_tileset(self, new_tileset):
8cfa757dd7d3 Epic level editor reworking.
Jeremy Thurgood <firxen@gmail.com>
parents: 423
diff changeset
460 print "changing tileset"
8cfa757dd7d3 Epic level editor reworking.
Jeremy Thurgood <firxen@gmail.com>
parents: 423
diff changeset
461 self.level.update_tiles_ascii()
8cfa757dd7d3 Epic level editor reworking.
Jeremy Thurgood <firxen@gmail.com>
parents: 423
diff changeset
462 old_tileset = self.level.tileset
8cfa757dd7d3 Epic level editor reworking.
Jeremy Thurgood <firxen@gmail.com>
parents: 423
diff changeset
463 try:
8cfa757dd7d3 Epic level editor reworking.
Jeremy Thurgood <firxen@gmail.com>
parents: 423
diff changeset
464 self.level.tileset = Tileset(new_tileset)
8cfa757dd7d3 Epic level editor reworking.
Jeremy Thurgood <firxen@gmail.com>
parents: 423
diff changeset
465 self.level.restart()
8cfa757dd7d3 Epic level editor reworking.
Jeremy Thurgood <firxen@gmail.com>
parents: 423
diff changeset
466 return None
8cfa757dd7d3 Epic level editor reworking.
Jeremy Thurgood <firxen@gmail.com>
parents: 423
diff changeset
467 except pygame.error, error:
8cfa757dd7d3 Epic level editor reworking.
Jeremy Thurgood <firxen@gmail.com>
parents: 423
diff changeset
468 self.level.tileset = old_tileset
8cfa757dd7d3 Epic level editor reworking.
Jeremy Thurgood <firxen@gmail.com>
parents: 423
diff changeset
469 return MessageBox(
8cfa757dd7d3 Epic level editor reworking.
Jeremy Thurgood <firxen@gmail.com>
parents: 423
diff changeset
470 (300, 300), 'Unable to change tileset:: %s' % error,
8cfa757dd7d3 Epic level editor reworking.
Jeremy Thurgood <firxen@gmail.com>
parents: 423
diff changeset
471 color='red')
8cfa757dd7d3 Epic level editor reworking.
Jeremy Thurgood <firxen@gmail.com>
parents: 423
diff changeset
472
229
b0ef7eecc67a Make filename editable
Neil Muller <drnlmuller@gmail.com>
parents: 180
diff changeset
473 def check_file(self, new_name):
278
f10d06fc64b2 Add some robustness against broken levels
Neil Muller <drnlmuller@gmail.com>
parents: 277
diff changeset
474 message = None
229
b0ef7eecc67a Make filename editable
Neil Muller <drnlmuller@gmail.com>
parents: 180
diff changeset
475 if new_name == self.level.level_name:
454
8cfa757dd7d3 Epic level editor reworking.
Jeremy Thurgood <firxen@gmail.com>
parents: 423
diff changeset
476 return None # No-op change
276
9c57025781e7 Warn on enter filename results
Neil Muller <drnlmuller@gmail.com>
parents: 275
diff changeset
477 if not new_name:
278
f10d06fc64b2 Add some robustness against broken levels
Neil Muller <drnlmuller@gmail.com>
parents: 277
diff changeset
478 message = MessageBox((300, 300), 'Please enter a name')
277
82aa91664e27 Warn on save failures
Neil Muller <drnlmuller@gmail.com>
parents: 276
diff changeset
479 if new_name in RESERVED_NAMES:
82aa91664e27 Warn on save failures
Neil Muller <drnlmuller@gmail.com>
parents: 276
diff changeset
480 # This case is caught by the existance check, but the
82aa91664e27 Warn on save failures
Neil Muller <drnlmuller@gmail.com>
parents: 276
diff changeset
481 # importance of the reserved names means we use a different
82aa91664e27 Warn on save failures
Neil Muller <drnlmuller@gmail.com>
parents: 276
diff changeset
482 # message
278
f10d06fc64b2 Add some robustness against broken levels
Neil Muller <drnlmuller@gmail.com>
parents: 277
diff changeset
483 message = MessageBox((300, 300), 'Reserved level name')
402
001c3797a63b Editor now uses templates and the user level directory.
Jeremy Thurgood <firxen@gmail.com>
parents: 396
diff changeset
484 elif check_level_exists(new_name, 'user_levels', is_user_dir=True):
278
f10d06fc64b2 Add some robustness against broken levels
Neil Muller <drnlmuller@gmail.com>
parents: 277
diff changeset
485 message = MessageBox((300, 300), 'Name already in use')
f10d06fc64b2 Add some robustness against broken levels
Neil Muller <drnlmuller@gmail.com>
parents: 277
diff changeset
486 if message:
454
8cfa757dd7d3 Epic level editor reworking.
Jeremy Thurgood <firxen@gmail.com>
parents: 423
diff changeset
487 return message
229
b0ef7eecc67a Make filename editable
Neil Muller <drnlmuller@gmail.com>
parents: 180
diff changeset
488 self.level.level_name = new_name
454
8cfa757dd7d3 Epic level editor reworking.
Jeremy Thurgood <firxen@gmail.com>
parents: 423
diff changeset
489 return None
284
96b4ad9b4d30 Start work on sprite editor. Tweak layout issues
Neil Muller <drnlmuller@gmail.com>
parents: 279
diff changeset
490
508
6c61d5862310 Massive speical sprite editor rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 494
diff changeset
491 def sprite_tool(self, ev, widget, sprite_mode, cls_name, sprite_cls):
284
96b4ad9b4d30 Start work on sprite editor. Tweak layout issues
Neil Muller <drnlmuller@gmail.com>
parents: 279
diff changeset
492 """Handle sprite stuff"""
96b4ad9b4d30 Start work on sprite editor. Tweak layout issues
Neil Muller <drnlmuller@gmail.com>
parents: 279
diff changeset
493 self.sprite_mode = sprite_mode
508
6c61d5862310 Massive speical sprite editor rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 494
diff changeset
494 self.sprite_cls_name = cls_name
6c61d5862310 Massive speical sprite editor rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 494
diff changeset
495 self.sprite_cls = sprite_cls
343
5bf35267ddc0 Hook up sprite deletion. Framework work for sprite editing & adding
Neil Muller <drnlmuller@gmail.com>
parents: 337
diff changeset
496 self.level.update_tiles_ascii() # commit any changes
284
96b4ad9b4d30 Start work on sprite editor. Tweak layout issues
Neil Muller <drnlmuller@gmail.com>
parents: 279
diff changeset
497 self.clear_toolbar()
96b4ad9b4d30 Start work on sprite editor. Tweak layout issues
Neil Muller <drnlmuller@gmail.com>
parents: 279
diff changeset
498 self.setup_toolbar()
337
170d4a43c00e Don't edit the level when interacting with dialogs
Neil Muller <drnlmuller@gmail.com>
parents: 325
diff changeset
499 return True
343
5bf35267ddc0 Hook up sprite deletion. Framework work for sprite editing & adding
Neil Muller <drnlmuller@gmail.com>
parents: 337
diff changeset
500
5bf35267ddc0 Hook up sprite deletion. Framework work for sprite editing & adding
Neil Muller <drnlmuller@gmail.com>
parents: 337
diff changeset
501 def mouse_event(self, ev, widget):
5bf35267ddc0 Hook up sprite deletion. Framework work for sprite editing & adding
Neil Muller <drnlmuller@gmail.com>
parents: 337
diff changeset
502 """Handle mouse clicks when we are in sprite mode"""
5bf35267ddc0 Hook up sprite deletion. Framework work for sprite editing & adding
Neil Muller <drnlmuller@gmail.com>
parents: 337
diff changeset
503 if self.mode != 'Sprites':
5bf35267ddc0 Hook up sprite deletion. Framework work for sprite editing & adding
Neil Muller <drnlmuller@gmail.com>
parents: 337
diff changeset
504 return False
5bf35267ddc0 Hook up sprite deletion. Framework work for sprite editing & adding
Neil Muller <drnlmuller@gmail.com>
parents: 337
diff changeset
505 if self.container.paused:
5bf35267ddc0 Hook up sprite deletion. Framework work for sprite editing & adding
Neil Muller <drnlmuller@gmail.com>
parents: 337
diff changeset
506 return False
5bf35267ddc0 Hook up sprite deletion. Framework work for sprite editing & adding
Neil Muller <drnlmuller@gmail.com>
parents: 337
diff changeset
507 tile_pos = self.edit_widget.convert_pos(ev.pos)
508
6c61d5862310 Massive speical sprite editor rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 494
diff changeset
508 sprite, sprite_ascii = self.level.get_sprite_at(tile_pos)
343
5bf35267ddc0 Hook up sprite deletion. Framework work for sprite editing & adding
Neil Muller <drnlmuller@gmail.com>
parents: 337
diff changeset
509 if self.sprite_mode == 'Delete' and sprite:
508
6c61d5862310 Massive speical sprite editor rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 494
diff changeset
510 self.level.remove_sprite(sprite_ascii)
353
62a2a659c69b Call sprite editor dialog
Neil Muller <drnlmuller@gmail.com>
parents: 343
diff changeset
511 self.level.restart()
343
5bf35267ddc0 Hook up sprite deletion. Framework work for sprite editing & adding
Neil Muller <drnlmuller@gmail.com>
parents: 337
diff changeset
512 elif self.sprite_mode == 'Edit' and sprite:
5bf35267ddc0 Hook up sprite deletion. Framework work for sprite editing & adding
Neil Muller <drnlmuller@gmail.com>
parents: 337
diff changeset
513 self.edit_sprite(tile_pos, sprite)
5bf35267ddc0 Hook up sprite deletion. Framework work for sprite editing & adding
Neil Muller <drnlmuller@gmail.com>
parents: 337
diff changeset
514 elif self.sprite_mode == 'Add' and sprite is None:
508
6c61d5862310 Massive speical sprite editor rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 494
diff changeset
515 self.edit_sprite(tile_pos,
6c61d5862310 Massive speical sprite editor rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 494
diff changeset
516 (self.sprite_cls_name, self.sprite_cls, None, []))
343
5bf35267ddc0 Hook up sprite deletion. Framework work for sprite editing & adding
Neil Muller <drnlmuller@gmail.com>
parents: 337
diff changeset
517 return True
5bf35267ddc0 Hook up sprite deletion. Framework work for sprite editing & adding
Neil Muller <drnlmuller@gmail.com>
parents: 337
diff changeset
518
508
6c61d5862310 Massive speical sprite editor rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 494
diff changeset
519 def edit_sprite(self, tile_pos, sprite_info):
6c61d5862310 Massive speical sprite editor rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 494
diff changeset
520 sprite_editor = EditSpriteBox((200, 100), tile_pos, sprite_info,
353
62a2a659c69b Call sprite editor dialog
Neil Muller <drnlmuller@gmail.com>
parents: 343
diff changeset
521 post_callback=self.commit_line)
404
38f95fbc3710 Better dialog handling.
Jeremy Thurgood <firxen@gmail.com>
parents: 402
diff changeset
522 self.display_dialog(sprite_editor)
353
62a2a659c69b Call sprite editor dialog
Neil Muller <drnlmuller@gmail.com>
parents: 343
diff changeset
523
454
8cfa757dd7d3 Epic level editor reworking.
Jeremy Thurgood <firxen@gmail.com>
parents: 423
diff changeset
524 def edit_level_data(self, ev, widget):
8cfa757dd7d3 Epic level editor reworking.
Jeremy Thurgood <firxen@gmail.com>
parents: 423
diff changeset
525 elb = EditLevelBox((200, 100), self.level, self.update_level_data)
8cfa757dd7d3 Epic level editor reworking.
Jeremy Thurgood <firxen@gmail.com>
parents: 423
diff changeset
526 self.display_dialog(elb)
8cfa757dd7d3 Epic level editor reworking.
Jeremy Thurgood <firxen@gmail.com>
parents: 423
diff changeset
527
353
62a2a659c69b Call sprite editor dialog
Neil Muller <drnlmuller@gmail.com>
parents: 343
diff changeset
528 def commit_line(self, sprite):
62a2a659c69b Call sprite editor dialog
Neil Muller <drnlmuller@gmail.com>
parents: 343
diff changeset
529 try:
62a2a659c69b Call sprite editor dialog
Neil Muller <drnlmuller@gmail.com>
parents: 343
diff changeset
530 self.level.validate_sprite(sprite)
62a2a659c69b Call sprite editor dialog
Neil Muller <drnlmuller@gmail.com>
parents: 343
diff changeset
531 except:
62a2a659c69b Call sprite editor dialog
Neil Muller <drnlmuller@gmail.com>
parents: 343
diff changeset
532 # We don't know what errors thwe constructor may show, so
62a2a659c69b Call sprite editor dialog
Neil Muller <drnlmuller@gmail.com>
parents: 343
diff changeset
533 # we catch everything
62a2a659c69b Call sprite editor dialog
Neil Muller <drnlmuller@gmail.com>
parents: 343
diff changeset
534 # We use sys.exc_info to get slight neater info
62a2a659c69b Call sprite editor dialog
Neil Muller <drnlmuller@gmail.com>
parents: 343
diff changeset
535 exc_type, info, _ = sys.exc_info()
62a2a659c69b Call sprite editor dialog
Neil Muller <drnlmuller@gmail.com>
parents: 343
diff changeset
536 info = traceback.format_exception_only(exc_type, info)[0]
62a2a659c69b Call sprite editor dialog
Neil Muller <drnlmuller@gmail.com>
parents: 343
diff changeset
537 message = MessageBox((300, 300),
62a2a659c69b Call sprite editor dialog
Neil Muller <drnlmuller@gmail.com>
parents: 343
diff changeset
538 'Validation failed:\n%s' % info)
404
38f95fbc3710 Better dialog handling.
Jeremy Thurgood <firxen@gmail.com>
parents: 402
diff changeset
539 self.display_dialog(message)
353
62a2a659c69b Call sprite editor dialog
Neil Muller <drnlmuller@gmail.com>
parents: 343
diff changeset
540 return False
62a2a659c69b Call sprite editor dialog
Neil Muller <drnlmuller@gmail.com>
parents: 343
diff changeset
541 # Validation successful, so add to level
62a2a659c69b Call sprite editor dialog
Neil Muller <drnlmuller@gmail.com>
parents: 343
diff changeset
542 if self.sprite_mode == 'Add':
62a2a659c69b Call sprite editor dialog
Neil Muller <drnlmuller@gmail.com>
parents: 343
diff changeset
543 self.level.add_sprite(sprite)
62a2a659c69b Call sprite editor dialog
Neil Muller <drnlmuller@gmail.com>
parents: 343
diff changeset
544 elif self.sprite_mode == 'Edit':
62a2a659c69b Call sprite editor dialog
Neil Muller <drnlmuller@gmail.com>
parents: 343
diff changeset
545 self.level.replace_sprite(sprite)
62a2a659c69b Call sprite editor dialog
Neil Muller <drnlmuller@gmail.com>
parents: 343
diff changeset
546 self.level.restart()
62a2a659c69b Call sprite editor dialog
Neil Muller <drnlmuller@gmail.com>
parents: 343
diff changeset
547 return True