annotate mamba/level.py @ 285:cacc03748580

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