def __gunChoice(self, choice):
     self.toonFps.cleanup()
     self.toonFps = None
     self.toonFps = GunGameToonFPS(self, choice)
     self.toonFps.load()
     self.sendUpdate('readyToStart')
     self.fsm.request('waitForOthers')
    def __init__(self, cr):
        try:
            self.DistributedGunGame_initialized
            return
        except:
            self.DistributedGunGame_initialized = 1

        DistributedToonFPSGame.__init__(self, cr)
        TeamMinigame.__init__(
            self, GGG.BLUE,
            ('phase_4/maps/blue_neutral.png', 'phase_4/maps/blue_hover.png',
             'phase_4/maps/blue_hover.png'), GGG.RED,
            ('phase_4/maps/red_neutral.png', 'phase_4/maps/red_hover.png',
             'phase_4/maps/red_hover.png'))
        self.fsm.addState(
            State('countdown', self.enterCountdown, self.exitCountdown,
                  ['play']))
        self.fsm.addState(
            State('announceGameOver', self.enterAnnounceGameOver,
                  self.exitAnnounceGameOver, ['finalScores']))
        self.fsm.addState(
            State('finalScores', self.enterFinalScores, self.exitFinalScores,
                  ['gameOver']))
        self.fsm.addState(
            State('voteGM', self.enterVoteGameMode, self.exitVoteGameMode,
                  ['start']))
        self.fsm.addState(
            State('chooseTeam', self.enterChooseTeam, self.exitChooseTeam,
                  ['chooseGun']))
        self.fsm.addState(
            State('chooseGun', self.enterChooseGun, self.exitChooseGun,
                  ['waitForOthers']))
        self.fsm.addState(
            State('announceTeamWon', self.enterAnnounceTeamWon,
                  self.exitAnnounceTeamWon, ['finalScores']))
        self.fsm.getStateNamed('waitForOthers').addTransition('countdown')
        self.fsm.getStateNamed('waitForOthers').addTransition('voteGM')
        self.fsm.getStateNamed('play').addTransition('announceGameOver')
        self.fsm.getStateNamed('play').addTransition('announceTeamWon')
        self.fsm.getStateNamed('start').addTransition('chooseTeam')
        self.fsm.getStateNamed('start').addTransition('chooseGun')
        self.toonFps = GunGameToonFPS(self)
        self.loader = GunGameLevelLoader.GunGameLevelLoader(self)
        self.track = None
        self.isTimeUp = False
        self.cameraMovmentSeq = None
        self.gameMode = None
        self.flags = []
        self.localAvHasFlag = False
        self.blueScoreLbl = None
        self.redScoreLbl = None
        self.redArrow = None
        self.blueArrow = None
        self.infoLbl = None
        self.scoreByTeam = {GGG.Teams.RED: 0, GGG.Teams.BLUE: 0}
        self.balloonSound = base.loadSfx(
            'phase_3/audio/sfx/GUI_balloon_popup.ogg')
        self.decidedSound = base.loadSfx(
            'phase_4/audio/sfx/MG_sfx_travel_game_win_vote.ogg')
        return
示例#3
0
 def __gunChoice(self, choice):
     self.toonFps.cleanup()
     self.toonFps = None
     self.toonFps = GunGameToonFPS(self, choice)
     self.toonFps.load()
     self.d_ready()
     self.fsm.request('waitForOthers')
     return
示例#4
0
    def __init__(self, cr):
        try:
            self.DistributedGunGame_initialized
            return
        except:
            self.DistributedGunGame_initialized = 1

        DistributedToonFPSGame.__init__(self, cr)
        self.fsm.addState(State('countdown', self.enterCountdown, self.exitCountdown, ['play']))
        self.fsm.addState(State('announceGameOver', self.enterAnnounceGameOver, self.exitAnnounceGameOver, ['finalScores']))
        self.fsm.addState(State('finalScores', self.enterFinalScores, self.exitFinalScores, ['gameOver']))
        self.fsm.addState(State('chooseGun', self.enterChooseGun, self.exitChooseGun, ['waitForOthers']))
        self.fsm.getStateNamed('start').addTransition('chooseGun')
        self.fsm.getStateNamed('waitForOthers').addTransition('countdown')
        self.fsm.getStateNamed('play').addTransition('announceGameOver')
        self.toonFps = GunGameToonFPS(self)
        self.loader = GunGameLevelLoader.GunGameLevelLoader()
        self.track = None
        self.isTimeUp = False
        self.cameraMovmentSeq = None
        self.gameMode = None
        return
