def __initCollisions(self):
     collSphere = CollisionSphere(0, 0, 0, Globals.PlayerCollisionRadius)
     collSphere.setTangible(0)
     self.mazeCollisionName = Globals.LocalPlayerCollisionName
     collNode = CollisionNode(self.mazeCollisionName)
     collNode.addSolid(collSphere)
     collNodePath = self.toon.attachNewNode(collNode)
     collNodePath.hide()
     handler = CollisionHandlerEvent()
     handler.addInPattern('%fn-into-%in')
     base.cTrav.addCollider(collNodePath, handler)
     self.handler = handler
     self._collNodePath = collNodePath
 def __initCollisions(self):
     collSphere = CollisionSphere(0, 0, 0, Globals.PlayerCollisionRadius)
     collSphere.setTangible(0)
     self.mazeCollisionName = Globals.LocalPlayerCollisionName
     collNode = CollisionNode(self.mazeCollisionName)
     collNode.addSolid(collSphere)
     collNodePath = self.toon.attachNewNode(collNode)
     collNodePath.hide()
     handler = CollisionHandlerEvent()
     handler.addInPattern('%fn-into-%in')
     base.cTrav.addCollider(collNodePath, handler)
     self.handler = handler
     self._collNodePath = collNodePath
class DistributedIceGame(DistributedMinigame.DistributedMinigame, DistributedIceWorld.DistributedIceWorld):
    notify = directNotify.newCategory("DistributedIceGame")
    MaxLocalForce = 100
    MaxPhysicsForce = 25000

    def __init__(self, cr):
        DistributedMinigame.DistributedMinigame.__init__(self, cr)
        DistributedIceWorld.DistributedIceWorld.__init__(self, cr)
        self.gameFSM = ClassicFSM.ClassicFSM(
            "DistributedIceGame",
            [
                State.State("off", self.enterOff, self.exitOff, ["inputChoice"]),
                State.State(
                    "inputChoice",
                    self.enterInputChoice,
                    self.exitInputChoice,
                    ["waitServerChoices", "moveTires", "displayVotes", "cleanup"],
                ),
                State.State(
                    "waitServerChoices",
                    self.enterWaitServerChoices,
                    self.exitWaitServerChoices,
                    ["moveTires", "cleanup"],
                ),
                State.State("moveTires", self.enterMoveTires, self.exitMoveTires, ["synch", "cleanup"]),
                State.State("synch", self.enterSynch, self.exitSynch, ["inputChoice", "scoring", "cleanup"]),
                State.State("scoring", self.enterScoring, self.exitScoring, ["cleanup", "finalResults", "inputChoice"]),
                State.State("finalResults", self.enterFinalResults, self.exitFinalResults, ["cleanup"]),
                State.State("cleanup", self.enterCleanup, self.exitCleanup, []),
            ],
            "off",
            "cleanup",
        )
        self.addChildGameFSM(self.gameFSM)
        self.cameraThreeQuarterView = (0, -22, 45, 0, -62.89, 0)
        self.tireDict = {}
        self.forceArrowDict = {}
        self.canDrive = False
        self.timer = None
        self.timerStartTime = None
        self.curForce = 0
        self.curHeading = 0
        self.headingMomentum = 0.0
        self.forceMomentum = 0.0
        self.allTireInputs = None
        self.curRound = 0
        self.curMatch = 0
        self.controlKeyWarningLabel = DirectLabel(
            text=TTLocalizer.IceGameControlKeyWarning,
            text_fg=VBase4(1, 0, 0, 1),
            relief=None,
            pos=(0.0, 0, 0),
            scale=0.15,
        )
        self.controlKeyWarningLabel.hide()
        self.waitingMoveLabel = DirectLabel(
            text=TTLocalizer.IceGameWaitingForPlayersToFinishMove,
            text_fg=VBase4(1, 1, 1, 1),
            relief=None,
            pos=(-0.6, 0, -0.75),
            scale=0.075,
        )
        self.waitingMoveLabel.hide()
        self.waitingSyncLabel = DirectLabel(
            text=TTLocalizer.IceGameWaitingForAISync,
            text_fg=VBase4(1, 1, 1, 1),
            relief=None,
            pos=(-0.6, 0, -0.75),
            scale=0.075,
        )
        self.waitingSyncLabel.hide()
        self.infoLabel = DirectLabel(text="", text_fg=VBase4(0, 0, 0, 1), relief=None, pos=(0.0, 0, 0.7), scale=0.075)
        self.updateInfoLabel()
        self.lastForceArrowUpdateTime = 0
        self.sendForceArrowUpdateAsap = False
        self.treasures = []
        self.penalties = []
        self.obstacles = []
        self.controlKeyPressed = False
        self.controlKeyWarningIval = None
        return

    def delete(self):
        DistributedIceWorld.DistributedIceWorld.delete(self)
        DistributedMinigame.DistributedMinigame.delete(self)
        if self.controlKeyWarningIval:
            self.controlKeyWarningIval.finish()
            self.controlKeyWarningIval = None
        self.controlKeyWarningLabel.destroy()
        del self.controlKeyWarningLabel
        self.waitingMoveLabel.destroy()
        del self.waitingMoveLabel
        self.waitingSyncLabel.destroy()
        del self.waitingSyncLabel
        self.infoLabel.destroy()
        del self.infoLabel
        for treasure in self.treasures:
            treasure.destroy()

        del self.treasures
        for penalty in self.penalties:
            penalty.destroy()

        del self.penalties
        for obstacle in self.obstacles:
            obstacle.removeNode()

        del self.obstacles
        del self.gameFSM
        return

    def announceGenerate(self):
        DistributedMinigame.DistributedMinigame.announceGenerate(self)
        DistributedIceWorld.DistributedIceWorld.announceGenerate(self)
        self.debugTaskName = self.uniqueName("debugTask")

    def getTitle(self):
        return TTLocalizer.IceGameTitle

    def getInstructions(self):
        szId = self.getSafezoneId()
        numPenalties = IceGameGlobals.NumPenalties[szId]
        result = TTLocalizer.IceGameInstructions
        if numPenalties == 0:
            result = TTLocalizer.IceGameInstructionsNoTnt
        return result

    def getMaxDuration(self):
        return 0

    def load(self):
        self.notify.debug("load")
        DistributedMinigame.DistributedMinigame.load(self)
        self.music = base.loadMusic("phase_4/audio/bgm/MG_IceGame.ogg")
        self.gameBoard = loader.loadModel("phase_4/models/minigames/ice_game_icerink")
        background = loader.loadModel("phase_4/models/minigames/ice_game_2d")
        backgroundWide = loader.loadModel("phase_4/models/minigames/iceslide_ground")
        background.reparentTo(self.gameBoard)
        backgroundWide.reparentTo(self.gameBoard)
        backgroundWide.setPos(0, -0.3, -0.5)
        self.gameBoard.setPosHpr(0, 0, 0, 0, 0, 0)
        self.gameBoard.setScale(1.0)
        self.setupSimulation()
        index = 0
        for avId in self.avIdList:
            self.setupTire(avId, index)
            self.setupForceArrow(avId)
            index += 1

        for index in xrange(len(self.avIdList), 4):
            self.setupTire(-index, index)
            self.setupForceArrow(-index)

        self.showForceArrows(realPlayersOnly=True)
        self.westWallModel = NodePath()
        if not self.westWallModel.isEmpty():
            self.westWallModel.reparentTo(self.gameBoard)
            self.westWallModel.setPos(IceGameGlobals.MinWall[0], IceGameGlobals.MinWall[1], 0)
            self.westWallModel.setScale(4)
        self.eastWallModel = NodePath()
        if not self.eastWallModel.isEmpty():
            self.eastWallModel.reparentTo(self.gameBoard)
            self.eastWallModel.setPos(IceGameGlobals.MaxWall[0], IceGameGlobals.MaxWall[1], 0)
            self.eastWallModel.setScale(4)
            self.eastWallModel.setH(180)
        self.arrowKeys = ArrowKeys.ArrowKeys()
        self.target = loader.loadModel("phase_3/models/misc/sphere")
        self.target.setScale(0.01)
        self.target.reparentTo(self.gameBoard)
        self.target.setPos(0, 0, 0)
        self.scoreCircle = loader.loadModel("phase_4/models/minigames/ice_game_score_circle")
        self.scoreCircle.setScale(0.01)
        self.scoreCircle.reparentTo(self.gameBoard)
        self.scoreCircle.setZ(IceGameGlobals.TireRadius / 2.0)
        self.scoreCircle.setAlphaScale(0.5)
        self.scoreCircle.setTransparency(1)
        self.scoreCircle.hide()
        self.treasureModel = loader.loadModel("phase_4/models/minigames/ice_game_barrel")
        self.penaltyModel = loader.loadModel("phase_4/models/minigames/ice_game_tnt2")
        self.penaltyModel.setScale(0.75, 0.75, 0.7)
        szId = self.getSafezoneId()
        obstacles = IceGameGlobals.Obstacles[szId]
        index = 0
        cubicObstacle = IceGameGlobals.ObstacleShapes[szId]
        for pos in obstacles:
            newPos = Point3(pos[0], pos[1], IceGameGlobals.TireRadius)
            newObstacle = self.createObstacle(newPos, index, cubicObstacle)
            self.obstacles.append(newObstacle)
            index += 1

        self.countSound = loader.loadSfx("phase_3.5/audio/sfx/tick_counter.ogg")
        self.treasureGrabSound = loader.loadSfx("phase_4/audio/sfx/MG_sfx_vine_game_bananas.ogg")
        self.penaltyGrabSound = loader.loadSfx("phase_4/audio/sfx/MG_cannon_fire_alt.ogg")
        self.tireSounds = []
        for tireIndex in xrange(4):
            tireHit = loader.loadSfx("phase_4/audio/sfx/Golf_Hit_Barrier_1.ogg")
            wallHit = loader.loadSfx("phase_4/audio/sfx/MG_maze_pickup.ogg")
            obstacleHit = loader.loadSfx("phase_4/audio/sfx/Golf_Hit_Barrier_2.ogg")
            self.tireSounds.append({"tireHit": tireHit, "wallHit": wallHit, "obstacleHit": obstacleHit})

        self.arrowRotateSound = loader.loadSfx("phase_4/audio/sfx/MG_sfx_ice_force_rotate.ogg")
        self.arrowUpSound = loader.loadSfx("phase_4/audio/sfx/MG_sfx_ice_force_increase_3sec.ogg")
        self.arrowDownSound = loader.loadSfx("phase_4/audio/sfx/MG_sfx_ice_force_decrease_3sec.ogg")
        self.scoreCircleSound = loader.loadSfx("phase_4/audio/sfx/MG_sfx_ice_scoring_1.ogg")

    def unload(self):
        self.notify.debug("unload")
        DistributedMinigame.DistributedMinigame.unload(self)
        del self.music
        self.gameBoard.removeNode()
        del self.gameBoard
        for forceArrow in self.forceArrowDict.values():
            forceArrow.removeNode()

        del self.forceArrowDict
        self.scoreCircle.removeNode()
        del self.scoreCircle
        del self.countSound

    def onstage(self):
        self.notify.debug("onstage")
        DistributedMinigame.DistributedMinigame.onstage(self)
        self.gameBoard.reparentTo(render)
        self.__placeToon(self.localAvId)
        self.moveCameraToTop()
        self.scorePanels = []
        base.playMusic(self.music, looping=1, volume=0.8)

    def offstage(self):
        self.notify.debug("offstage")
        self.music.stop()
        self.gameBoard.hide()
        self.infoLabel.hide()
        for avId in self.tireDict:
            self.tireDict[avId]["tireNodePath"].hide()

        for panel in self.scorePanels:
            panel.cleanup()

        del self.scorePanels
        for obstacle in self.obstacles:
            obstacle.hide()

        for treasure in self.treasures:
            treasure.nodePath.hide()

        for penalty in self.penalties:
            penalty.nodePath.hide()

        for avId in self.avIdList:
            av = self.getAvatar(avId)
            if av:
                av.dropShadow.show()
                av.resetLOD()

        taskMgr.remove(self.uniqueName("aimtask"))
        self.arrowKeys.destroy()
        del self.arrowKeys
        DistributedMinigame.DistributedMinigame.offstage(self)

    def handleDisabledAvatar(self, avId):
        self.notify.debug("handleDisabledAvatar")
        self.notify.debug("avatar " + str(avId) + " disabled")
        DistributedMinigame.DistributedMinigame.handleDisabledAvatar(self, avId)

    def setGameReady(self):
        if not self.hasLocalToon:
            return
        self.notify.debug("setGameReady")
        if DistributedMinigame.DistributedMinigame.setGameReady(self):
            return
        for index in xrange(self.numPlayers):
            avId = self.avIdList[index]
            toon = self.getAvatar(avId)
            if toon:
                toon.reparentTo(render)
                self.__placeToon(avId)
                toon.forwardSpeed = 0
                toon.rotateSpeed = False
                toon.dropShadow.hide()
                toon.setAnimState("Sit")
                if avId in self.tireDict:
                    tireNp = self.tireDict[avId]["tireNodePath"]
                    toon.reparentTo(tireNp)
                    toon.setY(1.0)
                    toon.setZ(-3)
                toon.startLookAround()

    def setGameStart(self, timestamp):
        if not self.hasLocalToon:
            return
        self.notify.debug("setGameStart")
        DistributedMinigame.DistributedMinigame.setGameStart(self, timestamp)
        for avId in self.remoteAvIdList:
            toon = self.getAvatar(avId)
            if toon:
                toon.stopLookAround()

        self.scores = [0] * self.numPlayers
        spacing = 0.4
        for i in xrange(self.numPlayers):
            avId = self.avIdList[i]
            avName = self.getAvatarName(avId)
            scorePanel = MinigameAvatarScorePanel.MinigameAvatarScorePanel(avId, avName)
            scorePanel.setScale(0.9)
            scorePanel.setPos(-0.583 - spacing * (self.numPlayers - 1 - i), 0.0, -0.15)
            scorePanel.reparentTo(base.a2dTopRight)
            scorePanel.makeTransparent(0.75)
            self.scorePanels.append(scorePanel)

        self.arrowKeys.setPressHandlers(
            [
                self.__upArrowPressed,
                self.__downArrowPressed,
                self.__leftArrowPressed,
                self.__rightArrowPressed,
                self.__controlPressed,
            ]
        )

    def isInPlayState(self):
        if not self.gameFSM.getCurrentState():
            return False
        if not self.gameFSM.getCurrentState().getName() == "play":
            return False
        return True

    def enterOff(self):
        self.notify.debug("enterOff")

    def exitOff(self):
        pass

    def enterInputChoice(self):
        self.notify.debug("enterInputChoice")
        self.forceLocalToonToTire()
        self.controlKeyPressed = False
        if self.curRound == 0:
            self.setupStartOfMatch()
        else:
            self.notify.debug("self.curRound = %s" % self.curRound)
        self.timer = ToontownTimer.ToontownTimer()
        self.timer.hide()
        if self.timerStartTime != None:
            self.startTimer()
        self.showForceArrows(realPlayersOnly=True)
        self.localForceArrow().setPosHpr(0, 0, -1.0, 0, 0, 0)
        self.localForceArrow().reparentTo(self.localTireNp())
        self.localForceArrow().setY(IceGameGlobals.TireRadius)
        self.localTireNp().headsUp(self.target)
        self.notify.debug("self.localForceArrow() heading = %s" % self.localForceArrow().getH())
        self.curHeading = self.localTireNp().getH()
        self.curForce = 25
        self.updateLocalForceArrow()
        for avId in self.forceArrowDict:
            forceArrow = self.forceArrowDict[avId]
            forceArrow.setPosHpr(0, 0, -1.0, 0, 0, 0)
            tireNp = self.tireDict[avId]["tireNodePath"]
            forceArrow.reparentTo(tireNp)
            forceArrow.setY(IceGameGlobals.TireRadius)
            tireNp.headsUp(self.target)
            self.updateForceArrow(avId, tireNp.getH(), 25)

        taskMgr.add(self.__aimTask, self.uniqueName("aimtask"))
        if base.localAvatar.laffMeter:
            base.localAvatar.laffMeter.stop()
        self.sendForceArrowUpdateAsap = False
        return

    def exitInputChoice(self):
        if not self.controlKeyPressed:
            if self.controlKeyWarningIval:
                self.controlKeyWarningIval.finish()
                self.controlKeyWarningIval = None
            self.controlKeyWarningIval = Sequence(
                Func(self.controlKeyWarningLabel.show),
                self.controlKeyWarningLabel.colorScaleInterval(
                    10, VBase4(1, 1, 1, 0), startColorScale=VBase4(1, 1, 1, 1)
                ),
                Func(self.controlKeyWarningLabel.hide),
            )
            self.controlKeyWarningIval.start()
        if self.timer != None:
            self.timer.destroy()
            self.timer = None
        self.timerStartTime = None
        self.hideForceArrows()
        self.arrowRotateSound.stop()
        self.arrowUpSound.stop()
        self.arrowDownSound.stop()
        taskMgr.remove(self.uniqueName("aimtask"))
        return

    def enterWaitServerChoices(self):
        self.waitingMoveLabel.show()
        self.showForceArrows(True)

    def exitWaitServerChoices(self):
        self.waitingMoveLabel.hide()
        self.hideForceArrows()

    def enterMoveTires(self):
        for key in self.tireDict:
            body = self.tireDict[key]["tireBody"]
            body.setAngularVel(0, 0, 0)
            body.setLinearVel(0, 0, 0)

        for index in xrange(len(self.allTireInputs)):
            input = self.allTireInputs[index]
            avId = self.avIdList[index]
            body = self.getTireBody(avId)
            degs = input[1] + 90
            tireNp = self.getTireNp(avId)
            tireH = tireNp.getH()
            self.notify.debug("tireH = %s" % tireH)
            radAngle = deg2Rad(degs)
            foo = NodePath("foo")
            dirVector = Vec3(math.cos(radAngle), math.sin(radAngle), 0)
            self.notify.debug("dirVector is now=%s" % dirVector)
            inputForce = input[0]
            inputForce /= self.MaxLocalForce
            inputForce *= self.MaxPhysicsForce
            force = dirVector * inputForce
            self.notify.debug("adding force %s to %d" % (force, avId))
            body.addForce(force)

        self.enableAllTireBodies()
        self.totalPhysicsSteps = 0
        self.startSim()
        taskMgr.add(self.__moveTiresTask, self.uniqueName("moveTiresTtask"))

    def exitMoveTires(self):
        self.forceLocalToonToTire()
        self.disableAllTireBodies()
        self.stopSim()
        self.notify.debug("total Physics steps = %d" % self.totalPhysicsSteps)
        taskMgr.remove(self.uniqueName("moveTiresTtask"))

    def enterSynch(self):
        self.waitingSyncLabel.show()

    def exitSynch(self):
        self.waitingSyncLabel.hide()

    def enterScoring(self):
        sortedByDistance = []
        for avId in self.avIdList:
            np = self.getTireNp(avId)
            pos = np.getPos()
            pos.setZ(0)
            sortedByDistance.append((avId, pos.length()))

        def compareDistance(x, y):
            if x[1] - y[1] > 0:
                return 1
            elif x[1] - y[1] < 0:
                return -1
            else:
                return 0

        sortedByDistance.sort(cmp=compareDistance)
        self.scoreMovie = Sequence()
        curScale = 0.01
        curTime = 0
        self.scoreCircle.setScale(0.01)
        self.scoreCircle.show()
        self.notify.debug("newScores = %s" % self.newScores)
        circleStartTime = 0
        for index in xrange(len(sortedByDistance)):
            distance = sortedByDistance[index][1]
            avId = sortedByDistance[index][0]
            scorePanelIndex = self.avIdList.index(avId)
            time = (distance - curScale) / IceGameGlobals.ExpandFeetPerSec
            if time < 0:
                time = 0.01
            scaleXY = distance + IceGameGlobals.TireRadius
            self.notify.debug("circleStartTime = %s" % circleStartTime)
            self.scoreMovie.append(
                Parallel(
                    LerpScaleInterval(self.scoreCircle, time, Point3(scaleXY, scaleXY, 1.0)),
                    SoundInterval(self.scoreCircleSound, duration=time, startTime=circleStartTime),
                )
            )
            circleStartTime += time
            startScore = self.scorePanels[scorePanelIndex].getScore()
            destScore = self.newScores[scorePanelIndex]
            self.notify.debug("for avId %d, startScore=%d, newScores=%d" % (avId, startScore, destScore))

            def increaseScores(t, scorePanelIndex=scorePanelIndex, startScore=startScore, destScore=destScore):
                oldScore = self.scorePanels[scorePanelIndex].getScore()
                diff = destScore - startScore
                newScore = int(startScore + diff * t)
                if newScore > oldScore:
                    base.playSfx(self.countSound)
                self.scorePanels[scorePanelIndex].setScore(newScore)
                self.scores[scorePanelIndex] = newScore

            duration = (destScore - startScore) * IceGameGlobals.ScoreCountUpRate
            tireNp = self.tireDict[avId]["tireNodePath"]
            self.scoreMovie.append(
                Parallel(
                    LerpFunctionInterval(increaseScores, duration),
                    Sequence(
                        LerpColorScaleInterval(tireNp, duration / 6.0, VBase4(1, 0, 0, 1)),
                        LerpColorScaleInterval(tireNp, duration / 6.0, VBase4(1, 1, 1, 1)),
                        LerpColorScaleInterval(tireNp, duration / 6.0, VBase4(1, 0, 0, 1)),
                        LerpColorScaleInterval(tireNp, duration / 6.0, VBase4(1, 1, 1, 1)),
                        LerpColorScaleInterval(tireNp, duration / 6.0, VBase4(1, 0, 0, 1)),
                        LerpColorScaleInterval(tireNp, duration / 6.0, VBase4(1, 1, 1, 1)),
                    ),
                )
            )
            curScale += distance

        self.scoreMovie.append(Func(self.sendUpdate, "reportScoringMovieDone", []))
        self.scoreMovie.start()

    def exitScoring(self):
        self.scoreMovie.finish()
        self.scoreMovie = None
        self.scoreCircle.hide()
        return

    def enterFinalResults(self):
        lerpTrack = Parallel()
        lerpDur = 0.5
        tY = 0.6
        bY = -0.05
        lX = -0.5
        cX = 0
        rX = 0.5
        scorePanelLocs = (
            ((cX, bY),),
            ((lX, bY), (rX, bY)),
            ((cX, tY), (lX, bY), (rX, bY)),
            ((lX, tY), (rX, tY), (lX, bY), (rX, bY)),
        )
        scorePanelLocs = scorePanelLocs[self.numPlayers - 1]
        for i in xrange(self.numPlayers):
            panel = self.scorePanels[i]
            pos = scorePanelLocs[i]
            panel.wrtReparentTo(aspect2d)
            lerpTrack.append(
                Parallel(
                    LerpPosInterval(panel, lerpDur, Point3(pos[0], 0, pos[1]), blendType="easeInOut"),
                    LerpScaleInterval(panel, lerpDur, Vec3(panel.getScale()) * 2.0, blendType="easeInOut"),
                )
            )

        self.showScoreTrack = Parallel(
            lerpTrack, Sequence(Wait(IceGameGlobals.ShowScoresDuration), Func(self.gameOver))
        )
        self.showScoreTrack.start()

    def exitFinalResults(self):
        self.showScoreTrack.pause()
        del self.showScoreTrack

    def enterCleanup(self):
        self.notify.debug("enterCleanup")
        if base.localAvatar.laffMeter:
            base.localAvatar.laffMeter.start()

    def exitCleanup(self):
        pass

    def __placeToon(self, avId):
        toon = self.getAvatar(avId)
        if toon:
            toon.setPos(0, 0, 0)
            toon.setHpr(0, 0, 0)

    def moveCameraToTop(self):
        camera.reparentTo(render)
        p = self.cameraThreeQuarterView
        camera.setPosHpr(p[0], p[1], p[2], p[3], p[4], p[5])

    def setupTire(self, avId, index):
        tireNp, tireBody, tireOdeGeom = self.createTire(index)
        self.tireDict[avId] = {"tireNodePath": tireNp, "tireBody": tireBody, "tireOdeGeom": tireOdeGeom}
        if avId <= 0:
            tireBlocker = tireNp.find("**/tireblockermesh")
            if not tireBlocker.isEmpty():
                tireBlocker.hide()
        if avId == self.localAvId:
            tireNp = self.tireDict[avId]["tireNodePath"]
            self.treasureSphereName = "treasureCollider"
            self.treasureCollSphere = CollisionSphere(0, 0, 0, IceGameGlobals.TireRadius)
            self.treasureCollSphere.setTangible(0)
            self.treasureCollNode = CollisionNode(self.treasureSphereName)
            self.treasureCollNode.setFromCollideMask(ToontownGlobals.PieBitmask)
            self.treasureCollNode.addSolid(self.treasureCollSphere)
            self.treasureCollNodePath = tireNp.attachNewNode(self.treasureCollNode)
            self.treasureHandler = CollisionHandlerEvent()
            self.treasureHandler.addInPattern("%fn-intoTreasure")
            base.cTrav.addCollider(self.treasureCollNodePath, self.treasureHandler)
            eventName = "%s-intoTreasure" % self.treasureCollNodePath.getName()
            self.notify.debug("eventName = %s" % eventName)
            self.accept(eventName, self.toonHitSomething)

    def setupForceArrow(self, avId):
        arrow = loader.loadModel("phase_4/models/minigames/ice_game_arrow")
        priority = 0
        if avId < 0:
            priority = -avId
        else:
            priority = self.avIdList.index(avId)
            if avId == self.localAvId:
                priority = 10
        self.forceArrowDict[avId] = arrow

    def hideForceArrows(self):
        for forceArrow in self.forceArrowDict.values():
            forceArrow.hide()

    def showForceArrows(self, realPlayersOnly=True):
        for avId in self.forceArrowDict:
            if realPlayersOnly:
                if avId > 0:
                    self.forceArrowDict[avId].show()
                else:
                    self.forceArrowDict[avId].hide()
            else:
                self.forceArrowDict[avId].show()

    def localForceArrow(self):
        if self.localAvId in self.forceArrowDict:
            return self.forceArrowDict[self.localAvId]
        else:
            return None
        return None

    def setChoices(self, input0, input1, input2, input3):
        pass

    def startDebugTask(self):
        taskMgr.add(self.debugTask, self.debugTaskName)

    def stopDebugTask(self):
        taskMgr.remove(self.debugTaskName)

    def debugTask(self, task):
        if self.canDrive and self.tireDict.has_key(localAvatar.doId):
            dt = globalClock.getDt()
            forceMove = 25000
            forceMoveDt = forceMove
            tireBody = self.tireDict[localAvatar.doId]["tireBody"]
            if self.arrowKeys.upPressed() and not tireBody.isEnabled():
                x = 0
                y = 1
                tireBody.enable()
                tireBody.addForce(Vec3(x * forceMoveDt, y * forceMoveDt, 0))
            if self.arrowKeys.downPressed() and not tireBody.isEnabled():
                x = 0
                y = -1
                tireBody.enable()
                tireBody.addForce(Vec3(x * forceMoveDt, y * forceMoveDt, 0))
            if self.arrowKeys.leftPressed() and not tireBody.isEnabled():
                x = -1
                y = 0
                tireBody.enable()
                tireBody.addForce(Vec3(x * forceMoveDt, y * forceMoveDt, 0))
            if self.arrowKeys.rightPressed() and not tireBody.isEnabled():
                x = 1
                y = 0
                tireBody.enable()
                tireBody.addForce(Vec3(x * forceMoveDt, y * forceMoveDt, 0))
        return task.cont

    def __upArrowPressed(self):
        pass

    def __downArrowPressed(self):
        pass

    def __leftArrowPressed(self):
        pass

    def __rightArrowPressed(self):
        pass

    def __controlPressed(self):
        if self.gameFSM.getCurrentState().getName() == "inputChoice":
            self.sendForceArrowUpdateAsap = True
            self.updateLocalForceArrow()
            self.controlKeyPressed = True
            self.sendUpdate("setAvatarChoice", [self.curForce, self.curHeading])
            self.gameFSM.request("waitServerChoices")

    def startTimer(self):
        now = globalClock.getFrameTime()
        elapsed = now - self.timerStartTime
        self.timer.posInTopRightCorner()
        self.timer.setTime(IceGameGlobals.InputTimeout)
        self.timer.countdown(IceGameGlobals.InputTimeout - elapsed, self.handleChoiceTimeout)
        self.timer.show()

    def setTimerStartTime(self, timestamp):
        if not self.hasLocalToon:
            return
        self.timerStartTime = globalClockDelta.networkToLocalTime(timestamp)
        if self.timer != None:
            self.startTimer()
        return

    def handleChoiceTimeout(self):
        self.sendUpdate("setAvatarChoice", [0, 0])
        self.gameFSM.request("waitServerChoices")

    def localTireNp(self):
        ret = None
        if self.localAvId in self.tireDict:
            ret = self.tireDict[self.localAvId]["tireNodePath"]
        return ret

    def localTireBody(self):
        ret = None
        if self.localAvId in self.tireDict:
            ret = self.tireDict[self.localAvId]["tireBody"]
        return ret

    def getTireBody(self, avId):
        ret = None
        if avId in self.tireDict:
            ret = self.tireDict[avId]["tireBody"]
        return ret

    def getTireNp(self, avId):
        ret = None
        if avId in self.tireDict:
            ret = self.tireDict[avId]["tireNodePath"]
        return ret

    def updateForceArrow(self, avId, curHeading, curForce):
        forceArrow = self.forceArrowDict[avId]
        tireNp = self.tireDict[avId]["tireNodePath"]
        tireNp.setH(curHeading)
        tireBody = self.tireDict[avId]["tireBody"]
        tireBody.setQuaternion(tireNp.getQuat())
        self.notify.debug("curHeading = %s" % curHeading)
        yScale = curForce / 100.0
        yScale *= 1
        headY = yScale * 15
        xScale = (yScale - 1) / 2.0 + 1.0
        shaft = forceArrow.find("**/arrow_shaft")
        head = forceArrow.find("**/arrow_head")
        shaft.setScale(xScale, yScale, 1)
        head.setPos(0, headY, 0)
        head.setScale(xScale, xScale, 1)

    def updateLocalForceArrow(self):
        avId = self.localAvId
        self.b_setForceArrowInfo(avId, self.curHeading, self.curForce)

    def __aimTask(self, task):
        if not hasattr(self, "arrowKeys"):
            return task.done
        dt = globalClock.getDt()
        headingMomentumChange = dt * 60.0
        forceMomentumChange = dt * 160.0
        arrowUpdate = False
        arrowRotating = False
        arrowUp = False
        arrowDown = False
        if self.arrowKeys.upPressed() and not self.arrowKeys.downPressed():
            self.forceMomentum += forceMomentumChange
            if self.forceMomentum < 0:
                self.forceMomentum = 0
            if self.forceMomentum > 50:
                self.forceMomentum = 50
            oldForce = self.curForce
            self.curForce += self.forceMomentum * dt
            arrowUpdate = True
            if oldForce < self.MaxLocalForce:
                arrowUp = True
        elif self.arrowKeys.downPressed() and not self.arrowKeys.upPressed():
            self.forceMomentum += forceMomentumChange
            if self.forceMomentum < 0:
                self.forceMomentum = 0
            if self.forceMomentum > 50:
                self.forceMomentum = 50
            oldForce = self.curForce
            self.curForce -= self.forceMomentum * dt
            arrowUpdate = True
            if oldForce > 0.01:
                arrowDown = True
        else:
            self.forceMomentum = 0
        if self.arrowKeys.leftPressed() and not self.arrowKeys.rightPressed():
            self.headingMomentum += headingMomentumChange
            if self.headingMomentum < 0:
                self.headingMomentum = 0
            if self.headingMomentum > 50:
                self.headingMomentum = 50
            self.curHeading += self.headingMomentum * dt
            arrowUpdate = True
            arrowRotating = True
        elif self.arrowKeys.rightPressed() and not self.arrowKeys.leftPressed():
            self.headingMomentum += headingMomentumChange
            if self.headingMomentum < 0:
                self.headingMomentum = 0
            if self.headingMomentum > 50:
                self.headingMomentum = 50
            self.curHeading -= self.headingMomentum * dt
            arrowUpdate = True
            arrowRotating = True
        else:
            self.headingMomentum = 0
        if arrowUpdate:
            self.normalizeHeadingAndForce()
            self.updateLocalForceArrow()
        if arrowRotating:
            if not self.arrowRotateSound.status() == self.arrowRotateSound.PLAYING:
                base.playSfx(self.arrowRotateSound, looping=True)
        else:
            self.arrowRotateSound.stop()
        if arrowUp:
            if not self.arrowUpSound.status() == self.arrowUpSound.PLAYING:
                base.playSfx(self.arrowUpSound, looping=False)
        else:
            self.arrowUpSound.stop()
        if arrowDown:
            if not self.arrowDownSound.status() == self.arrowDownSound.PLAYING:
                base.playSfx(self.arrowDownSound, looping=False)
        else:
            self.arrowDownSound.stop()
        return task.cont

    def normalizeHeadingAndForce(self):
        if self.curForce > self.MaxLocalForce:
            self.curForce = self.MaxLocalForce
        if self.curForce < 0.01:
            self.curForce = 0.01

    def setTireInputs(self, tireInputs):
        if not self.hasLocalToon:
            return
        self.allTireInputs = tireInputs
        self.gameFSM.request("moveTires")

    def enableAllTireBodies(self):
        for avId in self.tireDict.keys():
            self.tireDict[avId]["tireBody"].enable()

    def disableAllTireBodies(self):
        for avId in self.tireDict.keys():
            self.tireDict[avId]["tireBody"].disable()

    def areAllTiresDisabled(self):
        for avId in self.tireDict.keys():
            if self.tireDict[avId]["tireBody"].isEnabled():
                return False

        return True

    def __moveTiresTask(self, task):
        if self.areAllTiresDisabled():
            self.sendTirePositions()
            self.gameFSM.request("synch")
            return task.done
        return task.cont

    def sendTirePositions(self):
        tirePositions = []
        for index in xrange(len(self.avIdList)):
            avId = self.avIdList[index]
            tire = self.getTireBody(avId)
            pos = Point3(tire.getPosition())
            tirePositions.append([pos[0], pos[1], pos[2]])

        for index in xrange(len(self.avIdList), 4):
            avId = -index
            tire = self.getTireBody(avId)
            pos = Point3(tire.getPosition())
            tirePositions.append([pos[0], pos[1], pos[2]])

        self.sendUpdate("endingPositions", [tirePositions])

    def setFinalPositions(self, finalPos):
        if not self.hasLocalToon:
            return
        for index in xrange(len(self.avIdList)):
            avId = self.avIdList[index]
            tire = self.getTireBody(avId)
            np = self.getTireNp(avId)
            pos = finalPos[index]
            tire.setPosition(pos[0], pos[1], pos[2])
            np.setPos(pos[0], pos[1], pos[2])

        for index in xrange(len(self.avIdList), 4):
            avId = -index
            tire = self.getTireBody(avId)
            np = self.getTireNp(avId)
            pos = finalPos[index]
            tire.setPosition(pos[0], pos[1], pos[2])
            np.setPos(pos[0], pos[1], pos[2])

    def updateInfoLabel(self):
        self.infoLabel["text"] = TTLocalizer.IceGameInfo % {
            "curMatch": self.curMatch + 1,
            "numMatch": IceGameGlobals.NumMatches,
            "curRound": self.curRound + 1,
            "numRound": IceGameGlobals.NumRounds,
        }

    def setMatchAndRound(self, match, round):
        if not self.hasLocalToon:
            return
        self.curMatch = match
        self.curRound = round
        self.updateInfoLabel()

    def setScores(self, match, round, scores):
        if not self.hasLocalToon:
            return
        self.newMatch = match
        self.newRound = round
        self.newScores = scores

    def setNewState(self, state):
        if not self.hasLocalToon:
            return
        self.notify.debug("setNewState gameFSM=%s newState=%s" % (self.gameFSM, state))
        self.gameFSM.request(state)

    def putAllTiresInStartingPositions(self):
        for index in xrange(len(self.avIdList)):
            avId = self.avIdList[index]
            np = self.tireDict[avId]["tireNodePath"]
            np.setPos(IceGameGlobals.StartingPositions[index])
            self.notify.debug("avId=%s newPos=%s" % (avId, np.getPos))
            np.setHpr(0, 0, 0)
            quat = np.getQuat()
            body = self.tireDict[avId]["tireBody"]
            body.setPosition(IceGameGlobals.StartingPositions[index])
            body.setQuaternion(quat)

        for index in xrange(len(self.avIdList), 4):
            avId = -index
            np = self.tireDict[avId]["tireNodePath"]
            np.setPos(IceGameGlobals.StartingPositions[index])
            self.notify.debug("avId=%s newPos=%s" % (avId, np.getPos))
            np.setHpr(0, 0, 0)
            quat = np.getQuat()
            body = self.tireDict[avId]["tireBody"]
            body.setPosition(IceGameGlobals.StartingPositions[index])
            body.setQuaternion(quat)

    def b_setForceArrowInfo(self, avId, force, heading):
        self.setForceArrowInfo(avId, force, heading)
        self.d_setForceArrowInfo(avId, force, heading)

    def d_setForceArrowInfo(self, avId, force, heading):
        sendIt = False
        curTime = self.getCurrentGameTime()
        if self.sendForceArrowUpdateAsap:
            sendIt = True
        elif curTime - self.lastForceArrowUpdateTime > 0.2:
            sendIt = True
        if sendIt:
            self.sendUpdate("setForceArrowInfo", [avId, force, heading])
            self.sendForceArrowUpdateAsap = False
            self.lastForceArrowUpdateTime = self.getCurrentGameTime()

    def setForceArrowInfo(self, avId, force, heading):
        if not self.hasLocalToon:
            return
        self.updateForceArrow(avId, force, heading)

    def setupStartOfMatch(self):
        self.putAllTiresInStartingPositions()
        szId = self.getSafezoneId()
        self.numTreasures = IceGameGlobals.NumTreasures[szId]
        if self.treasures:
            for treasure in self.treasures:
                treasure.destroy()

            self.treasures = []
        index = 0
        treasureMargin = IceGameGlobals.TireRadius + 1.0
        while len(self.treasures) < self.numTreasures:
            xPos = self.randomNumGen.randrange(IceGameGlobals.MinWall[0] + 5, IceGameGlobals.MaxWall[0] - 5)
            yPos = self.randomNumGen.randrange(IceGameGlobals.MinWall[1] + 5, IceGameGlobals.MaxWall[1] - 5)
            self.notify.debug("yPos=%s" % yPos)
            pos = Point3(xPos, yPos, IceGameGlobals.TireRadius)
            newTreasure = IceTreasure.IceTreasure(self.treasureModel, pos, index, self.doId, penalty=False)
            goodSpot = True
            for obstacle in self.obstacles:
                if newTreasure.nodePath.getDistance(obstacle) < treasureMargin:
                    goodSpot = False
                    break

            if goodSpot:
                for treasure in self.treasures:
                    if newTreasure.nodePath.getDistance(treasure.nodePath) < treasureMargin:
                        goodSpot = False
                        break

            if goodSpot:
                self.treasures.append(newTreasure)
                index += 1
            else:
                newTreasure.destroy()

        self.numPenalties = IceGameGlobals.NumPenalties[szId]
        if self.penalties:
            for penalty in self.penalties:
                penalty.destroy()

            self.penalties = []
        index = 0
        while len(self.penalties) < self.numPenalties:
            xPos = self.randomNumGen.randrange(IceGameGlobals.MinWall[0] + 5, IceGameGlobals.MaxWall[0] - 5)
            yPos = self.randomNumGen.randrange(IceGameGlobals.MinWall[1] + 5, IceGameGlobals.MaxWall[1] - 5)
            self.notify.debug("yPos=%s" % yPos)
            pos = Point3(xPos, yPos, IceGameGlobals.TireRadius)
            newPenalty = IceTreasure.IceTreasure(self.penaltyModel, pos, index, self.doId, penalty=True)
            goodSpot = True
            for obstacle in self.obstacles:
                if newPenalty.nodePath.getDistance(obstacle) < treasureMargin:
                    goodSpot = False
                    break

            if goodSpot:
                for treasure in self.treasures:
                    if newPenalty.nodePath.getDistance(treasure.nodePath) < treasureMargin:
                        goodSpot = False
                        break

            if goodSpot:
                for penalty in self.penalties:
                    if newPenalty.nodePath.getDistance(penalty.nodePath) < treasureMargin:
                        goodSpot = False
                        break

            if goodSpot:
                self.penalties.append(newPenalty)
                index += 1
            else:
                newPenalty.destroy()

    def toonHitSomething(self, entry):
        self.notify.debug("---- treasure Enter ---- ")
        self.notify.debug("%s" % entry)
        name = entry.getIntoNodePath().getName()
        parts = name.split("-")
        if len(parts) < 3:
            self.notify.debug("collided with %s, but returning" % name)
            return
        if not int(parts[1]) == self.doId:
            self.notify.debug("collided with %s, but doId doesn't match" % name)
            return
        treasureNum = int(parts[2])
        if "penalty" in parts[0]:
            self.__penaltyGrabbed(treasureNum)
        else:
            self.__treasureGrabbed(treasureNum)

    def __treasureGrabbed(self, treasureNum):
        self.treasures[treasureNum].showGrab()
        self.treasureGrabSound.play()
        self.sendUpdate("claimTreasure", [treasureNum])

    def setTreasureGrabbed(self, avId, treasureNum):
        if not self.hasLocalToon:
            return
        self.notify.debug("treasure %s grabbed by %s" % (treasureNum, avId))
        if avId != self.localAvId:
            self.treasures[treasureNum].showGrab()
        i = self.avIdList.index(avId)
        self.scores[i] += 1
        self.scorePanels[i].setScore(self.scores[i])

    def __penaltyGrabbed(self, penaltyNum):
        self.penalties[penaltyNum].showGrab()
        self.sendUpdate("claimPenalty", [penaltyNum])

    def setPenaltyGrabbed(self, avId, penaltyNum):
        if not self.hasLocalToon:
            return
        self.notify.debug("penalty %s grabbed by %s" % (penaltyNum, avId))
        if avId != self.localAvId:
            self.penalties[penaltyNum].showGrab()
        i = self.avIdList.index(avId)
        self.scores[i] -= 1
        self.scorePanels[i].setScore(self.scores[i])

    def postStep(self):
        DistributedIceWorld.DistributedIceWorld.postStep(self)
        if not self.colCount:
            return
        for count in xrange(self.colCount):
            c0, c1 = self.getOrderedContacts(count)
            if c1 in self.tireCollideIds:
                tireIndex = self.tireCollideIds.index(c1)
                if c0 in self.tireCollideIds:
                    self.tireSounds[tireIndex]["tireHit"].play()
                elif c0 == self.wallCollideId:
                    self.tireSounds[tireIndex]["wallHit"].play()
                elif c0 == self.obstacleCollideId:
                    self.tireSounds[tireIndex]["obstacleHit"].play()

    def forceLocalToonToTire(self):
        toon = localAvatar
        if toon and self.localAvId in self.tireDict:
            tireNp = self.tireDict[self.localAvId]["tireNodePath"]
            toon.reparentTo(tireNp)
            toon.setPosHpr(0, 0, 0, 0, 0, 0)
            toon.setY(1.0)
            toon.setZ(-3)
示例#4
0
      snipstuff.info_message("You clicked '%s'!"%pickingEnabledOject.getName())

    if status == 'up':
      pickingEnabledOject.setScale(1.0)

#** This is a task function called each frame, where the collision ray position is syncronized with the mouse pointer position
def rayupdate(task):
  if base.mouseWatcherNode.hasMouse():
    mpos=base.mouseWatcherNode.getMouse()
    # this function will set our ray to shoot from the actual camera lenses off the 3d scene, passing by the mouse pointer position, making  magically hit what is pointed by it in the 3d space
    pickerRay.setFromLens(base.camNode, mpos.getX(),mpos.getY())
  return task.cont

#** Now the tricky part: we have here a particular kind of pattern that react firing a task event when a collider, tagged as 'rays', whatever the value is stored into, hit an object tagged as 'balls', no matter what value is stored into its tag. The resulting event strings sent to the panda3D event manager will be the result of the FROM collider (ray) and the tag value owned by the INTO object being hit (a ball), provided that was settled with a tag key 'balls'.
# That said, these two lines will catch all the events for either smiles and frowneys because we both tagged 'em as 'balls', for all IN events...
collisionHandler.addInPattern("%(rays)ft-into-%(balls)it")
# ...and here for the OUT events
collisionHandler.addOutPattern("%(rays)ft-out-%(balls)it")

#** To complicate things a little, this time we'll going to use the addAgainPattern method, that will raise an event while the mouse ponter is keeping over a ball of any group. Note that the 'ray_again_all' chunk will be used by the CollisionHandlerEvent to fire the event. See the related accept below.
collisionHandler.addAgainPattern(
  "ray_again_all%(""rays"")fh%(""balls"")ih"
)
""" Note that we could have been done the same using this form as well:

collisionHandler.addAgainPattern("%(rays)ft-again-%(balls)it")

but then we should have used 2 accepts like this:

DO.accept('ray1-again-smileys', collideAgainBalls)
DO.accept('ray1-again-frowney', collideAgainBalls)
class CogdoFlyingCollisions(GravityWalker):
    wantFloorSphere = 0

    def __init__(self):
        GravityWalker.__init__(self, gravity=0.0)

    def initializeCollisions(self, collisionTraverser, avatarNodePath, avatarRadius = 1.4, floorOffset = 1.0, reach = 1.0):
        self.cHeadSphereNodePath = None
        self.cFloorEventSphereNodePath = None
        self.setupHeadSphere(avatarNodePath)
        self.setupFloorEventSphere(avatarNodePath, ToontownGlobals.FloorEventBitmask, avatarRadius)
        GravityWalker.initializeCollisions(self, collisionTraverser, avatarNodePath, avatarRadius, floorOffset, reach)

    def setupWallSphere(self, bitmask, avatarRadius):
        self.avatarRadius = avatarRadius
        cSphere = CollisionSphere(0.0, 0.0, self.avatarRadius + 0.75, self.avatarRadius)
        cSphereNode = CollisionNode('Flyer.cWallSphereNode')
        cSphereNode.addSolid(cSphere)
        cSphereNodePath = self.avatarNodePath.attachNewNode(cSphereNode)
        cSphereNode.setFromCollideMask(bitmask)
        cSphereNode.setIntoCollideMask(BitMask32.allOff())
        if config.GetBool('want-fluid-pusher', 0):
            self.pusher = CollisionHandlerFluidPusher()
        else:
            self.pusher = CollisionHandlerPusher()
        self.pusher.addCollider(cSphereNodePath, self.avatarNodePath)
        self.cWallSphereNodePath = cSphereNodePath

    def setupEventSphere(self, bitmask, avatarRadius):
        self.avatarRadius = avatarRadius
        cSphere = CollisionSphere(0.0, 0.0, self.avatarRadius + 0.75, self.avatarRadius * 1.04)
        cSphere.setTangible(0)
        cSphereNode = CollisionNode('Flyer.cEventSphereNode')
        cSphereNode.addSolid(cSphere)
        cSphereNodePath = self.avatarNodePath.attachNewNode(cSphereNode)
        cSphereNode.setFromCollideMask(bitmask)
        cSphereNode.setIntoCollideMask(BitMask32.allOff())
        self.event = CollisionHandlerEvent()
        self.event.addInPattern('enter%in')
        self.event.addOutPattern('exit%in')
        self.cEventSphereNodePath = cSphereNodePath

    def setupRay(self, bitmask, floorOffset, reach):
        cRay = CollisionRay(0.0, 0.0, 3.0, 0.0, 0.0, -1.0)
        cRayNode = CollisionNode('Flyer.cRayNode')
        cRayNode.addSolid(cRay)
        self.cRayNodePath = self.avatarNodePath.attachNewNode(cRayNode)
        cRayNode.setFromCollideMask(bitmask)
        cRayNode.setIntoCollideMask(BitMask32.allOff())
        self.lifter = CollisionHandlerGravity()
        self.lifter.setLegacyMode(self._legacyLifter)
        self.lifter.setGravity(self.getGravity(0))
        self.lifter.addInPattern('%fn-enter-%in')
        self.lifter.addAgainPattern('%fn-again-%in')
        self.lifter.addOutPattern('%fn-exit-%in')
        self.lifter.setOffset(floorOffset)
        self.lifter.setReach(reach)
        self.lifter.addCollider(self.cRayNodePath, self.avatarNodePath)

    def setupHeadSphere(self, avatarNodePath):
        collSphere = CollisionSphere(0, 0, 0, 1)
        collSphere.setTangible(1)
        collNode = CollisionNode('Flyer.cHeadCollSphere')
        collNode.setFromCollideMask(ToontownGlobals.CeilingBitmask)
        collNode.setIntoCollideMask(BitMask32.allOff())
        collNode.addSolid(collSphere)
        self.cHeadSphereNodePath = avatarNodePath.attachNewNode(collNode)
        self.cHeadSphereNodePath.setZ(base.localAvatar.getHeight() + 1.0)
        self.headCollisionEvent = CollisionHandlerEvent()
        self.headCollisionEvent.addInPattern('%fn-enter-%in')
        self.headCollisionEvent.addOutPattern('%fn-exit-%in')
        base.cTrav.addCollider(self.cHeadSphereNodePath, self.headCollisionEvent)

    def setupFloorEventSphere(self, avatarNodePath, bitmask, avatarRadius):
        cSphere = CollisionSphere(0.0, 0.0, 0.0, 0.75)
        cSphereNode = CollisionNode('Flyer.cFloorEventSphere')
        cSphereNode.addSolid(cSphere)
        cSphereNodePath = avatarNodePath.attachNewNode(cSphereNode)
        cSphereNode.setFromCollideMask(bitmask)
        cSphereNode.setIntoCollideMask(BitMask32.allOff())
        self.floorCollisionEvent = CollisionHandlerEvent()
        self.floorCollisionEvent.addInPattern('%fn-enter-%in')
        self.floorCollisionEvent.addAgainPattern('%fn-again-%in')
        self.floorCollisionEvent.addOutPattern('%fn-exit-%in')
        base.cTrav.addCollider(cSphereNodePath, self.floorCollisionEvent)
        self.cFloorEventSphereNodePath = cSphereNodePath

    def deleteCollisions(self):
        GravityWalker.deleteCollisions(self)
        if self.cHeadSphereNodePath != None:
            base.cTrav.removeCollider(self.cHeadSphereNodePath)
            self.cHeadSphereNodePath.detachNode()
            self.cHeadSphereNodePath = None
            self.headCollisionsEvent = None
        if self.cFloorEventSphereNodePath != None:
            base.cTrav.removeCollider(self.cFloorEventSphereNodePath)
            self.cFloorEventSphereNodePath.detachNode()
            self.cFloorEventSphereNodePath = None
            self.floorCollisionEvent = None
        self.cRayNodePath.detachNode()
        del self.cRayNodePath
        self.cEventSphereNodePath.detachNode()
        del self.cEventSphereNodePath

    def setCollisionsActive(self, active = 1):
        if self.collisionsActive != active:
            if self.cHeadSphereNodePath != None:
                base.cTrav.removeCollider(self.cHeadSphereNodePath)
                if active:
                    base.cTrav.addCollider(self.cHeadSphereNodePath, self.headCollisionEvent)
            if self.cFloorEventSphereNodePath != None:
                base.cTrav.removeCollider(self.cFloorEventSphereNodePath)
                if active:
                    base.cTrav.addCollider(self.cFloorEventSphereNodePath, self.floorCollisionEvent)
        GravityWalker.setCollisionsActive(self, active)

    def enableAvatarControls(self):
        pass

    def disableAvatarControls(self):
        pass

    def handleAvatarControls(self, task):
        pass
class StrategyGame(ShowBase):
    def __init__(self):
        ShowBase.__init__(self)

        self.camera_control()



        self.REGION_MAP = "maps/italy_provs.png"
        self.TEXTURE_MAP = "maps/italy_terrain2.png"
        self.WORLD_MAP = "maps/italy_map.xml"
        self.SCENARIO_MAP = "scenarios/italy_scen.xml"

        self.terrainScale = 1 # Currently Broken

        self.keyboard_setup()

        self.drawTerrain()



        self.xml_load_map(self.WORLD_MAP,"WorldMap")
        self.xml_load_map(self.SCENARIO_MAP,"Scenario")
        self.init_collisions()
        self.pickingEnabledObject = None

        self.taskMgr.add(self.camera_update, "UpdateCameraTask")

        self.generate_models()
        self.txtBox = OnscreenText("<No province>")
        self.setup_collision_calcs()
        taskMgr.add(self.rayUpdate, "updatePicker")
        taskMgr.doMethodLater(0.2,self.task_calendar, "calendar")
        self.init_variables()
        self.interface()

    def init_variables(self):
        self.armies = [[],[]]
        for n in range(len(self.nations)):
            self.armies.append(n)
        self.target = 0
        self.army_count = 0
        self.selected_prov = -1
        self.months = ["January","February","March","April","May","June",
                       "July","August","September","October","November","December"]
        self.adce = "AD"
        self.player = 1
        self.money_inc = 0
        for p in range(len(self.provs)):
            if self.provs_owner[p] == self.player:
                self.money_inc += self.provs_money[p]
        self.men_inc = 0
        for p in range(len(self.provs)):
            if self.provs_owner[p] == self.player:
                self.men_inc += self.provs_men[p]

    def draw_card(self,x,y,width,height,colour):

        cm = CardMaker("CardMaker")
        cm.setFrame(x, x+width,y+height, y)
        card = render2d.attachNewNode(cm.generate())
        card.setColor(colour)
        return (card)

    def interface(self):
        self.interface_back = self.draw_card(-0.8,-1,1.6,0.4,(100,100,100,100))

        self.txt_name = OnscreenText(text = "", pos = (-0.8,-0.7,-0.8))
        self.txt_money = OnscreenText(text = "", pos = (-0.8,-0.8,-0.8))
        self.txt_men = OnscreenText(text = "", pos = (-0.8,-0.9,-0.8))
        self.txt_nation = OnscreenText(text = self.nations[self.player-1], pos = (-1.2,0.9,-0.8))
        self.txt_nation_money = OnscreenText(text = "Coin: " + str(self.nations_money[self.player-1])+" +"+str(self.money_inc), pos = (-0.4,0.9,-0.8))
        self.txt_nation_men = OnscreenText(text = "Manpower: " + str(self.nations_men[self.player-1])+" +"+str(self.men_inc), pos = (0.4,0.9,-0.8))
        self.txt_date = OnscreenText(text = str(self.day)+" of "+self.months[self.month-1]+" "+str(self.year)+self.adce, pos = (-1.0,0.8,-0.8))

    def task_calendar(self,task):
        #task.delayTime = 5
        if (self.month == 1 or self.month == 3 or self.month == 5 or
            self.month == 7 or self.month == 8 or self.month == 10 or self.month == 12):
                if self.day == 31 and self.month == 12:
                    self.day = 1
                    self.month = 1
                    self.year += 1
                elif self.day == 31:
                    self.day = 1
                    self.month += 1
                else:
                    self.day += 1
        elif (self.month == 4 or self.month == 6 or self.month == 9 or self.month == 11):
            if self.day == 30:
                self.day = 1
                self.month += 1
            else:
                self.day += 1
        elif (self.month == 2):
#            if isleap:
#                print self.year/4
#                print "LEAP YEAR"
#                if self.day == 29:
#                    self.day = 1
#                    self.month = 3
#                else:
#                    self.day += 1
#            else:
            print "IS NOT A LEAP YEAR"
            if self.day == 28:
                self.day = 1
                self.month = 3
            else:
                self.day += 1
        self.daypass()
        return Task.again

    def daypass(self):
        self.nations_money[self.player-1] += self.money_inc
        self.nations_men[self.player-1] += self.men_inc
        self.update_interface()

    def update_interface(self):
        self.txt_date.setText(str(self.day)+" of "+self.months[self.month-1]+" "+str(self.year)+self.adce)
        self.txt_nation_money.setText("Coin: " + str(self.nations_money[self.player-1])+" +"+str(self.money_inc))
        self.txt_nation_men.setText("Manpower: " + str(self.nations_men[self.player-1])+" +"+str(self.men_inc))
        if self.selected_prov != -1:
            self.txt_name.setText("Province: "+self.provs[self.selected_prov])
            self.txt_money.setText("Income: "+str(self.provs_money[self.selected_prov]))
            self.txt_men.setText("Manpower: "+str(self.provs_men[self.selected_prov]))
            self.interface_back.setColor(self.format_colour_tuple(self.nations_rgb[self.provs_owner[self.selected_prov]-1]))
        else:
            self.txt_name.setText("")
            self.txt_money.setText("")
            self.txt_men.setText("")
            self.interface_back.setColor((255,255,255,255))

    def army_create(self):
        id = self.army_count+1
        army = self.loader.loadModel("models/man.x")
        self.armies[0].append(id)
        army.reparentTo(self.render)
        army.setName(str(id))
        army.setScale(1, 1, 1)
        x = 50
        y = 50
        target = self.target
        target_x = float(self.provs_x[target])
        target_y = 257-float(self.provs_y[target])
        target_z = float(self.getObjectZ(target_x,target_y)-1)
        oArmyCol = army.attachNewNode(CollisionNode("BuildingCNode%d"%id))
        oArmyCol.setScale((2,2,2))
        oArmyCol.node().addSolid(CollisionSphere(0,0,0,1))
        oArmyCol.setTag("unit","army")
        oArmyCol.show()
        point1 = Point3(x,y,0)
        point2 = Point3(target_x,target_y,target_z)
        distance = (point1.getXy() - point2.getXy()).length()
        myInterval = army.posInterval(distance/10, Point3(target_x,target_y, target_z))
        mySequence = Sequence(myInterval)
        mySequence.start()
        army.setPos(x, y, self.getObjectZ(x,y)-1)
        army.setTag("target",str(target))
        self.army_count += 1
        if (self.target<len(self.provs)-1):
            self.target += 1
        else:
            self.target = 0
        #taskMgr.add()

    def army_update(self,id):
        point1 = self.armies[0][id-1].getPos()
        point2 = Point3(target_x,target_y,target_z)
        distance = (point1.getXy() - point2.getXy()).length()

    def init_collisions(self):
        base.cTrav = CollisionTraverser()
        self.cHandler = CollisionHandlerEvent()

        pickerNode = CollisionNode("mouseRayNode")
        pickerNPos = base.camera.attachNewNode(pickerNode)
        self.pickerRay = CollisionRay()
        pickerNode.addSolid(self.pickerRay)

        pickerNode.setTag("rays","ray1")
        base.cTrav.addCollider(pickerNPos, self.cHandler)

    def setup_collision_calcs(self):
        self.cHandler.addInPattern("%(rays)ft-into-%(prov)it")
        self.cHandler.addOutPattern("%(rays)ft-out-%(prov)it")

        self.cHandler.addAgainPattern("ray_again_all%(""rays"")fh%(""prov"")ih")

        self.DO=DirectObject()

        self.DO.accept('ray1-into-city', self.collideInBuilding)
        self.DO.accept('ray1-out-city', self.collideOutBuilding)

        self.DO.accept('ray_again_all', self.collideAgainstBuilds)

        self.pickingEnabledOject=None

        self.DO.accept('mouse1', self.mouseClick, ["down"])
        self.DO.accept('mouse1-up', self.mouseClick, ["up"])

    def camera_control(self):
        base.disableMouse()

        self.camera = base.camera

        self.cam_speed = 3
        self.cam_drag = 0.01

        self.cam_x_moving = False
        self.cam_y_moving = False
        self.cam_z_moving = False

        self.cam_x_inc = 0
        self.cam_y_inc = 0
        self.cam_z_inc = 0

        self.cameraDistance = -50
        self.camHeight = 25


        self.camXAngle = 0
        self.camYAngle = -25
        self.camZAngle = 0

        self.camX = 0
        self.camY = 0
        self.camZ = 100

    def camera_update(self,task):

        if self.cam_x_moving:
            self.camX+=self.cam_x_inc
        elif self.cam_x_inc != 0:
            if (self.cam_x_inc > 0 and self.cam_x_inc-self.cam_drag <= 0) or (self.cam_x_inc < 0 and self.cam_x_inc+self.cam_drag >= 0):
                self.cam_x_inc = 0
            elif self.cam_x_inc > 0:
                self.cam_x_inc -= self.cam_drag
            elif self.cam_x_inc < 0:
                self.cam_x_inc -= self.cam_drag
            else:
                print "FUCKUP WITH CAM X INC"

        if self.cam_y_moving:
            self.camY+=self.cam_y_inc
        elif self.cam_y_inc != 0:
            if (self.cam_y_inc > 0 and self.cam_y_inc-self.cam_drag <= 0) or (self.cam_y_inc < 0 and self.cam_y_inc+self.cam_drag >= 0):
                self.cam_y_inc = 0
            elif self.cam_y_inc > 0:
                self.cam_y_inc -= self.cam_drag
            elif self.cam_y_inc < 0:
                self.cam_y_inc -= self.cam_drag
            else:
                print "FUCKUP WITH CAM Y INC"

        if self.cam_z_moving:
            self.camZ+=self.cam_z_inc
        elif self.cam_z_inc != 0:
            if (self.cam_z_inc > 0 and self.cam_z_inc-self.cam_drag <= 0) or (self.cam_z_inc < 0 and self.cam_z_inc+self.cam_drag >= 0):
                self.cam_z_inc = 0
            elif self.cam_z_inc > 0:
                self.cam_z_inc -= self.cam_drag
            elif self.cam_z_inc < 0:
                self.cam_z_inc -= self.cam_drag
            else:
                print "FUCKUP WITH CAM Z INC"

        self.camera.setPos(self.camX, self.camY, self.camZ)
        self.camera.setHpr(self.camXAngle, self.camYAngle, self.camZAngle)

        return Task.cont

    def camera_move(self, status):
        if status == "up":
            self.cam_y_moving = True
            self.cam_y_inc = self.cam_speed
        if status == "down":
            self.cam_y_moving = True
            self.cam_y_inc = -self.cam_speed
        if status == "left":
            self.cam_x_moving = True
            self.cam_x_inc = -self.cam_speed
        if status == "right":
            self.cam_x_moving = True
            self.cam_x_inc = self.cam_speed
        if status == "stopX":
            self.cam_x_moving = False
        if status == "stopY":
            self.cam_y_moving = False

    def keyboard_setup(self):
        self.accept("w", self.keyW)
        self.accept("w-up", self.stop_y)
        self.accept("s", self.keyS)
        self.accept("s-up", self.stop_y)
        self.accept("a", self.keyA)

        self.accept("a-up", self.stop_x)
        self.accept("d", self.keyD)
        self.accept("d-up", self.stop_x)
        self.accept("+", self.ZoomIn)
        self.accept("c", self.createArmy)

    def createArmy(self):
        self.army_create()

    def ZoomIn(self):
        self.camZ -= 1

    def keyW( self ):
        self.camera_move("up")

    def keyS( self ):
        self.camera_move("down")

    def keyA( self ):
        self.camera_move("left")

    def keyD( self ):
        self.camera_move("right")

    def stop_x( self ):
        self.camera_move("stopX")

    def stop_y( self ):
        self.camera_move("stopY")

    def generate_models(self):
        for p in range(len(self.provs)):
            print "Making",self.provs[p]
            city = self.loader.loadModel("models/house2.x")
            city.reparentTo(self.render)
            city.setName(self.provs[p])
            city.setScale(2, 2, 2)
            x = float(self.provs_x[p]*self.terrainScale)
            y = 257*self.terrainScale-float(self.provs_y[p]*self.terrainScale)
            city.setPos(x, y, self.getObjectZ(x,y)-1)
            oCityCol = city.attachNewNode(CollisionNode("BuildingCNode%d"%p))
            oCityCol.setScale((3,3,3))
            oCityCol.node().addSolid(CollisionSphere(0,0,0,1))
            oCityCol.setTag("prov","city")
            city.setTag("id",str(p+1))
            #oCityCol.show()

    def collideInBuilding(self,entry):
        np_into=entry.getIntoNodePath()
        np_into.getParent().setColor(.6,.5,1.0,1)

    def collideOutBuilding(self,entry):

        np_into=entry.getIntoNodePath()
        np_into.getParent().setColor(1.0,1.0,1.0,1)

        self.pickingEnabledObject = None
        self.txtBox.setText("<No province>")

    def collideAgainstBuilds(self,entry):
        if entry.getIntoNodePath().getParent() <> self.pickingEnabledOject:
            np_from=entry.getFromNodePath()
            np_into=entry.getIntoNodePath()

            self.pickingEnabledObject = np_into.getParent()


            self.txtBox.setText(self.pickingEnabledObject.getName())

    def mouseClick(self,status):
        if self.pickingEnabledObject:
            if status == "down":
                self.pickingEnabledObject.setScale(0.95*2)
                print self.pickingEnabledObject.getTag("id"),self.provs[int(self.pickingEnabledObject.getTag("id"))-1]
                self.selected_prov = int(self.pickingEnabledObject.getTag("id"))-1
                self.update_interface()

            if status == "up":
                self.pickingEnabledObject.setScale(1.0*2)
        elif self.pickingEnabledObject == None:
            self.selected_prov = -1
            self.update_interface()

    def rayUpdate(self,task):
        if base.mouseWatcherNode.hasMouse():
            mpos = base.mouseWatcherNode.getMouse()

            self.pickerRay.setFromLens(base.camNode, mpos.getX(),mpos.getY())
        return task.cont

    def getObjectZ(self, x, y):
        if ((x > 0) and (x < 257) and (y > 0) and (y < 257)):
            return(self.terrain.getElevation(x,y)*self.terrainSize)
        else:
            return 0
    def format_colour_tuple(self,colour):
        col = string.split(colour)
        tuple = (int(col[0]),int(col[1]),int(col[2]),255)
        return tuple


    def drawTerrain(self):
        self.terrainSize = 5
        heightmap = "maps/italy_heightmap.png"
        colmap = self.TEXTURE_MAP



        self.terrain = GeoMipTerrain("terrain")
        self.terrain.setHeightfield(heightmap)
        self.terrain.setColorMap(colmap)

        self.terrain.setBlockSize(64)
        #self.terrain.setNear(40)
        #self.terrain.setFar(120)
        #self.terrain.setMinLevel(1)
        self.terrain.setBruteforce(True)

        self.terrain.generate()
        self.terrain.setAutoFlatten(self.terrain.AFMLight)

        self.root = self.terrain.getRoot()
        self.root.reparentTo(render)
        self.root.setSz(self.terrainSize)
        #self.root.setScale(self.terrainScale,self.terrainScale,1)



    def xml_load_map(self,file,type):
        if type == "WorldMap":
            tree = xml.parse(file)
            root = tree.getroot()

            self.provs = []
            self.provs_x = []
            self.provs_y = []
            self.provs_rgb = []
            self.provs_owner = []
            self.provs_money = []
            self.provs_men = []

            counter = 1
            for p in root.findall("province"):
                self.provs.append(self.get_tag(root,"province", counter, "name"))
                self.provs_x.append(self.get_tag(root, "province", counter, "x"))
                self.provs_y.append(self.get_tag(root, "province", counter, "y"))
                self.provs_rgb.append(self.get_tag(root, "province", counter, "rgb"))
                self.provs_owner.append(0)
                self.provs_money.append(0)
                self.provs_men.append(0)
                counter+=1
        elif type == "Scenario":
            tree = xml.parse(file)
            root = tree.getroot()
            self.day = 0
            self.month = 0
            self.year = 0
            self.adce = 0

            self.day = int(root.attrib["day"])
            self.month = int(root.attrib["month"])
            self.year = int(root.attrib["year"])

            self.nations = []
            self.nations_rgb = []
            self.nations_capital = []
            self.nations_money = []
            self.nations_men = []
            self.nations_provs_id = []

            counter = 0
            for p in root.findall("province"):
                print p.attrib["id"]

            for n in root.findall("nation"):
                for p in n.findall("province"):
                    self.provs_owner[int(p.attrib["id"])-1] = int(p.find("owner").text)
                    self.provs_money[int(p.attrib["id"])-1] = int(p.find("money").text)
                    self.provs_men[int(p.attrib["id"])-1] = int(p.find("men").text)
                    print self.provs_owner[int(p.attrib["id"])-1]
                    counter+=1
            counter = 1
            for n in root.findall("nation"):
                self.nations.append(self.get_tag(root, "nation", counter, "name"))
                self.nations_capital.append(n.attrib["capital"])
                #print self.nations_capital
                self.nations_rgb.append(self.get_tag(root, "nation", counter, "rgb"))
                self.nations_money.append(int(self.get_tag(root, "nation", counter, "money")))
                self.nations_men.append(int(self.get_tag(root, "nation", counter, "men")))
                counter += 1

    def get_tag(self,root,str_tag,prov_id, prov_tag):
        prov = root.find('.//'+str_tag+'[@id="'+str(prov_id)+'"]')
        tag = prov.find(prov_tag).text
        return tag
示例#7
0
from pandac.PandaModules import CollisionHandlerEvent, CollisionNode, CollisionTraverser, CollisionRay
from pandaImports import DirectObject
from tower import *


"""This file handles all the collision events 
   of our game
"""
# base.cTrav maintains a list of colliders of all solid objects in the world to check collisions (runs every frame)
base.cTrav = CollisionTraverser()

# collisionHandler specifies what to do when a collision event is detected
collisionHandler = CollisionHandlerEvent()
# "In" event: when there is a collision in the current frame, but it didn't in the previous frame
collisionHandler.addInPattern("%fn-into-%in")
# "Again" event: when there is a collision in the current frame, the same that happened in the previous frame
collisionHandler.addAgainPattern("%fn-again-%in")
# "Out" event: when there isn't a collision in the current frame, but there was in the previous frame
collisionHandler.addOutPattern("%fn-out-%in")

# self.collision3DPoint is the point where the collision occurs
collision3DPoint = [0, 0, 0]

# self.addCollider(mousePicking.pickerNP)
# self.addCollider(player.getTower(-1).troop.troopModel.troopColliderNP)


DO = DirectObject()


def addCollisionEventAgain(fromName, intoName, function, extraArgs=[]):
示例#8
0
class Coin:
    """
	An object that a ball collects.
	"""
    MODEL = "../egg/kolikko.egg"
    collectable = 0

    def __init__(self, model, world, space, pos):
        self.model = model
        self.world = world
        self.space = space
        self.collHandEvent = CollisionHandlerEvent()
        self.collHandEvent.addInPattern('into-%in')
        self.addBox(pos)
        self.isCollected = False
        Coin.collectable += 1

    def collect(self):
        if not self.isCollected:
            self.isCollected = True
            self.box.setColor(1, 0, 0)
            Coin.collectable -= 1

    def onCollide(self, entry):
        body1 = entry.getFromNodePath()
        ballNode = self.model.getBall().getModelNode()
        if ballNode and ballNode == body1.getParent():
            self.collect()

    def addBox(self, pos):
        lx, ly, lz = 1, 1, 1  # dimension
        px, py, pz = pos  # position
        name = "box" + str(pos)
        self.box = loader.loadModel(self.MODEL)
        self.box.setPos(-0.5, -0.5, -0.5)
        self.box.flattenLight()  # ApplyTransform
        self.box.reparentTo(render)

        # Make sure its center is at 0, 0, 0 like OdeBoxGeom
        self.box.setPos(px - lx / 2, py - ly / 2, pz - lz / 2)
        self.box.setScale(lx, ly, lz)
        self.box.setHpr(0, 50, 0)

        # Offset z by -1.0 because the coin model was so small
        cSphere = CollisionSphere(pos[0], pos[1], pos[2] - 1.0, 1)
        cNode = CollisionNode(name)
        cNode.addSolid(cSphere)

        model = render.find(name)
        if not model.isEmpty():
            model.removeNode()

        cnodePath = render.attachNewNode(cNode)
        #cnodePath.show()
        base.cTrav.addCollider(cnodePath, self.collHandEvent)
        base.accept('into-' + name, self.onCollide)

        # Implementation below would not allow coins to float?
        # define mass
        """
		mass = OdeMass()
		mass.setBox(500, lx, ly, lz)
		
		self.boxBody = OdeBody( self.world )
		self.boxBody.setPosition( self.box.getPos(render) )
		self.boxBody.setQuaternion( self.box.getQuat(render) )
		self.boxBody.setMass( mass )
		
		self.geom = OdeBoxGeom( self.space, lx, ly, lz)
		self.space.setSurfaceType( self.geom, SurfaceType.COIN )
		self.geom.setBody( self.boxBody )
		self.boxBody = None
		"""

    def updateModelNode(self):
        return None
        #None
        #self.box.setPos( render, self.boxBody.getPosition() )
        #self.box.setQuat(render, Quat(self.boxBody.getQuaternion() ) )

    def getBody(self):
        return None
        #return self.boxBody

    def removeNode(self):
        if not self.isCollected:
            Coin.collectable -= 1
        # http://www.panda3d.org/apiref.php?page=NodePath#removeNode
        self.box.removeNode()
示例#9
0
文件: game.py 项目: H3LLB0Y/Centipede
class Game(DirectObject.DirectObject):
	def __init__(self, showbase, usersData, gameData):
		self.showbase = showbase
		self.usersData = usersData
		self.gameData = gameData
		
		random.seed(self.gameData.randSeed)
		
		# Initialize the collision traverser.
		self.cTrav = CollisionTraverser()
		
		# Initialize the handler.
		self.collHandEvent = CollisionHandlerEvent()
		self.collHandEvent.addInPattern('into-%in')
		
		self.world = World(showbase)
		
		for user in self.usersData:
			user.centipede = Centipede(showbase, len(self.usersData), self.addToCollisions)
			if user.thisPlayer:
				self.centipede = user.centipede
				self.centipede.attachRing(showbase)
		
		self.foods = []
		for i in range(self.gameData.maxFoods):
			self.foods.append(Food(self.showbase, i, self.addToCollisions))
		
		self.ticks = 0

	def destroy(self):
		self.world.destroy()
		for user in self.usersData:
			user.centipede.destroy()
		for food in self.foods:
			food.destroy()
		
	def runTick(self, dt):
		# run each of the centipedes simulations
		for user in self.usersData:
			user.centipede.update(dt)
			if len(user.centipede.body) > 10:
				return False
		
		for food in self.foods:
			food.update(dt)
		
		self.cTrav.traverse(self.showbase.render)
		
		self.ticks += 1
		
		# Return true if game is still not over (false to end game)
		return True

	def collideInto(self, collEntry):
		for user in self.usersData:
			if collEntry.getFromNodePath() == user.centipede.head.collisionNode[0]:
				for food in self.foods:
					if collEntry.getIntoNodePath() == food.model.collisionNode[0]:
						user.centipede.addLength(self.showbase)
						food.reset()
				if len(user.centipede.body) > 2:
					if collEntry.getIntoNodePath() == user.centipede.tail.collisionNode[0]:
						user.centipede.reset()
					for i in range(len(user.centipede.body) - 1 - 2):
						if collEntry.getIntoNodePath() == user.centipede.body[i + 2].collisionNode[0]:
							user.centipede.reset()
							break
	
	def addToCollisions(self, item):
		# Add this object to the traverser.
		self.cTrav.addCollider(item[0], self.collHandEvent)

		# Accept the events sent by the collisions.
		self.accept('into-' + str(item[1]), self.collideInto)
示例#10
0
snipstuff.info_show()

base.disableMouse()

# =========================================================================
# Main
"""
While the principles are almost the same for 3D space, picking in 2D require a little change to adapt to the 2D layer, it's aspect and camera view (that is called orthographic).
"""
# =========================================================================

# ** First big difference: as you may know, we used so far to assign the collision traverser to the global Showbase member cTrav, that is automatically updated (traversed) but it operates under the render nodepath that we know works in the 3D space and thewrefore we'll store the traverser apart in a convenient variable to be manually traversed later by our routine and act in 2d space.
customCtrav = CollisionTraverser()
collisionHandler = CollisionHandlerEvent()
# to keep the stuff simple, we specify fixed pattern strings to just check the into and out of all our colliders, because we know they are just cards and the ray FROM collider
collisionHandler.addInPattern("ray-into-cards")
collisionHandler.addOutPattern("ray-out-cards")

PICKING_MASK = BitMask32.bit(1)

# ** Setting the ray collider
pickerNode = CollisionNode("mouseraycnode")
# another important but obvious difference from step 6 is that this time we parent the ray nodepath in render2d instead render root nodepath, otherwise all the objects we're going to define in 2D won't be seen by the ray.
pickerNP = base.render2d.attachNewNode(pickerNode)
pickerNP.show()
# note that this time we set the ray dimension along the Y axis 2 point long to pierce everything is on the Y=0 position (2D objects are usually placed there)
pickerRay = CollisionRay(0, -1, 0, 0, 1, 0)
pickerNode.addSolid(pickerRay)
pickerNode.setFromCollideMask(PICKING_MASK)
pickerNode.setIntoCollideMask(BitMask32.allOff())
# ** put the ray into the traverse cycle
示例#11
0
class Level2World(object):
	
	def __init__(self, render, loader, theBase, world, hopper):
		self.render = render
		self.loader = loader
		base = theBase
		self.world = world
		self.hopper = hopper

		base.disableMouse()

		#----- Play Music -----
		self.backgroundMusic = base.loader.loadSfx("sounds/deathDanceMusic.mp3")
		self.backgroundMusic.play()
		self.failSound = base.loader.loadSfx("sounds/fail.wav")

		#------ State Variables -----
		self.isLit = False

		#----- Setup Visible World -----
		self.platforms = []
		self.spinningPlatforms = []
		self.spinners = []
		self.berries = []
		self.coins = []
		self.enemies = []

		self.setupPlatforms()		
		self.setupCoins()
		self.setupBerries()
		self.setupEnemies()

		self.endToken = Coin(self.render, self.world, self.hopper, 0, 0.6, 0.6, Vec3(0, 0, 1))
		self.endToken.coinNP.reparentTo(self.platforms[-1].platformBulletNode)
		
		self.wizardLair = WizardLair(self.render, self.world, self.loader, self.hopper)
		self.wizardLair.wizardGate.reparentTo(self.platforms[1].platformBulletNode)	
		self.wizardLair.castle.reparentTo(self.platforms[6].platformBulletNode)
		self.wizardLair.lair.reparentTo(self.platforms[11].platformBulletNode)

		self.sky = loader.loadModel("models/art/cat-skies/alice-skies--celestial/celestial.egg")
		self.sky.setPos(0, 0, 0)
		self.sky.setP(90)
		self.sky.setScale(1)
		self.sky.reparentTo(self.render)

		#----- Setup Light -----
		self.directionalLight2 = DirectionalLight( "directionalLight" )
		self.directionalLight2.setColor( Vec4( 1, 1, 1, 1 ) )
		self.directionalLight2.setDirection(Vec3(0, 0, -1))
		self.directionalLightNP = self.render.attachNewNode(self.directionalLight2)
		
		#----- Collision Handling -----
		base.cTrav = CollisionTraverser()
		self.collisionHandler = CollisionHandlerEvent()

		self.pickerNode = CollisionNode('mouseRayCollisionNode')
		self.pickerNP = base.camera.attachNewNode(self.pickerNode)
		self.pickerRay = CollisionRay()
		self.pickerNode.addSolid(self.pickerRay)
		base.cTrav.addCollider(self.pickerNP, self.collisionHandler)
		self.collisionHandler.addInPattern("mouseRayIntoEnemy")
		self.collisionHandler.addOutPattern("mouseRayOutEnemy")
		
		self.pickingEnabledObject = None

	#----- Tasks -----
	def update(self, task):
		self.hopper.processInput()
		for enemy in self.enemies:
			if enemy.getHealth() != 0: enemy.pace()
		dt = globalClock.getDt()
		self.world.doPhysics(dt, 10, 1/180.0)
		return task.cont
	
	def simulateWater(self, task):
		if self.hopper.hopperNP.getZ() < 0:
			self.hopper.freeze = True
			return task.done
		else:
			return task.cont
	
	def rayUpdate(self, task):
		if base.mouseWatcherNode.hasMouse():
			mPos = base.mouseWatcherNode.getMouse()
			self.pickerRay.setFromLens(base.camNode, mPos.getX(), mPos.getY())
		return task.cont

	#----- Setup Enemy Functions -----
	def setupEnemies(self):
		enemy1 = Enemy(self.render, self.world, base, Point3(0, 0, 1), self.hopper, 1)
		enemy1.enemyNP.reparentTo(self.platforms[3].platformBulletNode)
		enemy2 = Enemy(self.render, self.world, base, Point3(0, 0, 1), self.hopper, 2)
		enemy2.enemyNP.reparentTo(self.platforms[4].platformBulletNode)
		self.enemies.append(enemy1)
		self.enemies.append(enemy2)

		#----- Lair Enemies -----
		enemy = Enemy(self.render, self.world, base, Point3(3, 16, 1), self.hopper, 1, strength = 2, size = 1.3)
		enemy.enemyNP.reparentTo(self.platforms[11].platformBulletNode)
		self.enemies.append(enemy)
		enemy = Enemy(self.render, self.world, base, Point3(3, -16, 1), self.hopper, 1, strength = 2, size = 1.3)
		enemy.enemyNP.reparentTo(self.platforms[11].platformBulletNode)
		self.enemies.append(enemy)
		enemy = Enemy(self.render, self.world, base, Point3(13, 3, 1), self.hopper, 1, strength = 2, size = 1.3)
		enemy.enemyNP.reparentTo(self.platforms[11].platformBulletNode)
		self.enemies.append(enemy)
		enemy = Enemy(self.render, self.world, base, Point3(-13, 3, 1), self.hopper, 1, strength = 2, size = 1.3)
		enemy.enemyNP.reparentTo(self.platforms[11].platformBulletNode)
		self.enemies.append(enemy)
		
     	
	def resetEnemies(self):
		for enemy in self.enemies:
			enemy.enemyNP.remove_node()
		self.enemies = []
		self.setupEnemies()
	
	def collideEventIn(self, entry):
		print "Selected enemy!"
		np_from = entry.getFromNodePath()
		np_into = entry.getIntoNodePath()
		np_into.getParent().setColor(.6, 0.5, 1.0, 1)
		self.pickingEnabledObject = np_into

	def collideEventOut(self, entry):
		print "Deselected enemy!"
		self.pickingEnabledObject = None
		np_into = entry.getIntoNodePath()
		np_into.getParent().setColor(1.0, 1.0, 1.0, 1)

	def mousePick(self, status):
		if self.pickingEnabledObject:
			if status == 'down':
				idNum = self.pickingEnabledObject.getTag("id")
				self.enemies[int(idNum)-1].lowerHealth()
			if status == 'up':
				pass

	#----- Setup Item Functions -----	
	def setupPlatforms(self):
		path = "images/wizardFloor.jpg"
		platform = Platform(self.render, self.world, 0, Vec3(10, 7, 0.5), Point3(-2, 3, -1), tex = path) 
		self.platforms.append(platform)
		platform = Platform(self.render, self.world, 0, Vec3(10, 7, 0.5), Point3(-13, 3, -1), tex = path) 
		self.platforms.append(platform)
		platform = Platform(self.render, self.world, 0, Vec3(10, 7, 0.5), Point3(-24, 3, 0), roll = 20, tex = path) 
		self.platforms.append(platform)
		platform = Platform(self.render, self.world, 0, Vec3(10, 7, 0.5), Point3(-38, 3, 3), tex = path)
		self.platforms.append(platform)
		platform = Platform(self.render, self.world, 0, Vec3(10, 7, 0.5), Point3(-50, 3, 4), tex = path)
		self.platforms.append(platform)
		platform = Platform(self.render, self.world, 0, Vec3(10, 7, 0.5), Point3(-62, 3, 5), tex = path)
		self.platforms.append(platform)
		platform = Platform(self.render, self.world, 0, Vec3(30, 30, 0.5), Point3(-72, 3, 6), tex = path)
		self.platforms.append(platform)
	 	
		x = -68; y = 3; z = 5
		
		heading = 0
		for i in range(4):
			platform = Platform(self.render, self.world, heading, Vec3(7, 6, 0.5), Point3(x, y, z), tex = path) 
			self.platforms.append(platform)
			self.spinningPlatforms.append(platform)
			
			x -= 8; z += 1.8

		platform = Platform(self.render, self.world, 0, Vec3(30, 30, 0.5), Point3(x - 40, -15, z), tex = path)
		self.platforms.append(platform)
		
		x -= 40; y = 3
		
		heading = 45
		for i in range(4):
			platform = Platform(self.render, self.world, heading, Vec3(9, 7, 0.5), Point3(x, y, z), tex = path) 
			self.platforms.append(platform)
			
			if i == 0 or i == 2:
				spinner = Spinner(self.render, self.world, 90, 25, Vec3(2.2, 0.3, 1), Point3(x+9, y+7, z+2))
				self.spinners.append(spinner)	

			x -= 10; y -= 10; z += 1.8
		
	def setupCoins(self):
		#----- Castle Coins -----
		x = 3
		for i in range(9):
			coin = Coin(self.render, self.world, self.hopper, 10, 0.35, 0.35, Point3(x, -8, 2))
			coin.coinNP.reparentTo(self.platforms[6].platformBulletNode)
			self.coins.append(coin)
			x -= 2

		#----- Lair Coins -----
		x = 3
		for i in range(8):
			coin = Coin(self.render, self.world, self.hopper, 10, 0.35, 0.35, Point3(x, -12, 2))
			coin.coinNP.reparentTo(self.platforms[11].platformBulletNode)
			self.coins.append(coin)
			x -= 2

		index = 2
		for i in range(4):
			coin = Coin(self.render, self.world, self.hopper, 10, 0.35, 0.35, Point3(0, 0, 2))
			coin.coinNP.reparentTo(self.platforms[index].platformBulletNode)
			self.coins.append(coin)
			index += 4


	def resetCoins(self):
		print "Inside coins; NOT removing a coin but initializing list to 0"
		self.coins = []
		self.setupCoins()

	def setupBerries(self):
		index = 3
		mult = 1
		for i in range(4):
			berry1 = Berry(self.render, self.world, self.hopper, 10*mult, 0.35, 0.35, Point3(0, 0, 2))
			berry1.berryNP.reparentTo(self.platforms[index].platformBulletNode)
			self.berries.append(berry1)
			index += 3
			mult *= -1

			if mult > 0:
				mult *= 2
			else:
				mult /= 2
	
	def resetBerries(self):
		self.berries = []
		self.setupBerries()
	
	#----- Light Functions -----
	def addLight(self):
		self.dlight = DirectionalLight('dlight')
		self.dlight.setColor(VBase4(0.9, 0.9, 0.8, 1))
		self.dlnp = self.render.attachNewNode(self.dlight)
		self.dlnp.setHpr(90, -30, 0)
		self.render.setLight(self.dlnp)
		
		self.slight = Spotlight('slight')
		slens = PerspectiveLens()
		self.slight.setLens(slens)
		self.slight.setColor(Vec4(1, 1, 1, 1))
		self.slnp = self.render.attachNewNode(self.slight)
		self.slnp.reparentTo(self.hopper.hopperNP)
		self.slnp.setPos(0, 40, 50)
		self.slnp.lookAt(self.hopper.hopperNP)
		self.render.setLight(self.slnp)
		
		self.alight = AmbientLight('alight')
		self.alight.setColor(VBase4(0.2, 0.4, 1, 1))
		self.alnp = self.render.attachNewNode(self.alight)
		
		self.render.setLight(self.alnp)
		
		self.render.setShaderAuto()
		self.slight.setShadowCaster(True)

		for platform in self.platforms:
			platform.removeNormal()

	def destroyLight(self):
		self.render.clearLight(self.dlnp)
		self.render.clearLight(self.alnp)
		self.render.clearLight(self.slnp)
		
		for platform in self.platforms:
			platform.addNormal()

	def destroyWorld(self):
		for platform in self.platforms:
			self.world.removeRigidBody(platform.platformBulletNode.node())
			platform.platformBulletNode.remove_node()
		for spinner in self.spinners:
			self.world.removeRigidBody(spinner.spinnerBulletNode.node())
			spinner.spinnerBulletNode.remove_node()
		for coin in self.coins:
			self.world.removeGhost(coin.ghostNode)
			coin.removeCoin()
		for enemy in self.enemies:
			enemy.enemyNP.remove_node()
示例#12
0
snipstuff.info_show()

base.disableMouse()

#=========================================================================
# Main
"""
While the principles are almost the same for 3D space, picking in 2D require a little change to adapt to the 2D layer, it's aspect and camera view (that is called orthographic).
"""
#=========================================================================

#** First big difference: as you may know, we used so far to assign the collision traverser to the global Showbase member cTrav, that is automatically updated (traversed) but it operates under the render nodepath that we know works in the 3D space and thewrefore we'll store the traverser apart in a convenient variable to be manually traversed later by our routine and act in 2d space.
customCtrav = CollisionTraverser()
collisionHandler = CollisionHandlerEvent()
# to keep the stuff simple, we specify fixed pattern strings to just check the into and out of all our colliders, because we know they are just cards and the ray FROM collider
collisionHandler.addInPattern("ray-into-cards")
collisionHandler.addOutPattern("ray-out-cards")

PICKING_MASK = BitMask32.bit(1)

#** Setting the ray collider
pickerNode = CollisionNode('mouseraycnode')
# another important but obvious difference from step 6 is that this time we parent the ray nodepath in render2d instead render root nodepath, otherwise all the objects we're going to define in 2D won't be seen by the ray.
pickerNP = base.render2d.attachNewNode(pickerNode)
pickerNP.show()
# note that this time we set the ray dimension along the Y axis 2 point long to pierce everything is on the Y=0 position (2D objects are usually placed there)
pickerRay = CollisionRay(0, -1, 0, 0, 1, 0)
pickerNode.addSolid(pickerRay)
pickerNode.setFromCollideMask(PICKING_MASK)
pickerNode.setIntoCollideMask(BitMask32.allOff())
#** put the ray into the traverse cycle
示例#13
0
class MyApp(ShowBase):
              
        

    def cleanUpStartScreen( self ):       
        self.startButton.destroy( ) # get rid of the button       
        self.logoModel.detachNode( ) # detach the logo model from the render        
        self.loadGame( ) # load the actual game       
        # end cleanUpStartScreen


    def addInstructions(pos, msg):
        return OnscreenText(text=msg, style=1, fg=(1,1,1,1),pos=(-1.3, pos), align=TextNode.ALeft, scale = .05)
        
    def __init__(self):
	global x,y,z
	#self.loadStartScreen()
        ShowBase.__init__(self)

	#self.setupBackgroundColor(1,1,1)       
        # set the camera position       
        #camera.setPosHpr( Vec3( 0, -10, 0 ), Vec3( 0, 0, 0 ) )       
        # load our logo model       
        self.logoModel = loader.loadModel("bvw-f2004--truck/cartruck.egg")
        self.logoModel.reparentTo( render )       
        # set the logo model's position       
        self.logoModel.setPosHpr( Vec3( 0, 15, 0 ), Vec3( 0, 0, 0 ) )       
        # create and display a start button       
        self.startButton = DirectButton( text = "Go!", relief = DGG.RAISED, scale = .1, pad = ( .5, .5 ), pos = Vec3( 1.0, 0.0, -0.8 ), command = self.cleanUpStartScreen )
	self.disableMouse()
	self.obs = [None] * 100
	self.keyMap = {"forward":0, "slow":0, "left":0, "right":0}

	#self.environ = [None]*100
	self.grb= [None] * 100
	self.env= [None] * 20
	self.env1= [None] * 20
	self.envx= [None] * 20
	self.envy= [None] * 20

	self.title = OnscreenText(text="SCORE: " + str(score), style=1, fg=(1,1,0,1), pos=(-0.95,0.85), scale = .07, mayChange = True)
        self.title1 = OnscreenText(text="LIVES: " + str(int (gameover/2)), style=1, fg=(1,1,0,1), pos=(-0.95,0.7), scale = .07, mayChange = True)
        self.timeleft = OnscreenText(text="TIME LEFT: " + str(int(time/60)) + " : " + str(int(time%60)), style=1, fg=(1,1,0,1), pos=(-0.95,0.55), scale = .07, mayChange = True)
        
	self.model= self.loader.loadModel("alice-farm--cornfield/cornfield.egg")
	self.model.reparentTo(self.render)
	self.model.setPos(-8, 42, 0)
	self.model.setScale(20,1000,20)

        # Reparent the model to render.
	self.environ2 = self.loader.loadModel("bvw-f2004--building/building.egg")
	self.environ2.reparentTo(self.render)
	self.environ2.setPos(S1x, S1y, S1z)
	self.environ2.setScale(0.2, 0.2, 0.2)
	
	for i in range(0,100):
                        self.obs[i]= self.loader.loadModel("alice-objects--anvil/anvil.egg")
                        self.obs[i].reparentTo(self.render)
                        self.obs[i].setX(random.choice([0, 10]))
                        self.obs[i].setY(random.randint(100,100000))
                        self.obs[i].setZ(3)
                        self.obs[i].setScale(10,20,10)

	for j in range(0,100):
			self.grb[j]= self.loader.loadModel("alice-shapes--icosahedron/icosahedron.egg")
			self.grb[j].reparentTo(self.render)
			self.grb[j].setX(random.choice([0, 10]))
			self.grb[j].setY(random.randint(100, 100000))
			self.grb[j].setZ(3)
			self.grb[j].setScale(0.8,3,0.8)

        for k in range(0,20):
                self.envx[k]= self.loader.loadModel("bvw-f2004--building/building.egg")
                self.envx[k].reparentTo(self.render)
                self.envx[k].setX(random.choice([-60, 60]))
                self.envx[k].setY(random.randint(13000, 35000))
                self.envx[k].setZ(0)
                self.envx[k].setScale(0.8, 0.8, 0.8)

        for k in range(0,20):
                self.envy[k]= self.loader.loadModel("bvw-f2004--russianbuilding/tetris-building.egg")
                self.envy[k].reparentTo(self.render)
                self.envy[k].setX(random.choice([-100, 100]))
                self.envy[k].setY(random.randint(38000, 60000))
                self.envy[k].setZ(0)
                self.envy[k].setScale(0.8, 0.8, 0.8)

	self.environ4 = self.loader.loadModel("alice-city--townhouse1/townhouse1.egg")
	self.environ4.reparentTo(self.render)
	self.environ4.setPos(T1x, T1y, T1z)
	self.environ4.setScale(0.6, 0.6, 0.6)

	self.BS = self.loader.loadModel("alice-skies--bluesky/bluesky.egg")
        self.BS.reparentTo(self.render)
        self.BS.setScale(10,10,10)
        self.BS.setPos(-180,0,0)

        self.barn= self.loader.loadModel("alice-farm--farmhouse/farmhouse.egg")
        self.barn.reparentTo(self.render)
        self.barn.setScale(0.5, 0.5, 0.5)
        self.barn.setPos(30,500,0)

        self.barn1= self.loader.loadModel("alice-beach--beachhouse2/beachhouse2.egg")
        self.barn1.reparentTo(self.render)
        self.barn1.setScale(0.5, 0.5, 0.5)
        self.barn1.setPos(40,200,0)

        self.barn2= self.loader.loadModel("alice-beach--beachhouse2/beachhouse2.egg")
        self.barn2.reparentTo(self.render)
        self.barn2.setScale(0.5,0.5,0.5)
        self.barn2.setPos(70,1700,0)

        self.barn3= self.loader.loadModel("bvw-f2004--russianbuilding/tetris-building.egg")
        self.barn3.reparentTo(self.render)
        self.barn3.setScale(0.5,0.5,0.5)
        self.barn3.setPos(-90,1500,0)


        self.barn5= self.loader.loadModel("bvw-f2004--course1/course1.egg")
        self.barn5.reparentTo(self.render)
        self.barn5.setScale(0.25, 0.25, 0.25)
        self.barn5.setPos(-100,900,0)

        

	
        # Apply scale and position transforms on the model.
        self.environ1= self.loader.loadModel("alice-vehicles--zamboni/zamboni.egg")
        self.environ1.reparentTo(self.render)
        self.environ1.setPos(E1posX, E1posY, E1posZ)
        self.environ1.setScale(0.3, 0.3, 0.3)
	print E1posY

    def loadGame(self):

	self.camera.setPos(CposX, CposY, CposZ)
	self.camera.setHpr(0,0,0)

	#for j in range(0, 100):

                #self.environ[j] = self.loader.loadModel("CityTerrain/CityTerrain")
                #self.environ[j].reparentTo(self.render)
                #self.environ[j].setPos(-8,42 + 210*j,0)
                #self.environ[j].setScale(0.25,0.25,0.25)


	self.accept("arrow_up-repeat", self.setKey, ["forward", 1])
	self.accept("arrow_down-repeat", self.setKey, ["slow", 1])
	self.accept("arrow_left", self.setKey, ["left", 1])
	self.accept("arrow_right", self.setKey, ["right", 1])

	base.cTrav = CollisionTraverser()
	
	self.collHandEvent = CollisionHandlerEvent()
	self.collCount=0
        self.collHandEvent.addInPattern('into-%in')
        self.collHandEvent.addOutPattern('outof-%in')
	sColl = self.initCollisionSphere(self.environ1, True)
	base.cTrav.addCollider(sColl[0], self.collHandEvent)

	for child in render.getChildren():	
		if child != camera  and child != self.environ2 and child!= self.environ4 and child != self.BS and child!= self.model and child!= self.barn and child!= self.barn1 and child!= self.barn2 and child!= self.barn3 and child!= self.barn5:
			#print child
			tColl = self.initCollisionSphere(child, True)
			base.cTrav.addCollider(tColl[0], self.collHandEvent)
			self.accept('into-' + tColl[1] , self.collide)
			
			

##        for m in range(0,100):
##                tgrb= self.initCollisionSphere(self.grb[i], True)
##                base.cTrav.addCollider(tgrb[0], self.collHandEvent)
##                self.accept('into-' + tgrb[1], self.collide)
##
##        for n in range(0,100):
##                tobs= self.initCollisionSphere(self.obs[i], True)
##                base.cTrav.addCollider(tobs[0], self.collHandEvent)
##                self.accept('into-' + tobs[1], self.collide)
			
               
	self.taskMgr.add(self.move, "moveTask")
	

    def initCollisionSphere(self, obj,show=False):
        # Get the size of the object for the collision sphere.
        bounds = obj.getChild(0).getBounds()
        center = bounds.getCenter()
        radius = bounds.getRadius() *0.5
 
        # Create a collison sphere
        collSphereStr = 'CollisionHull' + str(self.collCount) + "_" + obj.getName()
        self.collCount += 1
        cNode = CollisionNode(collSphereStr)
        cNode.addSolid(CollisionSphere(center, radius))
 
        cNodepath = obj.attachNewNode(cNode)
	#cNodepath.show()
        
 
        # Return a tuple with the collision node and its corrsponding string so
        # that the bitmask can be set.
        return (cNodepath, collSphereStr)

    def collide(self, collEntry):
        global score,E1posY,gameover,adj, CposY
        if self.environ1.getY()==-100:
            return
        if(collEntry.getIntoNodePath().getParent().getName()== "icosahedron.egg"):
            #print collEntry.getIntoNodePath().getParent().getName() 
            collEntry.getIntoNodePath().getParent().remove()
            score= score +10
            print score
            self.title.detachNode()
            self.title = OnscreenText(text="SCORE: " + str(score), style=1, fg=(1,1,0,1), pos=(-0.95,0.85), scale = .07, mayChange = True)

        elif(collEntry.getIntoNodePath().getParent().getName()== "anvil.egg"):
                E1posY= E1posY-50
                CposY= CposY-50
                self.camera.setPos(CposX, CposY, CposZ)
                self.environ1.setPos(E1posX, E1posY, E1posZ)
                gameover= gameover - 1
                self.title1.detachNode()
                self.title1= OnscreenText(text="LIVES: " + str(int(gameover/2)), style=1, fg=(1,1,0,1), pos=(-0.95, 0.7), scale = .07, mayChange = True)
                print gameover
                if(gameover<=0):
                    print "Game Over"
##                    time2= int(time-(task.time*0.5))
##                    if time1!=time2:
##                    self.inst2.detachNode()
##                    self.inst2 = addInstructions(0.89, "Time: "+str(time2))   
##                    time1=time2
##                    if time2==0:
                    OnscreenText(text= "GAME OVER", style=1, fg=(1,1,1,1),pos=(-0.9,0), align=TextNode.ALeft, scale = 0.35)
                    OnscreenText(text= "Your Final Score is " + str(score), style=1, fg=(1,1,0,1), pos=(-0.95, -0.05), align=TextNode.ALeft, scale=0.015)
                    #time.sleep(10)
                    #sys.exit
                    self.environ1.detachNode()
                    self.camera.detachNode()

    def setKey(self, key, value):
	self.keyMap[key]= value

    def move(self, task):
	global E1posX, E1posY, E1posY, CposX, CposY, CposZ, S1y, S2y, T1y, n, y,speed, time
	self.over=0
	ts= int(task.time)
	time= 120 -ts
	print time,ts
	self.timeleft.detachNode()
	self.timeleft=  OnscreenText(text="TIME LEFT: " + str(int(time/60)) + " : " + str(int(time%60)), style=1, fg=(1,1,0,1), pos=(-0.95,0.55), scale = .07, mayChange = True)
	if(time<=0):
                    time=0
                    OnscreenText(text= "GAME OVER", style=1, fg=(1,1,1,1),pos=(-0.9,0), align=TextNode.ALeft, scale = 0.35)
                    OnscreenText(text= "Your Final Score is " + str(score), style=1,fg=(1,1,0,1), pos=(-0.95, -0.05), align=TextNode.ALeft, scale=0.02)
                    #time.sleep(10)
                    #sys.exit
                    self.environ1.detachNode()
                    self.over=1
            
	if(self.keyMap["forward"]==1):
		self.keyMap["forward"]=0
		speed= 10
		if speed>=10:
                    speed= 20
                elif speed>=20:
                    speed= 30
		dist= speed
		print dist
		E1posY= E1posY + dist
		CposY= CposY + dist
		S1y= S1y + dist
		S2y= S2y + dist
		T1y= T1y + dist
		y= y+ dist
		self.environ1.setPos(E1posX, E1posY, E1posZ)
		self.camera.setPos(CposX, CposY, CposZ)
		if(E1posY==7500 * n or E1posY== 7500 *n +20):
			n= n+1
			self.environ4.setPos(T1x, T1y, T1z)
			#self.environ3.setPos(S2x, S2y, S2z)
			self.environ2.setPos(S1x, S1y, S1z)
			self.model.setPos(x,y + 550,z)
			
		print E1posX, E1posY, E1posZ, CposX, CposY, CposZ, x, y, z

	elif(self.keyMap["slow"]==1):
                global slowadj
                self.keyMap["slow"]=0
                if slowadj<100:
                    slowadj+= slowadj
                    speed= speed-10
                    if speed<0:
                        speed=0
                elif slowadj<200:
                    slowadj+= slowadj
                    speed= speed-10
                    if speed<0:
                        speed=0

                elif slowadj<300:
                    slowadj+= slowadj
                    speed= speed-10
                    if speed<0:
                        speed=0

                elif slowadj>=300:
                        speed=0

                print speed    
		E1posY= E1posY + speed
                CposY= CposY + speed
		S1y= S1y + speed
		S2y= S2y + speed
		T1y= T1y + speed
		y= y + speed
                self.environ1.setPos(E1posX, E1posY, E1posZ)
                self.camera.setPos(CposX, CposY, CposZ)
		if(E1posY>=7700 * n and E1posY<= 7700 *n + 30):
			n= n+1
			self.environ4.setPos(T1x, T1y, T1z)
			self.environ3.setPos(S2x, S2y, S2z)
			self.environ2.setPos(S1x, S1y, S1z)
			self.model.setPos(x,y + 550,z)

		print E1posX, E1posY, E1posZ, CposX, CposY, CposZ

	elif(self.keyMap["left"]==1):
                self.keyMap["left"]=0
		if(E1posX!=0):
			E1posX=0
			CposX=0

                self.environ1.setPos(E1posX, E1posY, E1posZ)
                self.camera.setPos(CposX, CposY, CposZ)

	elif(self.keyMap["right"]==1):
		self.keyMap["right"]=0
		if(E1posX!=10):
			E1posX=10
			CposX=10

		self.environ1.setPos(E1posX, E1posY, E1posZ)
		self.camera.setPos(CposX, CposY, CposZ)

        elif(self.keyMap["forward"]==0):
                if(self.over==1):
                    CposY= CposY
                elif(self.over==0):
                
                    print E1posY, CposY, speed
                    E1posY= E1posY + speed
                    CposY= CposY + speed
                    S1y= S1y + speed
                    S2y= S2y + speed
                    T1y= T1y + speed
                    y= y + speed
                    self.environ1.setPos(E1posX, E1posY, E1posZ)
                    self.camera.setPos(CposX, CposY, CposZ)
                    if(E1posY>=7500 * n and E1posY<= 7500 *n + 30):
                            n= n+1
                            self.environ4.setPos(T1x, T1y, T1z)
                            #self.environ3.setPos(S2x, S2y, S2z)
                            self.environ2.setPos(S1x, S1y, S1z)
                            self.model.setPos(x,y + 550,z)
	
	return Task.cont 
示例#14
0
文件: step6.py 项目: xwavex/pyhiro
        if status == 'up':
            pickingEnabledOject.setScale(1.0)


#** This is a task function called each frame, where the collision ray position is syncronized with the mouse pointer position
def rayupdate(task):
    if base.mouseWatcherNode.hasMouse():
        mpos = base.mouseWatcherNode.getMouse()
        # this function will set our ray to shoot from the actual camera lenses off the 3d scene, passing by the mouse pointer position, making  magically hit what is pointed by it in the 3d space
        pickerRay.setFromLens(base.camNode, mpos.getX(), mpos.getY())
    return task.cont


#** Now the tricky part: we have here a particular kind of pattern that react firing a task event when a collider, tagged as 'rays', whatever the value is stored into, hit an object tagged as 'balls', no matter what value is stored into its tag. The resulting event strings sent to the panda3D event manager will be the result of the FROM collider (ray) and the tag value owned by the INTO object being hit (a ball), provided that was settled with a tag key 'balls'.
# That said, these two lines will catch all the events for either smiles and frowneys because we both tagged 'em as 'balls', for all IN events...
collisionHandler.addInPattern("%(rays)ft-into-%(balls)it")
# ...and here for the OUT events
collisionHandler.addOutPattern("%(rays)ft-out-%(balls)it")

#** To complicate things a little, this time we'll going to use the addAgainPattern method, that will raise an event while the mouse ponter is keeping over a ball of any group. Note that the 'ray_again_all' chunk will be used by the CollisionHandlerEvent to fire the event. See the related accept below.
collisionHandler.addAgainPattern("ray_again_all%("
                                 "rays"
                                 ")fh%("
                                 "balls"
                                 ")ih")
""" Note that we could have been done the same using this form as well:

collisionHandler.addAgainPattern("%(rays)ft-again-%(balls)it")

but then we should have used 2 accepts like this:
示例#15
0
class MyApp(ShowBase):
    def __init__(self):
        ShowBase.__init__(self)
        global carx, cary, d, cor_ans, count

        self.disableMouse()
        self.Truck = [0] * 6
        self.crate = [0] * 10
        self.posc = [0] * 30
        self.radX = [0] * 60
        self.radY = [0] * 60
        self.radZ = [0] * 60
        self.sX = [0] * 10
        self.sY = [0] * 10
        self.sZ = [0] * 10
        self.flag = [0] * 10
        self.ans = [0] * 10
        self.inst1 = addInstructions(0.89, "Correct Answer: " + str(cor_ans))
        self.inst2 = addInstructions(0.95, "Time: " + str(time))
        self.inst3 = addInstructions(0.84,
                                     "Waste Reamaining " + str(count / 2))

        #self.title = addTitle("Recycle Game By : Sandeep Sharma")
        p = 0
        file = open("ans.txt")

        for line in file:

            #for p in range(30):

            #print line
            line = line.split()
            self.ans[p] = str(line[0])

            p = p + 1
#	self.posc[p]= int(line)
#print self.posc[p]
#break
        file.close()
        p = 0
        file = open("sample.txt")

        for line in file:

            #for p in range(30):

            line = line[0:len(line) - 1]
            #print line
            self.posc[p] = int(line)

            p = p + 1
#	self.posc[p]= int(line)
#print self.posc[p]
#break
        file.close()
        p = 0

        file = open("scale.txt")

        for line in file:

            #for p in range(30):

            line = line.split()

            #print line
            self.sX[p] = float(line[0])
            self.sY[p] = float(line[1])
            self.sZ[p] = float(line[2])
            #print self.radY[p]
            p = p + 1

        p = 0

        file = open("rad.txt")

        for line in file:

            #for p in range(30):

            line = line.split()

            #print line
            self.radX[p] = float(line[0])
            self.radY[p] = float(line[1])
            self.radZ[p] = float(line[2])
            #print self.radY[p]
            p = p + 1

        #       self.posc[p]= int(line)
        #print self.posc[p]
        #break
        file.close()

        self.CornField = self.loader.loadModel("cornfield")
        self.CornField.reparentTo(self.render)
        self.CornField.setScale(1000, 1000, 0)
        self.CornField.setPos(0, 0, -8)

        self.WM = self.loader.loadModel("WM/Windmill")
        self.WM.reparentTo(self.render)
        self.WM.setScale(2, 2, 2)
        self.WM.setPos(354, 131, 0)
        self.WM.setHpr(180, 0, 0)

        self.F1 = self.loader.loadModel("Forest/Forest")
        self.F1.reparentTo(self.render)
        self.F1.setScale(0.8, 0.5, 0.5)
        self.F1.setPos(-338, -164, 0)
        self.F1.setHpr(90, 0, 0)

        self.F2 = self.loader.loadModel("Forest/Forest")
        self.F2.reparentTo(self.render)
        self.F2.setScale(0.8, 0.5, 0.5)
        self.F2.setPos(366, -189, 0)
        self.F2.setHpr(90, 0, 0)

        self.castle = self.loader.loadModel("castle")
        self.castle.reparentTo(self.render)
        self.castle.setScale(0.6, 0.8, 0.5)
        self.castle.setPos(-97, -200, 0)
        self.castle.setHpr(90, 0, 0)
        #print self.castle

        self.church = self.loader.loadModel("church/Church")
        self.church.reparentTo(self.render)
        self.church.setScale(2.5, 2.5, 1)
        self.church.setPos(90, -200, 0)
        self.church.setHpr(180, 0, 0)

        self.Temple = self.loader.loadModel("Temple/TempleFort")
        self.Temple.reparentTo(self.render)
        self.Temple.setScale(0.06, 0.1, 0.18)
        self.Temple.setPos(210, -109, 0)

        self.house = self.loader.loadModel("BuildingCluster3")
        self.house.reparentTo(self.render)
        self.house.setScale(1.5, 1.5, 1)
        self.house.setPos(208, 86, 0)

        self.CityHall = self.loader.loadModel("cityhall/CityHall")
        self.CityHall.reparentTo(self.render)
        self.CityHall.setScale(1.5, 1.5, 1.5)
        self.CityHall.setPos(-188, -84, 0)
        self.CityHall.setHpr(90, 0, 0)

        self.statue = self.loader.loadModel("statue/statue")
        self.statue.reparentTo(self.render)
        self.statue.setScale(4.5, 4.5, 3.5)
        self.statue.setPos(-191, 105, 0)
        self.statue.setHpr(-90, 0, 0)

        self.FarmHouse = self.loader.loadModel("farmhouse/FarmHouse")
        self.FarmHouse.reparentTo(self.render)
        self.FarmHouse.setScale(2.8, 3.5, 2.5)
        self.FarmHouse.setPos(-66, 209, 0)

        self.Fence1 = self.loader.loadModel("fence/fence")
        self.Fence1.reparentTo(self.render)
        self.Fence1.setScale(70, 1, 2)
        self.Fence1.setPos(0, -418, 0)

        self.Fence2 = self.loader.loadModel("fence/fence")
        self.Fence2.reparentTo(self.render)
        self.Fence2.setScale(70, 1, 2)
        self.Fence2.setPos(0, 418, 0)

        self.Fence3 = self.loader.loadModel("fence/fence")
        self.Fence3.reparentTo(self.render)
        self.Fence3.setScale(70, 1, 2)
        self.Fence3.setPos(-418, 0, 0)
        self.Fence3.setHpr(90, 0, 0)

        self.Fence4 = self.loader.loadModel("fence/fence")
        self.Fence4.reparentTo(self.render)
        self.Fence4.setScale(70, 1, 2)
        self.Fence4.setPos(418, 0, 0)
        self.Fence4.setHpr(90, 0, 0)

        self.CityTerrain = self.loader.loadModel("CityTerrain/CityTerrain")
        self.CityTerrain.reparentTo(self.render)
        self.CityTerrain.setScale(0.5, 0.5, 0.5)
        self.CityTerrain.setPos(0, 0, 0)

        self.BeachTerrain = self.loader.loadModel("BeachTerrain/BeachTerrain")
        self.BeachTerrain.reparentTo(self.render)
        self.BeachTerrain.setScale(0.5, 0.5, 0.5)
        self.BeachTerrain.setPos(200, 750, 0)
        self.BeachTerrain.setHpr(90, 0, 0)

        self.school = self.loader.loadModel("school/school")
        self.school.reparentTo(self.render)
        self.school.setScale(0.056, 0.07, 0.05)
        self.school.setPos(-162, -348, 0)
        self.school.setHpr(90, 0, 0)

        self.car = Actor("bvw-f2004--jeep/jeep",
                         {"walk": "bvw-f2004--jeep/jeep-start"})
        self.car.setScale(0.5, 0.5, 0.5)
        self.car.reparentTo(self.render)
        self.car.setPos(carx, cary, -2)
        self.car.setHpr(180, 0, 0)
        #print self.car
        for l in range(10):
            self.crate[l] = self.loader.loadModel("model" + str(l + 1) +
                                                  "/crate" + str(l + 1) +
                                                  ".egg")
            self.crate[l].setScale(self.sX[l], self.sY[l], self.sZ[l])
            self.crate[l].reparentTo(self.render)
            self.crate[l].setPos(self.posc[3 * l], self.posc[3 * l + 1], 2)
            self.crate[l].setHpr(0, 0, 0)
            #self.car.loop("walk")

#self.car.reparentTo(self.render)
#self.car.setScale(2,2,2)
#self.car.setPos(carx,cary,-2)
#self.car.setHpr(0,0,0)

        self.museum = self.loader.loadModel("Museum/Museum")
        self.museum.reparentTo(self.render)
        self.museum.setScale(1, 2, 1.5)
        self.museum.setPos(100, 200, 0)
        self.museum.setHpr(180, 0, 0)

        self.PalmTree = self.loader.loadModel("PalmTree/palmtree")
        self.PalmTree.reparentTo(self.render)
        self.PalmTree.setScale(2, 2, 3.5)
        self.PalmTree.setPos(175, 200, 0)
        self.PalmTree.setHpr(0, 0, 0)

        self.stadium = self.loader.loadModel("Stadium/stadium")
        self.stadium.reparentTo(self.render)
        self.stadium.setScale(0.5, 0.5, 0.5)
        self.stadium.setPos(13, 0, 0)
        self.stadium.setHpr(0, 0, 0)

        self.Junkyard = self.loader.loadModel("Junkyard")
        self.Junkyard.reparentTo(self.render)
        self.Junkyard.setScale(0.2, 0.4, 0.3)
        self.Junkyard.setPos(150, -650 / 2 - 25, 0)
        self.Junkyard.setHpr(90, 0, 0)

        self.BB1 = self.loader.loadModel("BuildingCluster1")
        self.BB1.reparentTo(self.render)
        self.BB1.setScale(0.5, 0.5, 1)
        self.BB1.setPos(-100 - 10, 650 / 2 + 20, 0)
        self.BB1.setHpr(270, 0, 0)

        self.BB2 = self.loader.loadModel("BB2/BuildingCluster2")
        self.BB2.reparentTo(self.render)
        self.BB2.setScale(0.5, 0.5, 1)
        self.BB2.setPos(-60 - 10, 650 / 2 + 20, 0)
        self.BB2.setHpr(270, 0, 0)

        self.BB3 = self.loader.loadModel("BB3/BuildingCluster3")
        self.BB3.reparentTo(self.render)
        self.BB3.setScale(0.5, 0.5, 1)
        self.BB3.setPos(-140 - 10, 650 / 2 + 20, 0)
        self.BB3.setHpr(270, 0, 0)

        self.BB4 = self.loader.loadModel("BB4/BuildingCluster4")
        self.BB4.reparentTo(self.render)
        self.BB4.setScale(0.5, 0.5, 1)
        self.BB4.setPos(-25 - 10, 650 / 2 + 20, 0)
        self.BB4.setHpr(270, 0, 0)

        self.BB5 = self.loader.loadModel("BB5/BuildingCluster5")
        self.BB5.reparentTo(self.render)
        self.BB5.setScale(0.5, 0.5, 1)
        self.BB5.setPos(-190 - 10, 650 / 2 + 20, 0)
        self.BB5.setHpr(270, 0, 0)

        self.BS = self.loader.loadModel("BS/blue_sky_sphere")
        self.BS.reparentTo(self.render)
        self.BS.setScale(1, 1, 1)
        self.BS.setPos(-180, 0, 0)

        self.flagMain = self.loader.loadModel("Flag/flag")
        self.flagMain.setScale(0.3, 0.3, 0.3)
        self.flagMain.reparentTo(self.render)
        self.flagMain.setPos(carx - 20, cary, 10)
        print self.flagMain

        for i in range(6):
            self.Truck[i] = self.loader.loadModel(
                "bvw-f2004--fireengine/fireengine")
            self.Truck[i].reparentTo(self.render)
            self.Truck[i].setScale(2, 2, 2)
        ##self.Truck[i].setPos(180,0,0)

#Create the four lerp intervals needed to walk back and forth
        self.setTruck()

        #self.City = self.loader.loadModel("City/course2")
        #self.City.reparentTo(self.render)
        #self.City.setScale(2.5,2.5,2.5)
        #self.City.setPos(500,0,0)

        self.accept('arrow_down', self.moved, [0])
        self.accept('arrow_up', self.move, [0])
        self.accept("arrow_left", self.change_dc, [0])
        self.accept("arrow_right", self.change_da, [0])

        self.accept('arrow_down-up', self.moved, [2])
        self.accept('arrow_up-up', self.move, [2])
        #self.accept("arrow_left-up",self.change_dc,[2])
        #self.accept("arrow_right-up",self.change_da,[2])

        self.accept('arrow_down-repeat', self.moved, [1])
        self.accept('arrow_up-repeat', self.move, [1])
        self.accept("arrow_left-repeat", self.change_dc, [1])
        self.accept("arrow_right-repeat", self.change_da, [1])

        base.cTrav = CollisionTraverser()

        self.collHandEvent = CollisionHandlerEvent()
        self.collHandEvent.addInPattern('into-%in')
        self.collHandEvent.addOutPattern('outof-%in')
        self.collCount = 0
        sColl = self.initCollisionSphere(self.car, 1, 1, 1, True)
        base.cTrav.addCollider(sColl[0], self.collHandEvent)

        self.accept('into-' + sColl[1], self.collide)
        #self.accept('outof-' + sColl[1], self.collide4)
        i = 0
        for child in render.getChildren():
            if child != self.CornField and child != camera and child != self.CityTerrain and child != self.BeachTerrain and child != self.BS and child != self.Fence1 and child != self.Fence2 and child != self.Fence3 and child != self.Fence4:
                #print child
                tColl = self.initCollisionSphere(child, self.radX[i],
                                                 self.radY[i], self.radZ[i],
                                                 True)
                base.cTrav.addCollider(tColl[0], self.collHandEvent)
                #print i
                i = i + 1

                # Accept the events sent by the collisions.
                self.accept('into-' + tColl[1], self.collide)
        for l in range(10):
            self.flag[l] = self.loader.loadModel("Flag/flag")
            self.flag[l].setScale(0.3, 0.3, 0.3)
            self.flag[l].reparentTo(self.render)

            self.flag[l].setPos(self.posc[3 * l], self.posc[3 * l + 1], 10)

#       	self.accept( 'into-' + sColl[1], self.collide)
#self.accept('outof-' + tColl[1], self.collide2)
#	print carx,cary
#	cs = CollisionSphere(0, 0, 0, 10)
#	fromObject = self.car.attachNewNode(CollisionNode('cnode'))
#	fromObject.node().addSolid(cs)
#	fromObject.show()
#	pusher = CollisionHandlerPusher()
#	pusher.addCollider(fromObject, self.car)
#	base.cTrav = CollisionTraverser()
#	base.cTrav.addCollider(fromObject, pusher)

        self.taskMgr.add(self.spinCameraTask, "SpinCameraTask")

    def collide(self, collEntry):
        global carx, cary, car_def, a, Num, count
        #print "Collide"

        #print collEntry.getFromNodePath().getParent()
        #for objectc in collEntry:
        for l in range(10):
            #print collEntry.getFromNodePath().getParent()
            if collEntry.getIntoNodePath().getParent() == self.crate[l]:
                collEntry.getIntoNodePath().getParent().remove()
                #print "Baba"
                Num = l
                count = count - 1
                self.flag[l].hide()
                self.Game_Point()
        if str(collEntry.getIntoNodePath().getParent()
               ) == "render/flag.egg" and count == 0 and str(
                   collEntry.getFromNodePath().getParent(
                   )) == "render/jeepNman_loop_baked":
            #print "here"
            self.GameOver()

        if str(collEntry.getIntoNodePath().getParent(
        )) == "render/jeepNman_loop_baked" or str(collEntry.getFromNodePath(
        ).getParent()) == "render/jeepNman_loop_baked":

            if a == 0:

                if self.car.getH() == 45:

                    carx = carx + car_def
                    cary = cary - car_def
                if self.car.getH() == 90:
                    carx = carx + car_def

                if self.car.getH() == 135:
                    carx = carx + car_def
                    cary = cary + car_def
                if self.car.getH() == 180:
                    cary = cary + car_def

                if self.car.getH() == 225:
                    carx = carx - car_def
                    cary = cary + car_def

                if self.car.getH() == 270:
                    carx = carx - car_def

                if self.car.getH() == 315:
                    carx = carx - car_def
                    cary = cary - car_def

                if self.car.getH() == 0:
                    cary = cary - car_def
            if a == 1:
                car_def = -1 * car_def
                if self.car.getH() == 45:

                    carx = carx + car_def
                    cary = cary - car_def
                if self.car.getH() == 90:
                    carx = carx + car_def

                if self.car.getH() == 135:
                    carx = carx + car_def
                    cary = cary + car_def
                if self.car.getH() == 180:
                    cary = cary + car_def

                if self.car.getH() == 225:
                    carx = carx - car_def
                    cary = cary + car_def

                if self.car.getH() == 270:
                    carx = carx - car_def

                if self.car.getH() == 315:
                    carx = carx - car_def
                    cary = cary - car_def

                if self.car.getH() == 0:
                    cary = cary - car_def

                car_def = -1 * car_def

#    def collide2(self,collEntry):
#
#    def collide3(self,collEntry):
#	global carx , cary
#	carx=carx-2
#	cary=cary-2
#    def collide4(self,collEntry):
#	print 4

    def initCollisionSphere(self, obj, setX, setY, setZ, show=False):
        # Get the size of the object for the collision sphere.
        bounds = obj.getChild(0).getBounds()
        center = bounds.getCenter()
        radius = bounds.getRadius() * 0.6

        # Create a collision sphere and name it something understandable.
        collSphereStr = 'CollisionHull' + str(
            self.collCount) + "_" + obj.getName()
        self.collCount += 1
        self.accept('arrow_down', self.moved, [0])
        self.accept('arrow_up', self.move, [0])
        cNode = CollisionNode(collSphereStr)
        #	cNode.setScale(3,3,3)
        cNode.addSolid(CollisionSphere(center, radius))

        cNodepath = obj.attachNewNode(cNode)
        cNodepath.setScale(setX, setY, setZ)
        #cNodepath.show()

        # Return a tuple with the collision node and its corrsponding string so
        # that the bitmask can be set.
        return (cNodepath, collSphereStr)

    def moved(self, i):
        global carx, cary, camx, camy, dis, a
        #print "moved"
        a = 1
        if i == 0:
            #print "Hello"
            self.car.loop("walk")
        if i == 2:
            self.car.stop("walk")
        #print "hello",self.car.getH()
        #print base.camera.getH()
        if carx > -410 and carx < 410 and cary > -410 and cary < 410:
            if self.car.getH() == 45:

                carx = carx - car_speed
                cary = cary + car_speed
                camx = carx - dis
                camy = cary + dis
            if self.car.getH() == 90:
                carx = carx - car_speed
                camx = carx - dis
            if self.car.getH() == 135:
                carx = carx - car_speed
                cary = cary - car_speed
                camx = carx - dis
                camy = cary - dis
            if self.car.getH() == 180:
                cary = cary - car_speed
                camy = cary - dis
            if self.car.getH() == 225:
                carx = carx + car_speed
                cary = cary - car_speed
                camx = carx + dis
                camy = cary - dis
            if self.car.getH() == 270:
                carx = carx + car_speed
                camx = carx + dis
            if self.car.getH() == 315:
                carx = carx + car_speed
                cary = cary + car_speed
                camx = carx + dis
                camy = cary + dis
            if self.car.getH() == 0:
                cary = cary + car_speed
                camy = cary + dis

        else:
            if carx <= -410:
                carx = carx - 1
            if carx >= 410:
                carx = carx + 1
            if cary <= -410:
                cary = cary - 1
            if cary >= 410:
                cary = cary + 1

    def move(self, i):
        global carx, cary, camx, camy, dis, a
        a = 0
        #	print "move"
        #	print carx,cary
        if i == 0:

            self.car.loop("walk")
        if i == 2:
            self.car.stop("walk")

    #print "hello",self.car.getH()
    #print base.camera.getH()
        if carx > -410 and carx < 410 and cary > -410 and cary < 410:
            if self.car.getH() == 45:

                carx = carx + car_speed
                cary = cary - car_speed
                camx = carx + dis
                camy = cary - dis
            if self.car.getH() == 90:
                carx = carx + car_speed
                camx = carx + dis
            if self.car.getH() == 135:
                carx = carx + car_speed
                cary = cary + car_speed
                camx = carx + dis
                camy = cary + dis
            if self.car.getH() == 180:
                cary = cary + car_speed
                camy = cary + dis
            if self.car.getH() == 225:
                carx = carx - car_speed
                cary = cary + car_speed
                camx = carx - dis
                camy = cary + dis
            if self.car.getH() == 270:
                carx = carx - car_speed
                camx = carx - dis
            if self.car.getH() == 315:
                carx = carx - car_speed
                cary = cary - car_speed
                camx = carx - dis
                camy = cary - dis
            if self.car.getH() == 0:
                cary = cary - car_speed
                camy = cary - car_speed
        else:
            if carx <= -410:
                carx = carx + 1
            if carx >= 410:
                carx = carx - 1
            if cary <= -410:
                cary = cary + 1
            if cary >= 410:
                cary = cary - 1
#	self.car.loop("walk")

    def change_dc(self, i):
        global d
        #if i ==0:
        #        print "Hello"
        #        self.car.loop("walk")
        #if i==2:
        #        self.car.stop("walk")

        d = d + 45
        d = d % 360

    def change_da(self, i):
        global d
        #if i ==0:
        #        print "Hello"
        #        self.car.loop("walk")
        #if i==2:
        #        self.car.stop("walk")

        d = d - 45
        d = d % 360

        #for j in range(9):
        #	d=d - 5
#
#	d=d % 360
#	self.car.setHpr(d , 0 , 0)
#	time.sleep(0.1)
#messenger.send('arrow_up-repeat')

    def spinCameraTask(self, task):
        global time, carx, cary, d, dis, camx, camy, count, cor_ans
        time = int(task.time)
        #r = d * (pi / 180.0)
        #print carx,cary
        if self.car.getH() == 45:

            camx = carx - dis
            camy = cary + dis
        if self.car.getH() == 90:
            camx = carx - 1.41 * dis
            camy = cary
        if self.car.getH() == 135:
            camx = carx - dis
            camy = cary - dis
        if self.car.getH() == 180:
            camy = cary - 1.41 * dis
            camx = carx
        if self.car.getH() == 225:
            camx = carx + dis
            camy = cary - dis
        if self.car.getH() == 270:
            camx = carx + 1.41 * dis
            camy = cary
        if self.car.getH() == 315:
            camx = carx + dis
            camy = cary + dis
        if self.car.getH() == 0:
            camy = cary + 1.41 * dis
            camx = carx
        if h == 0:
            self.inst1.destroy()
            self.inst2.destroy()
            self.inst3.destroy()
            self.inst1 = addInstructions(0.89,
                                         "Correct Answer: " + str(cor_ans))
            self.inst2 = addInstructions(0.95, "Time: " + str(time))
            self.inst3 = addInstructions(0.84,
                                         "Waste Reamaining " + str(count / 2))

        self.car.setPos(carx, cary, 0)
        self.car.setHpr(d, 0, 0)
        base.camera.setPos(camx, camy, 5)
        base.camera.setHpr(d + 180, 0, 0)

        #base.camera.setPos(0,0,1700)
        #base.camera.setHpr(0, -90 , 0)

        return Task.cont


#	base.camera.setPos(0,-40,3)
#	return Task.cont

    def setTruck(self):
        pandaPosInterval01 = self.Truck[0].posInterval(11,
                                                       Point3(18, 138, 0),
                                                       startPos=Point3(
                                                           21, 390, 0))
        pandaPosInterval02 = self.Truck[0].posInterval(5,
                                                       Point3(140, 132, 0),
                                                       startPos=Point3(
                                                           18, 138, 0))
        pandaPosInterval03 = self.Truck[0].posInterval(10,
                                                       Point3(140, -123, 0),
                                                       startPos=Point3(
                                                           140, 132, 0))
        pandaPosInterval04 = self.Truck[0].posInterval(5,
                                                       Point3(-7, -126, 0),
                                                       startPos=Point3(
                                                           140, -123, 0))
        pandaPosInterval05 = self.Truck[0].posInterval(11,
                                                       Point3(-10, -399, 0),
                                                       startPos=Point3(
                                                           -7, -126, 0))
        #pandaPosInterval6=self.Truck[0].posInterval(1,Point3(21,390,0),startPos=Point3(-10,-399,0)
        pandaHprInterval00 = self.Truck[0].hprInterval(1,
                                                       Point3(180, 0, 0),
                                                       startHpr=Point3(
                                                           0, 0, 0))
        pandaHprInterval01 = self.Truck[0].hprInterval(3,
                                                       Point3(-90, 0, 0),
                                                       startHpr=Point3(
                                                           180, 0, 0))
        pandaHprInterval02 = self.Truck[0].hprInterval(3,
                                                       Point3(180, 0, 0),
                                                       startHpr=Point3(
                                                           -90, 0, 0))
        pandaHprInterval03 = self.Truck[0].hprInterval(3,
                                                       Point3(90, 0, 0),
                                                       startHpr=Point3(
                                                           180, 0, 0))
        pandaHprInterval04 = self.Truck[0].hprInterval(3,
                                                       Point3(180, 0, 0),
                                                       startHpr=Point3(
                                                           90, 0, 0))
        #pandaHprInterval5= self.Truck[0].hprInterif collEntry.getIntoNodePath().getParent() == self.crate[l]:val(3,Point3(180,0,0), startHpr=Point3(0,0,0))

        #Create and play the sequence that coordinates the intervals
        pandaPace0 = Sequence(pandaHprInterval00,
                              pandaPosInterval01,
                              pandaHprInterval01,
                              pandaPosInterval02,
                              pandaHprInterval02,
                              pandaPosInterval03,
                              pandaHprInterval03,
                              pandaPosInterval04,
                              pandaHprInterval04,
                              pandaPosInterval05,
                              name="pandaPace0")
        pandaPace0.loop()

        pandaPosInterval11 = self.Truck[1].posInterval(11,
                                                       Point3(-126, 14, 0),
                                                       startPos=Point3(
                                                           -411, 14, 0))
        pandaPosInterval12 = self.Truck[1].posInterval(5,
                                                       Point3(-117, 145, 0),
                                                       startPos=Point3(
                                                           -126, 14, 0))
        pandaPosInterval13 = self.Truck[1].posInterval(10,
                                                       Point3(148, 130, 0),
                                                       startPos=Point3(
                                                           -117, 145, 0))
        pandaPosInterval14 = self.Truck[1].posInterval(5,
                                                       Point3(145, -5, 0),
                                                       startPos=Point3(
                                                           148, 130, 0))
        pandaPosInterval15 = self.Truck[1].posInterval(11,
                                                       Point3(394, -8, 0),
                                                       startPos=Point3(
                                                           145, -5, 0))
        #pandaPosInterval6=self.Truck[0].posInterval(1,Point3(21,390,0),startPos=Point3(-10,-399,0)
        pandaHprInterval10 = self.Truck[1].hprInterval(1,
                                                       Point3(-90, 0, 0),
                                                       startHpr=Point3(
                                                           0, 0, 0))
        pandaHprInterval11 = self.Truck[1].hprInterval(3,
                                                       Point3(0, 0, 0),
                                                       startHpr=Point3(
                                                           -90, 0, 0))
        pandaHprInterval12 = self.Truck[1].hprInterval(3,
                                                       Point3(-90, 0, 0),
                                                       startHpr=Point3(
                                                           0, 0, 0))
        pandaHprInterval13 = self.Truck[1].hprInterval(3,
                                                       Point3(180, 0, 0),
                                                       startHpr=Point3(
                                                           -90, 0, 0))
        pandaHprInterval14 = self.Truck[1].hprInterval(3,
                                                       Point3(-90, 0, 0),
                                                       startHpr=Point3(
                                                           180, 0, 0))
        #pandaHprInterval5= self.Truck[0].hprInterval(3,Point3(180,0,0), startHpr=Point3(0,0,0))

        #Create and play the sequence that coordinates the intervals
        pandaPace1 = Sequence(pandaHprInterval10,
                              pandaPosInterval11,
                              pandaHprInterval11,
                              pandaPosInterval12,
                              pandaHprInterval12,
                              pandaPosInterval13,
                              pandaHprInterval13,
                              pandaPosInterval14,
                              pandaHprInterval14,
                              pandaPosInterval15,
                              name="pandaPace1")
        pandaPace1.loop()

        pandaPosInterval21 = self.Truck[2].posInterval(11,
                                                       Point3(-9, -144, 0),
                                                       startPos=Point3(
                                                           -6, -358, 0))
        pandaPosInterval22 = self.Truck[2].posInterval(5,
                                                       Point3(-129, -137, 0),
                                                       startPos=Point3(
                                                           -9, -144, 0))
        pandaPosInterval23 = self.Truck[2].posInterval(10,
                                                       Point3(-129, 142, 0),
                                                       startPos=Point3(
                                                           -129, -137, 0))
        pandaPosInterval24 = self.Truck[2].posInterval(5,
                                                       Point3(5, 145, 0),
                                                       startPos=Point3(
                                                           -129, 142, 0))
        pandaPosInterval25 = self.Truck[2].posInterval(11,
                                                       Point3(20, 395, 0),
                                                       startPos=Point3(
                                                           5, 145, 0))
        #pandaPosInterval6=self.Truck[0].posInterval(1,Point3(21,390,0),startPos=Point3(-10,-399,0)
        pandaHprInterval20 = self.Truck[2].hprInterval(1,
                                                       Point3(0, 0, 0),
                                                       startHpr=Point3(
                                                           0, 0, 0))
        pandaHprInterval21 = self.Truck[2].hprInterval(3,
                                                       Point3(90, 0, 0),
                                                       startHpr=Point3(
                                                           0, 0, 0))
        pandaHprInterval22 = self.Truck[2].hprInterval(3,
                                                       Point3(0, 0, 0),
                                                       startHpr=Point3(
                                                           90, 0, 0))
        pandaHprInterval23 = self.Truck[2].hprInterval(3,
                                                       Point3(-90, 0, 0),
                                                       startHpr=Point3(
                                                           0, 0, 0))
        pandaHprInterval24 = self.Truck[2].hprInterval(3,
                                                       Point3(0, 0, 0),
                                                       startHpr=Point3(
                                                           -90, 0, 0))
        #pandaHprInterval5= self.Truck[0].hprInterval(3,Point3(180,0,0), startHpr=Point3(0,0,0))

        #Create and play the sequence that coordinates the intervals
        pandaPace2 = Sequence(pandaHprInterval20,
                              pandaPosInterval21,
                              pandaHprInterval21,
                              pandaPosInterval22,
                              pandaHprInterval22,
                              pandaPosInterval23,
                              pandaHprInterval23,
                              pandaPosInterval24,
                              pandaHprInterval24,
                              pandaPosInterval25,
                              name="pandaPace2")
        pandaPace2.loop()

        pandaPosInterval31 = self.Truck[3].posInterval(11,
                                                       Point3(150, -18, 0),
                                                       startPos=Point3(
                                                           408, -18, 0))
        pandaPosInterval32 = self.Truck[3].posInterval(5,
                                                       Point3(147, -135, 0),
                                                       startPos=Point3(
                                                           150, -18, 0))
        pandaPosInterval33 = self.Truck[3].posInterval(10,
                                                       Point3(-120, -138, 0),
                                                       startPos=Point3(
                                                           147, -135, 0))
        pandaPosInterval34 = self.Truck[3].posInterval(5,
                                                       Point3(-123, -6, 0),
                                                       startPos=Point3(
                                                           -120, -138, 0))
        pandaPosInterval35 = self.Truck[3].posInterval(11,
                                                       Point3(-396, 10, 0),
                                                       startPos=Point3(
                                                           -123, -6, 0))
        #pandaPosInterval6=self.Truck[0].posInterval(1,Point3(21,390,0),startPos=Point3(-10,-399,0)
        pandaHprInterval30 = self.Truck[3].hprInterval(1,
                                                       Point3(90, 0, 0),
                                                       startHpr=Point3(
                                                           0, 0, 0))
        pandaHprInterval31 = self.Truck[3].hprInterval(3,
                                                       Point3(180, 0, 0),
                                                       startHpr=Point3(
                                                           90, 0, 0))
        pandaHprInterval32 = self.Truck[3].hprInterval(3,
                                                       Point3(90, 0, 0),
                                                       startHpr=Point3(
                                                           180, 0, 0))
        pandaHprInterval33 = self.Truck[3].hprInterval(3,
                                                       Point3(0, 0, 0),
                                                       startHpr=Point3(
                                                           90, 0, 0))
        pandaHprInterval34 = self.Truck[3].hprInterval(3,
                                                       Point3(90, 0, 0),
                                                       startHpr=Point3(
                                                           0, 0, 0))
        #pandaHprInterva5= self.Truck[0].hprInterval(3,Point3(180,0,0), startHpr=Point3(0,0,0))

        #Create and play the sequence that coordinates the intervals
        pandaPace4 = Sequence(pandaHprInterval30,
                              pandaPosInterval31,
                              pandaHprInterval31,
                              pandaPosInterval32,
                              pandaHprInterval32,
                              pandaPosInterval33,
                              pandaHprInterval33,
                              pandaPosInterval34,
                              pandaHprInterval34,
                              pandaPosInterval35,
                              name="pandaPace4")
        pandaPace4.loop()

        pandaPosInterval41 = self.Truck[4].posInterval(12,
                                                       Point3(298, -282, 0),
                                                       startPos=Point3(
                                                           -276, -282, 0))
        pandaPosInterval42 = self.Truck[4].posInterval(12,
                                                       Point3(286, 280, 0),
                                                       startPos=Point3(
                                                           298, -282, 0))
        pandaPosInterval43 = self.Truck[4].posInterval(12,
                                                       Point3(-268, 280, 0),
                                                       startPos=Point3(
                                                           286, 280, 0))
        pandaPosInterval44 = self.Truck[4].posInterval(12,
                                                       Point3(-276, -282, 0),
                                                       startPos=Point3(
                                                           -268, 280, 0))

        #pandaHprInterval30= self.Truck[3].hprInterval(1,Point3(90,0,0), startHpr=Point3(0,0,0))
        pandaHprInterval41 = self.Truck[4].hprInterval(3,
                                                       Point3(-90, 0, 0),
                                                       startHpr=Point3(
                                                           0, 0, 0))
        pandaHprInterval42 = self.Truck[4].hprInterval(3,
                                                       Point3(0, 0, 0),
                                                       startHpr=Point3(
                                                           -90, 0, 0))
        pandaHprInterval43 = self.Truck[4].hprInterval(3,
                                                       Point3(90, 0, 0),
                                                       startHpr=Point3(
                                                           0, 0, 0))
        pandaHprInterval44 = self.Truck[4].hprInterval(3,
                                                       Point3(180, 0, 0),
                                                       startHpr=Point3(
                                                           90, 0, 0))
        #pandaHprInterva5= self.Truck[0].hprInterval(3,Point3(180,0,0), startHpr=Point3(0,0,0))

        #Create and play the sequence that coordinates the intervals
        pandaPace5 = Sequence(pandaHprInterval41,
                              pandaPosInterval41,
                              pandaHprInterval42,
                              pandaPosInterval42,
                              pandaHprInterval43,
                              pandaPosInterval43,
                              pandaHprInterval44,
                              pandaPosInterval44,
                              name="pandaPace5")
        pandaPace5.loop()

        pandaPosInterval51 = self.Truck[5].posInterval(12,
                                                       Point3(-268, 280, 0),
                                                       startPos=Point3(
                                                           286, 280, 0))
        pandaPosInterval52 = self.Truck[5].posInterval(12,
                                                       Point3(-276, -282, 0),
                                                       startPos=Point3(
                                                           -268, 280, 0))
        pandaPosInterval53 = self.Truck[5].posInterval(12,
                                                       Point3(298, -282, 0),
                                                       startPos=Point3(
                                                           -276, -282, 0))
        pandaPosInterval54 = self.Truck[5].posInterval(12,
                                                       Point3(286, 280, 0),
                                                       startPos=Point3(
                                                           298, -282, 0))
        #pandaPosInterval55= self.Truck[5].posInterval(13,Point3(-396,10,0), startPos=Point3(-123,-6,0))
        #pandaPosInterval6=self.Truck[0].posInterval(1,Point3(21,390,0),startPos=Point3(-10,-399,0)
        #pandaHprInterval50= self.Truck[5].hprInterval(1,Point3(90,0,0), startHpr=Point3(0,0,0))
        pandaHprInterval51 = self.Truck[5].hprInterval(3,
                                                       Point3(90, 0, 0),
                                                       startHpr=Point3(
                                                           0, 0, 0))
        pandaHprInterval52 = self.Truck[5].hprInterval(3,
                                                       Point3(180, 0, 0),
                                                       startHpr=Point3(
                                                           90, 0, 0))
        pandaHprInterval53 = self.Truck[5].hprInterval(3,
                                                       Point3(-90, 0, 0),
                                                       startHpr=Point3(
                                                           0, 0, 0))
        pandaHprInterval54 = self.Truck[5].hprInterval(3,
                                                       Point3(0, 0, 0),
                                                       startHpr=Point3(
                                                           -90, 0, 0))
        #pandaHprInterva5= self.Truck[0].hprInterval(3,Point3(180,0,0), startHpr=Point3(0,0,0))

        #Create and play the sequence that coordinates the intervals
        pandaPace6 = Sequence(pandaHprInterval51,
                              pandaPosInterval51,
                              pandaHprInterval52,
                              pandaPosInterval52,
                              pandaHprInterval53,
                              pandaPosInterval53,
                              pandaHprInterval54,
                              pandaPosInterval54,
                              name="pandaPace6")
        pandaPace6.loop()

    def Game_Point(self):

        self.ignore("arrow_down")
        self.ignore("arrow_up")
        self.ignore("arrow_down-repeat")
        self.ignore("arrow_up-repeat")
        #self.text1 = addInstructions(0.5,"Is this Recyclable")
        self.text1 = TextNode('t1')
        self.text1.setText("is This  Recyclable")
        self.text1.setTextColor(0, 0, 0, 1)
        self.textNodePath1 = aspect2d.attachNewNode(self.text1)
        self.textNodePath1.setScale(0.07)
        self.textNodePath1.setPos(-0.1, -0.1, 0.1)
        #text1.setTextColor(1,1,1)
        self.text1.setFrameColor(1, 0, 0, 1)
        self.text1.setFrameAsMargin(0.2, 0.2, 0.1, 0.1)

        self.text2 = TextNode('t2')
        self.text2.setText("Y/N")
        self.text2.setTextColor(0, 0, 0, 1)
        self.textNodePath2 = aspect2d.attachNewNode(self.text2)
        self.textNodePath2.setScale(0.07)
        self.textNodePath2.setPos(0, 0, 0)
        #textNodePath2.setTextColor(1,1,1)
        self.text2.setFrameColor(1, 0, 0, 1)
        self.text2.setFrameAsMargin(0.2, 0.2, 0.1, 0.1)
        self.accept('y', self.answer, [0])
        self.accept('n', self.answer, [1])

    def answer(self, n):
        global Num, cor_ans
        #print self.ans[Num]
        self.accept('arrow_down', self.moved, [0])
        self.accept('arrow_up', self.move, [0])
        self.accept('arrow_down-repeat', self.moved, [1])
        self.accept('arrow_up-repeat', self.move, [1])
        aspect2d.getChildren().detach()
        if n == 0:
            if self.ans[Num] == 'Y':
                cor_ans = cor_ans + 1
        if n == 1:
            if self.ans[Num] == 'N':
                #print "Correct"
                cor_ans = cor_ans + 1
        self.ignore('y')
        self.ignore('n')

        #print "Hello"
    def GameOver(self):

        global cor_ans, time, h
        h = 1
        #print time
        for x in self.render.getChildren():
            x.detachNode()
        self.inst1.destroy()
        self.inst2.destroy()
        self.inst3.destroy()

        self.text3 = TextNode('t1')
        self.text3.setText("Game Over ")
        self.text3.setTextColor(1, 0, 0, 1)
        self.textNodePath3 = aspect2d.attachNewNode(self.text3)
        self.textNodePath3.setScale(0.1)
        self.textNodePath3.setPos(-0.1, -0.1, 0.2)
        #text1.setTextColor(1,1,1)
        #self.text3.setFrameColor(1, 0, 0, 1)
        #self.text3.setFrameAsMargin(0.2, 0.2, 0.1, 0.1)
        self.text5 = TextNode('t1')
        self.text5.setText("Time Taken: " + str(time))
        self.text5.setTextColor(1, 0, 0, 1)
        self.textNodePath5 = aspect2d.attachNewNode(self.text5)
        self.textNodePath5.setScale(0.1)
        self.textNodePath5.setPos(-0.1, -0.1, 0)

        self.text6 = TextNode('t1')
        self.text6.setText("correct answer: " + str(cor_ans))
        self.text6.setTextColor(1, 0, 0, 1)
        self.textNodePath6 = aspect2d.attachNewNode(self.text6)
        self.textNodePath6.setScale(0.1)
        self.textNodePath6.setPos(-0.1, -0.1, -0.2)

        self.text4 = TextNode('t2')
        self.text4.setText("Score: " + str(5000 / time + (cor_ans * 10)))
        self.text4.setTextColor(1, 0, 0, 1)
        self.textNodePath4 = aspect2d.attachNewNode(self.text4)
        self.textNodePath4.setScale(0.1)
        self.textNodePath4.setPos(-0.1, -0.1, -0.4)
示例#16
0
class DistributedGolfSpot(DistributedObject.DistributedObject, FSM.FSM):
    notify = DirectNotifyGlobal.directNotify.newCategory('DistributedGolfSpot')
    positions = ((-45, 100, GolfGlobals.GOLF_BALL_RADIUS),
                 (-15, 100, GolfGlobals.GOLF_BALL_RADIUS),
                 (15, 100, GolfGlobals.GOLF_BALL_RADIUS),
                 (45, 100, GolfGlobals.GOLF_BALL_RADIUS))
    toonGolfOffsetPos = Point3(-2, 0, -GolfGlobals.GOLF_BALL_RADIUS)
    toonGolfOffsetHpr = Point3(-90, 0, 0)
    rotateSpeed = 20
    golfPowerSpeed = base.config.GetDouble('golf-power-speed', 3)
    golfPowerExponent = base.config.GetDouble('golf-power-exponent', 0.75)

    def __init__(self, cr):
        DistributedObject.DistributedObject.__init__(self, cr)
        FSM.FSM.__init__(self, 'DistributedGolfSpot')
        self.boss = None
        self.index = None
        self.avId = 0
        self.toon = None
        self.golfSpotSmoother = SmoothMover()
        self.golfSpotSmoother.setSmoothMode(SmoothMover.SMOn)
        self.smoothStarted = 0
        self.__broadcastPeriod = 0.2
        if self.index > len(self.positions):
            self.notify.error('Invalid index %d' % index)
        self.fadeTrack = None
        self.setupPowerBar()
        self.aimStart = None
        self.golfSpotAdviceLabel = None
        self.changeSeq = 0
        self.lastChangeSeq = 0
        self.controlKeyAllowed = False
        self.flyBallTracks = {}
        self.splatTracks = {}
        self.__flyBallBubble = None
        self.flyBallHandler = None
        self.__flyBallSequenceNum = 0
        self.swingInterval = None
        self.lastHitSequenceNum = -1
        self.goingToReward = False
        self.gotHitByBoss = False
        self.releaseTrack = None
        self.grabTrack = None
        self.restoreScaleTrack = None
        return

    def setBossCogId(self, bossCogId):
        self.bossCogId = bossCogId
        self.boss = base.cr.doId2do[bossCogId]
        self.boss.setGolfSpot(self, self.index)

    def setIndex(self, index):
        self.index = index

    def disable(self):
        DistributedObject.DistributedObject.disable(self)
        self.ignoreAll()

    def delete(self):
        DistributedObject.DistributedObject.delete(self)
        self.ignoreAll()
        self.boss = None
        return

    def announceGenerate(self):
        DistributedObject.DistributedObject.announceGenerate(self)
        self.triggerName = self.uniqueName('trigger')
        self.triggerEvent = 'enter%s' % self.triggerName
        self.smoothName = self.uniqueName('golfSpotSmooth')
        self.golfSpotAdviceName = self.uniqueName('golfSpotAdvice')
        self.posHprBroadcastName = self.uniqueName('golfSpotBroadcast')
        self.ballPowerTaskName = self.uniqueName('updateGolfPower')
        self.adjustClubTaskName = self.uniqueName('adjustClub')
        self.loadAssets()
        self.accept('flyBallHit-%d' % self.index, self.__flyBallHit)

    def loadAssets(self):
        self.root = render.attachNewNode('golfSpot-%d' % self.index)
        self.root.setPos(*self.positions[self.index])
        self.ballModel = loader.loadModel('phase_6/models/golf/golf_ball')
        self.ballColor = VBase4(1, 1, 1, 1)
        if self.index < len(GolfGlobals.PlayerColors):
            self.ballColor = VBase4(*GolfGlobals.PlayerColors[self.index])
            self.ballModel.setColorScale(self.ballColor)
        self.ballModel.reparentTo(self.root)
        self.club = loader.loadModel('phase_6/models/golf/putter')
        self.clubLookatSpot = self.root.attachNewNode('clubLookat')
        self.clubLookatSpot.setY(-(GolfGlobals.GOLF_BALL_RADIUS + 0.1))
        cs = CollisionSphere(0, 0, 0, 1)
        cs.setTangible(0)
        cn = CollisionNode(self.triggerName)
        cn.addSolid(cs)
        cn.setIntoCollideMask(ToontownGlobals.WallBitmask)
        self.trigger = self.root.attachNewNode(cn)
        self.trigger.stash()
        self.hitBallSfx = loader.loadSfx('phase_6/audio/sfx/Golf_Hit_Ball.ogg')

    def cleanup(self):
        if self.swingInterval:
            self.swingInterval.finish()
            self.swingInterval = None
        if self.releaseTrack:
            self.releaseTrack.finish()
            self.releaseTrack = None
        flyTracks = self.flyBallTracks.values()
        for track in flyTracks:
            track.finish()

        if self.fadeTrack:
            self.fadeTrack.finish()
            self.fadeTrack = None
        if self.restoreScaleTrack:
            self.restoreScaleTrack.finish()
            self.restoreScaleTrack = None
        self.root.removeNode()
        self.ballModel.removeNode()
        self.club.removeNode()
        if self.powerBar:
            self.powerBar.destroy()
            self.powerBar = None
        taskMgr.remove(self.triggerName)
        self.boss = None
        return

    def setState(self, state, avId, extraInfo):
        if not self.isDisabled():
            self.gotHitByBoss = extraInfo
            if state == 'C':
                self.demand('Controlled', avId)
            elif state == 'F':
                self.demand('Free')
            elif state == 'O':
                self.demand('Off')
            else:
                self.notify.error('Invalid state from AI: %s' % state)

    def enterOff(self):
        pass

    def exitOff(self):
        pass

    def enterFree(self):
        if self.fadeTrack:
            self.fadeTrack.finish()
            self.fadeTrack = None
        self.restoreScaleTrack = Sequence(Wait(6),
                                          self.getRestoreScaleInterval(),
                                          name='restoreScaleTrack')
        self.restoreScaleTrack.start()
        if self.avId == localAvatar.doId:
            if not self.isDisabled():
                self.ballModel.setAlphaScale(0.3)
                self.ballModel.setTransparency(1)
                taskMgr.doMethodLater(5, self.__allowDetect, self.triggerName)
                self.fadeTrack = Sequence(Func(self.ballModel.setTransparency,
                                               1),
                                          self.ballModel.colorScaleInterval(
                                              0.2, VBase4(1, 1, 1, 0.3)),
                                          name='fadeTrack-enterFree')
                self.fadeTrack.start()
        else:
            self.trigger.unstash()
            self.accept(self.triggerEvent, self.__hitTrigger)
        self.avId = 0
        return

    def exitFree(self):
        if self.fadeTrack:
            self.fadeTrack.finish()
            self.fadeTrack = None
        self.restoreScaleTrack.finish()
        self.restoreScaleTrack = None
        taskMgr.remove(self.triggerName)
        self.ballModel.clearTransparency()
        self.trigger.stash()
        self.ignore(self.triggerEvent)
        return

    def enterControlled(self, avId):
        self.avId = avId
        toon = base.cr.doId2do.get(avId)
        if not toon:
            return
        self.enableControlKey()
        self.toon = toon
        self.grabTrack = self.makeToonGrabInterval(toon)
        if avId == localAvatar.doId:
            self.boss.toCraneMode()
            camera.reparentTo(self.root)
            camera.setPosHpr(0, -10, 3, 0, 0, 0)
            localAvatar.setPos(self.root, self.toonGolfOffsetPos)
            localAvatar.setHpr(self.root, self.toonGolfOffsetHpr)
            localAvatar.sendCurrentPosition()
            self.__enableControlInterface()
            self.startPosHprBroadcast()
            self.accept('exitCrane', self.gotBossZapped)
        self.grabTrack.start()

    def exitControlled(self):
        self.grabTrack.finish()
        del self.grabTrack
        if self.swingInterval:
            self.swingInterval.finish()
            self.swingInterval = None
        if not self.ballModel.isEmpty():
            if self.ballModel.isHidden():
                self.notify.debug('ball is hidden scale =%s' %
                                  self.ballModel.getScale())
            else:
                self.notify.debug('ball is showing scale=%s' %
                                  self.ballModel.getScale())
        if self.toon and not self.toon.isDisabled():
            self.toon.startSmooth()
        self.releaseTrack = self.makeToonReleaseInterval(self.toon)
        self.stopPosHprBroadcast()
        self.stopSmooth()
        if self.avId == localAvatar.doId:
            self.__disableControlInterface()
            if not self.goingToReward:
                camera.reparentTo(base.localAvatar)
                camera.setPos(base.localAvatar.cameraPositions[0][0])
                camera.setHpr(0, 0, 0)
        self.stopAdjustClubTask()
        self.releaseTrack.start()
        self.enableControlKey()
        return

    def __allowDetect(self, task):
        if self.fadeTrack:
            self.fadeTrack.finish()
        self.fadeTrack = Sequence(self.ballModel.colorScaleInterval(
            0.2, self.ballColor),
                                  Func(self.ballModel.clearTransparency),
                                  name='fadeTrack-allowDetect')
        self.fadeTrack.start()
        self.trigger.unstash()
        self.accept(self.triggerEvent, self.__hitTrigger)

    def __hitTrigger(self, event):
        self.d_requestControl()

    def getRestoreScaleInterval(self):
        return Sequence()

    def d_requestControl(self):
        self.sendUpdate('requestControl')

    def d_requestFree(self, gotHitByBoss):
        self.sendUpdate('requestFree', [gotHitByBoss])

    def makeToonGrabInterval(self, toon):
        origPos = toon.getPos(self.root)
        origHpr = toon.getHpr(self.root)
        a = self.accomodateToon(toon)
        newPos = toon.getPos()
        newHpr = toon.getHpr()
        origHpr.setX(PythonUtil.fitSrcAngle2Dest(origHpr[0], newHpr[0]))
        self.notify.debug('toon.setPosHpr %s %s' % (origPos, origHpr))
        toon.setPosHpr(origPos, origHpr)
        walkTime = 0.2
        reach = Sequence()
        if reach.getDuration() < walkTime:
            reach = Sequence(
                ActorInterval(toon,
                              'walk',
                              loop=1,
                              duration=walkTime - reach.getDuration()), reach)
        i = Sequence(
            Parallel(toon.posInterval(walkTime, newPos, origPos),
                     toon.hprInterval(walkTime, newHpr, origHpr), reach),
            Func(toon.stopLookAround))
        if toon == base.localAvatar:
            i.append(Func(self.switchToAnimState, 'GolfPuttLoop'))
        i.append(Func(self.startAdjustClubTask))
        i = Parallel(i, a)
        return i

    def accomodateToon(self, toon):
        toon.wrtReparentTo(self.root)
        toon.setPos(self.toonGolfOffsetPos)
        toon.setHpr(self.toonGolfOffsetHpr)
        return Sequence()

    def switchToAnimState(self, animStateName, forced=False):
        curAnimState = base.localAvatar.animFSM.getCurrentState()
        curAnimStateName = ''
        if curAnimState:
            curAnimStateName = curAnimState.getName()
        if curAnimStateName != animStateName or forced:
            base.localAvatar.b_setAnimState(animStateName)

    def __enableControlInterface(self):
        gui = loader.loadModel('phase_3.5/models/gui/avatar_panel_gui')
        self.closeButton = DirectButton(image=(gui.find('**/CloseBtn_UP'),
                                               gui.find('**/CloseBtn_DN'),
                                               gui.find('**/CloseBtn_Rllvr'),
                                               gui.find('**/CloseBtn_UP')),
                                        relief=None,
                                        scale=2,
                                        text=TTLocalizer.BossbotGolfSpotLeave,
                                        text_scale=0.04,
                                        text_pos=(0, -0.07),
                                        text_fg=VBase4(1, 1, 1, 1),
                                        pos=(1.05, 0, -0.82),
                                        command=self.__exitGolfSpot)
        self.accept('escape', self.__exitGolfSpot)
        self.accept('control', self.__controlPressed)
        self.accept('control-up', self.__controlReleased)
        self.accept('InputState-forward', self.__upArrow)
        self.accept('InputState-reverse', self.__downArrow)
        self.accept('InputState-turnLeft', self.__leftArrow)
        self.accept('InputState-turnRight', self.__rightArrow)
        taskMgr.add(self.__watchControls, 'watchGolfSpotControls')
        taskMgr.doMethodLater(5, self.__displayGolfSpotAdvice,
                              self.golfSpotAdviceName)
        self.arrowVert = 0
        self.arrowHorz = 0
        if self.powerBar:
            self.powerBar.show()
        return

    def __disableControlInterface(self):
        if self.closeButton:
            self.closeButton.destroy()
            self.closeButton = None
        self.__cleanupGolfSpotAdvice()
        self.ignore('escape')
        self.ignore('control')
        self.ignore('control-up')
        self.ignore('InputState-forward')
        self.ignore('InputState-reverse')
        self.ignore('InputState-turnLeft')
        self.ignore('InputState-turnRight')
        self.arrowVert = 0
        self.arrowHorz = 0
        taskMgr.remove('watchGolfSpotControls')
        if self.powerBar:
            self.powerBar.hide()
        else:
            self.notify.debug('self.powerBar is none')
        return

    def setupPowerBar(self):
        self.powerBar = DirectWaitBar(pos=(0.0, 0, -0.94),
                                      relief=DGG.SUNKEN,
                                      frameSize=(-2.0, 2.0, -0.2, 0.2),
                                      borderWidth=(0.02, 0.02),
                                      scale=0.25,
                                      range=100,
                                      sortOrder=50,
                                      frameColor=(0.5, 0.5, 0.5, 0.5),
                                      barColor=(1.0, 0.0, 0.0, 1.0),
                                      text='',
                                      text_scale=0.26,
                                      text_fg=(1, 1, 1, 1),
                                      text_align=TextNode.ACenter,
                                      text_pos=(0, -0.05))
        self.power = 0
        self.powerBar['value'] = self.power
        self.powerBar.hide()

    def resetPowerBar(self):
        self.power = 0
        self.powerBar['value'] = self.power
        self.powerBar['text'] = ''

    def __displayGolfSpotAdvice(self, task):
        if self.golfSpotAdviceLabel == None:
            self.golfSpotAdviceLabel = DirectLabel(
                text=TTLocalizer.BossbotGolfSpotAdvice,
                text_fg=VBase4(1, 1, 1, 1),
                text_align=TextNode.ACenter,
                relief=None,
                pos=(0, 0, 0.69),
                scale=0.1)
        return

    def __cleanupGolfSpotAdvice(self):
        if self.golfSpotAdviceLabel:
            self.golfSpotAdviceLabel.destroy()
            self.golfSpotAdviceLabel = None
        taskMgr.remove(self.golfSpotAdviceName)
        return

    def showExiting(self):
        if self.closeButton:
            self.closeButton.destroy()
            self.closeButton = DirectLabel(
                relief=None,
                text=TTLocalizer.BossbotGolfSpotLeaving,
                pos=(1.05, 0, -0.88),
                text_pos=(0, 0),
                text_scale=0.06,
                text_fg=VBase4(1, 1, 1, 1))
        self.__cleanupGolfSpotAdvice()
        return

    def __exitGolfSpot(self):
        self.d_requestFree(False)

    def __controlPressed(self):
        if self.controlKeyAllowed:
            self.__beginFireBall()

    def __controlReleased(self):
        if self.controlKeyAllowed:
            self.__endFireBall()

    def __upArrow(self, pressed):
        self.__incrementChangeSeq()
        self.__cleanupGolfSpotAdvice()
        if pressed:
            self.arrowVert = 1
        elif self.arrowVert > 0:
            self.arrowVert = 0

    def __downArrow(self, pressed):
        self.__incrementChangeSeq()
        self.__cleanupGolfSpotAdvice()
        if pressed:
            self.arrowVert = -1
        elif self.arrowVert < 0:
            self.arrowVert = 0

    def __rightArrow(self, pressed):
        self.__incrementChangeSeq()
        self.__cleanupGolfSpotAdvice()
        if pressed:
            self.arrowHorz = 1
            self.switchToAnimState('GolfRotateLeft')
        elif self.arrowHorz > 0:
            self.arrowHorz = 0
            self.switchToAnimState('GolfPuttLoop')

    def __leftArrow(self, pressed):
        self.__incrementChangeSeq()
        self.__cleanupGolfSpotAdvice()
        if pressed:
            self.arrowHorz = -1
            self.switchToAnimState('GolfRotateRight')
        elif self.arrowHorz < 0:
            self.arrowHorz = 0
            self.switchToAnimState('GolfPuttLoop')

    def __watchControls(self, task):
        if self.arrowHorz:
            self.__moveGolfSpot(self.arrowHorz)
        return Task.cont

    def __moveGolfSpot(self, xd):
        dt = globalClock.getDt()
        h = self.root.getH() - xd * self.rotateSpeed * dt
        h %= 360
        limitH = h
        self.root.setH(limitH)

    def __incrementChangeSeq(self):
        self.changeSeq = self.changeSeq + 1 & 255

    def __beginFireBall(self):
        if self.aimStart != None:
            return
        if not self.state == 'Controlled':
            return
        if not self.avId == localAvatar.doId:
            return
        time = globalClock.getFrameTime()
        self.aimStart = time
        messenger.send('wakeup')
        taskMgr.add(self.__updateBallPower, self.ballPowerTaskName)
        return

    def __endFireBall(self):
        if self.aimStart == None:
            return
        if not self.state == 'Controlled':
            return
        if not self.avId == localAvatar.doId:
            return
        taskMgr.remove(self.ballPowerTaskName)
        self.disableControlKey()
        messenger.send('wakeup')
        self.aimStart = None
        power = self.power
        angle = self.root.getH()
        self.notify.debug('incrementing self.__flyBallSequenceNum')
        self.__flyBallSequenceNum = (self.__flyBallSequenceNum + 1) % 255
        self.sendSwingInfo(power, angle, self.__flyBallSequenceNum)
        self.setSwingInfo(power, angle, self.__flyBallSequenceNum)
        self.resetPowerBar()
        return

    def __updateBallPower(self, task):
        if not self.powerBar:
            print '### no power bar!!!'
            return task.done
        newPower = self.__getBallPower(globalClock.getFrameTime())
        self.power = newPower
        self.powerBar['value'] = newPower
        return task.cont

    def __getBallPower(self, time):
        elapsed = max(time - self.aimStart, 0.0)
        t = elapsed / self.golfPowerSpeed
        t = math.pow(t, self.golfPowerExponent)
        power = int(t * 100) % 200
        if power > 100:
            power = 200 - power
        return power

    def stopPosHprBroadcast(self):
        taskName = self.posHprBroadcastName
        taskMgr.remove(taskName)

    def startPosHprBroadcast(self):
        taskName = self.posHprBroadcastName
        self.b_clearSmoothing()
        self.d_sendGolfSpotPos()
        taskMgr.remove(taskName)
        taskMgr.doMethodLater(self.__broadcastPeriod, self.__posHprBroadcast,
                              taskName)

    def __posHprBroadcast(self, task):
        self.d_sendGolfSpotPos()
        taskName = self.posHprBroadcastName
        taskMgr.doMethodLater(self.__broadcastPeriod, self.__posHprBroadcast,
                              taskName)
        return Task.done

    def d_sendGolfSpotPos(self):
        timestamp = globalClockDelta.getFrameNetworkTime()
        self.sendUpdate(
            'setGolfSpotPos',
            [self.changeSeq, self.root.getH(), timestamp])

    def setGolfSpotPos(self, changeSeq, h, timestamp):
        self.changeSeq = changeSeq
        if self.smoothStarted:
            now = globalClock.getFrameTime()
            local = globalClockDelta.networkToLocalTime(timestamp, now)
            self.golfSpotSmoother.setH(h)
            self.golfSpotSmoother.setTimestamp(local)
            self.golfSpotSmoother.markPosition()
        else:
            self.root.setH(h)

    def b_clearSmoothing(self):
        self.d_clearSmoothing()
        self.clearSmoothing()

    def d_clearSmoothing(self):
        self.sendUpdate('clearSmoothing', [0])

    def clearSmoothing(self, bogus=None):
        self.golfSpotSmoother.clearPositions(1)

    def doSmoothTask(self, task):
        self.golfSpotSmoother.computeAndApplySmoothHpr(self.root)
        return Task.cont

    def startSmooth(self):
        if not self.smoothStarted:
            taskName = self.smoothName
            taskMgr.remove(taskName)
            self.reloadPosition()
            taskMgr.add(self.doSmoothTask, taskName)
            self.smoothStarted = 1

    def stopSmooth(self):
        if self.smoothStarted:
            taskName = self.smoothName
            taskMgr.remove(taskName)
            self.forceToTruePosition()
            self.smoothStarted = 0

    def makeToonReleaseInterval(self, toon):
        def getSlideToPos(toon=toon):
            return render.getRelativePoint(toon, Point3(0, -5, 0))

        if self.gotHitByBoss:
            grabIval = Sequence(Func(self.detachClub),
                                name='makeToonReleaseInterval-gotHitByBoss')
            if not toon.isEmpty():
                toonIval = Sequence(Func(toon.wrtReparentTo, render),
                                    Parallel(
                                        ActorInterval(toon, 'slip-backward'),
                                        toon.posInterval(0.5,
                                                         getSlideToPos,
                                                         fluid=1)),
                                    name='makeToonReleaseInterval-toonIval')
                grabIval.append(toonIval)
        else:
            grabIval = Sequence(Func(self.detachClub))
            if not toon.isEmpty():
                toonIval = Sequence(
                    Parallel(
                        ActorInterval(toon,
                                      'walk',
                                      duration=1.0,
                                      playRate=-1.0),
                        LerpPosInterval(toon,
                                        duration=1.0,
                                        pos=Point3(-10, 0, 0))),
                    Func(toon.wrtReparentTo, render))
                grabIval.append(toonIval)
        if localAvatar.doId == toon.doId:
            if not self.goingToReward and toon.hp > 0:
                grabIval.append(Func(self.goToFinalBattle))
                grabIval.append(
                    Func(self.notify.debug, 'goingToFinalBattlemode'))
                grabIval.append(Func(self.safeBossToFinalBattleMode))
        return grabIval

    def safeBossToFinalBattleMode(self):
        if self.boss:
            self.boss.toFinalBattleMode()

    def goToFinalBattle(self):
        if self.cr:
            place = self.cr.playGame.getPlace()
            if place and hasattr(place, 'fsm'):
                curState = place.fsm.getCurrentState().getName()
                if place.fsm.getCurrentState().getName() == 'crane':
                    place.setState('finalBattle')
                else:
                    self.notify.debug('NOT going to final battle, state=%s' %
                                      curState)

    def attachClub(self, avId, pointToBall=False):
        club = self.club
        if club:
            av = base.cr.doId2do.get(avId)
            if av:
                av.useLOD(1000)
                lHand = av.getLeftHands()[0]
                club.setPos(0, 0, 0)
                club.reparentTo(lHand)
                netScale = club.getNetTransform().getScale()[1]
                counterActToonScale = lHand.find('**/counteractToonScale')
                if counterActToonScale.isEmpty():
                    counterActToonScale = lHand.attachNewNode(
                        'counteractToonScale')
                    counterActToonScale.setScale(1 / netScale)
                    self.notify.debug('creating counterActToonScale for %s' %
                                      av.getName())
                club.reparentTo(counterActToonScale)
                club.setX(-0.25 * netScale)
                if pointToBall:
                    club.lookAt(self.clubLookatSpot)

    def detachClub(self):
        if not self.club.isEmpty():
            self.club.reparentTo(self.root)
            self.club.setZ(-20)
            self.club.setScale(1)

    def adjustClub(self):
        club = self.club
        if club:
            distance = club.getDistance(self.clubLookatSpot)
            scaleFactor = distance / 2.058
            club.setScale(1, scaleFactor, 1)

    def startAdjustClubTask(self):
        taskMgr.add(self.adjustClubTask, self.adjustClubTaskName)

    def stopAdjustClubTask(self):
        taskMgr.remove(self.adjustClubTaskName)

    def adjustClubTask(self, task):
        self.attachClub(self.avId, True)
        self.adjustClub()
        return task.cont

    def enableControlKey(self):
        self.controlKeyAllowed = True

    def disableControlKey(self):
        self.controlKeyAllowed = False

    def sendSwingInfo(self, power, angle, sequenceNum):
        self.sendUpdate('setSwingInfo', [power, angle, sequenceNum])

    def startBallPlayback(self, power, angle, sequenceNum):
        flyBall = self.ballModel.copyTo(NodePath())
        flyBall.setScale(1.0)
        flyBallBubble = self.getFlyBallBubble().instanceTo(NodePath())
        flyBallBubble.reparentTo(flyBall)
        flyBall.setTag('pieSequence', str(sequenceNum))
        flyBall.setTag('throwerId', str(self.avId))
        t = power / 100.0
        t = 1.0 - t
        dist = 300 - 200 * t
        time = 1.5 + 0.5 * t
        proj = ProjectileInterval(None,
                                  startPos=Point3(0, 0, 0),
                                  endPos=Point3(0, dist, 0),
                                  duration=time)
        relVel = proj.startVel

        def getVelocity(root=self.root, relVel=relVel):
            return render.getRelativeVector(root, relVel)

        fly = Sequence(
            Func(flyBall.reparentTo, render),
            Func(flyBall.setPosHpr, self.root, 0, 0, 0, 0, 0, 0),
            Func(base.cTrav.addCollider, flyBallBubble, self.flyBallHandler),
            ProjectileInterval(flyBall, startVel=getVelocity, duration=3),
            Func(flyBall.detachNode),
            Func(base.cTrav.removeCollider, flyBallBubble),
            Func(self.notify.debug, 'removed collider'),
            Func(self.flyBallFinishedFlying, sequenceNum))
        flyWithSound = Parallel(fly,
                                SoundInterval(self.hitBallSfx, node=self.root),
                                name='flyWithSound')
        self.notify.debug('starting flyball track')
        flyWithSound.start()
        self.flyBallTracks[sequenceNum] = flyWithSound
        return

    def setSwingInfo(self, power, angle, sequenceNum):
        av = base.cr.doId2do.get(self.avId)
        self.swingInterval = Sequence()
        if av:
            self.stopAdjustClubTask()
            self.swingInterval = Sequence(
                ActorInterval(av,
                              'swing-putt',
                              startFrame=0,
                              endFrame=GolfGlobals.BALL_CONTACT_FRAME),
                Func(self.startBallPlayback, power, angle, sequenceNum),
                Func(self.ballModel.hide),
                ActorInterval(av,
                              'swing-putt',
                              startFrame=GolfGlobals.BALL_CONTACT_FRAME,
                              endFrame=24), Func(self.ballModel.setScale, 0.1),
                Func(self.ballModel.show),
                LerpScaleInterval(self.ballModel, 1.0, Point3(1, 1, 1)),
                Func(self.enableControlKey))
            if av == localAvatar:
                self.swingInterval.append(
                    Func(self.switchToAnimState, 'GolfPuttLoop', True))
        self.swingInterval.start()

    def getFlyBallBubble(self):
        if self.__flyBallBubble == None:
            bubble = CollisionSphere(0, 0, 0, GolfGlobals.GOLF_BALL_RADIUS)
            node = CollisionNode('flyBallBubble')
            node.addSolid(bubble)
            node.setFromCollideMask(ToontownGlobals.PieBitmask
                                    | ToontownGlobals.CameraBitmask
                                    | ToontownGlobals.FloorBitmask)
            node.setIntoCollideMask(BitMask32.allOff())
            self.__flyBallBubble = NodePath(node)
            self.flyBallHandler = CollisionHandlerEvent()
            self.flyBallHandler.addInPattern('flyBallHit-%d' % self.index)
        return self.__flyBallBubble

    def __flyBallHit(self, entry):
        print entry

    def flyBallFinishedFlying(self, sequence):
        if self.flyBallTracks.has_key(sequence):
            del self.flyBallTracks[sequence]

    def __finishFlyBallTrack(self, sequence):
        if self.flyBallTracks.has_key(sequence):
            flyBallTrack = self.flyBallTracks[sequence]
            del self.flyBallTracks[sequence]
            flyBallTrack.finish()

    def flyBallFinishedSplatting(self, sequence):
        if self.splatTracks.has_key(sequence):
            del self.splatTracks[sequence]

    def __flyBallHit(self, entry):
        if not entry.hasSurfacePoint() or not entry.hasInto():
            return
        if not entry.getInto().isTangible():
            return
        sequence = int(entry.getFromNodePath().getNetTag('pieSequence'))
        self.__finishFlyBallTrack(sequence)
        if self.splatTracks.has_key(sequence):
            splatTrack = self.splatTracks[sequence]
            del self.splatTracks[sequence]
            splatTrack.finish()
        flyBallCode = 0
        flyBallCodeStr = entry.getIntoNodePath().getNetTag('pieCode')
        if flyBallCodeStr:
            flyBallCode = int(flyBallCodeStr)
        pos = entry.getSurfacePoint(render)
        timestamp32 = globalClockDelta.getFrameNetworkTime(bits=32)
        throwerId = int(entry.getFromNodePath().getNetTag('throwerId'))
        splat = self.getFlyBallSplatInterval(pos[0], pos[1], pos[2],
                                             flyBallCode, throwerId)
        splat = Sequence(splat, Func(self.flyBallFinishedSplatting, sequence))
        self.splatTracks[sequence] = splat
        splat.start()
        self.notify.debug(
            'doId=%d into=%s flyBallCode=%d, throwerId=%d' %
            (self.doId, entry.getIntoNodePath(), flyBallCode, throwerId))
        if flyBallCode == ToontownGlobals.PieCodeBossCog and self.avId == localAvatar.doId and self.lastHitSequenceNum != self.__flyBallSequenceNum:
            self.lastHitSequenceNum = self.__flyBallSequenceNum
            self.boss.d_ballHitBoss(10)
        elif flyBallCode == ToontownGlobals.PieCodeToon and self.avId == localAvatar.doId and self.lastHitSequenceNum != self.__flyBallSequenceNum:
            self.lastHitSequenceNum = self.__flyBallSequenceNum
            avatarDoId = entry.getIntoNodePath().getNetTag('avatarDoId')
            if avatarDoId == '':
                self.notify.warning('Toon %s has no avatarDoId tag.' %
                                    repr(entry.getIntoNodePath()))
                return
            doId = int(avatarDoId)
            if doId != localAvatar.doId:
                pass

    def getFlyBallSplatInterval(self, x, y, z, flyBallCode, throwerId):
        from toontown.toonbase import ToontownBattleGlobals
        from toontown.battle import BattleProps
        splatName = 'dust'
        splat = BattleProps.globalPropPool.getProp(splatName)
        splat.setBillboardPointWorld(2)
        color = ToontownGlobals.PieCodeColors.get(flyBallCode)
        if color:
            splat.setColor(*color)
        if flyBallCode == ToontownGlobals.PieCodeBossCog:
            self.notify.debug('changing color to %s' % self.ballColor)
            splat.setColor(self.ballColor)
        sound = loader.loadSfx('phase_11/audio/sfx/LB_evidence_miss.ogg')
        vol = 1.0
        if flyBallCode == ToontownGlobals.PieCodeBossCog:
            sound = loader.loadSfx('phase_4/audio/sfx/Golf_Hit_Barrier_1.ogg')
        soundIval = SoundInterval(sound, node=splat, volume=vol)
        if flyBallCode == ToontownGlobals.PieCodeBossCog and localAvatar.doId == throwerId:
            vol = 1.0
            soundIval = SoundInterval(sound, node=localAvatar, volume=vol)
        ival = Parallel(
            Func(splat.reparentTo, render), Func(splat.setPos, x, y, z),
            soundIval,
            Sequence(ActorInterval(splat, splatName), Func(splat.detachNode)))
        return ival

    def setGoingToReward(self):
        self.goingToReward = True

    def gotBossZapped(self):
        self.showExiting()
        self.d_requestFree(True)
示例#17
0
class MyApp(ShowBase):
    def __init__(self):
        ShowBase.__init__(self)
	global carx,cary,d,cor_ans,count
 
	self.disableMouse()
        self.Truck=[0]*6	
	self.crate=[0]*10
	self.posc=[0]*30
	self.radX=[0]*60
	self.radY=[0]*60
	self.radZ=[0]*60
	self.sX=[0]*10
	self.sY=[0]*10
	self.sZ=[0]*10
	self.flag=[0]*10
	self.ans=[0]*10
	self.inst1 = addInstructions(0.89, "Correct Answer: "+str(cor_ans))
        self.inst2 = addInstructions(0.95, "Time: "+str(time))
        self.inst3 = addInstructions(0.84, "Waste Reamaining "+str(count/2))

	#self.title = addTitle("Recycle Game By : Sandeep Sharma")
	p = 0
	file = open("ans.txt")
	
	for line in file:
		
    		
		#for p in range(30):
			
			
 			#print line
			line = line.split()
			self.ans[p] = str(line[0])
			
			p=p+1
		#	self.posc[p]= int(line)
		#print self.posc[p]		
		#break
	file.close()	
	p = 0
	file = open("sample.txt")
	
	for line in file:
		
    		
		#for p in range(30):
			
			line = line[0:len(line)-1]
 			#print line
			self.posc[p] = int(line)
			
			p=p+1
		#	self.posc[p]= int(line)
		#print self.posc[p]		
		#break
	file.close()
	p=0
	
	file = open("scale.txt")

        for line in file:


                #for p in range(30):

                        line = line.split()

                        #print line
                        self.sX[p] = float(line[0])
			self.sY[p] = float(line[1])
			self.sZ[p] = float(line[2])
			#print self.radY[p]
                        p=p+1
		
	p = 0
	
	
	file = open("rad.txt")

        for line in file:


                #for p in range(30):

                        line = line.split()

                        #print line
                        self.radX[p] = float(line[0])
			self.radY[p] = float(line[1])
			self.radZ[p] = float(line[2])
			#print self.radY[p]
                        p=p+1
			
                #       self.posc[p]= int(line)
                #print self.posc[p]             
                #break
        file.close()

	self.CornField=self.loader.loadModel("cornfield")
        self.CornField.reparentTo(self.render)
        self.CornField.setScale(1000,1000,0)
        self.CornField.setPos(0,0,-8)
	
	self.WM=self.loader.loadModel("WM/Windmill")
        self.WM.reparentTo(self.render)
        self.WM.setScale(2,2,2)
        self.WM.setPos(354,131,0)
	self.WM.setHpr(180,0,0)
		
	self.F1=self.loader.loadModel("Forest/Forest")
        self.F1.reparentTo(self.render)
        self.F1.setScale(0.8,0.5,0.5)
        self.F1.setPos(-338,-164,0)
	self.F1.setHpr(90,0,0)
	
	self.F2=self.loader.loadModel("Forest/Forest")
        self.F2.reparentTo(self.render)
        self.F2.setScale(0.8,0.5,0.5)
        self.F2.setPos(366,-189,0)
	self.F2.setHpr(90,0,0)

	
	self.castle=self.loader.loadModel("castle")
        self.castle.reparentTo(self.render)
        self.castle.setScale(0.6,0.8,0.5)
        self.castle.setPos(-97,-200,0)
	self.castle.setHpr(90,0,0)
	#print self.castle	

	self.church=self.loader.loadModel("church/Church")
        self.church.reparentTo(self.render)
        self.church.setScale(2.5,2.5,1)
        self.church.setPos(90,-200,0)
	self.church.setHpr(180,0,0)

	self.Temple=self.loader.loadModel("Temple/TempleFort")
        self.Temple.reparentTo(self.render)
        self.Temple.setScale(0.06,0.1,0.18)
        self.Temple.setPos(210,-109,0)

	self.house=self.loader.loadModel("BuildingCluster3")
        self.house.reparentTo(self.render)
        self.house.setScale(1.5,1.5,1)
        self.house.setPos(208,86,0)
	
	self.CityHall=self.loader.loadModel("cityhall/CityHall")
        self.CityHall.reparentTo(self.render)
        self.CityHall.setScale(1.5,1.5,1.5)
        self.CityHall.setPos(-188,-84,0)
 	self.CityHall.setHpr(90,0,0)
	
	self.statue=self.loader.loadModel("statue/statue")
        self.statue.reparentTo(self.render)
        self.statue.setScale(4.5,4.5,3.5)
        self.statue.setPos(-191,105,0)
	self.statue.setHpr(-90,0,0)

	self.FarmHouse=self.loader.loadModel("farmhouse/FarmHouse")
        self.FarmHouse.reparentTo(self.render)
        self.FarmHouse.setScale(2.8,3.5,2.5)
        self.FarmHouse.setPos(-66,209,0)

	self.Fence1=self.loader.loadModel("fence/fence")
        self.Fence1.reparentTo(self.render)
        self.Fence1.setScale(70,1,2)
        self.Fence1.setPos(0,-418,0)
	
	self.Fence2=self.loader.loadModel("fence/fence")
        self.Fence2.reparentTo(self.render)
        self.Fence2.setScale(70,1,2)
        self.Fence2.setPos(0,418,0)
	
	self.Fence3=self.loader.loadModel("fence/fence")
        self.Fence3.reparentTo(self.render)
        self.Fence3.setScale(70,1,2)
        self.Fence3.setPos(-418,0,0)
	self.Fence3.setHpr(90,0,0)

	self.Fence4=self.loader.loadModel("fence/fence")
        self.Fence4.reparentTo(self.render)
        self.Fence4.setScale(70,1,2)
        self.Fence4.setPos(418,0,0)
	self.Fence4.setHpr(90,0,0)
		
	self.CityTerrain=self.loader.loadModel("CityTerrain/CityTerrain")
	self.CityTerrain.reparentTo(self.render)
	self.CityTerrain.setScale(0.5,0.5,0.5)
	self.CityTerrain.setPos(0,0,0)

	self.BeachTerrain=self.loader.loadModel("BeachTerrain/BeachTerrain")
        self.BeachTerrain.reparentTo(self.render)
        self.BeachTerrain.setScale(0.5,0.5,0.5)
        self.BeachTerrain.setPos(200,750,0)
	self.BeachTerrain.setHpr(90,0,0)
	
	self.school=self.loader.loadModel("school/school")
        self.school.reparentTo(self.render)
        self.school.setScale(0.056,0.07,0.05)
        self.school.setPos(-162,-348,0)
        self.school.setHpr(90,0,0)
	
	self.car = Actor("bvw-f2004--jeep/jeep",{"walk": "bvw-f2004--jeep/jeep-start"})
        self.car.setScale(0.5, 0.5, 0.5)
        self.car.reparentTo(self.render)
      	self.car.setPos(carx,cary,-2)
	self.car.setHpr(180,0,0)
	#print self.car      
	for l in range(10):
		self.crate[l] = self.loader.loadModel("model"+str(l+1)+"/crate"+str(l+1)+".egg")
        	self.crate[l].setScale(self.sX[l], self.sY[l], self.sZ[l])
        	self.crate[l].reparentTo(self.render)
        	self.crate[l].setPos(self.posc[3*l],self.posc[3*l + 1],2)
        	self.crate[l].setHpr(0,0,0)
		#self.car.loop("walk")

	#self.car.reparentTo(self.render)
        #self.car.setScale(2,2,2)
        #self.car.setPos(carx,cary,-2)
        #self.car.setHpr(0,0,0)
	

	self.museum = self.loader.loadModel("Museum/Museum")
        self.museum.reparentTo(self.render)
        self.museum.setScale(1,2,1.5)
        self.museum.setPos(100,200,0)
        self.museum.setHpr(180,0,0)
	
	self.PalmTree = self.loader.loadModel("PalmTree/palmtree")
        self.PalmTree.reparentTo(self.render)
        self.PalmTree.setScale(2,2,3.5)
        self.PalmTree.setPos(175,200,0)
        self.PalmTree.setHpr(0,0,0)

	
	self.stadium = self.loader.loadModel("Stadium/stadium")
        self.stadium.reparentTo(self.render)
        self.stadium.setScale(0.5,0.5,0.5)
        self.stadium.setPos(13,0,0)
        self.stadium.setHpr(0,0,0)

	self.Junkyard = self.loader.loadModel("Junkyard")
        self.Junkyard.reparentTo(self.render)
        self.Junkyard.setScale(0.2,0.4,0.3)
        self.Junkyard.setPos(150,-650/2 - 25,0)
        self.Junkyard.setHpr(90,0,0)
	
	self.BB1 = self.loader.loadModel("BuildingCluster1")
        self.BB1.reparentTo(self.render)
        self.BB1.setScale(0.5,0.5,1)
        self.BB1.setPos(-100 - 10,650/2 + 20,0)
        self.BB1.setHpr(270,0,0)
	     
        self.BB2 = self.loader.loadModel("BB2/BuildingCluster2")
        self.BB2.reparentTo(self.render)
        self.BB2.setScale(0.5,0.5,1)
        self.BB2.setPos(-60 - 10,650/2 + 20,0)
	self.BB2.setHpr(270,0,0)

	self.BB3 = self.loader.loadModel("BB3/BuildingCluster3")
        self.BB3.reparentTo(self.render)
        self.BB3.setScale(0.5,0.5,1)
        self.BB3.setPos(-140 - 10,650/2 + 20,0)
        self.BB3.setHpr(270,0,0)

	self.BB4 = self.loader.loadModel("BB4/BuildingCluster4")
        self.BB4.reparentTo(self.render)
        self.BB4.setScale(0.5,0.5,1)
        self.BB4.setPos(-25 - 10,650/2 + 20,0)
	self.BB4.setHpr(270,0,0)

	self.BB5 = self.loader.loadModel("BB5/BuildingCluster5")
        self.BB5.reparentTo(self.render)
        self.BB5.setScale(0.5,0.5,1)
        self.BB5.setPos(-190 - 10,650/2 + 20,0)
	self.BB5.setHpr(270,0,0)

	self.BS = self.loader.loadModel("BS/blue_sky_sphere")
        self.BS.reparentTo(self.render)
        self.BS.setScale(1,1,1)
        self.BS.setPos(-180,0,0)
	
	self.flagMain = self.loader.loadModel("Flag/flag")
        self.flagMain.setScale(0.3,0.3,0.3)
        self.flagMain.reparentTo(self.render)
	self.flagMain.setPos(carx-20,cary,10)
	print self.flagMain

	for i in range (6):
		self.Truck[i] = self.loader.loadModel("bvw-f2004--fireengine/fireengine")
        	self.Truck[i].reparentTo(self.render)
        	self.Truck[i].setScale(2,2,2)
        	##self.Truck[i].setPos(180,0,0)

	#Create the four lerp intervals needed to walk back and forth
	self.setTruck()
		
	#self.City = self.loader.loadModel("City/course2")
        #self.City.reparentTo(self.render)
        #self.City.setScale(2.5,2.5,2.5)
        #self.City.setPos(500,0,0)

	self.accept('arrow_down',self.moved,[0])
        self.accept('arrow_up',self.move,[0])
        self.accept("arrow_left",self.change_dc,[0])
        self.accept("arrow_right",self.change_da,[0])
	
	
	self.accept('arrow_down-up',self.moved,[2])
	self.accept('arrow_up-up',self.move,[2])
	#self.accept("arrow_left-up",self.change_dc,[2])
        #self.accept("arrow_right-up",self.change_da,[2])

	self.accept('arrow_down-repeat',self.moved,[1])
	self.accept('arrow_up-repeat',self.move,[1])
	self.accept("arrow_left-repeat",self.change_dc,[1])
	self.accept("arrow_right-repeat",self.change_da,[1])
	
	base.cTrav = CollisionTraverser()
	
	self.collHandEvent = CollisionHandlerEvent()
        self.collHandEvent.addInPattern('into-%in')
        self.collHandEvent.addOutPattern('outof-%in')
	self.collCount = 0
	sColl = self.initCollisionSphere(self.car,1,1,1, True)
	base.cTrav.addCollider(sColl[0], self.collHandEvent)


	self.accept('into-' + sColl[1] , self.collide)
        #self.accept('outof-' + sColl[1], self.collide4)
	i=0
	for child in render.getChildren():	
		if child != self.CornField and child != camera and child != self.CityTerrain and child!= self.BeachTerrain and child != self.BS and child != self.Fence1 and child != self.Fence2 and child != self.Fence3 and child != self.Fence4:
			#print child
			tColl = self.initCollisionSphere(child,self.radX[i],self.radY[i],self.radZ[i], True)
			base.cTrav.addCollider(tColl[0], self.collHandEvent)
 			#print i
			i=i+1
			
        # Accept the events sent by the collisions.
        		self.accept('into-' + tColl[1] , self.collide)
	for l in range(10):
                self.flag[l] = self.loader.loadModel("Flag/flag")
                self.flag[l].setScale(0.3,0.3,0.3)
                self.flag[l].reparentTo(self.render)

                self.flag[l].setPos(self.posc[3*l],self.posc[3*l + 1],10)


#       	self.accept( 'into-' + sColl[1], self.collide)
	 #self.accept('outof-' + tColl[1], self.collide2)
#	print carx,cary
#	cs = CollisionSphere(0, 0, 0, 10)
#	fromObject = self.car.attachNewNode(CollisionNode('cnode'))
#	fromObject.node().addSolid(cs)
#	fromObject.show()
#	pusher = CollisionHandlerPusher()
#	pusher.addCollider(fromObject, self.car)
#	base.cTrav = CollisionTraverser()
#	base.cTrav.addCollider(fromObject, pusher)
	
	self.taskMgr.add(self.spinCameraTask, "SpinCameraTask")
	
    def collide(self,collEntry):
	global carx,cary,car_def,a,Num,count
	#print "Collide"

	#print collEntry.getFromNodePath().getParent() 
	#for objectc in collEntry:
	for l in range(10):
		#print collEntry.getFromNodePath().getParent()
		if collEntry.getIntoNodePath().getParent() == self.crate[l] :
			collEntry.getIntoNodePath().getParent().remove()
			#print "Baba"
			Num = l
			count = count - 1
			self.flag[l].hide()
			self.Game_Point()
	if str(collEntry.getIntoNodePath().getParent()) ==  "render/flag.egg" and count == 0 and str(collEntry.getFromNodePath().getParent()) == "render/jeepNman_loop_baked":
		#print "here"
		self.GameOver()

   	if str(collEntry.getIntoNodePath().getParent()) == "render/jeepNman_loop_baked"  or str(collEntry.getFromNodePath().getParent()) == "render/jeepNman_loop_baked":
		
		if a==0:

			if self.car.getH() == 45:

                		carx =  carx + car_def
                		cary =  cary - car_def
        		if self.car.getH() == 90:
                		carx = carx + car_def
 
	        	if self.car.getH() == 135:
        	        	carx = carx + car_def
                		cary = cary + car_def
        		if self.car.getH() == 180:
                		cary=cary + car_def
 
		        if self.car.getH() == 225:
        		        carx = carx - car_def
                		cary = cary + car_def
 
        		if self.car.getH() == 270:
                		carx = carx - car_def
 
	        	if self.car.getH() == 315:
        	        	carx =carx - car_def
                		cary= cary - car_def
 
        		if self.car.getH() == 0:
                		cary = cary - car_def
 		if a==1:
			car_def= -1*car_def
			if self.car.getH() == 45:

                        	carx =  carx + car_def
                        	cary =  cary - car_def
                	if self.car.getH() == 90:
                        	carx = carx + car_def

              		if self.car.getH() == 135:
                        	carx = carx + car_def
                        	cary = cary + car_def
                	if self.car.getH() == 180:
                        	cary=cary + car_def

                	if self.car.getH() == 225:
                        	carx = carx - car_def
                        	cary = cary + car_def

                	if self.car.getH() == 270:
                        	carx = carx - car_def

                	if self.car.getH() == 315:
                        	carx =carx - car_def
                      		cary= cary - car_def

                	if self.car.getH() == 0:
                        	cary = cary - car_def

			car_def= -1*car_def
	
#    def collide2(self,collEntry):
#	
#    def collide3(self,collEntry):
#	global carx , cary
#	carx=carx-2
#	cary=cary-2
#    def collide4(self,collEntry):
#	print 4

    def initCollisionSphere(self, obj,setX,setY,setZ, show=False):
        # Get the size of the object for the collision sphere.
        bounds = obj.getChild(0).getBounds()
        center = bounds.getCenter()
        radius = bounds.getRadius() * 0.6
 
        # Create a collision sphere and name it something understandable.
        collSphereStr = 'CollisionHull' + str(self.collCount) + "_" + obj.getName()
        self.collCount += 1
	self.accept('arrow_down',self.moved,[0])
        self.accept('arrow_up',self.move,[0])
        cNode = CollisionNode(collSphereStr)
#	cNode.setScale(3,3,3)
        cNode.addSolid(CollisionSphere(center, radius))
 
        cNodepath = obj.attachNewNode(cNode)
	cNodepath.setScale(setX,setY,setZ)
	#cNodepath.show()
        
 
        # Return a tuple with the collision node and its corrsponding string so
        # that the bitmask can be set.
        return (cNodepath, collSphereStr)	

    def moved(self,i):
	global carx,cary,camx,camy,dis,a
	#print "moved"
	a=1
	if i ==0:
		#print "Hello"
		self.car.loop("walk") 
	if i==2:
		self.car.stop("walk")
	#print "hello",self.car.getH()	
	#print base.camera.getH()
	if carx> -410 and carx<410 and cary>-410 and cary<410:
		if self.car.getH() == 45:

			carx =	carx - car_speed
    			cary =  cary + car_speed
			camx =  carx - dis
			camy = cary  + dis
		if self.car.getH() == 90:
			carx = carx - car_speed
			camx = carx - dis
		if self.car.getH() == 135:
			carx = carx - car_speed
			cary = cary - car_speed
			camx = carx - dis
			camy = cary -dis
		if self.car.getH() == 180:
			cary=cary - car_speed
			camy = cary - dis
		if self.car.getH() == 225:
			carx = carx + car_speed
			cary = cary - car_speed
			camx=carx + dis
			camy=cary - dis
		if self.car.getH() == 270:
			carx = carx + car_speed
			camx =carx + dis
		if self.car.getH() == 315:
			carx =carx +car_speed
			cary= cary +car_speed
			camx=carx + dis
			camy =cary +dis
		if self.car.getH() == 0:
			cary = cary + car_speed
			camy = cary + dis
	
        
	else:
            if carx <= -410:
                carx = carx-1
            if carx >= 410:
                carx = carx+1               
            if cary <= -410:
                cary = cary-1
            if cary >= 410:       
                cary = cary+1        
    def move(self,i):
	global carx,cary,camx,camy,dis,a
	a=0
#	print "move"
#	print carx,cary
	if i ==0:
                
                self.car.loop("walk")
        if i==2:
                self.car.stop("walk")

        #print "hello",self.car.getH()
        #print base.camera.getH()
	if carx>-410 and carx<410 and cary>-410 and cary<410:
        	if self.car.getH() == 45:

                	carx =  carx + car_speed
                	cary =  cary - car_speed
               		camx =  carx + dis
                	camy = cary  - dis
        	if self.car.getH() == 90:
                	carx = carx + car_speed
               	        camx = carx + dis
        	if self.car.getH() == 135:
                	carx = carx + car_speed
                	cary = cary + car_speed
                	camx = carx + dis
               	        camy = cary +dis
        	if self.car.getH() == 180:
                	cary=cary + car_speed
                	camy = cary + dis
        	if self.car.getH() == 225:
                	carx = carx - car_speed
                	cary = cary + car_speed
                	camx=carx - dis
                	camy=cary + dis
        	if self.car.getH() == 270:
                	carx = carx - car_speed
                	camx =carx - dis
        	if self.car.getH() == 315:
                	carx =carx - car_speed
                	cary= cary - car_speed
                	camx=carx - dis
                	camy =cary - dis
        	if self.car.getH() == 0:
                	cary = cary - car_speed
               	 	camy = cary - car_speed	    
	else:
            if carx<=-410:
                carx = carx+1
            if carx>=410:
                carx= carx-1               
            if cary<=-410:
                cary = cary+1
            if cary>=410:       
                cary=cary -1        
#	self.car.loop("walk")

    def change_dc(self,i):
	global d
	#if i ==0:
        #        print "Hello"
        #        self.car.loop("walk")
        #if i==2:
        #        self.car.stop("walk")

	d=d + 45
	d=d % 360
	

	   		
 
    def change_da(self,i):
        global d
	#if i ==0:
        #        print "Hello"
        #        self.car.loop("walk")
        #if i==2:
        #        self.car.stop("walk")

	d = d - 45
        d=d%360
	
        #for j in range(9):
        #	d=d - 5
	#
        #	d=d % 360
	#	self.car.setHpr(d , 0 , 0)
	#	time.sleep(0.1)
	#messenger.send('arrow_up-repeat')	

    def spinCameraTask(self, task):
	global time,carx,cary,d,dis,camx,camy,count,cor_ans
	time = int(task.time)
	#r = d * (pi / 180.0)
	#print carx,cary
	if self.car.getH() == 45:

                camx =  carx - dis
                camy = cary  + dis
        if self.car.getH() == 90:
                camx = carx - 1.41*dis
		camy = cary
        if self.car.getH() == 135:
                camx = carx - dis
                camy = cary -dis
        if self.car.getH() == 180:
                camy = cary - 1.41*dis
		camx =carx
        if self.car.getH() == 225:
                camx=carx + dis
                camy=cary - dis
        if self.car.getH() == 270:
                camx =carx + 1.41*dis
		camy=cary
        if self.car.getH() == 315:
                camx=carx + dis
                camy =cary +dis
        if self.car.getH() == 0:
                camy = cary + 1.41*dis
		camx=carx
	if h==0:
		self.inst1.destroy()
		self.inst2.destroy()
		self.inst3.destroy()
		self.inst1 = addInstructions(0.89, "Correct Answer: "+str(cor_ans))
		self.inst2 = addInstructions(0.95, "Time: "+str(time))
		self.inst3 = addInstructions(0.84, "Waste Reamaining "+str(count/2))

	self.car.setPos(carx,cary,0)
	self.car.setHpr(d , 0 , 0)
	base.camera.setPos(camx ,camy,5)
	base.camera.setHpr(d + 180, 0 , 0)
	
	#base.camera.setPos(0,0,1700)
	#base.camera.setHpr(0, -90 , 0)

	return Task.cont	
#	base.camera.setPos(0,-40,3)
#	return Task.cont
    def setTruck(self):
	pandaPosInterval01= self.Truck[0].posInterval(11,Point3(18,138,0), startPos=Point3(21,390,0))
        pandaPosInterval02= self.Truck[0].posInterval(5,Point3(140,132,0), startPos=Point3(18,138,0))
        pandaPosInterval03= self.Truck[0].posInterval(10,Point3(140,-123,0), startPos=Point3(140,132,0))
        pandaPosInterval04= self.Truck[0].posInterval(5,Point3(-7,-126,0), startPos=Point3(140,-123,0))
        pandaPosInterval05= self.Truck[0].posInterval(11,Point3(-10,-399,0), startPos=Point3(-7,-126,0))
        #pandaPosInterval6=self.Truck[0].posInterval(1,Point3(21,390,0),startPos=Point3(-10,-399,0)
        pandaHprInterval00= self.Truck[0].hprInterval(1,Point3(180,0,0), startHpr=Point3(0,0,0))
	pandaHprInterval01= self.Truck[0].hprInterval(3,Point3(-90,0,0), startHpr=Point3(180,0,0))
        pandaHprInterval02= self.Truck[0].hprInterval(3,Point3(180,0,0), startHpr=Point3(-90,0,0))
        pandaHprInterval03= self.Truck[0].hprInterval(3,Point3(90,0,0), startHpr=Point3(180,0,0))
        pandaHprInterval04= self.Truck[0].hprInterval(3,Point3(180,0,0), startHpr=Point3(90,0,0))
        #pandaHprInterval5= self.Truck[0].hprInterif collEntry.getIntoNodePath().getParent() == self.crate[l]:val(3,Point3(180,0,0), startHpr=Point3(0,0,0))


#Create and play the sequence that coordinates the intervals
        pandaPace0 = Sequence(pandaHprInterval00,pandaPosInterval01, pandaHprInterval01,
        pandaPosInterval02, pandaHprInterval02,pandaPosInterval03,pandaHprInterval03,pandaPosInterval04,pandaHprInterval04,pandaPosInterval05, name = "pandaPace0")
        pandaPace0.loop()        
 
	pandaPosInterval11= self.Truck[1].posInterval(11,Point3(-126,14,0), startPos=Point3(-411,14,0))
        pandaPosInterval12= self.Truck[1].posInterval(5,Point3(-117,145,0), startPos=Point3(-126,14,0))
        pandaPosInterval13= self.Truck[1].posInterval(10,Point3(148,130,0), startPos=Point3(-117,145,0))
        pandaPosInterval14= self.Truck[1].posInterval(5,Point3(145,-5,0), startPos=Point3(148,130,0))
        pandaPosInterval15= self.Truck[1].posInterval(11,Point3(394,-8,0), startPos=Point3(145,-5,0))
        #pandaPosInterval6=self.Truck[0].posInterval(1,Point3(21,390,0),startPos=Point3(-10,-399,0)
	pandaHprInterval10= self.Truck[1].hprInterval(1,Point3(-90,0,0), startHpr=Point3(0,0,0))
        pandaHprInterval11= self.Truck[1].hprInterval(3,Point3(0,0,0), startHpr=Point3(-90,0,0))
        pandaHprInterval12= self.Truck[1].hprInterval(3,Point3(-90,0,0), startHpr=Point3(0,0,0))
        pandaHprInterval13= self.Truck[1].hprInterval(3,Point3(180,0,0), startHpr=Point3(-90,0,0))
        pandaHprInterval14= self.Truck[1].hprInterval(3,Point3(-90,0,0), startHpr=Point3(180,0,0))
        #pandaHprInterval5= self.Truck[0].hprInterval(3,Point3(180,0,0), startHpr=Point3(0,0,0))


#Create and play the sequence that coordinates the intervals
        pandaPace1 = Sequence(pandaHprInterval10,pandaPosInterval11, pandaHprInterval11,
        pandaPosInterval12, pandaHprInterval12,pandaPosInterval13,pandaHprInterval13,pandaPosInterval14,pandaHprInterval14,pandaPosInterval15, name = "pandaPace1")
        pandaPace1.loop()
	
	pandaPosInterval21= self.Truck[2].posInterval(11,Point3(-9,-144,0), startPos=Point3(-6,-358,0))
        pandaPosInterval22= self.Truck[2].posInterval(5,Point3(-129,-137,0), startPos=Point3(-9,-144,0))
        pandaPosInterval23= self.Truck[2].posInterval(10,Point3(-129,142,0), startPos=Point3(-129,-137,0))
        pandaPosInterval24= self.Truck[2].posInterval(5,Point3(5,145,0), startPos=Point3(-129,142,0))
        pandaPosInterval25= self.Truck[2].posInterval(11,Point3(20,395,0), startPos=Point3(5,145,0))
        #pandaPosInterval6=self.Truck[0].posInterval(1,Point3(21,390,0),startPos=Point3(-10,-399,0)
	pandaHprInterval20= self.Truck[2].hprInterval(1,Point3(0,0,0), startHpr=Point3(0,0,0))
        pandaHprInterval21= self.Truck[2].hprInterval(3,Point3(90,0,0), startHpr=Point3(0,0,0))
        pandaHprInterval22= self.Truck[2].hprInterval(3,Point3(0,0,0), startHpr=Point3(90,0,0))
        pandaHprInterval23= self.Truck[2].hprInterval(3,Point3(-90,0,0), startHpr=Point3(0,0,0))
        pandaHprInterval24= self.Truck[2].hprInterval(3,Point3(0,0,0), startHpr=Point3(-90,0,0))
        #pandaHprInterval5= self.Truck[0].hprInterval(3,Point3(180,0,0), startHpr=Point3(0,0,0))


#Create and play the sequence that coordinates the intervals
        pandaPace2 = Sequence(pandaHprInterval20,pandaPosInterval21, pandaHprInterval21,
        pandaPosInterval22, pandaHprInterval22,pandaPosInterval23,pandaHprInterval23,pandaPosInterval24,pandaHprInterval24,pandaPosInterval25, name = "pandaPace2")
        pandaPace2.loop()
	
	pandaPosInterval31= self.Truck[3].posInterval(11,Point3(150,-18,0), startPos=Point3(408,-18,0))
        pandaPosInterval32= self.Truck[3].posInterval(5,Point3(147,-135,0), startPos=Point3(150,-18,0))
        pandaPosInterval33= self.Truck[3].posInterval(10,Point3(-120,-138,0), startPos=Point3(147,-135,0))
        pandaPosInterval34= self.Truck[3].posInterval(5,Point3(-123,-6,0), startPos=Point3(-120,-138,0))
        pandaPosInterval35= self.Truck[3].posInterval(11,Point3(-396,10,0), startPos=Point3(-123,-6,0))
        #pandaPosInterval6=self.Truck[0].posInterval(1,Point3(21,390,0),startPos=Point3(-10,-399,0)
	pandaHprInterval30= self.Truck[3].hprInterval(1,Point3(90,0,0), startHpr=Point3(0,0,0))
        pandaHprInterval31= self.Truck[3].hprInterval(3,Point3(180,0,0), startHpr=Point3(90,0,0))
        pandaHprInterval32= self.Truck[3].hprInterval(3,Point3(90,0,0), startHpr=Point3(180,0,0))
        pandaHprInterval33= self.Truck[3].hprInterval(3,Point3(0,0,0), startHpr=Point3(90,0,0))
        pandaHprInterval34= self.Truck[3].hprInterval(3,Point3(90,0,0), startHpr=Point3(0,0,0))
        #pandaHprInterva5= self.Truck[0].hprInterval(3,Point3(180,0,0), startHpr=Point3(0,0,0))


#Create and play the sequence that coordinates the intervals
        pandaPace4 = Sequence(pandaHprInterval30,pandaPosInterval31, pandaHprInterval31,
        pandaPosInterval32, pandaHprInterval32,pandaPosInterval33,pandaHprInterval33,pandaPosInterval34,pandaHprInterval34,pandaPosInterval35, name = "pandaPace4")
        pandaPace4.loop()
	
	pandaPosInterval41= self.Truck[4].posInterval(12,Point3(298,-282,0), startPos=Point3(-276,-282,0))
        pandaPosInterval42= self.Truck[4].posInterval(12,Point3(286,280,0), startPos=Point3(298,-282,0))
        pandaPosInterval43= self.Truck[4].posInterval(12,Point3(-268,280,0), startPos=Point3(286,280,0))
        pandaPosInterval44= self.Truck[4].posInterval(12,Point3(-276,-282,0), startPos=Point3(-268,280,0))
        
        #pandaHprInterval30= self.Truck[3].hprInterval(1,Point3(90,0,0), startHpr=Point3(0,0,0))
        pandaHprInterval41= self.Truck[4].hprInterval(3,Point3(-90,0,0), startHpr=Point3(0,0,0))
        pandaHprInterval42= self.Truck[4].hprInterval(3,Point3(0,0,0), startHpr=Point3(-90,0,0))
        pandaHprInterval43= self.Truck[4].hprInterval(3,Point3(90,0,0), startHpr=Point3(0,0,0))
        pandaHprInterval44= self.Truck[4].hprInterval(3,Point3(180,0,0), startHpr=Point3(90,0,0))
        #pandaHprInterva5= self.Truck[0].hprInterval(3,Point3(180,0,0), startHpr=Point3(0,0,0))


#Create and play the sequence that coordinates the intervals
        pandaPace5 = Sequence(pandaHprInterval41,pandaPosInterval41, pandaHprInterval42,
        pandaPosInterval42, pandaHprInterval43,pandaPosInterval43,pandaHprInterval44,pandaPosInterval44, name = "pandaPace5")
        pandaPace5.loop()
	
	pandaPosInterval51= self.Truck[5].posInterval(12,Point3(-268,280,0), startPos=Point3(286,280,0))
        pandaPosInterval52= self.Truck[5].posInterval(12,Point3(-276,-282,0), startPos=Point3(-268,280,0))
        pandaPosInterval53= self.Truck[5].posInterval(12,Point3(298,-282,0), startPos=Point3(-276,-282,0))
        pandaPosInterval54= self.Truck[5].posInterval(12,Point3(286,280,0), startPos=Point3(298,-282,0))
        #pandaPosInterval55= self.Truck[5].posInterval(13,Point3(-396,10,0), startPos=Point3(-123,-6,0))
        #pandaPosInterval6=self.Truck[0].posInterval(1,Point3(21,390,0),startPos=Point3(-10,-399,0)
        #pandaHprInterval50= self.Truck[5].hprInterval(1,Point3(90,0,0), startHpr=Point3(0,0,0))
        pandaHprInterval51= self.Truck[5].hprInterval(3,Point3(90,0,0), startHpr=Point3(0,0,0))
        pandaHprInterval52= self.Truck[5].hprInterval(3,Point3(180,0,0), startHpr=Point3(90,0,0))
        pandaHprInterval53= self.Truck[5].hprInterval(3,Point3(-90,0,0), startHpr=Point3(0,0,0))
        pandaHprInterval54= self.Truck[5].hprInterval(3,Point3(0,0,0), startHpr=Point3(-90,0,0))
        #pandaHprInterva5= self.Truck[0].hprInterval(3,Point3(180,0,0), startHpr=Point3(0,0,0))


#Create and play the sequence that coordinates the intervals
        pandaPace6 = Sequence(pandaHprInterval51,pandaPosInterval51, pandaHprInterval52,
        pandaPosInterval52, pandaHprInterval53,pandaPosInterval53,pandaHprInterval54,pandaPosInterval54, name = "pandaPace6")
        pandaPace6.loop()
	
    def Game_Point(self):
	
		
	self.ignore("arrow_down")	
	self.ignore("arrow_up")
	self.ignore("arrow_down-repeat")
	self.ignore("arrow_up-repeat")
	#self.text1 = addInstructions(0.5,"Is this Recyclable")
	self.text1 = TextNode('t1')
	self.text1.setText("is This  Recyclable")
	self.text1.setTextColor(0,0,0,1)
	self.textNodePath1 = aspect2d.attachNewNode(self.text1)
	self.textNodePath1.setScale(0.07)
	self.textNodePath1.setPos(-0.1,-0.1,0.1) 	
	#text1.setTextColor(1,1,1)
	self.text1.setFrameColor(1, 0, 0, 1)
	self.text1.setFrameAsMargin(0.2, 0.2, 0.1, 0.1)	

	self.text2 = TextNode('t2')
        self.text2.setText("Y/N")
        self.text2.setTextColor(0,0,0,1)
	self.textNodePath2 = aspect2d.attachNewNode(self.text2)
        self.textNodePath2.setScale(0.07)
        self.textNodePath2.setPos(0,0,0) 
	#textNodePath2.setTextColor(1,1,1) 
        self.text2.setFrameColor(1, 0, 0, 1)
        self.text2.setFrameAsMargin(0.2, 0.2, 0.1, 0.1)
	self.accept('y',self.answer,[0])
        self.accept('n',self.answer,[1])
  
    def answer(self,n):
	global Num,cor_ans
	#print self.ans[Num]
	self.accept('arrow_down',self.moved,[0])
        self.accept('arrow_up',self.move,[0])
	self.accept('arrow_down-repeat',self.moved,[1])
	self.accept('arrow_up-repeat',self.move,[1])
	aspect2d.getChildren().detach()
	if n == 0:
		if self.ans[Num] == 'Y':
			cor_ans = cor_ans + 1
	if n == 1:
		if self.ans[Num] == 'N':
			#print "Correct"
			cor_ans = cor_ans + 1
	self.ignore('y')
	self.ignore('n')

	#print "Hello"
    def GameOver(self):
	
	global cor_ans,time,h
	h=1
	#print time
	for x in self.render.getChildren():
		x.detachNode()
	self.inst1.destroy()
	self.inst2.destroy()
	self.inst3.destroy()
	
	self.text3 = TextNode('t1')
	self.text3.setText("Game Over ")
	self.text3.setTextColor(1,0,0,1)
	self.textNodePath3 = aspect2d.attachNewNode(self.text3)
	self.textNodePath3.setScale(0.1)
	self.textNodePath3.setPos(-0.1,-0.1,0.2) 	
	#text1.setTextColor(1,1,1)
	#self.text3.setFrameColor(1, 0, 0, 1)
	#self.text3.setFrameAsMargin(0.2, 0.2, 0.1, 0.1)	
	self.text5 = TextNode('t1')
	self.text5.setText("Time Taken: "+ str(time))
	self.text5.setTextColor(1,0,0,1)
	self.textNodePath5 = aspect2d.attachNewNode(self.text5)
	self.textNodePath5.setScale(0.1)
	self.textNodePath5.setPos(-0.1,-0.1,0)
	
	self.text6 = TextNode('t1')
	self.text6.setText("correct answer: " + str(cor_ans))
	self.text6.setTextColor(1,0,0,1)
	self.textNodePath6 = aspect2d.attachNewNode(self.text6)
	self.textNodePath6.setScale(0.1)
	self.textNodePath6.setPos(-0.1,-0.1,-0.2)

	self.text4 = TextNode('t2')
        self.text4.setText("Score: " + str(5000/time + (cor_ans * 10)))
        self.text4.setTextColor(1,0,0,1)
	self.textNodePath4 = aspect2d.attachNewNode(self.text4)
        self.textNodePath4.setScale(0.1)
        self.textNodePath4.setPos(-0.1,-0.1,-0.4) 
示例#18
0
class CollisionManager:
    def __init__(self):
        self.line_dir = NodePath()

        base.cTrav = CollisionTraverser()
        self.col_handler = CollisionHandlerEvent()

        picker_node = CollisionNode("mouseRayNode")
        pickerNPos = base.camera.attachNewNode(picker_node)
        self.pickerRay = CollisionRay()
        picker_node.addSolid(self.pickerRay)

        plane_node = CollisionNode("base_plane")
        plane = base.render.attachNewNode(plane_node)
        self.plane_col = CollisionPlane(Plane(Vec3(0, 0, 1), Point3(0, 0, 0)))
        picker_node.addSolid(self.pickerRay)


        picker_node.setTag("rays","mray")
        base.cTrav.addCollider(pickerNPos, self.col_handler)

        self.col_handler.addInPattern("%(rays)ft-into-%(type)it")
        self.col_handler.addOutPattern("%(rays)ft-out-%(type)it")
        self.col_handler.addAgainPattern("ray_again_all%(""rays"")fh%(""type"")ih")

        self.model = loader.loadModel("../models/chest.egg")
        self.model_node = NodePath("sdfafd")
        self.model.reparentTo(self.model_node)
        self.model_node.reparentTo(render)
#
#        self.text_node = TextNode("battle_text")
#        self.text_node.setText("TEXTYTEXTYTEXTTEXT")
#        self.text_node_path = render.attachNewNode(self.text_node)
#        self.text_node_path.reparentTo(render)
#        self.text_node_path.setPos(0,0,4)
#        self.text_node_path.setHpr(0,0,0)
#        self.text_node_path.setScale(1)
#        #self.text_node_path.setTransparency(TransparencyAttrib.MAlpha)
#        self.text_node.setTextColor((1,1,1,1))
#        self.text_node.setAlign(TextNode.ALeft)

        self.placement_ghost = EditorObjects.PlacementGhost(0,"tower",base.object_scale)

        z=0
        self.plane = Plane(Vec3(0, 0, 1), Point3(0, 0, z))

        taskMgr.add(self.ray_update, "updatePicker")
        taskMgr.add(self.get_mouse_plane_pos, "MousePositionOnPlane")
        taskMgr.add(self.task_mouse_press_check, "checkMousePress")

        self.input_init()

        self.pickable=None

    def input_init(self):
        self.DO=DirectObject()

        self.DO.accept('mouse1', self.mouse_click, ["1-down"])
        self.DO.accept('mouse1-up', self.mouse_click, ["1-up"])
        self.DO.accept('mouse3', self.mouse_click, ["3-down"])

        self.DO.accept('0', self.placement_ghost.change_player, [0])
        self.DO.accept('1', self.placement_ghost.change_player, [1])
        self.DO.accept('2', self.placement_ghost.change_player, [2])

        self.DO.accept('a', self.placement_ghost.change_type, ["army"])
        self.DO.accept('t', self.placement_ghost.change_type, ["tower"])

        self.DO.accept('control-s', base.xml_manager.save)

        self.DO.accept('mray-into-army', self.col_in_object)
        self.DO.accept('mray-out-army', self.col_out_object)
        self.DO.accept('mray-into-tower', self.col_in_object)
        self.DO.accept('mray-out-tower', self.col_out_object)

        self.DO.accept('ray_again_all', self.col_against_object)

    def col_against_object(self,entry):
        if entry.getIntoNodePath().getParent() != self.pickable:

            np_from=entry.getFromNodePath()
            np_into=entry.getIntoNodePath()
            self.selected_type = np_into.getTag("type")

            self.pickable = np_into.getParent()

    def col_in_object(self,entry):
        if base.state == "selecting":
            np_into=entry.getIntoNodePath()
            np_into.getParent().setColor(0.5,0.5,0.5,1)

    def col_out_object(self,entry):
        np_into=entry.getIntoNodePath()
        try:
            np_into.getParent().clearColor()
        except:
            print "ERROR CLEARING COLOUR"

    def get_mouse_plane_pos(self, task):
        if base.mouseWatcherNode.hasMouse():
            mpos = base.mouseWatcherNode.getMouse()
            self.pos3d = Point3()
            nearPoint = Point3()
            farPoint = Point3()
            base.camLens.extrude(mpos, nearPoint, farPoint)
            if self.plane.intersectsLine(self.pos3d,
                render.getRelativePoint(camera, nearPoint),
                render.getRelativePoint(camera, farPoint)):
                #print "Mouse ray intersects ground plane at ", self.pos3d
                self.model_node.setPos(render, self.pos3d)
                self.placement_ghost.set_position(self.pos3d[0],self.pos3d[1])
        return task.again

    def ray_update(self,task):
        if base.mouseWatcherNode.hasMouse():
            mpos = base.mouseWatcherNode.getMouse()

            self.pickerRay.setFromLens(base.camNode, mpos.getX(),mpos.getY())
        return task.cont

    def task_mouse_place(self,task):
        if base.mouseWatcherNode.isButtonDown(MouseButton.one()):
            self.placing_object = True
            self.place_pos = (self.anchor_x,self.anchor_y)
            self.line_dir.remove()
            ls = LineSegs()
            ls.move_to(self.anchor_x,self.anchor_y,1)
            ls.draw_to(self.model.getX(),self.model.getY(),1)
            node = ls.create()
            angle1 = math.atan2(self.anchor_y - self.anchor_y,self.anchor_x - self.anchor_x+50)
            angle2 = math.atan2(self.anchor_y - self.model.getY(),self.anchor_x - self.model.getY());
            final_angle = angle1-angle2;
            self.model.setHpr(final_angle,0,0)
            self.line_dir = NodePath(node)
            self.line_dir.reparentTo(render)
            return task.again
        else:
            self.line_dir.hide()
            taskMgr.add(self.task_mouse_press_check, "checkMousePress")
            return task.done

    def task_mouse_press_check(self,task):
        if base.mouseWatcherNode.isButtonDown(MouseButton.one()):
            #if self.multi_select == True:
                self.anchor_x,self.anchor_y = self.model.getX(),self.model.getY()
                taskMgr.add(self.task_mouse_place, "multibox")
                return task.done
        return task.again

    def mouse_click(self,status):
        print base.state
        if status == "1-down":
            if base.state == "placement":
                if self.placement_ghost.get_type() == "tower":
                    obj = self.placement_ghost.place("tower",self.model.getX(),self.model.getY())
                elif self.placement_ghost.get_type() == "army":
                    obj = self.placement_ghost.place("army",self.model.getX(),self.model.getY())
                base.details_box.set_object(obj)
                base.change_state("modifying")
            elif base.state == "moving":
                obj = base.details_box.get_object()
                obj.set_position(self.pos3d[0],self.pos3d[1])
                base.change_state("modifying")
            elif base.state == "selecting" and self.pickable != None:
                obj = base.get_obj_from_node(self.pickable)
                base.details_box.set_object(obj,"selecting")
                base.change_state("modifying")
        elif status == "1-up":
            print "Mouse",status
        elif status == "3-down":
            if base.state == "placement":
                base.change_state("selecting")
            elif base.state == "selecting":
                base.change_state("placement")
示例#19
0
from pandac.PandaModules import CollisionHandlerEvent, CollisionNode, CollisionTraverser, CollisionRay
from pandaImports import DirectObject
from tower import *



'''This file handles all the collision events 
   of our game
'''
#base.cTrav maintains a list of colliders of all solid objects in the world to check collisions (runs every frame)
base.cTrav=CollisionTraverser()

#collisionHandler specifies what to do when a collision event is detected
collisionHandler = CollisionHandlerEvent()
#"In" event: when there is a collision in the current frame, but it didn't in the previous frame 
collisionHandler.addInPattern('%fn-into-%in')
#"Again" event: when there is a collision in the current frame, the same that happened in the previous frame
collisionHandler.addAgainPattern('%fn-again-%in')
#"Out" event: when there isn't a collision in the current frame, but there was in the previous frame
collisionHandler.addOutPattern('%fn-out-%in')

#self.collision3DPoint is the point where the collision occurs
collision3DPoint = [0,0,0]

#self.addCollider(mousePicking.pickerNP)
#self.addCollider(player.getTower(-1).troop.troopModel.troopColliderNP)


DO = DirectObject()

	
示例#20
0
class FreeBLiTZ(ShowBase):
    def __init__(self):
        from pandac.PandaModules import CollisionHandlerFloor, CollisionHandlerPusher, CollisionHandlerEvent, CollisionTraverser
        from pandac.PandaModules import DirectionalLight, AmbientLight, VBase4
        ShowBase.__init__(self)

        self.sky = self.loader.loadModel('models/sky-sphere')
        self.sky.reparentTo(self.render)
        self.stage = self.loader.loadModel('models/test-collide')
        self.stage.reparentTo(self.render)
        self.floor = self.stage.findAllMatches('**/=CollideType=floor')
        self.floor.setCollideMask(FLOOR_MASK)
        self.obstacles = self.stage.findAllMatches('**/=CollideType=obstacle')
        if self.obstacles:
            self.obstacles.setCollideMask(OBSTACLE_MASK)
        self.zones = self.stage.findAllMatches('**/=CollideType=zone')
        if self.zones:
            self.zones.setCollideMask(ZONE_MASK)
        self.create_stanchions()

        # Character rig, which allows camera to follow character
        self.char_rig = self.stage.attachNewNode('char_rig')

        self.active_char = Character('mainchar', self.char_rig)

        self.cam.reparentTo(self.char_rig)
        self.cam.setPos(0.5, -3, 1.5)
        self.cam.lookAt(0.5, 0, 1.5)

        self.light = DirectionalLight('dlight')
        self.light.setColor(VBase4(0.3, 0.28, 0.26, 1.0))
        self.lightNP = self.stage.attachNewNode(self.light)
        self.lightNP.setHpr(-75, -45, 0)
        self.stage.setLight(self.lightNP)

        self.amblight = AmbientLight('amblight')
        self.amblight.setColor(VBase4(0.7, 0.68, 0.66, 1.0))
        self.amblightNP = self.stage.attachNewNode(self.amblight)
        self.stage.setLight(self.amblightNP)

        self.accept('w', self.active_char.begin_forward)
        self.accept('a', self.active_char.begin_left)
        self.accept('s', self.active_char.begin_backward)
        self.accept('d', self.active_char.begin_right)
        self.accept('w-up', self.active_char.end_forward)
        self.accept('a-up', self.active_char.end_left)
        self.accept('s-up', self.active_char.end_backward)
        self.accept('d-up', self.active_char.end_right)
        self.taskMgr.add(self.active_char.MoveTask, 'MoveTask')

        self.look = False
        self.prev_pos = None
        self.accept('mouse2', self.begin_look)
        self.accept('mouse2-up', self.end_look)
        self.accept('mouse3', self.active_char.begin_spin)
        self.accept('mouse3-up', self.active_char.end_spin)
        self.taskMgr.add(self.MouseTask, 'MouseTask')

        self.floor_handler = CollisionHandlerFloor()
        self.floor_handler.addCollider(self.active_char.actor_from_floor,
                                       self.char_rig)
        self.wall_handler = CollisionHandlerPusher()
        self.wall_handler.addCollider(self.active_char.actor_from_obstacle,
                                      self.char_rig)
        self.zone_handler = CollisionHandlerEvent()
        self.zone_handler.addInPattern('%fn-into')
        self.zone_handler.addOutPattern('%fn-out')

        def foo(entry):
            print 'You are in the zone'

        def bar(entry):
            print 'You are not in the zone'

        self.accept('blockchar_zone-into', foo)
        self.accept('blockchar_zone-out', bar)
        self.cTrav = CollisionTraverser('main traverser')
        self.cTrav.setRespectPrevTransform(True)
        self.cTrav.addCollider(self.active_char.actor_from_floor,
                               self.floor_handler)
        self.cTrav.addCollider(self.active_char.actor_from_obstacle,
                               self.wall_handler)
        self.cTrav.addCollider(self.active_char.actor_from_zone,
                               self.zone_handler)
        #self.cTrav.showCollisions(self.stage)

    def create_stanchions(self):
        from pandac.PandaModules import GeomVertexReader, CollisionNode, CollisionTube
        self.stanchions = self.stage.findAllMatches('**/=Stanchion')
        for stanchion in self.stanchions:
            geomnode = stanchion.node()
            radius = float(stanchion.getTag('Stanchion'))
            geom = geomnode.getGeom(0)
            vdata = geom.getVertexData()
            for gp in range(geom.getNumPrimitives()):
                vreader = GeomVertexReader(vdata, 'vertex')
                prim = geom.getPrimitive(gp)
                prim = prim.decompose()
                for p in range(prim.getNumPrimitives()):
                    start = prim.getPrimitiveStart(p)
                    end = prim.getPrimitiveEnd(p)
                    vertices = []
                    for v in range(start, end):
                        vi = prim.getVertex(v)
                        vreader.setRow(vi)
                        vertex = vreader.getData3f()
                        vertices.append(vertex)
                    vertices.append(vertices[0])
                    for i in range(1, len(vertices)):
                        a, b = vertices[i - 1], vertices[i]
                        stanchion_np = stanchion.attachNewNode(
                            CollisionNode('stanchion'))
                        print 'creating cyl with radius %f from %s to %s' % (
                            radius, a, b)
                        stanchion_np.node().addSolid(
                            CollisionTube(a[0], a[1], a[2], b[0], b[1], b[2],
                                          radius))
                        stanchion_np.node().setFromCollideMask(OBSTACLE_MASK)
            geomnode.removeAllGeoms()

    def begin_look(self):
        self.look = True

    def end_look(self):
        self.look = False
        self.prev_pos = None

    def MouseTask(self, task):
        if self.mouseWatcherNode.hasMouse():
            (x, y) = self.mouseWatcherNode.getMouse()
            if self.prev_pos:
                if self.look or self.active_char.spinning:
                    h_diff = (x - self.prev_pos[0]) * 180
                    p_diff = (y - self.prev_pos[1]) * 90
                    new_h = clamp_deg_sign(self.char_rig.getH() - h_diff)
                    self.char_rig.setH(new_h)
                    self.cam.setP(self.cam.getP() + p_diff)
                    self.active_char.spin(new_h)
            self.prev_pos = (x, y)
        return task.cont
示例#21
0
from pandac.PandaModules import CollisionHandlerEvent, CollisionNode, CollisionTraverser, CollisionRay
from pandaImports import DirectObject
from tower import *
'''This file handles all the collision events 
   of our game
'''
#base.cTrav maintains a list of colliders of all solid objects in the world to check collisions (runs every frame)
base.cTrav = CollisionTraverser()

#collisionHandler specifies what to do when a collision event is detected
collisionHandler = CollisionHandlerEvent()
#"In" event: when there is a collision in the current frame, but it didn't in the previous frame
collisionHandler.addInPattern('%fn-into-%in')
#"Again" event: when there is a collision in the current frame, the same that happened in the previous frame
collisionHandler.addAgainPattern('%fn-again-%in')
#"Out" event: when there isn't a collision in the current frame, but there was in the previous frame
collisionHandler.addOutPattern('%fn-out-%in')

#self.collision3DPoint is the point where the collision occurs
collision3DPoint = [0, 0, 0]

#self.addCollider(mousePicking.pickerNP)
#self.addCollider(player.getTower(-1).troop.troopModel.troopColliderNP)

DO = DirectObject()


def addCollisionEventAgain(fromName, intoName, function, extraArgs=[]):
    #Let's manage now the collision events:
    DO.accept(fromName + "-again-" + intoName, function, extraArgs)
示例#22
0
class World(DirectObject):
    def __init__(self):
        # Initialize the traverser.
        base.cTrav = CollisionTraverser()

        # Initialize the handler.
        self.collHandEvent = CollisionHandlerEvent()
        self.collHandEvent.addInPattern("into-%in")
        self.collHandEvent.addOutPattern("outof-%in")

        # Make a variable to store the unique collision string count.
        self.collCount = 0

        # Load a model. Reparent it to the camera so we can move it.
        s = loader.loadModel("smiley")
        s.reparentTo(camera)
        s.setPos(0, 25, 0)

        # Setup a collision solid for this model.
        sColl = self.initCollisionSphere(s, True)

        # Add this object to the traverser.
        base.cTrav.addCollider(sColl[0], self.collHandEvent)

        # Accept the events sent by the collisions.
        self.accept("into-" + sColl[1], self.collide3)
        self.accept("outof-" + sColl[1], self.collide4)
        print(sColl[1])

        # Load another model.
        t = loader.loadModel("smiley")
        t.reparentTo(render)
        t.setPos(5, 25, 0)

        # Setup a collision solid for this model.
        tColl = self.initCollisionSphere(t, True)

        # Add this object to the traverser.
        base.cTrav.addCollider(tColl[0], self.collHandEvent)

        # Accept the events sent by the collisions.
        self.accept("into-" + tColl[1], self.collide)
        self.accept("outof-" + tColl[1], self.collide2)
        print(tColl[1])

        print("WERT")

    def collide(self, collEntry):
        print("WERT: object has collided into another object")
        Sequence(
            Func(collEntry.getFromNodePath().getParent().setColor, VBase4(1, 0, 0, 1)),
            Wait(0.2),
            Func(collEntry.getFromNodePath().getParent().setColor, VBase4(0, 1, 0, 1)),
            Wait(0.2),
            Func(collEntry.getFromNodePath().getParent().setColor, VBase4(1, 1, 1, 1)),
        ).start()

    def collide2(self, collEntry):
        print("WERT.: object is no longer colliding with another object")

    def collide3(self, collEntry):
        print("WERT2: object has collided into another object")

    def collide4(self, collEntry):
        print("WERT2: object is no longer colliding with another object")

    def initCollisionSphere(self, obj, show=False):
        # Get the size of the object for the collision sphere.
        bounds = obj.getChild(0).getBounds()
        center = bounds.getCenter()
        radius = bounds.getRadius() * 1.1

        # Create a collision sphere and name it something understandable.
        collSphereStr = "CollisionHull" + str(self.collCount) + "_" + obj.getName()
        self.collCount += 1
        cNode = CollisionNode(collSphereStr)
        cNode.addSolid(CollisionSphere(center, radius))

        cNodepath = obj.attachNewNode(cNode)
        if show:
            cNodepath.show()

        # Return a tuple with the collision node and its corrsponding string so
        # that the bitmask can be set.
        return (cNodepath, collSphereStr)
示例#23
0
class World(DirectObject):
    def __init__(self):
        # Initialize the traverser.
        base.cTrav = CollisionTraverser()

        # Initialize the handler.
        self.collHandEvent = CollisionHandlerEvent()
        self.collHandEvent.addInPattern('into-%in')
        self.collHandEvent.addOutPattern('outof-%in')

        # Make a variable to store the unique collision string count.
        self.collCount = 0

        # Load a model. Reparent it to the camera so we can move it.
        s = loader.loadModel('smiley')
        s.reparentTo(camera)
        s.setPos(0, 25, 0)

        # Setup a collision solid for this model.
        sColl = self.initCollisionSphere(s, True)

        # Add this object to the traverser.
        base.cTrav.addCollider(sColl[0], self.collHandEvent)

        # Accept the events sent by the collisions.
        self.accept('into-' + sColl[1], self.collide3)
        self.accept('outof-' + sColl[1], self.collide4)
        print(sColl[1])

        # Load another model.
        t = loader.loadModel('smiley')
        t.reparentTo(render)
        t.setPos(5, 25, 0)

        # Setup a collision solid for this model.
        tColl = self.initCollisionSphere(t, True)

        # Add this object to the traverser.
        base.cTrav.addCollider(tColl[0], self.collHandEvent)

        # Accept the events sent by the collisions.
        self.accept('into-' + tColl[1], self.collide)
        self.accept('outof-' + tColl[1], self.collide2)
        print(tColl[1])

        print("WERT")

    def collide(self, collEntry):
        print("WERT: object has collided into another object")
        Sequence(
            Func(collEntry.getFromNodePath().getParent().setColor,
                 VBase4(1, 0, 0, 1)), Wait(0.2),
            Func(collEntry.getFromNodePath().getParent().setColor,
                 VBase4(0, 1, 0, 1)), Wait(0.2),
            Func(collEntry.getFromNodePath().getParent().setColor,
                 VBase4(1, 1, 1, 1))).start()

    def collide2(self, collEntry):
        print("WERT.: object is no longer colliding with another object")

    def collide3(self, collEntry):
        print("WERT2: object has collided into another object")

    def collide4(self, collEntry):
        print("WERT2: object is no longer colliding with another object")

    def initCollisionSphere(self, obj, show=False):
        # Get the size of the object for the collision sphere.
        bounds = obj.getChild(0).getBounds()
        center = bounds.getCenter()
        radius = bounds.getRadius() * 1.1

        # Create a collision sphere and name it something understandable.
        collSphereStr = 'CollisionHull' + str(
            self.collCount) + "_" + obj.getName()
        self.collCount += 1
        cNode = CollisionNode(collSphereStr)
        cNode.addSolid(CollisionSphere(center, radius))

        cNodepath = obj.attachNewNode(cNode)
        if show:
            cNodepath.show()

        # Return a tuple with the collision node and its corrsponding string so
        # that the bitmask can be set.
        return (cNodepath, collSphereStr)
示例#24
0
    #step 3) make a Geom object to hold the primitives
    squareGeom=Geom(vdata)
    squareGeom.addPrimitive(tris)

    #now put squareGeom in a GeomNode. You can now position your geometry in the scene graph.
    squareGN=GeomNode("square")
    squareGN.addGeom(squareGeom)

    terrainNode = NodePath("terrNode")
    terrainNode.reparentTo(render)
    terrainNode.attachNewNode(squareGN)
    terrainNode.setX(-width/2)
    texGrass = loader.loadTexture("textures/envir-ground.jpg")
    terrainNode.setTexture(texGrass)

cHandler.addInPattern("%(rays)ft-into-%(building)it")
cHandler.addOutPattern("%(rays)ft-out-%(building)it")

cHandler.addAgainPattern("ray_again_all%(""rays"")fh%(""building"")ih")

DO=DirectObject()

DO.accept('ray1-into-buildPlayer1', collideInBuilding)
DO.accept('ray1-out-buildPlayer1', collideOutBuilding)

DO.accept('ray_again_all', collideAgainstBuilds)

pickingEnabledOject=None

DO.accept('mouse1', mouseClick, ["down"])
DO.accept('mouse1-up', mouseClick, ["up"])
示例#25
0
class CollisionManager:
    def __init__(self):
        base.cTrav = CollisionTraverser()
        self.col_handler = CollisionHandlerEvent()

        self.selected = -1
        self.selected_node = None
        self.selecteds = []
        self.multi_select = False
        self.multi_selecting = False
        self.select_box = NodePath()

        picker_node = CollisionNode("mouseRayNode")
        pickerNPos = base.camera.attachNewNode(picker_node)
        self.pickerRay = CollisionRay()
        picker_node.addSolid(self.pickerRay)

        plane_node = CollisionNode("base_plane")
        plane = base.render.attachNewNode(plane_node)
        self.plane_col = CollisionPlane(Plane(Vec3(0, 0, 1), Point3(0, 0, 0)))
        picker_node.addSolid(self.pickerRay)

        picker_node.setTag("rays", "mray")
        base.cTrav.addCollider(pickerNPos, self.col_handler)

        self.col_handler.addInPattern("%(rays)ft-into-%(type)it")
        self.col_handler.addOutPattern("%(rays)ft-out-%(type)it")

        self.col_handler.addAgainPattern("ray_again_all%("
                                         "rays"
                                         ")fh%("
                                         "type"
                                         ")ih")

        self.DO = DirectObject()

        self.DO.accept('mray-into-army', self.col_in_object)
        self.DO.accept('mray-out-army', self.col_out_object)
        self.DO.accept('mray-into-battle', self.col_in_object)
        self.DO.accept('mray-out-battle', self.col_out_object)
        self.DO.accept('mray-into-tower', self.col_in_object)
        self.DO.accept('mray-out-tower', self.col_out_object)

        self.DO.accept('ray_again_all', self.col_against_object)

        if base.client == False:
            self.col_handler.addInPattern("%(player)ft-into-%(player)it")
            self.col_handler.addInPattern("%(type)ft-into-%(type)it")
            self.DO.accept('army-into-battle', self.col_army_against_battle)
            self.DO.accept('army-into-tower', self.col_army_against_tower)
            self.DO.accept('1-into-2', self.col_p1_into_p2)

        self.pickable = None

        self.DO.accept('mouse1', self.mouse_click, ["down"])
        self.DO.accept('mouse1-up', self.mouse_click, ["up"])
        self.DO.accept('mouse3-up', self.mouse_order)

        taskMgr.add(self.ray_update, "updatePicker")
        taskMgr.add(self.task_select_check, "updatePicker")
        taskMgr.add(self.get_mouse_plane_pos, "MousePositionOnPlane")

        z = 0
        self.plane = Plane(Vec3(0, 0, 1), Point3(0, 0, z))

        self.model = loader.loadModel("models/chest.egg")
        self.model.reparentTo(render)
        self.model.hide()
        cm = CardMaker("blah")
        cm.setFrame(-100, 100, -100, 100)
        pnode = render.attachNewNode(cm.generate())  #.lookAt(0, 0, -1)
        pnode.hide()

    def col_army_against_battle(self, entry):
        print "Army Joins!"
        #base.net_manager.battle_join(bat,army)
        army = entry.getFromNodePath()
        a_id = int(army.getParent().getTag("id"))
        a = base.armies[a_id]
        if a.state == "normal":
            battle = entry.getIntoNodePath()
            b_id = int(battle.getParent().getTag("id"))
            if base.single_player == False:
                base.net_manager.server_messager(
                    "battle_armyadd",
                    [b_id, a_id,
                     a.node_path.getX(),
                     a.node_path.getY()])

            a = base.armies[a_id]
            b = base.battles[b_id]
            b.add_army(a)

    def col_p1_into_p2(self, entry):
        if entry.getFromNodePath().getTag(
                "state") == "normal" and entry.getIntoNodePath().getTag(
                    "state") == "normal" and entry.getIntoNodePath().getTag(
                        "type") == "army" and entry.getFromNodePath().getTag(
                            "type") == "army":
            #base.net_manager.battle_start(a1,a2)
            army1 = entry.getFromNodePath()
            army2 = entry.getIntoNodePath()
            a1_id = int(army1.getParent().getTag("id"))
            a2_id = int(army2.getParent().getTag("id"))
            a1 = base.armies[a1_id]
            a2 = base.armies[a2_id]
            a1.stop()
            a2.stop()
            base.battles.append(TimObjects.Battle([a1, a2]))

    def col_army_against_tower(self, entry):
        print "TOWER COLLIDE", entry.getIntoNodePath().getParent().getTag("id")
        print entry.getIntoNodePath().getParent().getTag(
            "player"), "vs", entry.getFromNodePath().getParent().getTag(
                "player")
        if entry.getIntoNodePath().getParent().getTag(
                "player") != entry.getFromNodePath().getParent().getTag(
                    "player"):
            tower = entry.getIntoNodePath()
            tower_id = int(tower.getParent().getTag("id"))
            invader = int(entry.getFromNodePath().getParent().getTag("player"))
            if base.client == False and base.towers[tower_id].capture_check():
                base.towers[tower_id].change_owner(invader)
                if base.single_player == False:
                    base.net_manager.server_messager("tower_capture",
                                                     [tower_id, invader])

    def col_in_object(self, entry):
        np_into = entry.getIntoNodePath()
        np_into.getParent().setColor(0.5, 0.5, 0.5, 0.1)
        #self.global_text.setText(np_into.getName())
        if np_into.getTag("type") == "battle":
            print "You're in a battle"

        #print "in"

    def col_out_object(self, entry):
        np_into = entry.getIntoNodePath()
        #print "out"
        try:
            np_into.getParent().setColor(1, 1, 1, 1)
        except:
            print "ERROR CLEARING COLOUR"
        #self.global_text.setText("")

        self.pickable = None
        self.selected_type = "none"

    def col_against_object(self, entry):
        if entry.getIntoNodePath().getParent() != self.pickable:

            np_from = entry.getFromNodePath()
            np_into = entry.getIntoNodePath()
            self.selected_type = np_into.getTag("type")

            self.pickable = np_into.getParent()

    def mouse_click(self, status):
        print "click"
        in_statbar = base.vis_manager.statbar.mouse_in_bar()
        if self.pickable and in_statbar == False:
            if status == "down":
                if self.selected_type == "army":
                    if base.armies[int(self.pickable.getTag(
                            "id"))].state == "normal" or base.armies[int(
                                self.pickable.getTag("id"))].state == "new":
                        for obj in self.selecteds:
                            obj.deselect()
                            print obj.my_id, "deselected"
                        self.selecteds = []
                        self.pickable.setScale(0.95 * 10)
                        self.selected = int(self.pickable.getTag("id"))
                        self.selected_node = self.pickable
                        self.selecteds.append(base.armies[self.selected])
                        base.armies[self.selected].select()
                        print "You clicked on Army" + str(self.selected)
                        base.vis_manager.statbar.show_army(self.selected)
                elif self.selected_type == "tower":
                    for obj in self.selecteds:
                        obj.deselect()
                        print obj.my_id, "deselected"
                    self.selecteds = []
                    self.selected = int(self.pickable.getTag("id"))
                    self.selected_node = self.pickable
                    self.selecteds.append(base.towers[self.selected])
                    base.towers[self.selected].select()
                    print "You clicked on a tower"
                    base.vis_manager.statbar.show_tower(self.selected)
                elif self.selected_type == "battle":
                    self.selected = int(self.pickable.getTag("id"))
                    self.selected_node = self.pickable
                    print "You clicked on a battle"
                    base.vis_manager.statbar.show_battle(self.selected)

            if status == "up":
                if self.selected_type == "army":
                    self.pickable.setScale(1.0 * 10)
        elif status == "up" and self.multi_select == True:
            self.multi_select = False
            self.select_all_in_box()
        elif in_statbar == True:
            print "in box"
        elif self.pickable == None:
            for obj in self.selecteds:
                obj.deselect()
                print obj.my_id, "deselected"
            self.selecteds = []
            self.selected = -1
            self.selected_node = None
            base.vis_manager.statbar.reset_statbar()

    def select_all_in_box(self):
        for obj in self.selecteds:
            obj.deselect()
            print obj.my_id, "deselected"
        self.selecteds = []
        print "select units in box"
        for a in base.armies:
            if a.node_col.getTag("type") == "army" and (
                    a.state == "normal"
                    or a.state == "new") and a.player == base.player:
                x = a.get_x()
                y = a.get_y()
                if self.box_x < self.model.getX(
                ) and self.box_y > self.model.getY():
                    if x < self.model.getX(
                    ) and x > self.box_x and y > self.model.getY(
                    ) and y < self.box_y:
                        self.selecteds.append(a)
                        a.select()
                elif self.box_x < self.model.getX(
                ) and self.box_y < self.model.getY():
                    if x < self.model.getX(
                    ) and x > self.box_x and y < self.model.getY(
                    ) and y > self.box_y:
                        self.selecteds.append(a)
                        a.select()
                elif self.box_x > self.model.getX(
                ) and self.box_y < self.model.getY():
                    if x > self.model.getX(
                    ) and x < self.box_x and y < self.model.getY(
                    ) and y > self.box_y:
                        self.selecteds.append(a)
                        a.select()
                elif self.box_x > self.model.getX(
                ) and self.box_y > self.model.getY():
                    if x > self.model.getX(
                    ) and x < self.box_x and y > self.model.getY(
                    ) and y < self.box_y:
                        self.selecteds.append(a)
                        a.select()

    def task_select_check(self, task):
        if base.mouseWatcherNode.isButtonDown(MouseButton.one()):
            #if self.multi_select == True:
            self.box_x, self.box_y = self.model.getX(), self.model.getY()
            taskMgr.add(self.draw_multiselect_box, "multibox")
            return task.done
        return task.cont

    def draw_multiselect_box(self, task):
        if base.mouseWatcherNode.isButtonDown(MouseButton.one()):
            self.multi_select = True
            self.select_box.remove()
            ls = LineSegs()
            ls.move_to(self.box_x, self.box_y, 1)
            ls.draw_to(self.model.getX(), self.box_y, 1)
            ls.draw_to(self.model.getX(), self.model.getY(), 1)
            ls.draw_to(self.box_x, self.model.getY(), 1)
            ls.draw_to(self.box_x, self.box_y, 1)
            node = ls.create()
            #text = TextNode('text')
            #text.setText(str(self.box_x)+","+str(self.box_y)+"\n"+str(self.model.getX())+","+str(self.model.getY()))
            #textnp = NodePath(text)
            #textnp.setPos(self.box_x,self.box_y,1)
            #textnp.setHpr(0,-90,0)
            #textnp.setScale(20.0)
            self.select_box = NodePath(node)
            #textnp.reparentTo(self.select_box)
            self.select_box.reparentTo(render)
            return task.cont
        else:
            self.select_box.hide()
            taskMgr.add(self.task_select_check, "updatePicker")
            return task.done

    def mouse_order(self):
        print "mouse_order"
        #        if self.selected != -1 and base.armies[self.selected].state == "normal":
        #            print "orders sent"
        for a in self.selecteds:
            if a.node_col.getTag("type") == "army":
                if len(self.selecteds) > 1:
                    randomness = (len(self.selecteds) - 1) * 10
                    a.set_target(
                        True,
                        self.pos3d.getX() + random.randint(0, randomness) -
                        randomness / 2,
                        self.pos3d.getY() + random.randint(0, randomness) -
                        randomness / 2)
                else:
                    a.set_target(True, self.pos3d.getX(), self.pos3d.getY())

    def get_mouse_plane_pos(self, task):
        if base.mouseWatcherNode.hasMouse():
            mpos = base.mouseWatcherNode.getMouse()
            self.pos3d = Point3()
            nearPoint = Point3()
            farPoint = Point3()
            base.camLens.extrude(mpos, nearPoint, farPoint)
            if self.plane.intersectsLine(
                    self.pos3d, render.getRelativePoint(camera, nearPoint),
                    render.getRelativePoint(camera, farPoint)):
                #print "Mouse ray intersects ground plane at ", self.pos3d
                self.model.setPos(render, self.pos3d)
        return task.again

    def ray_update(self, task):
        if base.mouseWatcherNode.hasMouse():
            mpos = base.mouseWatcherNode.getMouse()

            self.pickerRay.setFromLens(base.camNode, mpos.getX(), mpos.getY())
        return task.cont
class DistributedGolfSpot(DistributedObject.DistributedObject, FSM.FSM):
    notify = DirectNotifyGlobal.directNotify.newCategory('DistributedGolfSpot')
    positions = ((-45, 100, GolfGlobals.GOLF_BALL_RADIUS),
     (-15, 100, GolfGlobals.GOLF_BALL_RADIUS),
     (15, 100, GolfGlobals.GOLF_BALL_RADIUS),
     (45, 100, GolfGlobals.GOLF_BALL_RADIUS))
    toonGolfOffsetPos = Point3(-2, 0, -GolfGlobals.GOLF_BALL_RADIUS)
    toonGolfOffsetHpr = Point3(-90, 0, 0)
    rotateSpeed = 20
    golfPowerSpeed = base.config.GetDouble('golf-power-speed', 3)
    golfPowerExponent = base.config.GetDouble('golf-power-exponent', 0.75)

    def __init__(self, cr):
        DistributedObject.DistributedObject.__init__(self, cr)
        FSM.FSM.__init__(self, 'DistributedGolfSpot')
        self.boss = None
        self.index = None
        self.avId = 0
        self.toon = None
        self.golfSpotSmoother = SmoothMover()
        self.golfSpotSmoother.setSmoothMode(SmoothMover.SMOn)
        self.smoothStarted = 0
        self.__broadcastPeriod = 0.2
        if self.index > len(self.positions):
            self.notify.error('Invalid index %d' % index)
        self.fadeTrack = None
        self.setupPowerBar()
        self.aimStart = None
        self.golfSpotAdviceLabel = None
        self.changeSeq = 0
        self.lastChangeSeq = 0
        self.controlKeyAllowed = False
        self.flyBallTracks = {}
        self.splatTracks = {}
        self.__flyBallBubble = None
        self.flyBallHandler = None
        self.__flyBallSequenceNum = 0
        self.swingInterval = None
        self.lastHitSequenceNum = -1
        self.goingToReward = False
        self.gotHitByBoss = False
        self.releaseTrack = None
        self.grabTrack = None
        self.restoreScaleTrack = None
        return

    def setBossCogId(self, bossCogId):
        self.bossCogId = bossCogId
        self.boss = base.cr.doId2do[bossCogId]
        self.boss.setGolfSpot(self, self.index)

    def setIndex(self, index):
        self.index = index

    def disable(self):
        DistributedObject.DistributedObject.disable(self)
        self.ignoreAll()

    def delete(self):
        DistributedObject.DistributedObject.delete(self)
        self.ignoreAll()
        self.boss = None
        return

    def announceGenerate(self):
        DistributedObject.DistributedObject.announceGenerate(self)
        self.triggerName = self.uniqueName('trigger')
        self.triggerEvent = 'enter%s' % self.triggerName
        self.smoothName = self.uniqueName('golfSpotSmooth')
        self.golfSpotAdviceName = self.uniqueName('golfSpotAdvice')
        self.posHprBroadcastName = self.uniqueName('golfSpotBroadcast')
        self.ballPowerTaskName = self.uniqueName('updateGolfPower')
        self.adjustClubTaskName = self.uniqueName('adjustClub')
        self.loadAssets()
        self.accept('flyBallHit-%d' % self.index, self.__flyBallHit)

    def loadAssets(self):
        self.root = render.attachNewNode('golfSpot-%d' % self.index)
        self.root.setPos(*self.positions[self.index])
        self.ballModel = loader.loadModel('phase_6/models/golf/golf_ball')
        self.ballColor = VBase4(1, 1, 1, 1)
        if self.index < len(GolfGlobals.PlayerColors):
            self.ballColor = VBase4(*GolfGlobals.PlayerColors[self.index])
            self.ballModel.setColorScale(self.ballColor)
        self.ballModel.reparentTo(self.root)
        self.club = loader.loadModel('phase_6/models/golf/putter')
        self.clubLookatSpot = self.root.attachNewNode('clubLookat')
        self.clubLookatSpot.setY(-(GolfGlobals.GOLF_BALL_RADIUS + 0.1))
        cs = CollisionSphere(0, 0, 0, 1)
        cs.setTangible(0)
        cn = CollisionNode(self.triggerName)
        cn.addSolid(cs)
        cn.setIntoCollideMask(ToontownGlobals.WallBitmask)
        self.trigger = self.root.attachNewNode(cn)
        self.trigger.stash()
        self.hitBallSfx = loader.loadSfx('phase_6/audio/sfx/Golf_Hit_Ball.ogg')

    def cleanup(self):
        if self.swingInterval:
            self.swingInterval.finish()
            self.swingInterval = None
        if self.releaseTrack:
            self.releaseTrack.finish()
            self.releaseTrack = None
        flyTracks = self.flyBallTracks.values()
        for track in flyTracks:
            track.finish()

        if self.fadeTrack:
            self.fadeTrack.finish()
            self.fadeTrack = None
        if self.restoreScaleTrack:
            self.restoreScaleTrack.finish()
            self.restoreScaleTrack = None
        self.root.removeNode()
        self.ballModel.removeNode()
        self.club.removeNode()
        if self.powerBar:
            self.powerBar.destroy()
            self.powerBar = None
        taskMgr.remove(self.triggerName)
        self.boss = None
        return

    def setState(self, state, avId, extraInfo):
        if not self.isDisabled():
            self.gotHitByBoss = extraInfo
            if state == 'C':
                self.demand('Controlled', avId)
            elif state == 'F':
                self.demand('Free')
            elif state == 'O':
                self.demand('Off')
            else:
                self.notify.error('Invalid state from AI: %s' % state)

    def enterOff(self):
        pass

    def exitOff(self):
        pass

    def enterFree(self):
        if self.fadeTrack:
            self.fadeTrack.finish()
            self.fadeTrack = None
        self.restoreScaleTrack = Sequence(Wait(6), self.getRestoreScaleInterval(), name='restoreScaleTrack')
        self.restoreScaleTrack.start()
        if self.avId == localAvatar.doId:
            if not self.isDisabled():
                self.ballModel.setAlphaScale(0.3)
                self.ballModel.setTransparency(1)
                taskMgr.doMethodLater(5, self.__allowDetect, self.triggerName)
                self.fadeTrack = Sequence(Func(self.ballModel.setTransparency, 1), self.ballModel.colorScaleInterval(0.2, VBase4(1, 1, 1, 0.3)), name='fadeTrack-enterFree')
                self.fadeTrack.start()
        else:
            self.trigger.unstash()
            self.accept(self.triggerEvent, self.__hitTrigger)
        self.avId = 0
        return

    def exitFree(self):
        if self.fadeTrack:
            self.fadeTrack.finish()
            self.fadeTrack = None
        self.restoreScaleTrack.finish()
        self.restoreScaleTrack = None
        taskMgr.remove(self.triggerName)
        self.ballModel.clearTransparency()
        self.trigger.stash()
        self.ignore(self.triggerEvent)
        return

    def enterControlled(self, avId):
        self.avId = avId
        toon = base.cr.doId2do.get(avId)
        if not toon:
            return
        self.enableControlKey()
        self.toon = toon
        self.grabTrack = self.makeToonGrabInterval(toon)
        if avId == localAvatar.doId:
            self.boss.toCraneMode()
            camera.reparentTo(self.root)
            camera.setPosHpr(0, -10, 3, 0, 0, 0)
            localAvatar.setPos(self.root, self.toonGolfOffsetPos)
            localAvatar.setHpr(self.root, self.toonGolfOffsetHpr)
            localAvatar.sendCurrentPosition()
            self.__enableControlInterface()
            self.startPosHprBroadcast()
            self.accept('exitCrane', self.gotBossZapped)
        self.grabTrack.start()

    def exitControlled(self):
        self.grabTrack.finish()
        del self.grabTrack
        if self.swingInterval:
            self.swingInterval.finish()
            self.swingInterval = None
        if not self.ballModel.isEmpty():
            if self.ballModel.isHidden():
                self.notify.debug('ball is hidden scale =%s' % self.ballModel.getScale())
            else:
                self.notify.debug('ball is showing scale=%s' % self.ballModel.getScale())
        if self.toon and not self.toon.isDisabled():
            self.toon.startSmooth()
        self.releaseTrack = self.makeToonReleaseInterval(self.toon)
        self.stopPosHprBroadcast()
        self.stopSmooth()
        if self.avId == localAvatar.doId:
            self.__disableControlInterface()
            if not self.goingToReward:
                camera.reparentTo(base.localAvatar)
                camera.setPos(base.localAvatar.cameraPositions[0][0])
                camera.setHpr(0, 0, 0)
        self.stopAdjustClubTask()
        self.releaseTrack.start()
        self.enableControlKey()
        return

    def __allowDetect(self, task):
        if self.fadeTrack:
            self.fadeTrack.finish()
        self.fadeTrack = Sequence(self.ballModel.colorScaleInterval(0.2, self.ballColor), Func(self.ballModel.clearTransparency), name='fadeTrack-allowDetect')
        self.fadeTrack.start()
        self.trigger.unstash()
        self.accept(self.triggerEvent, self.__hitTrigger)

    def __hitTrigger(self, event):
        self.d_requestControl()

    def getRestoreScaleInterval(self):
        return Sequence()

    def d_requestControl(self):
        self.sendUpdate('requestControl')

    def d_requestFree(self, gotHitByBoss):
        self.sendUpdate('requestFree', [gotHitByBoss])

    def makeToonGrabInterval(self, toon):
        origPos = toon.getPos(self.root)
        origHpr = toon.getHpr(self.root)
        a = self.accomodateToon(toon)
        newPos = toon.getPos()
        newHpr = toon.getHpr()
        origHpr.setX(PythonUtil.fitSrcAngle2Dest(origHpr[0], newHpr[0]))
        self.notify.debug('toon.setPosHpr %s %s' % (origPos, origHpr))
        toon.setPosHpr(origPos, origHpr)
        walkTime = 0.2
        reach = Sequence()
        if reach.getDuration() < walkTime:
            reach = Sequence(ActorInterval(toon, 'walk', loop=1, duration=walkTime - reach.getDuration()), reach)
        i = Sequence(Parallel(toon.posInterval(walkTime, newPos, origPos), toon.hprInterval(walkTime, newHpr, origHpr), reach), Func(toon.stopLookAround))
        if toon == base.localAvatar:
            i.append(Func(self.switchToAnimState, 'GolfPuttLoop'))
        i.append(Func(self.startAdjustClubTask))
        i = Parallel(i, a)
        return i

    def accomodateToon(self, toon):
        toon.wrtReparentTo(self.root)
        toon.setPos(self.toonGolfOffsetPos)
        toon.setHpr(self.toonGolfOffsetHpr)
        return Sequence()

    def switchToAnimState(self, animStateName, forced = False):
        curAnimState = base.localAvatar.animFSM.getCurrentState()
        curAnimStateName = ''
        if curAnimState:
            curAnimStateName = curAnimState.getName()
        if curAnimStateName != animStateName or forced:
            base.localAvatar.b_setAnimState(animStateName)

    def __enableControlInterface(self):
        gui = loader.loadModel('phase_3.5/models/gui/avatar_panel_gui')
        self.closeButton = DirectButton(image=(gui.find('**/CloseBtn_UP'),
         gui.find('**/CloseBtn_DN'),
         gui.find('**/CloseBtn_Rllvr'),
         gui.find('**/CloseBtn_UP')), relief=None, scale=2, text=TTLocalizer.BossbotGolfSpotLeave, text_scale=0.04, text_pos=(0, -0.07), text_fg=VBase4(1, 1, 1, 1), pos=(1.05, 0, -0.82), command=self.__exitGolfSpot)
        self.accept('escape', self.__exitGolfSpot)
        self.accept('control', self.__controlPressed)
        self.accept('control-up', self.__controlReleased)
        self.accept('InputState-forward', self.__upArrow)
        self.accept('InputState-reverse', self.__downArrow)
        self.accept('InputState-turnLeft', self.__leftArrow)
        self.accept('InputState-turnRight', self.__rightArrow)
        taskMgr.add(self.__watchControls, 'watchGolfSpotControls')
        taskMgr.doMethodLater(5, self.__displayGolfSpotAdvice, self.golfSpotAdviceName)
        self.arrowVert = 0
        self.arrowHorz = 0
        if self.powerBar:
            self.powerBar.show()
        return

    def __disableControlInterface(self):
        if self.closeButton:
            self.closeButton.destroy()
            self.closeButton = None
        self.__cleanupGolfSpotAdvice()
        self.ignore('escape')
        self.ignore('control')
        self.ignore('control-up')
        self.ignore('InputState-forward')
        self.ignore('InputState-reverse')
        self.ignore('InputState-turnLeft')
        self.ignore('InputState-turnRight')
        self.arrowVert = 0
        self.arrowHorz = 0
        taskMgr.remove('watchGolfSpotControls')
        if self.powerBar:
            self.powerBar.hide()
        else:
            self.notify.debug('self.powerBar is none')
        return

    def setupPowerBar(self):
        self.powerBar = DirectWaitBar(pos=(0.0, 0, -0.94), relief=DGG.SUNKEN, frameSize=(-2.0,
         2.0,
         -0.2,
         0.2), borderWidth=(0.02, 0.02), scale=0.25, range=100, sortOrder=50, frameColor=(0.5, 0.5, 0.5, 0.5), barColor=(1.0, 0.0, 0.0, 1.0), text='', text_scale=0.26, text_fg=(1, 1, 1, 1), text_align=TextNode.ACenter, text_pos=(0, -0.05))
        self.power = 0
        self.powerBar['value'] = self.power
        self.powerBar.hide()

    def resetPowerBar(self):
        self.power = 0
        self.powerBar['value'] = self.power
        self.powerBar['text'] = ''

    def __displayGolfSpotAdvice(self, task):
        if self.golfSpotAdviceLabel == None:
            self.golfSpotAdviceLabel = DirectLabel(text=TTLocalizer.BossbotGolfSpotAdvice, text_fg=VBase4(1, 1, 1, 1), text_align=TextNode.ACenter, relief=None, pos=(0, 0, 0.69), scale=0.1)
        return

    def __cleanupGolfSpotAdvice(self):
        if self.golfSpotAdviceLabel:
            self.golfSpotAdviceLabel.destroy()
            self.golfSpotAdviceLabel = None
        taskMgr.remove(self.golfSpotAdviceName)
        return

    def showExiting(self):
        if self.closeButton:
            self.closeButton.destroy()
            self.closeButton = DirectLabel(relief=None, text=TTLocalizer.BossbotGolfSpotLeaving, pos=(1.05, 0, -0.88), text_pos=(0, 0), text_scale=0.06, text_fg=VBase4(1, 1, 1, 1))
        self.__cleanupGolfSpotAdvice()
        return

    def __exitGolfSpot(self):
        self.d_requestFree(False)

    def __controlPressed(self):
        if self.controlKeyAllowed:
            self.__beginFireBall()

    def __controlReleased(self):
        if self.controlKeyAllowed:
            self.__endFireBall()

    def __upArrow(self, pressed):
        self.__incrementChangeSeq()
        self.__cleanupGolfSpotAdvice()
        if pressed:
            self.arrowVert = 1
        elif self.arrowVert > 0:
            self.arrowVert = 0

    def __downArrow(self, pressed):
        self.__incrementChangeSeq()
        self.__cleanupGolfSpotAdvice()
        if pressed:
            self.arrowVert = -1
        elif self.arrowVert < 0:
            self.arrowVert = 0

    def __rightArrow(self, pressed):
        self.__incrementChangeSeq()
        self.__cleanupGolfSpotAdvice()
        if pressed:
            self.arrowHorz = 1
            self.switchToAnimState('GolfRotateLeft')
        elif self.arrowHorz > 0:
            self.arrowHorz = 0
            self.switchToAnimState('GolfPuttLoop')

    def __leftArrow(self, pressed):
        self.__incrementChangeSeq()
        self.__cleanupGolfSpotAdvice()
        if pressed:
            self.arrowHorz = -1
            self.switchToAnimState('GolfRotateRight')
        elif self.arrowHorz < 0:
            self.arrowHorz = 0
            self.switchToAnimState('GolfPuttLoop')

    def __watchControls(self, task):
        if self.arrowHorz:
            self.__moveGolfSpot(self.arrowHorz)
        return Task.cont

    def __moveGolfSpot(self, xd):
        dt = globalClock.getDt()
        h = self.root.getH() - xd * self.rotateSpeed * dt
        h %= 360
        limitH = h
        self.root.setH(limitH)

    def __incrementChangeSeq(self):
        self.changeSeq = self.changeSeq + 1 & 255

    def __beginFireBall(self):
        if self.aimStart != None:
            return
        if not self.state == 'Controlled':
            return
        if not self.avId == localAvatar.doId:
            return
        time = globalClock.getFrameTime()
        self.aimStart = time
        messenger.send('wakeup')
        taskMgr.add(self.__updateBallPower, self.ballPowerTaskName)
        return

    def __endFireBall(self):
        if self.aimStart == None:
            return
        if not self.state == 'Controlled':
            return
        if not self.avId == localAvatar.doId:
            return
        taskMgr.remove(self.ballPowerTaskName)
        self.disableControlKey()
        messenger.send('wakeup')
        self.aimStart = None
        power = self.power
        angle = self.root.getH()
        self.notify.debug('incrementing self.__flyBallSequenceNum')
        self.__flyBallSequenceNum = (self.__flyBallSequenceNum + 1) % 255
        self.sendSwingInfo(power, angle, self.__flyBallSequenceNum)
        self.setSwingInfo(power, angle, self.__flyBallSequenceNum)
        self.resetPowerBar()
        return

    def __updateBallPower(self, task):
        if not self.powerBar:
            print '### no power bar!!!'
            return task.done
        newPower = self.__getBallPower(globalClock.getFrameTime())
        self.power = newPower
        self.powerBar['value'] = newPower
        return task.cont

    def __getBallPower(self, time):
        elapsed = max(time - self.aimStart, 0.0)
        t = elapsed / self.golfPowerSpeed
        t = math.pow(t, self.golfPowerExponent)
        power = int(t * 100) % 200
        if power > 100:
            power = 200 - power
        return power

    def stopPosHprBroadcast(self):
        taskName = self.posHprBroadcastName
        taskMgr.remove(taskName)

    def startPosHprBroadcast(self):
        taskName = self.posHprBroadcastName
        self.b_clearSmoothing()
        self.d_sendGolfSpotPos()
        taskMgr.remove(taskName)
        taskMgr.doMethodLater(self.__broadcastPeriod, self.__posHprBroadcast, taskName)

    def __posHprBroadcast(self, task):
        self.d_sendGolfSpotPos()
        taskName = self.posHprBroadcastName
        taskMgr.doMethodLater(self.__broadcastPeriod, self.__posHprBroadcast, taskName)
        return Task.done

    def d_sendGolfSpotPos(self):
        timestamp = globalClockDelta.getFrameNetworkTime()
        self.sendUpdate('setGolfSpotPos', [self.changeSeq, self.root.getH(), timestamp])

    def setGolfSpotPos(self, changeSeq, h, timestamp):
        self.changeSeq = changeSeq
        if self.smoothStarted:
            now = globalClock.getFrameTime()
            local = globalClockDelta.networkToLocalTime(timestamp, now)
            self.golfSpotSmoother.setH(h)
            self.golfSpotSmoother.setTimestamp(local)
            self.golfSpotSmoother.markPosition()
        else:
            self.root.setH(h)

    def b_clearSmoothing(self):
        self.d_clearSmoothing()
        self.clearSmoothing()

    def d_clearSmoothing(self):
        self.sendUpdate('clearSmoothing', [0])

    def clearSmoothing(self, bogus = None):
        self.golfSpotSmoother.clearPositions(1)

    def doSmoothTask(self, task):
        self.golfSpotSmoother.computeAndApplySmoothHpr(self.root)
        return Task.cont

    def startSmooth(self):
        if not self.smoothStarted:
            taskName = self.smoothName
            taskMgr.remove(taskName)
            self.reloadPosition()
            taskMgr.add(self.doSmoothTask, taskName)
            self.smoothStarted = 1

    def stopSmooth(self):
        if self.smoothStarted:
            taskName = self.smoothName
            taskMgr.remove(taskName)
            self.forceToTruePosition()
            self.smoothStarted = 0

    def makeToonReleaseInterval(self, toon):

        def getSlideToPos(toon = toon):
            return render.getRelativePoint(toon, Point3(0, -5, 0))

        if self.gotHitByBoss:
            grabIval = Sequence(Func(self.detachClub), name='makeToonReleaseInterval-gotHitByBoss')
            if not toon.isEmpty():
                toonIval = Sequence(Func(toon.wrtReparentTo, render), Parallel(ActorInterval(toon, 'slip-backward'), toon.posInterval(0.5, getSlideToPos, fluid=1)), name='makeToonReleaseInterval-toonIval')
                grabIval.append(toonIval)
        else:
            grabIval = Sequence(Func(self.detachClub))
            if not toon.isEmpty():
                toonIval = Sequence(Parallel(ActorInterval(toon, 'walk', duration=1.0, playRate=-1.0), LerpPosInterval(toon, duration=1.0, pos=Point3(-10, 0, 0))), Func(toon.wrtReparentTo, render))
                grabIval.append(toonIval)
        if localAvatar.doId == toon.doId:
            if not self.goingToReward and toon.hp > 0:
                grabIval.append(Func(self.goToFinalBattle))
                grabIval.append(Func(self.notify.debug, 'goingToFinalBattlemode'))
                grabIval.append(Func(self.safeBossToFinalBattleMode))
        return grabIval

    def safeBossToFinalBattleMode(self):
        if self.boss:
            self.boss.toFinalBattleMode()

    def goToFinalBattle(self):
        if self.cr:
            place = self.cr.playGame.getPlace()
            if place and hasattr(place, 'fsm'):
                curState = place.fsm.getCurrentState().getName()
                if place.fsm.getCurrentState().getName() == 'crane':
                    place.setState('finalBattle')
                else:
                    self.notify.debug('NOT going to final battle, state=%s' % curState)

    def attachClub(self, avId, pointToBall = False):
        club = self.club
        if club:
            av = base.cr.doId2do.get(avId)
            if av:
                av.useLOD(1000)
                lHand = av.getLeftHands()[0]
                club.setPos(0, 0, 0)
                club.reparentTo(lHand)
                netScale = club.getNetTransform().getScale()[1]
                counterActToonScale = lHand.find('**/counteractToonScale')
                if counterActToonScale.isEmpty():
                    counterActToonScale = lHand.attachNewNode('counteractToonScale')
                    counterActToonScale.setScale(1 / netScale)
                    self.notify.debug('creating counterActToonScale for %s' % av.getName())
                club.reparentTo(counterActToonScale)
                club.setX(-0.25 * netScale)
                if pointToBall:
                    club.lookAt(self.clubLookatSpot)

    def detachClub(self):
        if not self.club.isEmpty():
            self.club.reparentTo(self.root)
            self.club.setZ(-20)
            self.club.setScale(1)

    def adjustClub(self):
        club = self.club
        if club:
            distance = club.getDistance(self.clubLookatSpot)
            scaleFactor = distance / 2.058
            club.setScale(1, scaleFactor, 1)

    def startAdjustClubTask(self):
        taskMgr.add(self.adjustClubTask, self.adjustClubTaskName)

    def stopAdjustClubTask(self):
        taskMgr.remove(self.adjustClubTaskName)

    def adjustClubTask(self, task):
        self.attachClub(self.avId, True)
        self.adjustClub()
        return task.cont

    def enableControlKey(self):
        self.controlKeyAllowed = True

    def disableControlKey(self):
        self.controlKeyAllowed = False

    def sendSwingInfo(self, power, angle, sequenceNum):
        self.sendUpdate('setSwingInfo', [power, angle, sequenceNum])

    def startBallPlayback(self, power, angle, sequenceNum):
        flyBall = self.ballModel.copyTo(NodePath())
        flyBall.setScale(1.0)
        flyBallBubble = self.getFlyBallBubble().instanceTo(NodePath())
        flyBallBubble.reparentTo(flyBall)
        flyBall.setTag('pieSequence', str(sequenceNum))
        flyBall.setTag('throwerId', str(self.avId))
        t = power / 100.0
        t = 1.0 - t
        dist = 300 - 200 * t
        time = 1.5 + 0.5 * t
        proj = ProjectileInterval(None, startPos=Point3(0, 0, 0), endPos=Point3(0, dist, 0), duration=time)
        relVel = proj.startVel

        def getVelocity(root = self.root, relVel = relVel):
            return render.getRelativeVector(root, relVel)

        fly = Sequence(Func(flyBall.reparentTo, render), Func(flyBall.setPosHpr, self.root, 0, 0, 0, 0, 0, 0), Func(base.cTrav.addCollider, flyBallBubble, self.flyBallHandler), ProjectileInterval(flyBall, startVel=getVelocity, duration=3), Func(flyBall.detachNode), Func(base.cTrav.removeCollider, flyBallBubble), Func(self.notify.debug, 'removed collider'), Func(self.flyBallFinishedFlying, sequenceNum))
        flyWithSound = Parallel(fly, SoundInterval(self.hitBallSfx, node=self.root), name='flyWithSound')
        self.notify.debug('starting flyball track')
        flyWithSound.start()
        self.flyBallTracks[sequenceNum] = flyWithSound
        return

    def setSwingInfo(self, power, angle, sequenceNum):
        av = base.cr.doId2do.get(self.avId)
        self.swingInterval = Sequence()
        if av:
            self.stopAdjustClubTask()
            self.swingInterval = Sequence(ActorInterval(av, 'swing-putt', startFrame=0, endFrame=GolfGlobals.BALL_CONTACT_FRAME), Func(self.startBallPlayback, power, angle, sequenceNum), Func(self.ballModel.hide), ActorInterval(av, 'swing-putt', startFrame=GolfGlobals.BALL_CONTACT_FRAME, endFrame=24), Func(self.ballModel.setScale, 0.1), Func(self.ballModel.show), LerpScaleInterval(self.ballModel, 1.0, Point3(1, 1, 1)), Func(self.enableControlKey))
            if av == localAvatar:
                self.swingInterval.append(Func(self.switchToAnimState, 'GolfPuttLoop', True))
        self.swingInterval.start()

    def getFlyBallBubble(self):
        if self.__flyBallBubble == None:
            bubble = CollisionSphere(0, 0, 0, GolfGlobals.GOLF_BALL_RADIUS)
            node = CollisionNode('flyBallBubble')
            node.addSolid(bubble)
            node.setFromCollideMask(ToontownGlobals.PieBitmask | ToontownGlobals.CameraBitmask | ToontownGlobals.FloorBitmask)
            node.setIntoCollideMask(BitMask32.allOff())
            self.__flyBallBubble = NodePath(node)
            self.flyBallHandler = CollisionHandlerEvent()
            self.flyBallHandler.addInPattern('flyBallHit-%d' % self.index)
        return self.__flyBallBubble

    def __flyBallHit(self, entry):
        print entry

    def flyBallFinishedFlying(self, sequence):
        if self.flyBallTracks.has_key(sequence):
            del self.flyBallTracks[sequence]

    def __finishFlyBallTrack(self, sequence):
        if self.flyBallTracks.has_key(sequence):
            flyBallTrack = self.flyBallTracks[sequence]
            del self.flyBallTracks[sequence]
            flyBallTrack.finish()

    def flyBallFinishedSplatting(self, sequence):
        if self.splatTracks.has_key(sequence):
            del self.splatTracks[sequence]

    def __flyBallHit(self, entry):
        if not entry.hasSurfacePoint() or not entry.hasInto():
            return
        if not entry.getInto().isTangible():
            return
        sequence = int(entry.getFromNodePath().getNetTag('pieSequence'))
        self.__finishFlyBallTrack(sequence)
        if self.splatTracks.has_key(sequence):
            splatTrack = self.splatTracks[sequence]
            del self.splatTracks[sequence]
            splatTrack.finish()
        flyBallCode = 0
        flyBallCodeStr = entry.getIntoNodePath().getNetTag('pieCode')
        if flyBallCodeStr:
            flyBallCode = int(flyBallCodeStr)
        pos = entry.getSurfacePoint(render)
        timestamp32 = globalClockDelta.getFrameNetworkTime(bits=32)
        throwerId = int(entry.getFromNodePath().getNetTag('throwerId'))
        splat = self.getFlyBallSplatInterval(pos[0], pos[1], pos[2], flyBallCode, throwerId)
        splat = Sequence(splat, Func(self.flyBallFinishedSplatting, sequence))
        self.splatTracks[sequence] = splat
        splat.start()
        self.notify.debug('doId=%d into=%s flyBallCode=%d, throwerId=%d' % (self.doId,
         entry.getIntoNodePath(),
         flyBallCode,
         throwerId))
        if flyBallCode == ToontownGlobals.PieCodeBossCog and self.avId == localAvatar.doId and self.lastHitSequenceNum != self.__flyBallSequenceNum:
            self.lastHitSequenceNum = self.__flyBallSequenceNum
            self.boss.d_ballHitBoss(1)
        elif flyBallCode == ToontownGlobals.PieCodeToon and self.avId == localAvatar.doId and self.lastHitSequenceNum != self.__flyBallSequenceNum:
            self.lastHitSequenceNum = self.__flyBallSequenceNum
            avatarDoId = entry.getIntoNodePath().getNetTag('avatarDoId')
            if avatarDoId == '':
                self.notify.warning('Toon %s has no avatarDoId tag.' % repr(entry.getIntoNodePath()))
                return
            doId = int(avatarDoId)
            if doId != localAvatar.doId:
                pass

    def getFlyBallSplatInterval(self, x, y, z, flyBallCode, throwerId):
        from toontown.toonbase import ToontownBattleGlobals
        from toontown.battle import BattleProps
        splatName = 'dust'
        splat = BattleProps.globalPropPool.getProp(splatName)
        splat.setBillboardPointWorld(2)
        color = ToontownGlobals.PieCodeColors.get(flyBallCode)
        if color:
            splat.setColor(*color)
        if flyBallCode == ToontownGlobals.PieCodeBossCog:
            self.notify.debug('changing color to %s' % self.ballColor)
            splat.setColor(self.ballColor)
        sound = loader.loadSfx('phase_11/audio/sfx/LB_evidence_miss.ogg')
        vol = 1.0
        if flyBallCode == ToontownGlobals.PieCodeBossCog:
            sound = loader.loadSfx('phase_4/audio/sfx/Golf_Hit_Barrier_1.ogg')
        soundIval = SoundInterval(sound, node=splat, volume=vol)
        if flyBallCode == ToontownGlobals.PieCodeBossCog and localAvatar.doId == throwerId:
            vol = 1.0
            soundIval = SoundInterval(sound, node=localAvatar, volume=vol)
        ival = Parallel(Func(splat.reparentTo, render), Func(splat.setPos, x, y, z), soundIval, Sequence(ActorInterval(splat, splatName), Func(splat.detachNode)))
        return ival

    def setGoingToReward(self):
        self.goingToReward = True

    def gotBossZapped(self):
        self.showExiting()
        self.d_requestFree(True)
示例#27
0
class Level:
    ''' Combines level geometry, behaviour and model '''

    POS_DEFAULT = (0, 0, 0)
    SCALE_DEFAULT = (1, 1, 1)

    def __init__(
        self,
        model,
        mapNo,
        pos=POS_DEFAULT,
        scale=SCALE_DEFAULT,
    ):
        self.model = model
        self.space = model.space
        self.world = model.world
        self.pos = pos
        self.scale = scale
        self._planes = []
        self._coins = []
        self._triggers = []

        self.levelNode = None
        self.exit = MovingPlane(self.space, (0.0, 5.0, 1.0), (1.0, 1.0, 1.0))
        self.ball = model.getBall()
        self.goal = 0  # kerattavat kolikot

        print 'Loading level ', mapNo, '...'
        self.initCollisionTest()
        factory = LevelFactory()
        factory.load(self, mapNo)

    def initCollisionTest(self):
        self.collHandEvent = CollisionHandlerEvent()
        self.collHandEvent.addInPattern('into-%in')
        base.cTrav = CollisionTraverser('test name')
        if False:
            base.cTrav.showCollisions(render)

        cName = 'BallCollNode'
        cSphere = CollisionSphere(0, 0, 0, 1.0)
        cNode = CollisionNode(cName)
        cNode.addSolid(cSphere)
        cNodePath = self.ball.modelNode.attachNewNode(cNode)
        base.cTrav.addCollider(cNodePath, self.collHandEvent)

    def onTrigger(self, entry):
        print 'trigger on'

    def loadLevelEntity(self, mEgg, cEgg):
        self.levelNode = self._createModelNode(self.pos, self.scale, mEgg)
        self.collNode = loader.loadModel(cEgg)
        self.trimesh = OdeTriMeshData(self.collNode, True)
        self.collGeom = OdeTriMeshGeom(self.space, self.trimesh)
        self.space.setSurfaceType(self.collGeom, SurfaceType.FLOOR)
        self.levelNode.flattenStrong()
        self.levelNode.reparentTo(render)

    def _createModelNode(self, pos, scale, modelEgg):
        modelNode = loader.loadModel(modelEgg)
        modelNode.setPos(pos)
        modelNode.setScale(scale)
        return modelNode

    def updateModelNode(self):
        map(Coin.updateModelNode, self._coins)
        map(MovingPlane.updateModelNode, self._planes)
        self.exit.updateModelNode()

    def removeLevel(self):

        self.collGeom = None
        if (self.levelNode != None):
            self.levelNode.removeNode()

        map(MovingPlane.removeNode, self._planes)
        map(Coin.removeNode, self._coins)

        if (self.exit != None):
            self.exit.removeNode()

    def getExit(self):
        ''' Return the geometry of an exit'''
        return self.exit.getGeom()

    def getGoal(self):
        return self.goal

    def addCoin(self, pos):
        self._coins.append(Coin(self.model, self.world, self.space, pos))

    def getCoins(self):
        return self._coins

    def addTrigger(self, name, pos, radius):
        '''
		http://www.panda3d.org/apiref.php?page=DirectObject
		http://www.panda3d.org/wiki/index.php/Collision_Solids
		http://www.panda3d.org/apiref.php?page=CollisionTraverser
		http://www.panda3d.org/apiref.php?page=CollisionHandlerEvent
		http://www.panda3d.org/apiref.php?page=NodePath#find
		'''
        cSphere = CollisionSphere(pos[0], pos[1], pos[2], radius)
        cNode = CollisionNode(name)
        cNode.addSolid(cSphere)

        model = render.find(name)
        if not model.isEmpty():
            model.removeNode()

        cnodePath = render.attachNewNode(cNode)
        cnodePath.show()
        base.cTrav.addCollider(cnodePath, self.collHandEvent)
        base.accept('into-' + name, self.onTrigger)

    def addPlane(self, pos, dim, type):
        self._planes.append(MovingPlane(self.space, pos, dim, type))

    def addExit(self, pos):
        self.exit.setPosition(pos)
        self.addTrigger('ExitTriggerNode', pos, 2.0)
class CogdoFlyingCollisions(GravityWalker):
    wantFloorSphere = 0

    def __init__(self):
        GravityWalker.__init__(self, gravity=0.0)

    def initializeCollisions(self,
                             collisionTraverser,
                             avatarNodePath,
                             avatarRadius=1.4,
                             floorOffset=1.0,
                             reach=1.0):
        self.cHeadSphereNodePath = None
        self.cFloorEventSphereNodePath = None
        self.setupHeadSphere(avatarNodePath)
        self.setupFloorEventSphere(avatarNodePath,
                                   ToontownGlobals.FloorEventBitmask,
                                   avatarRadius)
        GravityWalker.initializeCollisions(self, collisionTraverser,
                                           avatarNodePath, avatarRadius,
                                           floorOffset, reach)
        return

    def setupWallSphere(self, bitmask, avatarRadius):
        self.avatarRadius = avatarRadius
        cSphere = CollisionSphere(0.0, 0.0, self.avatarRadius + 0.75,
                                  self.avatarRadius)
        cSphereNode = CollisionNode('Flyer.cWallSphereNode')
        cSphereNode.addSolid(cSphere)
        cSphereNodePath = self.avatarNodePath.attachNewNode(cSphereNode)
        cSphereNode.setFromCollideMask(bitmask)
        cSphereNode.setIntoCollideMask(BitMask32.allOff())
        if config.GetBool('want-fluid-pusher', 0):
            self.pusher = CollisionHandlerFluidPusher()
        else:
            self.pusher = CollisionHandlerPusher()
        self.pusher.addCollider(cSphereNodePath, self.avatarNodePath)
        self.cWallSphereNodePath = cSphereNodePath

    def setupEventSphere(self, bitmask, avatarRadius):
        self.avatarRadius = avatarRadius
        cSphere = CollisionSphere(0.0, 0.0, self.avatarRadius + 0.75,
                                  self.avatarRadius * 1.04)
        cSphere.setTangible(0)
        cSphereNode = CollisionNode('Flyer.cEventSphereNode')
        cSphereNode.addSolid(cSphere)
        cSphereNodePath = self.avatarNodePath.attachNewNode(cSphereNode)
        cSphereNode.setFromCollideMask(bitmask)
        cSphereNode.setIntoCollideMask(BitMask32.allOff())
        self.event = CollisionHandlerEvent()
        self.event.addInPattern('enter%in')
        self.event.addOutPattern('exit%in')
        self.cEventSphereNodePath = cSphereNodePath

    def setupRay(self, bitmask, floorOffset, reach):
        cRay = CollisionRay(0.0, 0.0, 3.0, 0.0, 0.0, -1.0)
        cRayNode = CollisionNode('Flyer.cRayNode')
        cRayNode.addSolid(cRay)
        self.cRayNodePath = self.avatarNodePath.attachNewNode(cRayNode)
        cRayNode.setFromCollideMask(bitmask)
        cRayNode.setIntoCollideMask(BitMask32.allOff())
        self.lifter = CollisionHandlerGravity()
        self.lifter.setLegacyMode(self._legacyLifter)
        self.lifter.setGravity(self.getGravity(0))
        self.lifter.addInPattern('%fn-enter-%in')
        self.lifter.addAgainPattern('%fn-again-%in')
        self.lifter.addOutPattern('%fn-exit-%in')
        self.lifter.setOffset(floorOffset)
        self.lifter.setReach(reach)
        self.lifter.addCollider(self.cRayNodePath, self.avatarNodePath)

    def setupHeadSphere(self, avatarNodePath):
        collSphere = CollisionSphere(0, 0, 0, 1)
        collSphere.setTangible(1)
        collNode = CollisionNode('Flyer.cHeadCollSphere')
        collNode.setFromCollideMask(ToontownGlobals.CeilingBitmask)
        collNode.setIntoCollideMask(BitMask32.allOff())
        collNode.addSolid(collSphere)
        self.cHeadSphereNodePath = avatarNodePath.attachNewNode(collNode)
        self.cHeadSphereNodePath.setZ(base.localAvatar.getHeight() + 1.0)
        self.headCollisionEvent = CollisionHandlerEvent()
        self.headCollisionEvent.addInPattern('%fn-enter-%in')
        self.headCollisionEvent.addOutPattern('%fn-exit-%in')
        base.cTrav.addCollider(self.cHeadSphereNodePath,
                               self.headCollisionEvent)

    def setupFloorEventSphere(self, avatarNodePath, bitmask, avatarRadius):
        cSphere = CollisionSphere(0.0, 0.0, 0.0, 0.75)
        cSphereNode = CollisionNode('Flyer.cFloorEventSphere')
        cSphereNode.addSolid(cSphere)
        cSphereNodePath = avatarNodePath.attachNewNode(cSphereNode)
        cSphereNode.setFromCollideMask(bitmask)
        cSphereNode.setIntoCollideMask(BitMask32.allOff())
        self.floorCollisionEvent = CollisionHandlerEvent()
        self.floorCollisionEvent.addInPattern('%fn-enter-%in')
        self.floorCollisionEvent.addAgainPattern('%fn-again-%in')
        self.floorCollisionEvent.addOutPattern('%fn-exit-%in')
        base.cTrav.addCollider(cSphereNodePath, self.floorCollisionEvent)
        self.cFloorEventSphereNodePath = cSphereNodePath

    def deleteCollisions(self):
        GravityWalker.deleteCollisions(self)
        if self.cHeadSphereNodePath != None:
            base.cTrav.removeCollider(self.cHeadSphereNodePath)
            self.cHeadSphereNodePath.detachNode()
            self.cHeadSphereNodePath = None
            self.headCollisionsEvent = None
        if self.cFloorEventSphereNodePath != None:
            base.cTrav.removeCollider(self.cFloorEventSphereNodePath)
            self.cFloorEventSphereNodePath.detachNode()
            self.cFloorEventSphereNodePath = None
            self.floorCollisionEvent = None
        self.cRayNodePath.detachNode()
        del self.cRayNodePath
        self.cEventSphereNodePath.detachNode()
        del self.cEventSphereNodePath
        return

    def setCollisionsActive(self, active=1):
        if self.collisionsActive != active:
            if self.cHeadSphereNodePath != None:
                base.cTrav.removeCollider(self.cHeadSphereNodePath)
                if active:
                    base.cTrav.addCollider(self.cHeadSphereNodePath,
                                           self.headCollisionEvent)
            if self.cFloorEventSphereNodePath != None:
                base.cTrav.removeCollider(self.cFloorEventSphereNodePath)
                if active:
                    base.cTrav.addCollider(self.cFloorEventSphereNodePath,
                                           self.floorCollisionEvent)
        GravityWalker.setCollisionsActive(self, active)
        return

    def enableAvatarControls(self):
        pass

    def disableAvatarControls(self):
        pass

    def handleAvatarControls(self, task):
        pass
示例#29
0
class CollisionManager:
    def __init__(self):
        self.line_dir = NodePath()

        base.cTrav = CollisionTraverser()
        self.col_handler = CollisionHandlerEvent()

        picker_node = CollisionNode("mouseRayNode")
        pickerNPos = base.camera.attachNewNode(picker_node)
        self.pickerRay = CollisionRay()
        picker_node.addSolid(self.pickerRay)

        plane_node = CollisionNode("base_plane")
        plane = base.render.attachNewNode(plane_node)
        self.plane_col = CollisionPlane(Plane(Vec3(0, 0, 1), Point3(0, 0, 0)))
        picker_node.addSolid(self.pickerRay)

        picker_node.setTag("rays", "mray")
        base.cTrav.addCollider(pickerNPos, self.col_handler)

        self.col_handler.addInPattern("%(rays)ft-into-%(type)it")
        self.col_handler.addOutPattern("%(rays)ft-out-%(type)it")
        self.col_handler.addAgainPattern("ray_again_all%("
                                         "rays"
                                         ")fh%("
                                         "type"
                                         ")ih")

        self.model = loader.loadModel("../models/chest.egg")
        self.model_node = NodePath("sdfafd")
        self.model.reparentTo(self.model_node)
        self.model_node.reparentTo(render)
        #
        #        self.text_node = TextNode("battle_text")
        #        self.text_node.setText("TEXTYTEXTYTEXTTEXT")
        #        self.text_node_path = render.attachNewNode(self.text_node)
        #        self.text_node_path.reparentTo(render)
        #        self.text_node_path.setPos(0,0,4)
        #        self.text_node_path.setHpr(0,0,0)
        #        self.text_node_path.setScale(1)
        #        #self.text_node_path.setTransparency(TransparencyAttrib.MAlpha)
        #        self.text_node.setTextColor((1,1,1,1))
        #        self.text_node.setAlign(TextNode.ALeft)

        self.placement_ghost = EditorObjects.PlacementGhost(
            0, "tower", base.object_scale)

        z = 0
        self.plane = Plane(Vec3(0, 0, 1), Point3(0, 0, z))

        taskMgr.add(self.ray_update, "updatePicker")
        taskMgr.add(self.get_mouse_plane_pos, "MousePositionOnPlane")
        taskMgr.add(self.task_mouse_press_check, "checkMousePress")

        self.input_init()

        self.pickable = None

    def input_init(self):
        self.DO = DirectObject()

        self.DO.accept('mouse1', self.mouse_click, ["1-down"])
        self.DO.accept('mouse1-up', self.mouse_click, ["1-up"])
        self.DO.accept('mouse3', self.mouse_click, ["3-down"])

        self.DO.accept('0', self.placement_ghost.change_player, [0])
        self.DO.accept('1', self.placement_ghost.change_player, [1])
        self.DO.accept('2', self.placement_ghost.change_player, [2])

        self.DO.accept('a', self.placement_ghost.change_type, ["army"])
        self.DO.accept('t', self.placement_ghost.change_type, ["tower"])

        self.DO.accept('control-s', base.xml_manager.save)

        self.DO.accept('mray-into-army', self.col_in_object)
        self.DO.accept('mray-out-army', self.col_out_object)
        self.DO.accept('mray-into-tower', self.col_in_object)
        self.DO.accept('mray-out-tower', self.col_out_object)

        self.DO.accept('ray_again_all', self.col_against_object)

    def col_against_object(self, entry):
        if entry.getIntoNodePath().getParent() != self.pickable:

            np_from = entry.getFromNodePath()
            np_into = entry.getIntoNodePath()
            self.selected_type = np_into.getTag("type")

            self.pickable = np_into.getParent()

    def col_in_object(self, entry):
        if base.state == "selecting":
            np_into = entry.getIntoNodePath()
            np_into.getParent().setColor(0.5, 0.5, 0.5, 1)

    def col_out_object(self, entry):
        np_into = entry.getIntoNodePath()
        try:
            np_into.getParent().clearColor()
        except:
            print "ERROR CLEARING COLOUR"

    def get_mouse_plane_pos(self, task):
        if base.mouseWatcherNode.hasMouse():
            mpos = base.mouseWatcherNode.getMouse()
            self.pos3d = Point3()
            nearPoint = Point3()
            farPoint = Point3()
            base.camLens.extrude(mpos, nearPoint, farPoint)
            if self.plane.intersectsLine(
                    self.pos3d, render.getRelativePoint(camera, nearPoint),
                    render.getRelativePoint(camera, farPoint)):
                #print "Mouse ray intersects ground plane at ", self.pos3d
                self.model_node.setPos(render, self.pos3d)
                self.placement_ghost.set_position(self.pos3d[0], self.pos3d[1])
        return task.again

    def ray_update(self, task):
        if base.mouseWatcherNode.hasMouse():
            mpos = base.mouseWatcherNode.getMouse()

            self.pickerRay.setFromLens(base.camNode, mpos.getX(), mpos.getY())
        return task.cont

    def task_mouse_place(self, task):
        if base.mouseWatcherNode.isButtonDown(MouseButton.one()):
            self.placing_object = True
            self.place_pos = (self.anchor_x, self.anchor_y)
            self.line_dir.remove()
            ls = LineSegs()
            ls.move_to(self.anchor_x, self.anchor_y, 1)
            ls.draw_to(self.model.getX(), self.model.getY(), 1)
            node = ls.create()
            angle1 = math.atan2(self.anchor_y - self.anchor_y,
                                self.anchor_x - self.anchor_x + 50)
            angle2 = math.atan2(self.anchor_y - self.model.getY(),
                                self.anchor_x - self.model.getY())
            final_angle = angle1 - angle2
            self.model.setHpr(final_angle, 0, 0)
            self.line_dir = NodePath(node)
            self.line_dir.reparentTo(render)
            return task.again
        else:
            self.line_dir.hide()
            taskMgr.add(self.task_mouse_press_check, "checkMousePress")
            return task.done

    def task_mouse_press_check(self, task):
        if base.mouseWatcherNode.isButtonDown(MouseButton.one()):
            #if self.multi_select == True:
            self.anchor_x, self.anchor_y = self.model.getX(), self.model.getY()
            taskMgr.add(self.task_mouse_place, "multibox")
            return task.done
        return task.again

    def mouse_click(self, status):
        print base.state
        if status == "1-down":
            if base.state == "placement":
                if self.placement_ghost.get_type() == "tower":
                    obj = self.placement_ghost.place("tower",
                                                     self.model.getX(),
                                                     self.model.getY())
                elif self.placement_ghost.get_type() == "army":
                    obj = self.placement_ghost.place("army", self.model.getX(),
                                                     self.model.getY())
                base.details_box.set_object(obj)
                base.change_state("modifying")
            elif base.state == "moving":
                obj = base.details_box.get_object()
                obj.set_position(self.pos3d[0], self.pos3d[1])
                base.change_state("modifying")
            elif base.state == "selecting" and self.pickable != None:
                obj = base.get_obj_from_node(self.pickable)
                base.details_box.set_object(obj, "selecting")
                base.change_state("modifying")
        elif status == "1-up":
            print "Mouse", status
        elif status == "3-down":
            if base.state == "placement":
                base.change_state("selecting")
            elif base.state == "selecting":
                base.change_state("placement")
class CogdoMazeLocalPlayer(CogdoMazePlayer):
    notify = directNotify.newCategory('CogdoMazeLocalPlayer')

    def __init__(self, id, toon, game, guiMgr):
        CogdoMazePlayer.__init__(self, id, toon)
        self.disableGagCollision()
        self.game = game
        self.maze = self.game.maze
        self._guiMgr = guiMgr
        self.cameraMgr = CogdoMazeCameraManager(self.toon, self.maze, camera,
                                                render)
        self._proximityRadius = self.maze.cellWidth * Globals.CameraRemoteToonRadius
        orthoDrive = OrthoDrive(
            Globals.ToonRunSpeed,
            maxFrameMove=self.maze.cellWidth / 2,
            customCollisionCallback=self.maze.doOrthoCollisions,
            wantSound=True)
        self.orthoWalk = OrthoWalk(orthoDrive)
        self._audioMgr = base.cogdoGameAudioMgr
        self._getMemoSfx = self._audioMgr.createSfx('getMemo',
                                                    source=self.toon)
        self._waterCoolerFillSfx = self._audioMgr.createSfx('waterCoolerFill',
                                                            source=self.toon)
        self._hitByDropSfx = self._audioMgr.createSfx('toonHitByDrop',
                                                      source=self.toon)
        self._winSfx = self._audioMgr.createSfx('win')
        self._loseSfx = self._audioMgr.createSfx('lose')
        self.enabled = False
        self.pickupCount = 0
        self.numEntered = 0
        self.throwPending = False
        self.coolDownAfterHitInterval = Sequence(
            Wait(Globals.HitCooldownTime),
            Func(self.setInvulnerable, False),
            name='coolDownAfterHitInterval-%i' % self.toon.doId)
        self.invulnerable = False
        self.gagHandler = CollisionHandlerEvent()
        self.gagHandler.addInPattern('%fn-into-%in')
        self.exited = False
        self.hints = {
            'find': False,
            'throw': False,
            'squashed': False,
            'boss': False,
            'minion': False
        }
        self.accept(base.JUMP, self.controlKeyPressed)

    def destroy(self):
        self.toon.showName()
        self.ignoreAll()
        self.coolDownAfterHitInterval.clearToInitial()
        del self.coolDownAfterHitInterval
        del self._getMemoSfx
        del self._waterCoolerFillSfx
        del self._hitByDropSfx
        del self._winSfx
        self.orthoWalk.stop()
        self.orthoWalk.destroy()
        del self.orthoWalk
        CogdoMazePlayer.destroy(self)

    def __initCollisions(self):
        collSphere = CollisionSphere(0, 0, 0, Globals.PlayerCollisionRadius)
        collSphere.setTangible(0)
        self.mazeCollisionName = Globals.LocalPlayerCollisionName
        collNode = CollisionNode(self.mazeCollisionName)
        collNode.addSolid(collSphere)
        collNodePath = self.toon.attachNewNode(collNode)
        collNodePath.hide()
        handler = CollisionHandlerEvent()
        handler.addInPattern('%fn-into-%in')
        base.cTrav.addCollider(collNodePath, handler)
        self.handler = handler
        self._collNodePath = collNodePath

    def clearCollisions(self):
        self.handler.clear()

    def __disableCollisions(self):
        self._collNodePath.removeNode()
        del self._collNodePath

    def _isNearPlayer(self, player):
        return self.toon.getDistance(player.toon) <= self._proximityRadius

    def update(self, dt):
        if self.getCurrentOrNextState() != 'Off':
            self._updateCamera(dt)

    def _updateCamera(self, dt):
        numPlayers = 0.0
        for player in self.game.players:
            if player != self and player.toon and self._isNearPlayer(player):
                numPlayers += 1

        d = clamp(
            Globals.CameraMinDistance + numPlayers /
            (CogdoGameConsts.MaxPlayers - 1) *
            (Globals.CameraMaxDistance - Globals.CameraMinDistance),
            Globals.CameraMinDistance, Globals.CameraMaxDistance)
        self.cameraMgr.setCameraTargetDistance(d)
        self.cameraMgr.update(dt)

    def enterOff(self):
        CogdoMazePlayer.enterOff(self)

    def exitOff(self):
        CogdoMazePlayer.exitOff(self)
        self.toon.hideName()

    def enterReady(self):
        CogdoMazePlayer.enterReady(self)
        self.cameraMgr.enable()

    def exitReady(self):
        CogdoMazePlayer.enterReady(self)

    def enterNormal(self):
        CogdoMazePlayer.enterNormal(self)
        self.orthoWalk.start()

    def exitNormal(self):
        CogdoMazePlayer.exitNormal(self)
        self.orthoWalk.stop()

    def enterHit(self, elapsedTime=0.0):
        CogdoMazePlayer.enterHit(self, elapsedTime)
        self.setInvulnerable(True)

    def exitHit(self):
        CogdoMazePlayer.exitHit(self)
        self.coolDownAfterHitInterval.clearToInitial()
        self.coolDownAfterHitInterval.start()

    def enterDone(self):
        CogdoMazePlayer.enterDone(self)
        self._guiMgr.hideQuestArrow()
        self.ignore(base.JUMP)
        self._guiMgr.setMessage('')
        if self.exited == False:
            self.lostMemos()

    def exitDone(self):
        CogdoMazePlayer.exitDone(self)

    def hitByDrop(self):
        if self.equippedGag is not None and not self.hints['squashed']:
            self._guiMgr.setMessageTemporary(TTLocalizer.CogdoMazeSquashHint,
                                             Globals.HintTimeout)
            self.hints['squashed'] = True
        self._hitByDropSfx.play()
        CogdoMazePlayer.hitByDrop(self)
        return

    def equipGag(self):
        CogdoMazePlayer.equipGag(self)
        self._waterCoolerFillSfx.play()
        messenger.send(Globals.WaterCoolerHideEventName, [])
        if not self.hints['throw']:
            self._guiMgr.setMessage(TTLocalizer.CogdoMazeThrowHint)
            self.hints['throw'] = True

    def hitSuit(self, suitType):
        if suitType == Globals.SuitTypes.Boss and not self.hints['boss']:
            self._guiMgr.setMessageTemporary(TTLocalizer.CogdoMazeBossHint,
                                             Globals.HintTimeout)
            self.hints['boss'] = True
        if suitType != Globals.SuitTypes.Boss and not self.hints['minion']:
            self._guiMgr.setMessageTemporary(TTLocalizer.CogdoMazeMinionHint,
                                             Globals.HintTimeout)
            self.hints['minion'] = True

    def createThrowGag(self, gag):
        throwGag = CogdoMazePlayer.createThrowGag(self, gag)
        collSphere = CollisionSphere(0, 0, 0, 0.5)
        collSphere.setTangible(0)
        name = Globals.GagCollisionName
        collNode = CollisionNode(name)
        collNode.setFromCollideMask(ToontownGlobals.PieBitmask)
        collNode.addSolid(collSphere)
        colNp = throwGag.attachNewNode(collNode)
        base.cTrav.addCollider(colNp, self.gagHandler)
        return throwGag

    def showToonThrowingGag(self, heading, pos):
        self._guiMgr.clearMessage()
        return CogdoMazePlayer.showToonThrowingGag(self, heading, pos)

    def removeGag(self):
        if self.equippedGag is None:
            return
        CogdoMazePlayer.removeGag(self)
        self.throwPending = False
        messenger.send(Globals.WaterCoolerShowEventName, [])
        return

    def controlKeyPressed(self):
        if self.game.finished or self.throwPending or self.getCurrentOrNextState(
        ) == 'Hit' or self.equippedGag == None:
            return
        self.throwPending = True
        heading = self.toon.getH()
        pos = self.toon.getPos()
        self.game.requestUseGag(pos.getX(), pos.getY(), heading)
        return

    def completeThrow(self):
        self.clearCollisions()
        CogdoMazePlayer.completeThrow(self)

    def shakeCamera(self, strength):
        self.cameraMgr.shake(strength)

    def getCameraShake(self):
        return self.cameraMgr.shakeStrength

    def setInvulnerable(self, bool):
        self.invulnerable = bool

    def handleGameStart(self):
        self.numEntered = len(self.game.players)
        self.__initCollisions()
        self._guiMgr.startGame(TTLocalizer.CogdoMazeFindHint)
        self.hints['find'] = True
        self.notify.info(
            'toonId:%d laff:%d/%d  %d player(s) started maze game' %
            (self.toon.doId, self.toon.hp, self.toon.maxHp,
             len(self.game.players)))

    def handleGameExit(self):
        self.cameraMgr.disable()
        self.__disableCollisions()

    def handlePickUp(self, toonId):
        if toonId == self.toon.doId:
            self.pickupCount += 1
            self._guiMgr.setPickupCount(self.pickupCount)
            if self.pickupCount == 1:
                self._guiMgr.showPickupCounter()
            self._getMemoSfx.play()

    def handleOpenDoor(self, door):
        self._guiMgr.setMessage(TTLocalizer.CogdoMazeGameDoorOpens)
        self._guiMgr.showQuestArrow(self.toon, door,
                                    Point3(0, 0,
                                           self.toon.getHeight() + 2))

    def handleTimeAlert(self):
        self._guiMgr.setMessageTemporary(TTLocalizer.CogdoMazeGameTimeAlert)

    def handleToonRevealsDoor(self, toonId, door):
        if toonId == self.toon.doId:
            self._guiMgr.setMessageTemporary(
                TTLocalizer.CogdoMazeGameLocalToonFoundExit)

    def handleToonEntersDoor(self, toonId, door):
        self.exited = True
        message = ''
        if door.getPlayerCount() < len(self.game.players):
            message = TTLocalizer.WaitingForOtherToons
        if toonId == self.toon.doId:
            self._guiMgr.setMessage(message)
            self._winSfx.play()
            self._audioMgr.stopMusic()
        self.notify.info(
            'toonId:%d laff:%d/%d  %d player(s) succeeded in maze game. Going to the executive suit building.'
            % (toonId, self.toon.hp, self.toon.maxHp, len(self.game.players)))
        if self.numEntered > len(self.game.players):
            self.notify.info('%d player(s) failed in maze game' %
                             (self.numEntered - len(self.game.players)))

    def lostMemos(self):
        self.pickupCount = 0
        self._guiMgr.setMessageTemporary(TTLocalizer.CogdoMazeGameTimeOut)
        self._guiMgr.setPickupCount(self.pickupCount)
        self.notify.info(
            'toonId:%d laff:%d/%d  %d player(s) failed in maze game' %
            (self.toon.doId, self.toon.hp, self.toon.maxHp,
             len(self.game.players)))
示例#31
0
文件: main.py 项目: gomtuu/FreeBLiTZ
class FreeBLiTZ(ShowBase):

    def __init__(self):
        from pandac.PandaModules import CollisionHandlerFloor, CollisionHandlerPusher, CollisionHandlerEvent, CollisionTraverser
        from pandac.PandaModules import DirectionalLight, AmbientLight, VBase4
        ShowBase.__init__(self)

        self.sky = self.loader.loadModel('models/sky-sphere')
        self.sky.reparentTo(self.render)
        self.stage = self.loader.loadModel('models/test-collide')
        self.stage.reparentTo(self.render)
        self.floor = self.stage.findAllMatches('**/=CollideType=floor')
        self.floor.setCollideMask(FLOOR_MASK)
        self.obstacles = self.stage.findAllMatches('**/=CollideType=obstacle')
        if self.obstacles:
            self.obstacles.setCollideMask(OBSTACLE_MASK)
        self.zones = self.stage.findAllMatches('**/=CollideType=zone')
        if self.zones:
            self.zones.setCollideMask(ZONE_MASK)
        self.create_stanchions()

        # Character rig, which allows camera to follow character
        self.char_rig = self.stage.attachNewNode('char_rig')

        self.active_char = Character('mainchar', self.char_rig)

        self.cam.reparentTo(self.char_rig)
        self.cam.setPos(0.5, -3, 1.5)
        self.cam.lookAt(0.5, 0, 1.5)

        self.light = DirectionalLight('dlight')
        self.light.setColor(VBase4(0.3, 0.28, 0.26, 1.0))
        self.lightNP = self.stage.attachNewNode(self.light)
        self.lightNP.setHpr(-75, -45, 0)
        self.stage.setLight(self.lightNP)

        self.amblight = AmbientLight('amblight')
        self.amblight.setColor(VBase4(0.7, 0.68, 0.66, 1.0))
        self.amblightNP = self.stage.attachNewNode(self.amblight)
        self.stage.setLight(self.amblightNP)

        self.accept('w', self.active_char.begin_forward)
        self.accept('a', self.active_char.begin_left)
        self.accept('s', self.active_char.begin_backward)
        self.accept('d', self.active_char.begin_right)
        self.accept('w-up', self.active_char.end_forward)
        self.accept('a-up', self.active_char.end_left)
        self.accept('s-up', self.active_char.end_backward)
        self.accept('d-up', self.active_char.end_right)
        self.taskMgr.add(self.active_char.MoveTask, 'MoveTask')

        self.look = False
        self.prev_pos = None
        self.accept('mouse2', self.begin_look)
        self.accept('mouse2-up', self.end_look)
        self.accept('mouse3', self.active_char.begin_spin)
        self.accept('mouse3-up', self.active_char.end_spin)
        self.taskMgr.add(self.MouseTask, 'MouseTask')

        self.floor_handler = CollisionHandlerFloor()
        self.floor_handler.addCollider(self.active_char.actor_from_floor, self.char_rig)
        self.wall_handler = CollisionHandlerPusher()
        self.wall_handler.addCollider(self.active_char.actor_from_obstacle, self.char_rig)
        self.zone_handler = CollisionHandlerEvent()
        self.zone_handler.addInPattern('%fn-into')
        self.zone_handler.addOutPattern('%fn-out')
        def foo(entry):
            print 'You are in the zone'
        def bar(entry):
            print 'You are not in the zone'
        self.accept('blockchar_zone-into', foo)
        self.accept('blockchar_zone-out', bar)
        self.cTrav = CollisionTraverser('main traverser')
        self.cTrav.setRespectPrevTransform(True)
        self.cTrav.addCollider(self.active_char.actor_from_floor, self.floor_handler)
        self.cTrav.addCollider(self.active_char.actor_from_obstacle, self.wall_handler)
        self.cTrav.addCollider(self.active_char.actor_from_zone, self.zone_handler)
        #self.cTrav.showCollisions(self.stage)

    def create_stanchions(self):
        from pandac.PandaModules import GeomVertexReader, CollisionNode, CollisionTube
        self.stanchions = self.stage.findAllMatches('**/=Stanchion')
        for stanchion in self.stanchions:
            geomnode = stanchion.node()
            radius = float(stanchion.getTag('Stanchion'))
            geom = geomnode.getGeom(0)
            vdata = geom.getVertexData()
            for gp in range(geom.getNumPrimitives()):
                vreader = GeomVertexReader(vdata, 'vertex')
                prim = geom.getPrimitive(gp)
                prim = prim.decompose()
                for p in range(prim.getNumPrimitives()):
                    start = prim.getPrimitiveStart(p)
                    end = prim.getPrimitiveEnd(p)
                    vertices = []
                    for v in range(start, end):
                        vi = prim.getVertex(v)
                        vreader.setRow(vi)
                        vertex = vreader.getData3f()
                        vertices.append(vertex)
                    vertices.append(vertices[0])
                    for i in range(1, len(vertices)):
                        a, b =  vertices[i-1], vertices[i]
                        stanchion_np = stanchion.attachNewNode(CollisionNode('stanchion'))
                        print 'creating cyl with radius %f from %s to %s' % (radius, a, b)
                        stanchion_np.node().addSolid(CollisionTube(a[0], a[1], a[2], b[0], b[1], b[2], radius))
                        stanchion_np.node().setFromCollideMask(OBSTACLE_MASK)
            geomnode.removeAllGeoms()

    def begin_look(self):
        self.look = True

    def end_look(self):
        self.look = False
        self.prev_pos = None

    def MouseTask(self, task):
        if self.mouseWatcherNode.hasMouse():
            (x, y) = self.mouseWatcherNode.getMouse()
            if self.prev_pos:
                if self.look or self.active_char.spinning:
                    h_diff = (x - self.prev_pos[0]) * 180
                    p_diff = (y - self.prev_pos[1]) * 90
                    new_h = clamp_deg_sign(self.char_rig.getH() - h_diff)
                    self.char_rig.setH(new_h)
                    self.cam.setP(self.cam.getP() + p_diff)
                    self.active_char.spin(new_h)
            self.prev_pos = (x, y)
        return task.cont
示例#32
0
avatarCollider = avatar.attachNewNode(CollisionNode('yolkycnode'))
avatarCollider.node().addSolid(CollisionSphere(0, 0, 0, 1))
avatarCollider.node().setFromCollideMask(WALL_MASK)
avatarCollider.node().setIntoCollideMask(BitMask32.allOff())

#** the avatar's fallout sensor - stuff already seen in former snippets, but this time we'll use it for more that to detect the fallout impact force, so we'll add another mask to look out
avatarSensor = avatarNP.attachNewNode(CollisionNode('yolkysensor'))
cs = CollisionSphere(0, 0, 0, 1.2)
avatarSensor.node().addSolid(cs)
# here the masking: note that this sensor will look for floor bashing but also for other geometries masked with TRIGGER_MASK.
avatarSensor.node().setFromCollideMask(FLOOR_MASK | TRIGGER_MASK)
avatarSensor.node().setIntoCollideMask(BitMask32.allOff())
cs.setTangible(0)

#** here's how to read the events fired by the 'sensor' while colliding with geometry we enable to collide with it.
collisionEvent.addInPattern('%fn-into')
collisionEvent.addOutPattern('%fn-out')

#** the floor ray collider for the avatar
avatarRay = avatarNP.attachNewNode(CollisionNode('avatarRay'))
avatarRay.node().addSolid(CollisionRay(0, 0, 2, 0, 0, -1))
avatarRay.node().setFromCollideMask(FLOOR_MASK)
avatarRay.node().setIntoCollideMask(BitMask32.allOff())

#** This is the scene map - we'll gather off here almost every element of the map: scenery, ground colliders, walls, and also triggers and spawn points. See the .blend source for details on the scene components.
scene = loader.loadModel("windmill")
scene.reparentTo(render)
scene.setCollideMask(BitMask32.allOff())
scene.setScale(10)
# Let's mask our main collision surfaces
floorcollider = scene.find("**/floor0/floor_collide*")
class CogdoMazeLocalPlayer(CogdoMazePlayer):
    notify = directNotify.newCategory('CogdoMazeLocalPlayer')

    def __init__(self, id, toon, game, guiMgr):
        CogdoMazePlayer.__init__(self, id, toon)
        self.disableGagCollision()
        self.game = game
        self.maze = self.game.maze
        self._guiMgr = guiMgr
        self.cameraMgr = CogdoMazeCameraManager(self.toon, self.maze, camera, render)
        self._proximityRadius = self.maze.cellWidth * Globals.CameraRemoteToonRadius
        orthoDrive = OrthoDrive(Globals.ToonRunSpeed, maxFrameMove=self.maze.cellWidth / 2, customCollisionCallback=self.maze.doOrthoCollisions, wantSound=True)
        self.orthoWalk = OrthoWalk(orthoDrive)
        self._audioMgr = base.cogdoGameAudioMgr
        self._getMemoSfx = self._audioMgr.createSfx('getMemo', source=self.toon)
        self._waterCoolerFillSfx = self._audioMgr.createSfx('waterCoolerFill', source=self.toon)
        self._hitByDropSfx = self._audioMgr.createSfx('toonHitByDrop', source=self.toon)
        self._winSfx = self._audioMgr.createSfx('win')
        self._loseSfx = self._audioMgr.createSfx('lose')
        self.enabled = False
        self.pickupCount = 0
        self.numEntered = 0
        self.throwPending = False
        self.coolDownAfterHitInterval = Sequence(Wait(Globals.HitCooldownTime), Func(self.setInvulnerable, False), name='coolDownAfterHitInterval-%i' % self.toon.doId)
        self.invulnerable = False
        self.gagHandler = CollisionHandlerEvent()
        self.gagHandler.addInPattern('%fn-into-%in')
        self.exited = False
        self.hints = {'find': False,
         'throw': False,
         'squashed': False,
         'boss': False,
         'minion': False}
        self.accept('control', self.controlKeyPressed)

    def destroy(self):
        self.toon.showName()
        self.ignoreAll()
        self.coolDownAfterHitInterval.clearToInitial()
        del self.coolDownAfterHitInterval
        del self._getMemoSfx
        del self._waterCoolerFillSfx
        del self._hitByDropSfx
        del self._winSfx
        self.orthoWalk.stop()
        self.orthoWalk.destroy()
        del self.orthoWalk
        CogdoMazePlayer.destroy(self)

    def __initCollisions(self):
        collSphere = CollisionSphere(0, 0, 0, Globals.PlayerCollisionRadius)
        collSphere.setTangible(0)
        self.mazeCollisionName = Globals.LocalPlayerCollisionName
        collNode = CollisionNode(self.mazeCollisionName)
        collNode.addSolid(collSphere)
        collNodePath = self.toon.attachNewNode(collNode)
        collNodePath.hide()
        handler = CollisionHandlerEvent()
        handler.addInPattern('%fn-into-%in')
        base.cTrav.addCollider(collNodePath, handler)
        self.handler = handler
        self._collNodePath = collNodePath

    def clearCollisions(self):
        self.handler.clear()

    def __disableCollisions(self):
        self._collNodePath.removeNode()
        del self._collNodePath

    def _isNearPlayer(self, player):
        return self.toon.getDistance(player.toon) <= self._proximityRadius

    def update(self, dt):
        if self.getCurrentOrNextState() != 'Off':
            self._updateCamera(dt)

    def _updateCamera(self, dt):
        numPlayers = 0.0
        for player in self.game.players:
            if player != self and player.toon and self._isNearPlayer(player):
                numPlayers += 1

        d = clamp(Globals.CameraMinDistance + numPlayers / (CogdoGameConsts.MaxPlayers - 1) * (Globals.CameraMaxDistance - Globals.CameraMinDistance), Globals.CameraMinDistance, Globals.CameraMaxDistance)
        self.cameraMgr.setCameraTargetDistance(d)
        self.cameraMgr.update(dt)

    def enterOff(self):
        CogdoMazePlayer.enterOff(self)

    def exitOff(self):
        CogdoMazePlayer.exitOff(self)
        self.toon.hideName()

    def enterReady(self):
        CogdoMazePlayer.enterReady(self)
        self.cameraMgr.enable()

    def exitReady(self):
        CogdoMazePlayer.enterReady(self)

    def enterNormal(self):
        CogdoMazePlayer.enterNormal(self)
        self.orthoWalk.start()

    def exitNormal(self):
        CogdoMazePlayer.exitNormal(self)
        self.orthoWalk.stop()

    def enterHit(self, elapsedTime = 0.0):
        CogdoMazePlayer.enterHit(self, elapsedTime)
        self.setInvulnerable(True)

    def exitHit(self):
        CogdoMazePlayer.exitHit(self)
        self.coolDownAfterHitInterval.clearToInitial()
        self.coolDownAfterHitInterval.start()

    def enterDone(self):
        CogdoMazePlayer.enterDone(self)
        self._guiMgr.hideQuestArrow()
        self.ignore('control')
        self._guiMgr.setMessage('')
        if self.exited == False:
            self.lostMemos()

    def exitDone(self):
        CogdoMazePlayer.exitDone(self)

    def hitByDrop(self):
        if self.equippedGag is not None and not self.hints['squashed']:
            self._guiMgr.setMessageTemporary(TTLocalizer.CogdoMazeSquashHint, Globals.HintTimeout)
            self.hints['squashed'] = True
        self._hitByDropSfx.play()
        CogdoMazePlayer.hitByDrop(self)
        return

    def equipGag(self):
        CogdoMazePlayer.equipGag(self)
        self._waterCoolerFillSfx.play()
        messenger.send(Globals.WaterCoolerHideEventName, [])
        if not self.hints['throw']:
            self._guiMgr.setMessage(TTLocalizer.CogdoMazeThrowHint)
            self.hints['throw'] = True

    def hitSuit(self, suitType):
        if suitType == Globals.SuitTypes.Boss and not self.hints['boss']:
            self._guiMgr.setMessageTemporary(TTLocalizer.CogdoMazeBossHint, Globals.HintTimeout)
            self.hints['boss'] = True
        if suitType != Globals.SuitTypes.Boss and not self.hints['minion']:
            self._guiMgr.setMessageTemporary(TTLocalizer.CogdoMazeMinionHint, Globals.HintTimeout)
            self.hints['minion'] = True

    def createThrowGag(self, gag):
        throwGag = CogdoMazePlayer.createThrowGag(self, gag)
        collSphere = CollisionSphere(0, 0, 0, 0.5)
        collSphere.setTangible(0)
        name = Globals.GagCollisionName
        collNode = CollisionNode(name)
        collNode.setFromCollideMask(ToontownGlobals.PieBitmask)
        collNode.addSolid(collSphere)
        colNp = throwGag.attachNewNode(collNode)
        base.cTrav.addCollider(colNp, self.gagHandler)
        return throwGag

    def showToonThrowingGag(self, heading, pos):
        self._guiMgr.clearMessage()
        return CogdoMazePlayer.showToonThrowingGag(self, heading, pos)

    def removeGag(self):
        if self.equippedGag is None:
            return
        CogdoMazePlayer.removeGag(self)
        self.throwPending = False
        messenger.send(Globals.WaterCoolerShowEventName, [])
        return

    def controlKeyPressed(self):
        if self.game.finished or self.throwPending or self.getCurrentOrNextState() == 'Hit' or self.equippedGag == None:
            return
        self.throwPending = True
        heading = self.toon.getH()
        pos = self.toon.getPos()
        self.game.requestUseGag(pos.getX(), pos.getY(), heading)
        return

    def completeThrow(self):
        self.clearCollisions()
        CogdoMazePlayer.completeThrow(self)

    def shakeCamera(self, strength):
        self.cameraMgr.shake(strength)

    def getCameraShake(self):
        return self.cameraMgr.shakeStrength

    def setInvulnerable(self, bool):
        self.invulnerable = bool

    def handleGameStart(self):
        self.numEntered = len(self.game.players)
        self.__initCollisions()
        self._guiMgr.startGame(TTLocalizer.CogdoMazeFindHint)
        self.hints['find'] = True
        self.notify.info('toonId:%d laff:%d/%d  %d player(s) started maze game' % (self.toon.doId,
         self.toon.hp,
         self.toon.maxHp,
         len(self.game.players)))

    def handleGameExit(self):
        self.cameraMgr.disable()
        self.__disableCollisions()

    def handlePickUp(self, toonId):
        if toonId == self.toon.doId:
            self.pickupCount += 1
            self._guiMgr.setPickupCount(self.pickupCount)
            if self.pickupCount == 1:
                self._guiMgr.showPickupCounter()
            self._getMemoSfx.play()

    def handleOpenDoor(self, door):
        self._guiMgr.setMessage(TTLocalizer.CogdoMazeGameDoorOpens)
        self._guiMgr.showQuestArrow(self.toon, door, Point3(0, 0, self.toon.getHeight() + 2))

    def handleTimeAlert(self):
        self._guiMgr.setMessageTemporary(TTLocalizer.CogdoMazeGameTimeAlert)

    def handleToonRevealsDoor(self, toonId, door):
        if toonId == self.toon.doId:
            self._guiMgr.setMessageTemporary(TTLocalizer.CogdoMazeGameLocalToonFoundExit)

    def handleToonEntersDoor(self, toonId, door):
        self.exited = True
        message = ''
        if door.getPlayerCount() < len(self.game.players):
            message = TTLocalizer.WaitingForOtherToons
        if toonId == self.toon.doId:
            self._guiMgr.setMessage(message)
            self._winSfx.play()
            self._audioMgr.stopMusic()
        self.notify.info('toonId:%d laff:%d/%d  %d player(s) succeeded in maze game. Going to the executive suit building.' % (toonId,
         self.toon.hp,
         self.toon.maxHp,
         len(self.game.players)))
        if self.numEntered > len(self.game.players):
            self.notify.info('%d player(s) failed in maze game' % (self.numEntered - len(self.game.players)))

    def lostMemos(self):
        self.pickupCount = 0
        self._guiMgr.setMessageTemporary(TTLocalizer.CogdoMazeGameTimeOut)
        self._guiMgr.setPickupCount(self.pickupCount)
        self.notify.info('toonId:%d laff:%d/%d  %d player(s) failed in maze game' % (self.toon.doId,
         self.toon.hp,
         self.toon.maxHp,
         len(self.game.players)))
示例#34
0
class DistributedIceGame(DistributedMinigame.DistributedMinigame,
                         DistributedIceWorld.DistributedIceWorld):
    notify = directNotify.newCategory('DistributedIceGame')
    MaxLocalForce = 100
    MaxPhysicsForce = 25000

    def __init__(self, cr):
        DistributedMinigame.DistributedMinigame.__init__(self, cr)
        DistributedIceWorld.DistributedIceWorld.__init__(self, cr)
        self.gameFSM = ClassicFSM.ClassicFSM('DistributedIceGame', [
            State.State('off', self.enterOff, self.exitOff, ['inputChoice']),
            State.State(
                'inputChoice', self.enterInputChoice, self.exitInputChoice,
                ['waitServerChoices', 'moveTires', 'displayVotes', 'cleanup']),
            State.State('waitServerChoices', self.enterWaitServerChoices,
                        self.exitWaitServerChoices, ['moveTires', 'cleanup']),
            State.State('moveTires', self.enterMoveTires, self.exitMoveTires,
                        ['synch', 'cleanup']),
            State.State('synch', self.enterSynch, self.exitSynch,
                        ['inputChoice', 'scoring', 'cleanup']),
            State.State('scoring', self.enterScoring, self.exitScoring,
                        ['cleanup', 'finalResults', 'inputChoice']),
            State.State('finalResults', self.enterFinalResults,
                        self.exitFinalResults, ['cleanup']),
            State.State('cleanup', self.enterCleanup, self.exitCleanup, [])
        ], 'off', 'cleanup')
        self.addChildGameFSM(self.gameFSM)
        self.cameraThreeQuarterView = (0, -22, 45, 0, -62.890000000000001, 0)
        self.tireDict = {}
        self.forceArrowDict = {}
        self.canDrive = False
        self.timer = None
        self.timerStartTime = None
        self.curForce = 0
        self.curHeading = 0
        self.headingMomentum = 0.0
        self.forceMomentum = 0.0
        self.allTireInputs = None
        self.curRound = 0
        self.curMatch = 0
        self.controlKeyWarningLabel = DirectLabel(
            text=TTLocalizer.IceGameControlKeyWarning,
            text_fg=VBase4(1, 0, 0, 1),
            relief=None,
            pos=(0.0, 0, 0),
            scale=0.14999999999999999)
        self.controlKeyWarningLabel.hide()
        self.waitingMoveLabel = DirectLabel(
            text=TTLocalizer.IceGameWaitingForPlayersToFinishMove,
            text_fg=VBase4(1, 1, 1, 1),
            relief=None,
            pos=(-0.59999999999999998, 0, -0.75),
            scale=0.074999999999999997)
        self.waitingMoveLabel.hide()
        self.waitingSyncLabel = DirectLabel(
            text=TTLocalizer.IceGameWaitingForAISync,
            text_fg=VBase4(1, 1, 1, 1),
            relief=None,
            pos=(-0.59999999999999998, 0, -0.75),
            scale=0.074999999999999997)
        self.waitingSyncLabel.hide()
        self.infoLabel = DirectLabel(text='',
                                     text_fg=VBase4(0, 0, 0, 1),
                                     relief=None,
                                     pos=(0.0, 0, 0.69999999999999996),
                                     scale=0.074999999999999997)
        self.updateInfoLabel()
        self.lastForceArrowUpdateTime = 0
        self.sendForceArrowUpdateAsap = False
        self.treasures = []
        self.penalties = []
        self.obstacles = []
        self.controlKeyPressed = False
        self.controlKeyWarningIval = None

    def delete(self):
        DistributedIceWorld.DistributedIceWorld.delete(self)
        DistributedMinigame.DistributedMinigame.delete(self)
        if self.controlKeyWarningIval:
            self.controlKeyWarningIval.finish()
            self.controlKeyWarningIval = None

        self.controlKeyWarningLabel.destroy()
        del self.controlKeyWarningLabel
        self.waitingMoveLabel.destroy()
        del self.waitingMoveLabel
        self.waitingSyncLabel.destroy()
        del self.waitingSyncLabel
        self.infoLabel.destroy()
        del self.infoLabel
        for treasure in self.treasures:
            treasure.destroy()

        del self.treasures
        for penalty in self.penalties:
            penalty.destroy()

        del self.penalties
        for obstacle in self.obstacles:
            obstacle.removeNode()

        del self.obstacles
        del self.gameFSM

    def announceGenerate(self):
        DistributedMinigame.DistributedMinigame.announceGenerate(self)
        DistributedIceWorld.DistributedIceWorld.announceGenerate(self)
        self.debugTaskName = self.uniqueName('debugTask')

    def getTitle(self):
        return TTLocalizer.IceGameTitle

    def getInstructions(self):
        szId = self.getSafezoneId()
        numPenalties = IceGameGlobals.NumPenalties[szId]
        result = TTLocalizer.IceGameInstructions
        if numPenalties == 0:
            result = TTLocalizer.IceGameInstructionsNoTnt

        return result

    def getMaxDuration(self):
        return 0

    def load(self):
        self.notify.debug('load')
        DistributedMinigame.DistributedMinigame.load(self)
        self.music = base.loadMusic('phase_4/audio/bgm/MG_IceGame.mid')
        self.gameBoard = loader.loadModel(
            'phase_4/models/minigames/ice_game_icerink')
        background = loader.loadModel('phase_4/models/minigames/ice_game_2d')
        background.reparentTo(self.gameBoard)
        self.gameBoard.setPosHpr(0, 0, 0, 0, 0, 0)
        self.gameBoard.setScale(1.0)
        self.setupSimulation()
        index = 0
        for avId in self.avIdList:
            self.setupTire(avId, index)
            self.setupForceArrow(avId)
            index += 1

        for index in xrange(len(self.avIdList), 4):
            self.setupTire(-index, index)
            self.setupForceArrow(-index)

        self.showForceArrows(realPlayersOnly=True)
        self.westWallModel = NodePath()
        if not self.westWallModel.isEmpty():
            self.westWallModel.reparentTo(self.gameBoard)
            self.westWallModel.setPos(IceGameGlobals.MinWall[0],
                                      IceGameGlobals.MinWall[1], 0)
            self.westWallModel.setScale(4)

        self.eastWallModel = NodePath()
        if not self.eastWallModel.isEmpty():
            self.eastWallModel.reparentTo(self.gameBoard)
            self.eastWallModel.setPos(IceGameGlobals.MaxWall[0],
                                      IceGameGlobals.MaxWall[1], 0)
            self.eastWallModel.setScale(4)
            self.eastWallModel.setH(180)

        self.arrowKeys = ArrowKeys.ArrowKeys()
        self.target = loader.loadModel('phase_3/models/misc/sphere')
        self.target.setScale(0.01)
        self.target.reparentTo(self.gameBoard)
        self.target.setPos(0, 0, 0)
        self.scoreCircle = loader.loadModel(
            'phase_4/models/minigames/ice_game_score_circle')
        self.scoreCircle.setScale(0.01)
        self.scoreCircle.reparentTo(self.gameBoard)
        self.scoreCircle.setZ(IceGameGlobals.TireRadius / 2.0)
        self.scoreCircle.setAlphaScale(0.5)
        self.scoreCircle.setTransparency(1)
        self.scoreCircle.hide()
        self.treasureModel = loader.loadModel(
            'phase_4/models/minigames/ice_game_barrel')
        self.penaltyModel = loader.loadModel(
            'phase_4/models/minigames/ice_game_tnt2')
        self.penaltyModel.setScale(0.75, 0.75, 0.69999999999999996)
        szId = self.getSafezoneId()
        obstacles = IceGameGlobals.Obstacles[szId]
        index = 0
        cubicObstacle = IceGameGlobals.ObstacleShapes[szId]
        for pos in obstacles:
            newPos = Point3(pos[0], pos[1], IceGameGlobals.TireRadius)
            newObstacle = self.createObstacle(newPos, index, cubicObstacle)
            self.obstacles.append(newObstacle)
            index += 1

        self.countSound = loader.loadSfx(
            'phase_3.5/audio/sfx/tick_counter.mp3')
        self.treasureGrabSound = loader.loadSfx(
            'phase_4/audio/sfx/MG_sfx_vine_game_bananas.mp3')
        self.penaltyGrabSound = loader.loadSfx(
            'phase_4/audio/sfx/MG_cannon_fire_alt.mp3')
        self.tireSounds = []
        for tireIndex in xrange(4):
            tireHit = loader.loadSfx(
                'phase_4/audio/sfx/Golf_Hit_Barrier_1.mp3')
            wallHit = loader.loadSfx('phase_4/audio/sfx/MG_maze_pickup.mp3')
            obstacleHit = loader.loadSfx(
                'phase_4/audio/sfx/Golf_Hit_Barrier_2.mp3')
            self.tireSounds.append({
                'tireHit': tireHit,
                'wallHit': wallHit,
                'obstacleHit': obstacleHit
            })

        self.arrowRotateSound = loader.loadSfx(
            'phase_4/audio/sfx/MG_sfx_ice_force_rotate.wav')
        self.arrowUpSound = loader.loadSfx(
            'phase_4/audio/sfx/MG_sfx_ice_force_increase_3sec.mp3')
        self.arrowDownSound = loader.loadSfx(
            'phase_4/audio/sfx/MG_sfx_ice_force_decrease_3sec.mp3')
        self.scoreCircleSound = loader.loadSfx(
            'phase_4/audio/sfx/MG_sfx_ice_scoring_1.mp3')

    def unload(self):
        self.notify.debug('unload')
        DistributedMinigame.DistributedMinigame.unload(self)
        del self.music
        self.gameBoard.removeNode()
        del self.gameBoard
        for forceArrow in self.forceArrowDict.values():
            forceArrow.removeNode()

        del self.forceArrowDict
        self.scoreCircle.removeNode()
        del self.scoreCircle
        del self.countSound

    def onstage(self):
        self.notify.debug('onstage')
        DistributedMinigame.DistributedMinigame.onstage(self)
        self.gameBoard.reparentTo(render)
        self._DistributedIceGame__placeToon(self.localAvId)
        self.moveCameraToTop()
        self.scorePanels = []
        base.playMusic(self.music, looping=1, volume=0.80000000000000004)

    def offstage(self):
        self.notify.debug('offstage')
        self.music.stop()
        self.gameBoard.hide()
        self.infoLabel.hide()
        for avId in self.tireDict:
            self.tireDict[avId]['tireNodePath'].hide()

        for panel in self.scorePanels:
            panel.cleanup()

        del self.scorePanels
        for obstacle in self.obstacles:
            obstacle.hide()

        for treasure in self.treasures:
            treasure.nodePath.hide()

        for penalty in self.penalties:
            penalty.nodePath.hide()

        for avId in self.avIdList:
            av = self.getAvatar(avId)
            if av:
                av.dropShadow.show()
                av.resetLOD()
                continue

        taskMgr.remove(self.uniqueName('aimtask'))
        self.arrowKeys.destroy()
        del self.arrowKeys
        DistributedMinigame.DistributedMinigame.offstage(self)

    def handleDisabledAvatar(self, avId):
        self.notify.debug('handleDisabledAvatar')
        self.notify.debug('avatar ' + str(avId) + ' disabled')
        DistributedMinigame.DistributedMinigame.handleDisabledAvatar(
            self, avId)

    def setGameReady(self):
        if not self.hasLocalToon:
            return None

        self.notify.debug('setGameReady')
        if DistributedMinigame.DistributedMinigame.setGameReady(self):
            return None

        for index in xrange(self.numPlayers):
            avId = self.avIdList[index]
            toon = self.getAvatar(avId)
            if toon:
                toon.reparentTo(render)
                self._DistributedIceGame__placeToon(avId)
                toon.forwardSpeed = 0
                toon.rotateSpeed = False
                toon.dropShadow.hide()
                toon.setAnimState('Sit')
                if avId in self.tireDict:
                    tireNp = self.tireDict[avId]['tireNodePath']
                    toon.reparentTo(tireNp)
                    toon.setY(1.0)
                    toon.setZ(-3)

                toon.startLookAround()
                continue

    def setGameStart(self, timestamp):
        if not self.hasLocalToon:
            return None

        self.notify.debug('setGameStart')
        DistributedMinigame.DistributedMinigame.setGameStart(self, timestamp)
        for avId in self.remoteAvIdList:
            toon = self.getAvatar(avId)
            if toon:
                toon.stopLookAround()
                continue

        self.scores = [0] * self.numPlayers
        spacing = 0.40000000000000002
        for i in xrange(self.numPlayers):
            avId = self.avIdList[i]
            avName = self.getAvatarName(avId)
            scorePanel = MinigameAvatarScorePanel.MinigameAvatarScorePanel(
                avId, avName)
            scorePanel.setScale(0.90000000000000002)
            scorePanel.setPos(0.75 - spacing * (self.numPlayers - 1 - i), 0.0,
                              0.875)
            scorePanel.makeTransparent(0.75)
            self.scorePanels.append(scorePanel)

        self.arrowKeys.setPressHandlers([
            self._DistributedIceGame__upArrowPressed,
            self._DistributedIceGame__downArrowPressed,
            self._DistributedIceGame__leftArrowPressed,
            self._DistributedIceGame__rightArrowPressed,
            self._DistributedIceGame__controlPressed
        ])

    def isInPlayState(self):
        if not self.gameFSM.getCurrentState():
            return False

        if not self.gameFSM.getCurrentState().getName() == 'play':
            return False

        return True

    def enterOff(self):
        self.notify.debug('enterOff')

    def exitOff(self):
        pass

    def enterInputChoice(self):
        self.notify.debug('enterInputChoice')
        self.forceLocalToonToTire()
        self.controlKeyPressed = False
        if self.curRound == 0:
            self.setupStartOfMatch()
        else:
            self.notify.debug('self.curRound = %s' % self.curRound)
        self.timer = ToontownTimer.ToontownTimer()
        self.timer.hide()
        if self.timerStartTime != None:
            self.startTimer()

        self.showForceArrows(realPlayersOnly=True)
        self.localForceArrow().setPosHpr(0, 0, -1.0, 0, 0, 0)
        self.localForceArrow().reparentTo(self.localTireNp())
        self.localForceArrow().setY(IceGameGlobals.TireRadius)
        self.localTireNp().headsUp(self.target)
        self.notify.debug('self.localForceArrow() heading = %s' %
                          self.localForceArrow().getH())
        self.curHeading = self.localTireNp().getH()
        self.curForce = 25
        self.updateLocalForceArrow()
        for avId in self.forceArrowDict:
            forceArrow = self.forceArrowDict[avId]
            forceArrow.setPosHpr(0, 0, -1.0, 0, 0, 0)
            tireNp = self.tireDict[avId]['tireNodePath']
            forceArrow.reparentTo(tireNp)
            forceArrow.setY(IceGameGlobals.TireRadius)
            tireNp.headsUp(self.target)
            self.updateForceArrow(avId, tireNp.getH(), 25)

        taskMgr.add(self._DistributedIceGame__aimTask,
                    self.uniqueName('aimtask'))
        if base.localAvatar.laffMeter:
            base.localAvatar.laffMeter.stop()

        self.sendForceArrowUpdateAsap = False

    def exitInputChoice(self):
        if not self.controlKeyPressed:
            if self.controlKeyWarningIval:
                self.controlKeyWarningIval.finish()
                self.controlKeyWarningIval = None

            self.controlKeyWarningIval = Sequence(
                Func(self.controlKeyWarningLabel.show),
                self.controlKeyWarningLabel.colorScaleInterval(
                    10, VBase4(1, 1, 1, 0), startColorScale=VBase4(1, 1, 1,
                                                                   1)),
                Func(self.controlKeyWarningLabel.hide))
            self.controlKeyWarningIval.start()

        if self.timer != None:
            self.timer.destroy()
            self.timer = None

        self.timerStartTime = None
        self.hideForceArrows()
        self.arrowRotateSound.stop()
        self.arrowUpSound.stop()
        self.arrowDownSound.stop()
        taskMgr.remove(self.uniqueName('aimtask'))

    def enterWaitServerChoices(self):
        self.waitingMoveLabel.show()
        self.showForceArrows(True)

    def exitWaitServerChoices(self):
        self.waitingMoveLabel.hide()
        self.hideForceArrows()

    def enterMoveTires(self):
        for key in self.tireDict:
            body = self.tireDict[key]['tireBody']
            body.setAngularVel(0, 0, 0)
            body.setLinearVel(0, 0, 0)

        for index in xrange(len(self.allTireInputs)):
            input = self.allTireInputs[index]
            avId = self.avIdList[index]
            body = self.getTireBody(avId)
            degs = input[1] + 90
            tireNp = self.getTireNp(avId)
            tireH = tireNp.getH()
            self.notify.debug('tireH = %s' % tireH)
            radAngle = deg2Rad(degs)
            foo = NodePath('foo')
            dirVector = Vec3(math.cos(radAngle), math.sin(radAngle), 0)
            self.notify.debug('dirVector is now=%s' % dirVector)
            inputForce = input[0]
            inputForce /= self.MaxLocalForce
            inputForce *= self.MaxPhysicsForce
            force = dirVector * inputForce
            self.notify.debug('adding force %s to %d' % (force, avId))
            body.addForce(force)

        self.enableAllTireBodies()
        self.totalPhysicsSteps = 0
        self.startSim()
        taskMgr.add(self._DistributedIceGame__moveTiresTask,
                    self.uniqueName('moveTiresTtask'))

    def exitMoveTires(self):
        self.forceLocalToonToTire()
        self.disableAllTireBodies()
        self.stopSim()
        self.notify.debug('total Physics steps = %d' % self.totalPhysicsSteps)
        taskMgr.remove(self.uniqueName('moveTiresTtask'))

    def enterSynch(self):
        self.waitingSyncLabel.show()

    def exitSynch(self):
        self.waitingSyncLabel.hide()

    def enterScoring(self):
        sortedByDistance = []
        for avId in self.avIdList:
            np = self.getTireNp(avId)
            pos = np.getPos()
            pos.setZ(0)
            sortedByDistance.append((avId, pos.length()))

        def compareDistance(x, y):
            if x[1] - y[1] > 0:
                return 1
            elif x[1] - y[1] < 0:
                return -1
            else:
                return 0

        sortedByDistance.sort(cmp=compareDistance)
        self.scoreMovie = Sequence()
        curScale = 0.01
        curTime = 0
        self.scoreCircle.setScale(0.01)
        self.scoreCircle.show()
        self.notify.debug('newScores = %s' % self.newScores)
        circleStartTime = 0
        for index in xrange(len(sortedByDistance)):
            distance = sortedByDistance[index][1]
            avId = sortedByDistance[index][0]
            scorePanelIndex = self.avIdList.index(avId)
            time = (distance - curScale) / IceGameGlobals.ExpandFeetPerSec
            if time < 0:
                time = 0.01

            scaleXY = distance + IceGameGlobals.TireRadius
            self.notify.debug('circleStartTime = %s' % circleStartTime)
            self.scoreMovie.append(
                Parallel(
                    LerpScaleInterval(self.scoreCircle, time,
                                      Point3(scaleXY, scaleXY, 1.0)),
                    SoundInterval(self.scoreCircleSound,
                                  duration=time,
                                  startTime=circleStartTime)))
            circleStartTime += time
            startScore = self.scorePanels[scorePanelIndex].getScore()
            destScore = self.newScores[scorePanelIndex]
            self.notify.debug('for avId %d, startScore=%d, newScores=%d' %
                              (avId, startScore, destScore))

            def increaseScores(t,
                               scorePanelIndex=scorePanelIndex,
                               startScore=startScore,
                               destScore=destScore):
                oldScore = self.scorePanels[scorePanelIndex].getScore()
                diff = destScore - startScore
                newScore = int(startScore + diff * t)
                if newScore > oldScore:
                    base.playSfx(self.countSound)

                self.scorePanels[scorePanelIndex].setScore(newScore)
                self.scores[scorePanelIndex] = newScore

            duration = (destScore -
                        startScore) * IceGameGlobals.ScoreCountUpRate
            tireNp = self.tireDict[avId]['tireNodePath']
            self.scoreMovie.append(
                Parallel(
                    LerpFunctionInterval(increaseScores, duration),
                    Sequence(
                        LerpColorScaleInterval(tireNp, duration / 6.0,
                                               VBase4(1, 0, 0, 1)),
                        LerpColorScaleInterval(tireNp, duration / 6.0,
                                               VBase4(1, 1, 1, 1)),
                        LerpColorScaleInterval(tireNp, duration / 6.0,
                                               VBase4(1, 0, 0, 1)),
                        LerpColorScaleInterval(tireNp, duration / 6.0,
                                               VBase4(1, 1, 1, 1)),
                        LerpColorScaleInterval(tireNp, duration / 6.0,
                                               VBase4(1, 0, 0, 1)),
                        LerpColorScaleInterval(tireNp, duration / 6.0,
                                               VBase4(1, 1, 1, 1)))))
            curScale += distance

        self.scoreMovie.append(
            Func(self.sendUpdate, 'reportScoringMovieDone', []))
        self.scoreMovie.start()

    def exitScoring(self):
        self.scoreMovie.finish()
        self.scoreMovie = None
        self.scoreCircle.hide()

    def enterFinalResults(self):
        lerpTrack = Parallel()
        lerpDur = 0.5
        tY = 0.59999999999999998
        bY = -0.050000000000000003
        lX = -0.5
        cX = 0
        rX = 0.5
        scorePanelLocs = (((cX, bY), ), ((lX, bY), (rX, bY)),
                          ((cX, tY), (lX, bY), (rX, bY)), ((lX, tY), (rX, tY),
                                                           (lX, bY), (rX, bY)))
        scorePanelLocs = scorePanelLocs[self.numPlayers - 1]
        for i in xrange(self.numPlayers):
            panel = self.scorePanels[i]
            pos = scorePanelLocs[i]
            lerpTrack.append(
                Parallel(
                    LerpPosInterval(panel,
                                    lerpDur,
                                    Point3(pos[0], 0, pos[1]),
                                    blendType='easeInOut'),
                    LerpScaleInterval(panel,
                                      lerpDur,
                                      Vec3(panel.getScale()) * 2.0,
                                      blendType='easeInOut')))

        self.showScoreTrack = Parallel(
            lerpTrack,
            Sequence(Wait(IceGameGlobals.ShowScoresDuration),
                     Func(self.gameOver)))
        self.showScoreTrack.start()

    def exitFinalResults(self):
        self.showScoreTrack.pause()
        del self.showScoreTrack

    def enterCleanup(self):
        self.notify.debug('enterCleanup')
        if base.localAvatar.laffMeter:
            base.localAvatar.laffMeter.start()

    def exitCleanup(self):
        pass

    def _DistributedIceGame__placeToon(self, avId):
        toon = self.getAvatar(avId)
        if toon:
            toon.setPos(0, 0, 0)
            toon.setHpr(0, 0, 0)

    def moveCameraToTop(self):
        camera.reparentTo(render)
        p = self.cameraThreeQuarterView
        camera.setPosHpr(p[0], p[1], p[2], p[3], p[4], p[5])

    def setupTire(self, avId, index):
        (tireNp, tireBody, tireOdeGeom) = self.createTire(index)
        self.tireDict[avId] = {
            'tireNodePath': tireNp,
            'tireBody': tireBody,
            'tireOdeGeom': tireOdeGeom
        }
        if avId <= 0:
            tireBlocker = tireNp.find('**/tireblockermesh')
            if not tireBlocker.isEmpty():
                tireBlocker.hide()

        if avId == self.localAvId:
            tireNp = self.tireDict[avId]['tireNodePath']
            self.treasureSphereName = 'treasureCollider'
            self.treasureCollSphere = CollisionSphere(
                0, 0, 0, IceGameGlobals.TireRadius)
            self.treasureCollSphere.setTangible(0)
            self.treasureCollNode = CollisionNode(self.treasureSphereName)
            self.treasureCollNode.setFromCollideMask(
                ToontownGlobals.PieBitmask)
            self.treasureCollNode.addSolid(self.treasureCollSphere)
            self.treasureCollNodePath = tireNp.attachNewNode(
                self.treasureCollNode)
            self.treasureHandler = CollisionHandlerEvent()
            self.treasureHandler.addInPattern('%fn-intoTreasure')
            base.cTrav.addCollider(self.treasureCollNodePath,
                                   self.treasureHandler)
            eventName = '%s-intoTreasure' % self.treasureCollNodePath.getName()
            self.notify.debug('eventName = %s' % eventName)
            self.accept(eventName, self.toonHitSomething)

    def setupForceArrow(self, avId):
        arrow = loader.loadModel('phase_4/models/minigames/ice_game_arrow')
        priority = 0
        if avId < 0:
            priority = -avId
        else:
            priority = self.avIdList.index(avId)
            if avId == self.localAvId:
                priority = 10

        self.forceArrowDict[avId] = arrow

    def hideForceArrows(self):
        for forceArrow in self.forceArrowDict.values():
            forceArrow.hide()

    def showForceArrows(self, realPlayersOnly=True):
        for avId in self.forceArrowDict:
            if realPlayersOnly:
                if avId > 0:
                    self.forceArrowDict[avId].show()
                else:
                    self.forceArrowDict[avId].hide()
            avId > 0
            self.forceArrowDict[avId].show()

    def localForceArrow(self):
        if self.localAvId in self.forceArrowDict:
            return self.forceArrowDict[self.localAvId]
        else:
            return None

    def setChoices(self, input0, input1, input2, input3):
        pass

    def startDebugTask(self):
        taskMgr.add(self.debugTask, self.debugTaskName)

    def stopDebugTask(self):
        taskMgr.remove(self.debugTaskName)

    def debugTask(self, task):
        if self.canDrive and self.tireDict.has_key(localAvatar.doId):
            dt = globalClock.getDt()
            forceMove = 25000
            forceMoveDt = forceMove
            tireBody = self.tireDict[localAvatar.doId]['tireBody']
            if self.arrowKeys.upPressed() and not tireBody.isEnabled():
                x = 0
                y = 1
                tireBody.enable()
                tireBody.addForce(Vec3(x * forceMoveDt, y * forceMoveDt, 0))

            if self.arrowKeys.downPressed() and not tireBody.isEnabled():
                x = 0
                y = -1
                tireBody.enable()
                tireBody.addForce(Vec3(x * forceMoveDt, y * forceMoveDt, 0))

            if self.arrowKeys.leftPressed() and not tireBody.isEnabled():
                x = -1
                y = 0
                tireBody.enable()
                tireBody.addForce(Vec3(x * forceMoveDt, y * forceMoveDt, 0))

            if self.arrowKeys.rightPressed() and not tireBody.isEnabled():
                x = 1
                y = 0
                tireBody.enable()
                tireBody.addForce(Vec3(x * forceMoveDt, y * forceMoveDt, 0))

        return task.cont

    def _DistributedIceGame__upArrowPressed(self):
        pass

    def _DistributedIceGame__downArrowPressed(self):
        pass

    def _DistributedIceGame__leftArrowPressed(self):
        pass

    def _DistributedIceGame__rightArrowPressed(self):
        pass

    def _DistributedIceGame__controlPressed(self):
        if self.gameFSM.getCurrentState().getName() == 'inputChoice':
            self.sendForceArrowUpdateAsap = True
            self.updateLocalForceArrow()
            self.controlKeyPressed = True
            self.sendUpdate('setAvatarChoice',
                            [self.curForce, self.curHeading])
            self.gameFSM.request('waitServerChoices')

    def startTimer(self):
        now = globalClock.getFrameTime()
        elapsed = now - self.timerStartTime
        self.timer.posInTopRightCorner()
        self.timer.setTime(IceGameGlobals.InputTimeout)
        self.timer.countdown(IceGameGlobals.InputTimeout - elapsed,
                             self.handleChoiceTimeout)
        self.timer.show()

    def setTimerStartTime(self, timestamp):
        if not self.hasLocalToon:
            return None

        self.timerStartTime = globalClockDelta.networkToLocalTime(timestamp)
        if self.timer != None:
            self.startTimer()

    def handleChoiceTimeout(self):
        self.sendUpdate('setAvatarChoice', [0, 0])
        self.gameFSM.request('waitServerChoices')

    def localTireNp(self):
        ret = None
        if self.localAvId in self.tireDict:
            ret = self.tireDict[self.localAvId]['tireNodePath']

        return ret

    def localTireBody(self):
        ret = None
        if self.localAvId in self.tireDict:
            ret = self.tireDict[self.localAvId]['tireBody']

        return ret

    def getTireBody(self, avId):
        ret = None
        if avId in self.tireDict:
            ret = self.tireDict[avId]['tireBody']

        return ret

    def getTireNp(self, avId):
        ret = None
        if avId in self.tireDict:
            ret = self.tireDict[avId]['tireNodePath']

        return ret

    def updateForceArrow(self, avId, curHeading, curForce):
        forceArrow = self.forceArrowDict[avId]
        tireNp = self.tireDict[avId]['tireNodePath']
        tireNp.setH(curHeading)
        tireBody = self.tireDict[avId]['tireBody']
        tireBody.setQuaternion(tireNp.getQuat())
        self.notify.debug('curHeading = %s' % curHeading)
        yScale = curForce / 100.0
        yScale *= 1
        headY = yScale * 15
        xScale = (yScale - 1) / 2.0 + 1.0
        shaft = forceArrow.find('**/arrow_shaft')
        head = forceArrow.find('**/arrow_head')
        shaft.setScale(xScale, yScale, 1)
        head.setPos(0, headY, 0)
        head.setScale(xScale, xScale, 1)

    def updateLocalForceArrow(self):
        avId = self.localAvId
        self.b_setForceArrowInfo(avId, self.curHeading, self.curForce)

    def _DistributedIceGame__aimTask(self, task):
        if not hasattr(self, 'arrowKeys'):
            return task.done

        dt = globalClock.getDt()
        headingMomentumChange = dt * 60.0
        forceMomentumChange = dt * 160.0
        arrowUpdate = False
        arrowRotating = False
        arrowUp = False
        arrowDown = False
        if self.arrowKeys.upPressed() and not self.arrowKeys.downPressed():
            self.forceMomentum += forceMomentumChange
            if self.forceMomentum < 0:
                self.forceMomentum = 0

            if self.forceMomentum > 50:
                self.forceMomentum = 50

            oldForce = self.curForce
            self.curForce += self.forceMomentum * dt
            arrowUpdate = True
            if oldForce < self.MaxLocalForce:
                arrowUp = True

        elif self.arrowKeys.downPressed() and not self.arrowKeys.upPressed():
            self.forceMomentum += forceMomentumChange
            if self.forceMomentum < 0:
                self.forceMomentum = 0

            if self.forceMomentum > 50:
                self.forceMomentum = 50

            oldForce = self.curForce
            self.curForce -= self.forceMomentum * dt
            arrowUpdate = True
            if oldForce > 0.01:
                arrowDown = True

        else:
            self.forceMomentum = 0
        if self.arrowKeys.leftPressed() and not self.arrowKeys.rightPressed():
            self.headingMomentum += headingMomentumChange
            if self.headingMomentum < 0:
                self.headingMomentum = 0

            if self.headingMomentum > 50:
                self.headingMomentum = 50

            self.curHeading += self.headingMomentum * dt
            arrowUpdate = True
            arrowRotating = True
        elif self.arrowKeys.rightPressed(
        ) and not self.arrowKeys.leftPressed():
            self.headingMomentum += headingMomentumChange
            if self.headingMomentum < 0:
                self.headingMomentum = 0

            if self.headingMomentum > 50:
                self.headingMomentum = 50

            self.curHeading -= self.headingMomentum * dt
            arrowUpdate = True
            arrowRotating = True
        else:
            self.headingMomentum = 0
        if arrowUpdate:
            self.normalizeHeadingAndForce()
            self.updateLocalForceArrow()

        if arrowRotating:
            if not self.arrowRotateSound.status(
            ) == self.arrowRotateSound.PLAYING:
                base.playSfx(self.arrowRotateSound, looping=True)

        else:
            self.arrowRotateSound.stop()
        if arrowUp:
            if not self.arrowUpSound.status() == self.arrowUpSound.PLAYING:
                base.playSfx(self.arrowUpSound, looping=False)

        else:
            self.arrowUpSound.stop()
        if arrowDown:
            if not self.arrowDownSound.status() == self.arrowDownSound.PLAYING:
                base.playSfx(self.arrowDownSound, looping=False)

        else:
            self.arrowDownSound.stop()
        return task.cont

    def normalizeHeadingAndForce(self):
        if self.curForce > self.MaxLocalForce:
            self.curForce = self.MaxLocalForce

        if self.curForce < 0.01:
            self.curForce = 0.01

    def setTireInputs(self, tireInputs):
        if not self.hasLocalToon:
            return None

        self.allTireInputs = tireInputs
        self.gameFSM.request('moveTires')

    def enableAllTireBodies(self):
        for avId in self.tireDict.keys():
            self.tireDict[avId]['tireBody'].enable()

    def disableAllTireBodies(self):
        for avId in self.tireDict.keys():
            self.tireDict[avId]['tireBody'].disable()

    def areAllTiresDisabled(self):
        for avId in self.tireDict.keys():
            if self.tireDict[avId]['tireBody'].isEnabled():
                return False
                continue

        return True

    def _DistributedIceGame__moveTiresTask(self, task):
        if self.areAllTiresDisabled():
            self.sendTirePositions()
            self.gameFSM.request('synch')
            return task.done

        return task.cont

    def sendTirePositions(self):
        tirePositions = []
        for index in xrange(len(self.avIdList)):
            avId = self.avIdList[index]
            tire = self.getTireBody(avId)
            pos = Point3(tire.getPosition())
            tirePositions.append([pos[0], pos[1], pos[2]])

        for index in xrange(len(self.avIdList), 4):
            avId = -index
            tire = self.getTireBody(avId)
            pos = Point3(tire.getPosition())
            tirePositions.append([pos[0], pos[1], pos[2]])

        self.sendUpdate('endingPositions', [tirePositions])

    def setFinalPositions(self, finalPos):
        if not self.hasLocalToon:
            return None

        for index in xrange(len(self.avIdList)):
            avId = self.avIdList[index]
            tire = self.getTireBody(avId)
            np = self.getTireNp(avId)
            pos = finalPos[index]
            tire.setPosition(pos[0], pos[1], pos[2])
            np.setPos(pos[0], pos[1], pos[2])

        for index in xrange(len(self.avIdList), 4):
            avId = -index
            tire = self.getTireBody(avId)
            np = self.getTireNp(avId)
            pos = finalPos[index]
            tire.setPosition(pos[0], pos[1], pos[2])
            np.setPos(pos[0], pos[1], pos[2])

    def updateInfoLabel(self):
        self.infoLabel['text'] = TTLocalizer.IceGameInfo % {
            'curMatch': self.curMatch + 1,
            'numMatch': IceGameGlobals.NumMatches,
            'curRound': self.curRound + 1,
            'numRound': IceGameGlobals.NumRounds
        }

    def setMatchAndRound(self, match, round):
        if not self.hasLocalToon:
            return None

        self.curMatch = match
        self.curRound = round
        self.updateInfoLabel()

    def setScores(self, match, round, scores):
        if not self.hasLocalToon:
            return None

        self.newMatch = match
        self.newRound = round
        self.newScores = scores

    def setNewState(self, state):
        if not self.hasLocalToon:
            return None

        self.notify.debug('setNewState gameFSM=%s newState=%s' %
                          (self.gameFSM, state))
        self.gameFSM.request(state)

    def putAllTiresInStartingPositions(self):
        for index in xrange(len(self.avIdList)):
            avId = self.avIdList[index]
            np = self.tireDict[avId]['tireNodePath']
            np.setPos(IceGameGlobals.StartingPositions[index])
            self.notify.debug('avId=%s newPos=%s' % (avId, np.getPos))
            np.setHpr(0, 0, 0)
            quat = np.getQuat()
            body = self.tireDict[avId]['tireBody']
            body.setPosition(IceGameGlobals.StartingPositions[index])
            body.setQuaternion(quat)

        for index in xrange(len(self.avIdList), 4):
            avId = -index
            np = self.tireDict[avId]['tireNodePath']
            np.setPos(IceGameGlobals.StartingPositions[index])
            self.notify.debug('avId=%s newPos=%s' % (avId, np.getPos))
            np.setHpr(0, 0, 0)
            quat = np.getQuat()
            body = self.tireDict[avId]['tireBody']
            body.setPosition(IceGameGlobals.StartingPositions[index])
            body.setQuaternion(quat)

    def b_setForceArrowInfo(self, avId, force, heading):
        self.setForceArrowInfo(avId, force, heading)
        self.d_setForceArrowInfo(avId, force, heading)

    def d_setForceArrowInfo(self, avId, force, heading):
        sendIt = False
        curTime = self.getCurrentGameTime()
        if self.sendForceArrowUpdateAsap:
            sendIt = True
        elif curTime - self.lastForceArrowUpdateTime > 0.20000000000000001:
            sendIt = True

        if sendIt:
            self.sendUpdate('setForceArrowInfo', [avId, force, heading])
            self.sendForceArrowUpdateAsap = False
            self.lastForceArrowUpdateTime = self.getCurrentGameTime()

    def setForceArrowInfo(self, avId, force, heading):
        if not self.hasLocalToon:
            return None

        self.updateForceArrow(avId, force, heading)

    def setupStartOfMatch(self):
        self.putAllTiresInStartingPositions()
        szId = self.getSafezoneId()
        self.numTreasures = IceGameGlobals.NumTreasures[szId]
        if self.treasures:
            for treasure in self.treasures:
                treasure.destroy()

            self.treasures = []

        index = 0
        treasureMargin = IceGameGlobals.TireRadius + 1.0
        while len(self.treasures) < self.numTreasures:
            xPos = self.randomNumGen.randrange(IceGameGlobals.MinWall[0] + 5,
                                               IceGameGlobals.MaxWall[0] - 5)
            yPos = self.randomNumGen.randrange(IceGameGlobals.MinWall[1] + 5,
                                               IceGameGlobals.MaxWall[1] - 5)
            self.notify.debug('yPos=%s' % yPos)
            pos = Point3(xPos, yPos, IceGameGlobals.TireRadius)
            newTreasure = IceTreasure.IceTreasure(self.treasureModel,
                                                  pos,
                                                  index,
                                                  self.doId,
                                                  penalty=False)
            goodSpot = True
            for obstacle in self.obstacles:
                if newTreasure.nodePath.getDistance(obstacle) < treasureMargin:
                    goodSpot = False
                    break
                    continue

            if goodSpot:
                for treasure in self.treasures:
                    if newTreasure.nodePath.getDistance(
                            treasure.nodePath) < treasureMargin:
                        goodSpot = False
                        break
                        continue

            if goodSpot:
                self.treasures.append(newTreasure)
                index += 1
                continue
            newTreasure.destroy()
        self.numPenalties = IceGameGlobals.NumPenalties[szId]
        if self.penalties:
            for penalty in self.penalties:
                penalty.destroy()

            self.penalties = []

        index = 0
        while len(self.penalties) < self.numPenalties:
            xPos = self.randomNumGen.randrange(IceGameGlobals.MinWall[0] + 5,
                                               IceGameGlobals.MaxWall[0] - 5)
            yPos = self.randomNumGen.randrange(IceGameGlobals.MinWall[1] + 5,
                                               IceGameGlobals.MaxWall[1] - 5)
            self.notify.debug('yPos=%s' % yPos)
            pos = Point3(xPos, yPos, IceGameGlobals.TireRadius)
            newPenalty = IceTreasure.IceTreasure(self.penaltyModel,
                                                 pos,
                                                 index,
                                                 self.doId,
                                                 penalty=True)
            goodSpot = True
            for obstacle in self.obstacles:
                if newPenalty.nodePath.getDistance(obstacle) < treasureMargin:
                    goodSpot = False
                    break
                    continue

            if goodSpot:
                for treasure in self.treasures:
                    if newPenalty.nodePath.getDistance(
                            treasure.nodePath) < treasureMargin:
                        goodSpot = False
                        break
                        continue

            if goodSpot:
                for penalty in self.penalties:
                    if newPenalty.nodePath.getDistance(
                            penalty.nodePath) < treasureMargin:
                        goodSpot = False
                        break
                        continue

            if goodSpot:
                self.penalties.append(newPenalty)
                index += 1
                continue
            newPenalty.destroy()

    def toonHitSomething(self, entry):
        self.notify.debug('---- treasure Enter ---- ')
        self.notify.debug('%s' % entry)
        name = entry.getIntoNodePath().getName()
        parts = name.split('-')
        if len(parts) < 3:
            self.notify.debug('collided with %s, but returning' % name)
            return None

        if not int(parts[1]) == self.doId:
            self.notify.debug("collided with %s, but doId doesn't match" %
                              name)
            return None

        treasureNum = int(parts[2])
        if 'penalty' in parts[0]:
            self._DistributedIceGame__penaltyGrabbed(treasureNum)
        else:
            self._DistributedIceGame__treasureGrabbed(treasureNum)

    def _DistributedIceGame__treasureGrabbed(self, treasureNum):
        self.treasures[treasureNum].showGrab()
        self.treasureGrabSound.play()
        self.sendUpdate('claimTreasure', [treasureNum])

    def setTreasureGrabbed(self, avId, treasureNum):
        if not self.hasLocalToon:
            return None

        self.notify.debug('treasure %s grabbed by %s' % (treasureNum, avId))
        if avId != self.localAvId:
            self.treasures[treasureNum].showGrab()

        i = self.avIdList.index(avId)
        self.scores[i] += 1
        self.scorePanels[i].setScore(self.scores[i])

    def _DistributedIceGame__penaltyGrabbed(self, penaltyNum):
        self.penalties[penaltyNum].showGrab()
        self.sendUpdate('claimPenalty', [penaltyNum])

    def setPenaltyGrabbed(self, avId, penaltyNum):
        if not self.hasLocalToon:
            return None

        self.notify.debug('penalty %s grabbed by %s' % (penaltyNum, avId))
        if avId != self.localAvId:
            self.penalties[penaltyNum].showGrab()

        i = self.avIdList.index(avId)
        self.scores[i] -= 1
        self.scorePanels[i].setScore(self.scores[i])

    def postStep(self):
        DistributedIceWorld.DistributedIceWorld.postStep(self)
        for count in range(self.colCount):
            (c0, c1) = self.getOrderedContacts(count)
            if c1 in self.tireCollideIds:
                tireIndex = self.tireCollideIds.index(c1)
                if c0 in self.tireCollideIds:
                    self.tireSounds[tireIndex]['tireHit'].play()
                elif c0 == self.wallCollideId:
                    self.tireSounds[tireIndex]['wallHit'].play()
                elif c0 == self.obstacleCollideId:
                    self.tireSounds[tireIndex]['obstacleHit'].play()

            c0 in self.tireCollideIds

    def forceLocalToonToTire(self):
        toon = localAvatar
        if toon and self.localAvId in self.tireDict:
            tireNp = self.tireDict[self.localAvId]['tireNodePath']
            toon.reparentTo(tireNp)
            toon.setPosHpr(0, 0, 0, 0, 0, 0)
            toon.setY(1.0)
            toon.setZ(-3)
示例#35
0
文件: game.py 项目: H3LLB0Y/Centipede
class Game(DirectObject.DirectObject):
    def __init__(self, showbase, usersData, gameData):
        self.showbase = showbase
        self.usersData = usersData
        self.gameData = gameData

        random.seed(self.gameData.randSeed)

        # Initialize the collision traverser.
        self.cTrav = CollisionTraverser()

        # Initialize the handler.
        self.collHandEvent = CollisionHandlerEvent()
        self.collHandEvent.addInPattern('into-%in')

        self.world = World(showbase)

        for user in self.usersData:
            user.centipede = Centipede(showbase, len(self.usersData),
                                       self.addToCollisions)
            if user.thisPlayer:
                self.centipede = user.centipede
                self.centipede.attachRing(showbase)

        self.foods = []
        for i in range(self.gameData.maxFoods):
            self.foods.append(Food(self.showbase, i, self.addToCollisions))

        self.ticks = 0

    def destroy(self):
        self.world.destroy()
        for user in self.usersData:
            user.centipede.destroy()
        for food in self.foods:
            food.destroy()

    def runTick(self, dt):
        # run each of the centipedes simulations
        for user in self.usersData:
            user.centipede.update(dt)
            if len(user.centipede.body) > 10:
                return False

        for food in self.foods:
            food.update(dt)

        self.cTrav.traverse(self.showbase.render)

        self.ticks += 1

        # Return true if game is still not over (false to end game)
        return True

    def collideInto(self, collEntry):
        for user in self.usersData:
            if collEntry.getFromNodePath(
            ) == user.centipede.head.collisionNode[0]:
                for food in self.foods:
                    if collEntry.getIntoNodePath(
                    ) == food.model.collisionNode[0]:
                        user.centipede.addLength(self.showbase)
                        food.reset()
                if len(user.centipede.body) > 2:
                    if collEntry.getIntoNodePath(
                    ) == user.centipede.tail.collisionNode[0]:
                        user.centipede.reset()
                    for i in range(len(user.centipede.body) - 1 - 2):
                        if collEntry.getIntoNodePath() == user.centipede.body[
                                i + 2].collisionNode[0]:
                            user.centipede.reset()
                            break

    def addToCollisions(self, item):
        # Add this object to the traverser.
        self.cTrav.addCollider(item[0], self.collHandEvent)

        # Accept the events sent by the collisions.
        self.accept('into-' + str(item[1]), self.collideInto)