annotate mamba/level.py @ 533:cb9ee0ba01ce

Explain curation in upload dialog box.
author Simon Cross <hodgestar@gmail.com>
date Sun, 18 Sep 2011 01:14:52 +0200
parents 6c61d5862310
children 9afaa1969d6f
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
331
0c25bca380de Support for loading level from string.
Simon Cross <hodgestar@gmail.com>
parents: 317
diff changeset
13 from StringIO import StringIO
0c25bca380de Support for loading level from string.
Simon Cross <hodgestar@gmail.com>
parents: 317
diff changeset
14
21
f76c3f033772 Release early, release broken. Level stuff.
Jeremy Thurgood <firxen@gmail.com>
parents: 8
diff changeset
15
81
c8d6ca296884 Better level entry points.
Jeremy Thurgood <firxen@gmail.com>
parents: 71
diff changeset
16 class InvalidMapError(Exception):
c8d6ca296884 Better level entry points.
Jeremy Thurgood <firxen@gmail.com>
parents: 71
diff changeset
17 pass
c8d6ca296884 Better level entry points.
Jeremy Thurgood <firxen@gmail.com>
parents: 71
diff changeset
18
c8d6ca296884 Better level entry points.
Jeremy Thurgood <firxen@gmail.com>
parents: 71
diff changeset
19
104
5b92ff941de3 Refactor sprites.
Jeremy Thurgood <firxen@gmail.com>
parents: 98
diff changeset
20 def mktile(cls, **kw):
5b92ff941de3 Refactor sprites.
Jeremy Thurgood <firxen@gmail.com>
parents: 98
diff changeset
21 return (cls, kw)
5b92ff941de3 Refactor sprites.
Jeremy Thurgood <firxen@gmail.com>
parents: 98
diff changeset
22
5b92ff941de3 Refactor sprites.
Jeremy Thurgood <firxen@gmail.com>
parents: 98
diff changeset
23
37
9a0ae29c7f5e Tiles *and* things.
Jeremy Thurgood <firxen@gmail.com>
parents: 34
diff changeset
24 TILE_MAP = {
9a0ae29c7f5e Tiles *and* things.
Jeremy Thurgood <firxen@gmail.com>
parents: 34
diff changeset
25 '.': None,
169
fc6844f7a1e8 Set wall name
Neil Muller <drnlmuller@gmail.com>
parents: 165
diff changeset
26 'X': mktile(sprites.TileSprite, image_name='wall', name='wall',
fc6844f7a1e8 Set wall name
Neil Muller <drnlmuller@gmail.com>
parents: 165
diff changeset
27 solid=True),
231
bf7bf54ed6ff Because every lab needs a biohazard warning sign or three.
Jeremy Thurgood <firxen@gmail.com>
parents: 230
diff changeset
28 'A': mktile(sprites.TileSprite, image_name='biohazard', name='biohazard',
bf7bf54ed6ff Because every lab needs a biohazard warning sign or three.
Jeremy Thurgood <firxen@gmail.com>
parents: 230
diff changeset
29 solid=True),
162
7fbbe27120a9 Rodents! Amphibians! Import juggling!
Jeremy Thurgood <firxen@gmail.com>
parents: 146
diff changeset
30 'R': mktile(sprites.DoorSprite, colour='red'),
7fbbe27120a9 Rodents! Amphibians! Import juggling!
Jeremy Thurgood <firxen@gmail.com>
parents: 146
diff changeset
31 'B': mktile(sprites.DoorSprite, colour='blue'),
220
066198428ee9 added yellow things
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 199
diff changeset
32 'Y': mktile(sprites.DoorSprite, colour='yellow'),
199
986e72d2cb4d Rejiggered entrances and shifted directions around.
Jeremy Thurgood <firxen@gmail.com>
parents: 197
diff changeset
33 'e': mktile(sprites.EntrySprite),
162
7fbbe27120a9 Rodents! Amphibians! Import juggling!
Jeremy Thurgood <firxen@gmail.com>
parents: 146
diff changeset
34 'E': mktile(sprites.ExitSprite),
7fbbe27120a9 Rodents! Amphibians! Import juggling!
Jeremy Thurgood <firxen@gmail.com>
parents: 146
diff changeset
35 '~': mktile(sprites.PuddleSprite),
253
2a969e3445ae fire bad
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 250
diff changeset
36 '$': mktile(sprites.FireSprite),
238
f00f6006cb5d named paint tiles
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 234
diff changeset
37 'r': mktile(sprites.Painter, colour='red', name='paint'),
f00f6006cb5d named paint tiles
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 234
diff changeset
38 'b': mktile(sprites.Painter, colour='blue', name='paint'),
f00f6006cb5d named paint tiles
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 234
diff changeset
39 'y': mktile(sprites.Painter, colour='yellow', name='paint'),
234
530b2edea0e6 ARROWED
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 233
diff changeset
40 '^': mktile(sprites.ArrowSprite, direction=UP),
530b2edea0e6 ARROWED
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 233
diff changeset
41 'v': mktile(sprites.ArrowSprite, direction=DOWN),
530b2edea0e6 ARROWED
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 233
diff changeset
42 '<': mktile(sprites.ArrowSprite, direction=LEFT),
530b2edea0e6 ARROWED
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 233
diff changeset
43 '>': mktile(sprites.ArrowSprite, direction=RIGHT),
248
de3b4048e54a Hook up tile arrow rotation
Stefano Rivera <stefano@rivera.za.net>
parents: 247
diff changeset
44 '@': mktile(sprites.FlipArrows),
37
9a0ae29c7f5e Tiles *and* things.
Jeremy Thurgood <firxen@gmail.com>
parents: 34
diff changeset
45 }
9a0ae29c7f5e Tiles *and* things.
Jeremy Thurgood <firxen@gmail.com>
parents: 34
diff changeset
46
9a0ae29c7f5e Tiles *and* things.
Jeremy Thurgood <firxen@gmail.com>
parents: 34
diff changeset
47 THING_MAP = {
165
0b2f2627a0ac moved animals to common
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 163
diff changeset
48 'M': mktile(sprites.BigMouse),
0b2f2627a0ac moved animals to common
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 163
diff changeset
49 'm': mktile(sprites.SmallMouse),
0b2f2627a0ac moved animals to common
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 163
diff changeset
50 'f': mktile(sprites.Frog),
250
f52fae80cd18 You stole my snail symbol!
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 249
diff changeset
51 '&': mktile(sprites.Snail),
249
cb68024bdd35 Moar animals
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 248
diff changeset
52 'l': mktile(sprites.Lizard),
cb68024bdd35 Moar animals
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 248
diff changeset
53 's': mktile(sprites.Salamander),
37
9a0ae29c7f5e Tiles *and* things.
Jeremy Thurgood <firxen@gmail.com>
parents: 34
diff changeset
54 }
9a0ae29c7f5e Tiles *and* things.
Jeremy Thurgood <firxen@gmail.com>
parents: 34
diff changeset
55
9a0ae29c7f5e Tiles *and* things.
Jeremy Thurgood <firxen@gmail.com>
parents: 34
diff changeset
56
8
66ae99f6903e First stab at tile/level stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
57 class Tileset(object):
66ae99f6903e First stab at tile/level stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
58 def __init__(self, tileset_name):
66ae99f6903e First stab at tile/level stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
59 self.name = tileset_name
31
67218082cdbb More level non-functionality.
Jeremy Thurgood <firxen@gmail.com>
parents: 21
diff changeset
60 self.load_tiles()
8
66ae99f6903e First stab at tile/level stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
61
66ae99f6903e First stab at tile/level stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
62 def load_tiles(self):
31
67218082cdbb More level non-functionality.
Jeremy Thurgood <firxen@gmail.com>
parents: 21
diff changeset
63 self.tiles = {}
163
41e8d4ce3af2 TileSprites are less magic.
Jeremy Thurgood <firxen@gmail.com>
parents: 162
diff changeset
64 self.floor = sprites.TileSprite('.', tileset=self.name,
162
7fbbe27120a9 Rodents! Amphibians! Import juggling!
Jeremy Thurgood <firxen@gmail.com>
parents: 146
diff changeset
65 image_name='floor').image
50
1b725035b8ef Levels that are visible.
Jeremy Thurgood <firxen@gmail.com>
parents: 37
diff changeset
66 for name, value in TILE_MAP.items():
1b725035b8ef Levels that are visible.
Jeremy Thurgood <firxen@gmail.com>
parents: 37
diff changeset
67 if value is not None:
104
5b92ff941de3 Refactor sprites.
Jeremy Thurgood <firxen@gmail.com>
parents: 98
diff changeset
68 value[1]['tileset'] = self.name
50
1b725035b8ef Levels that are visible.
Jeremy Thurgood <firxen@gmail.com>
parents: 37
diff changeset
69 self.tiles[name] = value
1b725035b8ef Levels that are visible.
Jeremy Thurgood <firxen@gmail.com>
parents: 37
diff changeset
70 self.tiles.update(THING_MAP)
8
66ae99f6903e First stab at tile/level stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
71
66ae99f6903e First stab at tile/level stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
72 def __getitem__(self, key):
84
cced0ddda33f More level validation.
Jeremy Thurgood <firxen@gmail.com>
parents: 83
diff changeset
73 try:
cced0ddda33f More level validation.
Jeremy Thurgood <firxen@gmail.com>
parents: 83
diff changeset
74 tilespec = self.tiles[key]
cced0ddda33f More level validation.
Jeremy Thurgood <firxen@gmail.com>
parents: 83
diff changeset
75 except KeyError:
cced0ddda33f More level validation.
Jeremy Thurgood <firxen@gmail.com>
parents: 83
diff changeset
76 raise InvalidMapError("Unknown tile type: '%s'" % key)
50
1b725035b8ef Levels that are visible.
Jeremy Thurgood <firxen@gmail.com>
parents: 37
diff changeset
77 if not tilespec:
1b725035b8ef Levels that are visible.
Jeremy Thurgood <firxen@gmail.com>
parents: 37
diff changeset
78 return None
105
87acd3ddc972 Tell sprites what their tile char is.
Jeremy Thurgood <firxen@gmail.com>
parents: 104
diff changeset
79 cls, params = tilespec
87acd3ddc972 Tell sprites what their tile char is.
Jeremy Thurgood <firxen@gmail.com>
parents: 104
diff changeset
80 params['tile_char'] = key
87acd3ddc972 Tell sprites what their tile char is.
Jeremy Thurgood <firxen@gmail.com>
parents: 104
diff changeset
81 return cls(**params)
31
67218082cdbb More level non-functionality.
Jeremy Thurgood <firxen@gmail.com>
parents: 21
diff changeset
82
50
1b725035b8ef Levels that are visible.
Jeremy Thurgood <firxen@gmail.com>
parents: 37
diff changeset
83 def get_tile(self, key, tile_pos, *groups):
31
67218082cdbb More level non-functionality.
Jeremy Thurgood <firxen@gmail.com>
parents: 21
diff changeset
84 tile = self[key]
50
1b725035b8ef Levels that are visible.
Jeremy Thurgood <firxen@gmail.com>
parents: 37
diff changeset
85 if tile:
1b725035b8ef Levels that are visible.
Jeremy Thurgood <firxen@gmail.com>
parents: 37
diff changeset
86 tile.add(*groups)
1b725035b8ef Levels that are visible.
Jeremy Thurgood <firxen@gmail.com>
parents: 37
diff changeset
87 tile.set_tile_pos(tile_pos)
31
67218082cdbb More level non-functionality.
Jeremy Thurgood <firxen@gmail.com>
parents: 21
diff changeset
88 return tile
8
66ae99f6903e First stab at tile/level stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
89
66ae99f6903e First stab at tile/level stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
90
66ae99f6903e First stab at tile/level stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
91 class Level(object):
361
d4062344d8f4 Level namespaces (for telling that a level is complete, no matter where it came from)
Stefano Rivera <stefano@rivera.za.net>
parents: 352
diff changeset
92 def __init__(self, level_name, level_namespace, source=None):
8
66ae99f6903e First stab at tile/level stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
93 self.level_name = level_name
361
d4062344d8f4 Level namespaces (for telling that a level is complete, no matter where it came from)
Stefano Rivera <stefano@rivera.za.net>
parents: 352
diff changeset
94 self.level_namespace = level_namespace
331
0c25bca380de Support for loading level from string.
Simon Cross <hodgestar@gmail.com>
parents: 317
diff changeset
95 self.source = source
8
66ae99f6903e First stab at tile/level stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
96 self.load_level_data()
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 def load_level_data(self):
66ae99f6903e First stab at tile/level stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
99 """
31
67218082cdbb More level non-functionality.
Jeremy Thurgood <firxen@gmail.com>
parents: 21
diff changeset
100 This file format is potentially yucky.
8
66ae99f6903e First stab at tile/level stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
101 """
331
0c25bca380de Support for loading level from string.
Simon Cross <hodgestar@gmail.com>
parents: 317
diff changeset
102 if self.source is not None:
0c25bca380de Support for loading level from string.
Simon Cross <hodgestar@gmail.com>
parents: 317
diff changeset
103 level_data = StringIO(self.source)
0c25bca380de Support for loading level from string.
Simon Cross <hodgestar@gmail.com>
parents: 317
diff changeset
104 else:
0c25bca380de Support for loading level from string.
Simon Cross <hodgestar@gmail.com>
parents: 317
diff changeset
105 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
106 self.name = level_data.readline().strip()
31
67218082cdbb More level non-functionality.
Jeremy Thurgood <firxen@gmail.com>
parents: 21
diff changeset
107 tileset_name = level_data.readline().strip()
21
f76c3f033772 Release early, release broken. Level stuff.
Jeremy Thurgood <firxen@gmail.com>
parents: 8
diff changeset
108 self.tileset = Tileset(tileset_name)
317
e89702425a73 Add support for playing music to levels
Neil Muller <drnlmuller@gmail.com>
parents: 274
diff changeset
109 self.background_track = level_data.readline().strip()
84
cced0ddda33f More level validation.
Jeremy Thurgood <firxen@gmail.com>
parents: 83
diff changeset
110 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
111 try:
e461aa9d112f Raise InvalidMapError if "end" token is missing
Neil Muller <drnlmuller@gmail.com>
parents: 259
diff changeset
112 end = tiles_ascii.index("end")
e461aa9d112f Raise InvalidMapError if "end" token is missing
Neil Muller <drnlmuller@gmail.com>
parents: 259
diff changeset
113 except ValueError:
e461aa9d112f Raise InvalidMapError if "end" token is missing
Neil Muller <drnlmuller@gmail.com>
parents: 259
diff changeset
114 raise InvalidMapError('Missing "end" marker in level')
230
e4f983b68ef5 Start of advanced sprite definitions.
Simon Cross <hodgestar@gmail.com>
parents: 220
diff changeset
115 sprites_ascii = tiles_ascii[end + 1:]
e4f983b68ef5 Start of advanced sprite definitions.
Simon Cross <hodgestar@gmail.com>
parents: 220
diff changeset
116 tiles_ascii = tiles_ascii[:end]
123
915fd0ee28f5 Added test tile orientation
Gideon Visser <gideon@gideonvisser.com>
parents: 112
diff changeset
117 self.tiles_ascii = tiles_ascii
230
e4f983b68ef5 Start of advanced sprite definitions.
Simon Cross <hodgestar@gmail.com>
parents: 220
diff changeset
118 self.sprites_ascii = sprites_ascii
e4f983b68ef5 Start of advanced sprite definitions.
Simon Cross <hodgestar@gmail.com>
parents: 220
diff changeset
119 self.setup_level(tiles_ascii, sprites_ascii)
71
58557a89ec86 Some tile improvements and stuff.
Jeremy Thurgood <firxen@gmail.com>
parents: 57
diff changeset
120 self.make_background()
58557a89ec86 Some tile improvements and stuff.
Jeremy Thurgood <firxen@gmail.com>
parents: 57
diff changeset
121
363
21caf90f604e Validate levels before saving them
Neil Muller <drnlmuller@gmail.com>
parents: 361
diff changeset
122 def validate_level(self):
21caf90f604e Validate levels before saving them
Neil Muller <drnlmuller@gmail.com>
parents: 361
diff changeset
123 old_tiles_ascii = self.tiles_ascii[:]
21caf90f604e Validate levels before saving them
Neil Muller <drnlmuller@gmail.com>
parents: 361
diff changeset
124 old_tiles = self.tiles[:]
21caf90f604e Validate levels before saving them
Neil Muller <drnlmuller@gmail.com>
parents: 361
diff changeset
125 try:
21caf90f604e Validate levels before saving them
Neil Muller <drnlmuller@gmail.com>
parents: 361
diff changeset
126 self.update_tiles_ascii()
21caf90f604e Validate levels before saving them
Neil Muller <drnlmuller@gmail.com>
parents: 361
diff changeset
127 self.setup_tiles(self.tiles_ascii)
21caf90f604e Validate levels before saving them
Neil Muller <drnlmuller@gmail.com>
parents: 361
diff changeset
128 finally:
21caf90f604e Validate levels before saving them
Neil Muller <drnlmuller@gmail.com>
parents: 361
diff changeset
129 self.tiles = old_tiles
21caf90f604e Validate levels before saving them
Neil Muller <drnlmuller@gmail.com>
parents: 361
diff changeset
130 self.tiles_ascii = old_tiles_ascii
21caf90f604e Validate levels before saving them
Neil Muller <drnlmuller@gmail.com>
parents: 361
diff changeset
131
489
e522db37e5c5 Refactor level saving to allow saving to a passed in file (e.g. StringIO object).
Simon Cross <hodgestar@gmail.com>
parents: 428
diff changeset
132 def save_level(self, level_dir=None, is_user_dir=False, save_file=None):
174
893fb9f8f468 Hook up basic saving
Neil Muller <drnlmuller@gmail.com>
parents: 173
diff changeset
133 """Save the current state of the level"""
489
e522db37e5c5 Refactor level saving to allow saving to a passed in file (e.g. StringIO object).
Simon Cross <hodgestar@gmail.com>
parents: 428
diff changeset
134 if save_file is None:
e522db37e5c5 Refactor level saving to allow saving to a passed in file (e.g. StringIO object).
Simon Cross <hodgestar@gmail.com>
parents: 428
diff changeset
135 if level_dir is None:
e522db37e5c5 Refactor level saving to allow saving to a passed in file (e.g. StringIO object).
Simon Cross <hodgestar@gmail.com>
parents: 428
diff changeset
136 level_dir = 'levels'
e522db37e5c5 Refactor level saving to allow saving to a passed in file (e.g. StringIO object).
Simon Cross <hodgestar@gmail.com>
parents: 428
diff changeset
137 file_path = '%s/%s.txt' % (level_dir, self.level_name)
e522db37e5c5 Refactor level saving to allow saving to a passed in file (e.g. StringIO object).
Simon Cross <hodgestar@gmail.com>
parents: 428
diff changeset
138 save_file = load_file(file_path, 'wb', is_user_dir=is_user_dir)
174
893fb9f8f468 Hook up basic saving
Neil Muller <drnlmuller@gmail.com>
parents: 173
diff changeset
139 save_file.write('%s\n' % self.name)
893fb9f8f468 Hook up basic saving
Neil Muller <drnlmuller@gmail.com>
parents: 173
diff changeset
140 save_file.write('%s\n' % self.tileset.name)
317
e89702425a73 Add support for playing music to levels
Neil Muller <drnlmuller@gmail.com>
parents: 274
diff changeset
141 save_file.write('%s\n' % self.background_track)
274
b970f717479b Rework things to make updating tiles_ascii easier
Neil Muller <drnlmuller@gmail.com>
parents: 260
diff changeset
142 self.update_tiles_ascii()
b970f717479b Rework things to make updating tiles_ascii easier
Neil Muller <drnlmuller@gmail.com>
parents: 260
diff changeset
143 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
144 save_file.write('%s\n' % tile_row)
230
e4f983b68ef5 Start of advanced sprite definitions.
Simon Cross <hodgestar@gmail.com>
parents: 220
diff changeset
145 save_file.write('end\n')
e4f983b68ef5 Start of advanced sprite definitions.
Simon Cross <hodgestar@gmail.com>
parents: 220
diff changeset
146 for sprite_ascii in self.sprites_ascii:
247
8e9fcdf98a6b Fix saving sprite ascii data.
Simon Cross <hodgestar@gmail.com>
parents: 243
diff changeset
147 save_file.write('%s\n' % sprite_ascii)
230
e4f983b68ef5 Start of advanced sprite definitions.
Simon Cross <hodgestar@gmail.com>
parents: 220
diff changeset
148
361
d4062344d8f4 Level namespaces (for telling that a level is complete, no matter where it came from)
Stefano Rivera <stefano@rivera.za.net>
parents: 352
diff changeset
149 def unique_name(self):
d4062344d8f4 Level namespaces (for telling that a level is complete, no matter where it came from)
Stefano Rivera <stefano@rivera.za.net>
parents: 352
diff changeset
150 return '/'.join((self.level_namespace, self.level_name))
d4062344d8f4 Level namespaces (for telling that a level is complete, no matter where it came from)
Stefano Rivera <stefano@rivera.za.net>
parents: 352
diff changeset
151
274
b970f717479b Rework things to make updating tiles_ascii easier
Neil Muller <drnlmuller@gmail.com>
parents: 260
diff changeset
152 def update_tiles_ascii(self):
b970f717479b Rework things to make updating tiles_ascii easier
Neil Muller <drnlmuller@gmail.com>
parents: 260
diff changeset
153 """Resync tiles and tile_ascii"""
b970f717479b Rework things to make updating tiles_ascii easier
Neil Muller <drnlmuller@gmail.com>
parents: 260
diff changeset
154 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
155 new_row = []
b970f717479b Rework things to make updating tiles_ascii easier
Neil Muller <drnlmuller@gmail.com>
parents: 260
diff changeset
156 for tile in tile_row:
b970f717479b Rework things to make updating tiles_ascii easier
Neil Muller <drnlmuller@gmail.com>
parents: 260
diff changeset
157 if tile:
b970f717479b Rework things to make updating tiles_ascii easier
Neil Muller <drnlmuller@gmail.com>
parents: 260
diff changeset
158 new_row.append(tile.tile_char)
b970f717479b Rework things to make updating tiles_ascii easier
Neil Muller <drnlmuller@gmail.com>
parents: 260
diff changeset
159 else:
b970f717479b Rework things to make updating tiles_ascii easier
Neil Muller <drnlmuller@gmail.com>
parents: 260
diff changeset
160 new_row.append('.')
b970f717479b Rework things to make updating tiles_ascii easier
Neil Muller <drnlmuller@gmail.com>
parents: 260
diff changeset
161 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
162
230
e4f983b68ef5 Start of advanced sprite definitions.
Simon Cross <hodgestar@gmail.com>
parents: 220
diff changeset
163 def setup_level(self, tiles_ascii, sprites_ascii):
e4f983b68ef5 Start of advanced sprite definitions.
Simon Cross <hodgestar@gmail.com>
parents: 220
diff changeset
164 self.sprites = RenderUpdates()
e4f983b68ef5 Start of advanced sprite definitions.
Simon Cross <hodgestar@gmail.com>
parents: 220
diff changeset
165 self.setup_tiles(tiles_ascii)
e4f983b68ef5 Start of advanced sprite definitions.
Simon Cross <hodgestar@gmail.com>
parents: 220
diff changeset
166 self.setup_sprites(sprites_ascii)
174
893fb9f8f468 Hook up basic saving
Neil Muller <drnlmuller@gmail.com>
parents: 173
diff changeset
167
81
c8d6ca296884 Better level entry points.
Jeremy Thurgood <firxen@gmail.com>
parents: 71
diff changeset
168 def setup_tiles(self, tiles_ascii):
c8d6ca296884 Better level entry points.
Jeremy Thurgood <firxen@gmail.com>
parents: 71
diff changeset
169 self.tiles = []
c8d6ca296884 Better level entry points.
Jeremy Thurgood <firxen@gmail.com>
parents: 71
diff changeset
170 self.entry = None
84
cced0ddda33f More level validation.
Jeremy Thurgood <firxen@gmail.com>
parents: 83
diff changeset
171 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
172 for y, row in enumerate(tiles_ascii):
84
cced0ddda33f More level validation.
Jeremy Thurgood <firxen@gmail.com>
parents: 83
diff changeset
173 if len(row) != self.tile_size[0]:
cced0ddda33f More level validation.
Jeremy Thurgood <firxen@gmail.com>
parents: 83
diff changeset
174 raise InvalidMapError("Map not rectangular.")
81
c8d6ca296884 Better level entry points.
Jeremy Thurgood <firxen@gmail.com>
parents: 71
diff changeset
175 tile_row = []
84
cced0ddda33f More level validation.
Jeremy Thurgood <firxen@gmail.com>
parents: 83
diff changeset
176 for x, tile_char in enumerate(row):
141
2c643ec8dc4e pep8 & pyflakes cleanup
Neil Muller <drnlmuller@gmail.com>
parents: 136
diff changeset
177 #tile_orientation = self.get_tile_orientation(y, x, row,
2c643ec8dc4e pep8 & pyflakes cleanup
Neil Muller <drnlmuller@gmail.com>
parents: 136
diff changeset
178 # tile_char)
81
c8d6ca296884 Better level entry points.
Jeremy Thurgood <firxen@gmail.com>
parents: 71
diff changeset
179 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
180 tile_row.append(tile)
162
7fbbe27120a9 Rodents! Amphibians! Import juggling!
Jeremy Thurgood <firxen@gmail.com>
parents: 146
diff changeset
181 if isinstance(tile, sprites.EntrySprite):
199
986e72d2cb4d Rejiggered entrances and shifted directions around.
Jeremy Thurgood <firxen@gmail.com>
parents: 197
diff changeset
182 self.rejigger_entry_tile(tile)
81
c8d6ca296884 Better level entry points.
Jeremy Thurgood <firxen@gmail.com>
parents: 71
diff changeset
183 self.tiles.append(tile_row)
c8d6ca296884 Better level entry points.
Jeremy Thurgood <firxen@gmail.com>
parents: 71
diff changeset
184 if self.entry is None:
c8d6ca296884 Better level entry points.
Jeremy Thurgood <firxen@gmail.com>
parents: 71
diff changeset
185 raise InvalidMapError("Not enough entry points.")
144
b292370c4548 Rearranged the orientation stuff. :-)
Jeremy Thurgood <firxen@gmail.com>
parents: 143
diff changeset
186 self.set_tile_orientations()
b292370c4548 Rearranged the orientation stuff. :-)
Jeremy Thurgood <firxen@gmail.com>
parents: 143
diff changeset
187
199
986e72d2cb4d Rejiggered entrances and shifted directions around.
Jeremy Thurgood <firxen@gmail.com>
parents: 197
diff changeset
188 def rejigger_entry_tile(self, tile):
986e72d2cb4d Rejiggered entrances and shifted directions around.
Jeremy Thurgood <firxen@gmail.com>
parents: 197
diff changeset
189 if self.entry is not None:
986e72d2cb4d Rejiggered entrances and shifted directions around.
Jeremy Thurgood <firxen@gmail.com>
parents: 197
diff changeset
190 raise InvalidMapError("Too many entry points.")
986e72d2cb4d Rejiggered entrances and shifted directions around.
Jeremy Thurgood <firxen@gmail.com>
parents: 197
diff changeset
191 self.entry = tile
986e72d2cb4d Rejiggered entrances and shifted directions around.
Jeremy Thurgood <firxen@gmail.com>
parents: 197
diff changeset
192 direction = []
986e72d2cb4d Rejiggered entrances and shifted directions around.
Jeremy Thurgood <firxen@gmail.com>
parents: 197
diff changeset
193 x, y = tile.tile_pos
986e72d2cb4d Rejiggered entrances and shifted directions around.
Jeremy Thurgood <firxen@gmail.com>
parents: 197
diff changeset
194 if x == 0:
986e72d2cb4d Rejiggered entrances and shifted directions around.
Jeremy Thurgood <firxen@gmail.com>
parents: 197
diff changeset
195 direction.append(RIGHT)
986e72d2cb4d Rejiggered entrances and shifted directions around.
Jeremy Thurgood <firxen@gmail.com>
parents: 197
diff changeset
196 elif x == self.tile_size[0] - 1:
986e72d2cb4d Rejiggered entrances and shifted directions around.
Jeremy Thurgood <firxen@gmail.com>
parents: 197
diff changeset
197 direction.append(LEFT)
986e72d2cb4d Rejiggered entrances and shifted directions around.
Jeremy Thurgood <firxen@gmail.com>
parents: 197
diff changeset
198 if y == 0:
986e72d2cb4d Rejiggered entrances and shifted directions around.
Jeremy Thurgood <firxen@gmail.com>
parents: 197
diff changeset
199 direction.append(DOWN)
986e72d2cb4d Rejiggered entrances and shifted directions around.
Jeremy Thurgood <firxen@gmail.com>
parents: 197
diff changeset
200 elif y == self.tile_size[1] - 1:
986e72d2cb4d Rejiggered entrances and shifted directions around.
Jeremy Thurgood <firxen@gmail.com>
parents: 197
diff changeset
201 direction.append(UP)
986e72d2cb4d Rejiggered entrances and shifted directions around.
Jeremy Thurgood <firxen@gmail.com>
parents: 197
diff changeset
202 if len(direction) < 1:
986e72d2cb4d Rejiggered entrances and shifted directions around.
Jeremy Thurgood <firxen@gmail.com>
parents: 197
diff changeset
203 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
204 if len(direction) > 1:
986e72d2cb4d Rejiggered entrances and shifted directions around.
Jeremy Thurgood <firxen@gmail.com>
parents: 197
diff changeset
205 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
206 tile.set_direction(direction[0])
986e72d2cb4d Rejiggered entrances and shifted directions around.
Jeremy Thurgood <firxen@gmail.com>
parents: 197
diff changeset
207
144
b292370c4548 Rearranged the orientation stuff. :-)
Jeremy Thurgood <firxen@gmail.com>
parents: 143
diff changeset
208 def set_tile_orientations(self):
b292370c4548 Rearranged the orientation stuff. :-)
Jeremy Thurgood <firxen@gmail.com>
parents: 143
diff changeset
209 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
210 for row in self.tiles
b292370c4548 Rearranged the orientation stuff. :-)
Jeremy Thurgood <firxen@gmail.com>
parents: 143
diff changeset
211 for tile in row
b292370c4548 Rearranged the orientation stuff. :-)
Jeremy Thurgood <firxen@gmail.com>
parents: 143
diff changeset
212 if tile is not None]
b292370c4548 Rearranged the orientation stuff. :-)
Jeremy Thurgood <firxen@gmail.com>
parents: 143
diff changeset
213 for tile in tiles:
b292370c4548 Rearranged the orientation stuff. :-)
Jeremy Thurgood <firxen@gmail.com>
parents: 143
diff changeset
214 orientation = self.get_tile_orientation(tile)
b292370c4548 Rearranged the orientation stuff. :-)
Jeremy Thurgood <firxen@gmail.com>
parents: 143
diff changeset
215 tile.use_variant(*orientation)
81
c8d6ca296884 Better level entry points.
Jeremy Thurgood <firxen@gmail.com>
parents: 71
diff changeset
216
230
e4f983b68ef5 Start of advanced sprite definitions.
Simon Cross <hodgestar@gmail.com>
parents: 220
diff changeset
217 def setup_sprites(self, sprites_ascii):
243
f9cc701a6be0 Hook up tunnels.
Simon Cross <hodgestar@gmail.com>
parents: 238
diff changeset
218 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
219 sprite_positions = []
230
e4f983b68ef5 Start of advanced sprite definitions.
Simon Cross <hodgestar@gmail.com>
parents: 220
diff changeset
220 for sprite_ascii in sprites_ascii:
342
868a53b96c29 Protect against malformed sprite lines
Neil Muller <drnlmuller@gmail.com>
parents: 331
diff changeset
221 try:
868a53b96c29 Protect against malformed sprite lines
Neil Muller <drnlmuller@gmail.com>
parents: 331
diff changeset
222 pos, _sep, rest = sprite_ascii.partition(':')
868a53b96c29 Protect against malformed sprite lines
Neil Muller <drnlmuller@gmail.com>
parents: 331
diff changeset
223 except ValueError:
868a53b96c29 Protect against malformed sprite lines
Neil Muller <drnlmuller@gmail.com>
parents: 331
diff changeset
224 raise InvalidMapError('Unable to determine sprite position'
868a53b96c29 Protect against malformed sprite lines
Neil Muller <drnlmuller@gmail.com>
parents: 331
diff changeset
225 ' from line: %s' % sprite_ascii)
256
9827ce469834 Add more validation exceptions to new map loading code. Handle trying to load when display hasn't been initiliased better
Neil Muller <drnlmuller@gmail.com>
parents: 253
diff changeset
226 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
227 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
228 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
229 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
230 "Got %s" % pos)
230
e4f983b68ef5 Start of advanced sprite definitions.
Simon Cross <hodgestar@gmail.com>
parents: 220
diff changeset
231 class_name, rest = rest.split(None, 1)
e4f983b68ef5 Start of advanced sprite definitions.
Simon Cross <hodgestar@gmail.com>
parents: 220
diff changeset
232 args = rest.split()
243
f9cc701a6be0 Hook up tunnels.
Simon Cross <hodgestar@gmail.com>
parents: 238
diff changeset
233 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
234 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
235 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
236 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
237 raise InvalidMapError("Unknown Sprite class: %s" % class_name)
230
e4f983b68ef5 Start of advanced sprite definitions.
Simon Cross <hodgestar@gmail.com>
parents: 220
diff changeset
238 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
239 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
240 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
241 sprite_positions.append(pos)
230
e4f983b68ef5 Start of advanced sprite definitions.
Simon Cross <hodgestar@gmail.com>
parents: 220
diff changeset
242 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
243 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
244 raise InvalidMapError('Duplicate sprite id: %s.' % sprite_id)
243
f9cc701a6be0 Hook up tunnels.
Simon Cross <hodgestar@gmail.com>
parents: 238
diff changeset
245 self.extra_sprites[sprite_id] = sprite
230
e4f983b68ef5 Start of advanced sprite definitions.
Simon Cross <hodgestar@gmail.com>
parents: 220
diff changeset
246 self.sprites.add(sprite)
e4f983b68ef5 Start of advanced sprite definitions.
Simon Cross <hodgestar@gmail.com>
parents: 220
diff changeset
247
123
915fd0ee28f5 Added test tile orientation
Gideon Visser <gideon@gideonvisser.com>
parents: 112
diff changeset
248 def is_same_tile(self, tile, x, y):
915fd0ee28f5 Added test tile orientation
Gideon Visser <gideon@gideonvisser.com>
parents: 112
diff changeset
249 """Is there a tile of the same type?"""
144
b292370c4548 Rearranged the orientation stuff. :-)
Jeremy Thurgood <firxen@gmail.com>
parents: 143
diff changeset
250 if tile.tile_char is None:
b292370c4548 Rearranged the orientation stuff. :-)
Jeremy Thurgood <firxen@gmail.com>
parents: 143
diff changeset
251 # This isn't really a tile, so bail
b292370c4548 Rearranged the orientation stuff. :-)
Jeremy Thurgood <firxen@gmail.com>
parents: 143
diff changeset
252 return False
123
915fd0ee28f5 Added test tile orientation
Gideon Visser <gideon@gideonvisser.com>
parents: 112
diff changeset
253 try:
144
b292370c4548 Rearranged the orientation stuff. :-)
Jeremy Thurgood <firxen@gmail.com>
parents: 143
diff changeset
254 other_tile = self.tiles[y][x]
b292370c4548 Rearranged the orientation stuff. :-)
Jeremy Thurgood <firxen@gmail.com>
parents: 143
diff changeset
255 except IndexError:
b292370c4548 Rearranged the orientation stuff. :-)
Jeremy Thurgood <firxen@gmail.com>
parents: 143
diff changeset
256 # We're over the edge of the map
b292370c4548 Rearranged the orientation stuff. :-)
Jeremy Thurgood <firxen@gmail.com>
parents: 143
diff changeset
257 return False
b292370c4548 Rearranged the orientation stuff. :-)
Jeremy Thurgood <firxen@gmail.com>
parents: 143
diff changeset
258 if other_tile is None:
b292370c4548 Rearranged the orientation stuff. :-)
Jeremy Thurgood <firxen@gmail.com>
parents: 143
diff changeset
259 # Emptiness.
b292370c4548 Rearranged the orientation stuff. :-)
Jeremy Thurgood <firxen@gmail.com>
parents: 143
diff changeset
260 return False
b292370c4548 Rearranged the orientation stuff. :-)
Jeremy Thurgood <firxen@gmail.com>
parents: 143
diff changeset
261 return tile.tile_char == other_tile.tile_char
123
915fd0ee28f5 Added test tile orientation
Gideon Visser <gideon@gideonvisser.com>
parents: 112
diff changeset
262
144
b292370c4548 Rearranged the orientation stuff. :-)
Jeremy Thurgood <firxen@gmail.com>
parents: 143
diff changeset
263 def get_tile_orientation(self, tile):
b292370c4548 Rearranged the orientation stuff. :-)
Jeremy Thurgood <firxen@gmail.com>
parents: 143
diff changeset
264 if tile is None:
b292370c4548 Rearranged the orientation stuff. :-)
Jeremy Thurgood <firxen@gmail.com>
parents: 143
diff changeset
265 return (False, False, False, False)
b292370c4548 Rearranged the orientation stuff. :-)
Jeremy Thurgood <firxen@gmail.com>
parents: 143
diff changeset
266 map_x, map_y = tile.tile_pos
b292370c4548 Rearranged the orientation stuff. :-)
Jeremy Thurgood <firxen@gmail.com>
parents: 143
diff changeset
267 return (
b292370c4548 Rearranged the orientation stuff. :-)
Jeremy Thurgood <firxen@gmail.com>
parents: 143
diff changeset
268 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
269 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
270 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
271 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
272 )
123
915fd0ee28f5 Added test tile orientation
Gideon Visser <gideon@gideonvisser.com>
parents: 112
diff changeset
273
71
58557a89ec86 Some tile improvements and stuff.
Jeremy Thurgood <firxen@gmail.com>
parents: 57
diff changeset
274 def get_tile_size(self):
84
cced0ddda33f More level validation.
Jeremy Thurgood <firxen@gmail.com>
parents: 83
diff changeset
275 return self.tile_size
21
f76c3f033772 Release early, release broken. Level stuff.
Jeremy Thurgood <firxen@gmail.com>
parents: 8
diff changeset
276
f76c3f033772 Release early, release broken. Level stuff.
Jeremy Thurgood <firxen@gmail.com>
parents: 8
diff changeset
277 def get_size(self):
71
58557a89ec86 Some tile improvements and stuff.
Jeremy Thurgood <firxen@gmail.com>
parents: 57
diff changeset
278 x, y = self.get_tile_size()
162
7fbbe27120a9 Rodents! Amphibians! Import juggling!
Jeremy Thurgood <firxen@gmail.com>
parents: 146
diff changeset
279 return sprites.tile_sizify((x, y))
71
58557a89ec86 Some tile improvements and stuff.
Jeremy Thurgood <firxen@gmail.com>
parents: 57
diff changeset
280
58557a89ec86 Some tile improvements and stuff.
Jeremy Thurgood <firxen@gmail.com>
parents: 57
diff changeset
281 def make_background(self):
259
8d9424909118 Fix test of whether pygame.display is initialized.
Simon Cross <hodgestar@gmail.com>
parents: 256
diff changeset
282 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
283 # 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
284 return
71
58557a89ec86 Some tile improvements and stuff.
Jeremy Thurgood <firxen@gmail.com>
parents: 57
diff changeset
285 sx, sy = self.get_tile_size()
58557a89ec86 Some tile improvements and stuff.
Jeremy Thurgood <firxen@gmail.com>
parents: 57
diff changeset
286 self.background = Surface(self.get_size())
162
7fbbe27120a9 Rodents! Amphibians! Import juggling!
Jeremy Thurgood <firxen@gmail.com>
parents: 146
diff changeset
287 [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
288 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
289
c8d6ca296884 Better level entry points.
Jeremy Thurgood <firxen@gmail.com>
parents: 71
diff changeset
290 def get_entry(self):
c8d6ca296884 Better level entry points.
Jeremy Thurgood <firxen@gmail.com>
parents: 71
diff changeset
291 return (self.entry.tile_pos, self.entry.direction)
110
e6299eb296ce Draw the world!
Simon Cross <hodgestar@gmail.com>
parents: 105
diff changeset
292
e6299eb296ce Draw the world!
Simon Cross <hodgestar@gmail.com>
parents: 105
diff changeset
293 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
294 surface.blit(self.background, (0, 0))
110
e6299eb296ce Draw the world!
Simon Cross <hodgestar@gmail.com>
parents: 105
diff changeset
295 self.sprites.draw(surface)
173
71911af9d42d Refactor drawing code. Correct tile variants when painting
Neil Muller <drnlmuller@gmail.com>
parents: 169
diff changeset
296
71911af9d42d Refactor drawing code. Correct tile variants when painting
Neil Muller <drnlmuller@gmail.com>
parents: 169
diff changeset
297 def get_tile(self, tile_pos):
71911af9d42d Refactor drawing code. Correct tile variants when painting
Neil Muller <drnlmuller@gmail.com>
parents: 169
diff changeset
298 x, y = tile_pos
71911af9d42d Refactor drawing code. Correct tile variants when painting
Neil Muller <drnlmuller@gmail.com>
parents: 169
diff changeset
299 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
300 return self.tiles[y][x]
71911af9d42d Refactor drawing code. Correct tile variants when painting
Neil Muller <drnlmuller@gmail.com>
parents: 169
diff changeset
301 return None
71911af9d42d Refactor drawing code. Correct tile variants when painting
Neil Muller <drnlmuller@gmail.com>
parents: 169
diff changeset
302
71911af9d42d Refactor drawing code. Correct tile variants when painting
Neil Muller <drnlmuller@gmail.com>
parents: 169
diff changeset
303 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
304 x, y = tile_pos
71911af9d42d Refactor drawing code. Correct tile variants when painting
Neil Muller <drnlmuller@gmail.com>
parents: 169
diff changeset
305 old_tile = self.tiles[y][x]
71911af9d42d Refactor drawing code. Correct tile variants when painting
Neil Muller <drnlmuller@gmail.com>
parents: 169
diff changeset
306 if old_tile is not None:
71911af9d42d Refactor drawing code. Correct tile variants when painting
Neil Muller <drnlmuller@gmail.com>
parents: 169
diff changeset
307 old_tile.remove(self.sprites)
71911af9d42d Refactor drawing code. Correct tile variants when painting
Neil Muller <drnlmuller@gmail.com>
parents: 169
diff changeset
308 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
309 self.tiles[y][x] = new_tile
71911af9d42d Refactor drawing code. Correct tile variants when painting
Neil Muller <drnlmuller@gmail.com>
parents: 169
diff changeset
310 # Fix orientations
71911af9d42d Refactor drawing code. Correct tile variants when painting
Neil Muller <drnlmuller@gmail.com>
parents: 169
diff changeset
311 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
312 for dy in (-1, 0, 1)]
71911af9d42d Refactor drawing code. Correct tile variants when painting
Neil Muller <drnlmuller@gmail.com>
parents: 169
diff changeset
313 for tile in tiles:
71911af9d42d Refactor drawing code. Correct tile variants when painting
Neil Muller <drnlmuller@gmail.com>
parents: 169
diff changeset
314 if tile:
71911af9d42d Refactor drawing code. Correct tile variants when painting
Neil Muller <drnlmuller@gmail.com>
parents: 169
diff changeset
315 orientation = self.get_tile_orientation(tile)
71911af9d42d Refactor drawing code. Correct tile variants when painting
Neil Muller <drnlmuller@gmail.com>
parents: 169
diff changeset
316 tile.use_variant(*orientation)
186
275f0be6946c Reincarnating Snakes
Neil Muller <drnlmuller@gmail.com>
parents: 182
diff changeset
317
248
de3b4048e54a Hook up tile arrow rotation
Stefano Rivera <stefano@rivera.za.net>
parents: 247
diff changeset
318 def flip_arrows(self):
de3b4048e54a Hook up tile arrow rotation
Stefano Rivera <stefano@rivera.za.net>
parents: 247
diff changeset
319 for row in self.tiles:
de3b4048e54a Hook up tile arrow rotation
Stefano Rivera <stefano@rivera.za.net>
parents: 247
diff changeset
320 for tile in row:
de3b4048e54a Hook up tile arrow rotation
Stefano Rivera <stefano@rivera.za.net>
parents: 247
diff changeset
321 if isinstance(tile, sprites.ArrowSprite):
de3b4048e54a Hook up tile arrow rotation
Stefano Rivera <stefano@rivera.za.net>
parents: 247
diff changeset
322 tile.rotate()
de3b4048e54a Hook up tile arrow rotation
Stefano Rivera <stefano@rivera.za.net>
parents: 247
diff changeset
323
186
275f0be6946c Reincarnating Snakes
Neil Muller <drnlmuller@gmail.com>
parents: 182
diff changeset
324 def restart(self):
275f0be6946c Reincarnating Snakes
Neil Muller <drnlmuller@gmail.com>
parents: 182
diff changeset
325 """Reset the level state"""
230
e4f983b68ef5 Start of advanced sprite definitions.
Simon Cross <hodgestar@gmail.com>
parents: 220
diff changeset
326 self.setup_level(self.tiles_ascii, self.sprites_ascii)
186
275f0be6946c Reincarnating Snakes
Neil Muller <drnlmuller@gmail.com>
parents: 182
diff changeset
327 self.make_background()
343
5bf35267ddc0 Hook up sprite deletion. Framework work for sprite editing & adding
Neil Muller <drnlmuller@gmail.com>
parents: 342
diff changeset
328
5bf35267ddc0 Hook up sprite deletion. Framework work for sprite editing & adding
Neil Muller <drnlmuller@gmail.com>
parents: 342
diff changeset
329 def get_sprite_at(self, sprite_pos):
5bf35267ddc0 Hook up sprite deletion. Framework work for sprite editing & adding
Neil Muller <drnlmuller@gmail.com>
parents: 342
diff changeset
330 """Return the sprite line at the given pos, or none if it doesn't
5bf35267ddc0 Hook up sprite deletion. Framework work for sprite editing & adding
Neil Muller <drnlmuller@gmail.com>
parents: 342
diff changeset
331 exist"""
5bf35267ddc0 Hook up sprite deletion. Framework work for sprite editing & adding
Neil Muller <drnlmuller@gmail.com>
parents: 342
diff changeset
332 for sprite_ascii in self.sprites_ascii:
5bf35267ddc0 Hook up sprite deletion. Framework work for sprite editing & adding
Neil Muller <drnlmuller@gmail.com>
parents: 342
diff changeset
333 try:
352
abd9a2ceadb7 Fix and extend sprite fiddling code
Neil Muller <drnlmuller@gmail.com>
parents: 343
diff changeset
334 pos, _, rest = sprite_ascii.partition(':')
343
5bf35267ddc0 Hook up sprite deletion. Framework work for sprite editing & adding
Neil Muller <drnlmuller@gmail.com>
parents: 342
diff changeset
335 pos = [int(x.strip()) for x in pos.split(',')]
5bf35267ddc0 Hook up sprite deletion. Framework work for sprite editing & adding
Neil Muller <drnlmuller@gmail.com>
parents: 342
diff changeset
336 except ValueError:
5bf35267ddc0 Hook up sprite deletion. Framework work for sprite editing & adding
Neil Muller <drnlmuller@gmail.com>
parents: 342
diff changeset
337 continue
5bf35267ddc0 Hook up sprite deletion. Framework work for sprite editing & adding
Neil Muller <drnlmuller@gmail.com>
parents: 342
diff changeset
338 if pos[0] == sprite_pos[0] and pos[1] == sprite_pos[1]:
508
6c61d5862310 Massive speical sprite editor rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 489
diff changeset
339 pos, _sep, rest = sprite_ascii.partition(':')
6c61d5862310 Massive speical sprite editor rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 489
diff changeset
340 class_name, rest = rest.split(None, 1)
6c61d5862310 Massive speical sprite editor rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 489
diff changeset
341 args = rest.split()
6c61d5862310 Massive speical sprite editor rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 489
diff changeset
342 sprite_cls = sprites.find_sprite(class_name)
6c61d5862310 Massive speical sprite editor rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 489
diff changeset
343 sprite_id, args = args[0], args[1:]
6c61d5862310 Massive speical sprite editor rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 489
diff changeset
344 return (class_name, sprite_cls, sprite_id, args), sprite_ascii
6c61d5862310 Massive speical sprite editor rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 489
diff changeset
345 return None, None
343
5bf35267ddc0 Hook up sprite deletion. Framework work for sprite editing & adding
Neil Muller <drnlmuller@gmail.com>
parents: 342
diff changeset
346
5bf35267ddc0 Hook up sprite deletion. Framework work for sprite editing & adding
Neil Muller <drnlmuller@gmail.com>
parents: 342
diff changeset
347 def remove_sprite(self, sprite):
5bf35267ddc0 Hook up sprite deletion. Framework work for sprite editing & adding
Neil Muller <drnlmuller@gmail.com>
parents: 342
diff changeset
348 """Remove the given sprite line from the list of sprites"""
5bf35267ddc0 Hook up sprite deletion. Framework work for sprite editing & adding
Neil Muller <drnlmuller@gmail.com>
parents: 342
diff changeset
349 self.sprites_ascii.remove(sprite)
5bf35267ddc0 Hook up sprite deletion. Framework work for sprite editing & adding
Neil Muller <drnlmuller@gmail.com>
parents: 342
diff changeset
350
5bf35267ddc0 Hook up sprite deletion. Framework work for sprite editing & adding
Neil Muller <drnlmuller@gmail.com>
parents: 342
diff changeset
351 def validate_sprite(self, sprite):
5bf35267ddc0 Hook up sprite deletion. Framework work for sprite editing & adding
Neil Muller <drnlmuller@gmail.com>
parents: 342
diff changeset
352 """Check that the sprite line is valid"""
352
abd9a2ceadb7 Fix and extend sprite fiddling code
Neil Muller <drnlmuller@gmail.com>
parents: 343
diff changeset
353 try:
abd9a2ceadb7 Fix and extend sprite fiddling code
Neil Muller <drnlmuller@gmail.com>
parents: 343
diff changeset
354 pos, _sep, rest = sprite.partition(':')
abd9a2ceadb7 Fix and extend sprite fiddling code
Neil Muller <drnlmuller@gmail.com>
parents: 343
diff changeset
355 pos = [int(x.strip()) for x in pos.split(',')]
abd9a2ceadb7 Fix and extend sprite fiddling code
Neil Muller <drnlmuller@gmail.com>
parents: 343
diff changeset
356 class_name, rest = rest.split(None, 1)
abd9a2ceadb7 Fix and extend sprite fiddling code
Neil Muller <drnlmuller@gmail.com>
parents: 343
diff changeset
357 args = rest.split()
abd9a2ceadb7 Fix and extend sprite fiddling code
Neil Muller <drnlmuller@gmail.com>
parents: 343
diff changeset
358 except ValueError:
abd9a2ceadb7 Fix and extend sprite fiddling code
Neil Muller <drnlmuller@gmail.com>
parents: 343
diff changeset
359 raise InvalidMapError('Unable to determine sprite parameters.')
343
5bf35267ddc0 Hook up sprite deletion. Framework work for sprite editing & adding
Neil Muller <drnlmuller@gmail.com>
parents: 342
diff changeset
360 sprite_id, args = args[0], args[1:]
5bf35267ddc0 Hook up sprite deletion. Framework work for sprite editing & adding
Neil Muller <drnlmuller@gmail.com>
parents: 342
diff changeset
361 try:
5bf35267ddc0 Hook up sprite deletion. Framework work for sprite editing & adding
Neil Muller <drnlmuller@gmail.com>
parents: 342
diff changeset
362 cls = sprites.find_sprite(class_name)
5bf35267ddc0 Hook up sprite deletion. Framework work for sprite editing & adding
Neil Muller <drnlmuller@gmail.com>
parents: 342
diff changeset
363 except KeyError:
5bf35267ddc0 Hook up sprite deletion. Framework work for sprite editing & adding
Neil Muller <drnlmuller@gmail.com>
parents: 342
diff changeset
364 raise InvalidMapError("Unknown Sprite class: %s" % class_name)
5bf35267ddc0 Hook up sprite deletion. Framework work for sprite editing & adding
Neil Muller <drnlmuller@gmail.com>
parents: 342
diff changeset
365 sprite = cls(*args)
5bf35267ddc0 Hook up sprite deletion. Framework work for sprite editing & adding
Neil Muller <drnlmuller@gmail.com>
parents: 342
diff changeset
366 if sprite_id in self.extra_sprites:
5bf35267ddc0 Hook up sprite deletion. Framework work for sprite editing & adding
Neil Muller <drnlmuller@gmail.com>
parents: 342
diff changeset
367 # Check that duplicate id is not at the same position
352
abd9a2ceadb7 Fix and extend sprite fiddling code
Neil Muller <drnlmuller@gmail.com>
parents: 343
diff changeset
368 if self.extra_sprites[sprite_id].tile_pos != pos:
343
5bf35267ddc0 Hook up sprite deletion. Framework work for sprite editing & adding
Neil Muller <drnlmuller@gmail.com>
parents: 342
diff changeset
369 raise InvalidMapError('Duplicate sprite id: %s.' % sprite_id)
352
abd9a2ceadb7 Fix and extend sprite fiddling code
Neil Muller <drnlmuller@gmail.com>
parents: 343
diff changeset
370
abd9a2ceadb7 Fix and extend sprite fiddling code
Neil Muller <drnlmuller@gmail.com>
parents: 343
diff changeset
371 def add_sprite(self, sprite):
abd9a2ceadb7 Fix and extend sprite fiddling code
Neil Muller <drnlmuller@gmail.com>
parents: 343
diff changeset
372 self.sprites_ascii.append(sprite)
abd9a2ceadb7 Fix and extend sprite fiddling code
Neil Muller <drnlmuller@gmail.com>
parents: 343
diff changeset
373
508
6c61d5862310 Massive speical sprite editor rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 489
diff changeset
374 def replace_sprite(self, new_ascii):
352
abd9a2ceadb7 Fix and extend sprite fiddling code
Neil Muller <drnlmuller@gmail.com>
parents: 343
diff changeset
375 # Need to find the sprite at the same psoition
508
6c61d5862310 Massive speical sprite editor rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 489
diff changeset
376 pos, _sep, rest = new_ascii.partition(':')
352
abd9a2ceadb7 Fix and extend sprite fiddling code
Neil Muller <drnlmuller@gmail.com>
parents: 343
diff changeset
377 pos = [int(x.strip()) for x in pos.split(',')]
508
6c61d5862310 Massive speical sprite editor rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 489
diff changeset
378 old_sprite, old_ascii = self.get_sprite_at(pos)
6c61d5862310 Massive speical sprite editor rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 489
diff changeset
379 self.sprites_ascii.remove(old_ascii)
6c61d5862310 Massive speical sprite editor rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 489
diff changeset
380 self.sprites_ascii.append(new_ascii)