class DistributedGunGame(DistributedToonFPSGame, TeamMinigame):
    notify = directNotify.newCategory("DistributedGunGame")
    GameMode2Description = {GGG.GameModes.CASUAL: "Battle and defeat the Toons on the other team with your gun to gain points. " + \
                        "Remember to reload your gun when you're out of ammo! " + \
                        "The Toon with the most points when the timer runs out gets a nice prize!",
                        GGG.GameModes.CTF: "Steal the other team's flag and take it to where your flag is to score a point. Follow the arrows at the bottom of the screen to find the flags! Use your gun to defend yourself and your flag!",
                        GGG.GameModes.KOTH : "Capture the central point and defend it from the other Toons. The Toon who holds the point the longest wins."}
    GameMode2Music = {
        GGG.GameModes.CASUAL: 'phase_4/audio/bgm/MG_TwoDGame.ogg',
        GGG.GameModes.CTF: 'phase_9/audio/bgm/CHQ_FACT_bg.ogg',
        GGG.GameModes.KOTH: 'phase_7/audio/bgm/encntr_suit_winning_indoor.ogg'
    }

    def __init__(self, cr):
        try:
            self.DistributedGunGame_initialized
            return
        except:
            self.DistributedGunGame_initialized = 1
        DistributedToonFPSGame.__init__(self, cr)

        TeamMinigame.__init__(
            self, GGG.BLUE,
            ('phase_4/maps/blue_neutral.png', 'phase_4/maps/blue_hover.png',
             'phase_4/maps/blue_hover.png'), GGG.RED,
            ('phase_4/maps/red_neutral.png', 'phase_4/maps/red_hover.png',
             'phase_4/maps/red_hover.png'))

        self.fsm.addState(
            State('countdown', self.enterCountdown, self.exitCountdown,
                  ['play']))
        self.fsm.addState(
            State('announceGameOver', self.enterAnnounceGameOver,
                  self.exitAnnounceGameOver, ['finalScores']))
        self.fsm.addState(
            State('finalScores', self.enterFinalScores, self.exitFinalScores,
                  ['gameOver']))
        self.fsm.addState(
            State('voteGM', self.enterVoteGameMode, self.exitVoteGameMode,
                  ['start']))
        self.fsm.addState(
            State('chooseTeam', self.enterChooseTeam, self.exitChooseTeam,
                  ['chooseGun']))
        self.fsm.addState(
            State('chooseGun', self.enterChooseGun, self.exitChooseGun,
                  ['waitForOthers']))
        self.fsm.addState(
            State('announceTeamWon', self.enterAnnounceTeamWon,
                  self.exitAnnounceTeamWon, ['finalScores']))
        self.fsm.getStateNamed('waitForOthers').addTransition('countdown')
        self.fsm.getStateNamed('waitForOthers').addTransition('voteGM')
        self.fsm.getStateNamed('play').addTransition('announceGameOver')
        self.fsm.getStateNamed('play').addTransition('announceTeamWon')
        self.fsm.getStateNamed('start').addTransition('chooseTeam')
        self.fsm.getStateNamed('start').addTransition('chooseGun')
        self.toonFps = GunGameToonFPS(self)
        self.loader = GunGameLevelLoader.GunGameLevelLoader(self)
        self.track = None
        self.isTimeUp = False
        self.cameraMovmentSeq = None
        self.gameMode = None
        self.flags = []
        self.localAvHasFlag = False
        self.blueScoreLbl = None
        self.redScoreLbl = None
        self.redArrow = None
        self.blueArrow = None
        self.infoLbl = None
        self.scoreByTeam = {GGG.Teams.RED: 0, GGG.Teams.BLUE: 0}
        self.balloonSound = base.loadSfx(
            'phase_3/audio/sfx/GUI_balloon_popup.ogg')
        self.decidedSound = base.loadSfx(
            'phase_4/audio/sfx/MG_sfx_travel_game_win_vote.ogg')
        return

    def setKOTHPoints(self, points):
        self.toonFps.setKOTHPoints(points)
        DistributedToonFPSGame.setMyKOTHPoints(self, points)

    def getFlagOfOtherTeam(self, team):
        for flag in self.flags:
            if flag.team != team:
                return flag

    def startGameModeVote(self):
        self.fsm.request('voteGM')

    def enterVoteGameMode(self):
        render.hide()
        font = CIGlobals.getMickeyFont()
        imp = CIGlobals.getToonFont()
        box = DGG.getDefaultDialogGeom()
        geom = CIGlobals.getDefaultBtnGeom()
        self.container = DirectFrame()
        self.bg = OnscreenImage(image=box,
                                color=(1, 1, 0.75, 1),
                                scale=(2.4, 1.4, 1.4),
                                parent=self.container)
        self.title = OnscreenText(text="Vote  on  Game  Mode",
                                  pos=(0, 0.5, 0),
                                  font=font,
                                  scale=(0.12),
                                  parent=self.container,
                                  fg=(1, 0.9, 0.3, 1))
        self.btnFrame = DirectFrame(parent=self.container, pos=(0.14, 0, 0))
        self.casualFrame = DirectFrame(parent=self.btnFrame, pos=(-0.80, 0, 0))
        self.ctfFrame = DirectFrame(parent=self.btnFrame, pos=(-0.125, 0, 0))
        self.kothFrame = DirectFrame(parent=self.btnFrame, pos=(0.55, 0, 0))
        self.casual = DirectButton(parent=self.casualFrame,
                                   relief=None,
                                   pressEffect=0,
                                   image=('phase_4/maps/casual_neutral.png',
                                          'phase_4/maps/casual_hover.png',
                                          'phase_4/maps/casual_hover.png'),
                                   image_scale=(0.9, 1, 1),
                                   scale=0.4,
                                   command=self.__pickedGameMode,
                                   extraArgs=[GGG.GameModes.CASUAL])
        self.casual_votesLbl = OnscreenText(parent=self.casualFrame,
                                            text="0",
                                            pos=(0, -0.46, 0),
                                            font=imp)
        self.ctf = DirectButton(parent=self.ctfFrame,
                                relief=None,
                                pressEffect=0,
                                image=('phase_4/maps/ctf_neutral.png',
                                       'phase_4/maps/ctf_hover.png',
                                       'phase_4/maps/ctf_hover.png'),
                                image_scale=(0.9, 1, 1),
                                scale=0.4,
                                command=self.__pickedGameMode,
                                extraArgs=[GGG.GameModes.CTF])
        self.ctf_votesLbl = OnscreenText(parent=self.ctfFrame,
                                         text="0",
                                         pos=(0, -0.46, 0),
                                         font=imp)
        self.koth = DirectButton(parent=self.kothFrame,
                                 relief=None,
                                 pressEffect=0,
                                 image=('phase_4/maps/koth_neutral.png',
                                        'phase_4/maps/koth_hover.png',
                                        'phase_4/maps/koth_hover.png'),
                                 image_scale=(0.9, 1, 1),
                                 scale=0.4,
                                 command=self.__pickedGameMode,
                                 extraArgs=[GGG.GameModes.KOTH])
        self.koth_votesLbl = OnscreenText(parent=self.kothFrame,
                                          text="0",
                                          pos=(0, -0.46, 0),
                                          font=imp)
        self.outcomeLbl = OnscreenText(parent=self.container,
                                       text="",
                                       pos=(0, -0.6, 0),
                                       font=imp,
                                       scale=0.1)

    def __pickedGameMode(self, mode):
        self.sendUpdate('myGameModeVote', [mode])
        self.ctf['state'] = DGG.DISABLED
        self.casual['state'] = DGG.DISABLED
        self.koth['state'] = DGG.DISABLED
        if mode == GGG.GameModes.CASUAL:
            self.ctf['image'] = 'phase_4/maps/ctf_neutral.png'
            self.koth['image'] = 'phase_4/maps/koth_neutral.png'
            self.casual['image'] = 'phase_4/maps/casual_hover.png'
        elif mode == GGG.GameModes.CTF:
            self.ctf['image'] = 'phase_4/maps/ctf_hover.png'
            self.casual['image'] = 'phase_4/maps/casual_neutral.png'
            self.koth['image'] = 'phase_4/maps/koth_neutral.png'
        elif mode == GGG.GameModes.KOTH:
            self.ctf['image'] = 'phase_4/maps/ctf_neutral.png'
            self.casual['image'] = 'phase_4/maps/casual_neutral.png'
            self.koth['image'] = 'phase_4/maps/koth_hover.png'

    def incrementGameModeVote(self, mode):
        base.playSfx(self.balloonSound)
        lbl = None
        if mode == GGG.GameModes.CTF:
            lbl = self.ctf_votesLbl
        elif mode == GGG.GameModes.CASUAL:
            lbl = self.casual_votesLbl
        elif mode == GGG.GameModes.KOTH:
            lbl = self.koth_votesLbl
        if lbl:
            lbl.setText(str(int(lbl.getText()) + 1))

    def gameModeDecided(self, mode, wasRandom):
        base.playSfx(self.decidedSound)
        if wasRandom:
            msg = GGG.MSG_CHOSE_MODE_TIE.format(GGG.GameModeNameById[mode])
        else:
            msg = GGG.MSG_CHOSE_MODE.format(GGG.GameModeNameById[mode])
        self.outcomeLbl.setText(msg)
        base.taskMgr.doMethodLater(3.0, self.__decided2chooseTeamTask,
                                   self.uniqueName('decided2chooseTeamTask'))

    def __decided2chooseTeamTask(self, task):
        self.fsm.request('start')
        return task.done

    def exitVoteGameMode(self):
        base.taskMgr.remove(self.uniqueName('decided2chooseTeamTask'))
        self.outcomeLbl.destroy()
        del self.outcomeLbl
        self.ctf_votesLbl.destroy()
        del self.ctf_votesLbl
        self.casual_votesLbl.destroy()
        del self.casual_votesLbl
        self.ctf.destroy()
        del self.ctf
        self.koth_votesLbl.destroy()
        del self.koth_votesLbl
        self.casual.destroy()
        del self.casual
        self.ctfFrame.destroy()
        del self.ctfFrame
        self.casualFrame.destroy()
        del self.casualFrame
        self.kothFrame.destroy()
        del self.kothFrame
        self.koth.destroy()
        del self.koth
        self.title.destroy()
        del self.title
        self.bg.destroy()
        del self.bg
        self.container.destroy()
        del self.container

    def enterChooseTeam(self):
        TeamMinigame.makeSelectionGUI(self)

    def acceptedIntoTeam(self):
        TeamMinigame.acceptedIntoTeam(self)

        self.fsm.request('chooseGun')
        pos, hpr = self.pickSpawnPoint()
        base.localAvatar.setPos(pos)
        base.localAvatar.setHpr(hpr)

    def exitChooseTeam(self):
        TeamMinigame.destroySelectionGUI(self)

    def setTeamOfPlayer(self, avId, team):
        remoteAvatar = self.getRemoteAvatar(avId)
        if remoteAvatar:
            remoteAvatar.setTeam(team)

    def enterChooseGun(self):
        font = CIGlobals.getToonFont()
        box = DGG.getDefaultDialogGeom()
        geom = CIGlobals.getDefaultBtnGeom()
        self.container = DirectFrame()
        self.bg = OnscreenImage(image=box,
                                color=(1, 1, 0.75, 1),
                                scale=(1.9, 1.4, 1.4),
                                parent=self.container)
        self.title = OnscreenText(text="Choose a Gun",
                                  pos=(0, 0.5, 0),
                                  font=font,
                                  scale=(0.12),
                                  parent=self.container)
        self.pistolBtn = DirectButton(geom=geom,
                                      text="Pistol",
                                      relief=None,
                                      text_scale=0.055,
                                      text_pos=(0, -0.01),
                                      command=self.__gunChoice,
                                      extraArgs=["pistol"],
                                      pos=(0, 0, 0.35),
                                      parent=self.container)
        self.shotgunBtn = DirectButton(geom=geom,
                                       text="Shotgun",
                                       relief=None,
                                       text_scale=0.055,
                                       text_pos=(0, -0.01),
                                       command=self.__gunChoice,
                                       extraArgs=["shotgun"],
                                       pos=(0, 0, 0.25),
                                       parent=self.container)
        self.sniperBtn = DirectButton(geom=geom,
                                      text="Sniper",
                                      relief=None,
                                      text_scale=0.055,
                                      text_pos=(0, -0.01),
                                      command=self.__gunChoice,
                                      extraArgs=["sniper"],
                                      pos=(0, 0, 0.15),
                                      parent=self.container)

    def __gunChoice(self, choice):
        self.toonFps.cleanup()
        self.toonFps = None
        self.toonFps = GunGameToonFPS(self, choice)
        self.toonFps.load()
        self.sendUpdate('readyToStart')
        self.fsm.request('waitForOthers')

    def exitChooseGun(self):
        self.sniperBtn.destroy()
        del self.sniperBtn
        self.shotgunBtn.destroy()
        del self.shotgunBtn
        self.pistolBtn.destroy()
        del self.pistolBtn
        self.title.destroy()
        del self.title
        self.bg.destroy()
        del self.bg
        self.container.destroy()
        del self.container

    def gunChoice(self, choice, avId):
        remoteAvatar = self.getRemoteAvatar(avId)
        if remoteAvatar:
            remoteAvatar.setGunName(choice)

    def setGameMode(self, mode):
        self.gameMode = mode
        self.setDescription(self.GameMode2Description[mode])
        self.setMinigameMusic(self.GameMode2Music[mode])

    def getGameMode(self):
        return self.gameMode

    def avatarHitByBullet(self, avId, damage):
        avatar = self.getRemoteAvatar(avId)
        if avatar:
            avatar.grunt()

    def headBackToMinigameArea(self):
        if self.loader:
            self.loader.unload()
            self.loader.cleanup()
            self.loader = None
        DistributedToonFPSGame.headBackToMinigameArea(self)

    def setupRemoteAvatar(self, avId):
        self.remoteAvatars.append(RemoteToonBattleAvatar(self, self.cr, avId))

    def setLevelName(self, levelName):
        self.loader.setLevel(levelName)
        self.loader.load()

    def pickSpawnPoint(self):
        return random.choice(self.loader.getSpawnPoints())

    def load(self):
        self.toonFps.load()
        self.myRemoteAvatar = RemoteToonBattleAvatar(self, self.cr,
                                                     base.localAvatar.doId)
        self.setWinnerPrize(200)
        self.setLoserPrize(15)

        if not base.localAvatar.tokenIcon is None:
            base.localAvatar.tokenIcon.hide()

        #pos, hpr = self.loader.getCameraOfCurrentLevel()
        #camera.setPos(pos)
        #camera.setHpr(hpr)
        DistributedToonFPSGame.load(self, showDesc=False)
        DistributedToonFPSGame.handleDescAck(self)

    def handleDescAck(self):
        if self.gameMode in GGG.FFA_MODES:
            # This is a free for all game mode, don't choose teams.
            self.fsm.request('chooseGun')
            pos, hpr = self.pickSpawnPoint()
            base.localAvatar.setPos(pos)
            base.localAvatar.setHpr(hpr)
        else:
            self.fsm.request('chooseTeam')

    def incrementKills(self):
        self.toonFps.killedSomebody()

    def allPlayersReady(self):
        self.fsm.request('countdown')

    def timeUp(self):
        if not self.isTimeUp:
            self.fsm.request('announceGameOver')
            self.isTimeUp = True

    def teamWon(self, team):
        self.fsm.request('announceTeamWon', [team])

    def enterAnnounceTeamWon(self, team):
        whistleSfx = base.loadSfx("phase_4/audio/sfx/AA_sound_whistle.ogg")
        whistleSfx.play()
        del whistleSfx

        if self.gameMode == GGG.GameModes.KOTH and DistributedToonFPSGame.getKOTHKing(
                self):
            text = DistributedToonFPSGame.getKOTHKing(self).getName()
        else:
            text = GGG.TeamNameById[team].split(' ')[0]
        self.gameOverLbl = DirectLabel(text="{0}\nWins!".format(text),
                                       relief=None,
                                       scale=0.35,
                                       text_font=CIGlobals.getMickeyFont(),
                                       text_fg=(1, 0, 0, 1))
        self.track = Sequence(Wait(3.0), Func(self.fsm.request, 'finalScores'))
        self.track.start()

    def exitAnnounceTeamWon(self):
        self.gameOverLbl.destroy()
        del self.gameOverLbl
        if self.track:
            self.track.pause()
            self.track = None

    def enterAnnounceGameOver(self):
        whistleSfx = base.loadSfx("phase_4/audio/sfx/AA_sound_whistle.ogg")
        whistleSfx.play()
        del whistleSfx
        self.gameOverLbl = DirectLabel(text="TIME'S\nUP!",
                                       relief=None,
                                       scale=0.35,
                                       text_font=CIGlobals.getMickeyFont(),
                                       text_fg=(1, 0, 0, 1))
        self.track = Sequence(Wait(3.0), Func(self.fsm.request, 'finalScores'))
        self.track.start()

    def exitAnnounceGameOver(self):
        self.gameOverLbl.destroy()
        del self.gameOverLbl
        if self.track:
            self.track.pause()
            self.track = None

    def enterFinalScores(self):
        DistributedToonFPSGame.enterFinalScores(self)
        self.sendUpdate('myFinalScore', [self.toonFps.points])

    def exitFinalScores(self):
        DistributedToonFPSGame.exitFinalScores(self)

    def incrementTeamScore(self, team):
        self.scoreByTeam[team] += 1
        if team == GGG.Teams.BLUE:
            self.blueScoreLbl.setText("Blue: {0}".format(
                self.scoreByTeam[team]))
        elif team == GGG.Teams.RED:
            self.redScoreLbl.setText('Red: {0}'.format(self.scoreByTeam[team]))

    def __updateArrows(self, task):
        blueFlag = None
        redFlag = None

        for flag in self.flags:
            if flag.team == GGG.Teams.BLUE:
                blueFlag = flag
            if flag.team == GGG.Teams.RED:
                redFlag = flag

        if not blueFlag or not redFlag:
            return task.done

        bLocation = blueFlag.flagMdl.getPos(base.cam)
        bRotation = base.cam.getQuat(base.cam)
        bCamSpacePos = bRotation.xform(bLocation)
        bArrowRadians = math.atan2(bCamSpacePos[0], bCamSpacePos[1])
        bArrowDegrees = (bArrowRadians / math.pi) * 180
        self.blueArrow.setR(bArrowDegrees - 90)

        rLocation = redFlag.flagMdl.getPos(base.cam)
        rRotation = base.cam.getQuat(base.cam)
        rCamSpacePos = rRotation.xform(rLocation)
        rArrowRadians = math.atan2(rCamSpacePos[0], rCamSpacePos[1])
        rArrowDegrees = (rArrowRadians / math.pi) * 180
        self.redArrow.setR(rArrowDegrees - 90)

        return task.cont

    def getTeamScoreLbl(self, team):
        if team == GGG.Teams.BLUE:
            return self.blueScoreLbl
        elif team == GGG.Teams.RED:
            return self.redScoreLbl

    def getTeamFlagArrow(self, team):
        if team == GGG.Teams.BLUE:
            return self.blueArrow
        elif team == GGG.Teams.RED:
            return self.redArrow

    def getTeamFrame(self, team):
        if team == GGG.Teams.BLUE:
            return self.blueFrame
        elif team == GGG.Teams.RED:
            return self.redFrame

    def enterCountdown(self):
        render.show()
        if self.gameMode == GGG.GameModes.CTF:
            self.blueFrame = DirectFrame(pos=(-0.1, 0, -0.85))
            self.blueScoreLbl = OnscreenText(
                text="Blue: 0",
                scale=0.1,
                parent=self.blueFrame,
                fg=GGG.TeamColorById[GGG.Teams.BLUE],
                shadow=(0, 0, 0, 1),
                align=TextNode.ARight)
            self.blueArrow = loader.loadModel('phase_3/models/props/arrow.bam')
            self.blueArrow.setColor(GGG.TeamColorById[GGG.Teams.BLUE])
            self.blueArrow.reparentTo(self.blueFrame)
            self.blueArrow.setPos(-0.1, 0, 0.15)
            self.blueArrow.setScale(0.1)
            self.redFrame = DirectFrame(pos=(0.1, 0, -0.85))
            self.redScoreLbl = OnscreenText(
                text="Red: 0",
                scale=0.1,
                parent=self.redFrame,
                fg=GGG.TeamColorById[GGG.Teams.RED],
                shadow=(0, 0, 0, 1),
                align=TextNode.ALeft)
            self.redArrow = loader.loadModel('phase_3/models/props/arrow.bam')
            self.redArrow.setColor(GGG.TeamColorById[GGG.Teams.RED])
            self.redArrow.reparentTo(self.redFrame)
            self.redArrow.setPos(0.1, 0, 0.15)
            self.redArrow.setScale(0.1)
            self.infoLbl = OnscreenText(text="Playing to: 3",
                                        scale=0.1,
                                        pos=(0, -0.95),
                                        fg=(1, 1, 1, 1),
                                        shadow=(0, 0, 0, 1))
            base.taskMgr.add(self.__updateArrows,
                             self.uniqueName('updateArrows'))
        camera.setPos(0, 0, 0)
        camera.setHpr(0, 0, 0)
        self.toonFps.fsm.request('alive')
        text = OnscreenText(text="",
                            scale=0.1,
                            pos=(0, 0.5),
                            fg=(1, 1, 1, 1),
                            shadow=(0, 0, 0, 1))
        self.track = Sequence(Func(text.setText, "5"), Wait(1.0),
                              Func(text.setText, "4"), Wait(1.0),
                              Func(text.setText, "3"), Wait(1.0),
                              Func(text.setText, "2"), Wait(1.0),
                              Func(text.setText, "1"), Wait(1.0),
                              Func(text.setText, "FIGHT!"),
                              Func(self.fsm.request, 'play'), Wait(1.0),
                              Func(text.destroy))
        self.track.start()
        self.sendUpdate('gunChoice',
                        [self.toonFps.weaponName, base.localAvatar.doId])

    def exitCountdown(self):
        if self.track:
            self.track.finish()
            self.track = None

    def enterPlay(self):
        DistributedToonFPSGame.enterPlay(self)
        self.toonFps.reallyStart()
        self.createTimer()

    def exitPlay(self):
        self.deleteTimer()
        if self.toonFps:
            self.toonFps.end()
        DistributedToonFPSGame.exitPlay(self)

    def announceGenerate(self):
        DistributedToonFPSGame.announceGenerate(self)
        base.localAvatar.walkControls.setWalkSpeed(GGG.ToonForwardSpeed,
                                                   GGG.ToonJumpForce,
                                                   GGG.ToonReverseSpeed,
                                                   GGG.ToonRotateSpeed)
        self.load()
        base.camLens.setMinFov(CIGlobals.GunGameFOV / (4. / 3.))

    def disable(self):
        render.show()
        base.localAvatar.setWalkSpeedNormal()

        # Show the staff icon again.
        if not base.localAvatar.tokenIcon is None:
            base.localAvatar.tokenIcon.show()

        base.camLens.setMinFov(CIGlobals.DefaultCameraFov / (4. / 3.))
        base.taskMgr.remove(self.uniqueName('updateArrows'))
        self.playersByTeam = None
        if self.blueArrow:
            self.blueArrow.removeNode()
            self.blueArrow = None
        if self.redArrow:
            self.redArrow.removeNode()
            self.redArrow = None
        if self.blueScoreLbl:
            self.blueScoreLbl.destroy()
            self.blueScoreLbl = None
        if self.redScoreLbl:
            self.redScoreLbl.destroy()
            self.redScoreLbl = None
        if self.infoLbl:
            self.infoLbl.destroy()
            self.infoLbl = None
        self.scoreByTeam = None
        self.flags = None
        self.gameMode = None
        self.team = None
        self.localAvHasFlag = None
        if self.loader:
            self.loader.unload()
            self.loader.cleanup()
            self.loader = None
        self.isTimeUp = None
        self.toonFps.reallyEnd()
        self.toonFps.cleanup()
        self.toonFps = None
        self.spawnPoints = None
        DistributedToonFPSGame.disable(self)
