# This file is part of ROBOTGAME # # ROBOTGAME is free software: you can redistribute it and/or modify it under the # terms of the GNU General Public License as published by the Free Software # Foundation, either version 3 of the License, or (at your option) any later # version. # # ROBOTGAME is distributed in the hope that it will be useful, but WITHOUT ANY # WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR # A PARTICULAR PURPOSE. See the GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along with # ROBOTGAME. If not, see . # # ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' # # level1.py # -------------------- # date created : Fri Aug 10 2012 # copyright : (C) 2012 Niels G. W. Serup # maintained by : Niels G. W. Serup """ The fourth level. """ import os import pygame import random import re import itertools import level import player import tile import block import boulder import lever import mirror import trigger import misc import worldobject import logic.lasermirror as lm class Level4(level.Level): def __init__(self, game, graphics_dir, paused=False): level.Level.__init__(self, game, graphics_dir, size=(64 * 16, 48 * 16), paused=paused) self.dimensions = 16, 16 for i in range(self.dimensions[0]): for j in range(self.dimensions[1]): self.tiles.append( tile.Tile(self, i*64, (j+1)*48, self.imgs['indoor%d' % random.randint(1, 6)])) self.draw_background() self.playfield = lm.generate_simple_playfield(16) for (x, y), t in self.playfield.items(): x1, y1 = 64 * x, 48 * (y + 1) def mir(b, x1, y1): def f(x, y): def g(setting): self.playfield[(x, y)] = lm.MirrorLeft \ if self.playfield[(x, y)] is lm.MirrorRight \ else lm.MirrorRight self.generate_lasers() return g return mirror.Mirror(self, x1, y1, b, links=[f(x, y)]) self.objects.append({ lm.MirrorLeft: mir(True, x1, y1), lm.MirrorRight: mir(False, x1, y1), lm.Lever: lever.Lever( self, x1, y1, [lambda setting: self.generate_lasers], toggling=True, anim='lever_leftright' if x in (0, 15) else 'lever_updown'), lm.Target: block.Block(self, x1, y1, self.imgs['block3'], movable=False), lm.Blocker: block.Block(self, x1, y1, self.imgs['block1'], movable=False) }[t]) mirrors = list(filter(lambda obj: isinstance(obj, mirror.Mirror), self.objects)) levers = list(filter(lambda obj: isinstance(obj, lever.Lever), self.objects)) random.shuffle(levers) for l in levers: m = min(mirrors, key=lambda m: misc.manhattan_dist( (m.x, m.y), (l.x, l.y))) mirrors.remove(m) l.links.insert(0, (lambda m: lambda setting: m.rotate())(m)) self.generate_lasers() self.player.set_pos(64 * 7, 48 * 2) self.player.set_init_pos() def restart(self): for obj in self.objects: obj.reset_pos() def generate_lasers(self): lml = lm.generate_lasers(self.playfield) self.lasers = [] for (x0, y0), (x1, y1) in lml: self.lasers.append(((x0 * 64 + 32, y0 * 48 + 32), (x1 * 64 + 32, y1 * 48 + 32))) def draw_lasers(self, window): for (x0, y0), (x1, y1) in self.lasers: pygame.draw.line(window, (255, 0, 0), (x0 - self.camera_x, y0 - 28 - self.camera_y), (x1 - self.camera_x, y1 - 28 - self.camera_y), 4) def draw(self, window): self._blit_background(window) objs = self._sorted_objs() for obj in objs: obj.draw(window) # nonmirrors = filter(lambda obj: not isinstance(obj, mirror.Mirror), # objs) # mirrors = filter(lambda obj: isinstance(obj, mirror.Mirror), objs) # for obj in nonmirrors: # obj.draw(window) self.draw_lasers(window) # for obj in mirrors: # obj.draw(window) self.darkness.draw(window)