--- /dev/null
+# A doors / keypads set
+
+import os
+from pgzero.loaders import images
+from ..actors.orientatedsurf import OrientatedSurfActor
+
+
+class Door(OrientatedSurfActor):
+
+ def __init__(self, x, y, angle):
+ self._closed = True
+ self._open_surf = images.load(os.path.join('fixtures', 'door_open'))
+ self._closed_surf = images.load(os.path.join('fixtures', 'door_closed'))
+ self.game_pos = (x, y)
+ super().__init__(self._closed_surf, angle)
+
+ def open(self):
+ self._closed = False
+ self.surf = self._open_surf
+
+ def is_closed(self):
+ return self._closed
--- /dev/null
+# A doors / keypads set
+
+import os
+from pgzero.loaders import images
+from ..actors.orientatedsurf import SurfActor
+
+
+class Keypad(SurfActor):
+
+ def __init__(self, x, y, doors):
+ self._doors = doors
+ self.game_pos = (x, y)
+ surf = images.load(os.path.join('fixtures', 'keypad'))
+ super().__init__(surf)
+
+ def activate(self):
+ # FIXME: Check stats
+ for door in self._doors:
+ door.open()
""" Class holding the level info """
+from .keypad import Keypad
+from .door import Door
+
class Level(object):
def __init__(self):
self.width = self.height = 0
self.tiles = []
+ self.keypads = []
+ self.doors = []
self.tileset = None
self.start_pos = (0, 0)
]
def can_walk(self, x, y, layer):
- return 'walk' in self.tiles[y][x][layer]['behaviour']
+ if 'walk' in self.tiles[y][x][layer]['behaviour']:
+ # check doors
+ for door in self.doors:
+ if (x, y) == door.pos and door.closed():
+ return False
+ return True
+ return False
def can_fly(self, x, y, layer):
- return 'fly' in self.tiles[y][x][layer]['behaviour']
+ if 'fly' in self.tiles[y][x][layer]['behaviour']:
+ for door in self.doors:
+ if (x, y) == door.pos and door.closed():
+ return False
+ return True
+
+ return False
def can_crawl(self, x, y, layer):
return 'crawl' in self.tiles[y][x][layer]['behaviour']
+
+ def keypad_at(self, x, y):
+ for keypad in self.keypads:
+ if (x, y) == keypad.pos:
+ return keypad
+ return None
"starting pos": [
5,
6
+ ],
+ "door_info": [
+ {
+ "keypads": [
+ [
+ 6,
+ 7
+ ]
+ ],
+ "doors": [
+ [
+ 7,
+ 8
+ ]
+ ]
+ },
+ {
+ "keypads": [
+ [
+ 12,
+ 5
+ ]
+ ],
+ "doors": [
+ [
+ 12,
+ 7
+ ],
+ [
+ 13,
+ 4
+ ]
+ ]
+ },
+ {
+ "keypads": [
+ [
+ 18,
+ 9
+ ]
+ ],
+ "doors": [
+ [
+ 19,
+ 8
+ ]
+ ]
+ }
]
}
\ No newline at end of file
from ..gamelib.tiles import Wall, Floor, Tunnel, Underground, Grate
from ..gamelib.level import Level
+from ..gamelib.door import Door
+from ..gamelib.keypad import Keypad
for tile in TILES.values():
tile.TILESET = self._level.tileset
self._load_tile_images()
+ for door_info in level_data['door_info']:
+ # Create the doors first
+ doors = []
+ for door in door_info['doors']:
+ # Sort out angle
+ new_door = Door(0, door[0], door[1])
+ self._level.doors.append(new_door)
+ # Add the keypads
+ for keypad in door_info['keypads']:
+ new_keypad = Keypad(doors, keypad[0], keypad[1])
+ self._level.keypads.append(new_keypad)
return self._level
def _load_tile_images(self):
for layer in ['floor', 'tunnels']:
self._surfaces[layer] = self._render(layer)
self._overlay = self._surfaces['floor'].copy()
+ self._doors = self.actors.add_layer("doors", level=15)
+ self._keypads = self.actors.add_layer("keypads", level=16)
+ # These are already Actors
+ for door in self._level.doors:
+ self._doors.append(door)
+ for keypad in self._level.keypads:
+ self._keypads.append(keypads)
def _render(self, layer):
# We cache the rendered surface to avoid doing a large number
def _set_pos(self, x, y):
self._player_pos = (x, y)
+ print('Now at ', x, y)
def _can_move(self, x, y):
if self._mode == 'walk':