示例#6
0
class DistributedGunGame(DistributedToonFPSGame):
    notify = directNotify.newCategory('DistributedGunGame')

    def __init__(self, cr):
        try:
            self.DistributedGunGame_initialized
            return
        except:
            self.DistributedGunGame_initialized = 1

        DistributedToonFPSGame.__init__(self, cr)
        self.fsm.addState(State('countdown', self.enterCountdown, self.exitCountdown, ['play']))
        self.fsm.addState(State('announceGameOver', self.enterAnnounceGameOver, self.exitAnnounceGameOver, ['finalScores']))
        self.fsm.addState(State('finalScores', self.enterFinalScores, self.exitFinalScores, ['gameOver']))
        self.fsm.addState(State('chooseGun', self.enterChooseGun, self.exitChooseGun, ['waitForOthers']))
        self.fsm.getStateNamed('start').addTransition('chooseGun')
        self.fsm.getStateNamed('waitForOthers').addTransition('countdown')
        self.fsm.getStateNamed('play').addTransition('announceGameOver')
        self.toonFps = GunGameToonFPS(self)
        self.loader = GunGameLevelLoader.GunGameLevelLoader()
        self.track = None
        self.isTimeUp = False
        self.cameraMovmentSeq = None
        self.gameMode = None
        return

    def setGameMode(self, mode):
        self.gameMode = mode

    def getGameMode(self):
        return self.gameMode

    def avatarHitByBullet(self, avId, damage):
        avatar = self.getRemoteAvatar(avId)
        if avatar:
            avatar.grunt()

    def headBackToMinigameArea(self):
        if self.loader:
            self.loader.unload()
            self.loader.cleanup()
            self.loader = None
        DistributedToonFPSGame.headBackToMinigameArea(self)
        return

    def attachGunToAvatar(self, avId):
        self.remoteAvatars.append(RemoteToonBattleAvatar(self, self.cr, avId))

    def setLevelName(self, levelName):
        self.loader.setLevel(levelName)

    def pickSpawnPoint(self):
        return random.choice(self.loader.getSpawnPoints())

    def load(self):
        self.loader.load()
        pos, hpr = self.pickSpawnPoint()
        base.localAvatar.setPos(pos)
        base.localAvatar.setHpr(hpr)
        self.toonFps.load()
        self.myRemoteAvatar = RemoteToonBattleAvatar(self, self.cr, base.localAvatar.doId)
        self.setMinigameMusic('phase_4/audio/bgm/MG_TwoDGame.mid')
        self.setDescription('Battle and defeat the other Toons with your gun to gain points. ' + "Remember to reload your gun when you're out of ammo! " + 'The Toon with the most points when the timer runs out gets a nice prize!')
        self.setWinnerPrize(70)
        self.setLoserPrize(15)
        pos, hpr = self.loader.getCameraOfCurrentLevel()
        camera.setPos(pos)
        camera.setHpr(hpr)
        DistributedToonFPSGame.load(self)

    def enterChooseGun(self):
        font = CIGlobals.getToonFont()
        box = DGG.getDefaultDialogGeom()
        geom = CIGlobals.getDefaultBtnGeom()
        self.container = DirectFrame()
        self.bg = OnscreenImage(image=box, color=(1, 1, 0.75, 1), scale=(1.9, 1.4, 1.4), parent=self.container)
        self.title = OnscreenText(text='Choose A Gun', pos=(0, 0.5, 0), font=font, scale=0.12, parent=self.container)
        self.pistolBtn = DirectButton(geom=geom, text='Pistol', relief=None, text_scale=0.055, text_pos=(0, -0.01), command=self.__gunChoice, extraArgs=['pistol'], pos=(0, 0, 0.35), parent=self.container)
        self.shotgunBtn = DirectButton(geom=geom, text='Shotgun', relief=None, text_scale=0.055, text_pos=(0, -0.01), command=self.__gunChoice, extraArgs=['shotgun'], pos=(0, 0, 0.25), parent=self.container)
        return

    def __gunChoice(self, choice):
        self.toonFps.cleanup()
        self.toonFps = None
        self.toonFps = GunGameToonFPS(self, choice)
        self.toonFps.load()
        self.d_ready()
        self.fsm.request('waitForOthers')
        return

    def exitChooseGun(self):
        self.shotgunBtn.destroy()
        del self.shotgunBtn
        self.pistolBtn.destroy()
        del self.pistolBtn
        self.title.destroy()
        del self.title
        self.bg.destroy()
        del self.bg
        self.container.destroy()
        del self.container

    def gunChoice(self, choice, avId):
        remoteAvatar = self.getRemoteAvatar(avId)
        if remoteAvatar:
            remoteAvatar.setGunName(choice)

    def handleDescAck(self):
        self.fsm.request('chooseGun')

    def incrementKills(self):
        self.toonFps.killedSomebody()

    def allPlayersReady(self):
        self.fsm.request('countdown')

    def timeUp(self):
        if not self.isTimeUp:
            self.fsm.request('announceGameOver')
            self.isTimeUp = True

    def enterAnnounceGameOver(self):
        whistleSfx = base.loadSfx('phase_4/audio/sfx/AA_sound_whistle.mp3')
        whistleSfx.play()
        del whistleSfx
        self.gameOverLbl = DirectLabel(text="TIME'S\nUP!", relief=None, scale=0.35, text_font=CIGlobals.getMickeyFont(), text_fg=(1, 0, 0, 1))
        self.track = Sequence(Wait(3.0), Func(self.fsm.request, 'finalScores'))
        self.track.start()
        return

    def exitAnnounceGameOver(self):
        self.gameOverLbl.destroy()
        del self.gameOverLbl
        if self.track:
            self.track.pause()
            self.track = None
        return

    def enterFinalScores(self):
        DistributedToonFPSGame.enterFinalScores(self)
        self.sendUpdate('myFinalScore', [self.toonFps.points])

    def enterCountdown(self):
        camera.setPos(0, 0, 0)
        camera.setHpr(0, 0, 0)
        self.toonFps.fsm.request('alive')
        text = OnscreenText(text='', scale=0.1, pos=(0, 0.5), fg=(1, 1, 1, 1), shadow=(0, 0, 0, 1))
        self.track = Sequence(Func(text.setText, '5'), Wait(1.0), Func(text.setText, '4'), Wait(1.0), Func(text.setText, '3'), Wait(1.0), Func(text.setText, '2'), Wait(1.0), Func(text.setText, '1'), Wait(1.0), Func(text.setText, 'FIGHT!'), Func(self.fsm.request, 'play'), Wait(1.0), Func(text.destroy))
        self.track.start()
        self.sendUpdate('gunChoice', [self.toonFps.weaponName, base.localAvatar.doId])

    def exitCountdown(self):
        if self.track:
            self.track.finish()
            self.track = None
        return

    def enterPlay(self):
        DistributedToonFPSGame.enterPlay(self)
        self.toonFps.reallyStart()
        self.createTimer()

    def exitPlay(self):
        self.deleteTimer()
        if self.toonFps:
            self.toonFps.end()
        base.localAvatar.createChatInput()
        DistributedToonFPSGame.exitPlay(self)

    def announceGenerate(self):
        DistributedToonFPSGame.announceGenerate(self)
        self.load()
        base.camLens.setMinFov(CIGlobals.GunGameFOV / (4.0 / 3.0))

    def disable(self):
        DistributedToonFPSGame.disable(self)
        base.camLens.setMinFov(CIGlobals.DefaultCameraFov / (4.0 / 3.0))
        if self.loader:
            self.loader.unload()
            self.loader.cleanup()
            self.loader = None
        self.isTimeUp = None
        self.toonFps.reallyEnd()
        self.toonFps.cleanup()
        self.toonFps = None
        self.spawnPoints = None
        return