Mercurial > mamba
annotate mamba/level.py @ 248:de3b4048e54a
Hook up tile arrow rotation
author | Stefano Rivera <stefano@rivera.za.net> |
---|---|
date | Thu, 15 Sep 2011 00:40:30 +0200 |
parents | 8e9fcdf98a6b |
children | cb68024bdd35 |
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 |
71
58557a89ec86
Some tile improvements and stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
57
diff
changeset
|
5 from pygame.surface import Surface |
50 | 6 from pygame.sprite import RenderUpdates |
8
66ae99f6903e
First stab at tile/level stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
7 |
199
986e72d2cb4d
Rejiggered entrances and shifted directions around.
Jeremy Thurgood <firxen@gmail.com>
parents:
197
diff
changeset
|
8 from mamba.constants import UP, DOWN, LEFT, RIGHT |
50 | 9 from mamba.data import load_file |
162
7fbbe27120a9
Rodents! Amphibians! Import juggling!
Jeremy Thurgood <firxen@gmail.com>
parents:
146
diff
changeset
|
10 from mamba import sprites |
31
67218082cdbb
More level non-functionality.
Jeremy Thurgood <firxen@gmail.com>
parents:
21
diff
changeset
|
11 |
21
f76c3f033772
Release early, release broken. Level stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
8
diff
changeset
|
12 |
81
c8d6ca296884
Better level entry points.
Jeremy Thurgood <firxen@gmail.com>
parents:
71
diff
changeset
|
13 class InvalidMapError(Exception): |
c8d6ca296884
Better level entry points.
Jeremy Thurgood <firxen@gmail.com>
parents:
71
diff
changeset
|
14 pass |
c8d6ca296884
Better level entry points.
Jeremy Thurgood <firxen@gmail.com>
parents:
71
diff
changeset
|
15 |
c8d6ca296884
Better level entry points.
Jeremy Thurgood <firxen@gmail.com>
parents:
71
diff
changeset
|
16 |
104 | 17 def mktile(cls, **kw): |
18 return (cls, kw) | |
19 | |
20 | |
37 | 21 TILE_MAP = { |
22 '.': None, | |
169 | 23 'X': mktile(sprites.TileSprite, image_name='wall', name='wall', |
24 solid=True), | |
231
bf7bf54ed6ff
Because every lab needs a biohazard warning sign or three.
Jeremy Thurgood <firxen@gmail.com>
parents:
230
diff
changeset
|
25 '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
|
26 solid=True), |
162
7fbbe27120a9
Rodents! Amphibians! Import juggling!
Jeremy Thurgood <firxen@gmail.com>
parents:
146
diff
changeset
|
27 'R': mktile(sprites.DoorSprite, colour='red'), |
7fbbe27120a9
Rodents! Amphibians! Import juggling!
Jeremy Thurgood <firxen@gmail.com>
parents:
146
diff
changeset
|
28 'B': mktile(sprites.DoorSprite, colour='blue'), |
220
066198428ee9
added yellow things
Adrianna Pińska <adrianna.pinska@gmail.com>
parents:
199
diff
changeset
|
29 'Y': mktile(sprites.DoorSprite, colour='yellow'), |
199
986e72d2cb4d
Rejiggered entrances and shifted directions around.
Jeremy Thurgood <firxen@gmail.com>
parents:
197
diff
changeset
|
30 'e': mktile(sprites.EntrySprite), |
162
7fbbe27120a9
Rodents! Amphibians! Import juggling!
Jeremy Thurgood <firxen@gmail.com>
parents:
146
diff
changeset
|
31 'E': mktile(sprites.ExitSprite), |
7fbbe27120a9
Rodents! Amphibians! Import juggling!
Jeremy Thurgood <firxen@gmail.com>
parents:
146
diff
changeset
|
32 '~': mktile(sprites.PuddleSprite), |
238
f00f6006cb5d
named paint tiles
Adrianna Pińska <adrianna.pinska@gmail.com>
parents:
234
diff
changeset
|
33 'r': mktile(sprites.Painter, colour='red', name='paint'), |
f00f6006cb5d
named paint tiles
Adrianna Pińska <adrianna.pinska@gmail.com>
parents:
234
diff
changeset
|
34 'b': mktile(sprites.Painter, colour='blue', name='paint'), |
f00f6006cb5d
named paint tiles
Adrianna Pińska <adrianna.pinska@gmail.com>
parents:
234
diff
changeset
|
35 'y': mktile(sprites.Painter, colour='yellow', name='paint'), |
234 | 36 '^': mktile(sprites.ArrowSprite, direction=UP), |
37 'v': mktile(sprites.ArrowSprite, direction=DOWN), | |
38 '<': mktile(sprites.ArrowSprite, direction=LEFT), | |
39 '>': mktile(sprites.ArrowSprite, direction=RIGHT), | |
248
de3b4048e54a
Hook up tile arrow rotation
Stefano Rivera <stefano@rivera.za.net>
parents:
247
diff
changeset
|
40 '@': mktile(sprites.FlipArrows), |
37 | 41 } |
42 | |
43 THING_MAP = { | |
165
0b2f2627a0ac
moved animals to common
Adrianna Pińska <adrianna.pinska@gmail.com>
parents:
163
diff
changeset
|
44 'M': mktile(sprites.BigMouse), |
0b2f2627a0ac
moved animals to common
Adrianna Pińska <adrianna.pinska@gmail.com>
parents:
163
diff
changeset
|
45 'm': mktile(sprites.SmallMouse), |
0b2f2627a0ac
moved animals to common
Adrianna Pińska <adrianna.pinska@gmail.com>
parents:
163
diff
changeset
|
46 'f': mktile(sprites.Frog), |
37 | 47 } |
48 | |
49 | |
8
66ae99f6903e
First stab at tile/level stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
50 class Tileset(object): |
66ae99f6903e
First stab at tile/level stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
51 def __init__(self, tileset_name): |
66ae99f6903e
First stab at tile/level stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
52 self.name = tileset_name |
31
67218082cdbb
More level non-functionality.
Jeremy Thurgood <firxen@gmail.com>
parents:
21
diff
changeset
|
53 self.load_tiles() |
8
66ae99f6903e
First stab at tile/level stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
54 |
66ae99f6903e
First stab at tile/level stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
55 def load_tiles(self): |
31
67218082cdbb
More level non-functionality.
Jeremy Thurgood <firxen@gmail.com>
parents:
21
diff
changeset
|
56 self.tiles = {} |
163
41e8d4ce3af2
TileSprites are less magic.
Jeremy Thurgood <firxen@gmail.com>
parents:
162
diff
changeset
|
57 self.floor = sprites.TileSprite('.', tileset=self.name, |
162
7fbbe27120a9
Rodents! Amphibians! Import juggling!
Jeremy Thurgood <firxen@gmail.com>
parents:
146
diff
changeset
|
58 image_name='floor').image |
50 | 59 for name, value in TILE_MAP.items(): |
60 if value is not None: | |
104 | 61 value[1]['tileset'] = self.name |
50 | 62 self.tiles[name] = value |
63 self.tiles.update(THING_MAP) | |
8
66ae99f6903e
First stab at tile/level stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
64 |
66ae99f6903e
First stab at tile/level stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
65 def __getitem__(self, key): |
84 | 66 try: |
67 tilespec = self.tiles[key] | |
68 except KeyError: | |
69 raise InvalidMapError("Unknown tile type: '%s'" % key) | |
50 | 70 if not tilespec: |
71 return None | |
105
87acd3ddc972
Tell sprites what their tile char is.
Jeremy Thurgood <firxen@gmail.com>
parents:
104
diff
changeset
|
72 cls, params = tilespec |
87acd3ddc972
Tell sprites what their tile char is.
Jeremy Thurgood <firxen@gmail.com>
parents:
104
diff
changeset
|
73 params['tile_char'] = key |
87acd3ddc972
Tell sprites what their tile char is.
Jeremy Thurgood <firxen@gmail.com>
parents:
104
diff
changeset
|
74 return cls(**params) |
31
67218082cdbb
More level non-functionality.
Jeremy Thurgood <firxen@gmail.com>
parents:
21
diff
changeset
|
75 |
50 | 76 def get_tile(self, key, tile_pos, *groups): |
31
67218082cdbb
More level non-functionality.
Jeremy Thurgood <firxen@gmail.com>
parents:
21
diff
changeset
|
77 tile = self[key] |
50 | 78 if tile: |
79 tile.add(*groups) | |
80 tile.set_tile_pos(tile_pos) | |
31
67218082cdbb
More level non-functionality.
Jeremy Thurgood <firxen@gmail.com>
parents:
21
diff
changeset
|
81 return tile |
8
66ae99f6903e
First stab at tile/level stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
82 |
66ae99f6903e
First stab at tile/level stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
83 |
66ae99f6903e
First stab at tile/level stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
84 class Level(object): |
66ae99f6903e
First stab at tile/level stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
85 def __init__(self, level_name): |
66ae99f6903e
First stab at tile/level stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
86 self.level_name = level_name |
66ae99f6903e
First stab at tile/level stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
87 self.load_level_data() |
66ae99f6903e
First stab at tile/level stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
88 |
66ae99f6903e
First stab at tile/level stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
89 def load_level_data(self): |
66ae99f6903e
First stab at tile/level stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
90 """ |
31
67218082cdbb
More level non-functionality.
Jeremy Thurgood <firxen@gmail.com>
parents:
21
diff
changeset
|
91 This file format is potentially yucky. |
8
66ae99f6903e
First stab at tile/level stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
92 """ |
66ae99f6903e
First stab at tile/level stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
93 level_data = load_file('levels/%s.txt' % (self.level_name,)) |
136
00ada2e29798
Somewhat better (but still hideous) image variant support.
Jeremy Thurgood <firxen@gmail.com>
parents:
132
diff
changeset
|
94 self.name = level_data.readline().strip() |
31
67218082cdbb
More level non-functionality.
Jeremy Thurgood <firxen@gmail.com>
parents:
21
diff
changeset
|
95 tileset_name = level_data.readline().strip() |
21
f76c3f033772
Release early, release broken. Level stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
8
diff
changeset
|
96 self.tileset = Tileset(tileset_name) |
84 | 97 tiles_ascii = [line.strip() for line in level_data.readlines()] |
230
e4f983b68ef5
Start of advanced sprite definitions.
Simon Cross <hodgestar@gmail.com>
parents:
220
diff
changeset
|
98 end = tiles_ascii.index("end") |
e4f983b68ef5
Start of advanced sprite definitions.
Simon Cross <hodgestar@gmail.com>
parents:
220
diff
changeset
|
99 sprites_ascii = tiles_ascii[end + 1:] |
e4f983b68ef5
Start of advanced sprite definitions.
Simon Cross <hodgestar@gmail.com>
parents:
220
diff
changeset
|
100 tiles_ascii = tiles_ascii[:end] |
123
915fd0ee28f5
Added test tile orientation
Gideon Visser <gideon@gideonvisser.com>
parents:
112
diff
changeset
|
101 self.tiles_ascii = tiles_ascii |
230
e4f983b68ef5
Start of advanced sprite definitions.
Simon Cross <hodgestar@gmail.com>
parents:
220
diff
changeset
|
102 self.sprites_ascii = sprites_ascii |
e4f983b68ef5
Start of advanced sprite definitions.
Simon Cross <hodgestar@gmail.com>
parents:
220
diff
changeset
|
103 self.setup_level(tiles_ascii, sprites_ascii) |
71
58557a89ec86
Some tile improvements and stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
57
diff
changeset
|
104 self.make_background() |
58557a89ec86
Some tile improvements and stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
57
diff
changeset
|
105 |
174 | 106 def save_level(self): |
107 """Save the current state of the level""" | |
108 save_file = load_file('levels/%s.txt' % (self.level_name,), 'wb') | |
109 save_file.write('%s\n' % self.name) | |
110 save_file.write('%s\n' % self.tileset.name) | |
111 for tile_row in self.tiles: | |
112 for tile in tile_row: | |
113 if tile: | |
114 save_file.write(tile.tile_char) | |
115 else: | |
116 save_file.write('.') | |
117 save_file.write('\n') | |
230
e4f983b68ef5
Start of advanced sprite definitions.
Simon Cross <hodgestar@gmail.com>
parents:
220
diff
changeset
|
118 save_file.write('end\n') |
e4f983b68ef5
Start of advanced sprite definitions.
Simon Cross <hodgestar@gmail.com>
parents:
220
diff
changeset
|
119 for sprite_ascii in self.sprites_ascii: |
247
8e9fcdf98a6b
Fix saving sprite ascii data.
Simon Cross <hodgestar@gmail.com>
parents:
243
diff
changeset
|
120 save_file.write('%s\n' % sprite_ascii) |
230
e4f983b68ef5
Start of advanced sprite definitions.
Simon Cross <hodgestar@gmail.com>
parents:
220
diff
changeset
|
121 |
e4f983b68ef5
Start of advanced sprite definitions.
Simon Cross <hodgestar@gmail.com>
parents:
220
diff
changeset
|
122 def setup_level(self, tiles_ascii, sprites_ascii): |
e4f983b68ef5
Start of advanced sprite definitions.
Simon Cross <hodgestar@gmail.com>
parents:
220
diff
changeset
|
123 self.sprites = RenderUpdates() |
e4f983b68ef5
Start of advanced sprite definitions.
Simon Cross <hodgestar@gmail.com>
parents:
220
diff
changeset
|
124 self.setup_tiles(tiles_ascii) |
e4f983b68ef5
Start of advanced sprite definitions.
Simon Cross <hodgestar@gmail.com>
parents:
220
diff
changeset
|
125 self.setup_sprites(sprites_ascii) |
174 | 126 |
81
c8d6ca296884
Better level entry points.
Jeremy Thurgood <firxen@gmail.com>
parents:
71
diff
changeset
|
127 def setup_tiles(self, tiles_ascii): |
c8d6ca296884
Better level entry points.
Jeremy Thurgood <firxen@gmail.com>
parents:
71
diff
changeset
|
128 self.tiles = [] |
c8d6ca296884
Better level entry points.
Jeremy Thurgood <firxen@gmail.com>
parents:
71
diff
changeset
|
129 self.entry = None |
84 | 130 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
|
131 for y, row in enumerate(tiles_ascii): |
84 | 132 if len(row) != self.tile_size[0]: |
133 raise InvalidMapError("Map not rectangular.") | |
81
c8d6ca296884
Better level entry points.
Jeremy Thurgood <firxen@gmail.com>
parents:
71
diff
changeset
|
134 tile_row = [] |
84 | 135 for x, tile_char in enumerate(row): |
141 | 136 #tile_orientation = self.get_tile_orientation(y, x, row, |
137 # tile_char) | |
81
c8d6ca296884
Better level entry points.
Jeremy Thurgood <firxen@gmail.com>
parents:
71
diff
changeset
|
138 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
|
139 tile_row.append(tile) |
162
7fbbe27120a9
Rodents! Amphibians! Import juggling!
Jeremy Thurgood <firxen@gmail.com>
parents:
146
diff
changeset
|
140 if isinstance(tile, sprites.EntrySprite): |
199
986e72d2cb4d
Rejiggered entrances and shifted directions around.
Jeremy Thurgood <firxen@gmail.com>
parents:
197
diff
changeset
|
141 self.rejigger_entry_tile(tile) |
81
c8d6ca296884
Better level entry points.
Jeremy Thurgood <firxen@gmail.com>
parents:
71
diff
changeset
|
142 self.tiles.append(tile_row) |
c8d6ca296884
Better level entry points.
Jeremy Thurgood <firxen@gmail.com>
parents:
71
diff
changeset
|
143 if self.entry is None: |
c8d6ca296884
Better level entry points.
Jeremy Thurgood <firxen@gmail.com>
parents:
71
diff
changeset
|
144 raise InvalidMapError("Not enough entry points.") |
144
b292370c4548
Rearranged the orientation stuff. :-)
Jeremy Thurgood <firxen@gmail.com>
parents:
143
diff
changeset
|
145 self.set_tile_orientations() |
b292370c4548
Rearranged the orientation stuff. :-)
Jeremy Thurgood <firxen@gmail.com>
parents:
143
diff
changeset
|
146 |
199
986e72d2cb4d
Rejiggered entrances and shifted directions around.
Jeremy Thurgood <firxen@gmail.com>
parents:
197
diff
changeset
|
147 def rejigger_entry_tile(self, tile): |
986e72d2cb4d
Rejiggered entrances and shifted directions around.
Jeremy Thurgood <firxen@gmail.com>
parents:
197
diff
changeset
|
148 if self.entry is not None: |
986e72d2cb4d
Rejiggered entrances and shifted directions around.
Jeremy Thurgood <firxen@gmail.com>
parents:
197
diff
changeset
|
149 raise InvalidMapError("Too many entry points.") |
986e72d2cb4d
Rejiggered entrances and shifted directions around.
Jeremy Thurgood <firxen@gmail.com>
parents:
197
diff
changeset
|
150 self.entry = tile |
986e72d2cb4d
Rejiggered entrances and shifted directions around.
Jeremy Thurgood <firxen@gmail.com>
parents:
197
diff
changeset
|
151 direction = [] |
986e72d2cb4d
Rejiggered entrances and shifted directions around.
Jeremy Thurgood <firxen@gmail.com>
parents:
197
diff
changeset
|
152 x, y = tile.tile_pos |
986e72d2cb4d
Rejiggered entrances and shifted directions around.
Jeremy Thurgood <firxen@gmail.com>
parents:
197
diff
changeset
|
153 if x == 0: |
986e72d2cb4d
Rejiggered entrances and shifted directions around.
Jeremy Thurgood <firxen@gmail.com>
parents:
197
diff
changeset
|
154 direction.append(RIGHT) |
986e72d2cb4d
Rejiggered entrances and shifted directions around.
Jeremy Thurgood <firxen@gmail.com>
parents:
197
diff
changeset
|
155 elif x == self.tile_size[0] - 1: |
986e72d2cb4d
Rejiggered entrances and shifted directions around.
Jeremy Thurgood <firxen@gmail.com>
parents:
197
diff
changeset
|
156 direction.append(LEFT) |
986e72d2cb4d
Rejiggered entrances and shifted directions around.
Jeremy Thurgood <firxen@gmail.com>
parents:
197
diff
changeset
|
157 if y == 0: |
986e72d2cb4d
Rejiggered entrances and shifted directions around.
Jeremy Thurgood <firxen@gmail.com>
parents:
197
diff
changeset
|
158 direction.append(DOWN) |
986e72d2cb4d
Rejiggered entrances and shifted directions around.
Jeremy Thurgood <firxen@gmail.com>
parents:
197
diff
changeset
|
159 elif y == self.tile_size[1] - 1: |
986e72d2cb4d
Rejiggered entrances and shifted directions around.
Jeremy Thurgood <firxen@gmail.com>
parents:
197
diff
changeset
|
160 direction.append(UP) |
986e72d2cb4d
Rejiggered entrances and shifted directions around.
Jeremy Thurgood <firxen@gmail.com>
parents:
197
diff
changeset
|
161 if len(direction) < 1: |
986e72d2cb4d
Rejiggered entrances and shifted directions around.
Jeremy Thurgood <firxen@gmail.com>
parents:
197
diff
changeset
|
162 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
|
163 if len(direction) > 1: |
986e72d2cb4d
Rejiggered entrances and shifted directions around.
Jeremy Thurgood <firxen@gmail.com>
parents:
197
diff
changeset
|
164 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
|
165 tile.set_direction(direction[0]) |
986e72d2cb4d
Rejiggered entrances and shifted directions around.
Jeremy Thurgood <firxen@gmail.com>
parents:
197
diff
changeset
|
166 |
144
b292370c4548
Rearranged the orientation stuff. :-)
Jeremy Thurgood <firxen@gmail.com>
parents:
143
diff
changeset
|
167 def set_tile_orientations(self): |
b292370c4548
Rearranged the orientation stuff. :-)
Jeremy Thurgood <firxen@gmail.com>
parents:
143
diff
changeset
|
168 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
|
169 for row in self.tiles |
b292370c4548
Rearranged the orientation stuff. :-)
Jeremy Thurgood <firxen@gmail.com>
parents:
143
diff
changeset
|
170 for tile in row |
b292370c4548
Rearranged the orientation stuff. :-)
Jeremy Thurgood <firxen@gmail.com>
parents:
143
diff
changeset
|
171 if tile is not None] |
b292370c4548
Rearranged the orientation stuff. :-)
Jeremy Thurgood <firxen@gmail.com>
parents:
143
diff
changeset
|
172 for tile in tiles: |
b292370c4548
Rearranged the orientation stuff. :-)
Jeremy Thurgood <firxen@gmail.com>
parents:
143
diff
changeset
|
173 orientation = self.get_tile_orientation(tile) |
b292370c4548
Rearranged the orientation stuff. :-)
Jeremy Thurgood <firxen@gmail.com>
parents:
143
diff
changeset
|
174 tile.use_variant(*orientation) |
81
c8d6ca296884
Better level entry points.
Jeremy Thurgood <firxen@gmail.com>
parents:
71
diff
changeset
|
175 |
230
e4f983b68ef5
Start of advanced sprite definitions.
Simon Cross <hodgestar@gmail.com>
parents:
220
diff
changeset
|
176 def setup_sprites(self, sprites_ascii): |
243 | 177 self.extra_sprites = {} |
230
e4f983b68ef5
Start of advanced sprite definitions.
Simon Cross <hodgestar@gmail.com>
parents:
220
diff
changeset
|
178 for sprite_ascii in sprites_ascii: |
e4f983b68ef5
Start of advanced sprite definitions.
Simon Cross <hodgestar@gmail.com>
parents:
220
diff
changeset
|
179 pos, _sep, rest = sprite_ascii.partition(':') |
e4f983b68ef5
Start of advanced sprite definitions.
Simon Cross <hodgestar@gmail.com>
parents:
220
diff
changeset
|
180 pos = [int(x.strip()) for x in pos.split(',')] |
e4f983b68ef5
Start of advanced sprite definitions.
Simon Cross <hodgestar@gmail.com>
parents:
220
diff
changeset
|
181 class_name, rest = rest.split(None, 1) |
e4f983b68ef5
Start of advanced sprite definitions.
Simon Cross <hodgestar@gmail.com>
parents:
220
diff
changeset
|
182 args = rest.split() |
243 | 183 sprite_id, args = args[0], args[1:] |
230
e4f983b68ef5
Start of advanced sprite definitions.
Simon Cross <hodgestar@gmail.com>
parents:
220
diff
changeset
|
184 cls = sprites.find_sprite(class_name) |
e4f983b68ef5
Start of advanced sprite definitions.
Simon Cross <hodgestar@gmail.com>
parents:
220
diff
changeset
|
185 sprite = cls(*args) |
e4f983b68ef5
Start of advanced sprite definitions.
Simon Cross <hodgestar@gmail.com>
parents:
220
diff
changeset
|
186 sprite.set_tile_pos(pos) |
243 | 187 self.extra_sprites[sprite_id] = sprite |
230
e4f983b68ef5
Start of advanced sprite definitions.
Simon Cross <hodgestar@gmail.com>
parents:
220
diff
changeset
|
188 self.sprites.add(sprite) |
e4f983b68ef5
Start of advanced sprite definitions.
Simon Cross <hodgestar@gmail.com>
parents:
220
diff
changeset
|
189 |
123
915fd0ee28f5
Added test tile orientation
Gideon Visser <gideon@gideonvisser.com>
parents:
112
diff
changeset
|
190 def is_same_tile(self, tile, x, y): |
915fd0ee28f5
Added test tile orientation
Gideon Visser <gideon@gideonvisser.com>
parents:
112
diff
changeset
|
191 """Is there a tile of the same type?""" |
144
b292370c4548
Rearranged the orientation stuff. :-)
Jeremy Thurgood <firxen@gmail.com>
parents:
143
diff
changeset
|
192 if tile.tile_char is None: |
b292370c4548
Rearranged the orientation stuff. :-)
Jeremy Thurgood <firxen@gmail.com>
parents:
143
diff
changeset
|
193 # This isn't really a tile, so bail |
b292370c4548
Rearranged the orientation stuff. :-)
Jeremy Thurgood <firxen@gmail.com>
parents:
143
diff
changeset
|
194 return False |
123
915fd0ee28f5
Added test tile orientation
Gideon Visser <gideon@gideonvisser.com>
parents:
112
diff
changeset
|
195 try: |
144
b292370c4548
Rearranged the orientation stuff. :-)
Jeremy Thurgood <firxen@gmail.com>
parents:
143
diff
changeset
|
196 other_tile = self.tiles[y][x] |
b292370c4548
Rearranged the orientation stuff. :-)
Jeremy Thurgood <firxen@gmail.com>
parents:
143
diff
changeset
|
197 except IndexError: |
b292370c4548
Rearranged the orientation stuff. :-)
Jeremy Thurgood <firxen@gmail.com>
parents:
143
diff
changeset
|
198 # We're over the edge of the map |
b292370c4548
Rearranged the orientation stuff. :-)
Jeremy Thurgood <firxen@gmail.com>
parents:
143
diff
changeset
|
199 return False |
b292370c4548
Rearranged the orientation stuff. :-)
Jeremy Thurgood <firxen@gmail.com>
parents:
143
diff
changeset
|
200 if other_tile is None: |
b292370c4548
Rearranged the orientation stuff. :-)
Jeremy Thurgood <firxen@gmail.com>
parents:
143
diff
changeset
|
201 # Emptiness. |
b292370c4548
Rearranged the orientation stuff. :-)
Jeremy Thurgood <firxen@gmail.com>
parents:
143
diff
changeset
|
202 return False |
b292370c4548
Rearranged the orientation stuff. :-)
Jeremy Thurgood <firxen@gmail.com>
parents:
143
diff
changeset
|
203 return tile.tile_char == other_tile.tile_char |
123
915fd0ee28f5
Added test tile orientation
Gideon Visser <gideon@gideonvisser.com>
parents:
112
diff
changeset
|
204 |
144
b292370c4548
Rearranged the orientation stuff. :-)
Jeremy Thurgood <firxen@gmail.com>
parents:
143
diff
changeset
|
205 def get_tile_orientation(self, tile): |
b292370c4548
Rearranged the orientation stuff. :-)
Jeremy Thurgood <firxen@gmail.com>
parents:
143
diff
changeset
|
206 if tile is None: |
b292370c4548
Rearranged the orientation stuff. :-)
Jeremy Thurgood <firxen@gmail.com>
parents:
143
diff
changeset
|
207 return (False, False, False, False) |
b292370c4548
Rearranged the orientation stuff. :-)
Jeremy Thurgood <firxen@gmail.com>
parents:
143
diff
changeset
|
208 map_x, map_y = tile.tile_pos |
b292370c4548
Rearranged the orientation stuff. :-)
Jeremy Thurgood <firxen@gmail.com>
parents:
143
diff
changeset
|
209 return ( |
b292370c4548
Rearranged the orientation stuff. :-)
Jeremy Thurgood <firxen@gmail.com>
parents:
143
diff
changeset
|
210 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
|
211 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
|
212 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
|
213 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
|
214 ) |
123
915fd0ee28f5
Added test tile orientation
Gideon Visser <gideon@gideonvisser.com>
parents:
112
diff
changeset
|
215 |
71
58557a89ec86
Some tile improvements and stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
57
diff
changeset
|
216 def get_tile_size(self): |
84 | 217 return self.tile_size |
21
f76c3f033772
Release early, release broken. Level stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
8
diff
changeset
|
218 |
f76c3f033772
Release early, release broken. Level stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
8
diff
changeset
|
219 def get_size(self): |
71
58557a89ec86
Some tile improvements and stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
57
diff
changeset
|
220 x, y = self.get_tile_size() |
162
7fbbe27120a9
Rodents! Amphibians! Import juggling!
Jeremy Thurgood <firxen@gmail.com>
parents:
146
diff
changeset
|
221 return sprites.tile_sizify((x, y)) |
71
58557a89ec86
Some tile improvements and stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
57
diff
changeset
|
222 |
58557a89ec86
Some tile improvements and stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
57
diff
changeset
|
223 def make_background(self): |
58557a89ec86
Some tile improvements and stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
57
diff
changeset
|
224 sx, sy = self.get_tile_size() |
58557a89ec86
Some tile improvements and stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
57
diff
changeset
|
225 self.background = Surface(self.get_size()) |
162
7fbbe27120a9
Rodents! Amphibians! Import juggling!
Jeremy Thurgood <firxen@gmail.com>
parents:
146
diff
changeset
|
226 [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
|
227 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
|
228 |
c8d6ca296884
Better level entry points.
Jeremy Thurgood <firxen@gmail.com>
parents:
71
diff
changeset
|
229 def get_entry(self): |
c8d6ca296884
Better level entry points.
Jeremy Thurgood <firxen@gmail.com>
parents:
71
diff
changeset
|
230 return (self.entry.tile_pos, self.entry.direction) |
110 | 231 |
232 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
|
233 surface.blit(self.background, (0, 0)) |
110 | 234 self.sprites.draw(surface) |
173
71911af9d42d
Refactor drawing code. Correct tile variants when painting
Neil Muller <drnlmuller@gmail.com>
parents:
169
diff
changeset
|
235 |
71911af9d42d
Refactor drawing code. Correct tile variants when painting
Neil Muller <drnlmuller@gmail.com>
parents:
169
diff
changeset
|
236 def get_tile(self, tile_pos): |
71911af9d42d
Refactor drawing code. Correct tile variants when painting
Neil Muller <drnlmuller@gmail.com>
parents:
169
diff
changeset
|
237 x, y = tile_pos |
71911af9d42d
Refactor drawing code. Correct tile variants when painting
Neil Muller <drnlmuller@gmail.com>
parents:
169
diff
changeset
|
238 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
|
239 return self.tiles[y][x] |
71911af9d42d
Refactor drawing code. Correct tile variants when painting
Neil Muller <drnlmuller@gmail.com>
parents:
169
diff
changeset
|
240 return None |
71911af9d42d
Refactor drawing code. Correct tile variants when painting
Neil Muller <drnlmuller@gmail.com>
parents:
169
diff
changeset
|
241 |
71911af9d42d
Refactor drawing code. Correct tile variants when painting
Neil Muller <drnlmuller@gmail.com>
parents:
169
diff
changeset
|
242 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
|
243 x, y = tile_pos |
71911af9d42d
Refactor drawing code. Correct tile variants when painting
Neil Muller <drnlmuller@gmail.com>
parents:
169
diff
changeset
|
244 old_tile = self.tiles[y][x] |
71911af9d42d
Refactor drawing code. Correct tile variants when painting
Neil Muller <drnlmuller@gmail.com>
parents:
169
diff
changeset
|
245 if old_tile is not None: |
71911af9d42d
Refactor drawing code. Correct tile variants when painting
Neil Muller <drnlmuller@gmail.com>
parents:
169
diff
changeset
|
246 old_tile.remove(self.sprites) |
71911af9d42d
Refactor drawing code. Correct tile variants when painting
Neil Muller <drnlmuller@gmail.com>
parents:
169
diff
changeset
|
247 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
|
248 self.tiles[y][x] = new_tile |
71911af9d42d
Refactor drawing code. Correct tile variants when painting
Neil Muller <drnlmuller@gmail.com>
parents:
169
diff
changeset
|
249 # Fix orientations |
71911af9d42d
Refactor drawing code. Correct tile variants when painting
Neil Muller <drnlmuller@gmail.com>
parents:
169
diff
changeset
|
250 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
|
251 for dy in (-1, 0, 1)] |
71911af9d42d
Refactor drawing code. Correct tile variants when painting
Neil Muller <drnlmuller@gmail.com>
parents:
169
diff
changeset
|
252 for tile in tiles: |
71911af9d42d
Refactor drawing code. Correct tile variants when painting
Neil Muller <drnlmuller@gmail.com>
parents:
169
diff
changeset
|
253 if tile: |
71911af9d42d
Refactor drawing code. Correct tile variants when painting
Neil Muller <drnlmuller@gmail.com>
parents:
169
diff
changeset
|
254 orientation = self.get_tile_orientation(tile) |
71911af9d42d
Refactor drawing code. Correct tile variants when painting
Neil Muller <drnlmuller@gmail.com>
parents:
169
diff
changeset
|
255 tile.use_variant(*orientation) |
186 | 256 |
248
de3b4048e54a
Hook up tile arrow rotation
Stefano Rivera <stefano@rivera.za.net>
parents:
247
diff
changeset
|
257 def flip_arrows(self): |
de3b4048e54a
Hook up tile arrow rotation
Stefano Rivera <stefano@rivera.za.net>
parents:
247
diff
changeset
|
258 for row in self.tiles: |
de3b4048e54a
Hook up tile arrow rotation
Stefano Rivera <stefano@rivera.za.net>
parents:
247
diff
changeset
|
259 for tile in row: |
de3b4048e54a
Hook up tile arrow rotation
Stefano Rivera <stefano@rivera.za.net>
parents:
247
diff
changeset
|
260 if isinstance(tile, sprites.ArrowSprite): |
de3b4048e54a
Hook up tile arrow rotation
Stefano Rivera <stefano@rivera.za.net>
parents:
247
diff
changeset
|
261 tile.rotate() |
de3b4048e54a
Hook up tile arrow rotation
Stefano Rivera <stefano@rivera.za.net>
parents:
247
diff
changeset
|
262 |
186 | 263 def restart(self): |
264 """Reset the level state""" | |
230
e4f983b68ef5
Start of advanced sprite definitions.
Simon Cross <hodgestar@gmail.com>
parents:
220
diff
changeset
|
265 self.setup_level(self.tiles_ascii, self.sprites_ascii) |
186 | 266 self.make_background() |