Mercurial > mamba
annotate mamba/level.py @ 123:915fd0ee28f5
Added test tile orientation
author | Gideon Visser <gideon@gideonvisser.com> |
---|---|
date | Sun, 11 Sep 2011 20:59:16 -0700 |
parents | 62a705f4e876 |
children | d285cf18396e |
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 |
50 | 8 from mamba.data import load_file |
71
58557a89ec86
Some tile improvements and stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
57
diff
changeset
|
9 from mamba.sprites import (tile_sizify, TileSprite, BaseSprite, DoorSprite, |
58557a89ec86
Some tile improvements and stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
57
diff
changeset
|
10 EntrySprite, ExitSprite, PuddleSprite) |
83
30c3bbaf7a28
Use Snake direction constants in level.py.
Simon Cross <hodgestar@gmail.com>
parents:
81
diff
changeset
|
11 from mamba.snake import Snake |
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 | 18 def mktile(cls, **kw): |
19 return (cls, kw) | |
20 | |
21 | |
37 | 22 TILE_MAP = { |
23 '.': None, | |
104 | 24 'X': mktile(TileSprite, image_name='wall'), |
25 'R': mktile(DoorSprite, colour='red'), | |
26 'B': mktile(DoorSprite, colour='blue'), | |
27 '^': mktile(EntrySprite, direction=Snake.UP), | |
28 'v': mktile(EntrySprite, direction=Snake.DOWN), | |
29 '<': mktile(EntrySprite, direction=Snake.LEFT), | |
30 '>': mktile(EntrySprite, direction=Snake.RIGHT), | |
31 'E': mktile(ExitSprite), | |
32 '~': mktile(PuddleSprite), | |
37 | 33 } |
34 | |
35 THING_MAP = { | |
104 | 36 'a': mktile(BaseSprite, image_name='snake/snake-head-r'), |
37 | 37 } |
38 | |
39 | |
8
66ae99f6903e
First stab at tile/level stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
40 class Tileset(object): |
66ae99f6903e
First stab at tile/level stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
41 def __init__(self, tileset_name): |
66ae99f6903e
First stab at tile/level stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
42 self.name = tileset_name |
31
67218082cdbb
More level non-functionality.
Jeremy Thurgood <firxen@gmail.com>
parents:
21
diff
changeset
|
43 self.load_tiles() |
8
66ae99f6903e
First stab at tile/level stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
44 |
66ae99f6903e
First stab at tile/level stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
45 def load_tiles(self): |
31
67218082cdbb
More level non-functionality.
Jeremy Thurgood <firxen@gmail.com>
parents:
21
diff
changeset
|
46 self.tiles = {} |
104 | 47 self.floor = TileSprite(tileset=self.name, image_name='floor').image |
50 | 48 for name, value in TILE_MAP.items(): |
49 if value is not None: | |
104 | 50 value[1]['tileset'] = self.name |
50 | 51 self.tiles[name] = value |
52 self.tiles.update(THING_MAP) | |
8
66ae99f6903e
First stab at tile/level stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
53 |
66ae99f6903e
First stab at tile/level stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
54 def __getitem__(self, key): |
84 | 55 try: |
56 tilespec = self.tiles[key] | |
57 except KeyError: | |
58 raise InvalidMapError("Unknown tile type: '%s'" % key) | |
50 | 59 if not tilespec: |
60 return None | |
105
87acd3ddc972
Tell sprites what their tile char is.
Jeremy Thurgood <firxen@gmail.com>
parents:
104
diff
changeset
|
61 cls, params = tilespec |
87acd3ddc972
Tell sprites what their tile char is.
Jeremy Thurgood <firxen@gmail.com>
parents:
104
diff
changeset
|
62 params['tile_char'] = key |
87acd3ddc972
Tell sprites what their tile char is.
Jeremy Thurgood <firxen@gmail.com>
parents:
104
diff
changeset
|
63 return cls(**params) |
31
67218082cdbb
More level non-functionality.
Jeremy Thurgood <firxen@gmail.com>
parents:
21
diff
changeset
|
64 |
50 | 65 def get_tile(self, key, tile_pos, *groups): |
31
67218082cdbb
More level non-functionality.
Jeremy Thurgood <firxen@gmail.com>
parents:
21
diff
changeset
|
66 tile = self[key] |
50 | 67 if tile: |
68 tile.add(*groups) | |
69 tile.set_tile_pos(tile_pos) | |
31
67218082cdbb
More level non-functionality.
Jeremy Thurgood <firxen@gmail.com>
parents:
21
diff
changeset
|
70 return tile |
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 |
66ae99f6903e
First stab at tile/level stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
73 class Level(object): |
66ae99f6903e
First stab at tile/level stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
74 def __init__(self, level_name): |
66ae99f6903e
First stab at tile/level stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
75 self.level_name = level_name |
123
915fd0ee28f5
Added test tile orientation
Gideon Visser <gideon@gideonvisser.com>
parents:
112
diff
changeset
|
76 self.tiles_ascii = '' |
8
66ae99f6903e
First stab at tile/level stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
77 self.load_level_data() |
66ae99f6903e
First stab at tile/level stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
78 |
66ae99f6903e
First stab at tile/level stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
79 def load_level_data(self): |
66ae99f6903e
First stab at tile/level stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
80 """ |
31
67218082cdbb
More level non-functionality.
Jeremy Thurgood <firxen@gmail.com>
parents:
21
diff
changeset
|
81 This file format is potentially yucky. |
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 level_data = load_file('levels/%s.txt' % (self.level_name,)) |
31
67218082cdbb
More level non-functionality.
Jeremy Thurgood <firxen@gmail.com>
parents:
21
diff
changeset
|
84 tileset_name = level_data.readline().strip() |
21
f76c3f033772
Release early, release broken. Level stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
8
diff
changeset
|
85 self.tileset = Tileset(tileset_name) |
84 | 86 tiles_ascii = [line.strip() for line in level_data.readlines()] |
123
915fd0ee28f5
Added test tile orientation
Gideon Visser <gideon@gideonvisser.com>
parents:
112
diff
changeset
|
87 self.tiles_ascii = tiles_ascii |
81
c8d6ca296884
Better level entry points.
Jeremy Thurgood <firxen@gmail.com>
parents:
71
diff
changeset
|
88 self.setup_tiles(tiles_ascii) |
71
58557a89ec86
Some tile improvements and stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
57
diff
changeset
|
89 self.make_background() |
58557a89ec86
Some tile improvements and stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
57
diff
changeset
|
90 |
81
c8d6ca296884
Better level entry points.
Jeremy Thurgood <firxen@gmail.com>
parents:
71
diff
changeset
|
91 def setup_tiles(self, tiles_ascii): |
c8d6ca296884
Better level entry points.
Jeremy Thurgood <firxen@gmail.com>
parents:
71
diff
changeset
|
92 self.sprites = RenderUpdates() |
c8d6ca296884
Better level entry points.
Jeremy Thurgood <firxen@gmail.com>
parents:
71
diff
changeset
|
93 self.tiles = [] |
c8d6ca296884
Better level entry points.
Jeremy Thurgood <firxen@gmail.com>
parents:
71
diff
changeset
|
94 self.entry = None |
84 | 95 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
|
96 for y, row in enumerate(tiles_ascii): |
84 | 97 if len(row) != self.tile_size[0]: |
98 raise InvalidMapError("Map not rectangular.") | |
81
c8d6ca296884
Better level entry points.
Jeremy Thurgood <firxen@gmail.com>
parents:
71
diff
changeset
|
99 tile_row = [] |
84 | 100 for x, tile_char in enumerate(row): |
123
915fd0ee28f5
Added test tile orientation
Gideon Visser <gideon@gideonvisser.com>
parents:
112
diff
changeset
|
101 tile_orientation = self.get_tile_orientation(y, x, row, tile_char) |
915fd0ee28f5
Added test tile orientation
Gideon Visser <gideon@gideonvisser.com>
parents:
112
diff
changeset
|
102 print tile_orientation |
81
c8d6ca296884
Better level entry points.
Jeremy Thurgood <firxen@gmail.com>
parents:
71
diff
changeset
|
103 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
|
104 tile_row.append(tile) |
c8d6ca296884
Better level entry points.
Jeremy Thurgood <firxen@gmail.com>
parents:
71
diff
changeset
|
105 if isinstance(tile, EntrySprite): |
c8d6ca296884
Better level entry points.
Jeremy Thurgood <firxen@gmail.com>
parents:
71
diff
changeset
|
106 if self.entry is not None: |
c8d6ca296884
Better level entry points.
Jeremy Thurgood <firxen@gmail.com>
parents:
71
diff
changeset
|
107 raise InvalidMapError("Too many entry points.") |
c8d6ca296884
Better level entry points.
Jeremy Thurgood <firxen@gmail.com>
parents:
71
diff
changeset
|
108 self.entry = tile |
c8d6ca296884
Better level entry points.
Jeremy Thurgood <firxen@gmail.com>
parents:
71
diff
changeset
|
109 self.tiles.append(tile_row) |
c8d6ca296884
Better level entry points.
Jeremy Thurgood <firxen@gmail.com>
parents:
71
diff
changeset
|
110 if self.entry is None: |
c8d6ca296884
Better level entry points.
Jeremy Thurgood <firxen@gmail.com>
parents:
71
diff
changeset
|
111 raise InvalidMapError("Not enough entry points.") |
c8d6ca296884
Better level entry points.
Jeremy Thurgood <firxen@gmail.com>
parents:
71
diff
changeset
|
112 |
123
915fd0ee28f5
Added test tile orientation
Gideon Visser <gideon@gideonvisser.com>
parents:
112
diff
changeset
|
113 |
915fd0ee28f5
Added test tile orientation
Gideon Visser <gideon@gideonvisser.com>
parents:
112
diff
changeset
|
114 def is_same_tile(self, tile, x, y): |
915fd0ee28f5
Added test tile orientation
Gideon Visser <gideon@gideonvisser.com>
parents:
112
diff
changeset
|
115 """Is there a tile of the same type?""" |
915fd0ee28f5
Added test tile orientation
Gideon Visser <gideon@gideonvisser.com>
parents:
112
diff
changeset
|
116 try: |
915fd0ee28f5
Added test tile orientation
Gideon Visser <gideon@gideonvisser.com>
parents:
112
diff
changeset
|
117 temp_tile = self.tiles_ascii[y][x] |
915fd0ee28f5
Added test tile orientation
Gideon Visser <gideon@gideonvisser.com>
parents:
112
diff
changeset
|
118 except IndexError: |
915fd0ee28f5
Added test tile orientation
Gideon Visser <gideon@gideonvisser.com>
parents:
112
diff
changeset
|
119 return 'The map went out of range' |
915fd0ee28f5
Added test tile orientation
Gideon Visser <gideon@gideonvisser.com>
parents:
112
diff
changeset
|
120 try: |
915fd0ee28f5
Added test tile orientation
Gideon Visser <gideon@gideonvisser.com>
parents:
112
diff
changeset
|
121 return temp_tile == tile |
915fd0ee28f5
Added test tile orientation
Gideon Visser <gideon@gideonvisser.com>
parents:
112
diff
changeset
|
122 except KeyError: |
915fd0ee28f5
Added test tile orientation
Gideon Visser <gideon@gideonvisser.com>
parents:
112
diff
changeset
|
123 return 'The map tile is not existing' |
915fd0ee28f5
Added test tile orientation
Gideon Visser <gideon@gideonvisser.com>
parents:
112
diff
changeset
|
124 |
915fd0ee28f5
Added test tile orientation
Gideon Visser <gideon@gideonvisser.com>
parents:
112
diff
changeset
|
125 return self.get_bool(x, y, 'wall') |
915fd0ee28f5
Added test tile orientation
Gideon Visser <gideon@gideonvisser.com>
parents:
112
diff
changeset
|
126 |
915fd0ee28f5
Added test tile orientation
Gideon Visser <gideon@gideonvisser.com>
parents:
112
diff
changeset
|
127 #please note: planning on tile tuple to be -1, 0, 1 of x then y |
915fd0ee28f5
Added test tile orientation
Gideon Visser <gideon@gideonvisser.com>
parents:
112
diff
changeset
|
128 def get_tile_orientation(self, map_y, map_x, row, tile_char): |
915fd0ee28f5
Added test tile orientation
Gideon Visser <gideon@gideonvisser.com>
parents:
112
diff
changeset
|
129 #print "y: ", map_y, " x: ", map_x, " row: ", row, " tile_char: ", tile_char |
915fd0ee28f5
Added test tile orientation
Gideon Visser <gideon@gideonvisser.com>
parents:
112
diff
changeset
|
130 #tile_char |
915fd0ee28f5
Added test tile orientation
Gideon Visser <gideon@gideonvisser.com>
parents:
112
diff
changeset
|
131 if self.is_same_tile(tile_char, map_x, map_y): |
915fd0ee28f5
Added test tile orientation
Gideon Visser <gideon@gideonvisser.com>
parents:
112
diff
changeset
|
132 # Draw different tiles depending on neighbourhood |
915fd0ee28f5
Added test tile orientation
Gideon Visser <gideon@gideonvisser.com>
parents:
112
diff
changeset
|
133 if not self.is_same_tile(tile_char, map_x, map_y+1): |
915fd0ee28f5
Added test tile orientation
Gideon Visser <gideon@gideonvisser.com>
parents:
112
diff
changeset
|
134 if self.is_same_tile(tile_char, map_x+1, map_y) and self.is_same_tile(tile_char, map_x-1, map_y): # |
915fd0ee28f5
Added test tile orientation
Gideon Visser <gideon@gideonvisser.com>
parents:
112
diff
changeset
|
135 tile = 1, 2 |
915fd0ee28f5
Added test tile orientation
Gideon Visser <gideon@gideonvisser.com>
parents:
112
diff
changeset
|
136 elif self.is_same_tile(tile_char, map_x+1, map_y): |
915fd0ee28f5
Added test tile orientation
Gideon Visser <gideon@gideonvisser.com>
parents:
112
diff
changeset
|
137 tile = 0, 2 |
915fd0ee28f5
Added test tile orientation
Gideon Visser <gideon@gideonvisser.com>
parents:
112
diff
changeset
|
138 elif self.is_same_tile(tile_char, map_x-1, map_y): |
915fd0ee28f5
Added test tile orientation
Gideon Visser <gideon@gideonvisser.com>
parents:
112
diff
changeset
|
139 tile = 2, 2 |
915fd0ee28f5
Added test tile orientation
Gideon Visser <gideon@gideonvisser.com>
parents:
112
diff
changeset
|
140 else: |
915fd0ee28f5
Added test tile orientation
Gideon Visser <gideon@gideonvisser.com>
parents:
112
diff
changeset
|
141 tile = 3, 2 |
915fd0ee28f5
Added test tile orientation
Gideon Visser <gideon@gideonvisser.com>
parents:
112
diff
changeset
|
142 else: |
915fd0ee28f5
Added test tile orientation
Gideon Visser <gideon@gideonvisser.com>
parents:
112
diff
changeset
|
143 if self.is_same_tile(tile_char, map_x+1, map_y+1) and self.is_same_tile(tile_char, map_x-1, map_y+1): |
915fd0ee28f5
Added test tile orientation
Gideon Visser <gideon@gideonvisser.com>
parents:
112
diff
changeset
|
144 tile = 1, 1 |
915fd0ee28f5
Added test tile orientation
Gideon Visser <gideon@gideonvisser.com>
parents:
112
diff
changeset
|
145 elif self.is_same_tile(tile_char, map_x+1, map_y+1): |
915fd0ee28f5
Added test tile orientation
Gideon Visser <gideon@gideonvisser.com>
parents:
112
diff
changeset
|
146 tile = 0, 1 |
915fd0ee28f5
Added test tile orientation
Gideon Visser <gideon@gideonvisser.com>
parents:
112
diff
changeset
|
147 elif self.is_same_tile(tile_char, map_x-1, map_y+1): |
915fd0ee28f5
Added test tile orientation
Gideon Visser <gideon@gideonvisser.com>
parents:
112
diff
changeset
|
148 tile = 2, 1 |
915fd0ee28f5
Added test tile orientation
Gideon Visser <gideon@gideonvisser.com>
parents:
112
diff
changeset
|
149 else: |
915fd0ee28f5
Added test tile orientation
Gideon Visser <gideon@gideonvisser.com>
parents:
112
diff
changeset
|
150 tile = 3, 1 |
915fd0ee28f5
Added test tile orientation
Gideon Visser <gideon@gideonvisser.com>
parents:
112
diff
changeset
|
151 return tile |
915fd0ee28f5
Added test tile orientation
Gideon Visser <gideon@gideonvisser.com>
parents:
112
diff
changeset
|
152 |
71
58557a89ec86
Some tile improvements and stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
57
diff
changeset
|
153 def get_tile_size(self): |
84 | 154 return self.tile_size |
21
f76c3f033772
Release early, release broken. Level stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
8
diff
changeset
|
155 |
f76c3f033772
Release early, release broken. Level stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
8
diff
changeset
|
156 def get_size(self): |
71
58557a89ec86
Some tile improvements and stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
57
diff
changeset
|
157 x, y = self.get_tile_size() |
58557a89ec86
Some tile improvements and stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
57
diff
changeset
|
158 return tile_sizify((x, y)) |
58557a89ec86
Some tile improvements and stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
57
diff
changeset
|
159 |
58557a89ec86
Some tile improvements and stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
57
diff
changeset
|
160 def make_background(self): |
58557a89ec86
Some tile improvements and stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
57
diff
changeset
|
161 sx, sy = self.get_tile_size() |
58557a89ec86
Some tile improvements and stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
57
diff
changeset
|
162 self.background = Surface(self.get_size()) |
58557a89ec86
Some tile improvements and stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
57
diff
changeset
|
163 [self.background.blit(self.tileset.floor, tile_sizify((x, y))) |
58557a89ec86
Some tile improvements and stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
57
diff
changeset
|
164 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
|
165 |
c8d6ca296884
Better level entry points.
Jeremy Thurgood <firxen@gmail.com>
parents:
71
diff
changeset
|
166 def get_entry(self): |
c8d6ca296884
Better level entry points.
Jeremy Thurgood <firxen@gmail.com>
parents:
71
diff
changeset
|
167 return (self.entry.tile_pos, self.entry.direction) |
110 | 168 |
169 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
|
170 surface.blit(self.background, (0, 0)) |
110 | 171 self.sprites.draw(surface) |