Mercurial > mamba
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 |
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 | 15 from mamba.widgets.level import EditLevelWidget |
174 | 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 | 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 | 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 | 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 | 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 | 158 if self.mode in self.toolbar: |
159 # FIXME: This needs to be recreated on tileset changes | |
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 | 162 if self.mode == 'Tiles': |
163 tile_map = TILE_MAP | |
164 elif self.mode == 'Things': | |
165 tile_map = THING_MAP | |
170 | 166 else: |
479 | 167 tile_map = [] |
168 tool_list = [] | |
169 for tile_char in sorted(tile_map): | |
170 try: | |
171 tile = self.level.tileset[tile_char] | |
172 except pygame.error: | |
173 # Ignore stuff we can't load for now | |
174 continue | |
175 if tile is None: | |
176 continue | |
177 if tile.name: | |
178 text = tile.name | |
179 else: | |
180 text = 'Tile' | |
181 tile_button = ImageButtonWidget((0, 0), tile.image, text, | |
182 color='white') | |
183 tile_button.add_callback('clicked', self.change_tool, | |
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 | 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 | 197 tile_button = TextButton((0, 0), '%s Sprite' % name) |
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 | 200 tool_list.append(tile_button) |
555 | 201 elif self.mode == 'Test': |
202 for replay in [1, 2]: | |
203 store_button = TextButton((0, 0), | |
204 'Store run as %s' % replay) | |
205 store_button.add_callback('clicked', self.store_replay, | |
206 replay) | |
207 tool_list.append(store_button) | |
208 replay_button = TextButton((0, 0), | |
209 'Replay run %s' % replay) | |
210 replay_button.add_callback('clicked', self.do_replay, | |
211 replay) | |
212 tool_list.append(replay_button) | |
213 last_button = TextButton((0, 0), | |
214 'Replay last run') | |
215 last_button.add_callback('clicked', self.do_replay, None) | |
216 tool_list.append(last_button) | |
479 | 217 self.tool_widget = ToolListWidget((button_left, button_height), |
218 tool_list, MAX_TOOLS, start_key=K_2) | |
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 | 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 | 299 fontsize=12) |
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 | 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 | 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 | 328 self.display_dialog(message) |
544 | 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 | 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 | 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 | 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 | 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 | 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 | 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 | 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 | 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 | 439 self.display_dialog( |
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 | 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 | 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 | 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 | 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 | 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 | 489 if new_name in RESERVED_NAMES: |
490 # This case is caught by the existance check, but the | |
491 # importance of the reserved names means we use a different | |
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 | 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 | 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 | 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 | 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 | 559 |
560 def store_replay(self, ev, widget, number): | |
561 self.replays[number] = self.edit_widget.get_replay() | |
562 | |
563 def do_replay(self, ev, widget, number): | |
564 if number: | |
565 # We do nothing if the user tries to replay something thay | |
566 # isn't there | |
567 if number in self.replays: | |
568 # Replay stored replay | |
569 self.edit_widget.replay(self.replays[number]) | |
570 else: | |
571 # Replaying last run | |
572 self.edit_widget.replay() |