annotate skaapsteker/level.py @ 612:a91b2e4400a5

Fallback to using simplejson if json does not exist (this appears to be all that is needed to add Python2.5 compatibility).
author Simon Cross <hodgestar@gmail.com>
date Mon, 11 Apr 2011 23:54:56 +0200
parents 4de4f94c326d
children 851c8726696c
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
612
a91b2e4400a5 Fallback to using simplejson if json does not exist (this appears to be all that is needed to add Python2.5 compatibility).
Simon Cross <hodgestar@gmail.com>
parents: 522
diff changeset
1 try:
a91b2e4400a5 Fallback to using simplejson if json does not exist (this appears to be all that is needed to add Python2.5 compatibility).
Simon Cross <hodgestar@gmail.com>
parents: 522
diff changeset
2 import json
a91b2e4400a5 Fallback to using simplejson if json does not exist (this appears to be all that is needed to add Python2.5 compatibility).
Simon Cross <hodgestar@gmail.com>
parents: 522
diff changeset
3 except ImportError:
a91b2e4400a5 Fallback to using simplejson if json does not exist (this appears to be all that is needed to add Python2.5 compatibility).
Simon Cross <hodgestar@gmail.com>
parents: 522
diff changeset
4 import simplejson as json
8
addaa5b857d6 Some level display things.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
5
243
4050e77dade6 Add support for background music tracks
Neil Muller <drnlmuller@gmail.com>
parents: 127
diff changeset
6 from pygame import Rect, Surface, Color, mixer
75
95cb0b575e05 Enemies in level editor, tile layers.
Jeremy Thurgood <firxen@gmail.com>
parents: 69
diff changeset
7 from pygame.sprite import LayeredUpdates
13
b83f2db218e6 Draw level background with scaled offset.
Jeremy Thurgood <firxen@gmail.com>
parents: 10
diff changeset
8
101
b502e732f821 Add ? object-placement-help tiles
Stefano Rivera <stefano@rivera.za.net>
parents: 97
diff changeset
9 from . import data
428
6a8f98335a53 Crop background image if necessary.
Jeremy Thurgood <firxen@gmail.com>
parents: 344
diff changeset
10 from .constants import SCREEN, Layers
101
b502e732f821 Add ? object-placement-help tiles
Stefano Rivera <stefano@rivera.za.net>
parents: 97
diff changeset
11 from .sprites.base import TILE_SIZE, find_sprite, Geography
b502e732f821 Add ? object-placement-help tiles
Stefano Rivera <stefano@rivera.za.net>
parents: 97
diff changeset
12 from .widgets.text import Text
8
addaa5b857d6 Some level display things.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
13
addaa5b857d6 Some level display things.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
14
addaa5b857d6 Some level display things.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
15
addaa5b857d6 Some level display things.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
16 class TileSet(object):
addaa5b857d6 Some level display things.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
17 def __init__(self, dirname):
341
9a0f0ea687da removed per-set decor tiles; created common set of decorative tiles; added some bamboo to road
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 282
diff changeset
18 self.dirname = dirname
65
bcf3d0b2a6d8 Some tile parameters.
Jeremy Thurgood <firxen@gmail.com>
parents: 64
diff changeset
19 self.tile_factories = {
bcf3d0b2a6d8 Some tile parameters.
Jeremy Thurgood <firxen@gmail.com>
parents: 64
diff changeset
20 '.': lambda pos: None,
101
b502e732f821 Add ? object-placement-help tiles
Stefano Rivera <stefano@rivera.za.net>
parents: 97
diff changeset
21 '?': lambda pos: None, # Object placement helper
65
bcf3d0b2a6d8 Some tile parameters.
Jeremy Thurgood <firxen@gmail.com>
parents: 64
diff changeset
22 '-': self.tile_factory('floor.png', True),
107
a770ac0c3385 created xcf with tile shapes and Olli's backgrounds; wrote xcf2png script to generate tiles; switched levels to real tilesets
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 101
diff changeset
23 'X': self.tile_factory('wall.png', True, True),
a770ac0c3385 created xcf with tile shapes and Olli's backgrounds; wrote xcf2png script to generate tiles; switched levels to real tilesets
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 101
diff changeset
24 '<': self.tile_factory('floor-end-l.png', True),
a770ac0c3385 created xcf with tile shapes and Olli's backgrounds; wrote xcf2png script to generate tiles; switched levels to real tilesets
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 101
diff changeset
25 '>': self.tile_factory('floor-end-r.png', True),
118
081f78470dcf Fix misclassified tiles.
Jeremy Thurgood <firxen@gmail.com>
parents: 107
diff changeset
26 '=': self.tile_factory('floor-start-l.png', True),
081f78470dcf Fix misclassified tiles.
Jeremy Thurgood <firxen@gmail.com>
parents: 107
diff changeset
27 '+': self.tile_factory('floor-start-r.png', True),
107
a770ac0c3385 created xcf with tile shapes and Olli's backgrounds; wrote xcf2png script to generate tiles; switched levels to real tilesets
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 101
diff changeset
28 '(': self.tile_factory('wall-end-l.png', True, True),
a770ac0c3385 created xcf with tile shapes and Olli's backgrounds; wrote xcf2png script to generate tiles; switched levels to real tilesets
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 101
diff changeset
29 ')': self.tile_factory('wall-end-r.png', True, True),
a770ac0c3385 created xcf with tile shapes and Olli's backgrounds; wrote xcf2png script to generate tiles; switched levels to real tilesets
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 101
diff changeset
30 'q': self.tile_factory('wall-end-tr.png', True, True),
a770ac0c3385 created xcf with tile shapes and Olli's backgrounds; wrote xcf2png script to generate tiles; switched levels to real tilesets
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 101
diff changeset
31 'd': self.tile_factory('wall-end-br.png', True, True),
a770ac0c3385 created xcf with tile shapes and Olli's backgrounds; wrote xcf2png script to generate tiles; switched levels to real tilesets
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 101
diff changeset
32 'p': self.tile_factory('wall-end-tl.png', True, True),
a770ac0c3385 created xcf with tile shapes and Olli's backgrounds; wrote xcf2png script to generate tiles; switched levels to real tilesets
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 101
diff changeset
33 'b': self.tile_factory('wall-end-bl.png', True, True),
a770ac0c3385 created xcf with tile shapes and Olli's backgrounds; wrote xcf2png script to generate tiles; switched levels to real tilesets
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 101
diff changeset
34 '{': self.tile_factory('arch-l.png'),
a770ac0c3385 created xcf with tile shapes and Olli's backgrounds; wrote xcf2png script to generate tiles; switched levels to real tilesets
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 101
diff changeset
35 '}': self.tile_factory('arch-r.png'),
341
9a0f0ea687da removed per-set decor tiles; created common set of decorative tiles; added some bamboo to road
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 282
diff changeset
36 '|': self.tile_factory('bamboo.png', layer=Layers.BACKGROUND, dirname='common'),
344
0bea8508484d moar decorative tiles
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 341
diff changeset
37 'h': self.tile_factory('hanging-lantern.png', layer=Layers.IN_FRONT, dirname='common'),
0bea8508484d moar decorative tiles
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 341
diff changeset
38 's': self.tile_factory('standing-lantern.png', layer=Layers.IN_FRONT, dirname='common'),
0bea8508484d moar decorative tiles
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 341
diff changeset
39 '!': self.tile_factory('dangly-bits.png', layer=Layers.IN_FRONT, dirname='common'),
522
4de4f94c326d Move skaapsteker behind stuff and make haiku scrolls display text on collection.
Jeremy Thurgood <firxen@gmail.com>
parents: 513
diff changeset
40 'k': self.tile_factory('skaapsteker.png', layer=Layers.SKAAPSTEKER, dirname='skaapsteker'),
65
bcf3d0b2a6d8 Some tile parameters.
Jeremy Thurgood <firxen@gmail.com>
parents: 64
diff changeset
41 }
8
addaa5b857d6 Some level display things.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
42
addaa5b857d6 Some level display things.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
43
35
38d2f7c43d86 Sprite-based tiles. \o/
Jeremy Thurgood <firxen@gmail.com>
parents: 28
diff changeset
44 def get_tile(self, tilechar, pos):
65
bcf3d0b2a6d8 Some tile parameters.
Jeremy Thurgood <firxen@gmail.com>
parents: 64
diff changeset
45 return self.tile_factories[tilechar](pos)
8
addaa5b857d6 Some level display things.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
46
addaa5b857d6 Some level display things.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
47
341
9a0f0ea687da removed per-set decor tiles; created common set of decorative tiles; added some bamboo to road
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 282
diff changeset
48 def tile_factory(self, image_name, floor=False, block=False, layer=Layers.BACKGROUND, dirname=None):
9a0f0ea687da removed per-set decor tiles; created common set of decorative tiles; added some bamboo to road
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 282
diff changeset
49 if not dirname:
9a0f0ea687da removed per-set decor tiles; created common set of decorative tiles; added some bamboo to road
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 282
diff changeset
50 dirname = self.dirname
9a0f0ea687da removed per-set decor tiles; created common set of decorative tiles; added some bamboo to road
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 282
diff changeset
51 image = data.load_image('tiles/' + dirname + '/' + image_name)
65
bcf3d0b2a6d8 Some tile parameters.
Jeremy Thurgood <firxen@gmail.com>
parents: 64
diff changeset
52 def _tilefac(pos):
bcf3d0b2a6d8 Some tile parameters.
Jeremy Thurgood <firxen@gmail.com>
parents: 64
diff changeset
53 tile = Geography(pos, image)
bcf3d0b2a6d8 Some tile parameters.
Jeremy Thurgood <firxen@gmail.com>
parents: 64
diff changeset
54 tile.block = block
bcf3d0b2a6d8 Some tile parameters.
Jeremy Thurgood <firxen@gmail.com>
parents: 64
diff changeset
55 tile.floor = floor
69
e4089417766e FPS counter and tile sprite layering.
Jeremy Thurgood <firxen@gmail.com>
parents: 65
diff changeset
56 tile._layer = layer
97
a1d95c6152a0 Shiny new collision detection. Read code for usage information.
Simon Cross <hodgestar@gmail.com>
parents: 94
diff changeset
57 if not (tile.block or tile.floor):
a1d95c6152a0 Shiny new collision detection. Read code for usage information.
Simon Cross <hodgestar@gmail.com>
parents: 94
diff changeset
58 tile.collides_with = set()
65
bcf3d0b2a6d8 Some tile parameters.
Jeremy Thurgood <firxen@gmail.com>
parents: 64
diff changeset
59 return tile
bcf3d0b2a6d8 Some tile parameters.
Jeremy Thurgood <firxen@gmail.com>
parents: 64
diff changeset
60 return _tilefac
8
addaa5b857d6 Some level display things.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
61
addaa5b857d6 Some level display things.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
62
addaa5b857d6 Some level display things.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
63
addaa5b857d6 Some level display things.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
64 class Level(object):
264
afd9256ad682 Move between doorways. (Still with hacky collision limiting.)
Jeremy Thurgood <firxen@gmail.com>
parents: 262
diff changeset
65 def __init__(self, leveldef, soundsystem):
127
e1dd3b785269 Initial game state stuff.
Jeremy Thurgood <firxen@gmail.com>
parents: 119
diff changeset
66 self.name = leveldef
20
f81e073fb8f5 Remove .json suffix from level defs.
Jeremy Thurgood <firxen@gmail.com>
parents: 13
diff changeset
67 self.level_data = json.loads(data.load('levels/' + leveldef + '.json').read())
75
95cb0b575e05 Enemies in level editor, tile layers.
Jeremy Thurgood <firxen@gmail.com>
parents: 69
diff changeset
68 self.sprites = LayeredUpdates()
262
de60329cfc9f Factor out sound stuff
Neil Muller <drnlmuller@gmail.com>
parents: 249
diff changeset
69 self._soundsystem = soundsystem
428
6a8f98335a53 Crop background image if necessary.
Jeremy Thurgood <firxen@gmail.com>
parents: 344
diff changeset
70 self.build_tiles()
52
a18bf35519f3 Multiple layered backgrounds.
Jeremy Thurgood <firxen@gmail.com>
parents: 50
diff changeset
71 self.build_backgrounds()
25
fe87d828d093 Very basic enemy support.
Jeremy Thurgood <firxen@gmail.com>
parents: 24
diff changeset
72 self.setup_enemies()
249
30ae3c681507 Doors and stuff.
Jeremy Thurgood <firxen@gmail.com>
parents: 248
diff changeset
73 self.setup_doorways()
243
4050e77dade6 Add support for background music tracks
Neil Muller <drnlmuller@gmail.com>
parents: 127
diff changeset
74 self._background_music = None
262
de60329cfc9f Factor out sound stuff
Neil Muller <drnlmuller@gmail.com>
parents: 249
diff changeset
75 if 'music' in self.level_data:
de60329cfc9f Factor out sound stuff
Neil Muller <drnlmuller@gmail.com>
parents: 249
diff changeset
76 # soundsystem will call data.filepath
453
9c9df17b98a7 Add support for choosing a volume. A music to temple.
Simon Cross <hodgestar@gmail.com>
parents: 428
diff changeset
77 self._background_music = 'music/' + self.level_data['music'].get('track', '')
9c9df17b98a7 Add support for choosing a volume. A music to temple.
Simon Cross <hodgestar@gmail.com>
parents: 428
diff changeset
78 self._background_volume = self.level_data['music'].get('volume', 1.0)
8
addaa5b857d6 Some level display things.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
79
52
a18bf35519f3 Multiple layered backgrounds.
Jeremy Thurgood <firxen@gmail.com>
parents: 50
diff changeset
80 def build_backgrounds(self):
a18bf35519f3 Multiple layered backgrounds.
Jeremy Thurgood <firxen@gmail.com>
parents: 50
diff changeset
81 self.backgrounds = []
428
6a8f98335a53 Crop background image if necessary.
Jeremy Thurgood <firxen@gmail.com>
parents: 344
diff changeset
82 for i, background in enumerate(self.level_data['backgrounds']):
6a8f98335a53 Crop background image if necessary.
Jeremy Thurgood <firxen@gmail.com>
parents: 344
diff changeset
83 image = data.load_image('backgrounds/' + background)
463
4dda5a0e4cf1 Better background clipping.
Jeremy Thurgood <firxen@gmail.com>
parents: 453
diff changeset
84 clip_rect = Rect((0, 0), self.pixel_size)
428
6a8f98335a53 Crop background image if necessary.
Jeremy Thurgood <firxen@gmail.com>
parents: 344
diff changeset
85 if i == 0:
6a8f98335a53 Crop background image if necessary.
Jeremy Thurgood <firxen@gmail.com>
parents: 344
diff changeset
86 clip_rect = Rect((0, 0), (int(self.pixel_size[0] * 0.75), int(self.pixel_size[1] * 0.75)))
463
4dda5a0e4cf1 Better background clipping.
Jeremy Thurgood <firxen@gmail.com>
parents: 453
diff changeset
87 clip_rect = clip_rect.clip(image.get_rect())
4dda5a0e4cf1 Better background clipping.
Jeremy Thurgood <firxen@gmail.com>
parents: 453
diff changeset
88 clip_rect = clip_rect.union(Rect((0, 0), SCREEN))
4dda5a0e4cf1 Better background clipping.
Jeremy Thurgood <firxen@gmail.com>
parents: 453
diff changeset
89 clip_rect.midbottom = image.get_rect().midbottom
4dda5a0e4cf1 Better background clipping.
Jeremy Thurgood <firxen@gmail.com>
parents: 453
diff changeset
90 image = image.subsurface(clip_rect)
428
6a8f98335a53 Crop background image if necessary.
Jeremy Thurgood <firxen@gmail.com>
parents: 344
diff changeset
91 self.backgrounds.append(image)
13
b83f2db218e6 Draw level background with scaled offset.
Jeremy Thurgood <firxen@gmail.com>
parents: 10
diff changeset
92
262
de60329cfc9f Factor out sound stuff
Neil Muller <drnlmuller@gmail.com>
parents: 249
diff changeset
93 def enter(self):
de60329cfc9f Factor out sound stuff
Neil Muller <drnlmuller@gmail.com>
parents: 249
diff changeset
94 if self._background_music:
453
9c9df17b98a7 Add support for choosing a volume. A music to temple.
Simon Cross <hodgestar@gmail.com>
parents: 428
diff changeset
95 self._soundsystem.play_background_music(self._background_music, self._background_volume)
13
b83f2db218e6 Draw level background with scaled offset.
Jeremy Thurgood <firxen@gmail.com>
parents: 10
diff changeset
96
243
4050e77dade6 Add support for background music tracks
Neil Muller <drnlmuller@gmail.com>
parents: 127
diff changeset
97 def leave(self):
262
de60329cfc9f Factor out sound stuff
Neil Muller <drnlmuller@gmail.com>
parents: 249
diff changeset
98 pass
243
4050e77dade6 Add support for background music tracks
Neil Muller <drnlmuller@gmail.com>
parents: 127
diff changeset
99
8
addaa5b857d6 Some level display things.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
100 def build_tiles(self):
13
b83f2db218e6 Draw level background with scaled offset.
Jeremy Thurgood <firxen@gmail.com>
parents: 10
diff changeset
101 self.tileset = TileSet(self.level_data['tileset'])
75
95cb0b575e05 Enemies in level editor, tile layers.
Jeremy Thurgood <firxen@gmail.com>
parents: 69
diff changeset
102 self.tiles = LayeredUpdates()
35
38d2f7c43d86 Sprite-based tiles. \o/
Jeremy Thurgood <firxen@gmail.com>
parents: 28
diff changeset
103 tile_data = self.level_data['tiles']
38d2f7c43d86 Sprite-based tiles. \o/
Jeremy Thurgood <firxen@gmail.com>
parents: 28
diff changeset
104 self.tile_size = (len(tile_data[0]), len(tile_data))
38d2f7c43d86 Sprite-based tiles. \o/
Jeremy Thurgood <firxen@gmail.com>
parents: 28
diff changeset
105 self.pixel_size = (self.tile_size[0] * TILE_SIZE[0], self.tile_size[1] * TILE_SIZE[1])
38d2f7c43d86 Sprite-based tiles. \o/
Jeremy Thurgood <firxen@gmail.com>
parents: 28
diff changeset
106 for y, row in enumerate(tile_data):
38d2f7c43d86 Sprite-based tiles. \o/
Jeremy Thurgood <firxen@gmail.com>
parents: 28
diff changeset
107 for x, char in enumerate(row):
38d2f7c43d86 Sprite-based tiles. \o/
Jeremy Thurgood <firxen@gmail.com>
parents: 28
diff changeset
108 tile = self.tileset.get_tile(char, (x, y))
38d2f7c43d86 Sprite-based tiles. \o/
Jeremy Thurgood <firxen@gmail.com>
parents: 28
diff changeset
109 if tile:
40
fa1bb94cfa76 Re-factor drawing to blit to a clip rect in the One True Level Surface before blitting that to the screen.
Simon Cross <hodgestar@gmail.com>
parents: 35
diff changeset
110 self.tiles.add(tile)
47
215e2e74c244 Better dummy monster.
Jeremy Thurgood <firxen@gmail.com>
parents: 42
diff changeset
111 self.sprites.add(tile)
8
addaa5b857d6 Some level display things.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
112
addaa5b857d6 Some level display things.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
113
25
fe87d828d093 Very basic enemy support.
Jeremy Thurgood <firxen@gmail.com>
parents: 24
diff changeset
114 def setup_enemies(self):
75
95cb0b575e05 Enemies in level editor, tile layers.
Jeremy Thurgood <firxen@gmail.com>
parents: 69
diff changeset
115 self.enemies = LayeredUpdates()
47
215e2e74c244 Better dummy monster.
Jeremy Thurgood <firxen@gmail.com>
parents: 42
diff changeset
116 for enemy_def in self.level_data['enemies']:
127
e1dd3b785269 Initial game state stuff.
Jeremy Thurgood <firxen@gmail.com>
parents: 119
diff changeset
117 enemy = find_sprite(enemy_def, 'enemies')
47
215e2e74c244 Better dummy monster.
Jeremy Thurgood <firxen@gmail.com>
parents: 42
diff changeset
118 self.enemies.add(enemy)
215e2e74c244 Better dummy monster.
Jeremy Thurgood <firxen@gmail.com>
parents: 42
diff changeset
119 self.sprites.add(enemy)
215e2e74c244 Better dummy monster.
Jeremy Thurgood <firxen@gmail.com>
parents: 42
diff changeset
120
127
e1dd3b785269 Initial game state stuff.
Jeremy Thurgood <firxen@gmail.com>
parents: 119
diff changeset
121
249
30ae3c681507 Doors and stuff.
Jeremy Thurgood <firxen@gmail.com>
parents: 248
diff changeset
122 def setup_doorways(self):
264
afd9256ad682 Move between doorways. (Still with hacky collision limiting.)
Jeremy Thurgood <firxen@gmail.com>
parents: 262
diff changeset
123 self.doorways = {}
afd9256ad682 Move between doorways. (Still with hacky collision limiting.)
Jeremy Thurgood <firxen@gmail.com>
parents: 262
diff changeset
124 for door_name, door_def in self.level_data['doorways'].items():
249
30ae3c681507 Doors and stuff.
Jeremy Thurgood <firxen@gmail.com>
parents: 248
diff changeset
125 doorway = find_sprite(door_def, 'base')
264
afd9256ad682 Move between doorways. (Still with hacky collision limiting.)
Jeremy Thurgood <firxen@gmail.com>
parents: 262
diff changeset
126 self.doorways[door_name] = doorway
249
30ae3c681507 Doors and stuff.
Jeremy Thurgood <firxen@gmail.com>
parents: 248
diff changeset
127 self.sprites.add(doorway)
30ae3c681507 Doors and stuff.
Jeremy Thurgood <firxen@gmail.com>
parents: 248
diff changeset
128
30ae3c681507 Doors and stuff.
Jeremy Thurgood <firxen@gmail.com>
parents: 248
diff changeset
129
40
fa1bb94cfa76 Re-factor drawing to blit to a clip rect in the One True Level Surface before blitting that to the screen.
Simon Cross <hodgestar@gmail.com>
parents: 35
diff changeset
130 def get_surface(self):
64
13b9031febeb remove SRCALPHA flag for performance reasons
Neil Muller <drnlmuller@gmail.com>
parents: 63
diff changeset
131 return Surface(self.pixel_size)
40
fa1bb94cfa76 Re-factor drawing to blit to a clip rect in the One True Level Surface before blitting that to the screen.
Simon Cross <hodgestar@gmail.com>
parents: 35
diff changeset
132
8
addaa5b857d6 Some level display things.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
133
52
a18bf35519f3 Multiple layered backgrounds.
Jeremy Thurgood <firxen@gmail.com>
parents: 50
diff changeset
134 def get_background_pos(self, background, viewport):
a18bf35519f3 Multiple layered backgrounds.
Jeremy Thurgood <firxen@gmail.com>
parents: 50
diff changeset
135 vp_x, vp_y = viewport.size
a18bf35519f3 Multiple layered backgrounds.
Jeremy Thurgood <firxen@gmail.com>
parents: 50
diff changeset
136 bg_scalable = background.get_rect().inflate(-vp_x, -vp_y).size
a18bf35519f3 Multiple layered backgrounds.
Jeremy Thurgood <firxen@gmail.com>
parents: 50
diff changeset
137 lev_scalable = Rect((0, 0), self.pixel_size).inflate(-vp_x, -vp_y).size
a18bf35519f3 Multiple layered backgrounds.
Jeremy Thurgood <firxen@gmail.com>
parents: 50
diff changeset
138 return ((viewport.left * bg_scalable[0]) / lev_scalable[0],
a18bf35519f3 Multiple layered backgrounds.
Jeremy Thurgood <firxen@gmail.com>
parents: 50
diff changeset
139 (viewport.top * bg_scalable[1]) / lev_scalable[1])
13
b83f2db218e6 Draw level background with scaled offset.
Jeremy Thurgood <firxen@gmail.com>
parents: 10
diff changeset
140
b83f2db218e6 Draw level background with scaled offset.
Jeremy Thurgood <firxen@gmail.com>
parents: 10
diff changeset
141
40
fa1bb94cfa76 Re-factor drawing to blit to a clip rect in the One True Level Surface before blitting that to the screen.
Simon Cross <hodgestar@gmail.com>
parents: 35
diff changeset
142 def draw_background(self, surface):
fa1bb94cfa76 Re-factor drawing to blit to a clip rect in the One True Level Surface before blitting that to the screen.
Simon Cross <hodgestar@gmail.com>
parents: 35
diff changeset
143 clip_rect = surface.get_clip()
52
a18bf35519f3 Multiple layered backgrounds.
Jeremy Thurgood <firxen@gmail.com>
parents: 50
diff changeset
144 for background in self.backgrounds:
a18bf35519f3 Multiple layered backgrounds.
Jeremy Thurgood <firxen@gmail.com>
parents: 50
diff changeset
145 bg_pos = self.get_background_pos(background, clip_rect)
a18bf35519f3 Multiple layered backgrounds.
Jeremy Thurgood <firxen@gmail.com>
parents: 50
diff changeset
146 surface.blit(background, clip_rect.topleft, Rect(bg_pos, clip_rect.size))
13
b83f2db218e6 Draw level background with scaled offset.
Jeremy Thurgood <firxen@gmail.com>
parents: 10
diff changeset
147
b83f2db218e6 Draw level background with scaled offset.
Jeremy Thurgood <firxen@gmail.com>
parents: 10
diff changeset
148
40
fa1bb94cfa76 Re-factor drawing to blit to a clip rect in the One True Level Surface before blitting that to the screen.
Simon Cross <hodgestar@gmail.com>
parents: 35
diff changeset
149 def draw_tiles(self, surface):
fa1bb94cfa76 Re-factor drawing to blit to a clip rect in the One True Level Surface before blitting that to the screen.
Simon Cross <hodgestar@gmail.com>
parents: 35
diff changeset
150 self.tiles.draw(surface)
13
b83f2db218e6 Draw level background with scaled offset.
Jeremy Thurgood <firxen@gmail.com>
parents: 10
diff changeset
151
b83f2db218e6 Draw level background with scaled offset.
Jeremy Thurgood <firxen@gmail.com>
parents: 10
diff changeset
152
40
fa1bb94cfa76 Re-factor drawing to blit to a clip rect in the One True Level Surface before blitting that to the screen.
Simon Cross <hodgestar@gmail.com>
parents: 35
diff changeset
153 def draw(self, surface):
fa1bb94cfa76 Re-factor drawing to blit to a clip rect in the One True Level Surface before blitting that to the screen.
Simon Cross <hodgestar@gmail.com>
parents: 35
diff changeset
154 self.draw_background(surface)
101
b502e732f821 Add ? object-placement-help tiles
Stefano Rivera <stefano@rivera.za.net>
parents: 97
diff changeset
155
b502e732f821 Add ? object-placement-help tiles
Stefano Rivera <stefano@rivera.za.net>
parents: 97
diff changeset
156
b502e732f821 Add ? object-placement-help tiles
Stefano Rivera <stefano@rivera.za.net>
parents: 97
diff changeset
157
b502e732f821 Add ? object-placement-help tiles
Stefano Rivera <stefano@rivera.za.net>
parents: 97
diff changeset
158 class DebugLevel(Level):
b502e732f821 Add ? object-placement-help tiles
Stefano Rivera <stefano@rivera.za.net>
parents: 97
diff changeset
159 """Used by level-editor"""
b502e732f821 Add ? object-placement-help tiles
Stefano Rivera <stefano@rivera.za.net>
parents: 97
diff changeset
160 def build_tiles(self):
b502e732f821 Add ? object-placement-help tiles
Stefano Rivera <stefano@rivera.za.net>
parents: 97
diff changeset
161 super(DebugLevel, self).build_tiles()
b502e732f821 Add ? object-placement-help tiles
Stefano Rivera <stefano@rivera.za.net>
parents: 97
diff changeset
162 tile_data = self.level_data['tiles']
b502e732f821 Add ? object-placement-help tiles
Stefano Rivera <stefano@rivera.za.net>
parents: 97
diff changeset
163 for y, row in enumerate(tile_data):
b502e732f821 Add ? object-placement-help tiles
Stefano Rivera <stefano@rivera.za.net>
parents: 97
diff changeset
164 for x, char in enumerate(row):
b502e732f821 Add ? object-placement-help tiles
Stefano Rivera <stefano@rivera.za.net>
parents: 97
diff changeset
165 if char == '?':
b502e732f821 Add ? object-placement-help tiles
Stefano Rivera <stefano@rivera.za.net>
parents: 97
diff changeset
166 self.check_debug_tile(x, y)
b502e732f821 Add ? object-placement-help tiles
Stefano Rivera <stefano@rivera.za.net>
parents: 97
diff changeset
167
b502e732f821 Add ? object-placement-help tiles
Stefano Rivera <stefano@rivera.za.net>
parents: 97
diff changeset
168
b502e732f821 Add ? object-placement-help tiles
Stefano Rivera <stefano@rivera.za.net>
parents: 97
diff changeset
169 def check_debug_tile(self, x, y):
b502e732f821 Add ? object-placement-help tiles
Stefano Rivera <stefano@rivera.za.net>
parents: 97
diff changeset
170 objects = []
b502e732f821 Add ? object-placement-help tiles
Stefano Rivera <stefano@rivera.za.net>
parents: 97
diff changeset
171 objects += self.level_data.get('enemies', [])
b502e732f821 Add ? object-placement-help tiles
Stefano Rivera <stefano@rivera.za.net>
parents: 97
diff changeset
172 objects += self.level_data.get('sprites', [])
282
e157119d5e84 added doorways to debuggable level elements
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 279
diff changeset
173 doorways = self.level_data.get('doorways', {})
e157119d5e84 added doorways to debuggable level elements
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 279
diff changeset
174 objects += doorways.values()
101
b502e732f821 Add ? object-placement-help tiles
Stefano Rivera <stefano@rivera.za.net>
parents: 97
diff changeset
175
b502e732f821 Add ? object-placement-help tiles
Stefano Rivera <stefano@rivera.za.net>
parents: 97
diff changeset
176 for object_ in objects:
b502e732f821 Add ? object-placement-help tiles
Stefano Rivera <stefano@rivera.za.net>
parents: 97
diff changeset
177 if [x, y] == object_['pos']:
b502e732f821 Add ? object-placement-help tiles
Stefano Rivera <stefano@rivera.za.net>
parents: 97
diff changeset
178 break
b502e732f821 Add ? object-placement-help tiles
Stefano Rivera <stefano@rivera.za.net>
parents: 97
diff changeset
179 else:
b502e732f821 Add ? object-placement-help tiles
Stefano Rivera <stefano@rivera.za.net>
parents: 97
diff changeset
180 tile = self.get_debug_tile(x, y)
b502e732f821 Add ? object-placement-help tiles
Stefano Rivera <stefano@rivera.za.net>
parents: 97
diff changeset
181 print "Debug tile at (%i, %i)" % (x, y)
b502e732f821 Add ? object-placement-help tiles
Stefano Rivera <stefano@rivera.za.net>
parents: 97
diff changeset
182 self.tiles.add(tile)
b502e732f821 Add ? object-placement-help tiles
Stefano Rivera <stefano@rivera.za.net>
parents: 97
diff changeset
183 self.sprites.add(tile)
b502e732f821 Add ? object-placement-help tiles
Stefano Rivera <stefano@rivera.za.net>
parents: 97
diff changeset
184
b502e732f821 Add ? object-placement-help tiles
Stefano Rivera <stefano@rivera.za.net>
parents: 97
diff changeset
185
b502e732f821 Add ? object-placement-help tiles
Stefano Rivera <stefano@rivera.za.net>
parents: 97
diff changeset
186 def get_debug_tile(self, x, y):
b502e732f821 Add ? object-placement-help tiles
Stefano Rivera <stefano@rivera.za.net>
parents: 97
diff changeset
187 surface = Surface((64, 64))
b502e732f821 Add ? object-placement-help tiles
Stefano Rivera <stefano@rivera.za.net>
parents: 97
diff changeset
188 surface.fill(Color('black'))
b502e732f821 Add ? object-placement-help tiles
Stefano Rivera <stefano@rivera.za.net>
parents: 97
diff changeset
189 text = Text("? Tile at\n(%i, %i)" % (x, y), (2, 2), size=14, color='white')
b502e732f821 Add ? object-placement-help tiles
Stefano Rivera <stefano@rivera.za.net>
parents: 97
diff changeset
190 text.draw(surface)
b502e732f821 Add ? object-placement-help tiles
Stefano Rivera <stefano@rivera.za.net>
parents: 97
diff changeset
191 return Geography((x, y), surface.convert_alpha())