Mercurial > mamba
annotate mamba/level.py @ 81:c8d6ca296884
Better level entry points.
author | Jeremy Thurgood <firxen@gmail.com> |
---|---|
date | Sun, 11 Sep 2011 18:35:39 +0200 |
parents | 58557a89ec86 |
children | 30c3bbaf7a28 |
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) |
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 |
37 | 17 TILE_MAP = { |
18 '.': None, | |
71
58557a89ec86
Some tile improvements and stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
57
diff
changeset
|
19 'X': (TileSprite, 'wall'), |
56 | 20 'R': (DoorSprite, 'red'), |
21 'B': (DoorSprite, 'blue'), | |
81
c8d6ca296884
Better level entry points.
Jeremy Thurgood <firxen@gmail.com>
parents:
71
diff
changeset
|
22 '^': (EntrySprite, 'up'), |
c8d6ca296884
Better level entry points.
Jeremy Thurgood <firxen@gmail.com>
parents:
71
diff
changeset
|
23 'v': (EntrySprite, 'down'), |
c8d6ca296884
Better level entry points.
Jeremy Thurgood <firxen@gmail.com>
parents:
71
diff
changeset
|
24 '<': (EntrySprite, 'left'), |
c8d6ca296884
Better level entry points.
Jeremy Thurgood <firxen@gmail.com>
parents:
71
diff
changeset
|
25 '>': (EntrySprite, 'right'), |
71
58557a89ec86
Some tile improvements and stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
57
diff
changeset
|
26 'E': (ExitSprite,), |
58557a89ec86
Some tile improvements and stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
57
diff
changeset
|
27 '~': (PuddleSprite,), |
37 | 28 } |
29 | |
30 THING_MAP = { | |
57 | 31 'a': (BaseSprite, 'snake/snake-head-r'), |
37 | 32 } |
33 | |
34 | |
8
66ae99f6903e
First stab at tile/level stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
35 class Tileset(object): |
66ae99f6903e
First stab at tile/level stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
36 def __init__(self, tileset_name): |
66ae99f6903e
First stab at tile/level stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
37 self.name = tileset_name |
31
67218082cdbb
More level non-functionality.
Jeremy Thurgood <firxen@gmail.com>
parents:
21
diff
changeset
|
38 self.load_tiles() |
8
66ae99f6903e
First stab at tile/level stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
39 |
66ae99f6903e
First stab at tile/level stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
40 def load_tiles(self): |
31
67218082cdbb
More level non-functionality.
Jeremy Thurgood <firxen@gmail.com>
parents:
21
diff
changeset
|
41 self.tiles = {} |
71
58557a89ec86
Some tile improvements and stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
57
diff
changeset
|
42 self.floor = TileSprite(self.name, 'floor').image |
50 | 43 for name, value in TILE_MAP.items(): |
44 if value is not None: | |
56 | 45 value = (value[0], self.name) + value[1:] |
50 | 46 self.tiles[name] = value |
47 self.tiles.update(THING_MAP) | |
8
66ae99f6903e
First stab at tile/level stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
48 |
66ae99f6903e
First stab at tile/level stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
49 def __getitem__(self, key): |
50 | 50 tilespec = self.tiles[key] |
51 if not tilespec: | |
52 return None | |
53 return tilespec[0](*tilespec[1:]) | |
31
67218082cdbb
More level non-functionality.
Jeremy Thurgood <firxen@gmail.com>
parents:
21
diff
changeset
|
54 |
50 | 55 def get_tile(self, key, tile_pos, *groups): |
31
67218082cdbb
More level non-functionality.
Jeremy Thurgood <firxen@gmail.com>
parents:
21
diff
changeset
|
56 tile = self[key] |
50 | 57 if tile: |
58 tile.add(*groups) | |
59 tile.set_tile_pos(tile_pos) | |
31
67218082cdbb
More level non-functionality.
Jeremy Thurgood <firxen@gmail.com>
parents:
21
diff
changeset
|
60 return tile |
8
66ae99f6903e
First stab at tile/level stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
61 |
66ae99f6903e
First stab at tile/level stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
62 |
66ae99f6903e
First stab at tile/level stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
63 class Level(object): |
66ae99f6903e
First stab at tile/level stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
64 def __init__(self, level_name): |
66ae99f6903e
First stab at tile/level stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
65 self.level_name = level_name |
66ae99f6903e
First stab at tile/level stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
66 self.load_level_data() |
66ae99f6903e
First stab at tile/level stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
67 |
66ae99f6903e
First stab at tile/level stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
68 def load_level_data(self): |
66ae99f6903e
First stab at tile/level stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
69 """ |
31
67218082cdbb
More level non-functionality.
Jeremy Thurgood <firxen@gmail.com>
parents:
21
diff
changeset
|
70 This file format is potentially yucky. |
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 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
|
73 tileset_name = level_data.readline().strip() |
21
f76c3f033772
Release early, release broken. Level stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
8
diff
changeset
|
74 self.tileset = Tileset(tileset_name) |
8
66ae99f6903e
First stab at tile/level stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
75 tiles_ascii = level_data.readlines() |
81
c8d6ca296884
Better level entry points.
Jeremy Thurgood <firxen@gmail.com>
parents:
71
diff
changeset
|
76 self.setup_tiles(tiles_ascii) |
71
58557a89ec86
Some tile improvements and stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
57
diff
changeset
|
77 self.make_background() |
58557a89ec86
Some tile improvements and stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
57
diff
changeset
|
78 |
81
c8d6ca296884
Better level entry points.
Jeremy Thurgood <firxen@gmail.com>
parents:
71
diff
changeset
|
79 def setup_tiles(self, tiles_ascii): |
c8d6ca296884
Better level entry points.
Jeremy Thurgood <firxen@gmail.com>
parents:
71
diff
changeset
|
80 self.sprites = RenderUpdates() |
c8d6ca296884
Better level entry points.
Jeremy Thurgood <firxen@gmail.com>
parents:
71
diff
changeset
|
81 self.tiles = [] |
c8d6ca296884
Better level entry points.
Jeremy Thurgood <firxen@gmail.com>
parents:
71
diff
changeset
|
82 self.entry = None |
c8d6ca296884
Better level entry points.
Jeremy Thurgood <firxen@gmail.com>
parents:
71
diff
changeset
|
83 for y, row in enumerate(tiles_ascii): |
c8d6ca296884
Better level entry points.
Jeremy Thurgood <firxen@gmail.com>
parents:
71
diff
changeset
|
84 tile_row = [] |
c8d6ca296884
Better level entry points.
Jeremy Thurgood <firxen@gmail.com>
parents:
71
diff
changeset
|
85 for x, tile_char in enumerate(row.strip()): |
c8d6ca296884
Better level entry points.
Jeremy Thurgood <firxen@gmail.com>
parents:
71
diff
changeset
|
86 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
|
87 tile_row.append(tile) |
c8d6ca296884
Better level entry points.
Jeremy Thurgood <firxen@gmail.com>
parents:
71
diff
changeset
|
88 if isinstance(tile, EntrySprite): |
c8d6ca296884
Better level entry points.
Jeremy Thurgood <firxen@gmail.com>
parents:
71
diff
changeset
|
89 if self.entry is not None: |
c8d6ca296884
Better level entry points.
Jeremy Thurgood <firxen@gmail.com>
parents:
71
diff
changeset
|
90 raise InvalidMapError("Too many entry points.") |
c8d6ca296884
Better level entry points.
Jeremy Thurgood <firxen@gmail.com>
parents:
71
diff
changeset
|
91 self.entry = tile |
c8d6ca296884
Better level entry points.
Jeremy Thurgood <firxen@gmail.com>
parents:
71
diff
changeset
|
92 self.tiles.append(tile_row) |
c8d6ca296884
Better level entry points.
Jeremy Thurgood <firxen@gmail.com>
parents:
71
diff
changeset
|
93 if self.entry is None: |
c8d6ca296884
Better level entry points.
Jeremy Thurgood <firxen@gmail.com>
parents:
71
diff
changeset
|
94 raise InvalidMapError("Not enough entry points.") |
c8d6ca296884
Better level entry points.
Jeremy Thurgood <firxen@gmail.com>
parents:
71
diff
changeset
|
95 |
71
58557a89ec86
Some tile improvements and stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
57
diff
changeset
|
96 def get_tile_size(self): |
58557a89ec86
Some tile improvements and stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
57
diff
changeset
|
97 return (len(self.tiles[0]), len(self.tiles)) |
21
f76c3f033772
Release early, release broken. Level stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
8
diff
changeset
|
98 |
f76c3f033772
Release early, release broken. Level stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
8
diff
changeset
|
99 def get_size(self): |
71
58557a89ec86
Some tile improvements and stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
57
diff
changeset
|
100 x, y = self.get_tile_size() |
58557a89ec86
Some tile improvements and stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
57
diff
changeset
|
101 return tile_sizify((x, y)) |
58557a89ec86
Some tile improvements and stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
57
diff
changeset
|
102 |
58557a89ec86
Some tile improvements and stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
57
diff
changeset
|
103 def make_background(self): |
58557a89ec86
Some tile improvements and stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
57
diff
changeset
|
104 sx, sy = self.get_tile_size() |
58557a89ec86
Some tile improvements and stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
57
diff
changeset
|
105 self.background = Surface(self.get_size()) |
58557a89ec86
Some tile improvements and stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
57
diff
changeset
|
106 [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
|
107 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
|
108 |
c8d6ca296884
Better level entry points.
Jeremy Thurgood <firxen@gmail.com>
parents:
71
diff
changeset
|
109 def get_entry(self): |
c8d6ca296884
Better level entry points.
Jeremy Thurgood <firxen@gmail.com>
parents:
71
diff
changeset
|
110 return (self.entry.tile_pos, self.entry.direction) |