annotate skaapsteker/level.py @ 632:0675f390653c

Initial port to Python 3 and Pygame 2.
author Simon Cross <hodgestar@gmail.com>
date Fri, 20 Jan 2023 20:01:06 +0100
parents 65881746dc20
children
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
621
851c8726696c More cleanup. Mostly using utils.c* instead of doing things the long way.
Jeremy Thurgood <firxen@gmail.com>
parents: 612
diff changeset
13 from .utils import cmul, cdiv, cint, cneg
8
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
addaa5b857d6 Some level display things.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
17 class TileSet(object):
addaa5b857d6 Some level display things.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
18 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
19 self.dirname = dirname
65
bcf3d0b2a6d8 Some tile parameters.
Jeremy Thurgood <firxen@gmail.com>
parents: 64
diff changeset
20 self.tile_factories = {
bcf3d0b2a6d8 Some tile parameters.
Jeremy Thurgood <firxen@gmail.com>
parents: 64
diff changeset
21 '.': lambda pos: None,
101
b502e732f821 Add ? object-placement-help tiles
Stefano Rivera <stefano@rivera.za.net>
parents: 97
diff changeset
22 '?': lambda pos: None, # Object placement helper
65
bcf3d0b2a6d8 Some tile parameters.
Jeremy Thurgood <firxen@gmail.com>
parents: 64
diff changeset
23 '-': 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
24 '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
25 '<': 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
26 '>': self.tile_factory('floor-end-r.png', True),
118
081f78470dcf Fix misclassified tiles.
Jeremy Thurgood <firxen@gmail.com>
parents: 107
diff changeset
27 '=': self.tile_factory('floor-start-l.png', True),
081f78470dcf Fix misclassified tiles.
Jeremy Thurgood <firxen@gmail.com>
parents: 107
diff changeset
28 '+': 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
29 '(': 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
30 ')': 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
31 '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
32 '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
33 '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
34 '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
35 '{': 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
36 '}': 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
37 '|': 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
38 '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
39 '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
40 '!': 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
41 '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
42 }
8
addaa5b857d6 Some level display things.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
43
addaa5b857d6 Some level display things.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
44
35
38d2f7c43d86 Sprite-based tiles. \o/
Jeremy Thurgood <firxen@gmail.com>
parents: 28
diff changeset
45 def get_tile(self, tilechar, pos):
65
bcf3d0b2a6d8 Some tile parameters.
Jeremy Thurgood <firxen@gmail.com>
parents: 64
diff changeset
46 return self.tile_factories[tilechar](pos)
8
addaa5b857d6 Some level display things.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
47
addaa5b857d6 Some level display things.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
48
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
49 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
50 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
51 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
52 image = data.load_image('tiles/' + dirname + '/' + image_name)
65
bcf3d0b2a6d8 Some tile parameters.
Jeremy Thurgood <firxen@gmail.com>
parents: 64
diff changeset
53 def _tilefac(pos):
623
65881746dc20 More Sprite hierarchy work.
Jeremy Thurgood <firxen@gmail.com>
parents: 621
diff changeset
54 tile = Geography(pos, image=image)
65
bcf3d0b2a6d8 Some tile parameters.
Jeremy Thurgood <firxen@gmail.com>
parents: 64
diff changeset
55 tile.block = block
bcf3d0b2a6d8 Some tile parameters.
Jeremy Thurgood <firxen@gmail.com>
parents: 64
diff changeset
56 tile.floor = floor
69
e4089417766e FPS counter and tile sprite layering.
Jeremy Thurgood <firxen@gmail.com>
parents: 65
diff changeset
57 tile._layer = layer
97
a1d95c6152a0 Shiny new collision detection. Read code for usage information.
Simon Cross <hodgestar@gmail.com>
parents: 94
diff changeset
58 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
59 tile.collides_with = set()
65
bcf3d0b2a6d8 Some tile parameters.
Jeremy Thurgood <firxen@gmail.com>
parents: 64
diff changeset
60 return tile
bcf3d0b2a6d8 Some tile parameters.
Jeremy Thurgood <firxen@gmail.com>
parents: 64
diff changeset
61 return _tilefac
8
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
addaa5b857d6 Some level display things.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
65 class Level(object):
264
afd9256ad682 Move between doorways. (Still with hacky collision limiting.)
Jeremy Thurgood <firxen@gmail.com>
parents: 262
diff changeset
66 def __init__(self, leveldef, soundsystem):
127
e1dd3b785269 Initial game state stuff.
Jeremy Thurgood <firxen@gmail.com>
parents: 119
diff changeset
67 self.name = leveldef
20
f81e073fb8f5 Remove .json suffix from level defs.
Jeremy Thurgood <firxen@gmail.com>
parents: 13
diff changeset
68 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
69 self.sprites = LayeredUpdates()
262
de60329cfc9f Factor out sound stuff
Neil Muller <drnlmuller@gmail.com>
parents: 249
diff changeset
70 self._soundsystem = soundsystem
428
6a8f98335a53 Crop background image if necessary.
Jeremy Thurgood <firxen@gmail.com>
parents: 344
diff changeset
71 self.build_tiles()
52
a18bf35519f3 Multiple layered backgrounds.
Jeremy Thurgood <firxen@gmail.com>
parents: 50
diff changeset
72 self.build_backgrounds()
25
fe87d828d093 Very basic enemy support.
Jeremy Thurgood <firxen@gmail.com>
parents: 24
diff changeset
73 self.setup_enemies()
249
30ae3c681507 Doors and stuff.
Jeremy Thurgood <firxen@gmail.com>
parents: 248
diff changeset
74 self.setup_doorways()
243
4050e77dade6 Add support for background music tracks
Neil Muller <drnlmuller@gmail.com>
parents: 127
diff changeset
75 self._background_music = None
262
de60329cfc9f Factor out sound stuff
Neil Muller <drnlmuller@gmail.com>
parents: 249
diff changeset
76 if 'music' in self.level_data:
de60329cfc9f Factor out sound stuff
Neil Muller <drnlmuller@gmail.com>
parents: 249
diff changeset
77 # 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
78 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
79 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
80
52
a18bf35519f3 Multiple layered backgrounds.
Jeremy Thurgood <firxen@gmail.com>
parents: 50
diff changeset
81 def build_backgrounds(self):
a18bf35519f3 Multiple layered backgrounds.
Jeremy Thurgood <firxen@gmail.com>
parents: 50
diff changeset
82 self.backgrounds = []
428
6a8f98335a53 Crop background image if necessary.
Jeremy Thurgood <firxen@gmail.com>
parents: 344
diff changeset
83 for i, background in enumerate(self.level_data['backgrounds']):
6a8f98335a53 Crop background image if necessary.
Jeremy Thurgood <firxen@gmail.com>
parents: 344
diff changeset
84 image = data.load_image('backgrounds/' + background)
463
4dda5a0e4cf1 Better background clipping.
Jeremy Thurgood <firxen@gmail.com>
parents: 453
diff changeset
85 clip_rect = Rect((0, 0), self.pixel_size)
428
6a8f98335a53 Crop background image if necessary.
Jeremy Thurgood <firxen@gmail.com>
parents: 344
diff changeset
86 if i == 0:
621
851c8726696c More cleanup. Mostly using utils.c* instead of doing things the long way.
Jeremy Thurgood <firxen@gmail.com>
parents: 612
diff changeset
87 clip_rect = Rect((0, 0), (cint(cmul(self.pixel_size, 0.75))))
463
4dda5a0e4cf1 Better background clipping.
Jeremy Thurgood <firxen@gmail.com>
parents: 453
diff changeset
88 clip_rect = clip_rect.clip(image.get_rect())
4dda5a0e4cf1 Better background clipping.
Jeremy Thurgood <firxen@gmail.com>
parents: 453
diff changeset
89 clip_rect = clip_rect.union(Rect((0, 0), SCREEN))
4dda5a0e4cf1 Better background clipping.
Jeremy Thurgood <firxen@gmail.com>
parents: 453
diff changeset
90 clip_rect.midbottom = image.get_rect().midbottom
4dda5a0e4cf1 Better background clipping.
Jeremy Thurgood <firxen@gmail.com>
parents: 453
diff changeset
91 image = image.subsurface(clip_rect)
428
6a8f98335a53 Crop background image if necessary.
Jeremy Thurgood <firxen@gmail.com>
parents: 344
diff changeset
92 self.backgrounds.append(image)
13
b83f2db218e6 Draw level background with scaled offset.
Jeremy Thurgood <firxen@gmail.com>
parents: 10
diff changeset
93
262
de60329cfc9f Factor out sound stuff
Neil Muller <drnlmuller@gmail.com>
parents: 249
diff changeset
94 def enter(self):
de60329cfc9f Factor out sound stuff
Neil Muller <drnlmuller@gmail.com>
parents: 249
diff changeset
95 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
96 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
97
243
4050e77dade6 Add support for background music tracks
Neil Muller <drnlmuller@gmail.com>
parents: 127
diff changeset
98 def leave(self):
262
de60329cfc9f Factor out sound stuff
Neil Muller <drnlmuller@gmail.com>
parents: 249
diff changeset
99 pass
243
4050e77dade6 Add support for background music tracks
Neil Muller <drnlmuller@gmail.com>
parents: 127
diff changeset
100
8
addaa5b857d6 Some level display things.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
101 def build_tiles(self):
13
b83f2db218e6 Draw level background with scaled offset.
Jeremy Thurgood <firxen@gmail.com>
parents: 10
diff changeset
102 self.tileset = TileSet(self.level_data['tileset'])
75
95cb0b575e05 Enemies in level editor, tile layers.
Jeremy Thurgood <firxen@gmail.com>
parents: 69
diff changeset
103 self.tiles = LayeredUpdates()
35
38d2f7c43d86 Sprite-based tiles. \o/
Jeremy Thurgood <firxen@gmail.com>
parents: 28
diff changeset
104 tile_data = self.level_data['tiles']
38d2f7c43d86 Sprite-based tiles. \o/
Jeremy Thurgood <firxen@gmail.com>
parents: 28
diff changeset
105 self.tile_size = (len(tile_data[0]), len(tile_data))
621
851c8726696c More cleanup. Mostly using utils.c* instead of doing things the long way.
Jeremy Thurgood <firxen@gmail.com>
parents: 612
diff changeset
106 self.pixel_size = cmul(self.tile_size, TILE_SIZE)
35
38d2f7c43d86 Sprite-based tiles. \o/
Jeremy Thurgood <firxen@gmail.com>
parents: 28
diff changeset
107 for y, row in enumerate(tile_data):
38d2f7c43d86 Sprite-based tiles. \o/
Jeremy Thurgood <firxen@gmail.com>
parents: 28
diff changeset
108 for x, char in enumerate(row):
38d2f7c43d86 Sprite-based tiles. \o/
Jeremy Thurgood <firxen@gmail.com>
parents: 28
diff changeset
109 tile = self.tileset.get_tile(char, (x, y))
38d2f7c43d86 Sprite-based tiles. \o/
Jeremy Thurgood <firxen@gmail.com>
parents: 28
diff changeset
110 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
111 self.tiles.add(tile)
47
215e2e74c244 Better dummy monster.
Jeremy Thurgood <firxen@gmail.com>
parents: 42
diff changeset
112 self.sprites.add(tile)
8
addaa5b857d6 Some level display things.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
113
addaa5b857d6 Some level display things.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
114
25
fe87d828d093 Very basic enemy support.
Jeremy Thurgood <firxen@gmail.com>
parents: 24
diff changeset
115 def setup_enemies(self):
75
95cb0b575e05 Enemies in level editor, tile layers.
Jeremy Thurgood <firxen@gmail.com>
parents: 69
diff changeset
116 self.enemies = LayeredUpdates()
47
215e2e74c244 Better dummy monster.
Jeremy Thurgood <firxen@gmail.com>
parents: 42
diff changeset
117 for enemy_def in self.level_data['enemies']:
127
e1dd3b785269 Initial game state stuff.
Jeremy Thurgood <firxen@gmail.com>
parents: 119
diff changeset
118 enemy = find_sprite(enemy_def, 'enemies')
47
215e2e74c244 Better dummy monster.
Jeremy Thurgood <firxen@gmail.com>
parents: 42
diff changeset
119 self.enemies.add(enemy)
215e2e74c244 Better dummy monster.
Jeremy Thurgood <firxen@gmail.com>
parents: 42
diff changeset
120 self.sprites.add(enemy)
215e2e74c244 Better dummy monster.
Jeremy Thurgood <firxen@gmail.com>
parents: 42
diff changeset
121
127
e1dd3b785269 Initial game state stuff.
Jeremy Thurgood <firxen@gmail.com>
parents: 119
diff changeset
122
249
30ae3c681507 Doors and stuff.
Jeremy Thurgood <firxen@gmail.com>
parents: 248
diff changeset
123 def setup_doorways(self):
264
afd9256ad682 Move between doorways. (Still with hacky collision limiting.)
Jeremy Thurgood <firxen@gmail.com>
parents: 262
diff changeset
124 self.doorways = {}
afd9256ad682 Move between doorways. (Still with hacky collision limiting.)
Jeremy Thurgood <firxen@gmail.com>
parents: 262
diff changeset
125 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
126 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
127 self.doorways[door_name] = doorway
249
30ae3c681507 Doors and stuff.
Jeremy Thurgood <firxen@gmail.com>
parents: 248
diff changeset
128 self.sprites.add(doorway)
30ae3c681507 Doors and stuff.
Jeremy Thurgood <firxen@gmail.com>
parents: 248
diff changeset
129
30ae3c681507 Doors and stuff.
Jeremy Thurgood <firxen@gmail.com>
parents: 248
diff changeset
130
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
131 def get_surface(self):
64
13b9031febeb remove SRCALPHA flag for performance reasons
Neil Muller <drnlmuller@gmail.com>
parents: 63
diff changeset
132 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
133
8
addaa5b857d6 Some level display things.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
134
52
a18bf35519f3 Multiple layered backgrounds.
Jeremy Thurgood <firxen@gmail.com>
parents: 50
diff changeset
135 def get_background_pos(self, background, viewport):
621
851c8726696c More cleanup. Mostly using utils.c* instead of doing things the long way.
Jeremy Thurgood <firxen@gmail.com>
parents: 612
diff changeset
136 bg_scalable = background.get_rect().inflate(cneg(viewport.size)).size
851c8726696c More cleanup. Mostly using utils.c* instead of doing things the long way.
Jeremy Thurgood <firxen@gmail.com>
parents: 612
diff changeset
137 lev_scalable = Rect((0, 0), self.pixel_size).inflate(cneg(viewport.size)).size
851c8726696c More cleanup. Mostly using utils.c* instead of doing things the long way.
Jeremy Thurgood <firxen@gmail.com>
parents: 612
diff changeset
138 return cdiv(cmul(viewport.topleft, bg_scalable), lev_scalable)
13
b83f2db218e6 Draw level background with scaled offset.
Jeremy Thurgood <firxen@gmail.com>
parents: 10
diff changeset
139
b83f2db218e6 Draw level background with scaled offset.
Jeremy Thurgood <firxen@gmail.com>
parents: 10
diff changeset
140
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
141 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
142 clip_rect = surface.get_clip()
52
a18bf35519f3 Multiple layered backgrounds.
Jeremy Thurgood <firxen@gmail.com>
parents: 50
diff changeset
143 for background in self.backgrounds:
a18bf35519f3 Multiple layered backgrounds.
Jeremy Thurgood <firxen@gmail.com>
parents: 50
diff changeset
144 bg_pos = self.get_background_pos(background, clip_rect)
a18bf35519f3 Multiple layered backgrounds.
Jeremy Thurgood <firxen@gmail.com>
parents: 50
diff changeset
145 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
146
b83f2db218e6 Draw level background with scaled offset.
Jeremy Thurgood <firxen@gmail.com>
parents: 10
diff changeset
147
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
148 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
149 self.tiles.draw(surface)
13
b83f2db218e6 Draw level background with scaled offset.
Jeremy Thurgood <firxen@gmail.com>
parents: 10
diff changeset
150
b83f2db218e6 Draw level background with scaled offset.
Jeremy Thurgood <firxen@gmail.com>
parents: 10
diff changeset
151
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
152 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
153 self.draw_background(surface)
101
b502e732f821 Add ? object-placement-help tiles
Stefano Rivera <stefano@rivera.za.net>
parents: 97
diff changeset
154
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 class DebugLevel(Level):
b502e732f821 Add ? object-placement-help tiles
Stefano Rivera <stefano@rivera.za.net>
parents: 97
diff changeset
158 """Used by level-editor"""
b502e732f821 Add ? object-placement-help tiles
Stefano Rivera <stefano@rivera.za.net>
parents: 97
diff changeset
159 def build_tiles(self):
b502e732f821 Add ? object-placement-help tiles
Stefano Rivera <stefano@rivera.za.net>
parents: 97
diff changeset
160 super(DebugLevel, self).build_tiles()
b502e732f821 Add ? object-placement-help tiles
Stefano Rivera <stefano@rivera.za.net>
parents: 97
diff changeset
161 tile_data = self.level_data['tiles']
b502e732f821 Add ? object-placement-help tiles
Stefano Rivera <stefano@rivera.za.net>
parents: 97
diff changeset
162 for y, row in enumerate(tile_data):
b502e732f821 Add ? object-placement-help tiles
Stefano Rivera <stefano@rivera.za.net>
parents: 97
diff changeset
163 for x, char in enumerate(row):
b502e732f821 Add ? object-placement-help tiles
Stefano Rivera <stefano@rivera.za.net>
parents: 97
diff changeset
164 if char == '?':
b502e732f821 Add ? object-placement-help tiles
Stefano Rivera <stefano@rivera.za.net>
parents: 97
diff changeset
165 self.check_debug_tile(x, y)
b502e732f821 Add ? object-placement-help tiles
Stefano Rivera <stefano@rivera.za.net>
parents: 97
diff changeset
166
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 def check_debug_tile(self, x, y):
b502e732f821 Add ? object-placement-help tiles
Stefano Rivera <stefano@rivera.za.net>
parents: 97
diff changeset
169 objects = []
b502e732f821 Add ? object-placement-help tiles
Stefano Rivera <stefano@rivera.za.net>
parents: 97
diff changeset
170 objects += self.level_data.get('enemies', [])
b502e732f821 Add ? object-placement-help tiles
Stefano Rivera <stefano@rivera.za.net>
parents: 97
diff changeset
171 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
172 doorways = self.level_data.get('doorways', {})
e157119d5e84 added doorways to debuggable level elements
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 279
diff changeset
173 objects += doorways.values()
101
b502e732f821 Add ? object-placement-help tiles
Stefano Rivera <stefano@rivera.za.net>
parents: 97
diff changeset
174
b502e732f821 Add ? object-placement-help tiles
Stefano Rivera <stefano@rivera.za.net>
parents: 97
diff changeset
175 for object_ in objects:
b502e732f821 Add ? object-placement-help tiles
Stefano Rivera <stefano@rivera.za.net>
parents: 97
diff changeset
176 if [x, y] == object_['pos']:
b502e732f821 Add ? object-placement-help tiles
Stefano Rivera <stefano@rivera.za.net>
parents: 97
diff changeset
177 break
b502e732f821 Add ? object-placement-help tiles
Stefano Rivera <stefano@rivera.za.net>
parents: 97
diff changeset
178 else:
b502e732f821 Add ? object-placement-help tiles
Stefano Rivera <stefano@rivera.za.net>
parents: 97
diff changeset
179 tile = self.get_debug_tile(x, y)
632
0675f390653c Initial port to Python 3 and Pygame 2.
Simon Cross <hodgestar@gmail.com>
parents: 623
diff changeset
180 print("Debug tile at (%i, %i)" % (x, y))
101
b502e732f821 Add ? object-placement-help tiles
Stefano Rivera <stefano@rivera.za.net>
parents: 97
diff changeset
181 self.tiles.add(tile)
b502e732f821 Add ? object-placement-help tiles
Stefano Rivera <stefano@rivera.za.net>
parents: 97
diff changeset
182 self.sprites.add(tile)
b502e732f821 Add ? object-placement-help tiles
Stefano Rivera <stefano@rivera.za.net>
parents: 97
diff changeset
183
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 def get_debug_tile(self, x, y):
b502e732f821 Add ? object-placement-help tiles
Stefano Rivera <stefano@rivera.za.net>
parents: 97
diff changeset
186 surface = Surface((64, 64))
b502e732f821 Add ? object-placement-help tiles
Stefano Rivera <stefano@rivera.za.net>
parents: 97
diff changeset
187 surface.fill(Color('black'))
b502e732f821 Add ? object-placement-help tiles
Stefano Rivera <stefano@rivera.za.net>
parents: 97
diff changeset
188 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
189 text.draw(surface)
623
65881746dc20 More Sprite hierarchy work.
Jeremy Thurgood <firxen@gmail.com>
parents: 621
diff changeset
190 return Geography((x, y), image=surface.convert_alpha())