annotate mamba/habitats/editor.py @ 601:915de6c7d342 default tip

Add support for making the editor fullscreen too.
author Simon Cross <hodgestar@gmail.com>
date Sat, 14 Jan 2023 19:34:26 +0100
parents 0a2cc2ee16c2
children
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
590
2d3dee657638 Game runs, although weirdly
Neil Muller <drnlmuller@gmail.com>
parents: 589
diff changeset
8 from io import StringIO
2d3dee657638 Game runs, although weirdly
Neil Muller <drnlmuller@gmail.com>
parents: 589
diff changeset
9 from urllib import request, parse
52
d09f63429b80 Add screen size fiddling to editor habitat
Neil Muller <drnlmuller@gmail.com>
parents: 42
diff changeset
10
551
9d3ed4d05f55 Hack in test level mode to editor
Neil Muller <drnlmuller@gmail.com>
parents: 544
diff changeset
11 from mamba.engine import (Habitat, NewHabitatEvent, SnakeDiedEvent,
9d3ed4d05f55 Hack in test level mode to editor
Neil Muller <drnlmuller@gmail.com>
parents: 544
diff changeset
12 LevelCompletedEvent)
508
6c61d5862310 Massive speical sprite editor rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 494
diff changeset
13 from mamba.sprites import find_special_sprites
572
84616c7db2e7 ensure save dir exists before trying to save
Neil Muller <drnlmuller@gmail.com>
parents: 571
diff changeset
14 from mamba.gamestate import ensure_save_path_exists
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
601
915de6c7d342 Add support for making the editor fullscreen too.
Simon Cross <hodgestar@gmail.com>
parents: 598
diff changeset
25 from mamba.options import options
475
4986c22fe5fd Re-set window icon when the editor re-creates windows.
Simon Cross <hodgestar@gmail.com>
parents: 454
diff changeset
26 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
27 load_image, load_tile_image)
601
915de6c7d342 Add support for making the editor fullscreen too.
Simon Cross <hodgestar@gmail.com>
parents: 598
diff changeset
28 from mamba.constants import (
915de6c7d342 Add support for making the editor fullscreen too.
Simon Cross <hodgestar@gmail.com>
parents: 598
diff changeset
29 SCREEN, EDIT_SCREEN, NAME, DISPLAY_FLAGS, FULLSCREEN_FLAGS,
915de6c7d342 Add support for making the editor fullscreen too.
Simon Cross <hodgestar@gmail.com>
parents: 598
diff changeset
30 ESCAPE_KEYS, RESERVED_NAMES, WINDOW_ICON, LEVEL_SERVER,
915de6c7d342 Add support for making the editor fullscreen too.
Simon Cross <hodgestar@gmail.com>
parents: 598
diff changeset
31 UP, DOWN, LEFT, RIGHT,
915de6c7d342 Add support for making the editor fullscreen too.
Simon Cross <hodgestar@gmail.com>
parents: 598
diff changeset
32 )
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
33
270
3c95ba7408f1 Add protected level name list. Add load & new buttons
Neil Muller <drnlmuller@gmail.com>
parents: 267
diff changeset
34 MAX_TOOLS = 6
481
68898de788cc Add upload button to editor.
Simon Cross <hodgestar@gmail.com>
parents: 479
diff changeset
35 MODE_HEIGHT = 370
68898de788cc Add upload button to editor.
Simon Cross <hodgestar@gmail.com>
parents: 479
diff changeset
36 LOAD_SAVE_HEIGHT = 500
557
fda360905a1e Move help text out into a seperate file
Neil Muller <drnlmuller@gmail.com>
parents: 555
diff changeset
37 HELP = 'editor_help.txt'
544
13d02d1f5ae0 Add help to editor.
Simon Cross <hodgestar@gmail.com>
parents: 540
diff changeset
38
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
39
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
40 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
41 def __init__(self, level):
94
aba653f8383e Start adding editor toolbar
Neil Muller <drnlmuller@gmail.com>
parents: 64
diff changeset
42 super(EditorHabitat, self).__init__(EDIT_SCREEN)
479
3f37e011c3b6 Neater buttons
Neil Muller <drnlmuller@gmail.com>
parents: 475
diff changeset
43 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
44 self.level = level
337
170d4a43c00e Don't edit the level when interacting with dialogs
Neil Muller <drnlmuller@gmail.com>
parents: 325
diff changeset
45 self.container.paused = False
172
dabf13abb3fd Add basic drawing to level editor
Neil Muller <drnlmuller@gmail.com>
parents: 170
diff changeset
46 self.edit_widget = EditLevelWidget(self.level)
dabf13abb3fd Add basic drawing to level editor
Neil Muller <drnlmuller@gmail.com>
parents: 170
diff changeset
47 self.container.add(self.edit_widget)
64
fbb5cc655b47 More screen size fiddling hackery
Neil Muller <drnlmuller@gmail.com>
parents: 52
diff changeset
48 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
49 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
50 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
51 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
52 self.mode = 'Tiles'
96b4ad9b4d30 Start work on sprite editor. Tweak layout issues
Neil Muller <drnlmuller@gmail.com>
parents: 279
diff changeset
53 self.sprite_mode = 'Add'
508
6c61d5862310 Massive speical sprite editor rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 494
diff changeset
54 self.sprite_cls = None
551
9d3ed4d05f55 Hack in test level mode to editor
Neil Muller <drnlmuller@gmail.com>
parents: 544
diff changeset
55 # Map for test mode lookups
555
c014f5023cd2 Test run replays
Neil Muller <drnlmuller@gmail.com>
parents: 553
diff changeset
56 self.replays = {}
551
9d3ed4d05f55 Hack in test level mode to editor
Neil Muller <drnlmuller@gmail.com>
parents: 544
diff changeset
57 self.action_map = {
9d3ed4d05f55 Hack in test level mode to editor
Neil Muller <drnlmuller@gmail.com>
parents: 544
diff changeset
58 K_UP: UP,
9d3ed4d05f55 Hack in test level mode to editor
Neil Muller <drnlmuller@gmail.com>
parents: 544
diff changeset
59 K_DOWN: DOWN,
9d3ed4d05f55 Hack in test level mode to editor
Neil Muller <drnlmuller@gmail.com>
parents: 544
diff changeset
60 K_LEFT: LEFT,
9d3ed4d05f55 Hack in test level mode to editor
Neil Muller <drnlmuller@gmail.com>
parents: 544
diff changeset
61 K_RIGHT: RIGHT,
9d3ed4d05f55 Hack in test level mode to editor
Neil Muller <drnlmuller@gmail.com>
parents: 544
diff changeset
62 K_SPACE: None,
9d3ed4d05f55 Hack in test level mode to editor
Neil Muller <drnlmuller@gmail.com>
parents: 544
diff changeset
63 }
598
0a2cc2ee16c2 Fix loading of help file. It needs to be loaded as a string since we join lines using a string.
Simon Cross <hodgestar@gmail.com>
parents: 597
diff changeset
64 helpfile = load_file(HELP, mode="r")
557
fda360905a1e Move help text out into a seperate file
Neil Muller <drnlmuller@gmail.com>
parents: 555
diff changeset
65 self.help_msg = ''.join(helpfile.readlines())
601
915de6c7d342 Add support for making the editor fullscreen too.
Simon Cross <hodgestar@gmail.com>
parents: 598
diff changeset
66 self._display_flags = DISPLAY_FLAGS
915de6c7d342 Add support for making the editor fullscreen too.
Simon Cross <hodgestar@gmail.com>
parents: 598
diff changeset
67 if options.fullscreen:
915de6c7d342 Add support for making the editor fullscreen too.
Simon Cross <hodgestar@gmail.com>
parents: 598
diff changeset
68 self._display_flags |= FULLSCREEN_FLAGS
52
d09f63429b80 Add screen size fiddling to editor habitat
Neil Muller <drnlmuller@gmail.com>
parents: 42
diff changeset
69
d09f63429b80 Add screen size fiddling to editor habitat
Neil Muller <drnlmuller@gmail.com>
parents: 42
diff changeset
70 def on_enter(self):
d09f63429b80 Add screen size fiddling to editor habitat
Neil Muller <drnlmuller@gmail.com>
parents: 42
diff changeset
71 # 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
72 # This is a horrible hack
d09f63429b80 Add screen size fiddling to editor habitat
Neil Muller <drnlmuller@gmail.com>
parents: 42
diff changeset
73 pygame.display.quit()
d09f63429b80 Add screen size fiddling to editor habitat
Neil Muller <drnlmuller@gmail.com>
parents: 42
diff changeset
74 pygame.display.init()
601
915de6c7d342 Add support for making the editor fullscreen too.
Simon Cross <hodgestar@gmail.com>
parents: 598
diff changeset
75 pygame.display.set_mode(EDIT_SCREEN, self._display_flags)
475
4986c22fe5fd Re-set window icon when the editor re-creates windows.
Simon Cross <hodgestar@gmail.com>
parents: 454
diff changeset
76 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
77 pygame.display.set_caption('%s Level editor' % NAME)
64
fbb5cc655b47 More screen size fiddling hackery
Neil Muller <drnlmuller@gmail.com>
parents: 52
diff changeset
78 super(EditorHabitat, self).on_enter()
94
aba653f8383e Start adding editor toolbar
Neil Muller <drnlmuller@gmail.com>
parents: 64
diff changeset
79 self.setup_toolbar()
52
d09f63429b80 Add screen size fiddling to editor habitat
Neil Muller <drnlmuller@gmail.com>
parents: 42
diff changeset
80
d09f63429b80 Add screen size fiddling to editor habitat
Neil Muller <drnlmuller@gmail.com>
parents: 42
diff changeset
81 def on_exit(self):
d09f63429b80 Add screen size fiddling to editor habitat
Neil Muller <drnlmuller@gmail.com>
parents: 42
diff changeset
82 # 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
83 # This is a horrible hack
64
fbb5cc655b47 More screen size fiddling hackery
Neil Muller <drnlmuller@gmail.com>
parents: 52
diff changeset
84 super(EditorHabitat, self).on_exit()
52
d09f63429b80 Add screen size fiddling to editor habitat
Neil Muller <drnlmuller@gmail.com>
parents: 42
diff changeset
85 pygame.display.quit()
d09f63429b80 Add screen size fiddling to editor habitat
Neil Muller <drnlmuller@gmail.com>
parents: 42
diff changeset
86 pygame.display.init()
601
915de6c7d342 Add support for making the editor fullscreen too.
Simon Cross <hodgestar@gmail.com>
parents: 598
diff changeset
87 pygame.display.set_mode(SCREEN, self._display_flags)
475
4986c22fe5fd Re-set window icon when the editor re-creates windows.
Simon Cross <hodgestar@gmail.com>
parents: 454
diff changeset
88 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
89 pygame.display.set_caption(NAME)
64
fbb5cc655b47 More screen size fiddling hackery
Neil Muller <drnlmuller@gmail.com>
parents: 52
diff changeset
90
fbb5cc655b47 More screen size fiddling hackery
Neil Muller <drnlmuller@gmail.com>
parents: 52
diff changeset
91 def keydown_event(self, ev, widget):
fbb5cc655b47 More screen size fiddling hackery
Neil Muller <drnlmuller@gmail.com>
parents: 52
diff changeset
92 if ev.key in ESCAPE_KEYS:
fbb5cc655b47 More screen size fiddling hackery
Neil Muller <drnlmuller@gmail.com>
parents: 52
diff changeset
93 from mamba.habitats.mainmenu import MainMenu
fbb5cc655b47 More screen size fiddling hackery
Neil Muller <drnlmuller@gmail.com>
parents: 52
diff changeset
94 NewHabitatEvent.post(MainMenu())
337
170d4a43c00e Don't edit the level when interacting with dialogs
Neil Muller <drnlmuller@gmail.com>
parents: 325
diff changeset
95 return True
267
1e8dca95c48a Hook up hot-keys in editor for jerith
Neil Muller <drnlmuller@gmail.com>
parents: 265
diff changeset
96 elif ev.key == K_1:
1e8dca95c48a Hook up hot-keys in editor for jerith
Neil Muller <drnlmuller@gmail.com>
parents: 265
diff changeset
97 # Activate floor button
1e8dca95c48a Hook up hot-keys in editor for jerith
Neil Muller <drnlmuller@gmail.com>
parents: 265
diff changeset
98 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
99 return True
551
9d3ed4d05f55 Hack in test level mode to editor
Neil Muller <drnlmuller@gmail.com>
parents: 544
diff changeset
100 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
101 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
102 return True
9d3ed4d05f55 Hack in test level mode to editor
Neil Muller <drnlmuller@gmail.com>
parents: 544
diff changeset
103
9d3ed4d05f55 Hack in test level mode to editor
Neil Muller <drnlmuller@gmail.com>
parents: 544
diff changeset
104 def halt_test(self, ev, widget):
9d3ed4d05f55 Hack in test level mode to editor
Neil Muller <drnlmuller@gmail.com>
parents: 544
diff changeset
105 if SnakeDiedEvent.matches(ev):
9d3ed4d05f55 Hack in test level mode to editor
Neil Muller <drnlmuller@gmail.com>
parents: 544
diff changeset
106 text = 'Snake died: %s' % ev.reason
9d3ed4d05f55 Hack in test level mode to editor
Neil Muller <drnlmuller@gmail.com>
parents: 544
diff changeset
107 else:
9d3ed4d05f55 Hack in test level mode to editor
Neil Muller <drnlmuller@gmail.com>
parents: 544
diff changeset
108 text = 'Level completed'
9d3ed4d05f55 Hack in test level mode to editor
Neil Muller <drnlmuller@gmail.com>
parents: 544
diff changeset
109 if self.edit_widget.snake_alive:
9d3ed4d05f55 Hack in test level mode to editor
Neil Muller <drnlmuller@gmail.com>
parents: 544
diff changeset
110 self.edit_widget.kill_snake()
9d3ed4d05f55 Hack in test level mode to editor
Neil Muller <drnlmuller@gmail.com>
parents: 544
diff changeset
111 message = MessageBox((300, 200), text,
9d3ed4d05f55 Hack in test level mode to editor
Neil Muller <drnlmuller@gmail.com>
parents: 544
diff changeset
112 post_callback=self.test_restart)
9d3ed4d05f55 Hack in test level mode to editor
Neil Muller <drnlmuller@gmail.com>
parents: 544
diff changeset
113 self.display_dialog(message)
9d3ed4d05f55 Hack in test level mode to editor
Neil Muller <drnlmuller@gmail.com>
parents: 544
diff changeset
114 return True
9d3ed4d05f55 Hack in test level mode to editor
Neil Muller <drnlmuller@gmail.com>
parents: 544
diff changeset
115
9d3ed4d05f55 Hack in test level mode to editor
Neil Muller <drnlmuller@gmail.com>
parents: 544
diff changeset
116 def test_restart(self):
9d3ed4d05f55 Hack in test level mode to editor
Neil Muller <drnlmuller@gmail.com>
parents: 544
diff changeset
117 self.unpause()
9d3ed4d05f55 Hack in test level mode to editor
Neil Muller <drnlmuller@gmail.com>
parents: 544
diff changeset
118 self.edit_widget.restart()
9d3ed4d05f55 Hack in test level mode to editor
Neil Muller <drnlmuller@gmail.com>
parents: 544
diff changeset
119 return True
94
aba653f8383e Start adding editor toolbar
Neil Muller <drnlmuller@gmail.com>
parents: 64
diff changeset
120
aba653f8383e Start adding editor toolbar
Neil Muller <drnlmuller@gmail.com>
parents: 64
diff changeset
121 def setup_toolbar(self):
aba653f8383e Start adding editor toolbar
Neil Muller <drnlmuller@gmail.com>
parents: 64
diff changeset
122 """Draw the editor toolbar"""
236
09247e08aeda Refactor edit calling code. Tweak toolbar layout
Neil Muller <drnlmuller@gmail.com>
parents: 229
diff changeset
123 button_height = 5
94
aba653f8383e Start adding editor toolbar
Neil Muller <drnlmuller@gmail.com>
parents: 64
diff changeset
124 button_left = 820
236
09247e08aeda Refactor edit calling code. Tweak toolbar layout
Neil Muller <drnlmuller@gmail.com>
parents: 229
diff changeset
125 button_padding = 2
180
d9ee0e50a78f Teach editor about THING_MAP
Neil Muller <drnlmuller@gmail.com>
parents: 175
diff changeset
126
454
8cfa757dd7d3 Epic level editor reworking.
Jeremy Thurgood <firxen@gmail.com>
parents: 423
diff changeset
127 level_name = TextWidget((button_left, button_height),
8cfa757dd7d3 Epic level editor reworking.
Jeremy Thurgood <firxen@gmail.com>
parents: 423
diff changeset
128 'Level: %s' % self.level.level_name)
8cfa757dd7d3 Epic level editor reworking.
Jeremy Thurgood <firxen@gmail.com>
parents: 423
diff changeset
129 self.container.add(level_name)
8cfa757dd7d3 Epic level editor reworking.
Jeremy Thurgood <firxen@gmail.com>
parents: 423
diff changeset
130 button_height += level_name.rect.height + button_padding
8cfa757dd7d3 Epic level editor reworking.
Jeremy Thurgood <firxen@gmail.com>
parents: 423
diff changeset
131
8cfa757dd7d3 Epic level editor reworking.
Jeremy Thurgood <firxen@gmail.com>
parents: 423
diff changeset
132 edit_level = TextButton((button_left, button_height),
8cfa757dd7d3 Epic level editor reworking.
Jeremy Thurgood <firxen@gmail.com>
parents: 423
diff changeset
133 'Edit Level Metadata')
8cfa757dd7d3 Epic level editor reworking.
Jeremy Thurgood <firxen@gmail.com>
parents: 423
diff changeset
134 edit_level.add_callback('clicked', self.edit_level_data)
8cfa757dd7d3 Epic level editor reworking.
Jeremy Thurgood <firxen@gmail.com>
parents: 423
diff changeset
135 self.container.add(edit_level)
8cfa757dd7d3 Epic level editor reworking.
Jeremy Thurgood <firxen@gmail.com>
parents: 423
diff changeset
136 button_height += edit_level.rect.height + button_padding
94
aba653f8383e Start adding editor toolbar
Neil Muller <drnlmuller@gmail.com>
parents: 64
diff changeset
137
172
dabf13abb3fd Add basic drawing to level editor
Neil Muller <drnlmuller@gmail.com>
parents: 170
diff changeset
138 # 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
139 if self.mode != 'Sprites':
96b4ad9b4d30 Start work on sprite editor. Tweak layout issues
Neil Muller <drnlmuller@gmail.com>
parents: 279
diff changeset
140 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
141 'Tool: Floor', color='white')
96b4ad9b4d30 Start work on sprite editor. Tweak layout issues
Neil Muller <drnlmuller@gmail.com>
parents: 279
diff changeset
142 else:
96b4ad9b4d30 Start work on sprite editor. Tweak layout issues
Neil Muller <drnlmuller@gmail.com>
parents: 279
diff changeset
143 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
144 '%s Sprite' % self.sprite_mode, color='white')
172
dabf13abb3fd Add basic drawing to level editor
Neil Muller <drnlmuller@gmail.com>
parents: 170
diff changeset
145 self.container.add(self.current_tool)
dabf13abb3fd Add basic drawing to level editor
Neil Muller <drnlmuller@gmail.com>
parents: 170
diff changeset
146 button_height += self.current_tool.surface.get_height()
dabf13abb3fd Add basic drawing to level editor
Neil Muller <drnlmuller@gmail.com>
parents: 170
diff changeset
147 button_height += button_padding
284
96b4ad9b4d30 Start work on sprite editor. Tweak layout issues
Neil Muller <drnlmuller@gmail.com>
parents: 279
diff changeset
148 if self.mode != 'Sprites':
96b4ad9b4d30 Start work on sprite editor. Tweak layout issues
Neil Muller <drnlmuller@gmail.com>
parents: 279
diff changeset
149 self.floor_button = ImageButtonWidget(
96b4ad9b4d30 Start work on sprite editor. Tweak layout issues
Neil Muller <drnlmuller@gmail.com>
parents: 279
diff changeset
150 (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
151 'Floor', color='white')
96b4ad9b4d30 Start work on sprite editor. Tweak layout issues
Neil Muller <drnlmuller@gmail.com>
parents: 279
diff changeset
152 self.container.add(self.floor_button)
96b4ad9b4d30 Start work on sprite editor. Tweak layout issues
Neil Muller <drnlmuller@gmail.com>
parents: 279
diff changeset
153 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
154 '.', 'Floor')
96b4ad9b4d30 Start work on sprite editor. Tweak layout issues
Neil Muller <drnlmuller@gmail.com>
parents: 279
diff changeset
155 self.edit_widget.set_tool('.')
96b4ad9b4d30 Start work on sprite editor. Tweak layout issues
Neil Muller <drnlmuller@gmail.com>
parents: 279
diff changeset
156 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
157 + button_padding)
479
3f37e011c3b6 Neater buttons
Neil Muller <drnlmuller@gmail.com>
parents: 475
diff changeset
158 if self.mode in self.toolbar:
3f37e011c3b6 Neater buttons
Neil Muller <drnlmuller@gmail.com>
parents: 475
diff changeset
159 # FIXME: This needs to be recreated on tileset changes
3f37e011c3b6 Neater buttons
Neil Muller <drnlmuller@gmail.com>
parents: 475
diff changeset
160 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
161 else:
479
3f37e011c3b6 Neater buttons
Neil Muller <drnlmuller@gmail.com>
parents: 475
diff changeset
162 if self.mode == 'Tiles':
3f37e011c3b6 Neater buttons
Neil Muller <drnlmuller@gmail.com>
parents: 475
diff changeset
163 tile_map = TILE_MAP
3f37e011c3b6 Neater buttons
Neil Muller <drnlmuller@gmail.com>
parents: 475
diff changeset
164 elif self.mode == 'Things':
3f37e011c3b6 Neater buttons
Neil Muller <drnlmuller@gmail.com>
parents: 475
diff changeset
165 tile_map = THING_MAP
170
77f1dae64019 Use name in editor
Neil Muller <drnlmuller@gmail.com>
parents: 120
diff changeset
166 else:
479
3f37e011c3b6 Neater buttons
Neil Muller <drnlmuller@gmail.com>
parents: 475
diff changeset
167 tile_map = []
3f37e011c3b6 Neater buttons
Neil Muller <drnlmuller@gmail.com>
parents: 475
diff changeset
168 tool_list = []
3f37e011c3b6 Neater buttons
Neil Muller <drnlmuller@gmail.com>
parents: 475
diff changeset
169 for tile_char in sorted(tile_map):
3f37e011c3b6 Neater buttons
Neil Muller <drnlmuller@gmail.com>
parents: 475
diff changeset
170 try:
3f37e011c3b6 Neater buttons
Neil Muller <drnlmuller@gmail.com>
parents: 475
diff changeset
171 tile = self.level.tileset[tile_char]
3f37e011c3b6 Neater buttons
Neil Muller <drnlmuller@gmail.com>
parents: 475
diff changeset
172 except pygame.error:
3f37e011c3b6 Neater buttons
Neil Muller <drnlmuller@gmail.com>
parents: 475
diff changeset
173 # Ignore stuff we can't load for now
3f37e011c3b6 Neater buttons
Neil Muller <drnlmuller@gmail.com>
parents: 475
diff changeset
174 continue
3f37e011c3b6 Neater buttons
Neil Muller <drnlmuller@gmail.com>
parents: 475
diff changeset
175 if tile is None:
3f37e011c3b6 Neater buttons
Neil Muller <drnlmuller@gmail.com>
parents: 475
diff changeset
176 continue
3f37e011c3b6 Neater buttons
Neil Muller <drnlmuller@gmail.com>
parents: 475
diff changeset
177 if tile.name:
3f37e011c3b6 Neater buttons
Neil Muller <drnlmuller@gmail.com>
parents: 475
diff changeset
178 text = tile.name
3f37e011c3b6 Neater buttons
Neil Muller <drnlmuller@gmail.com>
parents: 475
diff changeset
179 else:
3f37e011c3b6 Neater buttons
Neil Muller <drnlmuller@gmail.com>
parents: 475
diff changeset
180 text = 'Tile'
3f37e011c3b6 Neater buttons
Neil Muller <drnlmuller@gmail.com>
parents: 475
diff changeset
181 tile_button = ImageButtonWidget((0, 0), tile.image, text,
3f37e011c3b6 Neater buttons
Neil Muller <drnlmuller@gmail.com>
parents: 475
diff changeset
182 color='white')
3f37e011c3b6 Neater buttons
Neil Muller <drnlmuller@gmail.com>
parents: 475
diff changeset
183 tile_button.add_callback('clicked', self.change_tool,
3f37e011c3b6 Neater buttons
Neil Muller <drnlmuller@gmail.com>
parents: 475
diff changeset
184 tile_char, text)
284
96b4ad9b4d30 Start work on sprite editor. Tweak layout issues
Neil Muller <drnlmuller@gmail.com>
parents: 279
diff changeset
185 tool_list.append(tile_button)
479
3f37e011c3b6 Neater buttons
Neil Muller <drnlmuller@gmail.com>
parents: 475
diff changeset
186 if self.mode == "Sprites":
508
6c61d5862310 Massive speical sprite editor rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 494
diff changeset
187 for cls_name, sprite_cls in find_special_sprites():
6c61d5862310 Massive speical sprite editor rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 494
diff changeset
188 image = load_tile_image(sprite_cls.image_name,
6c61d5862310 Massive speical sprite editor rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 494
diff changeset
189 self.level.tileset.name)
6c61d5862310 Massive speical sprite editor rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 494
diff changeset
190 name = sprite_cls.name
6c61d5862310 Massive speical sprite editor rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 494
diff changeset
191 tile_button = ImageButtonWidget((0, 0), image, name,
6c61d5862310 Massive speical sprite editor rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 494
diff changeset
192 color='white')
6c61d5862310 Massive speical sprite editor rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 494
diff changeset
193 tile_button.add_callback('clicked', self.sprite_tool,
6c61d5862310 Massive speical sprite editor rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 494
diff changeset
194 'Add', cls_name, sprite_cls)
6c61d5862310 Massive speical sprite editor rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 494
diff changeset
195 tool_list.append(tile_button)
6c61d5862310 Massive speical sprite editor rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 494
diff changeset
196 for name in ['Edit', 'Delete']:
479
3f37e011c3b6 Neater buttons
Neil Muller <drnlmuller@gmail.com>
parents: 475
diff changeset
197 tile_button = TextButton((0, 0), '%s Sprite' % name)
3f37e011c3b6 Neater buttons
Neil Muller <drnlmuller@gmail.com>
parents: 475
diff changeset
198 tile_button.add_callback('clicked', self.sprite_tool,
508
6c61d5862310 Massive speical sprite editor rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 494
diff changeset
199 name, None, None)
479
3f37e011c3b6 Neater buttons
Neil Muller <drnlmuller@gmail.com>
parents: 475
diff changeset
200 tool_list.append(tile_button)
555
c014f5023cd2 Test run replays
Neil Muller <drnlmuller@gmail.com>
parents: 553
diff changeset
201 elif self.mode == 'Test':
c014f5023cd2 Test run replays
Neil Muller <drnlmuller@gmail.com>
parents: 553
diff changeset
202 for replay in [1, 2]:
c014f5023cd2 Test run replays
Neil Muller <drnlmuller@gmail.com>
parents: 553
diff changeset
203 store_button = TextButton((0, 0),
c014f5023cd2 Test run replays
Neil Muller <drnlmuller@gmail.com>
parents: 553
diff changeset
204 'Store run as %s' % replay)
c014f5023cd2 Test run replays
Neil Muller <drnlmuller@gmail.com>
parents: 553
diff changeset
205 store_button.add_callback('clicked', self.store_replay,
c014f5023cd2 Test run replays
Neil Muller <drnlmuller@gmail.com>
parents: 553
diff changeset
206 replay)
c014f5023cd2 Test run replays
Neil Muller <drnlmuller@gmail.com>
parents: 553
diff changeset
207 tool_list.append(store_button)
c014f5023cd2 Test run replays
Neil Muller <drnlmuller@gmail.com>
parents: 553
diff changeset
208 replay_button = TextButton((0, 0),
c014f5023cd2 Test run replays
Neil Muller <drnlmuller@gmail.com>
parents: 553
diff changeset
209 'Replay run %s' % replay)
c014f5023cd2 Test run replays
Neil Muller <drnlmuller@gmail.com>
parents: 553
diff changeset
210 replay_button.add_callback('clicked', self.do_replay,
c014f5023cd2 Test run replays
Neil Muller <drnlmuller@gmail.com>
parents: 553
diff changeset
211 replay)
c014f5023cd2 Test run replays
Neil Muller <drnlmuller@gmail.com>
parents: 553
diff changeset
212 tool_list.append(replay_button)
c014f5023cd2 Test run replays
Neil Muller <drnlmuller@gmail.com>
parents: 553
diff changeset
213 last_button = TextButton((0, 0),
c014f5023cd2 Test run replays
Neil Muller <drnlmuller@gmail.com>
parents: 553
diff changeset
214 'Replay last run')
c014f5023cd2 Test run replays
Neil Muller <drnlmuller@gmail.com>
parents: 553
diff changeset
215 last_button.add_callback('clicked', self.do_replay, None)
c014f5023cd2 Test run replays
Neil Muller <drnlmuller@gmail.com>
parents: 553
diff changeset
216 tool_list.append(last_button)
479
3f37e011c3b6 Neater buttons
Neil Muller <drnlmuller@gmail.com>
parents: 475
diff changeset
217 self.tool_widget = ToolListWidget((button_left, button_height),
3f37e011c3b6 Neater buttons
Neil Muller <drnlmuller@gmail.com>
parents: 475
diff changeset
218 tool_list, MAX_TOOLS, start_key=K_2)
3f37e011c3b6 Neater buttons
Neil Muller <drnlmuller@gmail.com>
parents: 475
diff changeset
219 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
220 self.container.add(self.tool_widget)
481
68898de788cc Add upload button to editor.
Simon Cross <hodgestar@gmail.com>
parents: 479
diff changeset
221
284
96b4ad9b4d30 Start work on sprite editor. Tweak layout issues
Neil Muller <drnlmuller@gmail.com>
parents: 279
diff changeset
222 button_height = self.container.rect.top + MODE_HEIGHT
481
68898de788cc Add upload button to editor.
Simon Cross <hodgestar@gmail.com>
parents: 479
diff changeset
223 tile_button = TextButton((button_left, button_height),
68898de788cc Add upload button to editor.
Simon Cross <hodgestar@gmail.com>
parents: 479
diff changeset
224 'Tiles')
68898de788cc Add upload button to editor.
Simon Cross <hodgestar@gmail.com>
parents: 479
diff changeset
225 tile_button.add_callback('clicked', self.change_toolbar, 'Tiles')
68898de788cc Add upload button to editor.
Simon Cross <hodgestar@gmail.com>
parents: 479
diff changeset
226 thing_button = TextButton((button_left + tile_button.rect.width +
68898de788cc Add upload button to editor.
Simon Cross <hodgestar@gmail.com>
parents: 479
diff changeset
227 button_padding, button_height),
68898de788cc Add upload button to editor.
Simon Cross <hodgestar@gmail.com>
parents: 479
diff changeset
228 'Things')
68898de788cc Add upload button to editor.
Simon Cross <hodgestar@gmail.com>
parents: 479
diff changeset
229 thing_button.add_callback('clicked', self.change_toolbar, 'Things')
68898de788cc Add upload button to editor.
Simon Cross <hodgestar@gmail.com>
parents: 479
diff changeset
230 sprite_button = TextButton((button_left,
540
efe1b61aad08 Start of help and an exit button.
Simon Cross <hodgestar@gmail.com>
parents: 533
diff changeset
231 thing_button.rect.bottom +
481
68898de788cc Add upload button to editor.
Simon Cross <hodgestar@gmail.com>
parents: 479
diff changeset
232 button_padding),
68898de788cc Add upload button to editor.
Simon Cross <hodgestar@gmail.com>
parents: 479
diff changeset
233 'Sprites')
68898de788cc Add upload button to editor.
Simon Cross <hodgestar@gmail.com>
parents: 479
diff changeset
234 sprite_button.add_callback('clicked', self.change_toolbar,
68898de788cc Add upload button to editor.
Simon Cross <hodgestar@gmail.com>
parents: 479
diff changeset
235 'Sprites')
551
9d3ed4d05f55 Hack in test level mode to editor
Neil Muller <drnlmuller@gmail.com>
parents: 544
diff changeset
236 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
237 thing_button.rect.bottom + button_padding),
551
9d3ed4d05f55 Hack in test level mode to editor
Neil Muller <drnlmuller@gmail.com>
parents: 544
diff changeset
238 'Test')
9d3ed4d05f55 Hack in test level mode to editor
Neil Muller <drnlmuller@gmail.com>
parents: 544
diff changeset
239 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
240 help_button = TextButton((button_left,
9d3ed4d05f55 Hack in test level mode to editor
Neil Muller <drnlmuller@gmail.com>
parents: 544
diff changeset
241 test_button.rect.bottom + button_padding),
540
efe1b61aad08 Start of help and an exit button.
Simon Cross <hodgestar@gmail.com>
parents: 533
diff changeset
242 'Help')
efe1b61aad08 Start of help and an exit button.
Simon Cross <hodgestar@gmail.com>
parents: 533
diff changeset
243 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
244
481
68898de788cc Add upload button to editor.
Simon Cross <hodgestar@gmail.com>
parents: 479
diff changeset
245 if self.mode == "Tiles":
68898de788cc Add upload button to editor.
Simon Cross <hodgestar@gmail.com>
parents: 479
diff changeset
246 tile_button.disable()
68898de788cc Add upload button to editor.
Simon Cross <hodgestar@gmail.com>
parents: 479
diff changeset
247 elif self.mode == "Things":
68898de788cc Add upload button to editor.
Simon Cross <hodgestar@gmail.com>
parents: 479
diff changeset
248 thing_button.disable()
68898de788cc Add upload button to editor.
Simon Cross <hodgestar@gmail.com>
parents: 479
diff changeset
249 elif self.mode == "Sprites":
68898de788cc Add upload button to editor.
Simon Cross <hodgestar@gmail.com>
parents: 479
diff changeset
250 sprite_button.disable()
551
9d3ed4d05f55 Hack in test level mode to editor
Neil Muller <drnlmuller@gmail.com>
parents: 544
diff changeset
251 elif self.mode == 'Test':
9d3ed4d05f55 Hack in test level mode to editor
Neil Muller <drnlmuller@gmail.com>
parents: 544
diff changeset
252 test_button.disable()
481
68898de788cc Add upload button to editor.
Simon Cross <hodgestar@gmail.com>
parents: 479
diff changeset
253 self.container.add(tile_button)
68898de788cc Add upload button to editor.
Simon Cross <hodgestar@gmail.com>
parents: 479
diff changeset
254 self.container.add(thing_button)
68898de788cc Add upload button to editor.
Simon Cross <hodgestar@gmail.com>
parents: 479
diff changeset
255 self.container.add(sprite_button)
551
9d3ed4d05f55 Hack in test level mode to editor
Neil Muller <drnlmuller@gmail.com>
parents: 544
diff changeset
256 self.container.add(test_button)
540
efe1b61aad08 Start of help and an exit button.
Simon Cross <hodgestar@gmail.com>
parents: 533
diff changeset
257 self.container.add(help_button)
481
68898de788cc Add upload button to editor.
Simon Cross <hodgestar@gmail.com>
parents: 479
diff changeset
258
68898de788cc Add upload button to editor.
Simon Cross <hodgestar@gmail.com>
parents: 479
diff changeset
259 button_height = LOAD_SAVE_HEIGHT
68898de788cc Add upload button to editor.
Simon Cross <hodgestar@gmail.com>
parents: 479
diff changeset
260
68898de788cc Add upload button to editor.
Simon Cross <hodgestar@gmail.com>
parents: 479
diff changeset
261 upload = TextButton((button_left, button_height), "Upload Level")
68898de788cc Add upload button to editor.
Simon Cross <hodgestar@gmail.com>
parents: 479
diff changeset
262 upload.add_callback('clicked', self.upload)
68898de788cc Add upload button to editor.
Simon Cross <hodgestar@gmail.com>
parents: 479
diff changeset
263 self.container.add(upload)
68898de788cc Add upload button to editor.
Simon Cross <hodgestar@gmail.com>
parents: 479
diff changeset
264
540
efe1b61aad08 Start of help and an exit button.
Simon Cross <hodgestar@gmail.com>
parents: 533
diff changeset
265 mainmenu = TextButton((upload.rect.right + button_padding,
efe1b61aad08 Start of help and an exit button.
Simon Cross <hodgestar@gmail.com>
parents: 533
diff changeset
266 button_height), 'Exit')
efe1b61aad08 Start of help and an exit button.
Simon Cross <hodgestar@gmail.com>
parents: 533
diff changeset
267 mainmenu.add_callback('clicked', self.go_mainmenu)
efe1b61aad08 Start of help and an exit button.
Simon Cross <hodgestar@gmail.com>
parents: 533
diff changeset
268 self.container.add(mainmenu)
efe1b61aad08 Start of help and an exit button.
Simon Cross <hodgestar@gmail.com>
parents: 533
diff changeset
269
481
68898de788cc Add upload button to editor.
Simon Cross <hodgestar@gmail.com>
parents: 479
diff changeset
270 button_height = upload.rect.bottom + button_padding
180
d9ee0e50a78f Teach editor about THING_MAP
Neil Muller <drnlmuller@gmail.com>
parents: 175
diff changeset
271
270
3c95ba7408f1 Add protected level name list. Add load & new buttons
Neil Muller <drnlmuller@gmail.com>
parents: 267
diff changeset
272 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
273 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
274 self.container.add(new)
481
68898de788cc Add upload button to editor.
Simon Cross <hodgestar@gmail.com>
parents: 479
diff changeset
275
68898de788cc Add upload button to editor.
Simon Cross <hodgestar@gmail.com>
parents: 479
diff changeset
276 load = TextButton((new.rect.right + button_padding, button_height),
68898de788cc Add upload button to editor.
Simon Cross <hodgestar@gmail.com>
parents: 479
diff changeset
277 "Load")
270
3c95ba7408f1 Add protected level name list. Add load & new buttons
Neil Muller <drnlmuller@gmail.com>
parents: 267
diff changeset
278 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
279 self.container.add(load)
3c95ba7408f1 Add protected level name list. Add load & new buttons
Neil Muller <drnlmuller@gmail.com>
parents: 267
diff changeset
280
481
68898de788cc Add upload button to editor.
Simon Cross <hodgestar@gmail.com>
parents: 479
diff changeset
281 save = TextButton((load.rect.right + button_padding, button_height),
68898de788cc Add upload button to editor.
Simon Cross <hodgestar@gmail.com>
parents: 479
diff changeset
282 "Save")
270
3c95ba7408f1 Add protected level name list. Add load & new buttons
Neil Muller <drnlmuller@gmail.com>
parents: 267
diff changeset
283 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
284 self.container.add(save)
172
dabf13abb3fd Add basic drawing to level editor
Neil Muller <drnlmuller@gmail.com>
parents: 170
diff changeset
285
551
9d3ed4d05f55 Hack in test level mode to editor
Neil Muller <drnlmuller@gmail.com>
parents: 544
diff changeset
286 if self.mode == 'Test':
9d3ed4d05f55 Hack in test level mode to editor
Neil Muller <drnlmuller@gmail.com>
parents: 544
diff changeset
287 save.disable()
9d3ed4d05f55 Hack in test level mode to editor
Neil Muller <drnlmuller@gmail.com>
parents: 544
diff changeset
288 load.disable()
9d3ed4d05f55 Hack in test level mode to editor
Neil Muller <drnlmuller@gmail.com>
parents: 544
diff changeset
289 new.disable()
9d3ed4d05f55 Hack in test level mode to editor
Neil Muller <drnlmuller@gmail.com>
parents: 544
diff changeset
290
172
dabf13abb3fd Add basic drawing to level editor
Neil Muller <drnlmuller@gmail.com>
parents: 170
diff changeset
291 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
292 self.edit_widget.set_tool(new_tool)
dabf13abb3fd Add basic drawing to level editor
Neil Muller <drnlmuller@gmail.com>
parents: 170
diff changeset
293 self.current_tool.text = 'Tool: %s' % text
dabf13abb3fd Add basic drawing to level editor
Neil Muller <drnlmuller@gmail.com>
parents: 170
diff changeset
294 self.current_tool.prepare()
337
170d4a43c00e Don't edit the level when interacting with dialogs
Neil Muller <drnlmuller@gmail.com>
parents: 325
diff changeset
295 return True
174
893fb9f8f468 Hook up basic saving
Neil Muller <drnlmuller@gmail.com>
parents: 172
diff changeset
296
540
efe1b61aad08 Start of help and an exit button.
Simon Cross <hodgestar@gmail.com>
parents: 533
diff changeset
297 def show_help(self, ev, widget):
573
c01e1e329b47 Add a sentence to help. Tweak help display
Neil Muller <drnlmuller@gmail.com>
parents: 572
diff changeset
298 message = MessageBox((5, 5), self.help_msg, color="black",
544
13d02d1f5ae0 Add help to editor.
Simon Cross <hodgestar@gmail.com>
parents: 540
diff changeset
299 fontsize=12)
13d02d1f5ae0 Add help to editor.
Simon Cross <hodgestar@gmail.com>
parents: 540
diff changeset
300 self.display_dialog(message)
540
efe1b61aad08 Start of help and an exit button.
Simon Cross <hodgestar@gmail.com>
parents: 533
diff changeset
301 return True
efe1b61aad08 Start of help and an exit button.
Simon Cross <hodgestar@gmail.com>
parents: 533
diff changeset
302
efe1b61aad08 Start of help and an exit button.
Simon Cross <hodgestar@gmail.com>
parents: 533
diff changeset
303 def go_mainmenu(self, ev, widget):
efe1b61aad08 Start of help and an exit button.
Simon Cross <hodgestar@gmail.com>
parents: 533
diff changeset
304 from mamba.habitats.mainmenu import MainMenu
efe1b61aad08 Start of help and an exit button.
Simon Cross <hodgestar@gmail.com>
parents: 533
diff changeset
305 NewHabitatEvent.post(MainMenu())
efe1b61aad08 Start of help and an exit button.
Simon Cross <hodgestar@gmail.com>
parents: 533
diff changeset
306 return True
efe1b61aad08 Start of help and an exit button.
Simon Cross <hodgestar@gmail.com>
parents: 533
diff changeset
307
485
e4e9e607e6f9 Factor out level checking messages for re-use in upload.
Simon Cross <hodgestar@gmail.com>
parents: 481
diff changeset
308 def check_level(self):
278
f10d06fc64b2 Add some robustness against broken levels
Neil Muller <drnlmuller@gmail.com>
parents: 277
diff changeset
309 message = None
277
82aa91664e27 Warn on save failures
Neil Muller <drnlmuller@gmail.com>
parents: 276
diff changeset
310 if not self.level.level_name:
278
f10d06fc64b2 Add some robustness against broken levels
Neil Muller <drnlmuller@gmail.com>
parents: 277
diff changeset
311 message = MessageBox((300, 300), 'Please enter a name')
277
82aa91664e27 Warn on save failures
Neil Muller <drnlmuller@gmail.com>
parents: 276
diff changeset
312 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
313 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
314 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
315 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
316
e4e9e607e6f9 Factor out level checking messages for re-use in upload.
Simon Cross <hodgestar@gmail.com>
parents: 481
diff changeset
317 if message is None:
e4e9e607e6f9 Factor out level checking messages for re-use in upload.
Simon Cross <hodgestar@gmail.com>
parents: 481
diff changeset
318 try:
e4e9e607e6f9 Factor out level checking messages for re-use in upload.
Simon Cross <hodgestar@gmail.com>
parents: 481
diff changeset
319 self.level.validate_level()
590
2d3dee657638 Game runs, although weirdly
Neil Muller <drnlmuller@gmail.com>
parents: 589
diff changeset
320 except InvalidMapError as error:
485
e4e9e607e6f9 Factor out level checking messages for re-use in upload.
Simon Cross <hodgestar@gmail.com>
parents: 481
diff changeset
321 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
322
e4e9e607e6f9 Factor out level checking messages for re-use in upload.
Simon Cross <hodgestar@gmail.com>
parents: 481
diff changeset
323 return message
e4e9e607e6f9 Factor out level checking messages for re-use in upload.
Simon Cross <hodgestar@gmail.com>
parents: 481
diff changeset
324
e4e9e607e6f9 Factor out level checking messages for re-use in upload.
Simon Cross <hodgestar@gmail.com>
parents: 481
diff changeset
325 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
326 message = self.check_level()
278
f10d06fc64b2 Add some robustness against broken levels
Neil Muller <drnlmuller@gmail.com>
parents: 277
diff changeset
327 if message:
404
38f95fbc3710 Better dialog handling.
Jeremy Thurgood <firxen@gmail.com>
parents: 402
diff changeset
328 self.display_dialog(message)
544
13d02d1f5ae0 Add help to editor.
Simon Cross <hodgestar@gmail.com>
parents: 540
diff changeset
329 return True
571
cb8cc5b4d6be Don't crash if saving a level fails
Neil Muller <drnlmuller@gmail.com>
parents: 565
diff changeset
330 try:
572
84616c7db2e7 ensure save dir exists before trying to save
Neil Muller <drnlmuller@gmail.com>
parents: 571
diff changeset
331 ensure_save_path_exists('user_levels')
571
cb8cc5b4d6be Don't crash if saving a level fails
Neil Muller <drnlmuller@gmail.com>
parents: 565
diff changeset
332 self.level.save_level('user_levels', is_user_dir=True)
cb8cc5b4d6be Don't crash if saving a level fails
Neil Muller <drnlmuller@gmail.com>
parents: 565
diff changeset
333 self.refresh_display()
cb8cc5b4d6be Don't crash if saving a level fails
Neil Muller <drnlmuller@gmail.com>
parents: 565
diff changeset
334 message = MessageBox((300, 300),
cb8cc5b4d6be Don't crash if saving a level fails
Neil Muller <drnlmuller@gmail.com>
parents: 565
diff changeset
335 'Success!\nYou have saved a user level')
590
2d3dee657638 Game runs, although weirdly
Neil Muller <drnlmuller@gmail.com>
parents: 589
diff changeset
336 except Exception as e:
571
cb8cc5b4d6be Don't crash if saving a level fails
Neil Muller <drnlmuller@gmail.com>
parents: 565
diff changeset
337 # Catch-all if things go wrong
cb8cc5b4d6be Don't crash if saving a level fails
Neil Muller <drnlmuller@gmail.com>
parents: 565
diff changeset
338 message = MessageBox((300, 300),
cb8cc5b4d6be Don't crash if saving a level fails
Neil Muller <drnlmuller@gmail.com>
parents: 565
diff changeset
339 "Disaster! Level not saved:\n%s" % e)
521
8a3884201d00 Save success dialog
Neil Muller <drnlmuller@gmail.com>
parents: 512
diff changeset
340 self.display_dialog(message)
337
170d4a43c00e Don't edit the level when interacting with dialogs
Neil Muller <drnlmuller@gmail.com>
parents: 325
diff changeset
341 return True
180
d9ee0e50a78f Teach editor about THING_MAP
Neil Muller <drnlmuller@gmail.com>
parents: 175
diff changeset
342
270
3c95ba7408f1 Add protected level name list. Add load & new buttons
Neil Muller <drnlmuller@gmail.com>
parents: 267
diff changeset
343 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
344 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
345
481
68898de788cc Add upload button to editor.
Simon Cross <hodgestar@gmail.com>
parents: 479
diff changeset
346 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
347 message = self.check_level()
e4e9e607e6f9 Factor out level checking messages for re-use in upload.
Simon Cross <hodgestar@gmail.com>
parents: 481
diff changeset
348 if message:
e4e9e607e6f9 Factor out level checking messages for re-use in upload.
Simon Cross <hodgestar@gmail.com>
parents: 481
diff changeset
349 self.display_dialog(message)
490
be1e22e3f17c Finish hooking up level uploading.
Simon Cross <hodgestar@gmail.com>
parents: 489
diff changeset
350 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
351 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
352 self.level.save_level(save_file=save_file)
490
be1e22e3f17c Finish hooking up level uploading.
Simon Cross <hodgestar@gmail.com>
parents: 489
diff changeset
353
576
cd51099911ca Make URL used for saving levels cleaner.
Simon Cross <hodgestar@gmail.com>
parents: 573
diff changeset
354 url = "%ssave/%s" % (LEVEL_SERVER, self.level.level_name)
590
2d3dee657638 Game runs, although weirdly
Neil Muller <drnlmuller@gmail.com>
parents: 589
diff changeset
355 args = parse.urlencode([('data', save_file.getvalue())])
490
be1e22e3f17c Finish hooking up level uploading.
Simon Cross <hodgestar@gmail.com>
parents: 489
diff changeset
356 try:
590
2d3dee657638 Game runs, although weirdly
Neil Muller <drnlmuller@gmail.com>
parents: 589
diff changeset
357 result = request.urlopen(url, args)
490
be1e22e3f17c Finish hooking up level uploading.
Simon Cross <hodgestar@gmail.com>
parents: 489
diff changeset
358 mtxt = result.read()
597
16c690a7dc27 Fix bare except clauses.
Simon Cross <hodgestar@gmail.com>
parents: 590
diff changeset
359 except Exception:
490
be1e22e3f17c Finish hooking up level uploading.
Simon Cross <hodgestar@gmail.com>
parents: 489
diff changeset
360 mtxt = "Failed to upload level. :("
be1e22e3f17c Finish hooking up level uploading.
Simon Cross <hodgestar@gmail.com>
parents: 489
diff changeset
361 else:
533
cb9ee0ba01ce Explain curation in upload dialog box.
Simon Cross <hodgestar@gmail.com>
parents: 521
diff changeset
362 mtxt = "Success! %s\n%s" % (mtxt,
cb9ee0ba01ce Explain curation in upload dialog box.
Simon Cross <hodgestar@gmail.com>
parents: 521
diff changeset
363 "Your level is now awaiting curation.")
490
be1e22e3f17c Finish hooking up level uploading.
Simon Cross <hodgestar@gmail.com>
parents: 489
diff changeset
364
be1e22e3f17c Finish hooking up level uploading.
Simon Cross <hodgestar@gmail.com>
parents: 489
diff changeset
365 message = MessageBox((300, 300), mtxt)
be1e22e3f17c Finish hooking up level uploading.
Simon Cross <hodgestar@gmail.com>
parents: 489
diff changeset
366 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
367 return True
481
68898de788cc Add upload button to editor.
Simon Cross <hodgestar@gmail.com>
parents: 479
diff changeset
368
402
001c3797a63b Editor now uses templates and the user level directory.
Jeremy Thurgood <firxen@gmail.com>
parents: 396
diff changeset
369 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
370 if level_dir is None:
001c3797a63b Editor now uses templates and the user level directory.
Jeremy Thurgood <firxen@gmail.com>
parents: 396
diff changeset
371 level_dir = 'user_levels'
001c3797a63b Editor now uses templates and the user level directory.
Jeremy Thurgood <firxen@gmail.com>
parents: 396
diff changeset
372 is_user_dir = True
337
170d4a43c00e Don't edit the level when interacting with dialogs
Neil Muller <drnlmuller@gmail.com>
parents: 325
diff changeset
373 self.container.paused = True
402
001c3797a63b Editor now uses templates and the user level directory.
Jeremy Thurgood <firxen@gmail.com>
parents: 396
diff changeset
374 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
375 load_list = []
a061dd62127c Hook up load and new buttons
Neil Muller <drnlmuller@gmail.com>
parents: 270
diff changeset
376 for level_name in levels:
a061dd62127c Hook up load and new buttons
Neil Muller <drnlmuller@gmail.com>
parents: 270
diff changeset
377 if level_name in RESERVED_NAMES:
a061dd62127c Hook up load and new buttons
Neil Muller <drnlmuller@gmail.com>
parents: 270
diff changeset
378 continue
402
001c3797a63b Editor now uses templates and the user level directory.
Jeremy Thurgood <firxen@gmail.com>
parents: 396
diff changeset
379 if subdir:
001c3797a63b Editor now uses templates and the user level directory.
Jeremy Thurgood <firxen@gmail.com>
parents: 396
diff changeset
380 level_name = '/'.join([subdir, level_name])
272
a061dd62127c Hook up load and new buttons
Neil Muller <drnlmuller@gmail.com>
parents: 270
diff changeset
381 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
382 load_button.add_callback(
001c3797a63b Editor now uses templates and the user level directory.
Jeremy Thurgood <firxen@gmail.com>
parents: 396
diff changeset
383 '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
384 load_list.append(load_button)
404
38f95fbc3710 Better dialog handling.
Jeremy Thurgood <firxen@gmail.com>
parents: 402
diff changeset
385 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
386 return True
272
a061dd62127c Hook up load and new buttons
Neil Muller <drnlmuller@gmail.com>
parents: 270
diff changeset
387
402
001c3797a63b Editor now uses templates and the user level directory.
Jeremy Thurgood <firxen@gmail.com>
parents: 396
diff changeset
388 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
389 try:
402
001c3797a63b Editor now uses templates and the user level directory.
Jeremy Thurgood <firxen@gmail.com>
parents: 396
diff changeset
390 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
391 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
392 new_level = Level(level_name, 'user', source.read())
590
2d3dee657638 Game runs, although weirdly
Neil Muller <drnlmuller@gmail.com>
parents: 589
diff changeset
393 except (IOError, InvalidMapError, pygame.error) as error:
278
f10d06fc64b2 Add some robustness against broken levels
Neil Muller <drnlmuller@gmail.com>
parents: 277
diff changeset
394 message = MessageBox((300, 300),
f10d06fc64b2 Add some robustness against broken levels
Neil Muller <drnlmuller@gmail.com>
parents: 277
diff changeset
395 'Loading Level Failed: %s' % error, color='red')
404
38f95fbc3710 Better dialog handling.
Jeremy Thurgood <firxen@gmail.com>
parents: 402
diff changeset
396 self.display_dialog(message)
278
f10d06fc64b2 Add some robustness against broken levels
Neil Muller <drnlmuller@gmail.com>
parents: 277
diff changeset
397 return False
272
a061dd62127c Hook up load and new buttons
Neil Muller <drnlmuller@gmail.com>
parents: 270
diff changeset
398 self.container.remove(self.edit_widget)
278
f10d06fc64b2 Add some robustness against broken levels
Neil Muller <drnlmuller@gmail.com>
parents: 277
diff changeset
399 self.level = new_level
272
a061dd62127c Hook up load and new buttons
Neil Muller <drnlmuller@gmail.com>
parents: 270
diff changeset
400 if level_name in RESERVED_NAMES:
a061dd62127c Hook up load and new buttons
Neil Muller <drnlmuller@gmail.com>
parents: 270
diff changeset
401 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
402 self.container.paused = False
272
a061dd62127c Hook up load and new buttons
Neil Muller <drnlmuller@gmail.com>
parents: 270
diff changeset
403 self.edit_widget = EditLevelWidget(self.level)
551
9d3ed4d05f55 Hack in test level mode to editor
Neil Muller <drnlmuller@gmail.com>
parents: 544
diff changeset
404 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
405 self.edit_widget.add_callback(LevelCompletedEvent, self.halt_test)
555
c014f5023cd2 Test run replays
Neil Muller <drnlmuller@gmail.com>
parents: 553
diff changeset
406 self.replays = {}
272
a061dd62127c Hook up load and new buttons
Neil Muller <drnlmuller@gmail.com>
parents: 270
diff changeset
407 self.container.add(self.edit_widget)
a061dd62127c Hook up load and new buttons
Neil Muller <drnlmuller@gmail.com>
parents: 270
diff changeset
408 self.clear_toolbar()
a061dd62127c Hook up load and new buttons
Neil Muller <drnlmuller@gmail.com>
parents: 270
diff changeset
409 self.setup_toolbar()
387
f86188a0f259 Tweak load list length
Neil Muller <drnlmuller@gmail.com>
parents: 363
diff changeset
410 return True
270
3c95ba7408f1 Add protected level name list. Add load & new buttons
Neil Muller <drnlmuller@gmail.com>
parents: 267
diff changeset
411
284
96b4ad9b4d30 Start work on sprite editor. Tweak layout issues
Neil Muller <drnlmuller@gmail.com>
parents: 279
diff changeset
412 def change_toolbar(self, ev, widget, new_mode):
553
a2648295b7cf Only stop test if we were just testing (otherwise the level gets cleared).
Simon Cross <hodgestar@gmail.com>
parents: 552
diff changeset
413 old_mode = self.mode
551
9d3ed4d05f55 Hack in test level mode to editor
Neil Muller <drnlmuller@gmail.com>
parents: 544
diff changeset
414 if new_mode == 'Test':
9d3ed4d05f55 Hack in test level mode to editor
Neil Muller <drnlmuller@gmail.com>
parents: 544
diff changeset
415 try:
9d3ed4d05f55 Hack in test level mode to editor
Neil Muller <drnlmuller@gmail.com>
parents: 544
diff changeset
416 self.level.validate_level()
590
2d3dee657638 Game runs, although weirdly
Neil Muller <drnlmuller@gmail.com>
parents: 589
diff changeset
417 except InvalidMapError as error:
551
9d3ed4d05f55 Hack in test level mode to editor
Neil Muller <drnlmuller@gmail.com>
parents: 544
diff changeset
418 # Fail to change mode on invalid maps
9d3ed4d05f55 Hack in test level mode to editor
Neil Muller <drnlmuller@gmail.com>
parents: 544
diff changeset
419 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
420 self.display_dialog(message)
9d3ed4d05f55 Hack in test level mode to editor
Neil Muller <drnlmuller@gmail.com>
parents: 544
diff changeset
421 return True
284
96b4ad9b4d30 Start work on sprite editor. Tweak layout issues
Neil Muller <drnlmuller@gmail.com>
parents: 279
diff changeset
422 self.mode = new_mode
560
a85993b00fd7 Unbreak thing placement
Neil Muller <drnlmuller@gmail.com>
parents: 558
diff changeset
423 self.edit_widget.tile_mode = (self.mode in ('Tiles', 'Things'))
180
d9ee0e50a78f Teach editor about THING_MAP
Neil Muller <drnlmuller@gmail.com>
parents: 175
diff changeset
424 self.clear_toolbar()
d9ee0e50a78f Teach editor about THING_MAP
Neil Muller <drnlmuller@gmail.com>
parents: 175
diff changeset
425 self.setup_toolbar()
551
9d3ed4d05f55 Hack in test level mode to editor
Neil Muller <drnlmuller@gmail.com>
parents: 544
diff changeset
426 if self.mode == 'Test':
9d3ed4d05f55 Hack in test level mode to editor
Neil Muller <drnlmuller@gmail.com>
parents: 544
diff changeset
427 self.edit_widget.start_test()
553
a2648295b7cf Only stop test if we were just testing (otherwise the level gets cleared).
Simon Cross <hodgestar@gmail.com>
parents: 552
diff changeset
428 elif old_mode == 'Test':
551
9d3ed4d05f55 Hack in test level mode to editor
Neil Muller <drnlmuller@gmail.com>
parents: 544
diff changeset
429 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
430 return True
180
d9ee0e50a78f Teach editor about THING_MAP
Neil Muller <drnlmuller@gmail.com>
parents: 175
diff changeset
431
d9ee0e50a78f Teach editor about THING_MAP
Neil Muller <drnlmuller@gmail.com>
parents: 175
diff changeset
432 def clear_toolbar(self):
d9ee0e50a78f Teach editor about THING_MAP
Neil Muller <drnlmuller@gmail.com>
parents: 175
diff changeset
433 """Remove every non-edit widget from the container"""
d9ee0e50a78f Teach editor about THING_MAP
Neil Muller <drnlmuller@gmail.com>
parents: 175
diff changeset
434 for widget in self.container.children[:]:
d9ee0e50a78f Teach editor about THING_MAP
Neil Muller <drnlmuller@gmail.com>
parents: 175
diff changeset
435 if widget is not self.edit_widget:
d9ee0e50a78f Teach editor about THING_MAP
Neil Muller <drnlmuller@gmail.com>
parents: 175
diff changeset
436 self.container.remove(widget)
229
b0ef7eecc67a Make filename editable
Neil Muller <drnlmuller@gmail.com>
parents: 180
diff changeset
437
236
09247e08aeda Refactor edit calling code. Tweak toolbar layout
Neil Muller <drnlmuller@gmail.com>
parents: 229
diff changeset
438 def do_edit(self, ev, widget, message, init_value, callback):
404
38f95fbc3710 Better dialog handling.
Jeremy Thurgood <firxen@gmail.com>
parents: 402
diff changeset
439 self.display_dialog(
38f95fbc3710 Better dialog handling.
Jeremy Thurgood <firxen@gmail.com>
parents: 402
diff changeset
440 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
441 return True
229
b0ef7eecc67a Make filename editable
Neil Muller <drnlmuller@gmail.com>
parents: 180
diff changeset
442
512
0ccdcc970ae2 Improved unpausing in the level editor.
Jeremy Thurgood <firxen@gmail.com>
parents: 508
diff changeset
443 def unpause(self):
0ccdcc970ae2 Improved unpausing in the level editor.
Jeremy Thurgood <firxen@gmail.com>
parents: 508
diff changeset
444 self.container.paused = False
0ccdcc970ae2 Improved unpausing in the level editor.
Jeremy Thurgood <firxen@gmail.com>
parents: 508
diff changeset
445
565
fa673a8312ec Add author to editor
Neil Muller <drnlmuller@gmail.com>
parents: 560
diff changeset
446 def update_level_data(self, filename, name, author, tileset, track):
454
8cfa757dd7d3 Epic level editor reworking.
Jeremy Thurgood <firxen@gmail.com>
parents: 423
diff changeset
447
8cfa757dd7d3 Epic level editor reworking.
Jeremy Thurgood <firxen@gmail.com>
parents: 423
diff changeset
448 self.level.name = name
565
fa673a8312ec Add author to editor
Neil Muller <drnlmuller@gmail.com>
parents: 560
diff changeset
449 self.level.author = author
454
8cfa757dd7d3 Epic level editor reworking.
Jeremy Thurgood <firxen@gmail.com>
parents: 423
diff changeset
450 self.level.background_track = track
8cfa757dd7d3 Epic level editor reworking.
Jeremy Thurgood <firxen@gmail.com>
parents: 423
diff changeset
451 # err_ts = self.change_tileset(tileset)
8cfa757dd7d3 Epic level editor reworking.
Jeremy Thurgood <firxen@gmail.com>
parents: 423
diff changeset
452 err_fn = self.check_file(filename)
8cfa757dd7d3 Epic level editor reworking.
Jeremy Thurgood <firxen@gmail.com>
parents: 423
diff changeset
453
236
09247e08aeda Refactor edit calling code. Tweak toolbar layout
Neil Muller <drnlmuller@gmail.com>
parents: 229
diff changeset
454 self.clear_toolbar()
09247e08aeda Refactor edit calling code. Tweak toolbar layout
Neil Muller <drnlmuller@gmail.com>
parents: 229
diff changeset
455 self.setup_toolbar()
09247e08aeda Refactor edit calling code. Tweak toolbar layout
Neil Muller <drnlmuller@gmail.com>
parents: 229
diff changeset
456
454
8cfa757dd7d3 Epic level editor reworking.
Jeremy Thurgood <firxen@gmail.com>
parents: 423
diff changeset
457 if err_fn:
512
0ccdcc970ae2 Improved unpausing in the level editor.
Jeremy Thurgood <firxen@gmail.com>
parents: 508
diff changeset
458 err_fn.post_callback = self.unpause
454
8cfa757dd7d3 Epic level editor reworking.
Jeremy Thurgood <firxen@gmail.com>
parents: 423
diff changeset
459 self.display_dialog(err_fn)
512
0ccdcc970ae2 Improved unpausing in the level editor.
Jeremy Thurgood <firxen@gmail.com>
parents: 508
diff changeset
460 else:
0ccdcc970ae2 Improved unpausing in the level editor.
Jeremy Thurgood <firxen@gmail.com>
parents: 508
diff changeset
461 self.container.paused = False
325
00c36ff53de9 Teach editor about background tracks
Neil Muller <drnlmuller@gmail.com>
parents: 314
diff changeset
462
279
162bddbbc5d0 Protect against bad tilesets as well
Neil Muller <drnlmuller@gmail.com>
parents: 278
diff changeset
463 def refresh_display(self):
275
51bec5e6191e Rework selecting tilesets
Neil Muller <drnlmuller@gmail.com>
parents: 272
diff changeset
464 self.level.restart()
51bec5e6191e Rework selecting tilesets
Neil Muller <drnlmuller@gmail.com>
parents: 272
diff changeset
465 self.clear_toolbar()
51bec5e6191e Rework selecting tilesets
Neil Muller <drnlmuller@gmail.com>
parents: 272
diff changeset
466 self.setup_toolbar()
51bec5e6191e Rework selecting tilesets
Neil Muller <drnlmuller@gmail.com>
parents: 272
diff changeset
467 return True
236
09247e08aeda Refactor edit calling code. Tweak toolbar layout
Neil Muller <drnlmuller@gmail.com>
parents: 229
diff changeset
468
454
8cfa757dd7d3 Epic level editor reworking.
Jeremy Thurgood <firxen@gmail.com>
parents: 423
diff changeset
469 def change_tileset(self, new_tileset):
589
fca61cd8fc33 Start working towards py3 port
Neil Muller <drnlmuller@gmail.com>
parents: 576
diff changeset
470 print("changing tileset")
454
8cfa757dd7d3 Epic level editor reworking.
Jeremy Thurgood <firxen@gmail.com>
parents: 423
diff changeset
471 self.level.update_tiles_ascii()
8cfa757dd7d3 Epic level editor reworking.
Jeremy Thurgood <firxen@gmail.com>
parents: 423
diff changeset
472 old_tileset = self.level.tileset
8cfa757dd7d3 Epic level editor reworking.
Jeremy Thurgood <firxen@gmail.com>
parents: 423
diff changeset
473 try:
8cfa757dd7d3 Epic level editor reworking.
Jeremy Thurgood <firxen@gmail.com>
parents: 423
diff changeset
474 self.level.tileset = Tileset(new_tileset)
8cfa757dd7d3 Epic level editor reworking.
Jeremy Thurgood <firxen@gmail.com>
parents: 423
diff changeset
475 self.level.restart()
8cfa757dd7d3 Epic level editor reworking.
Jeremy Thurgood <firxen@gmail.com>
parents: 423
diff changeset
476 return None
590
2d3dee657638 Game runs, although weirdly
Neil Muller <drnlmuller@gmail.com>
parents: 589
diff changeset
477 except pygame.error as error:
454
8cfa757dd7d3 Epic level editor reworking.
Jeremy Thurgood <firxen@gmail.com>
parents: 423
diff changeset
478 self.level.tileset = old_tileset
8cfa757dd7d3 Epic level editor reworking.
Jeremy Thurgood <firxen@gmail.com>
parents: 423
diff changeset
479 return MessageBox(
8cfa757dd7d3 Epic level editor reworking.
Jeremy Thurgood <firxen@gmail.com>
parents: 423
diff changeset
480 (300, 300), 'Unable to change tileset:: %s' % error,
8cfa757dd7d3 Epic level editor reworking.
Jeremy Thurgood <firxen@gmail.com>
parents: 423
diff changeset
481 color='red')
8cfa757dd7d3 Epic level editor reworking.
Jeremy Thurgood <firxen@gmail.com>
parents: 423
diff changeset
482
229
b0ef7eecc67a Make filename editable
Neil Muller <drnlmuller@gmail.com>
parents: 180
diff changeset
483 def check_file(self, new_name):
278
f10d06fc64b2 Add some robustness against broken levels
Neil Muller <drnlmuller@gmail.com>
parents: 277
diff changeset
484 message = None
229
b0ef7eecc67a Make filename editable
Neil Muller <drnlmuller@gmail.com>
parents: 180
diff changeset
485 if new_name == self.level.level_name:
454
8cfa757dd7d3 Epic level editor reworking.
Jeremy Thurgood <firxen@gmail.com>
parents: 423
diff changeset
486 return None # No-op change
276
9c57025781e7 Warn on enter filename results
Neil Muller <drnlmuller@gmail.com>
parents: 275
diff changeset
487 if not new_name:
278
f10d06fc64b2 Add some robustness against broken levels
Neil Muller <drnlmuller@gmail.com>
parents: 277
diff changeset
488 message = MessageBox((300, 300), 'Please enter a name')
277
82aa91664e27 Warn on save failures
Neil Muller <drnlmuller@gmail.com>
parents: 276
diff changeset
489 if new_name in RESERVED_NAMES:
82aa91664e27 Warn on save failures
Neil Muller <drnlmuller@gmail.com>
parents: 276
diff changeset
490 # This case is caught by the existance check, but the
82aa91664e27 Warn on save failures
Neil Muller <drnlmuller@gmail.com>
parents: 276
diff changeset
491 # importance of the reserved names means we use a different
82aa91664e27 Warn on save failures
Neil Muller <drnlmuller@gmail.com>
parents: 276
diff changeset
492 # message
278
f10d06fc64b2 Add some robustness against broken levels
Neil Muller <drnlmuller@gmail.com>
parents: 277
diff changeset
493 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
494 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
495 message = MessageBox((300, 300), 'Name already in use')
f10d06fc64b2 Add some robustness against broken levels
Neil Muller <drnlmuller@gmail.com>
parents: 277
diff changeset
496 if message:
454
8cfa757dd7d3 Epic level editor reworking.
Jeremy Thurgood <firxen@gmail.com>
parents: 423
diff changeset
497 return message
229
b0ef7eecc67a Make filename editable
Neil Muller <drnlmuller@gmail.com>
parents: 180
diff changeset
498 self.level.level_name = new_name
454
8cfa757dd7d3 Epic level editor reworking.
Jeremy Thurgood <firxen@gmail.com>
parents: 423
diff changeset
499 return None
284
96b4ad9b4d30 Start work on sprite editor. Tweak layout issues
Neil Muller <drnlmuller@gmail.com>
parents: 279
diff changeset
500
508
6c61d5862310 Massive speical sprite editor rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 494
diff changeset
501 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
502 """Handle sprite stuff"""
96b4ad9b4d30 Start work on sprite editor. Tweak layout issues
Neil Muller <drnlmuller@gmail.com>
parents: 279
diff changeset
503 self.sprite_mode = sprite_mode
508
6c61d5862310 Massive speical sprite editor rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 494
diff changeset
504 self.sprite_cls_name = cls_name
6c61d5862310 Massive speical sprite editor rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 494
diff changeset
505 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
506 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
507 self.clear_toolbar()
96b4ad9b4d30 Start work on sprite editor. Tweak layout issues
Neil Muller <drnlmuller@gmail.com>
parents: 279
diff changeset
508 self.setup_toolbar()
337
170d4a43c00e Don't edit the level when interacting with dialogs
Neil Muller <drnlmuller@gmail.com>
parents: 325
diff changeset
509 return True
343
5bf35267ddc0 Hook up sprite deletion. Framework work for sprite editing & adding
Neil Muller <drnlmuller@gmail.com>
parents: 337
diff changeset
510
5bf35267ddc0 Hook up sprite deletion. Framework work for sprite editing & adding
Neil Muller <drnlmuller@gmail.com>
parents: 337
diff changeset
511 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
512 """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
513 if self.mode != 'Sprites':
5bf35267ddc0 Hook up sprite deletion. Framework work for sprite editing & adding
Neil Muller <drnlmuller@gmail.com>
parents: 337
diff changeset
514 return False
5bf35267ddc0 Hook up sprite deletion. Framework work for sprite editing & adding
Neil Muller <drnlmuller@gmail.com>
parents: 337
diff changeset
515 if self.container.paused:
5bf35267ddc0 Hook up sprite deletion. Framework work for sprite editing & adding
Neil Muller <drnlmuller@gmail.com>
parents: 337
diff changeset
516 return False
5bf35267ddc0 Hook up sprite deletion. Framework work for sprite editing & adding
Neil Muller <drnlmuller@gmail.com>
parents: 337
diff changeset
517 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
518 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
519 if self.sprite_mode == 'Delete' and sprite:
508
6c61d5862310 Massive speical sprite editor rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 494
diff changeset
520 self.level.remove_sprite(sprite_ascii)
353
62a2a659c69b Call sprite editor dialog
Neil Muller <drnlmuller@gmail.com>
parents: 343
diff changeset
521 self.level.restart()
343
5bf35267ddc0 Hook up sprite deletion. Framework work for sprite editing & adding
Neil Muller <drnlmuller@gmail.com>
parents: 337
diff changeset
522 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
523 self.edit_sprite(tile_pos, sprite)
558
73c4985bf726 Only attempt to place a sprite if there is a sprite class selected.
Simon Cross <hodgestar@gmail.com>
parents: 557
diff changeset
524 elif (self.sprite_mode == 'Add' and sprite is None
73c4985bf726 Only attempt to place a sprite if there is a sprite class selected.
Simon Cross <hodgestar@gmail.com>
parents: 557
diff changeset
525 and self.sprite_cls is not None):
508
6c61d5862310 Massive speical sprite editor rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 494
diff changeset
526 self.edit_sprite(tile_pos,
6c61d5862310 Massive speical sprite editor rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 494
diff changeset
527 (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
528 return True
5bf35267ddc0 Hook up sprite deletion. Framework work for sprite editing & adding
Neil Muller <drnlmuller@gmail.com>
parents: 337
diff changeset
529
508
6c61d5862310 Massive speical sprite editor rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 494
diff changeset
530 def edit_sprite(self, tile_pos, sprite_info):
6c61d5862310 Massive speical sprite editor rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 494
diff changeset
531 sprite_editor = EditSpriteBox((200, 100), tile_pos, sprite_info,
353
62a2a659c69b Call sprite editor dialog
Neil Muller <drnlmuller@gmail.com>
parents: 343
diff changeset
532 post_callback=self.commit_line)
404
38f95fbc3710 Better dialog handling.
Jeremy Thurgood <firxen@gmail.com>
parents: 402
diff changeset
533 self.display_dialog(sprite_editor)
353
62a2a659c69b Call sprite editor dialog
Neil Muller <drnlmuller@gmail.com>
parents: 343
diff changeset
534
454
8cfa757dd7d3 Epic level editor reworking.
Jeremy Thurgood <firxen@gmail.com>
parents: 423
diff changeset
535 def edit_level_data(self, ev, widget):
8cfa757dd7d3 Epic level editor reworking.
Jeremy Thurgood <firxen@gmail.com>
parents: 423
diff changeset
536 elb = EditLevelBox((200, 100), self.level, self.update_level_data)
8cfa757dd7d3 Epic level editor reworking.
Jeremy Thurgood <firxen@gmail.com>
parents: 423
diff changeset
537 self.display_dialog(elb)
8cfa757dd7d3 Epic level editor reworking.
Jeremy Thurgood <firxen@gmail.com>
parents: 423
diff changeset
538
353
62a2a659c69b Call sprite editor dialog
Neil Muller <drnlmuller@gmail.com>
parents: 343
diff changeset
539 def commit_line(self, sprite):
62a2a659c69b Call sprite editor dialog
Neil Muller <drnlmuller@gmail.com>
parents: 343
diff changeset
540 try:
62a2a659c69b Call sprite editor dialog
Neil Muller <drnlmuller@gmail.com>
parents: 343
diff changeset
541 self.level.validate_sprite(sprite)
597
16c690a7dc27 Fix bare except clauses.
Simon Cross <hodgestar@gmail.com>
parents: 590
diff changeset
542 except Exception:
353
62a2a659c69b Call sprite editor dialog
Neil Muller <drnlmuller@gmail.com>
parents: 343
diff changeset
543 # 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
544 # we catch everything
62a2a659c69b Call sprite editor dialog
Neil Muller <drnlmuller@gmail.com>
parents: 343
diff changeset
545 # We use sys.exc_info to get slight neater info
62a2a659c69b Call sprite editor dialog
Neil Muller <drnlmuller@gmail.com>
parents: 343
diff changeset
546 exc_type, info, _ = sys.exc_info()
62a2a659c69b Call sprite editor dialog
Neil Muller <drnlmuller@gmail.com>
parents: 343
diff changeset
547 info = traceback.format_exception_only(exc_type, info)[0]
62a2a659c69b Call sprite editor dialog
Neil Muller <drnlmuller@gmail.com>
parents: 343
diff changeset
548 message = MessageBox((300, 300),
62a2a659c69b Call sprite editor dialog
Neil Muller <drnlmuller@gmail.com>
parents: 343
diff changeset
549 'Validation failed:\n%s' % info)
404
38f95fbc3710 Better dialog handling.
Jeremy Thurgood <firxen@gmail.com>
parents: 402
diff changeset
550 self.display_dialog(message)
353
62a2a659c69b Call sprite editor dialog
Neil Muller <drnlmuller@gmail.com>
parents: 343
diff changeset
551 return False
62a2a659c69b Call sprite editor dialog
Neil Muller <drnlmuller@gmail.com>
parents: 343
diff changeset
552 # Validation successful, so add to level
62a2a659c69b Call sprite editor dialog
Neil Muller <drnlmuller@gmail.com>
parents: 343
diff changeset
553 if self.sprite_mode == 'Add':
62a2a659c69b Call sprite editor dialog
Neil Muller <drnlmuller@gmail.com>
parents: 343
diff changeset
554 self.level.add_sprite(sprite)
62a2a659c69b Call sprite editor dialog
Neil Muller <drnlmuller@gmail.com>
parents: 343
diff changeset
555 elif self.sprite_mode == 'Edit':
62a2a659c69b Call sprite editor dialog
Neil Muller <drnlmuller@gmail.com>
parents: 343
diff changeset
556 self.level.replace_sprite(sprite)
62a2a659c69b Call sprite editor dialog
Neil Muller <drnlmuller@gmail.com>
parents: 343
diff changeset
557 self.level.restart()
62a2a659c69b Call sprite editor dialog
Neil Muller <drnlmuller@gmail.com>
parents: 343
diff changeset
558 return True
555
c014f5023cd2 Test run replays
Neil Muller <drnlmuller@gmail.com>
parents: 553
diff changeset
559
c014f5023cd2 Test run replays
Neil Muller <drnlmuller@gmail.com>
parents: 553
diff changeset
560 def store_replay(self, ev, widget, number):
c014f5023cd2 Test run replays
Neil Muller <drnlmuller@gmail.com>
parents: 553
diff changeset
561 self.replays[number] = self.edit_widget.get_replay()
c014f5023cd2 Test run replays
Neil Muller <drnlmuller@gmail.com>
parents: 553
diff changeset
562
c014f5023cd2 Test run replays
Neil Muller <drnlmuller@gmail.com>
parents: 553
diff changeset
563 def do_replay(self, ev, widget, number):
c014f5023cd2 Test run replays
Neil Muller <drnlmuller@gmail.com>
parents: 553
diff changeset
564 if number:
c014f5023cd2 Test run replays
Neil Muller <drnlmuller@gmail.com>
parents: 553
diff changeset
565 # We do nothing if the user tries to replay something thay
c014f5023cd2 Test run replays
Neil Muller <drnlmuller@gmail.com>
parents: 553
diff changeset
566 # isn't there
c014f5023cd2 Test run replays
Neil Muller <drnlmuller@gmail.com>
parents: 553
diff changeset
567 if number in self.replays:
c014f5023cd2 Test run replays
Neil Muller <drnlmuller@gmail.com>
parents: 553
diff changeset
568 # Replay stored replay
c014f5023cd2 Test run replays
Neil Muller <drnlmuller@gmail.com>
parents: 553
diff changeset
569 self.edit_widget.replay(self.replays[number])
c014f5023cd2 Test run replays
Neil Muller <drnlmuller@gmail.com>
parents: 553
diff changeset
570 else:
c014f5023cd2 Test run replays
Neil Muller <drnlmuller@gmail.com>
parents: 553
diff changeset
571 # Replaying last run
c014f5023cd2 Test run replays
Neil Muller <drnlmuller@gmail.com>
parents: 553
diff changeset
572 self.edit_widget.replay()