def doSplash(duration = 3000): global splash splash = SplashShader() splash.startTime = parole.time() splash.endTime = splash.startTime + duration display.scene.add(splash) parole.pushAnimation()
def doSplash(duration=3000): global splash splash = SplashShader() splash.startTime = parole.time() splash.endTime = splash.startTime + duration display.scene.add(splash) parole.pushAnimation()
def updateSplash(self): global doneSplash, splash self.touch() now = parole.time() progress = (now - self.startTime) / \ float(self.endTime - self.startTime) if progress <= 0.2: return if progress <= 0.6: for (p, dest) in self.pDests.iteritems(): start = self.pStarts[p] y = start[1] + ((progress - 0.2) / (0.6 - 0.2)) * (dest[1] - start[1]) x = start[0] + ((progress - 0.2) / (0.6 - 0.2)) * (dest[0] - start[0]) self.positionOf[p] = (int(x), int(y)) return elif not self.movementDone: for (p, dest) in self.pDests.iteritems(): self.positionOf[p] = dest self.movementDone = True return if progress < 1.0 and self.titlePasses.keys()[0] not in self.passes: for p, pos in self.titlePasses.items(): self.addPass(p, pos=pos) return if progress > 1.0 and not self.gold: for p in self.titlePasses.keys() + self.pDests.keys(): self.remPass(p) self.addPass(shader.TextBlockPass( self.font, (255, 215, 0), text="Python Advanced ROgueLike Engine"), pos=self.titlePos) self.goldSound.play() self.gold = True elif progress > 1.1 and self.fadeAlpha < 255: if self.fader not in self.passes: parole.debug("adding fader!") self.addPass(self.fader, pos=(0, 0)) self.fadeAlpha = (now - (self.endTime + \ 0.1*(self.endTime-self.startTime)))/500.0 * 255 self.fader.rgb = (0, 0, 0, min(255, int(self.fadeAlpha))) elif self.fadeAlpha >= 255: parole.popAnimation() self.clean() display.scene.remove(self) doneSplash = True splash = None
def resetGame(): global player time = parole.time() player = Player() map, playerPos = mapgen.makeDungeonMap(data) map[playerPos].add(player) time = (parole.time() - time) or 1 parole.info('Map creation time (%s x %s): %sms => %s tiles per second.', map.cols, map.rows, time, (float(map.cols*map.rows) / float(time))*1000.0) data['outdoors'] = None data['outdoorsStairs'] = playerPos data['dungeon'] = map data['dungeonStairs'] = None data['currentMap'] = map data['mapframe'].setMap(map) data['mapframe'].bindVisibilityToFOV(player, 16, remember=True) data['fov'] = True data['memory'] = True light = parole.map.LightSource(colors['White'], 2.0) light.apply(map, player.pos) data['light'] = light data['mapframe'].centerAtTile(player.pos)
def updateSplash(self): global doneSplash, splash self.touch() now = parole.time() progress = (now - self.startTime) / \ float(self.endTime - self.startTime) if progress <= 0.2: return if progress <= 0.6: for (p, dest) in self.pDests.iteritems(): start = self.pStarts[p] y = start[1] + ((progress-0.2)/(0.6-0.2))*(dest[1]-start[1]) x = start[0] + ((progress-0.2)/(0.6-0.2))*(dest[0]-start[0]) self.positionOf[p] = (int(x), int(y)) return elif not self.movementDone: for (p, dest) in self.pDests.iteritems(): self.positionOf[p] = dest self.movementDone = True return if progress < 1.0 and self.titlePasses.keys()[0] not in self.passes: for p, pos in self.titlePasses.items(): self.addPass(p, pos=pos) return if progress > 1.0 and not self.gold: for p in self.titlePasses.keys() + self.pDests.keys(): self.remPass(p) self.addPass(shader.TextBlockPass(self.font, (255,215,0), text="Python Advanced ROgueLike Engine"), pos=self.titlePos) self.goldSound.play() self.gold = True elif progress > 1.1 and self.fadeAlpha < 255: if self.fader not in self.passes: parole.debug("adding fader!") self.addPass(self.fader, pos=(0,0)) self.fadeAlpha = (now - (self.endTime + \ 0.1*(self.endTime-self.startTime)))/500.0 * 255 self.fader.rgb = (0, 0, 0, min(255, int(self.fadeAlpha))) elif self.fadeAlpha >= 255: parole.popAnimation() self.clean() display.scene.remove(self) doneSplash = True splash = None
def handleWalk(command): global lookAnnote, player, zapping if not player: return map = data['mapframe'].getMap() frame = data['mapframe'] displacement = (0,0) moveTree = 'tree' in command if moveTree and not data['tree']: return if command in ['north','treenorth']: displacement = (0,-1) elif command in ['south', 'treesouth']: displacement = (0, 1) elif command in ['east', 'treeeast']: displacement = (1, 0) elif command in ['west', 'treewest']: displacement = (-1, 0) elif command in ['northeast', 'treenortheast']: displacement = (1,-1) elif command in ['northwest', 'treenorthwest']: displacement = (-1, -1) elif command in ['southeast', 'treesoutheast']: displacement = (1, 1) elif command in ['southwest', 'treesouthwest']: displacement = (-1,1) elif command == 'more ambient': map.setAmbientLight(map.ambientRGB, min(1., map.ambientIntensity + 0.05)) map.update() return elif command == 'less ambient': map.setAmbientLight(map.ambientRGB, max(0., map.ambientIntensity - 0.05)) map.update() return elif command in ('examine', 'zap'): if lookAnnote: if zapping: zapping = False zapPos = (lookAnnote.tile.col, lookAnnote.tile.row) if map.traceLOS(player.pos, zapPos, remAimOverlay) is \ map[zapPos]: message('You zap that space into oblivion!') map[zapPos].clear() else: message('You need line-of-sight to zap!') frame.removeAnnotation(lookAnnote) lookAnnote = None else: playerTile = map[player.pos] if command == 'zap': zapping = True lookAnnote = frame.annotate(playerTile, 'Zap: %s.' % ', '.join([str(x) for x in playerTile]), lineRGB=(64,32,255), reticleRGB=(64,32,255)) else: lookAnnote = frame.annotate(playerTile, 'You see: %s.' % ', '.join([str(x) for x in \ playerTile])) return elif command == 'save': mbox = util.messageBox('Saving...') parole.display.update() time = parole.time() data['mapframe'].setMap(None) f = bz2.BZ2File('mapsave.sav', 'w') saveData = (data['outdoors'], data['dungeon'], data['dungeonStairs'], data['outdoorsStairs'], data['currentMap'], player, data['light'], data['tree']) cPickle.dump(saveData, f, protocol=-1) f.close() data['mapframe'].setMap(map) if data['fov']: data['mapframe'].bindVisibilityToFOV(player, 16, remember=data['memory']) time = (parole.time() - time) or 1 parole.info('Map save time: %dms', time) parole.display.scene.remove(mbox) return elif command == 'restore': mbox = util.messageBox('Restoring...') parole.display.update() if lookAnnote: data['mapframe'].removeAnnotation(lookAnnote) lookAnnote = None data['mapframe'].setMap(None) time = parole.time() f = bz2.BZ2File('mapsave.sav', 'r') (data['outdoors'], data['dungeon'], data['dungeonStairs'], data['outdoorsStars'], data['currentMap'], player, data['light'], data['tree']) = cPickle.load(f) f.close() time = (parole.time() - time) or 1 parole.info('Map restore time: %dms', time) parole.display.scene.remove(mbox) parole.display.update() setMap(data['currentMap'], player.pos, False) parole.debug('leaving restore') return elif command == 'toggle fov': mbox = util.messageBox('Patience...') parole.display.update() if data['fov']: data['mapframe'].bindVisibilityToFOV(None, None) elif player: data['mapframe'].bindVisibilityToFOV(player, 16, remember=data['memory']) data['fov'] = not data['fov'] parole.display.scene.remove(mbox) return elif command == 'down': for obj in map[player.pos]: if obj.name == 'a stairway leading down': message('You climb down.') if not data['dungeon']: dungeon, playerPos = mapgen.makeDungeonMap(data) data['dungeon'] = dungeon data['dungeonStairs'] = playerPos setMap(data['dungeon'], data['dungeonStairs']) return message('There are no downward stairs here.') return elif command == 'up': for obj in map[player.pos]: if obj.name == 'a stairway leading up': message('You climb up.') setMap(data['outdoors'], data['outdoorsStairs']) return message('There are no upward stairs here.') return elif command == 'toggle memory': if data['fov'] and player: mbox = util.messageBox('Patience...') parole.display.update() data['memory'] = not data['memory'] data['mapframe'].bindVisibilityToFOV(player, 16, remember=data['memory']) parole.display.scene.remove(mbox) message('Memory %s.' % (data['memory'] and 'on' or 'off',)) return if data['msg3Shader'].text: message('') curPos = moveTree and data['tree'].pos or player.pos if not moveTree and lookAnnote: curPos = (lookAnnote.tile.col, lookAnnote.tile.row) newPos = (curPos[0] + displacement[0], curPos[1] + displacement[1]) if newPos[0] < 0 or newPos[1] < 0 or newPos[0] >= map.cols or \ newPos[1] >= map.rows: return if lookAnnote and not moveTree: frame.removeAnnotation(lookAnnote) lookTile = map[newPos] if zapping: map.traceLOS(player.pos, curPos, remAimOverlay) if map.traceLOS(player.pos, newPos, addAimOverlay) is \ lookTile: lookAnnote = frame.annotate(lookTile, 'Zap: %s.' % ', '.join([str(x) for x in lookTile]), lineRGB=(64,32,255), reticleRGB=(64,32,255)) else: lookAnnote = frame.annotate(lookTile, 'Not in LOS.', lineRGB=(64,32,255), reticleRGB=(64,32,255)) else: if data['mapframe'].inFOV(lookTile): lookAnnote = frame.annotate(lookTile, 'You see: %s.' % ', '.join([str(x) for x in lookTile])) else: lookAnnote = frame.annotate(lookTile, 'You cannot see here.') return for obj in map[newPos]: if obj.blocker: message('Your way is blocked by %s.' % obj) return if obj.passer: message('You pass by %s.' % obj) map[curPos].remove(moveTree and data['tree'] or player) #data['light'].remove(map) #data['light'].rgb = random.choice([colors['Orange'], # colors['Chocolate'], colors['Coral'], colors['Yellow'], # colors['Pink']]) map[newPos].add(moveTree and data['tree'] or player) #data['light'].apply(map, player.pos) data['mapframe'].centerAtTile(newPos) # This works, but is too slow without some sort of pre-caching and/or # optimization: animated water (each application uses random new # perlin Z). #map.applyGenerator(data['waterGenerator'], # pygame.Rect((25, 35), (20, 20))) map.update()