Mercurial > mamba
annotate mamba/level.py @ 561:9afaa1969d6f
Level format 2 support
* * *
Allow for blank author
* * *
Fix thinko in write code
author | Neil Muller <drnlmuller@gmail.com> |
---|---|
date | Tue, 18 Oct 2011 11:41:28 +0200 |
parents | 6c61d5862310 |
children | 2d3dee657638 |
rev | line source |
---|---|
8
66ae99f6903e
First stab at tile/level stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
1 """ |
66ae99f6903e
First stab at tile/level stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
2 Level for our shiny game. |
66ae99f6903e
First stab at tile/level stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
3 """ |
66ae99f6903e
First stab at tile/level stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
4 |
256
9827ce469834
Add more validation exceptions to new map loading code. Handle trying to load when display hasn't been initiliased better
Neil Muller <drnlmuller@gmail.com>
parents:
253
diff
changeset
|
5 import pygame |
71
58557a89ec86
Some tile improvements and stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
57
diff
changeset
|
6 from pygame.surface import Surface |
50 | 7 from pygame.sprite import RenderUpdates |
8
66ae99f6903e
First stab at tile/level stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
8 |
561 | 9 from mamba.constants import UP, DOWN, LEFT, RIGHT, VERSION |
50 | 10 from mamba.data import load_file |
162
7fbbe27120a9
Rodents! Amphibians! Import juggling!
Jeremy Thurgood <firxen@gmail.com>
parents:
146
diff
changeset
|
11 from mamba import sprites |
31
67218082cdbb
More level non-functionality.
Jeremy Thurgood <firxen@gmail.com>
parents:
21
diff
changeset
|
12 |
331
0c25bca380de
Support for loading level from string.
Simon Cross <hodgestar@gmail.com>
parents:
317
diff
changeset
|
13 from StringIO import StringIO |
0c25bca380de
Support for loading level from string.
Simon Cross <hodgestar@gmail.com>
parents:
317
diff
changeset
|
14 |
21
f76c3f033772
Release early, release broken. Level stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
8
diff
changeset
|
15 |
81
c8d6ca296884
Better level entry points.
Jeremy Thurgood <firxen@gmail.com>
parents:
71
diff
changeset
|
16 class InvalidMapError(Exception): |
c8d6ca296884
Better level entry points.
Jeremy Thurgood <firxen@gmail.com>
parents:
71
diff
changeset
|
17 pass |
c8d6ca296884
Better level entry points.
Jeremy Thurgood <firxen@gmail.com>
parents:
71
diff
changeset
|
18 |
c8d6ca296884
Better level entry points.
Jeremy Thurgood <firxen@gmail.com>
parents:
71
diff
changeset
|
19 |
104 | 20 def mktile(cls, **kw): |
21 return (cls, kw) | |
22 | |
23 | |
37 | 24 TILE_MAP = { |
25 '.': None, | |
169 | 26 'X': mktile(sprites.TileSprite, image_name='wall', name='wall', |
27 solid=True), | |
231
bf7bf54ed6ff
Because every lab needs a biohazard warning sign or three.
Jeremy Thurgood <firxen@gmail.com>
parents:
230
diff
changeset
|
28 'A': mktile(sprites.TileSprite, image_name='biohazard', name='biohazard', |
bf7bf54ed6ff
Because every lab needs a biohazard warning sign or three.
Jeremy Thurgood <firxen@gmail.com>
parents:
230
diff
changeset
|
29 solid=True), |
162
7fbbe27120a9
Rodents! Amphibians! Import juggling!
Jeremy Thurgood <firxen@gmail.com>
parents:
146
diff
changeset
|
30 'R': mktile(sprites.DoorSprite, colour='red'), |
7fbbe27120a9
Rodents! Amphibians! Import juggling!
Jeremy Thurgood <firxen@gmail.com>
parents:
146
diff
changeset
|
31 'B': mktile(sprites.DoorSprite, colour='blue'), |
220
066198428ee9
added yellow things
Adrianna Pińska <adrianna.pinska@gmail.com>
parents:
199
diff
changeset
|
32 'Y': mktile(sprites.DoorSprite, colour='yellow'), |
199
986e72d2cb4d
Rejiggered entrances and shifted directions around.
Jeremy Thurgood <firxen@gmail.com>
parents:
197
diff
changeset
|
33 'e': mktile(sprites.EntrySprite), |
162
7fbbe27120a9
Rodents! Amphibians! Import juggling!
Jeremy Thurgood <firxen@gmail.com>
parents:
146
diff
changeset
|
34 'E': mktile(sprites.ExitSprite), |
7fbbe27120a9
Rodents! Amphibians! Import juggling!
Jeremy Thurgood <firxen@gmail.com>
parents:
146
diff
changeset
|
35 '~': mktile(sprites.PuddleSprite), |
253 | 36 '$': mktile(sprites.FireSprite), |
238
f00f6006cb5d
named paint tiles
Adrianna Pińska <adrianna.pinska@gmail.com>
parents:
234
diff
changeset
|
37 'r': mktile(sprites.Painter, colour='red', name='paint'), |
f00f6006cb5d
named paint tiles
Adrianna Pińska <adrianna.pinska@gmail.com>
parents:
234
diff
changeset
|
38 'b': mktile(sprites.Painter, colour='blue', name='paint'), |
f00f6006cb5d
named paint tiles
Adrianna Pińska <adrianna.pinska@gmail.com>
parents:
234
diff
changeset
|
39 'y': mktile(sprites.Painter, colour='yellow', name='paint'), |
234 | 40 '^': mktile(sprites.ArrowSprite, direction=UP), |
41 'v': mktile(sprites.ArrowSprite, direction=DOWN), | |
42 '<': mktile(sprites.ArrowSprite, direction=LEFT), | |
43 '>': mktile(sprites.ArrowSprite, direction=RIGHT), | |
248
de3b4048e54a
Hook up tile arrow rotation
Stefano Rivera <stefano@rivera.za.net>
parents:
247
diff
changeset
|
44 '@': mktile(sprites.FlipArrows), |
37 | 45 } |
46 | |
47 THING_MAP = { | |
165
0b2f2627a0ac
moved animals to common
Adrianna Pińska <adrianna.pinska@gmail.com>
parents:
163
diff
changeset
|
48 'M': mktile(sprites.BigMouse), |
0b2f2627a0ac
moved animals to common
Adrianna Pińska <adrianna.pinska@gmail.com>
parents:
163
diff
changeset
|
49 'm': mktile(sprites.SmallMouse), |
0b2f2627a0ac
moved animals to common
Adrianna Pińska <adrianna.pinska@gmail.com>
parents:
163
diff
changeset
|
50 'f': mktile(sprites.Frog), |
250
f52fae80cd18
You stole my snail symbol!
Adrianna Pińska <adrianna.pinska@gmail.com>
parents:
249
diff
changeset
|
51 '&': mktile(sprites.Snail), |
249 | 52 'l': mktile(sprites.Lizard), |
53 's': mktile(sprites.Salamander), | |
37 | 54 } |
55 | |
56 | |
8
66ae99f6903e
First stab at tile/level stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
57 class Tileset(object): |
66ae99f6903e
First stab at tile/level stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
58 def __init__(self, tileset_name): |
66ae99f6903e
First stab at tile/level stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
59 self.name = tileset_name |
31
67218082cdbb
More level non-functionality.
Jeremy Thurgood <firxen@gmail.com>
parents:
21
diff
changeset
|
60 self.load_tiles() |
8
66ae99f6903e
First stab at tile/level stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
61 |
66ae99f6903e
First stab at tile/level stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
62 def load_tiles(self): |
31
67218082cdbb
More level non-functionality.
Jeremy Thurgood <firxen@gmail.com>
parents:
21
diff
changeset
|
63 self.tiles = {} |
163
41e8d4ce3af2
TileSprites are less magic.
Jeremy Thurgood <firxen@gmail.com>
parents:
162
diff
changeset
|
64 self.floor = sprites.TileSprite('.', tileset=self.name, |
162
7fbbe27120a9
Rodents! Amphibians! Import juggling!
Jeremy Thurgood <firxen@gmail.com>
parents:
146
diff
changeset
|
65 image_name='floor').image |
50 | 66 for name, value in TILE_MAP.items(): |
67 if value is not None: | |
104 | 68 value[1]['tileset'] = self.name |
50 | 69 self.tiles[name] = value |
70 self.tiles.update(THING_MAP) | |
8
66ae99f6903e
First stab at tile/level stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
71 |
66ae99f6903e
First stab at tile/level stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
72 def __getitem__(self, key): |
84 | 73 try: |
74 tilespec = self.tiles[key] | |
75 except KeyError: | |
76 raise InvalidMapError("Unknown tile type: '%s'" % key) | |
50 | 77 if not tilespec: |
78 return None | |
105
87acd3ddc972
Tell sprites what their tile char is.
Jeremy Thurgood <firxen@gmail.com>
parents:
104
diff
changeset
|
79 cls, params = tilespec |
87acd3ddc972
Tell sprites what their tile char is.
Jeremy Thurgood <firxen@gmail.com>
parents:
104
diff
changeset
|
80 params['tile_char'] = key |
87acd3ddc972
Tell sprites what their tile char is.
Jeremy Thurgood <firxen@gmail.com>
parents:
104
diff
changeset
|
81 return cls(**params) |
31
67218082cdbb
More level non-functionality.
Jeremy Thurgood <firxen@gmail.com>
parents:
21
diff
changeset
|
82 |
50 | 83 def get_tile(self, key, tile_pos, *groups): |
31
67218082cdbb
More level non-functionality.
Jeremy Thurgood <firxen@gmail.com>
parents:
21
diff
changeset
|
84 tile = self[key] |
50 | 85 if tile: |
86 tile.add(*groups) | |
87 tile.set_tile_pos(tile_pos) | |
31
67218082cdbb
More level non-functionality.
Jeremy Thurgood <firxen@gmail.com>
parents:
21
diff
changeset
|
88 return tile |
8
66ae99f6903e
First stab at tile/level stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
89 |
66ae99f6903e
First stab at tile/level stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
90 |
66ae99f6903e
First stab at tile/level stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
91 class Level(object): |
361
d4062344d8f4
Level namespaces (for telling that a level is complete, no matter where it came from)
Stefano Rivera <stefano@rivera.za.net>
parents:
352
diff
changeset
|
92 def __init__(self, level_name, level_namespace, source=None): |
8
66ae99f6903e
First stab at tile/level stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
93 self.level_name = level_name |
361
d4062344d8f4
Level namespaces (for telling that a level is complete, no matter where it came from)
Stefano Rivera <stefano@rivera.za.net>
parents:
352
diff
changeset
|
94 self.level_namespace = level_namespace |
331
0c25bca380de
Support for loading level from string.
Simon Cross <hodgestar@gmail.com>
parents:
317
diff
changeset
|
95 self.source = source |
561 | 96 self.author = '' |
8
66ae99f6903e
First stab at tile/level stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
97 self.load_level_data() |
66ae99f6903e
First stab at tile/level stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
98 |
561 | 99 def load_format_1(self, level_data): |
100 """Load the original map format""" | |
101 self.name = level_data[0].strip() | |
102 tileset_name = level_data[1].strip() | |
103 self.tileset = Tileset(tileset_name) | |
104 self.background_track = level_data[2].strip() | |
105 tiles_ascii = [line.strip() for line in level_data[3:]] | |
106 try: | |
107 end = tiles_ascii.index("end") | |
108 except ValueError: | |
109 raise InvalidMapError('Missing "end" marker in level') | |
110 sprites_ascii = tiles_ascii[end + 1:] | |
111 tiles_ascii = tiles_ascii[:end] | |
112 self.tiles_ascii = tiles_ascii | |
113 self.sprites_ascii = sprites_ascii | |
114 | |
115 def load_format_2(self, level_data): | |
116 """Load the second mamba map format""" | |
117 try: | |
118 self.name = level_data[1].split('Name:', 1)[1].strip() | |
119 tileset_name = level_data[3].split('Tileset:', 1)[1].strip() | |
120 self.background_track = level_data[4].split('Music:', 1)[1].strip() | |
121 except IndexError: | |
122 raise InvalidMapError('Incorrectly formatted map header') | |
123 try: | |
124 # Missing author isn't fatal | |
125 self.author = level_data[2].split('Author:', 1)[1].strip() | |
126 except IndexError: | |
127 self.author = '' | |
128 self.tileset = Tileset(tileset_name) | |
129 tiles_ascii = [line.strip() for line in level_data[5:]] | |
130 try: | |
131 end = tiles_ascii.index("end") | |
132 except ValueError: | |
133 raise InvalidMapError('Missing "end" marker in level') | |
134 sprites_ascii = tiles_ascii[end + 1:] | |
135 tiles_ascii = tiles_ascii[:end] | |
136 self.tiles_ascii = tiles_ascii | |
137 self.sprites_ascii = sprites_ascii | |
138 | |
139 def check_format(self, level_data): | |
140 """Determine which format to load""" | |
141 if (level_data[0].startswith('Version: ') and | |
142 level_data[3].startswith('Tileset: ')): | |
143 # Looks like a version 2 level file | |
144 file_version = level_data[0].split('Version: ', 1)[1].strip() | |
145 try: | |
146 file_version = tuple([int(x) for x in file_version.split('.')]) | |
147 # We only compare on the first two elements, so point | |
148 # rleases work as expected | |
149 if file_version[:2] <= VERSION: | |
150 return 2 | |
151 else: | |
152 raise InvalidMapError("Unsupported map version") | |
153 except ValueError: | |
154 raise InvalidMapError("Unrecognised map version") | |
155 else: | |
156 # We assume anything we don't recognise is format 0 and rely on the | |
157 # error checking there to save us if we're wrong. | |
158 return 1 | |
159 | |
8
66ae99f6903e
First stab at tile/level stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
160 def load_level_data(self): |
66ae99f6903e
First stab at tile/level stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
161 """ |
31
67218082cdbb
More level non-functionality.
Jeremy Thurgood <firxen@gmail.com>
parents:
21
diff
changeset
|
162 This file format is potentially yucky. |
8
66ae99f6903e
First stab at tile/level stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
163 """ |
331
0c25bca380de
Support for loading level from string.
Simon Cross <hodgestar@gmail.com>
parents:
317
diff
changeset
|
164 if self.source is not None: |
0c25bca380de
Support for loading level from string.
Simon Cross <hodgestar@gmail.com>
parents:
317
diff
changeset
|
165 level_data = StringIO(self.source) |
0c25bca380de
Support for loading level from string.
Simon Cross <hodgestar@gmail.com>
parents:
317
diff
changeset
|
166 else: |
0c25bca380de
Support for loading level from string.
Simon Cross <hodgestar@gmail.com>
parents:
317
diff
changeset
|
167 level_data = load_file('levels/%s.txt' % (self.level_name,)) |
561 | 168 # XXX: Should we have some size restriction here? |
169 level_data = level_data.readlines() | |
170 level_format = self.check_format(level_data) | |
171 if level_format == 2: | |
172 self.load_format_2(level_data) | |
173 elif level_format == 1: | |
174 self.load_format_1(level_data) | |
175 else: | |
176 # generic fallback | |
177 raise InvalidMapError("Unrecognised map version") | |
178 self.setup_level(self.tiles_ascii, self.sprites_ascii) | |
71
58557a89ec86
Some tile improvements and stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
57
diff
changeset
|
179 self.make_background() |
58557a89ec86
Some tile improvements and stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
57
diff
changeset
|
180 |
363
21caf90f604e
Validate levels before saving them
Neil Muller <drnlmuller@gmail.com>
parents:
361
diff
changeset
|
181 def validate_level(self): |
21caf90f604e
Validate levels before saving them
Neil Muller <drnlmuller@gmail.com>
parents:
361
diff
changeset
|
182 old_tiles_ascii = self.tiles_ascii[:] |
21caf90f604e
Validate levels before saving them
Neil Muller <drnlmuller@gmail.com>
parents:
361
diff
changeset
|
183 old_tiles = self.tiles[:] |
21caf90f604e
Validate levels before saving them
Neil Muller <drnlmuller@gmail.com>
parents:
361
diff
changeset
|
184 try: |
21caf90f604e
Validate levels before saving them
Neil Muller <drnlmuller@gmail.com>
parents:
361
diff
changeset
|
185 self.update_tiles_ascii() |
21caf90f604e
Validate levels before saving them
Neil Muller <drnlmuller@gmail.com>
parents:
361
diff
changeset
|
186 self.setup_tiles(self.tiles_ascii) |
21caf90f604e
Validate levels before saving them
Neil Muller <drnlmuller@gmail.com>
parents:
361
diff
changeset
|
187 finally: |
21caf90f604e
Validate levels before saving them
Neil Muller <drnlmuller@gmail.com>
parents:
361
diff
changeset
|
188 self.tiles = old_tiles |
21caf90f604e
Validate levels before saving them
Neil Muller <drnlmuller@gmail.com>
parents:
361
diff
changeset
|
189 self.tiles_ascii = old_tiles_ascii |
21caf90f604e
Validate levels before saving them
Neil Muller <drnlmuller@gmail.com>
parents:
361
diff
changeset
|
190 |
489
e522db37e5c5
Refactor level saving to allow saving to a passed in file (e.g. StringIO object).
Simon Cross <hodgestar@gmail.com>
parents:
428
diff
changeset
|
191 def save_level(self, level_dir=None, is_user_dir=False, save_file=None): |
174 | 192 """Save the current state of the level""" |
489
e522db37e5c5
Refactor level saving to allow saving to a passed in file (e.g. StringIO object).
Simon Cross <hodgestar@gmail.com>
parents:
428
diff
changeset
|
193 if save_file is None: |
e522db37e5c5
Refactor level saving to allow saving to a passed in file (e.g. StringIO object).
Simon Cross <hodgestar@gmail.com>
parents:
428
diff
changeset
|
194 if level_dir is None: |
e522db37e5c5
Refactor level saving to allow saving to a passed in file (e.g. StringIO object).
Simon Cross <hodgestar@gmail.com>
parents:
428
diff
changeset
|
195 level_dir = 'levels' |
e522db37e5c5
Refactor level saving to allow saving to a passed in file (e.g. StringIO object).
Simon Cross <hodgestar@gmail.com>
parents:
428
diff
changeset
|
196 file_path = '%s/%s.txt' % (level_dir, self.level_name) |
e522db37e5c5
Refactor level saving to allow saving to a passed in file (e.g. StringIO object).
Simon Cross <hodgestar@gmail.com>
parents:
428
diff
changeset
|
197 save_file = load_file(file_path, 'wb', is_user_dir=is_user_dir) |
561 | 198 save_file.write('Version: %d.%d\n' % VERSION[:2]) |
199 save_file.write('Name: %s\n' % self.name) | |
200 save_file.write('Author: %s\n' % self.author) | |
201 save_file.write('Tileset: %s\n' % self.tileset.name) | |
202 save_file.write('Music: %s\n' % self.background_track) | |
274
b970f717479b
Rework things to make updating tiles_ascii easier
Neil Muller <drnlmuller@gmail.com>
parents:
260
diff
changeset
|
203 self.update_tiles_ascii() |
b970f717479b
Rework things to make updating tiles_ascii easier
Neil Muller <drnlmuller@gmail.com>
parents:
260
diff
changeset
|
204 for tile_row in self.tiles_ascii: |
b970f717479b
Rework things to make updating tiles_ascii easier
Neil Muller <drnlmuller@gmail.com>
parents:
260
diff
changeset
|
205 save_file.write('%s\n' % tile_row) |
230
e4f983b68ef5
Start of advanced sprite definitions.
Simon Cross <hodgestar@gmail.com>
parents:
220
diff
changeset
|
206 save_file.write('end\n') |
e4f983b68ef5
Start of advanced sprite definitions.
Simon Cross <hodgestar@gmail.com>
parents:
220
diff
changeset
|
207 for sprite_ascii in self.sprites_ascii: |
247
8e9fcdf98a6b
Fix saving sprite ascii data.
Simon Cross <hodgestar@gmail.com>
parents:
243
diff
changeset
|
208 save_file.write('%s\n' % sprite_ascii) |
230
e4f983b68ef5
Start of advanced sprite definitions.
Simon Cross <hodgestar@gmail.com>
parents:
220
diff
changeset
|
209 |
361
d4062344d8f4
Level namespaces (for telling that a level is complete, no matter where it came from)
Stefano Rivera <stefano@rivera.za.net>
parents:
352
diff
changeset
|
210 def unique_name(self): |
d4062344d8f4
Level namespaces (for telling that a level is complete, no matter where it came from)
Stefano Rivera <stefano@rivera.za.net>
parents:
352
diff
changeset
|
211 return '/'.join((self.level_namespace, self.level_name)) |
d4062344d8f4
Level namespaces (for telling that a level is complete, no matter where it came from)
Stefano Rivera <stefano@rivera.za.net>
parents:
352
diff
changeset
|
212 |
274
b970f717479b
Rework things to make updating tiles_ascii easier
Neil Muller <drnlmuller@gmail.com>
parents:
260
diff
changeset
|
213 def update_tiles_ascii(self): |
b970f717479b
Rework things to make updating tiles_ascii easier
Neil Muller <drnlmuller@gmail.com>
parents:
260
diff
changeset
|
214 """Resync tiles and tile_ascii""" |
b970f717479b
Rework things to make updating tiles_ascii easier
Neil Muller <drnlmuller@gmail.com>
parents:
260
diff
changeset
|
215 for i, tile_row in enumerate(self.tiles): |
b970f717479b
Rework things to make updating tiles_ascii easier
Neil Muller <drnlmuller@gmail.com>
parents:
260
diff
changeset
|
216 new_row = [] |
b970f717479b
Rework things to make updating tiles_ascii easier
Neil Muller <drnlmuller@gmail.com>
parents:
260
diff
changeset
|
217 for tile in tile_row: |
b970f717479b
Rework things to make updating tiles_ascii easier
Neil Muller <drnlmuller@gmail.com>
parents:
260
diff
changeset
|
218 if tile: |
b970f717479b
Rework things to make updating tiles_ascii easier
Neil Muller <drnlmuller@gmail.com>
parents:
260
diff
changeset
|
219 new_row.append(tile.tile_char) |
b970f717479b
Rework things to make updating tiles_ascii easier
Neil Muller <drnlmuller@gmail.com>
parents:
260
diff
changeset
|
220 else: |
b970f717479b
Rework things to make updating tiles_ascii easier
Neil Muller <drnlmuller@gmail.com>
parents:
260
diff
changeset
|
221 new_row.append('.') |
b970f717479b
Rework things to make updating tiles_ascii easier
Neil Muller <drnlmuller@gmail.com>
parents:
260
diff
changeset
|
222 self.tiles_ascii[i] = ''.join(new_row) |
b970f717479b
Rework things to make updating tiles_ascii easier
Neil Muller <drnlmuller@gmail.com>
parents:
260
diff
changeset
|
223 |
230
e4f983b68ef5
Start of advanced sprite definitions.
Simon Cross <hodgestar@gmail.com>
parents:
220
diff
changeset
|
224 def setup_level(self, tiles_ascii, sprites_ascii): |
e4f983b68ef5
Start of advanced sprite definitions.
Simon Cross <hodgestar@gmail.com>
parents:
220
diff
changeset
|
225 self.sprites = RenderUpdates() |
e4f983b68ef5
Start of advanced sprite definitions.
Simon Cross <hodgestar@gmail.com>
parents:
220
diff
changeset
|
226 self.setup_tiles(tiles_ascii) |
e4f983b68ef5
Start of advanced sprite definitions.
Simon Cross <hodgestar@gmail.com>
parents:
220
diff
changeset
|
227 self.setup_sprites(sprites_ascii) |
174 | 228 |
81
c8d6ca296884
Better level entry points.
Jeremy Thurgood <firxen@gmail.com>
parents:
71
diff
changeset
|
229 def setup_tiles(self, tiles_ascii): |
c8d6ca296884
Better level entry points.
Jeremy Thurgood <firxen@gmail.com>
parents:
71
diff
changeset
|
230 self.tiles = [] |
c8d6ca296884
Better level entry points.
Jeremy Thurgood <firxen@gmail.com>
parents:
71
diff
changeset
|
231 self.entry = None |
84 | 232 self.tile_size = (len(tiles_ascii[0]), len(tiles_ascii)) |
81
c8d6ca296884
Better level entry points.
Jeremy Thurgood <firxen@gmail.com>
parents:
71
diff
changeset
|
233 for y, row in enumerate(tiles_ascii): |
84 | 234 if len(row) != self.tile_size[0]: |
235 raise InvalidMapError("Map not rectangular.") | |
81
c8d6ca296884
Better level entry points.
Jeremy Thurgood <firxen@gmail.com>
parents:
71
diff
changeset
|
236 tile_row = [] |
84 | 237 for x, tile_char in enumerate(row): |
141 | 238 #tile_orientation = self.get_tile_orientation(y, x, row, |
239 # tile_char) | |
81
c8d6ca296884
Better level entry points.
Jeremy Thurgood <firxen@gmail.com>
parents:
71
diff
changeset
|
240 tile = self.tileset.get_tile(tile_char, (x, y), self.sprites) |
c8d6ca296884
Better level entry points.
Jeremy Thurgood <firxen@gmail.com>
parents:
71
diff
changeset
|
241 tile_row.append(tile) |
162
7fbbe27120a9
Rodents! Amphibians! Import juggling!
Jeremy Thurgood <firxen@gmail.com>
parents:
146
diff
changeset
|
242 if isinstance(tile, sprites.EntrySprite): |
199
986e72d2cb4d
Rejiggered entrances and shifted directions around.
Jeremy Thurgood <firxen@gmail.com>
parents:
197
diff
changeset
|
243 self.rejigger_entry_tile(tile) |
81
c8d6ca296884
Better level entry points.
Jeremy Thurgood <firxen@gmail.com>
parents:
71
diff
changeset
|
244 self.tiles.append(tile_row) |
c8d6ca296884
Better level entry points.
Jeremy Thurgood <firxen@gmail.com>
parents:
71
diff
changeset
|
245 if self.entry is None: |
c8d6ca296884
Better level entry points.
Jeremy Thurgood <firxen@gmail.com>
parents:
71
diff
changeset
|
246 raise InvalidMapError("Not enough entry points.") |
144
b292370c4548
Rearranged the orientation stuff. :-)
Jeremy Thurgood <firxen@gmail.com>
parents:
143
diff
changeset
|
247 self.set_tile_orientations() |
b292370c4548
Rearranged the orientation stuff. :-)
Jeremy Thurgood <firxen@gmail.com>
parents:
143
diff
changeset
|
248 |
199
986e72d2cb4d
Rejiggered entrances and shifted directions around.
Jeremy Thurgood <firxen@gmail.com>
parents:
197
diff
changeset
|
249 def rejigger_entry_tile(self, tile): |
986e72d2cb4d
Rejiggered entrances and shifted directions around.
Jeremy Thurgood <firxen@gmail.com>
parents:
197
diff
changeset
|
250 if self.entry is not None: |
986e72d2cb4d
Rejiggered entrances and shifted directions around.
Jeremy Thurgood <firxen@gmail.com>
parents:
197
diff
changeset
|
251 raise InvalidMapError("Too many entry points.") |
986e72d2cb4d
Rejiggered entrances and shifted directions around.
Jeremy Thurgood <firxen@gmail.com>
parents:
197
diff
changeset
|
252 self.entry = tile |
986e72d2cb4d
Rejiggered entrances and shifted directions around.
Jeremy Thurgood <firxen@gmail.com>
parents:
197
diff
changeset
|
253 direction = [] |
986e72d2cb4d
Rejiggered entrances and shifted directions around.
Jeremy Thurgood <firxen@gmail.com>
parents:
197
diff
changeset
|
254 x, y = tile.tile_pos |
986e72d2cb4d
Rejiggered entrances and shifted directions around.
Jeremy Thurgood <firxen@gmail.com>
parents:
197
diff
changeset
|
255 if x == 0: |
986e72d2cb4d
Rejiggered entrances and shifted directions around.
Jeremy Thurgood <firxen@gmail.com>
parents:
197
diff
changeset
|
256 direction.append(RIGHT) |
986e72d2cb4d
Rejiggered entrances and shifted directions around.
Jeremy Thurgood <firxen@gmail.com>
parents:
197
diff
changeset
|
257 elif x == self.tile_size[0] - 1: |
986e72d2cb4d
Rejiggered entrances and shifted directions around.
Jeremy Thurgood <firxen@gmail.com>
parents:
197
diff
changeset
|
258 direction.append(LEFT) |
986e72d2cb4d
Rejiggered entrances and shifted directions around.
Jeremy Thurgood <firxen@gmail.com>
parents:
197
diff
changeset
|
259 if y == 0: |
986e72d2cb4d
Rejiggered entrances and shifted directions around.
Jeremy Thurgood <firxen@gmail.com>
parents:
197
diff
changeset
|
260 direction.append(DOWN) |
986e72d2cb4d
Rejiggered entrances and shifted directions around.
Jeremy Thurgood <firxen@gmail.com>
parents:
197
diff
changeset
|
261 elif y == self.tile_size[1] - 1: |
986e72d2cb4d
Rejiggered entrances and shifted directions around.
Jeremy Thurgood <firxen@gmail.com>
parents:
197
diff
changeset
|
262 direction.append(UP) |
986e72d2cb4d
Rejiggered entrances and shifted directions around.
Jeremy Thurgood <firxen@gmail.com>
parents:
197
diff
changeset
|
263 if len(direction) < 1: |
986e72d2cb4d
Rejiggered entrances and shifted directions around.
Jeremy Thurgood <firxen@gmail.com>
parents:
197
diff
changeset
|
264 raise InvalidMapError("Entry point must be along an edge.") |
986e72d2cb4d
Rejiggered entrances and shifted directions around.
Jeremy Thurgood <firxen@gmail.com>
parents:
197
diff
changeset
|
265 if len(direction) > 1: |
986e72d2cb4d
Rejiggered entrances and shifted directions around.
Jeremy Thurgood <firxen@gmail.com>
parents:
197
diff
changeset
|
266 raise InvalidMapError("Entry point must not be on a corner.") |
986e72d2cb4d
Rejiggered entrances and shifted directions around.
Jeremy Thurgood <firxen@gmail.com>
parents:
197
diff
changeset
|
267 tile.set_direction(direction[0]) |
986e72d2cb4d
Rejiggered entrances and shifted directions around.
Jeremy Thurgood <firxen@gmail.com>
parents:
197
diff
changeset
|
268 |
144
b292370c4548
Rearranged the orientation stuff. :-)
Jeremy Thurgood <firxen@gmail.com>
parents:
143
diff
changeset
|
269 def set_tile_orientations(self): |
b292370c4548
Rearranged the orientation stuff. :-)
Jeremy Thurgood <firxen@gmail.com>
parents:
143
diff
changeset
|
270 tiles = [tile # This is a scary listcomp. It makes me happy. |
b292370c4548
Rearranged the orientation stuff. :-)
Jeremy Thurgood <firxen@gmail.com>
parents:
143
diff
changeset
|
271 for row in self.tiles |
b292370c4548
Rearranged the orientation stuff. :-)
Jeremy Thurgood <firxen@gmail.com>
parents:
143
diff
changeset
|
272 for tile in row |
b292370c4548
Rearranged the orientation stuff. :-)
Jeremy Thurgood <firxen@gmail.com>
parents:
143
diff
changeset
|
273 if tile is not None] |
b292370c4548
Rearranged the orientation stuff. :-)
Jeremy Thurgood <firxen@gmail.com>
parents:
143
diff
changeset
|
274 for tile in tiles: |
b292370c4548
Rearranged the orientation stuff. :-)
Jeremy Thurgood <firxen@gmail.com>
parents:
143
diff
changeset
|
275 orientation = self.get_tile_orientation(tile) |
b292370c4548
Rearranged the orientation stuff. :-)
Jeremy Thurgood <firxen@gmail.com>
parents:
143
diff
changeset
|
276 tile.use_variant(*orientation) |
81
c8d6ca296884
Better level entry points.
Jeremy Thurgood <firxen@gmail.com>
parents:
71
diff
changeset
|
277 |
230
e4f983b68ef5
Start of advanced sprite definitions.
Simon Cross <hodgestar@gmail.com>
parents:
220
diff
changeset
|
278 def setup_sprites(self, sprites_ascii): |
243 | 279 self.extra_sprites = {} |
256
9827ce469834
Add more validation exceptions to new map loading code. Handle trying to load when display hasn't been initiliased better
Neil Muller <drnlmuller@gmail.com>
parents:
253
diff
changeset
|
280 sprite_positions = [] |
230
e4f983b68ef5
Start of advanced sprite definitions.
Simon Cross <hodgestar@gmail.com>
parents:
220
diff
changeset
|
281 for sprite_ascii in sprites_ascii: |
342
868a53b96c29
Protect against malformed sprite lines
Neil Muller <drnlmuller@gmail.com>
parents:
331
diff
changeset
|
282 try: |
868a53b96c29
Protect against malformed sprite lines
Neil Muller <drnlmuller@gmail.com>
parents:
331
diff
changeset
|
283 pos, _sep, rest = sprite_ascii.partition(':') |
868a53b96c29
Protect against malformed sprite lines
Neil Muller <drnlmuller@gmail.com>
parents:
331
diff
changeset
|
284 except ValueError: |
868a53b96c29
Protect against malformed sprite lines
Neil Muller <drnlmuller@gmail.com>
parents:
331
diff
changeset
|
285 raise InvalidMapError('Unable to determine sprite position' |
868a53b96c29
Protect against malformed sprite lines
Neil Muller <drnlmuller@gmail.com>
parents:
331
diff
changeset
|
286 ' from line: %s' % sprite_ascii) |
256
9827ce469834
Add more validation exceptions to new map loading code. Handle trying to load when display hasn't been initiliased better
Neil Muller <drnlmuller@gmail.com>
parents:
253
diff
changeset
|
287 try: |
9827ce469834
Add more validation exceptions to new map loading code. Handle trying to load when display hasn't been initiliased better
Neil Muller <drnlmuller@gmail.com>
parents:
253
diff
changeset
|
288 pos = [int(x.strip()) for x in pos.split(',')] |
9827ce469834
Add more validation exceptions to new map loading code. Handle trying to load when display hasn't been initiliased better
Neil Muller <drnlmuller@gmail.com>
parents:
253
diff
changeset
|
289 except ValueError: |
9827ce469834
Add more validation exceptions to new map loading code. Handle trying to load when display hasn't been initiliased better
Neil Muller <drnlmuller@gmail.com>
parents:
253
diff
changeset
|
290 raise InvalidMapError("Sprite position must be two integers." |
9827ce469834
Add more validation exceptions to new map loading code. Handle trying to load when display hasn't been initiliased better
Neil Muller <drnlmuller@gmail.com>
parents:
253
diff
changeset
|
291 "Got %s" % pos) |
230
e4f983b68ef5
Start of advanced sprite definitions.
Simon Cross <hodgestar@gmail.com>
parents:
220
diff
changeset
|
292 class_name, rest = rest.split(None, 1) |
e4f983b68ef5
Start of advanced sprite definitions.
Simon Cross <hodgestar@gmail.com>
parents:
220
diff
changeset
|
293 args = rest.split() |
243 | 294 sprite_id, args = args[0], args[1:] |
256
9827ce469834
Add more validation exceptions to new map loading code. Handle trying to load when display hasn't been initiliased better
Neil Muller <drnlmuller@gmail.com>
parents:
253
diff
changeset
|
295 try: |
9827ce469834
Add more validation exceptions to new map loading code. Handle trying to load when display hasn't been initiliased better
Neil Muller <drnlmuller@gmail.com>
parents:
253
diff
changeset
|
296 cls = sprites.find_sprite(class_name) |
9827ce469834
Add more validation exceptions to new map loading code. Handle trying to load when display hasn't been initiliased better
Neil Muller <drnlmuller@gmail.com>
parents:
253
diff
changeset
|
297 except KeyError: |
9827ce469834
Add more validation exceptions to new map loading code. Handle trying to load when display hasn't been initiliased better
Neil Muller <drnlmuller@gmail.com>
parents:
253
diff
changeset
|
298 raise InvalidMapError("Unknown Sprite class: %s" % class_name) |
230
e4f983b68ef5
Start of advanced sprite definitions.
Simon Cross <hodgestar@gmail.com>
parents:
220
diff
changeset
|
299 sprite = cls(*args) |
256
9827ce469834
Add more validation exceptions to new map loading code. Handle trying to load when display hasn't been initiliased better
Neil Muller <drnlmuller@gmail.com>
parents:
253
diff
changeset
|
300 if pos in sprite_positions: |
9827ce469834
Add more validation exceptions to new map loading code. Handle trying to load when display hasn't been initiliased better
Neil Muller <drnlmuller@gmail.com>
parents:
253
diff
changeset
|
301 raise InvalidMapError('Multiple sprites at %s.' % pos) |
9827ce469834
Add more validation exceptions to new map loading code. Handle trying to load when display hasn't been initiliased better
Neil Muller <drnlmuller@gmail.com>
parents:
253
diff
changeset
|
302 sprite_positions.append(pos) |
230
e4f983b68ef5
Start of advanced sprite definitions.
Simon Cross <hodgestar@gmail.com>
parents:
220
diff
changeset
|
303 sprite.set_tile_pos(pos) |
256
9827ce469834
Add more validation exceptions to new map loading code. Handle trying to load when display hasn't been initiliased better
Neil Muller <drnlmuller@gmail.com>
parents:
253
diff
changeset
|
304 if sprite_id in self.extra_sprites: |
9827ce469834
Add more validation exceptions to new map loading code. Handle trying to load when display hasn't been initiliased better
Neil Muller <drnlmuller@gmail.com>
parents:
253
diff
changeset
|
305 raise InvalidMapError('Duplicate sprite id: %s.' % sprite_id) |
243 | 306 self.extra_sprites[sprite_id] = sprite |
230
e4f983b68ef5
Start of advanced sprite definitions.
Simon Cross <hodgestar@gmail.com>
parents:
220
diff
changeset
|
307 self.sprites.add(sprite) |
e4f983b68ef5
Start of advanced sprite definitions.
Simon Cross <hodgestar@gmail.com>
parents:
220
diff
changeset
|
308 |
123
915fd0ee28f5
Added test tile orientation
Gideon Visser <gideon@gideonvisser.com>
parents:
112
diff
changeset
|
309 def is_same_tile(self, tile, x, y): |
915fd0ee28f5
Added test tile orientation
Gideon Visser <gideon@gideonvisser.com>
parents:
112
diff
changeset
|
310 """Is there a tile of the same type?""" |
144
b292370c4548
Rearranged the orientation stuff. :-)
Jeremy Thurgood <firxen@gmail.com>
parents:
143
diff
changeset
|
311 if tile.tile_char is None: |
b292370c4548
Rearranged the orientation stuff. :-)
Jeremy Thurgood <firxen@gmail.com>
parents:
143
diff
changeset
|
312 # This isn't really a tile, so bail |
b292370c4548
Rearranged the orientation stuff. :-)
Jeremy Thurgood <firxen@gmail.com>
parents:
143
diff
changeset
|
313 return False |
123
915fd0ee28f5
Added test tile orientation
Gideon Visser <gideon@gideonvisser.com>
parents:
112
diff
changeset
|
314 try: |
144
b292370c4548
Rearranged the orientation stuff. :-)
Jeremy Thurgood <firxen@gmail.com>
parents:
143
diff
changeset
|
315 other_tile = self.tiles[y][x] |
b292370c4548
Rearranged the orientation stuff. :-)
Jeremy Thurgood <firxen@gmail.com>
parents:
143
diff
changeset
|
316 except IndexError: |
b292370c4548
Rearranged the orientation stuff. :-)
Jeremy Thurgood <firxen@gmail.com>
parents:
143
diff
changeset
|
317 # We're over the edge of the map |
b292370c4548
Rearranged the orientation stuff. :-)
Jeremy Thurgood <firxen@gmail.com>
parents:
143
diff
changeset
|
318 return False |
b292370c4548
Rearranged the orientation stuff. :-)
Jeremy Thurgood <firxen@gmail.com>
parents:
143
diff
changeset
|
319 if other_tile is None: |
b292370c4548
Rearranged the orientation stuff. :-)
Jeremy Thurgood <firxen@gmail.com>
parents:
143
diff
changeset
|
320 # Emptiness. |
b292370c4548
Rearranged the orientation stuff. :-)
Jeremy Thurgood <firxen@gmail.com>
parents:
143
diff
changeset
|
321 return False |
b292370c4548
Rearranged the orientation stuff. :-)
Jeremy Thurgood <firxen@gmail.com>
parents:
143
diff
changeset
|
322 return tile.tile_char == other_tile.tile_char |
123
915fd0ee28f5
Added test tile orientation
Gideon Visser <gideon@gideonvisser.com>
parents:
112
diff
changeset
|
323 |
144
b292370c4548
Rearranged the orientation stuff. :-)
Jeremy Thurgood <firxen@gmail.com>
parents:
143
diff
changeset
|
324 def get_tile_orientation(self, tile): |
b292370c4548
Rearranged the orientation stuff. :-)
Jeremy Thurgood <firxen@gmail.com>
parents:
143
diff
changeset
|
325 if tile is None: |
b292370c4548
Rearranged the orientation stuff. :-)
Jeremy Thurgood <firxen@gmail.com>
parents:
143
diff
changeset
|
326 return (False, False, False, False) |
b292370c4548
Rearranged the orientation stuff. :-)
Jeremy Thurgood <firxen@gmail.com>
parents:
143
diff
changeset
|
327 map_x, map_y = tile.tile_pos |
b292370c4548
Rearranged the orientation stuff. :-)
Jeremy Thurgood <firxen@gmail.com>
parents:
143
diff
changeset
|
328 return ( |
b292370c4548
Rearranged the orientation stuff. :-)
Jeremy Thurgood <firxen@gmail.com>
parents:
143
diff
changeset
|
329 self.is_same_tile(tile, map_x, map_y - 1), # above |
b292370c4548
Rearranged the orientation stuff. :-)
Jeremy Thurgood <firxen@gmail.com>
parents:
143
diff
changeset
|
330 self.is_same_tile(tile, map_x, map_y + 1), # below |
b292370c4548
Rearranged the orientation stuff. :-)
Jeremy Thurgood <firxen@gmail.com>
parents:
143
diff
changeset
|
331 self.is_same_tile(tile, map_x - 1, map_y), # left |
b292370c4548
Rearranged the orientation stuff. :-)
Jeremy Thurgood <firxen@gmail.com>
parents:
143
diff
changeset
|
332 self.is_same_tile(tile, map_x + 1, map_y), # right |
b292370c4548
Rearranged the orientation stuff. :-)
Jeremy Thurgood <firxen@gmail.com>
parents:
143
diff
changeset
|
333 ) |
123
915fd0ee28f5
Added test tile orientation
Gideon Visser <gideon@gideonvisser.com>
parents:
112
diff
changeset
|
334 |
71
58557a89ec86
Some tile improvements and stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
57
diff
changeset
|
335 def get_tile_size(self): |
84 | 336 return self.tile_size |
21
f76c3f033772
Release early, release broken. Level stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
8
diff
changeset
|
337 |
f76c3f033772
Release early, release broken. Level stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
8
diff
changeset
|
338 def get_size(self): |
71
58557a89ec86
Some tile improvements and stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
57
diff
changeset
|
339 x, y = self.get_tile_size() |
162
7fbbe27120a9
Rodents! Amphibians! Import juggling!
Jeremy Thurgood <firxen@gmail.com>
parents:
146
diff
changeset
|
340 return sprites.tile_sizify((x, y)) |
71
58557a89ec86
Some tile improvements and stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
57
diff
changeset
|
341 |
58557a89ec86
Some tile improvements and stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
57
diff
changeset
|
342 def make_background(self): |
259
8d9424909118
Fix test of whether pygame.display is initialized.
Simon Cross <hodgestar@gmail.com>
parents:
256
diff
changeset
|
343 if not pygame.display.get_init(): |
256
9827ce469834
Add more validation exceptions to new map loading code. Handle trying to load when display hasn't been initiliased better
Neil Muller <drnlmuller@gmail.com>
parents:
253
diff
changeset
|
344 # Skip if we're not actuallt in pygame |
9827ce469834
Add more validation exceptions to new map loading code. Handle trying to load when display hasn't been initiliased better
Neil Muller <drnlmuller@gmail.com>
parents:
253
diff
changeset
|
345 return |
71
58557a89ec86
Some tile improvements and stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
57
diff
changeset
|
346 sx, sy = self.get_tile_size() |
58557a89ec86
Some tile improvements and stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
57
diff
changeset
|
347 self.background = Surface(self.get_size()) |
162
7fbbe27120a9
Rodents! Amphibians! Import juggling!
Jeremy Thurgood <firxen@gmail.com>
parents:
146
diff
changeset
|
348 [self.background.blit(self.tileset.floor, sprites.tile_sizify((x, y))) |
71
58557a89ec86
Some tile improvements and stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
57
diff
changeset
|
349 for x in range(sx) for y in range(sy)] |
81
c8d6ca296884
Better level entry points.
Jeremy Thurgood <firxen@gmail.com>
parents:
71
diff
changeset
|
350 |
c8d6ca296884
Better level entry points.
Jeremy Thurgood <firxen@gmail.com>
parents:
71
diff
changeset
|
351 def get_entry(self): |
c8d6ca296884
Better level entry points.
Jeremy Thurgood <firxen@gmail.com>
parents:
71
diff
changeset
|
352 return (self.entry.tile_pos, self.entry.direction) |
110 | 353 |
354 def draw(self, surface): | |
112
62a705f4e876
Blit the background onto the screen, not the screen onto the background.
Simon Cross <hodgestar@gmail.com>
parents:
110
diff
changeset
|
355 surface.blit(self.background, (0, 0)) |
110 | 356 self.sprites.draw(surface) |
173
71911af9d42d
Refactor drawing code. Correct tile variants when painting
Neil Muller <drnlmuller@gmail.com>
parents:
169
diff
changeset
|
357 |
71911af9d42d
Refactor drawing code. Correct tile variants when painting
Neil Muller <drnlmuller@gmail.com>
parents:
169
diff
changeset
|
358 def get_tile(self, tile_pos): |
71911af9d42d
Refactor drawing code. Correct tile variants when painting
Neil Muller <drnlmuller@gmail.com>
parents:
169
diff
changeset
|
359 x, y = tile_pos |
71911af9d42d
Refactor drawing code. Correct tile variants when painting
Neil Muller <drnlmuller@gmail.com>
parents:
169
diff
changeset
|
360 if 0 <= x < self.tile_size[0] and 0 <= y < self.tile_size[1]: |
71911af9d42d
Refactor drawing code. Correct tile variants when painting
Neil Muller <drnlmuller@gmail.com>
parents:
169
diff
changeset
|
361 return self.tiles[y][x] |
71911af9d42d
Refactor drawing code. Correct tile variants when painting
Neil Muller <drnlmuller@gmail.com>
parents:
169
diff
changeset
|
362 return None |
71911af9d42d
Refactor drawing code. Correct tile variants when painting
Neil Muller <drnlmuller@gmail.com>
parents:
169
diff
changeset
|
363 |
71911af9d42d
Refactor drawing code. Correct tile variants when painting
Neil Muller <drnlmuller@gmail.com>
parents:
169
diff
changeset
|
364 def replace_tile(self, tile_pos, new_tile_char): |
71911af9d42d
Refactor drawing code. Correct tile variants when painting
Neil Muller <drnlmuller@gmail.com>
parents:
169
diff
changeset
|
365 x, y = tile_pos |
71911af9d42d
Refactor drawing code. Correct tile variants when painting
Neil Muller <drnlmuller@gmail.com>
parents:
169
diff
changeset
|
366 old_tile = self.tiles[y][x] |
71911af9d42d
Refactor drawing code. Correct tile variants when painting
Neil Muller <drnlmuller@gmail.com>
parents:
169
diff
changeset
|
367 if old_tile is not None: |
71911af9d42d
Refactor drawing code. Correct tile variants when painting
Neil Muller <drnlmuller@gmail.com>
parents:
169
diff
changeset
|
368 old_tile.remove(self.sprites) |
71911af9d42d
Refactor drawing code. Correct tile variants when painting
Neil Muller <drnlmuller@gmail.com>
parents:
169
diff
changeset
|
369 new_tile = self.tileset.get_tile(new_tile_char, tile_pos, self.sprites) |
71911af9d42d
Refactor drawing code. Correct tile variants when painting
Neil Muller <drnlmuller@gmail.com>
parents:
169
diff
changeset
|
370 self.tiles[y][x] = new_tile |
71911af9d42d
Refactor drawing code. Correct tile variants when painting
Neil Muller <drnlmuller@gmail.com>
parents:
169
diff
changeset
|
371 # Fix orientations |
71911af9d42d
Refactor drawing code. Correct tile variants when painting
Neil Muller <drnlmuller@gmail.com>
parents:
169
diff
changeset
|
372 tiles = [self.get_tile((x + dx, y + dy)) for dx in (-1, 0, 1) |
71911af9d42d
Refactor drawing code. Correct tile variants when painting
Neil Muller <drnlmuller@gmail.com>
parents:
169
diff
changeset
|
373 for dy in (-1, 0, 1)] |
71911af9d42d
Refactor drawing code. Correct tile variants when painting
Neil Muller <drnlmuller@gmail.com>
parents:
169
diff
changeset
|
374 for tile in tiles: |
71911af9d42d
Refactor drawing code. Correct tile variants when painting
Neil Muller <drnlmuller@gmail.com>
parents:
169
diff
changeset
|
375 if tile: |
71911af9d42d
Refactor drawing code. Correct tile variants when painting
Neil Muller <drnlmuller@gmail.com>
parents:
169
diff
changeset
|
376 orientation = self.get_tile_orientation(tile) |
71911af9d42d
Refactor drawing code. Correct tile variants when painting
Neil Muller <drnlmuller@gmail.com>
parents:
169
diff
changeset
|
377 tile.use_variant(*orientation) |
186 | 378 |
248
de3b4048e54a
Hook up tile arrow rotation
Stefano Rivera <stefano@rivera.za.net>
parents:
247
diff
changeset
|
379 def flip_arrows(self): |
de3b4048e54a
Hook up tile arrow rotation
Stefano Rivera <stefano@rivera.za.net>
parents:
247
diff
changeset
|
380 for row in self.tiles: |
de3b4048e54a
Hook up tile arrow rotation
Stefano Rivera <stefano@rivera.za.net>
parents:
247
diff
changeset
|
381 for tile in row: |
de3b4048e54a
Hook up tile arrow rotation
Stefano Rivera <stefano@rivera.za.net>
parents:
247
diff
changeset
|
382 if isinstance(tile, sprites.ArrowSprite): |
de3b4048e54a
Hook up tile arrow rotation
Stefano Rivera <stefano@rivera.za.net>
parents:
247
diff
changeset
|
383 tile.rotate() |
de3b4048e54a
Hook up tile arrow rotation
Stefano Rivera <stefano@rivera.za.net>
parents:
247
diff
changeset
|
384 |
186 | 385 def restart(self): |
386 """Reset the level state""" | |
230
e4f983b68ef5
Start of advanced sprite definitions.
Simon Cross <hodgestar@gmail.com>
parents:
220
diff
changeset
|
387 self.setup_level(self.tiles_ascii, self.sprites_ascii) |
186 | 388 self.make_background() |
343
5bf35267ddc0
Hook up sprite deletion. Framework work for sprite editing & adding
Neil Muller <drnlmuller@gmail.com>
parents:
342
diff
changeset
|
389 |
5bf35267ddc0
Hook up sprite deletion. Framework work for sprite editing & adding
Neil Muller <drnlmuller@gmail.com>
parents:
342
diff
changeset
|
390 def get_sprite_at(self, sprite_pos): |
5bf35267ddc0
Hook up sprite deletion. Framework work for sprite editing & adding
Neil Muller <drnlmuller@gmail.com>
parents:
342
diff
changeset
|
391 """Return the sprite line at the given pos, or none if it doesn't |
5bf35267ddc0
Hook up sprite deletion. Framework work for sprite editing & adding
Neil Muller <drnlmuller@gmail.com>
parents:
342
diff
changeset
|
392 exist""" |
5bf35267ddc0
Hook up sprite deletion. Framework work for sprite editing & adding
Neil Muller <drnlmuller@gmail.com>
parents:
342
diff
changeset
|
393 for sprite_ascii in self.sprites_ascii: |
5bf35267ddc0
Hook up sprite deletion. Framework work for sprite editing & adding
Neil Muller <drnlmuller@gmail.com>
parents:
342
diff
changeset
|
394 try: |
352
abd9a2ceadb7
Fix and extend sprite fiddling code
Neil Muller <drnlmuller@gmail.com>
parents:
343
diff
changeset
|
395 pos, _, rest = sprite_ascii.partition(':') |
343
5bf35267ddc0
Hook up sprite deletion. Framework work for sprite editing & adding
Neil Muller <drnlmuller@gmail.com>
parents:
342
diff
changeset
|
396 pos = [int(x.strip()) for x in pos.split(',')] |
5bf35267ddc0
Hook up sprite deletion. Framework work for sprite editing & adding
Neil Muller <drnlmuller@gmail.com>
parents:
342
diff
changeset
|
397 except ValueError: |
5bf35267ddc0
Hook up sprite deletion. Framework work for sprite editing & adding
Neil Muller <drnlmuller@gmail.com>
parents:
342
diff
changeset
|
398 continue |
5bf35267ddc0
Hook up sprite deletion. Framework work for sprite editing & adding
Neil Muller <drnlmuller@gmail.com>
parents:
342
diff
changeset
|
399 if pos[0] == sprite_pos[0] and pos[1] == sprite_pos[1]: |
508
6c61d5862310
Massive speical sprite editor rewrite
Neil Muller <drnlmuller@gmail.com>
parents:
489
diff
changeset
|
400 pos, _sep, rest = sprite_ascii.partition(':') |
6c61d5862310
Massive speical sprite editor rewrite
Neil Muller <drnlmuller@gmail.com>
parents:
489
diff
changeset
|
401 class_name, rest = rest.split(None, 1) |
6c61d5862310
Massive speical sprite editor rewrite
Neil Muller <drnlmuller@gmail.com>
parents:
489
diff
changeset
|
402 args = rest.split() |
6c61d5862310
Massive speical sprite editor rewrite
Neil Muller <drnlmuller@gmail.com>
parents:
489
diff
changeset
|
403 sprite_cls = sprites.find_sprite(class_name) |
6c61d5862310
Massive speical sprite editor rewrite
Neil Muller <drnlmuller@gmail.com>
parents:
489
diff
changeset
|
404 sprite_id, args = args[0], args[1:] |
6c61d5862310
Massive speical sprite editor rewrite
Neil Muller <drnlmuller@gmail.com>
parents:
489
diff
changeset
|
405 return (class_name, sprite_cls, sprite_id, args), sprite_ascii |
6c61d5862310
Massive speical sprite editor rewrite
Neil Muller <drnlmuller@gmail.com>
parents:
489
diff
changeset
|
406 return None, None |
343
5bf35267ddc0
Hook up sprite deletion. Framework work for sprite editing & adding
Neil Muller <drnlmuller@gmail.com>
parents:
342
diff
changeset
|
407 |
5bf35267ddc0
Hook up sprite deletion. Framework work for sprite editing & adding
Neil Muller <drnlmuller@gmail.com>
parents:
342
diff
changeset
|
408 def remove_sprite(self, sprite): |
5bf35267ddc0
Hook up sprite deletion. Framework work for sprite editing & adding
Neil Muller <drnlmuller@gmail.com>
parents:
342
diff
changeset
|
409 """Remove the given sprite line from the list of sprites""" |
5bf35267ddc0
Hook up sprite deletion. Framework work for sprite editing & adding
Neil Muller <drnlmuller@gmail.com>
parents:
342
diff
changeset
|
410 self.sprites_ascii.remove(sprite) |
5bf35267ddc0
Hook up sprite deletion. Framework work for sprite editing & adding
Neil Muller <drnlmuller@gmail.com>
parents:
342
diff
changeset
|
411 |
5bf35267ddc0
Hook up sprite deletion. Framework work for sprite editing & adding
Neil Muller <drnlmuller@gmail.com>
parents:
342
diff
changeset
|
412 def validate_sprite(self, sprite): |
5bf35267ddc0
Hook up sprite deletion. Framework work for sprite editing & adding
Neil Muller <drnlmuller@gmail.com>
parents:
342
diff
changeset
|
413 """Check that the sprite line is valid""" |
352
abd9a2ceadb7
Fix and extend sprite fiddling code
Neil Muller <drnlmuller@gmail.com>
parents:
343
diff
changeset
|
414 try: |
abd9a2ceadb7
Fix and extend sprite fiddling code
Neil Muller <drnlmuller@gmail.com>
parents:
343
diff
changeset
|
415 pos, _sep, rest = sprite.partition(':') |
abd9a2ceadb7
Fix and extend sprite fiddling code
Neil Muller <drnlmuller@gmail.com>
parents:
343
diff
changeset
|
416 pos = [int(x.strip()) for x in pos.split(',')] |
abd9a2ceadb7
Fix and extend sprite fiddling code
Neil Muller <drnlmuller@gmail.com>
parents:
343
diff
changeset
|
417 class_name, rest = rest.split(None, 1) |
abd9a2ceadb7
Fix and extend sprite fiddling code
Neil Muller <drnlmuller@gmail.com>
parents:
343
diff
changeset
|
418 args = rest.split() |
abd9a2ceadb7
Fix and extend sprite fiddling code
Neil Muller <drnlmuller@gmail.com>
parents:
343
diff
changeset
|
419 except ValueError: |
abd9a2ceadb7
Fix and extend sprite fiddling code
Neil Muller <drnlmuller@gmail.com>
parents:
343
diff
changeset
|
420 raise InvalidMapError('Unable to determine sprite parameters.') |
343
5bf35267ddc0
Hook up sprite deletion. Framework work for sprite editing & adding
Neil Muller <drnlmuller@gmail.com>
parents:
342
diff
changeset
|
421 sprite_id, args = args[0], args[1:] |
5bf35267ddc0
Hook up sprite deletion. Framework work for sprite editing & adding
Neil Muller <drnlmuller@gmail.com>
parents:
342
diff
changeset
|
422 try: |
5bf35267ddc0
Hook up sprite deletion. Framework work for sprite editing & adding
Neil Muller <drnlmuller@gmail.com>
parents:
342
diff
changeset
|
423 cls = sprites.find_sprite(class_name) |
5bf35267ddc0
Hook up sprite deletion. Framework work for sprite editing & adding
Neil Muller <drnlmuller@gmail.com>
parents:
342
diff
changeset
|
424 except KeyError: |
5bf35267ddc0
Hook up sprite deletion. Framework work for sprite editing & adding
Neil Muller <drnlmuller@gmail.com>
parents:
342
diff
changeset
|
425 raise InvalidMapError("Unknown Sprite class: %s" % class_name) |
5bf35267ddc0
Hook up sprite deletion. Framework work for sprite editing & adding
Neil Muller <drnlmuller@gmail.com>
parents:
342
diff
changeset
|
426 sprite = cls(*args) |
5bf35267ddc0
Hook up sprite deletion. Framework work for sprite editing & adding
Neil Muller <drnlmuller@gmail.com>
parents:
342
diff
changeset
|
427 if sprite_id in self.extra_sprites: |
5bf35267ddc0
Hook up sprite deletion. Framework work for sprite editing & adding
Neil Muller <drnlmuller@gmail.com>
parents:
342
diff
changeset
|
428 # Check that duplicate id is not at the same position |
352
abd9a2ceadb7
Fix and extend sprite fiddling code
Neil Muller <drnlmuller@gmail.com>
parents:
343
diff
changeset
|
429 if self.extra_sprites[sprite_id].tile_pos != pos: |
343
5bf35267ddc0
Hook up sprite deletion. Framework work for sprite editing & adding
Neil Muller <drnlmuller@gmail.com>
parents:
342
diff
changeset
|
430 raise InvalidMapError('Duplicate sprite id: %s.' % sprite_id) |
352
abd9a2ceadb7
Fix and extend sprite fiddling code
Neil Muller <drnlmuller@gmail.com>
parents:
343
diff
changeset
|
431 |
abd9a2ceadb7
Fix and extend sprite fiddling code
Neil Muller <drnlmuller@gmail.com>
parents:
343
diff
changeset
|
432 def add_sprite(self, sprite): |
abd9a2ceadb7
Fix and extend sprite fiddling code
Neil Muller <drnlmuller@gmail.com>
parents:
343
diff
changeset
|
433 self.sprites_ascii.append(sprite) |
abd9a2ceadb7
Fix and extend sprite fiddling code
Neil Muller <drnlmuller@gmail.com>
parents:
343
diff
changeset
|
434 |
508
6c61d5862310
Massive speical sprite editor rewrite
Neil Muller <drnlmuller@gmail.com>
parents:
489
diff
changeset
|
435 def replace_sprite(self, new_ascii): |
352
abd9a2ceadb7
Fix and extend sprite fiddling code
Neil Muller <drnlmuller@gmail.com>
parents:
343
diff
changeset
|
436 # Need to find the sprite at the same psoition |
508
6c61d5862310
Massive speical sprite editor rewrite
Neil Muller <drnlmuller@gmail.com>
parents:
489
diff
changeset
|
437 pos, _sep, rest = new_ascii.partition(':') |
352
abd9a2ceadb7
Fix and extend sprite fiddling code
Neil Muller <drnlmuller@gmail.com>
parents:
343
diff
changeset
|
438 pos = [int(x.strip()) for x in pos.split(',')] |
508
6c61d5862310
Massive speical sprite editor rewrite
Neil Muller <drnlmuller@gmail.com>
parents:
489
diff
changeset
|
439 old_sprite, old_ascii = self.get_sprite_at(pos) |
6c61d5862310
Massive speical sprite editor rewrite
Neil Muller <drnlmuller@gmail.com>
parents:
489
diff
changeset
|
440 self.sprites_ascii.remove(old_ascii) |
6c61d5862310
Massive speical sprite editor rewrite
Neil Muller <drnlmuller@gmail.com>
parents:
489
diff
changeset
|
441 self.sprites_ascii.append(new_ascii) |