annotate mamba/level.py @ 561:9afaa1969d6f

Level format 2 support * * * Allow for blank author * * * Fix thinko in write code
author Neil Muller <drnlmuller@gmail.com>
date Tue, 18 Oct 2011 11:41:28 +0200
parents 6c61d5862310
children 2d3dee657638
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
561
9afaa1969d6f Level format 2 support
Neil Muller <drnlmuller@gmail.com>
parents: 508
diff changeset
9 from mamba.constants import UP, DOWN, LEFT, RIGHT, VERSION
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
561
9afaa1969d6f Level format 2 support
Neil Muller <drnlmuller@gmail.com>
parents: 508
diff changeset
96 self.author = ''
8
66ae99f6903e First stab at tile/level stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
97 self.load_level_data()
66ae99f6903e First stab at tile/level stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
98
561
9afaa1969d6f Level format 2 support
Neil Muller <drnlmuller@gmail.com>
parents: 508
diff changeset
99 def load_format_1(self, level_data):
9afaa1969d6f Level format 2 support
Neil Muller <drnlmuller@gmail.com>
parents: 508
diff changeset
100 """Load the original map format"""
9afaa1969d6f Level format 2 support
Neil Muller <drnlmuller@gmail.com>
parents: 508
diff changeset
101 self.name = level_data[0].strip()
9afaa1969d6f Level format 2 support
Neil Muller <drnlmuller@gmail.com>
parents: 508
diff changeset
102 tileset_name = level_data[1].strip()
9afaa1969d6f Level format 2 support
Neil Muller <drnlmuller@gmail.com>
parents: 508
diff changeset
103 self.tileset = Tileset(tileset_name)
9afaa1969d6f Level format 2 support
Neil Muller <drnlmuller@gmail.com>
parents: 508
diff changeset
104 self.background_track = level_data[2].strip()
9afaa1969d6f Level format 2 support
Neil Muller <drnlmuller@gmail.com>
parents: 508
diff changeset
105 tiles_ascii = [line.strip() for line in level_data[3:]]
9afaa1969d6f Level format 2 support
Neil Muller <drnlmuller@gmail.com>
parents: 508
diff changeset
106 try:
9afaa1969d6f Level format 2 support
Neil Muller <drnlmuller@gmail.com>
parents: 508
diff changeset
107 end = tiles_ascii.index("end")
9afaa1969d6f Level format 2 support
Neil Muller <drnlmuller@gmail.com>
parents: 508
diff changeset
108 except ValueError:
9afaa1969d6f Level format 2 support
Neil Muller <drnlmuller@gmail.com>
parents: 508
diff changeset
109 raise InvalidMapError('Missing "end" marker in level')
9afaa1969d6f Level format 2 support
Neil Muller <drnlmuller@gmail.com>
parents: 508
diff changeset
110 sprites_ascii = tiles_ascii[end + 1:]
9afaa1969d6f Level format 2 support
Neil Muller <drnlmuller@gmail.com>
parents: 508
diff changeset
111 tiles_ascii = tiles_ascii[:end]
9afaa1969d6f Level format 2 support
Neil Muller <drnlmuller@gmail.com>
parents: 508
diff changeset
112 self.tiles_ascii = tiles_ascii
9afaa1969d6f Level format 2 support
Neil Muller <drnlmuller@gmail.com>
parents: 508
diff changeset
113 self.sprites_ascii = sprites_ascii
9afaa1969d6f Level format 2 support
Neil Muller <drnlmuller@gmail.com>
parents: 508
diff changeset
114
9afaa1969d6f Level format 2 support
Neil Muller <drnlmuller@gmail.com>
parents: 508
diff changeset
115 def load_format_2(self, level_data):
9afaa1969d6f Level format 2 support
Neil Muller <drnlmuller@gmail.com>
parents: 508
diff changeset
116 """Load the second mamba map format"""
9afaa1969d6f Level format 2 support
Neil Muller <drnlmuller@gmail.com>
parents: 508
diff changeset
117 try:
9afaa1969d6f Level format 2 support
Neil Muller <drnlmuller@gmail.com>
parents: 508
diff changeset
118 self.name = level_data[1].split('Name:', 1)[1].strip()
9afaa1969d6f Level format 2 support
Neil Muller <drnlmuller@gmail.com>
parents: 508
diff changeset
119 tileset_name = level_data[3].split('Tileset:', 1)[1].strip()
9afaa1969d6f Level format 2 support
Neil Muller <drnlmuller@gmail.com>
parents: 508
diff changeset
120 self.background_track = level_data[4].split('Music:', 1)[1].strip()
9afaa1969d6f Level format 2 support
Neil Muller <drnlmuller@gmail.com>
parents: 508
diff changeset
121 except IndexError:
9afaa1969d6f Level format 2 support
Neil Muller <drnlmuller@gmail.com>
parents: 508
diff changeset
122 raise InvalidMapError('Incorrectly formatted map header')
9afaa1969d6f Level format 2 support
Neil Muller <drnlmuller@gmail.com>
parents: 508
diff changeset
123 try:
9afaa1969d6f Level format 2 support
Neil Muller <drnlmuller@gmail.com>
parents: 508
diff changeset
124 # Missing author isn't fatal
9afaa1969d6f Level format 2 support
Neil Muller <drnlmuller@gmail.com>
parents: 508
diff changeset
125 self.author = level_data[2].split('Author:', 1)[1].strip()
9afaa1969d6f Level format 2 support
Neil Muller <drnlmuller@gmail.com>
parents: 508
diff changeset
126 except IndexError:
9afaa1969d6f Level format 2 support
Neil Muller <drnlmuller@gmail.com>
parents: 508
diff changeset
127 self.author = ''
9afaa1969d6f Level format 2 support
Neil Muller <drnlmuller@gmail.com>
parents: 508
diff changeset
128 self.tileset = Tileset(tileset_name)
9afaa1969d6f Level format 2 support
Neil Muller <drnlmuller@gmail.com>
parents: 508
diff changeset
129 tiles_ascii = [line.strip() for line in level_data[5:]]
9afaa1969d6f Level format 2 support
Neil Muller <drnlmuller@gmail.com>
parents: 508
diff changeset
130 try:
9afaa1969d6f Level format 2 support
Neil Muller <drnlmuller@gmail.com>
parents: 508
diff changeset
131 end = tiles_ascii.index("end")
9afaa1969d6f Level format 2 support
Neil Muller <drnlmuller@gmail.com>
parents: 508
diff changeset
132 except ValueError:
9afaa1969d6f Level format 2 support
Neil Muller <drnlmuller@gmail.com>
parents: 508
diff changeset
133 raise InvalidMapError('Missing "end" marker in level')
9afaa1969d6f Level format 2 support
Neil Muller <drnlmuller@gmail.com>
parents: 508
diff changeset
134 sprites_ascii = tiles_ascii[end + 1:]
9afaa1969d6f Level format 2 support
Neil Muller <drnlmuller@gmail.com>
parents: 508
diff changeset
135 tiles_ascii = tiles_ascii[:end]
9afaa1969d6f Level format 2 support
Neil Muller <drnlmuller@gmail.com>
parents: 508
diff changeset
136 self.tiles_ascii = tiles_ascii
9afaa1969d6f Level format 2 support
Neil Muller <drnlmuller@gmail.com>
parents: 508
diff changeset
137 self.sprites_ascii = sprites_ascii
9afaa1969d6f Level format 2 support
Neil Muller <drnlmuller@gmail.com>
parents: 508
diff changeset
138
9afaa1969d6f Level format 2 support
Neil Muller <drnlmuller@gmail.com>
parents: 508
diff changeset
139 def check_format(self, level_data):
9afaa1969d6f Level format 2 support
Neil Muller <drnlmuller@gmail.com>
parents: 508
diff changeset
140 """Determine which format to load"""
9afaa1969d6f Level format 2 support
Neil Muller <drnlmuller@gmail.com>
parents: 508
diff changeset
141 if (level_data[0].startswith('Version: ') and
9afaa1969d6f Level format 2 support
Neil Muller <drnlmuller@gmail.com>
parents: 508
diff changeset
142 level_data[3].startswith('Tileset: ')):
9afaa1969d6f Level format 2 support
Neil Muller <drnlmuller@gmail.com>
parents: 508
diff changeset
143 # Looks like a version 2 level file
9afaa1969d6f Level format 2 support
Neil Muller <drnlmuller@gmail.com>
parents: 508
diff changeset
144 file_version = level_data[0].split('Version: ', 1)[1].strip()
9afaa1969d6f Level format 2 support
Neil Muller <drnlmuller@gmail.com>
parents: 508
diff changeset
145 try:
9afaa1969d6f Level format 2 support
Neil Muller <drnlmuller@gmail.com>
parents: 508
diff changeset
146 file_version = tuple([int(x) for x in file_version.split('.')])
9afaa1969d6f Level format 2 support
Neil Muller <drnlmuller@gmail.com>
parents: 508
diff changeset
147 # We only compare on the first two elements, so point
9afaa1969d6f Level format 2 support
Neil Muller <drnlmuller@gmail.com>
parents: 508
diff changeset
148 # rleases work as expected
9afaa1969d6f Level format 2 support
Neil Muller <drnlmuller@gmail.com>
parents: 508
diff changeset
149 if file_version[:2] <= VERSION:
9afaa1969d6f Level format 2 support
Neil Muller <drnlmuller@gmail.com>
parents: 508
diff changeset
150 return 2
9afaa1969d6f Level format 2 support
Neil Muller <drnlmuller@gmail.com>
parents: 508
diff changeset
151 else:
9afaa1969d6f Level format 2 support
Neil Muller <drnlmuller@gmail.com>
parents: 508
diff changeset
152 raise InvalidMapError("Unsupported map version")
9afaa1969d6f Level format 2 support
Neil Muller <drnlmuller@gmail.com>
parents: 508
diff changeset
153 except ValueError:
9afaa1969d6f Level format 2 support
Neil Muller <drnlmuller@gmail.com>
parents: 508
diff changeset
154 raise InvalidMapError("Unrecognised map version")
9afaa1969d6f Level format 2 support
Neil Muller <drnlmuller@gmail.com>
parents: 508
diff changeset
155 else:
9afaa1969d6f Level format 2 support
Neil Muller <drnlmuller@gmail.com>
parents: 508
diff changeset
156 # We assume anything we don't recognise is format 0 and rely on the
9afaa1969d6f Level format 2 support
Neil Muller <drnlmuller@gmail.com>
parents: 508
diff changeset
157 # error checking there to save us if we're wrong.
9afaa1969d6f Level format 2 support
Neil Muller <drnlmuller@gmail.com>
parents: 508
diff changeset
158 return 1
9afaa1969d6f Level format 2 support
Neil Muller <drnlmuller@gmail.com>
parents: 508
diff changeset
159
8
66ae99f6903e First stab at tile/level stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
160 def load_level_data(self):
66ae99f6903e First stab at tile/level stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
161 """
31
67218082cdbb More level non-functionality.
Jeremy Thurgood <firxen@gmail.com>
parents: 21
diff changeset
162 This file format is potentially yucky.
8
66ae99f6903e First stab at tile/level stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
163 """
331
0c25bca380de Support for loading level from string.
Simon Cross <hodgestar@gmail.com>
parents: 317
diff changeset
164 if self.source is not None:
0c25bca380de Support for loading level from string.
Simon Cross <hodgestar@gmail.com>
parents: 317
diff changeset
165 level_data = StringIO(self.source)
0c25bca380de Support for loading level from string.
Simon Cross <hodgestar@gmail.com>
parents: 317
diff changeset
166 else:
0c25bca380de Support for loading level from string.
Simon Cross <hodgestar@gmail.com>
parents: 317
diff changeset
167 level_data = load_file('levels/%s.txt' % (self.level_name,))
561
9afaa1969d6f Level format 2 support
Neil Muller <drnlmuller@gmail.com>
parents: 508
diff changeset
168 # XXX: Should we have some size restriction here?
9afaa1969d6f Level format 2 support
Neil Muller <drnlmuller@gmail.com>
parents: 508
diff changeset
169 level_data = level_data.readlines()
9afaa1969d6f Level format 2 support
Neil Muller <drnlmuller@gmail.com>
parents: 508
diff changeset
170 level_format = self.check_format(level_data)
9afaa1969d6f Level format 2 support
Neil Muller <drnlmuller@gmail.com>
parents: 508
diff changeset
171 if level_format == 2:
9afaa1969d6f Level format 2 support
Neil Muller <drnlmuller@gmail.com>
parents: 508
diff changeset
172 self.load_format_2(level_data)
9afaa1969d6f Level format 2 support
Neil Muller <drnlmuller@gmail.com>
parents: 508
diff changeset
173 elif level_format == 1:
9afaa1969d6f Level format 2 support
Neil Muller <drnlmuller@gmail.com>
parents: 508
diff changeset
174 self.load_format_1(level_data)
9afaa1969d6f Level format 2 support
Neil Muller <drnlmuller@gmail.com>
parents: 508
diff changeset
175 else:
9afaa1969d6f Level format 2 support
Neil Muller <drnlmuller@gmail.com>
parents: 508
diff changeset
176 # generic fallback
9afaa1969d6f Level format 2 support
Neil Muller <drnlmuller@gmail.com>
parents: 508
diff changeset
177 raise InvalidMapError("Unrecognised map version")
9afaa1969d6f Level format 2 support
Neil Muller <drnlmuller@gmail.com>
parents: 508
diff changeset
178 self.setup_level(self.tiles_ascii, self.sprites_ascii)
71
58557a89ec86 Some tile improvements and stuff.
Jeremy Thurgood <firxen@gmail.com>
parents: 57
diff changeset
179 self.make_background()
58557a89ec86 Some tile improvements and stuff.
Jeremy Thurgood <firxen@gmail.com>
parents: 57
diff changeset
180
363
21caf90f604e Validate levels before saving them
Neil Muller <drnlmuller@gmail.com>
parents: 361
diff changeset
181 def validate_level(self):
21caf90f604e Validate levels before saving them
Neil Muller <drnlmuller@gmail.com>
parents: 361
diff changeset
182 old_tiles_ascii = self.tiles_ascii[:]
21caf90f604e Validate levels before saving them
Neil Muller <drnlmuller@gmail.com>
parents: 361
diff changeset
183 old_tiles = self.tiles[:]
21caf90f604e Validate levels before saving them
Neil Muller <drnlmuller@gmail.com>
parents: 361
diff changeset
184 try:
21caf90f604e Validate levels before saving them
Neil Muller <drnlmuller@gmail.com>
parents: 361
diff changeset
185 self.update_tiles_ascii()
21caf90f604e Validate levels before saving them
Neil Muller <drnlmuller@gmail.com>
parents: 361
diff changeset
186 self.setup_tiles(self.tiles_ascii)
21caf90f604e Validate levels before saving them
Neil Muller <drnlmuller@gmail.com>
parents: 361
diff changeset
187 finally:
21caf90f604e Validate levels before saving them
Neil Muller <drnlmuller@gmail.com>
parents: 361
diff changeset
188 self.tiles = old_tiles
21caf90f604e Validate levels before saving them
Neil Muller <drnlmuller@gmail.com>
parents: 361
diff changeset
189 self.tiles_ascii = old_tiles_ascii
21caf90f604e Validate levels before saving them
Neil Muller <drnlmuller@gmail.com>
parents: 361
diff changeset
190
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
191 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
192 """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
193 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
194 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
195 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
196 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
197 save_file = load_file(file_path, 'wb', is_user_dir=is_user_dir)
561
9afaa1969d6f Level format 2 support
Neil Muller <drnlmuller@gmail.com>
parents: 508
diff changeset
198 save_file.write('Version: %d.%d\n' % VERSION[:2])
9afaa1969d6f Level format 2 support
Neil Muller <drnlmuller@gmail.com>
parents: 508
diff changeset
199 save_file.write('Name: %s\n' % self.name)
9afaa1969d6f Level format 2 support
Neil Muller <drnlmuller@gmail.com>
parents: 508
diff changeset
200 save_file.write('Author: %s\n' % self.author)
9afaa1969d6f Level format 2 support
Neil Muller <drnlmuller@gmail.com>
parents: 508
diff changeset
201 save_file.write('Tileset: %s\n' % self.tileset.name)
9afaa1969d6f Level format 2 support
Neil Muller <drnlmuller@gmail.com>
parents: 508
diff changeset
202 save_file.write('Music: %s\n' % self.background_track)
274
b970f717479b Rework things to make updating tiles_ascii easier
Neil Muller <drnlmuller@gmail.com>
parents: 260
diff changeset
203 self.update_tiles_ascii()
b970f717479b Rework things to make updating tiles_ascii easier
Neil Muller <drnlmuller@gmail.com>
parents: 260
diff changeset
204 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
205 save_file.write('%s\n' % tile_row)
230
e4f983b68ef5 Start of advanced sprite definitions.
Simon Cross <hodgestar@gmail.com>
parents: 220
diff changeset
206 save_file.write('end\n')
e4f983b68ef5 Start of advanced sprite definitions.
Simon Cross <hodgestar@gmail.com>
parents: 220
diff changeset
207 for sprite_ascii in self.sprites_ascii:
247
8e9fcdf98a6b Fix saving sprite ascii data.
Simon Cross <hodgestar@gmail.com>
parents: 243
diff changeset
208 save_file.write('%s\n' % sprite_ascii)
230
e4f983b68ef5 Start of advanced sprite definitions.
Simon Cross <hodgestar@gmail.com>
parents: 220
diff changeset
209
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
210 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
211 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
212
274
b970f717479b Rework things to make updating tiles_ascii easier
Neil Muller <drnlmuller@gmail.com>
parents: 260
diff changeset
213 def update_tiles_ascii(self):
b970f717479b Rework things to make updating tiles_ascii easier
Neil Muller <drnlmuller@gmail.com>
parents: 260
diff changeset
214 """Resync tiles and tile_ascii"""
b970f717479b Rework things to make updating tiles_ascii easier
Neil Muller <drnlmuller@gmail.com>
parents: 260
diff changeset
215 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
216 new_row = []
b970f717479b Rework things to make updating tiles_ascii easier
Neil Muller <drnlmuller@gmail.com>
parents: 260
diff changeset
217 for tile in tile_row:
b970f717479b Rework things to make updating tiles_ascii easier
Neil Muller <drnlmuller@gmail.com>
parents: 260
diff changeset
218 if tile:
b970f717479b Rework things to make updating tiles_ascii easier
Neil Muller <drnlmuller@gmail.com>
parents: 260
diff changeset
219 new_row.append(tile.tile_char)
b970f717479b Rework things to make updating tiles_ascii easier
Neil Muller <drnlmuller@gmail.com>
parents: 260
diff changeset
220 else:
b970f717479b Rework things to make updating tiles_ascii easier
Neil Muller <drnlmuller@gmail.com>
parents: 260
diff changeset
221 new_row.append('.')
b970f717479b Rework things to make updating tiles_ascii easier
Neil Muller <drnlmuller@gmail.com>
parents: 260
diff changeset
222 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
223
230
e4f983b68ef5 Start of advanced sprite definitions.
Simon Cross <hodgestar@gmail.com>
parents: 220
diff changeset
224 def setup_level(self, tiles_ascii, sprites_ascii):
e4f983b68ef5 Start of advanced sprite definitions.
Simon Cross <hodgestar@gmail.com>
parents: 220
diff changeset
225 self.sprites = RenderUpdates()
e4f983b68ef5 Start of advanced sprite definitions.
Simon Cross <hodgestar@gmail.com>
parents: 220
diff changeset
226 self.setup_tiles(tiles_ascii)
e4f983b68ef5 Start of advanced sprite definitions.
Simon Cross <hodgestar@gmail.com>
parents: 220
diff changeset
227 self.setup_sprites(sprites_ascii)
174
893fb9f8f468 Hook up basic saving
Neil Muller <drnlmuller@gmail.com>
parents: 173
diff changeset
228
81
c8d6ca296884 Better level entry points.
Jeremy Thurgood <firxen@gmail.com>
parents: 71
diff changeset
229 def setup_tiles(self, tiles_ascii):
c8d6ca296884 Better level entry points.
Jeremy Thurgood <firxen@gmail.com>
parents: 71
diff changeset
230 self.tiles = []
c8d6ca296884 Better level entry points.
Jeremy Thurgood <firxen@gmail.com>
parents: 71
diff changeset
231 self.entry = None
84
cced0ddda33f More level validation.
Jeremy Thurgood <firxen@gmail.com>
parents: 83
diff changeset
232 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
233 for y, row in enumerate(tiles_ascii):
84
cced0ddda33f More level validation.
Jeremy Thurgood <firxen@gmail.com>
parents: 83
diff changeset
234 if len(row) != self.tile_size[0]:
cced0ddda33f More level validation.
Jeremy Thurgood <firxen@gmail.com>
parents: 83
diff changeset
235 raise InvalidMapError("Map not rectangular.")
81
c8d6ca296884 Better level entry points.
Jeremy Thurgood <firxen@gmail.com>
parents: 71
diff changeset
236 tile_row = []
84
cced0ddda33f More level validation.
Jeremy Thurgood <firxen@gmail.com>
parents: 83
diff changeset
237 for x, tile_char in enumerate(row):
141
2c643ec8dc4e pep8 & pyflakes cleanup
Neil Muller <drnlmuller@gmail.com>
parents: 136
diff changeset
238 #tile_orientation = self.get_tile_orientation(y, x, row,
2c643ec8dc4e pep8 & pyflakes cleanup
Neil Muller <drnlmuller@gmail.com>
parents: 136
diff changeset
239 # tile_char)
81
c8d6ca296884 Better level entry points.
Jeremy Thurgood <firxen@gmail.com>
parents: 71
diff changeset
240 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
241 tile_row.append(tile)
162
7fbbe27120a9 Rodents! Amphibians! Import juggling!
Jeremy Thurgood <firxen@gmail.com>
parents: 146
diff changeset
242 if isinstance(tile, sprites.EntrySprite):
199
986e72d2cb4d Rejiggered entrances and shifted directions around.
Jeremy Thurgood <firxen@gmail.com>
parents: 197
diff changeset
243 self.rejigger_entry_tile(tile)
81
c8d6ca296884 Better level entry points.
Jeremy Thurgood <firxen@gmail.com>
parents: 71
diff changeset
244 self.tiles.append(tile_row)
c8d6ca296884 Better level entry points.
Jeremy Thurgood <firxen@gmail.com>
parents: 71
diff changeset
245 if self.entry is None:
c8d6ca296884 Better level entry points.
Jeremy Thurgood <firxen@gmail.com>
parents: 71
diff changeset
246 raise InvalidMapError("Not enough entry points.")
144
b292370c4548 Rearranged the orientation stuff. :-)
Jeremy Thurgood <firxen@gmail.com>
parents: 143
diff changeset
247 self.set_tile_orientations()
b292370c4548 Rearranged the orientation stuff. :-)
Jeremy Thurgood <firxen@gmail.com>
parents: 143
diff changeset
248
199
986e72d2cb4d Rejiggered entrances and shifted directions around.
Jeremy Thurgood <firxen@gmail.com>
parents: 197
diff changeset
249 def rejigger_entry_tile(self, tile):
986e72d2cb4d Rejiggered entrances and shifted directions around.
Jeremy Thurgood <firxen@gmail.com>
parents: 197
diff changeset
250 if self.entry is not None:
986e72d2cb4d Rejiggered entrances and shifted directions around.
Jeremy Thurgood <firxen@gmail.com>
parents: 197
diff changeset
251 raise InvalidMapError("Too many entry points.")
986e72d2cb4d Rejiggered entrances and shifted directions around.
Jeremy Thurgood <firxen@gmail.com>
parents: 197
diff changeset
252 self.entry = tile
986e72d2cb4d Rejiggered entrances and shifted directions around.
Jeremy Thurgood <firxen@gmail.com>
parents: 197
diff changeset
253 direction = []
986e72d2cb4d Rejiggered entrances and shifted directions around.
Jeremy Thurgood <firxen@gmail.com>
parents: 197
diff changeset
254 x, y = tile.tile_pos
986e72d2cb4d Rejiggered entrances and shifted directions around.
Jeremy Thurgood <firxen@gmail.com>
parents: 197
diff changeset
255 if x == 0:
986e72d2cb4d Rejiggered entrances and shifted directions around.
Jeremy Thurgood <firxen@gmail.com>
parents: 197
diff changeset
256 direction.append(RIGHT)
986e72d2cb4d Rejiggered entrances and shifted directions around.
Jeremy Thurgood <firxen@gmail.com>
parents: 197
diff changeset
257 elif x == self.tile_size[0] - 1:
986e72d2cb4d Rejiggered entrances and shifted directions around.
Jeremy Thurgood <firxen@gmail.com>
parents: 197
diff changeset
258 direction.append(LEFT)
986e72d2cb4d Rejiggered entrances and shifted directions around.
Jeremy Thurgood <firxen@gmail.com>
parents: 197
diff changeset
259 if y == 0:
986e72d2cb4d Rejiggered entrances and shifted directions around.
Jeremy Thurgood <firxen@gmail.com>
parents: 197
diff changeset
260 direction.append(DOWN)
986e72d2cb4d Rejiggered entrances and shifted directions around.
Jeremy Thurgood <firxen@gmail.com>
parents: 197
diff changeset
261 elif y == self.tile_size[1] - 1:
986e72d2cb4d Rejiggered entrances and shifted directions around.
Jeremy Thurgood <firxen@gmail.com>
parents: 197
diff changeset
262 direction.append(UP)
986e72d2cb4d Rejiggered entrances and shifted directions around.
Jeremy Thurgood <firxen@gmail.com>
parents: 197
diff changeset
263 if len(direction) < 1:
986e72d2cb4d Rejiggered entrances and shifted directions around.
Jeremy Thurgood <firxen@gmail.com>
parents: 197
diff changeset
264 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
265 if len(direction) > 1:
986e72d2cb4d Rejiggered entrances and shifted directions around.
Jeremy Thurgood <firxen@gmail.com>
parents: 197
diff changeset
266 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
267 tile.set_direction(direction[0])
986e72d2cb4d Rejiggered entrances and shifted directions around.
Jeremy Thurgood <firxen@gmail.com>
parents: 197
diff changeset
268
144
b292370c4548 Rearranged the orientation stuff. :-)
Jeremy Thurgood <firxen@gmail.com>
parents: 143
diff changeset
269 def set_tile_orientations(self):
b292370c4548 Rearranged the orientation stuff. :-)
Jeremy Thurgood <firxen@gmail.com>
parents: 143
diff changeset
270 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
271 for row in self.tiles
b292370c4548 Rearranged the orientation stuff. :-)
Jeremy Thurgood <firxen@gmail.com>
parents: 143
diff changeset
272 for tile in row
b292370c4548 Rearranged the orientation stuff. :-)
Jeremy Thurgood <firxen@gmail.com>
parents: 143
diff changeset
273 if tile is not None]
b292370c4548 Rearranged the orientation stuff. :-)
Jeremy Thurgood <firxen@gmail.com>
parents: 143
diff changeset
274 for tile in tiles:
b292370c4548 Rearranged the orientation stuff. :-)
Jeremy Thurgood <firxen@gmail.com>
parents: 143
diff changeset
275 orientation = self.get_tile_orientation(tile)
b292370c4548 Rearranged the orientation stuff. :-)
Jeremy Thurgood <firxen@gmail.com>
parents: 143
diff changeset
276 tile.use_variant(*orientation)
81
c8d6ca296884 Better level entry points.
Jeremy Thurgood <firxen@gmail.com>
parents: 71
diff changeset
277
230
e4f983b68ef5 Start of advanced sprite definitions.
Simon Cross <hodgestar@gmail.com>
parents: 220
diff changeset
278 def setup_sprites(self, sprites_ascii):
243
f9cc701a6be0 Hook up tunnels.
Simon Cross <hodgestar@gmail.com>
parents: 238
diff changeset
279 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
280 sprite_positions = []
230
e4f983b68ef5 Start of advanced sprite definitions.
Simon Cross <hodgestar@gmail.com>
parents: 220
diff changeset
281 for sprite_ascii in sprites_ascii:
342
868a53b96c29 Protect against malformed sprite lines
Neil Muller <drnlmuller@gmail.com>
parents: 331
diff changeset
282 try:
868a53b96c29 Protect against malformed sprite lines
Neil Muller <drnlmuller@gmail.com>
parents: 331
diff changeset
283 pos, _sep, rest = sprite_ascii.partition(':')
868a53b96c29 Protect against malformed sprite lines
Neil Muller <drnlmuller@gmail.com>
parents: 331
diff changeset
284 except ValueError:
868a53b96c29 Protect against malformed sprite lines
Neil Muller <drnlmuller@gmail.com>
parents: 331
diff changeset
285 raise InvalidMapError('Unable to determine sprite position'
868a53b96c29 Protect against malformed sprite lines
Neil Muller <drnlmuller@gmail.com>
parents: 331
diff changeset
286 ' 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
287 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
288 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
289 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
290 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
291 "Got %s" % pos)
230
e4f983b68ef5 Start of advanced sprite definitions.
Simon Cross <hodgestar@gmail.com>
parents: 220
diff changeset
292 class_name, rest = rest.split(None, 1)
e4f983b68ef5 Start of advanced sprite definitions.
Simon Cross <hodgestar@gmail.com>
parents: 220
diff changeset
293 args = rest.split()
243
f9cc701a6be0 Hook up tunnels.
Simon Cross <hodgestar@gmail.com>
parents: 238
diff changeset
294 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
295 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
296 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
297 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
298 raise InvalidMapError("Unknown Sprite class: %s" % class_name)
230
e4f983b68ef5 Start of advanced sprite definitions.
Simon Cross <hodgestar@gmail.com>
parents: 220
diff changeset
299 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
300 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
301 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
302 sprite_positions.append(pos)
230
e4f983b68ef5 Start of advanced sprite definitions.
Simon Cross <hodgestar@gmail.com>
parents: 220
diff changeset
303 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
304 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
305 raise InvalidMapError('Duplicate sprite id: %s.' % sprite_id)
243
f9cc701a6be0 Hook up tunnels.
Simon Cross <hodgestar@gmail.com>
parents: 238
diff changeset
306 self.extra_sprites[sprite_id] = sprite
230
e4f983b68ef5 Start of advanced sprite definitions.
Simon Cross <hodgestar@gmail.com>
parents: 220
diff changeset
307 self.sprites.add(sprite)
e4f983b68ef5 Start of advanced sprite definitions.
Simon Cross <hodgestar@gmail.com>
parents: 220
diff changeset
308
123
915fd0ee28f5 Added test tile orientation
Gideon Visser <gideon@gideonvisser.com>
parents: 112
diff changeset
309 def is_same_tile(self, tile, x, y):
915fd0ee28f5 Added test tile orientation
Gideon Visser <gideon@gideonvisser.com>
parents: 112
diff changeset
310 """Is there a tile of the same type?"""
144
b292370c4548 Rearranged the orientation stuff. :-)
Jeremy Thurgood <firxen@gmail.com>
parents: 143
diff changeset
311 if tile.tile_char is None:
b292370c4548 Rearranged the orientation stuff. :-)
Jeremy Thurgood <firxen@gmail.com>
parents: 143
diff changeset
312 # This isn't really a tile, so bail
b292370c4548 Rearranged the orientation stuff. :-)
Jeremy Thurgood <firxen@gmail.com>
parents: 143
diff changeset
313 return False
123
915fd0ee28f5 Added test tile orientation
Gideon Visser <gideon@gideonvisser.com>
parents: 112
diff changeset
314 try:
144
b292370c4548 Rearranged the orientation stuff. :-)
Jeremy Thurgood <firxen@gmail.com>
parents: 143
diff changeset
315 other_tile = self.tiles[y][x]
b292370c4548 Rearranged the orientation stuff. :-)
Jeremy Thurgood <firxen@gmail.com>
parents: 143
diff changeset
316 except IndexError:
b292370c4548 Rearranged the orientation stuff. :-)
Jeremy Thurgood <firxen@gmail.com>
parents: 143
diff changeset
317 # We're over the edge of the map
b292370c4548 Rearranged the orientation stuff. :-)
Jeremy Thurgood <firxen@gmail.com>
parents: 143
diff changeset
318 return False
b292370c4548 Rearranged the orientation stuff. :-)
Jeremy Thurgood <firxen@gmail.com>
parents: 143
diff changeset
319 if other_tile is None:
b292370c4548 Rearranged the orientation stuff. :-)
Jeremy Thurgood <firxen@gmail.com>
parents: 143
diff changeset
320 # Emptiness.
b292370c4548 Rearranged the orientation stuff. :-)
Jeremy Thurgood <firxen@gmail.com>
parents: 143
diff changeset
321 return False
b292370c4548 Rearranged the orientation stuff. :-)
Jeremy Thurgood <firxen@gmail.com>
parents: 143
diff changeset
322 return tile.tile_char == other_tile.tile_char
123
915fd0ee28f5 Added test tile orientation
Gideon Visser <gideon@gideonvisser.com>
parents: 112
diff changeset
323
144
b292370c4548 Rearranged the orientation stuff. :-)
Jeremy Thurgood <firxen@gmail.com>
parents: 143
diff changeset
324 def get_tile_orientation(self, tile):
b292370c4548 Rearranged the orientation stuff. :-)
Jeremy Thurgood <firxen@gmail.com>
parents: 143
diff changeset
325 if tile is None:
b292370c4548 Rearranged the orientation stuff. :-)
Jeremy Thurgood <firxen@gmail.com>
parents: 143
diff changeset
326 return (False, False, False, False)
b292370c4548 Rearranged the orientation stuff. :-)
Jeremy Thurgood <firxen@gmail.com>
parents: 143
diff changeset
327 map_x, map_y = tile.tile_pos
b292370c4548 Rearranged the orientation stuff. :-)
Jeremy Thurgood <firxen@gmail.com>
parents: 143
diff changeset
328 return (
b292370c4548 Rearranged the orientation stuff. :-)
Jeremy Thurgood <firxen@gmail.com>
parents: 143
diff changeset
329 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
330 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
331 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
332 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
333 )
123
915fd0ee28f5 Added test tile orientation
Gideon Visser <gideon@gideonvisser.com>
parents: 112
diff changeset
334
71
58557a89ec86 Some tile improvements and stuff.
Jeremy Thurgood <firxen@gmail.com>
parents: 57
diff changeset
335 def get_tile_size(self):
84
cced0ddda33f More level validation.
Jeremy Thurgood <firxen@gmail.com>
parents: 83
diff changeset
336 return self.tile_size
21
f76c3f033772 Release early, release broken. Level stuff.
Jeremy Thurgood <firxen@gmail.com>
parents: 8
diff changeset
337
f76c3f033772 Release early, release broken. Level stuff.
Jeremy Thurgood <firxen@gmail.com>
parents: 8
diff changeset
338 def get_size(self):
71
58557a89ec86 Some tile improvements and stuff.
Jeremy Thurgood <firxen@gmail.com>
parents: 57
diff changeset
339 x, y = self.get_tile_size()
162
7fbbe27120a9 Rodents! Amphibians! Import juggling!
Jeremy Thurgood <firxen@gmail.com>
parents: 146
diff changeset
340 return sprites.tile_sizify((x, y))
71
58557a89ec86 Some tile improvements and stuff.
Jeremy Thurgood <firxen@gmail.com>
parents: 57
diff changeset
341
58557a89ec86 Some tile improvements and stuff.
Jeremy Thurgood <firxen@gmail.com>
parents: 57
diff changeset
342 def make_background(self):
259
8d9424909118 Fix test of whether pygame.display is initialized.
Simon Cross <hodgestar@gmail.com>
parents: 256
diff changeset
343 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
344 # 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
345 return
71
58557a89ec86 Some tile improvements and stuff.
Jeremy Thurgood <firxen@gmail.com>
parents: 57
diff changeset
346 sx, sy = self.get_tile_size()
58557a89ec86 Some tile improvements and stuff.
Jeremy Thurgood <firxen@gmail.com>
parents: 57
diff changeset
347 self.background = Surface(self.get_size())
162
7fbbe27120a9 Rodents! Amphibians! Import juggling!
Jeremy Thurgood <firxen@gmail.com>
parents: 146
diff changeset
348 [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
349 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
350
c8d6ca296884 Better level entry points.
Jeremy Thurgood <firxen@gmail.com>
parents: 71
diff changeset
351 def get_entry(self):
c8d6ca296884 Better level entry points.
Jeremy Thurgood <firxen@gmail.com>
parents: 71
diff changeset
352 return (self.entry.tile_pos, self.entry.direction)
110
e6299eb296ce Draw the world!
Simon Cross <hodgestar@gmail.com>
parents: 105
diff changeset
353
e6299eb296ce Draw the world!
Simon Cross <hodgestar@gmail.com>
parents: 105
diff changeset
354 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
355 surface.blit(self.background, (0, 0))
110
e6299eb296ce Draw the world!
Simon Cross <hodgestar@gmail.com>
parents: 105
diff changeset
356 self.sprites.draw(surface)
173
71911af9d42d Refactor drawing code. Correct tile variants when painting
Neil Muller <drnlmuller@gmail.com>
parents: 169
diff changeset
357
71911af9d42d Refactor drawing code. Correct tile variants when painting
Neil Muller <drnlmuller@gmail.com>
parents: 169
diff changeset
358 def get_tile(self, tile_pos):
71911af9d42d Refactor drawing code. Correct tile variants when painting
Neil Muller <drnlmuller@gmail.com>
parents: 169
diff changeset
359 x, y = tile_pos
71911af9d42d Refactor drawing code. Correct tile variants when painting
Neil Muller <drnlmuller@gmail.com>
parents: 169
diff changeset
360 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
361 return self.tiles[y][x]
71911af9d42d Refactor drawing code. Correct tile variants when painting
Neil Muller <drnlmuller@gmail.com>
parents: 169
diff changeset
362 return None
71911af9d42d Refactor drawing code. Correct tile variants when painting
Neil Muller <drnlmuller@gmail.com>
parents: 169
diff changeset
363
71911af9d42d Refactor drawing code. Correct tile variants when painting
Neil Muller <drnlmuller@gmail.com>
parents: 169
diff changeset
364 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
365 x, y = tile_pos
71911af9d42d Refactor drawing code. Correct tile variants when painting
Neil Muller <drnlmuller@gmail.com>
parents: 169
diff changeset
366 old_tile = self.tiles[y][x]
71911af9d42d Refactor drawing code. Correct tile variants when painting
Neil Muller <drnlmuller@gmail.com>
parents: 169
diff changeset
367 if old_tile is not None:
71911af9d42d Refactor drawing code. Correct tile variants when painting
Neil Muller <drnlmuller@gmail.com>
parents: 169
diff changeset
368 old_tile.remove(self.sprites)
71911af9d42d Refactor drawing code. Correct tile variants when painting
Neil Muller <drnlmuller@gmail.com>
parents: 169
diff changeset
369 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
370 self.tiles[y][x] = new_tile
71911af9d42d Refactor drawing code. Correct tile variants when painting
Neil Muller <drnlmuller@gmail.com>
parents: 169
diff changeset
371 # Fix orientations
71911af9d42d Refactor drawing code. Correct tile variants when painting
Neil Muller <drnlmuller@gmail.com>
parents: 169
diff changeset
372 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
373 for dy in (-1, 0, 1)]
71911af9d42d Refactor drawing code. Correct tile variants when painting
Neil Muller <drnlmuller@gmail.com>
parents: 169
diff changeset
374 for tile in tiles:
71911af9d42d Refactor drawing code. Correct tile variants when painting
Neil Muller <drnlmuller@gmail.com>
parents: 169
diff changeset
375 if tile:
71911af9d42d Refactor drawing code. Correct tile variants when painting
Neil Muller <drnlmuller@gmail.com>
parents: 169
diff changeset
376 orientation = self.get_tile_orientation(tile)
71911af9d42d Refactor drawing code. Correct tile variants when painting
Neil Muller <drnlmuller@gmail.com>
parents: 169
diff changeset
377 tile.use_variant(*orientation)
186
275f0be6946c Reincarnating Snakes
Neil Muller <drnlmuller@gmail.com>
parents: 182
diff changeset
378
248
de3b4048e54a Hook up tile arrow rotation
Stefano Rivera <stefano@rivera.za.net>
parents: 247
diff changeset
379 def flip_arrows(self):
de3b4048e54a Hook up tile arrow rotation
Stefano Rivera <stefano@rivera.za.net>
parents: 247
diff changeset
380 for row in self.tiles:
de3b4048e54a Hook up tile arrow rotation
Stefano Rivera <stefano@rivera.za.net>
parents: 247
diff changeset
381 for tile in row:
de3b4048e54a Hook up tile arrow rotation
Stefano Rivera <stefano@rivera.za.net>
parents: 247
diff changeset
382 if isinstance(tile, sprites.ArrowSprite):
de3b4048e54a Hook up tile arrow rotation
Stefano Rivera <stefano@rivera.za.net>
parents: 247
diff changeset
383 tile.rotate()
de3b4048e54a Hook up tile arrow rotation
Stefano Rivera <stefano@rivera.za.net>
parents: 247
diff changeset
384
186
275f0be6946c Reincarnating Snakes
Neil Muller <drnlmuller@gmail.com>
parents: 182
diff changeset
385 def restart(self):
275f0be6946c Reincarnating Snakes
Neil Muller <drnlmuller@gmail.com>
parents: 182
diff changeset
386 """Reset the level state"""
230
e4f983b68ef5 Start of advanced sprite definitions.
Simon Cross <hodgestar@gmail.com>
parents: 220
diff changeset
387 self.setup_level(self.tiles_ascii, self.sprites_ascii)
186
275f0be6946c Reincarnating Snakes
Neil Muller <drnlmuller@gmail.com>
parents: 182
diff changeset
388 self.make_background()
343
5bf35267ddc0 Hook up sprite deletion. Framework work for sprite editing & adding
Neil Muller <drnlmuller@gmail.com>
parents: 342
diff changeset
389
5bf35267ddc0 Hook up sprite deletion. Framework work for sprite editing & adding
Neil Muller <drnlmuller@gmail.com>
parents: 342
diff changeset
390 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
391 """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
392 exist"""
5bf35267ddc0 Hook up sprite deletion. Framework work for sprite editing & adding
Neil Muller <drnlmuller@gmail.com>
parents: 342
diff changeset
393 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
394 try:
352
abd9a2ceadb7 Fix and extend sprite fiddling code
Neil Muller <drnlmuller@gmail.com>
parents: 343
diff changeset
395 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
396 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
397 except ValueError:
5bf35267ddc0 Hook up sprite deletion. Framework work for sprite editing & adding
Neil Muller <drnlmuller@gmail.com>
parents: 342
diff changeset
398 continue
5bf35267ddc0 Hook up sprite deletion. Framework work for sprite editing & adding
Neil Muller <drnlmuller@gmail.com>
parents: 342
diff changeset
399 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
400 pos, _sep, rest = sprite_ascii.partition(':')
6c61d5862310 Massive speical sprite editor rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 489
diff changeset
401 class_name, rest = rest.split(None, 1)
6c61d5862310 Massive speical sprite editor rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 489
diff changeset
402 args = rest.split()
6c61d5862310 Massive speical sprite editor rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 489
diff changeset
403 sprite_cls = sprites.find_sprite(class_name)
6c61d5862310 Massive speical sprite editor rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 489
diff changeset
404 sprite_id, args = args[0], args[1:]
6c61d5862310 Massive speical sprite editor rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 489
diff changeset
405 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
406 return None, None
343
5bf35267ddc0 Hook up sprite deletion. Framework work for sprite editing & adding
Neil Muller <drnlmuller@gmail.com>
parents: 342
diff changeset
407
5bf35267ddc0 Hook up sprite deletion. Framework work for sprite editing & adding
Neil Muller <drnlmuller@gmail.com>
parents: 342
diff changeset
408 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
409 """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
410 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
411
5bf35267ddc0 Hook up sprite deletion. Framework work for sprite editing & adding
Neil Muller <drnlmuller@gmail.com>
parents: 342
diff changeset
412 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
413 """Check that the sprite line is valid"""
352
abd9a2ceadb7 Fix and extend sprite fiddling code
Neil Muller <drnlmuller@gmail.com>
parents: 343
diff changeset
414 try:
abd9a2ceadb7 Fix and extend sprite fiddling code
Neil Muller <drnlmuller@gmail.com>
parents: 343
diff changeset
415 pos, _sep, rest = sprite.partition(':')
abd9a2ceadb7 Fix and extend sprite fiddling code
Neil Muller <drnlmuller@gmail.com>
parents: 343
diff changeset
416 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
417 class_name, rest = rest.split(None, 1)
abd9a2ceadb7 Fix and extend sprite fiddling code
Neil Muller <drnlmuller@gmail.com>
parents: 343
diff changeset
418 args = rest.split()
abd9a2ceadb7 Fix and extend sprite fiddling code
Neil Muller <drnlmuller@gmail.com>
parents: 343
diff changeset
419 except ValueError:
abd9a2ceadb7 Fix and extend sprite fiddling code
Neil Muller <drnlmuller@gmail.com>
parents: 343
diff changeset
420 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
421 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
422 try:
5bf35267ddc0 Hook up sprite deletion. Framework work for sprite editing & adding
Neil Muller <drnlmuller@gmail.com>
parents: 342
diff changeset
423 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
424 except KeyError:
5bf35267ddc0 Hook up sprite deletion. Framework work for sprite editing & adding
Neil Muller <drnlmuller@gmail.com>
parents: 342
diff changeset
425 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
426 sprite = cls(*args)
5bf35267ddc0 Hook up sprite deletion. Framework work for sprite editing & adding
Neil Muller <drnlmuller@gmail.com>
parents: 342
diff changeset
427 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
428 # 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
429 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
430 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
431
abd9a2ceadb7 Fix and extend sprite fiddling code
Neil Muller <drnlmuller@gmail.com>
parents: 343
diff changeset
432 def add_sprite(self, sprite):
abd9a2ceadb7 Fix and extend sprite fiddling code
Neil Muller <drnlmuller@gmail.com>
parents: 343
diff changeset
433 self.sprites_ascii.append(sprite)
abd9a2ceadb7 Fix and extend sprite fiddling code
Neil Muller <drnlmuller@gmail.com>
parents: 343
diff changeset
434
508
6c61d5862310 Massive speical sprite editor rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 489
diff changeset
435 def replace_sprite(self, new_ascii):
352
abd9a2ceadb7 Fix and extend sprite fiddling code
Neil Muller <drnlmuller@gmail.com>
parents: 343
diff changeset
436 # 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
437 pos, _sep, rest = new_ascii.partition(':')
352
abd9a2ceadb7 Fix and extend sprite fiddling code
Neil Muller <drnlmuller@gmail.com>
parents: 343
diff changeset
438 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
439 old_sprite, old_ascii = self.get_sprite_at(pos)
6c61d5862310 Massive speical sprite editor rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 489
diff changeset
440 self.sprites_ascii.remove(old_ascii)
6c61d5862310 Massive speical sprite editor rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 489
diff changeset
441 self.sprites_ascii.append(new_ascii)