예제 #1
0
파일: splash.py 프로젝트: gdos/parole
def doSplash(duration = 3000):
    global splash
    splash = SplashShader()
    splash.startTime = parole.time()
    splash.endTime = splash.startTime + duration
    display.scene.add(splash)
    parole.pushAnimation()
예제 #2
0
def doSplash(duration=3000):
    global splash
    splash = SplashShader()
    splash.startTime = parole.time()
    splash.endTime = splash.startTime + duration
    display.scene.add(splash)
    parole.pushAnimation()
예제 #3
0
    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
예제 #4
0
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)
예제 #5
0
파일: splash.py 프로젝트: gdos/parole
    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
예제 #6
0
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()