def exitBarrelRoomIntro(self):
     if self._wantBarrelRoom and not self.isBossFloor(self.currentFloor):
         self.ignore(self.barrelRoomIntroDoneEvent)
         if self.barrelRoomIntroTrack:
             self.barrelRoomIntroTrack.finish()
             DelayDelete.cleanupDelayDeletes(self.barrelRoomIntroTrack)
             self.barrelRoomIntroTrack = None
 def clearToonTrack(self, avId):
     oldTrack = self.__toonTracks.get(avId)
     if oldTrack:
         oldTrack.pause()
         if self.__toonTracks.get(avId):
             DelayDelete.cleanupDelayDeletes(self.__toonTracks[avId])
             del self.__toonTracks[avId]
    def avatarExit(self, avatarId):
        if avatarId == self.avatarId:
            for track in self.avatarTracks:
                track.finish()
                DelayDelete.cleanupDelayDeletes(track)

            self.avatarTracks = []
 def clearToonTrack(self, avId):
     oldTrack = self._DistributedClubElevator__toonTracks.get(avId)
     if oldTrack:
         oldTrack.pause()
         if self._DistributedClubElevator__toonTracks.get(avId):
             DelayDelete.cleanupDelayDeletes(self._DistributedClubElevator__toonTracks[avId])
             del self._DistributedClubElevator__toonTracks[avId]
    def stopTracks(self):
        for track in self.avatarTracks:
            track.pause()
            DelayDelete.cleanupDelayDeletes(track)

        self.cleanupTrack()
        self.avatarTracks = []
        self.avatarId = 0
    def exitPlaying(self):
        DistributedAnimatedProp.DistributedAnimatedProp.exitPlaying(self)
        for track in self.avatarTracks:
            track.finish()
            DelayDelete.cleanupDelayDeletes(track)

        self.avatarTracks = []
        self.avatarId = 0
 def exitReward(self):
     self.notify.debug('exitReward')
     if self.penthouseOutroTrack:
         self.penthouseOutroTrack.finish()
         DelayDelete.cleanupDelayDeletes(self.penthouseOutroTrack)
         self.penthouseOutroTrack = None
         if not self.penthouseOutroChatDoneTrack:
             self.notify.debug('exitReward: instanting outroPenthouseChatDone track')
             self.__outroPenthouseChatDone()
         self.penthouseOutroChatDoneTrack.finish()
         self.penthouseOutroChatDoneTrack = None
 def finishAllTracks(self):
     self.finishDoorTrack()
     self.finishDoorExitTrack()
     for t in self.avatarTracks:
         t.finish()
         DelayDelete.cleanupDelayDeletes(t)
     self.avatarTracks = []
     for t in self.avatarExitTracks:
         t.finish()
         DelayDelete.cleanupDelayDeletes(t)
     self.avatarExitTracks = []
 def clearInterval(self, name, finish = 1):
     if name in self.activeIntervals:
         ival = self.activeIntervals[name]
         if finish:
             ival.finish()
         else:
             ival.pause()
         if name in self.activeIntervals:
             DelayDelete.cleanupDelayDeletes(ival)
             del self.activeIntervals[name]
     else:
         self.notify.debug('interval: %s already cleared' % name)
Пример #10
0
 def _deleteTransitionTrack(self):
     if self.transitionTrack:
         DelayDelete.cleanupDelayDeletes(self.transitionTrack)
         self.transitionTrack = None
    def fillSlot(self, index, avId):
        #print "fill Slot: %d for %d" % (index, avId)
        if avId == 0:
            # This means that the slot is now empty, and no action should
            # be taken.
            pass
        else:
            # If localToon is boarding, he needs to change state and board the trolley.
            if avId == base.localAvatar.getDoId():
                # Ignore this message if it comes late (e.g., trolley is in the leaving state).
                if not (self.fsm.getCurrentState().getName() == 'waitEmpty'
                        or self.fsm.getCurrentState().getName()
                        == 'waitCountdown'):
                    self.notify.warning(
                        "Can't board the trolley while in the '%s' state." %
                        (self.fsm.getCurrentState().getName()))
                    self.loader.place.fsm.request('walk')
                    return

                self.loader.place.trolley.fsm.request("boarding",
                                                      [self.trolleyCar])
                self.localToonOnBoard = 1

                # Tell him he's on the trolley now.
                self.loader.place.trolley.fsm.request("boarded")

            if avId in self.cr.doId2do:
                # If the toon exists, look it up
                toon = self.cr.doId2do[avId]
                # Parent it to the trolley
                toon.stopSmooth()
                toon.wrtReparentTo(self.trolleyCar)
                toon.setAnimState("run", 1.0)
                toon.headsUp(-5, -4.5 + (index * 3), 1.4)

                sitStartDuration = toon.getDuration("sit-start")

                track = Sequence(LerpPosInterval(
                    toon, TOON_BOARD_TIME * 0.75,
                    Point3(-5, -4.5 + (index * 3), 1.4)),
                                 LerpHprInterval(toon, TOON_BOARD_TIME * 0.25,
                                                 Point3(90, 0, 0)),
                                 Parallel(
                                     Sequence(
                                         Wait(sitStartDuration * 0.25),
                                         LerpPosInterval(
                                             toon, sitStartDuration * 0.25,
                                             Point3(-3.9, -4.5 + (index * 3),
                                                    3.0)),
                                     ),
                                     ActorInterval(toon, "sit-start"),
                                 ),
                                 Func(toon.setAnimState, "Sit", 1.0),
                                 Func(self.clearToonTrack, avId),
                                 name=toon.uniqueName("fillTrolley"),
                                 autoPause=1)

                track.delayDelete = DelayDelete.DelayDelete(
                    toon, 'Trolley.fillSlot')
                self.storeToonTrack(avId, track)
                track.start()
            else:
                DistributedTrolley.notify.warning("toon: " + str(avId) +
                                                  " doesn't exist, and" +
                                                  " cannot board the trolley!")
Пример #12
0
    def cleanupIntervals(self):
        for interval in self.activeIntervals.values():
            interval.finish()
            DelayDelete.cleanupDelayDeletes(interval)

        self.activeIntervals = {}
 def clearToonTrack(self, avId):
     oldTrack = self._DistributedPicnicBasket__toonTracks.get(avId)
     if oldTrack:
         oldTrack.pause()
         DelayDelete.cleanupDelayDeletes(oldTrack)
         del self._DistributedPicnicBasket__toonTracks[avId]
Пример #14
0
 def __faceOff(self, ts, name, callback):
     if len(self.suits) == 0:
         self.notify.warning('__faceOff(): no suits.')
         return
     if len(self.toons) == 0:
         self.notify.warning('__faceOff(): no toons.')
         return
     suit = self.suits[0]
     point = self.suitPoints[0][0]
     suitPos = point[0]
     suitHpr = VBase3(point[1], 0.0, 0.0)
     toon = self.toons[0]
     point = self.toonPoints[0][0]
     toonPos = point[0]
     toonHpr = VBase3(point[1], 0.0, 0.0)
     p = toon.getPos(self)
     toon.setPos(self, p[0], p[1], 0.0)
     toon.setShadowHeight(0)
     suit.setState('Battle')
     suitTrack = Sequence()
     toonTrack = Sequence()
     suitTrack.append(Func(suit.loop, 'neutral'))
     suitTrack.append(Func(suit.headsUp, toon))
     taunt = SuitBattleGlobals.getFaceoffTaunt(suit.getStyleName(), suit.doId)
     suitTrack.append(Func(suit.setChatAbsolute, taunt, CFSpeech | CFTimeout))
     toonTrack.append(Func(toon.loop, 'neutral'))
     toonTrack.append(Func(toon.headsUp, suit))
     suitHeight = suit.getHeight()
     suitOffsetPnt = Point3(0, 0, suitHeight)
     faceoffTime = self.calcFaceoffTime(self.getPos(), self.initialSuitPos)
     faceoffTime = max(faceoffTime, BATTLE_SMALL_VALUE)
     delay = FACEOFF_TAUNT_T
     if self.hasLocalToon():
         MidTauntCamHeight = suitHeight * 0.66
         MidTauntCamHeightLim = suitHeight - 1.8
         if MidTauntCamHeight < MidTauntCamHeightLim:
             MidTauntCamHeight = MidTauntCamHeightLim
         TauntCamY = 16
         TauntCamX = random.choice((-5, 5))
         TauntCamHeight = random.choice((MidTauntCamHeight, 1, 11))
         camTrack = Sequence()
         camTrack.append(Func(camera.wrtReparentTo, suit))
         camTrack.append(Func(base.camLens.setMinFov, self.camFOFov / (4.0 / 3.0)))
         camTrack.append(Func(camera.setPos, TauntCamX, TauntCamY, TauntCamHeight))
         camTrack.append(Func(camera.lookAt, suit, suitOffsetPnt))
         camTrack.append(Wait(delay))
         camTrack.append(Func(base.camLens.setMinFov, self.camFov / (4.0 / 3.0)))
         camTrack.append(Func(camera.wrtReparentTo, self))
         camTrack.append(Func(camera.setPos, self.camFOPos))
         camTrack.append(Func(camera.lookAt, suit.getPos(self)))
         camTrack.append(Wait(faceoffTime))
         if self.interactiveProp:
             camTrack.append(Func(camera.lookAt, self.interactiveProp.node.getPos(self)))
             camTrack.append(Wait(FACEOFF_LOOK_AT_PROP_T))
     suitTrack.append(Wait(delay))
     toonTrack.append(Wait(delay))
     suitTrack.append(Func(suit.headsUp, self, suitPos))
     suitTrack.append(Func(suit.clearChat))
     toonTrack.append(Func(toon.headsUp, self, toonPos))
     suitTrack.append(Func(suit.loop, 'walk'))
     suitTrack.append(LerpPosInterval(suit, faceoffTime, suitPos, other=self))
     suitTrack.append(Func(suit.loop, 'neutral'))
     suitTrack.append(Func(suit.setHpr, self, suitHpr))
     toonTrack.append(Func(toon.loop, 'run'))
     toonTrack.append(LerpPosInterval(toon, faceoffTime, toonPos, other=self))
     toonTrack.append(Func(toon.loop, 'neutral'))
     toonTrack.append(Func(toon.setHpr, self, toonHpr))
     if base.localAvatar == toon:
         soundTrack = Sequence(Wait(delay), SoundInterval(base.localAvatar.soundRun, loop=1, duration=faceoffTime, node=base.localAvatar))
     else:
         soundTrack = Wait(delay + faceoffTime)
     mtrack = Parallel(suitTrack, toonTrack, soundTrack)
     if self.hasLocalToon():
         NametagGlobals.setMasterArrowsOn(0)
         mtrack = Parallel(mtrack, camTrack)
     done = Func(callback)
     track = Sequence(mtrack, done, name=name)
     track.delayDeletes = [DelayDelete.DelayDelete(toon, '__faceOff'), DelayDelete.DelayDelete(suit, '__faceOff')]
     track.start(ts)
     self.storeInterval(track, name)
Пример #15
0
    def emptySlot(self, index, avId, bailFlag, timestamp, timeSent=0):
        """Remove someone as dictated by the AI."""
        if self.fillSlotTrack:
            self.fillSlotTrack.finish()
            self.fillSlotTrack = None

        # If localToon is exiting, he needs to change state
        if avId == 0:
            # This means that no one is currently exiting, and no action
            # should be taken
            pass

        elif not self.isSetup:
            # We haven't set up the elevator yet.  Remove the toon
            # from the deferredSlots list, if it is there.
            newSlots = []
            for slot in self.deferredSlots:
                if slot[0] != index:
                    newSlots.append(slot)

            self.deferredSlots = newSlots

        else:
            if avId in self.cr.doId2do:
                # See if we need to reset the clock
                # (countdown assumes we've created a clockNode already)
                if (bailFlag == 1 and hasattr(self, 'clockNode')):
                    if (timestamp < self.countdownTime and
                        timestamp >= 0):
                        self.countdown(self.countdownTime - timestamp)
                    else:
                        self.countdown(self.countdownTime)
                # If the toon exists, look it up
                toon = self.cr.doId2do[avId]
                # avoid wrtReparent so that we don't muck with the toon's scale
                # Parent it to render
                #toon.wrtReparentTo(render)
                toon.stopSmooth()

                sitStartDuration = toon.getDuration("sit-start")
                jumpOutTrack = self.generateToonReverseJumpTrack(toon, index)

                # Place it on the appropriate spot relative to the
                # elevator

                track = Sequence(
                    # TODO: Find the right coords for the elevator
                    jumpOutTrack,
                    # Tell the toon he is free to roam now
                    Func(self.notifyToonOffElevator, toon),
                    Func(self.clearToonTrack, avId),
                    name = toon.uniqueName("emptyElevator"),
                    autoPause = 1)

                if self.canHideBoardingQuitBtn(avId):
                    # Enable the Boarding Group Panel Quit Button here if it is relevant.
                    track.append(Func(localAvatar.boardingParty.groupPanel.enableQuitButton))
                    # Enable the Boarding Group GO Button here if it is relevant.
                    track.append(Func(localAvatar.boardingParty.enableGoButton))

                track.delayDelete = DelayDelete.DelayDelete(toon, 'CogKart.emptySlot')
                self.storeToonTrack(toon.doId, track)
                track.start()

                # Tell localToon he is exiting (if localToon is on board)
                if avId == base.localAvatar.getDoId():
                    messenger.send("exitElevator")

                # if the elevator is generated as a toon is leaving it,
                # we will not have gotten a corresponding 'fillSlot' message
                # for that toon, hence the toon will not be found in
                # boardedAvIds
                if avId in self.boardedAvIds:
                    del self.boardedAvIds[avId]

            else:
                self.notify.warning("toon: " + str(avId) +
                                                  " doesn't exist, and" +
                                                  " cannot exit the elevator!")
 def exitOpen(self):
     assert (self.debugPrint("exitOpen()"))
     for track in self.avatarTracks:
         track.finish()
         DelayDelete.cleanupDelayDeletes(track)
     self.avatarTracks = []
Пример #17
0
    def knockKnockTrack(self, avatar, duration):
        if avatar == None:
            return None

        # NOTE: the use of this rimshot sfx (which is in phase_5)
        # means we better not have any knock knock doors in phase_4,
        # which is true now.
        self.rimshot = base.loadSfx("phase_5/audio/sfx/AA_heal_telljoke.mp3")
        self.knockSfx = base.loadSfx("phase_5/audio/sfx/GUI_knock_3.mp3")

        joke = KnockKnockJokes[self.propId%len(KnockKnockJokes)]

        # For a marketing contest we are putting user-submitted knock knock jokes on
        # the first side doors (on the left) of the three TTC streets.
        place = base.cr.playGame.getPlace()
        if place:
            zone = place.getZoneId()
            branch = ZoneUtil.getBranchZone(zone)

            if branch == ToontownGlobals.SillyStreet:
                if self.propId == 44:
                    joke = KnockKnockContestJokes[ToontownGlobals.SillyStreet]
            elif branch == ToontownGlobals.LoopyLane:
                if self.propId in list(KnockKnockContestJokes[ToontownGlobals.LoopyLane].keys()):
                    joke = KnockKnockContestJokes[ToontownGlobals.LoopyLane][self.propId]
            elif branch == ToontownGlobals.PunchlinePlace:
                if self.propId == 1:
                    joke = KnockKnockContestJokes[ToontownGlobals.PunchlinePlace]
            elif branch == ToontownGlobals.PolarPlace:
                if self.propId in list(KnockKnockContestJokes[ToontownGlobals.PolarPlace].keys()):
                    joke = KnockKnockContestJokes[ToontownGlobals.PolarPlace][self.propId]

        self.nametag = None
        self.nametagNP = None

        doorNP=render.find("**/KnockKnockDoorSphere_"+str(self.propId)+";+s")
        if doorNP.isEmpty():
            self.notify.warning("Could not find KnockKnockDoorSphere_%s" % (self.propId))
            return None

        self.nametag = NametagGroup()
        self.nametag.setAvatar(doorNP)
        self.nametag.setFont(ToontownGlobals.getToonFont())
        # nametag.setName must come after setFont().
        self.nametag.setName(TTLocalizer.DoorNametag)
        # Do not allow user to click on door nametag
        self.nametag.setActive(0)
        self.nametag.manage(base.marginManager)
        self.nametag.getNametag3d().setBillboardOffset(4)
        nametagNode = self.nametag.getNametag3d().upcastToPandaNode()
        self.nametagNP=render.attachNewNode(nametagNode)
        self.nametagNP.setName("knockKnockDoor_nt_"+str(self.propId))
        pos=doorNP.node().getSolid(0).getCenter()
        self.nametagNP.setPos(pos+Vec3(0, 0, avatar.getHeight()+2))
        d=duration*0.125
        track=Sequence(
                Parallel(
                    Sequence(Wait(d * 0.5), SoundInterval(self.knockSfx)),
                    Func(self.nametag.setChat, TTLocalizer.DoorKnockKnock, CFSpeech),
                    Wait(d)
                    ),
                Func(avatar.setChatAbsolute, TTLocalizer.DoorWhosThere, CFSpeech | CFTimeout,
                     openEnded = 0),
                Wait(d),
                Func(self.nametag.setChat, joke[0], CFSpeech),
                Wait(d),
                Func(avatar.setChatAbsolute, joke[0]+TTLocalizer.DoorWhoAppendix,
                     CFSpeech | CFTimeout,
                     openEnded = 0),
                Wait(d),
                Func(self.nametag.setChat, joke[1], CFSpeech),
                Parallel(
                    SoundInterval(self.rimshot, startTime = 2.0),
                    Wait(d*4),
                    ),
                Func(self.cleanupTrack)
                )
        track.delayDelete = DelayDelete.DelayDelete(avatar, 'knockKnockTrack')
        return track
Пример #18
0
 def fillSlot(self, index, avId, wantBoardingShow=0):
     self.notify.debug('%s.fillSlot(%s, %s, ...)' %
                       (self.doId, index, avId))
     request = self.toonRequests.get(index)
     if request:
         self.cr.relatedObjectMgr.abortRequest(request)
         del self.toonRequests[index]
     if avId == 0:
         pass
     else:
         if not self.cr.doId2do.has_key(avId):
             func = PythonUtil.Functor(self.gotToon, index, avId)
             self.toonRequests[
                 index] = self.cr.relatedObjectMgr.requestObjects(
                     [avId], allCallback=func)
         else:
             if not self.isSetup:
                 self.deferredSlots.append((index, avId, wantBoardingShow))
             else:
                 if avId == base.localAvatar.getDoId():
                     place = base.cr.playGame.getPlace()
                     if not place:
                         return
                     place.detectedElevatorCollision(self)
                     elevator = self.getPlaceElevator()
                     if elevator == None:
                         if place.fsm.hasStateNamed('elevator'):
                             place.fsm.request('elevator')
                         else:
                             if place.fsm.hasStateNamed('Elevator'):
                                 place.fsm.request('Elevator')
                         elevator = self.getPlaceElevator()
                     if not elevator:
                         return
                     self.localToonOnBoard = 1
                     if hasattr(
                             localAvatar,
                             'boardingParty') and localAvatar.boardingParty:
                         localAvatar.boardingParty.forceCleanupInviteePanel(
                         )
                         localAvatar.boardingParty.forceCleanupInviterPanels(
                         )
                     if hasattr(base.localAvatar, 'elevatorNotifier'):
                         base.localAvatar.elevatorNotifier.cleanup()
                     cameraTrack = Sequence()
                     cameraTrack.append(
                         Func(elevator.fsm.request, 'boarding',
                              [self.getElevatorModel()]))
                     cameraTrack.append(
                         Func(elevator.fsm.request, 'boarded'))
                 toon = self.cr.doId2do[avId]
                 toon.stopSmooth()
                 if not wantBoardingShow:
                     toon.setZ(self.getElevatorModel(),
                               self.elevatorPoints[index][2])
                     toon.setShadowHeight(0)
                 if toon.isDisguised:
                     animInFunc = Sequence(Func(toon.suit.loop, 'walk'))
                     animFunc = Sequence(
                         Func(toon.setAnimState, 'neutral', 1.0),
                         Func(toon.suit.loop, 'neutral'))
                 else:
                     animInFunc = Sequence(
                         Func(toon.setAnimState, 'run', 1.0))
                     animFunc = Func(toon.setAnimState, 'neutral', 1.0)
                 toon.headsUp(self.getElevatorModel(),
                              apply(Point3, self.elevatorPoints[index]))
                 track = Sequence(
                     animInFunc,
                     LerpPosInterval(toon,
                                     TOON_BOARD_ELEVATOR_TIME * 0.75,
                                     apply(Point3,
                                           self.elevatorPoints[index]),
                                     other=self.getElevatorModel()),
                     LerpHprInterval(toon,
                                     TOON_BOARD_ELEVATOR_TIME * 0.25,
                                     Point3(180, 0, 0),
                                     other=self.getElevatorModel()),
                     Func(self.clearToonTrack, avId),
                     animFunc,
                     name=toon.uniqueName('fillElevator'),
                     autoPause=1)
                 if wantBoardingShow:
                     boardingTrack, boardingTrackType = self.getBoardingTrack(
                         toon, index, False)
                     track = Sequence(boardingTrack, track)
                     if avId == base.localAvatar.getDoId():
                         cameraWaitTime = 2.5
                         if boardingTrackType == BoardingGroupShow.TRACK_TYPE_RUN:
                             cameraWaitTime = 0.5
                         else:
                             if boardingTrackType == BoardingGroupShow.TRACK_TYPE_POOF:
                                 cameraWaitTime = 1
                         cameraTrack = Sequence(Wait(cameraWaitTime),
                                                cameraTrack)
                 if self.canHideBoardingQuitBtn(avId):
                     track = Sequence(
                         Func(localAvatar.boardingParty.groupPanel.
                              disableQuitButton), track)
                 if avId == base.localAvatar.getDoId():
                     track = Parallel(cameraTrack, track)
                 track.delayDelete = DelayDelete.DelayDelete(
                     toon, 'Elevator.fillSlot')
                 self.storeToonTrack(avId, track)
                 track.start()
                 self.fillSlotTrack = track
                 self.boardedAvIds[avId] = None
     return
Пример #19
0
    def emptySlot(self, index, avId, bailFlag, timestamp, timeSent=0):
        if self.fillSlotTrack:
            self.fillSlotTrack.finish()
            self.fillSlotTrack = None
        if avId == 0:
            pass
        else:
            if not self.isSetup:
                newSlots = []
                for slot in self.deferredSlots:
                    if slot[0] != index:
                        newSlots.append(slot)

                self.deferredSlots = newSlots
            else:
                timeToSet = self.countdownTime
                if timeSent > 0:
                    timeToSet = timeSent
                if self.cr.doId2do.has_key(avId):
                    if bailFlag == 1 and hasattr(self, 'clockNode'):
                        if timestamp < timeToSet and timestamp >= 0:
                            self.countdown(timeToSet - timestamp)
                        else:
                            self.countdown(timeToSet)
                    toon = self.cr.doId2do[avId]
                    toon.stopSmooth()
                    if toon.isDisguised:
                        toon.suit.loop('walk')
                        animFunc = Func(toon.suit.loop, 'neutral')
                    else:
                        toon.setAnimState('run', 1.0)
                        animFunc = Func(toon.setAnimState, 'neutral', 1.0)
                    track = Sequence(LerpPosInterval(
                        toon,
                        TOON_EXIT_ELEVATOR_TIME,
                        Point3(*self.JumpOutOffsets[index]),
                        other=self.getElevatorModel()),
                                     animFunc,
                                     Func(self.notifyToonOffElevator, toon),
                                     Func(self.clearToonTrack, avId),
                                     name=toon.uniqueName('emptyElevator'),
                                     autoPause=1)
                    if self.canHideBoardingQuitBtn(avId):
                        track.append(
                            Func(localAvatar.boardingParty.groupPanel.
                                 enableQuitButton))
                        track.append(
                            Func(localAvatar.boardingParty.enableGoButton))
                    track.delayDelete = DelayDelete.DelayDelete(
                        toon, 'Elevator.emptySlot')
                    self.storeToonTrack(avId, track)
                    track.start()
                    if avId == base.localAvatar.getDoId():
                        messenger.send('exitElevator')
                    if avId in self.boardedAvIds:
                        del self.boardedAvIds[avId]
                else:
                    self.notify.warning('toon: ' + str(avId) +
                                        " doesn't exist, and" +
                                        ' cannot exit the elevator!')
        return
Пример #20
0
    def __faceOff(self, ts, name, callback):
        if (len(self.suits) == 0):
            self.notify.warning('__faceOff(): no suits.')
            return
        if (len(self.toons) == 0):
            self.notify.warning('__faceOff(): no toons.')
            return

        # Pick only the first suit for the faceoff, if there happen to
        # be more than one.
        suit = self.suits[0]
        point = self.suitPoints[0][0]
        suitPos = point[0]
        suitHpr = VBase3(point[1], 0.0, 0.0)

        # And ditto for the first toon.
        toon = self.toons[0]
        point = self.toonPoints[0][0]
        toonPos = point[0]
        toonHpr = VBase3(point[1], 0.0, 0.0)

        p = toon.getPos(self)
        toon.setPos(self, p[0], p[1], 0.0)
        toon.setShadowHeight(0)

        suit.setState('Battle')

        suitTrack = Sequence()
        toonTrack = Sequence()

        # Make suit and toon face each other (and exchange taunts)
        suitTrack.append(Func(suit.loop, 'neutral'))
        suitTrack.append(Func(suit.headsUp, toon))
        taunt = SuitBattleGlobals.getFaceoffTaunt(suit.getStyleName(),
                                                  suit.doId)
        suitTrack.append(
            Func(suit.setChatAbsolute, taunt, CFSpeech | CFTimeout))
        toonTrack.append(Func(toon.loop, 'neutral'))
        toonTrack.append(Func(toon.headsUp, suit))

        suitHeight = suit.getHeight()
        suitOffsetPnt = Point3(0, 0, suitHeight)

        # Determine the battle positions based on initial angle
        # between the suit and the battle center (we want the suit to walk
        # as short a distance as possible)
        faceoffTime = self.calcFaceoffTime(self.getPos(), self.initialSuitPos)
        #assert(faceoffTime > BATTLE_SMALL_VALUE)
        # make sure the faceoff time is non-zero
        faceoffTime = max(faceoffTime, BATTLE_SMALL_VALUE)
        delay = FACEOFF_TAUNT_T

        if (self.hasLocalToon()):
            # empirical hack to pick a mid-height view, left in to sortof match the old view
            MidTauntCamHeight = suitHeight * 0.66
            MidTauntCamHeightLim = suitHeight - 1.8
            if (MidTauntCamHeight < MidTauntCamHeightLim):
                MidTauntCamHeight = MidTauntCamHeightLim

            TauntCamY = 16
            TauntCamX = random.choice((-5, 5))
            TauntCamHeight = random.choice((MidTauntCamHeight, 1, 11))

            camTrack = Sequence()
            camTrack.append(Func(camera.wrtReparentTo, suit))
            camTrack.append(Func(base.camLens.setFov, self.camFOFov))
            camTrack.append(
                Func(camera.setPos, TauntCamX, TauntCamY, TauntCamHeight))
            camTrack.append(Func(camera.lookAt, suit, suitOffsetPnt))
            camTrack.append(Wait(delay))
            camTrack.append(Func(base.camLens.setFov, self.camFov))
            camTrack.append(Func(camera.wrtReparentTo, self))
            camTrack.append(Func(camera.setPos, self.camFOPos))
            camTrack.append(Func(camera.lookAt, suit.getPos(self)))
            camTrack.append(Wait(faceoffTime))
            if self.interactiveProp:
                camTrack.append(
                    Func(camera.lookAt,
                         self.interactiveProp.node.getPos(self)))
                camTrack.append(Wait(FACEOFF_LOOK_AT_PROP_T))

        suitTrack.append(Wait(delay))
        toonTrack.append(Wait(delay))

        # Make suit and toon face their destination spots in the battle
        suitTrack.append(Func(suit.headsUp, self, suitPos))
        suitTrack.append(Func(suit.clearChat))
        toonTrack.append(Func(toon.headsUp, self, toonPos))

        # Make suit and toon walk to their battle spots
        suitTrack.append(Func(suit.loop, 'walk'))
        suitTrack.append(
            LerpPosInterval(suit, faceoffTime, suitPos, other=self))
        suitTrack.append(Func(suit.loop, 'neutral'))
        suitTrack.append(Func(suit.setHpr, self, suitHpr))

        toonTrack.append(Func(toon.loop, 'run'))
        toonTrack.append(
            LerpPosInterval(toon, faceoffTime, toonPos, other=self))
        toonTrack.append(Func(toon.loop, 'neutral'))
        toonTrack.append(Func(toon.setHpr, self, toonHpr))

        if base.localAvatar == toon:
            soundTrack = Sequence(
                Wait(delay),
                SoundInterval(base.localAvatar.soundRun,
                              loop=1,
                              duration=faceoffTime,
                              node=base.localAvatar),
            )
        else:
            soundTrack = Wait(delay + faceoffTime)
        mtrack = Parallel(suitTrack, toonTrack, soundTrack)

        if (self.hasLocalToon()):
            # No arrows - they just get in the way
            NametagGlobals.setMasterArrowsOn(0)
            mtrack = Parallel(mtrack, camTrack)

        done = Func(callback)
        track = Sequence(mtrack, done, name=name)
        track.delayDeletes = [
            DelayDelete.DelayDelete(toon, '__faceOff'),
            DelayDelete.DelayDelete(suit, '__faceOff')
        ]
        track.start(ts)
        self.storeInterval(track, name)
Пример #21
0
    def makePrepareBattleThreeMovie(self, delayDeletes, crane, safe):
        for toonId in self.involvedToons:
            toon = self.cr.doId2do.get(toonId)
            if toon:
                delayDeletes.append(
                    DelayDelete.DelayDelete(
                        toon, 'CashbotBoss.makePrepareBattleThreeMovie'))
                continue

        startPos = Point3(ToontownGlobals.CashbotBossBattleOnePosHpr[0],
                          ToontownGlobals.CashbotBossBattleOnePosHpr[1],
                          ToontownGlobals.CashbotBossBattleOnePosHpr[2])
        battlePos = Point3(ToontownGlobals.CashbotBossBattleThreePosHpr[0],
                           ToontownGlobals.CashbotBossBattleThreePosHpr[1],
                           ToontownGlobals.CashbotBossBattleThreePosHpr[2])
        startHpr = Point3(ToontownGlobals.CashbotBossBattleOnePosHpr[3],
                          ToontownGlobals.CashbotBossBattleOnePosHpr[4],
                          ToontownGlobals.CashbotBossBattleOnePosHpr[5])
        battleHpr = VBase3(ToontownGlobals.CashbotBossBattleThreePosHpr[3],
                           ToontownGlobals.CashbotBossBattleThreePosHpr[4],
                           ToontownGlobals.CashbotBossBattleThreePosHpr[5])
        finalHpr = VBase3(135, 0, 0)
        bossTrack = Sequence()
        bossTrack.append(Func(self.reparentTo, render))
        bossTrack.append(Func(self.getGeomNode().setH, 180))
        bossTrack.append(Func(self.pelvis.setHpr, self.pelvisForwardHpr))
        bossTrack.append(Func(self.loop, 'Ff_neutral'))
        (track, hpr) = self.rollBossToPoint(startPos, startHpr, startPos,
                                            battleHpr, 0)
        bossTrack.append(track)
        (track, hpr) = self.rollBossToPoint(startPos, None, battlePos, None, 0)
        bossTrack.append(track)
        (track, hpr) = self.rollBossToPoint(battlePos, battleHpr, battlePos,
                                            finalHpr, 0)
        bossTrack.append(track)
        rToon = self.resistanceToon
        rToon.setPosHpr(93.935000000000002, -341.065, 0, -45, 0, 0)
        goon = self.fakeGoons[0]
        crane = self.cranes[0]
        track = Sequence(
            Func(self._DistributedCashbotBoss__hideToons),
            Func(crane.request, 'Movie'), Func(crane.accomodateToon, rToon),
            Func(goon.request, 'Stunned'),
            Func(goon.setPosHpr, 104, -316, 0, 165, 0, 0),
            Parallel(self.door2.posInterval(4.5, VBase3(0, 0, 30)),
                     self.door3.posInterval(4.5, VBase3(0, 0, 30)), bossTrack),
            Func(rToon.loop, 'leverNeutral'), Func(camera.reparentTo,
                                                   self.geom),
            Func(camera.setPosHpr, 105, -326, 5, 136.30000000000001, 0, 0),
            Func(rToon.setChatAbsolute, TTL.ResistanceToonWatchThis, CFSpeech),
            Wait(2), Func(rToon.clearChat),
            Func(camera.setPosHpr, 105, -326, 20, -45.299999999999997, 11, 0),
            Func(self.setChatAbsolute, TTL.CashbotBossGetAwayFromThat,
                 CFSpeech), Wait(2), Func(self.clearChat),
            camera.posHprInterval(1.5,
                                  Point3(105, -326, 5),
                                  Point3(136.30000000000001, 0, 0),
                                  blendType='easeInOut'),
            Func(rToon.setChatAbsolute, TTL.ResistanceToonCraneInstructions1,
                 CFSpeech), Wait(4),
            Func(rToon.setChatAbsolute, TTL.ResistanceToonCraneInstructions2,
                 CFSpeech), Wait(4),
            Func(rToon.setChatAbsolute, TTL.ResistanceToonCraneInstructions3,
                 CFSpeech), Wait(4),
            Func(rToon.setChatAbsolute, TTL.ResistanceToonCraneInstructions4,
                 CFSpeech), Wait(4), Func(rToon.clearChat),
            Func(camera.setPosHpr, 102, -323.60000000000002,
                 0.90000000000000002, -10.6, 14, 0),
            Func(goon.request, 'Recovery'), Wait(2),
            Func(camera.setPosHpr, 95.400000000000006, -332.60000000000002,
                 4.2000000000000002, 167.09999999999999, -13.199999999999999,
                 0),
            Func(rToon.setChatAbsolute, TTL.ResistanceToonGetaway, CFSpeech),
            Func(rToon.animFSM.request, 'jump'), Wait(1.8),
            Func(rToon.clearChat),
            Func(camera.setPosHpr, 109.09999999999999, -300.69999999999999,
                 13.9, -15.6, -13.6, 0), Func(rToon.animFSM.request, 'run'),
            Func(goon.request, 'Walk'),
            Parallel(
                self.door3.posInterval(3, VBase3(0, 0, 0)),
                rToon.posHprInterval(3,
                                     Point3(136, -212.90000000000001, 0),
                                     VBase3(-14, 0, 0),
                                     startPos=Point3(110.8,
                                                     -292.69999999999999, 0),
                                     startHpr=VBase3(-14, 0, 0)),
                goon.posHprInterval(3,
                                    Point3(125.2, -243.5, 0),
                                    VBase3(-14, 0, 0),
                                    startPos=Point3(104.8, -309.5, 0),
                                    startHpr=VBase3(-14, 0, 0))),
            Func(self._DistributedCashbotBoss__hideFakeGoons),
            Func(crane.request, 'Free'), Func(self.getGeomNode().setH, 0),
            self.moveToonsToBattleThreePos(self.involvedToons),
            Func(self._DistributedCashbotBoss__showToons))
        return Sequence(Func(camera.reparentTo, self),
                        Func(camera.setPosHpr, 0, -27, 25, 0, -18, 0), track)
Пример #22
0
    def makeIntroductionMovie(self, delayDeletes):
        for toonId in self.involvedToons:
            toon = self.cr.doId2do.get(toonId)
            if toon:
                delayDeletes.append(
                    DelayDelete.DelayDelete(
                        toon, 'CashbotBoss.makeIntroductionMovie'))
                continue

        rtTrack = Sequence()
        startPos = Point3(ToontownGlobals.CashbotBossOffstagePosHpr[0],
                          ToontownGlobals.CashbotBossOffstagePosHpr[1],
                          ToontownGlobals.CashbotBossOffstagePosHpr[2])
        battlePos = Point3(ToontownGlobals.CashbotBossBattleOnePosHpr[0],
                           ToontownGlobals.CashbotBossBattleOnePosHpr[1],
                           ToontownGlobals.CashbotBossBattleOnePosHpr[2])
        battleHpr = VBase3(ToontownGlobals.CashbotBossBattleOnePosHpr[3],
                           ToontownGlobals.CashbotBossBattleOnePosHpr[4],
                           ToontownGlobals.CashbotBossBattleOnePosHpr[5])
        bossTrack = Sequence()
        bossTrack.append(Func(self.reparentTo, render))
        bossTrack.append(Func(self.getGeomNode().setH, 180))
        bossTrack.append(Func(self.pelvis.setHpr, self.pelvisForwardHpr))
        bossTrack.append(Func(self.loop, 'Ff_neutral'))
        (track, hpr) = self.rollBossToPoint(startPos, None, battlePos, None, 0)
        bossTrack.append(track)
        (track, hpr) = self.rollBossToPoint(battlePos, hpr, battlePos,
                                            battleHpr, 0)
        bossTrack.append(track)
        bossTrack.append(Func(self.getGeomNode().setH, 0))
        bossTrack.append(Func(self.pelvis.setHpr, self.pelvisReversedHpr))
        goonTrack = self._DistributedCashbotBoss__makeGoonMovieForIntro()
        attackToons = TTL.CashbotBossCogAttack
        rToon = self.resistanceToon
        rToon.setPosHpr(*ToontownGlobals.CashbotRTBattleOneStartPosHpr)
        track = Sequence(
            Func(camera.setPosHpr, 82, -219, 5, 267, 0, 0),
            Func(rToon.setChatAbsolute, TTL.ResistanceToonWelcome, CFSpeech),
            Wait(3), Sequence(goonTrack, duration=0),
            Parallel(
                camera.posHprInterval(4, Point3(108, -244, 4),
                                      VBase3(211.5, 0, 0)),
                Sequence(
                    Func(rToon.suit.setPlayRate, 1.3999999999999999, 'walk'),
                    Func(rToon.suit.loop, 'walk'),
                    Parallel(rToon.hprInterval(1, VBase3(180, 0, 0)),
                             rToon.posInterval(3, VBase3(120, -255, 0)),
                             Sequence(Wait(2), Func(rToon.clearChat))),
                    Func(rToon.suit.loop, 'neutral'),
                    self.door2.posInterval(3, VBase3(0, 0, 30)))),
            Func(rToon.setHpr, 0, 0, 0),
            Func(rToon.setChatAbsolute, TTL.ResistanceToonTooLate, CFSpeech),
            Func(camera.reparentTo, render),
            Func(camera.setPosHpr, 61.100000000000001, -228.80000000000001,
                 10.199999999999999, -90, 0, 0),
            self.door1.posInterval(2, VBase3(0, 0, 30)),
            Parallel(
                bossTrack,
                Sequence(Wait(3), Func(rToon.clearChat),
                         self.door1.posInterval(3, VBase3(0, 0, 0)))),
            Func(self.setChatAbsolute, TTL.CashbotBossDiscoverToons1,
                 CFSpeech),
            camera.posHprInterval(
                1.5, Point3(93.299999999999997, -230, 0.69999999999999996),
                VBase3(-92.900000000000006, 39.700000000000003,
                       8.3000000000000007)),
            Func(self.setChatAbsolute, TTL.CashbotBossDiscoverToons2,
                 CFSpeech), Wait(4), Func(self.clearChat),
            self.loseCogSuits(self.toonsA + self.toonsB, render,
                              (113, -228, 10, 90, 0, 0)), Wait(1),
            Func(rToon.setHpr, 0, 0, 0),
            self.loseCogSuits([rToon], render, (133, -243, 5, 143, 0, 0),
                              True),
            Func(rToon.setChatAbsolute, TTL.ResistanceToonKeepHimBusy,
                 CFSpeech), Wait(1),
            Func(self._DistributedCashbotBoss__showResistanceToon, False),
            Sequence(
                Func(rToon.animFSM.request, 'run'),
                rToon.hprInterval(1, VBase3(180, 0, 0)),
                Parallel(
                    Sequence(
                        rToon.posInterval(1.5, VBase3(109, -294, 0)),
                        Parallel(Func(rToon.animFSM.request, 'jump')),
                        rToon.posInterval(
                            1.5, VBase3(93.935000000000002, -341.065, 2))),
                    self.door2.posInterval(3, VBase3(0, 0, 0))),
                Func(rToon.animFSM.request, 'neutral')),
            self.toonNormalEyes(self.involvedToons),
            self.toonNormalEyes([self.resistanceToon], True),
            Func(rToon.clearChat),
            Func(camera.setPosHpr, 93.299999999999997, -230,
                 0.69999999999999996, -92.900000000000006, 39.700000000000003,
                 8.3000000000000007),
            Func(self.setChatAbsolute, attackToons, CFSpeech), Wait(2),
            Func(self.clearChat))
        return Sequence(Func(camera.reparentTo, render), track)
 def clearToonTrack(self, avId):
     oldTrack = self._DistributedPicnicBasket__toonTracks.get(avId)
     if oldTrack:
         oldTrack.pause()
         DelayDelete.cleanupDelayDeletes(oldTrack)
         del self._DistributedPicnicBasket__toonTracks[avId]
Пример #24
0
    def getVictoryRunTrack(self):
        origPosTrack = Sequence()
        delayDeletes = []
        i = 0
        for victor in self.victorList:
            if victor != 0 and self.cr.doId2do.has_key(victor):
                toon = self.cr.doId2do[victor]
                delayDeletes.append(
                    DelayDelete.DelayDelete(toon, 'getVictoryRunTrack'))
                toon.stopSmooth()
                toon.setParent(ToontownGlobals.SPHidden)
                origPosTrack.append(
                    Func(toon.setPosHpr, self.elevatorNodePath,
                         apply(Point3, ElevatorPoints[i]), Point3(180, 0, 0)))
                origPosTrack.append(
                    Func(toon.setParent, ToontownGlobals.SPRender))
            i += 1

        openDoors = getOpenInterval(self, self.leftDoor, self.rightDoor,
                                    self.openSfx, None)
        toonDoorPosHpr = self.cr.playGame.dnaStore.getDoorPosHprFromBlockNumber(
            self.block)
        useFarExitPoints = toonDoorPosHpr.getPos().getZ() > 1.0
        runOutAll = Parallel()
        i = 0
        for victor in self.victorList:
            if victor != 0 and self.cr.doId2do.has_key(victor):
                toon = self.cr.doId2do[victor]
                p0 = Point3(0, 0, 0)
                p1 = Point3(ElevatorPoints[i][0], ElevatorPoints[i][1] - 5.0,
                            ElevatorPoints[i][2])
                if useFarExitPoints:
                    p2 = Point3(ElevatorOutPointsFar[i][0],
                                ElevatorOutPointsFar[i][1],
                                ElevatorOutPointsFar[i][2])
                else:
                    p2 = Point3(ElevatorOutPoints[i][0],
                                ElevatorOutPoints[i][1],
                                ElevatorOutPoints[i][2])
                runOutSingle = Sequence(
                    Func(Emote.globalEmote.disableBody, toon, 'getVictory'),
                    Func(toon.animFSM.request, 'run'),
                    LerpPosInterval(toon,
                                    TOON_VICTORY_EXIT_TIME * 0.25,
                                    p1,
                                    other=self.elevatorNodePath),
                    Func(toon.headsUp, self.elevatorNodePath, p2),
                    LerpPosInterval(toon,
                                    TOON_VICTORY_EXIT_TIME * 0.5,
                                    p2,
                                    other=self.elevatorNodePath),
                    LerpHprInterval(toon,
                                    TOON_VICTORY_EXIT_TIME * 0.25,
                                    Point3(0, 0, 0),
                                    other=self.elevatorNodePath),
                    Func(toon.animFSM.request, 'neutral'),
                    Func(toon.startSmooth),
                    Func(Emote.globalEmote.releaseBody, toon, 'getVictory'))
                runOutAll.append(runOutSingle)
            i += 1

        victoryRunTrack = Sequence(origPosTrack, openDoors, runOutAll)
        return (victoryRunTrack, delayDeletes)
 def _deleteTransitionTrack(self):
     if self.transitionTrack:
         DelayDelete.cleanupDelayDeletes(self.transitionTrack)
         self.transitionTrack = None
     return
Пример #26
0
    def fillSlot(self, index, avId):
        assert self.notify.debugStateCall(self)
        self.notify.debug("fill Slot: %d for %d" % (index, avId))
        if avId == 0:
            # This means that the slot is now empty, and no action should
            # be taken.
            pass
        else:
            self.fullSeat[index] = self.seatState.Full
            # If localToon is boarding, he needs to change state
            if avId == base.localAvatar.getDoId():
                # Start the countdown clock...
                self.clockNode.show()
                if index == 0 or index == 3:
                    side = -1
                else:
                    side = 1
                if hasattr(self.loader.place, "trolley"):
                    self.loader.place.trolley.fsm.request(
                        "boarding", [self.tablecloth, side])
                else:
                    self.notify.warning('fillSlot no trolley in place')
                self.localToonOnBoard = 1

            # Put that toon on the table

            # If it's localToon, tell him he's on the trolley now
            if avId == base.localAvatar.getDoId():
                if hasattr(self.loader.place, "trolley"):
                    self.loader.place.trolley.fsm.request("boarded")
                    # hide the exit button until basket interval is over
                    self.loader.place.trolley.exitButton.hide()
            if avId in self.cr.doId2do:
                # If the toon exists, look it up
                toon = self.cr.doId2do[avId]
                # Parent it to the trolley
                toon.stopSmooth()
                toon.wrtReparentTo(self.tablecloth)
                sitStartDuration = toon.getDuration("sit-start")
                jumpTrack = self.generateToonJumpTrack(toon, index)
                track = Sequence(jumpTrack, Func(toon.setAnimState, "Sit",
                                                 1.0))
                # only add basket appear if there is no toons are already sitting
                self.notify.debug("### fillSlot: fullSeat = %s" %
                                  self.fullSeat)
                if self.fullSeat.count(0) == 3:
                    self.notify.debug("### fillSlot: adding basketAppear")
                    #track.append(self.generateBasketAppearTrack())
                    if self.picnicBasketTrack:
                        self.picnicBasketTrack.finish()
                    waitDuration = track.getDuration()
                    self.picnicBasketTrack = Sequence(
                        Wait(waitDuration), self.generateBasketAppearTrack())
                    self.picnicBasketTrack.start()
                # make a random food appear
                track.append(self.generateFoodAppearTrack(index))
                # finish the rest of the staging
                track.append(
                    Sequence(Func(self.clearToonTrack, avId),
                             name=toon.uniqueName("fillTrolley"),
                             autoPause=1))
                if avId == base.localAvatar.getDoId():
                    if hasattr(self.loader.place, "trolley"):
                        track.append(
                            Func(self.loader.place.trolley.exitButton.show))
                track.delayDelete = DelayDelete.DelayDelete(
                    toon, 'PicnicBasket.fillSlot')
                self.storeToonTrack(avId, track)
                track.start()
Пример #27
0
 def setUpMovieAvatar(self, av):
     self.avDelayDelete = DelayDelete.DelayDelete(av,
                                                  'Pet.setUpMovieAvatar')
     av.headsUp(self, 0, 0, 0)
     av.stopLookAround()
Пример #28
0
    def emptySlot(self, index, avId, timestamp):
        def emptySeat(index):
            # If localToon is exiting, he needs to change state
            self.notify.debug("### seat %s now empty" % index)
            self.fullSeat[index] = self.seatState.Empty

        if avId == 0:
            # This means that the slot is now empty, and no action should
            # be taken.
            pass
        elif avId == 1:
            # Special cardinal value for unexpected exit.
            # The toon is gone, but we may still need to clean up his food
            self.fullSeat[index] = self.seatState.Empty
            track = Sequence(self.generateFoodDisappearTrack(index))
            # if no toons left, make the basket go away
            self.notify.debug("### empty slot - unexpetected: fullSeat = %s" %
                              self.fullSeat)
            if self.fullSeat.count(0) == 4:
                self.notify.debug("### empty slot - unexpected: losing basket")
                if self.picnicBasketTrack:
                    self.picnicBasketTrack.finish()
                #track.append(self.generateBasketDisappearTrack())
                waitDuration = track.getDuration()
                self.picnicBasketTrack = Sequence(
                    Wait(waitDuration), self.generateBasketDisappearTrack())
                self.picnicBasketTrack.start()
            track.start()
        else:
            self.fullSeat[index] = self.seatState.Empty
            if avId in self.cr.doId2do:
                if avId == base.localAvatar.getDoId():
                    # Stop the countdown clock..
                    if (self.clockNode):
                        self.clockNode.hide()

                # If the toon exists, look it up
                toon = self.cr.doId2do[avId]
                toon.stopSmooth()
                sitStartDuration = toon.getDuration("sit-start")
                jumpOutTrack = self.generateToonReverseJumpTrack(toon, index)
                track = Sequence(jumpOutTrack)
                # make the food go away
                track.append(self.generateFoodDisappearTrack(index))
                # if no toons left, make the basket go away
                self.notify.debug("### empty slot: fullSeat = %s" %
                                  self.fullSeat)
                if self.fullSeat.count(0) == 4:
                    self.notify.debug("### empty slot: losing basket")
                    if self.picnicBasketTrack:
                        self.picnicBasketTrack.finish()
                    #track.append(self.generateBasketDisappearTrack())
                    waitDuration = track.getDuration()
                    self.picnicBasketTrack = Sequence(
                        Wait(waitDuration),
                        self.generateBasketDisappearTrack())
                    self.picnicBasketTrack.start()

                    # let the toon loose
                track.append(
                    Sequence(
                        # Tell the toon he is free to roam now
                        Func(self.notifyToonOffTrolley, toon),
                        Func(self.clearToonTrack, avId),
                        Func(self.doneExit, avId),
                        Func(emptySeat, index),
                        name=toon.uniqueName("emptyTrolley"),
                        autoPause=1))
                track.delayDelete = DelayDelete.DelayDelete(
                    toon, 'PicnicBasket.emptySlot')
                self.storeToonTrack(avId, track)
                track.start()
Пример #29
0
    def fillSlot(self, index, avId, wantBoardingShow = 0):
        """Put someone in the kart, as dictated by the AI."""
        self.notify.debug("%s.fillSlot(%s, %s, ... %s)" % (self.doId, index, avId, globalClock.getRealTime()))
        request = self.toonRequests.get(index)
        if request:
            self.cr.relatedObjectMgr.abortRequest(request)
            del self.toonRequests[index]

        if avId == 0:
            # This means that the slot is now empty, and no action should
            # be taken.
            pass

        elif avId not in self.cr.doId2do:
            # It's someone who hasn't been generated yet.
            func = PythonUtil.Functor(
                self.gotToon, index, avId)

            assert index not in self.toonRequests
            self.toonRequests[index] = self.cr.relatedObjectMgr.requestObjects(
                [avId], allCallback = func)

        elif not self.isSetup:
            # We haven't set up the elevator yet.
            self.deferredSlots.append((index, avId, wantBoardingShow))

        else:
            # If localToon is boarding, he needs to change state
            if avId == base.localAvatar.getDoId():
                place = base.cr.playGame.getPlace()
                if not place:
                    return
                elevator = self.getPlaceElevator()
                if elevator == None:
                    place.fsm.request('elevator')
                    elevator = self.getPlaceElevator()
                if not elevator:
                    return

                self.localToonOnBoard = 1

                if hasattr(localAvatar, "boardingParty") and localAvatar.boardingParty:
                    localAvatar.boardingParty.forceCleanupInviteePanel()
                    localAvatar.boardingParty.forceCleanupInviterPanels()

                # Cleanup any leftover elevator messages before boarding the elevator.
                if hasattr(base.localAvatar, "elevatorNotifier"):
                    base.localAvatar.elevatorNotifier.cleanup()

                cameraTrack = Sequence()
                # Move the camera towards and face the elevator.
                cameraTrack.append(Func(elevator.fsm.request, "boarding", [self.getElevatorModel()]))
                # Enable the Hop off button.
                cameraTrack.append(Func(elevator.fsm.request, "boarded"))

            toon = self.cr.doId2do[avId]
            # Parent it to the elevator
            toon.stopSmooth()
            toon.wrtReparentTo(self.golfKart)

            sitStartDuration = toon.getDuration("sit-start")
            jumpTrack = self.generateToonJumpTrack(toon, index)

            track = Sequence(
				jumpTrack,
                Func(toon.setAnimState, "Sit", 1.0),
                Func(self.clearToonTrack, avId),
                name = toon.uniqueName("fillElevator"),
                autoPause = 1)

            if wantBoardingShow:
                boardingTrack, boardingTrackType = self.getBoardingTrack(toon, index, True)
                track = Sequence(boardingTrack, track)

                if avId == base.localAvatar.getDoId():
                    cameraWaitTime = 2.5
                    if (boardingTrackType == BoardingGroupShow.TRACK_TYPE_RUN):
                        cameraWaitTime = 0.5
                    cameraTrack = Sequence(Wait(cameraWaitTime), cameraTrack)

            if self.canHideBoardingQuitBtn(avId):
                track = Sequence(Func(localAvatar.boardingParty.groupPanel.disableQuitButton),
                                 track)

            # Start the camera track in parallel here
            if avId == base.localAvatar.getDoId():
                track = Parallel(cameraTrack, track)

            track.delayDelete = DelayDelete.DelayDelete(toon, 'CogKart.fillSlot')
            self.storeToonTrack(avId, track)
            track.start()

            self.fillSlotTrack = track

            assert avId not in self.boardedAvIds
            self.boardedAvIds[avId] = None
Пример #30
0
    def enterReward(self):
        numToons = 0
        toonLayouts = ((2, ), (1, 3), (0, 2, 4), (0, 1, 3, 4))
        toonPositions = (5.0, 1.75, -0.25, -1.75, -5.0)
        self.toons = []
        self.toonsKeep = []
        self.counters = []
        self.totalCounters = []
        camera.reparentTo(render)
        camera.setPos(0, 16.0, 2.0)
        camera.lookAt(0, 0, 0.75)
        base.transitions.irisIn(0.4)
        base.camLens.setMinFov(60 / (4. / 3.))
        base.setBackgroundColor(Vec4(0, 0.6, 1, 1))
        self.title.reparentTo(aspect2d)
        self.foreground.reparentTo(render)
        self.backgroundL.reparentTo(render)
        self.backgroundR.reparentTo(render)
        self.sidewalk.reparentTo(render)
        self.sidewalkL.reparentTo(render)
        self.sidewalkR.reparentTo(render)
        self.door.reparentTo(render)
        size = 20
        z = -2.5
        floor = CollisionPolygon(Point3(-size, -size, z),
                                 Point3(size, -size, z), Point3(size, size, z),
                                 Point3(-size, size, z))
        floor.setTangible(1)
        floorNode = CollisionNode('collision_floor')
        floorNode.addSolid(floor)
        self.collisionFloor = render.attachNewNode(floorNode)
        NametagGlobals.setOnscreenChatForced(1)
        for index in xrange(len(self.ids)):
            avId = self.ids[index]
            if self.states[index] != PURCHASE_NO_CLIENT_STATE and self.states[
                    index] != PURCHASE_DISCONNECTED_STATE and avId in base.cr.doId2do:
                numToons += 1
                toon = base.cr.doId2do[avId]
                toon.stopSmooth()
                self.toons.append(toon)
                self.toonsKeep.append(
                    DelayDelete.DelayDelete(toon, 'Purchase.enterReward'))
                counter = DirectLabel(parent=hidden,
                                      relief=None,
                                      pos=(0.0, 0.0, 0.0),
                                      text=str(0),
                                      text_scale=0.2,
                                      text_fg=(0.95, 0.95, 0, 1),
                                      text_pos=(0, -0.1, 0),
                                      text_font=ToontownGlobals.getSignFont())
                counter['image'] = DGG.getDefaultDialogGeom()
                counter['image_scale'] = (0.33, 1, 0.33)
                counter.setScale(0.5)
                counter.count = 0
                counter.max = self.pointsArray[index]
                self.counters.append(counter)
                money = self.playerMoney[index]
                totalCounter = DirectLabel(
                    parent=hidden,
                    relief=None,
                    pos=(0.0, 0.0, 0.0),
                    text=str(money),
                    text_scale=0.2,
                    text_fg=(0.95, 0.95, 0, 1),
                    text_pos=(0, -0.1, 0),
                    text_font=ToontownGlobals.getSignFont(),
                    image=self.jarImage)
                totalCounter.setScale(0.5)
                totalCounter.count = money
                totalCounter.max = toon.getMaxMoney()
                self.totalCounters.append(totalCounter)

        self.accept('clientCleanup', self._handleClientCleanup)
        pos = 0
        toonLayout = toonLayouts[numToons - 1]
        for toon in self.toons:
            thisPos = toonPositions[toonLayout[pos]]
            toon.setPos(Vec3(thisPos, 1.0, -2.5))
            toon.setHpr(Vec3(0, 0, 0))
            toon.setAnimState('neutral', 1)
            toon.setShadowHeight(0)
            if not toon.isDisabled():
                toon.reparentTo(render)
            self.counters[pos].setPos(thisPos * -0.17, 0,
                                      toon.getHeight() / 10 + 0.25)
            self.counters[pos].reparentTo(aspect2d)
            self.totalCounters[pos].setPos(thisPos * -0.17, 0, -0.825)
            self.totalCounters[pos].reparentTo(aspect2d)
            pos += 1

        self.maxPoints = max(self.pointsArray)

        def reqCountUp(state):
            self.countUp()
            return Task.done

        countUpDelay = DELAY_BEFORE_COUNT_UP
        taskMgr.doMethodLater(countUpDelay, reqCountUp, 'countUpTask')

        def reqCountDown(state):
            self.countDown()
            return Task.done

        countDownDelay = countUpDelay + COUNT_UP_DURATION + DELAY_AFTER_COUNT_UP
        taskMgr.doMethodLater(countDownDelay, reqCountDown, 'countDownTask')

        def celebrate(task):
            for counter in task.counters:
                counter.hide()

            winningPoints = max(task.pointsArray)
            for i in xrange(len(task.ids)):
                if task.pointsArray[i] == winningPoints:
                    avId = task.ids[i]
                    if avId in base.cr.doId2do:
                        toon = base.cr.doId2do[avId]
                        toon.setAnimState('jump', 1.0)

            base.playSfx(task.celebrateSound)
            return Task.done

        celebrateDelay = countDownDelay + COUNT_DOWN_DURATION + DELAY_AFTER_COUNT_DOWN
        celebrateTask = taskMgr.doMethodLater(celebrateDelay, celebrate,
                                              'celebrate')
        celebrateTask.counters = self.counters
        celebrateTask.pointsArray = self.pointsArray
        celebrateTask.ids = self.ids
        celebrateTask.celebrateSound = self.celebrateSound

        def reqPurchase(state):
            self.fsm.request('purchase')
            return Task.done

        purchaseDelay = celebrateDelay + DELAY_AFTER_CELEBRATE
        taskMgr.doMethodLater(purchaseDelay, reqPurchase, 'purchase-trans')
        if base.skipMinigameReward:
            self.fsm.request('purchase')
        return
Пример #31
0
 def clearToonTrack(self, avId):
     oldTrack = self.__toonTracks.get(avId)
     if oldTrack:
         oldTrack.pause()
         DelayDelete.cleanupDelayDeletes(oldTrack)
         del self.__toonTracks[avId]
Пример #32
0
 def _deleteTrack(self):
     if self.track:
         DelayDelete.cleanupDelayDeletes(self.track)
         self.track = None
 def fillSlot(self, index, avId, wantBoardingShow=0):
     self.notify.debug('%s.fillSlot(%s, %s, ... %s)' %
                       (self.doId, index, avId, globalClock.getRealTime()))
     request = self.toonRequests.get(index)
     if request:
         self.cr.relatedObjectMgr.abortRequest(request)
         del self.toonRequests[index]
     if avId == 0:
         pass
     elif not self.cr.doId2do.has_key(avId):
         func = PythonUtil.Functor(self.gotToon, index, avId)
         self.toonRequests[index] = self.cr.relatedObjectMgr.requestObjects(
             [avId], allCallback=func)
     elif not self.isSetup:
         self.deferredSlots.append((index, avId, wantBoardingShow))
     else:
         if avId == base.localAvatar.getDoId():
             place = base.cr.playGame.getPlace()
             if not place:
                 return
             elevator = self.getPlaceElevator()
             if elevator == None:
                 place.fsm.request('elevator')
                 elevator = self.getPlaceElevator()
             if not elevator:
                 return
             self.localToonOnBoard = 1
             if hasattr(localAvatar,
                        'boardingParty') and localAvatar.boardingParty:
                 localAvatar.boardingParty.forceCleanupInviteePanel()
                 localAvatar.boardingParty.forceCleanupInviterPanels()
             if hasattr(base.localAvatar, 'elevatorNotifier'):
                 base.localAvatar.elevatorNotifier.cleanup()
             cameraTrack = Sequence()
             cameraTrack.append(
                 Func(elevator.fsm.request, 'boarding',
                      [self.getElevatorModel()]))
             cameraTrack.append(Func(elevator.fsm.request, 'boarded'))
         toon = self.cr.doId2do[avId]
         toon.stopSmooth()
         toon.wrtReparentTo(self.golfKart)
         sitStartDuration = toon.getDuration('sit-start')
         jumpTrack = self.generateToonJumpTrack(toon, index)
         track = Sequence(jumpTrack,
                          Func(toon.setAnimState, 'Sit', 1.0),
                          Func(self.clearToonTrack, avId),
                          name=toon.uniqueName('fillElevator'),
                          autoPause=1)
         if wantBoardingShow:
             boardingTrack, boardingTrackType = self.getBoardingTrack(
                 toon, index, True)
             track = Sequence(boardingTrack, track)
             if avId == base.localAvatar.getDoId():
                 cameraWaitTime = 2.5
                 if boardingTrackType == BoardingGroupShow.TRACK_TYPE_RUN:
                     cameraWaitTime = 0.5
                 cameraTrack = Sequence(Wait(cameraWaitTime), cameraTrack)
         if self.canHideBoardingQuitBtn(avId):
             track = Sequence(
                 Func(localAvatar.boardingParty.groupPanel.disableQuitButton
                      ), track)
         if avId == base.localAvatar.getDoId():
             track = Parallel(cameraTrack, track)
         track.delayDelete = DelayDelete.DelayDelete(
             toon, 'CogKart.fillSlot')
         self.storeToonTrack(avId, track)
         track.start()
         self.fillSlotTrack = track
         self.boardedAvIds[avId] = None
     return
    def cleanupIntervals(self):
        for interval in self.activeIntervals.values():
            interval.finish()
            DelayDelete.cleanupDelayDeletes(interval)

        self.activeIntervals = {}
    def emptySlot(self, index, avId, timestamp):
        #print "Emptying slot: %d for %d" % (index, avId)
        # If localToon is exiting, he needs to change state
        if avId == 0:
            # This means that no one is currently exiting, and no action
            # should be taken
            pass
        else:
            self.avIds[index] = 0
            if avId in self.cr.doId2do:
                # If the toon exists, look it up
                toon = self.cr.doId2do[avId]
                # Parent it to render
                #toon.setHpr(self.golfKart, 90,0,0)
                #toon.wrtReparentTo(render)
                toon.stopSmooth()
                # toon.setAnimState("run", 1.0)

                # Place it on the appropriate spot relative to the
                # trolley station

                sitStartDuration = toon.getDuration("sit-start")
                jumpOutTrack = self.generateToonReverseJumpTrack(toon, index)
                track = Sequence(
                    # Hop off the seat
                    #Parallel(ActorInterval(toon, "sit-start",
                    #                       startTime=sitStartDuration,
                    #                       endTime=0.0),
                    #         Sequence(Wait(sitStartDuration*0.5),
                    #                  LerpPosInterval(toon, sitStartDuration*0.25,
                    #                                  Point3( -4.5 + (index * 3), 5, 1.4),
                    #                                  other=self.golfKart),
                    #                  ),
                    #         ),
                    # Then run
##                     Func(toon.setAnimState, "run", 1.0),
##                     LerpPosInterval(toon, TOON_EXIT_TIME,
##                                     Point3(21 - (index * 3),
##                                            -5,
##                                            0.02),
##                                     #Point3(165, 0, 0),
##                                     other=self.golfKart
##                                     ),

                    jumpOutTrack,
                    # Tell the toon he is free to roam now
                    Func(self.notifyToonOffTrolley, toon),
                    Func(self.clearToonTrack, avId),
                    name = toon.uniqueName("emptyTrolley"),
                    autoPause = 1)
                track.delayDelete = DelayDelete.DelayDelete(toon, 'GolfKart.emptySlot')
                self.storeToonTrack(avId, track)
                track.start()

                # Tell localToon he is exiting (if localToon is on board)
                if avId == base.localAvatar.getDoId():
                    self.loader.place.trolley.fsm.request("exiting")

            else:
                self.notify.warning("toon: " + str(avId) +
                                                  " doesn't exist, and" +
                                                  " cannot exit the trolley!")
Пример #36
0
 def clearToonTrack(self, avId):
     oldTrack = self._OZSafeZoneLoader__toonTracks.get(avId)
     if oldTrack:
         oldTrack.pause()
         DelayDelete.cleanupDelayDeletes(oldTrack)
         del self._OZSafeZoneLoader__toonTracks[avId]
Пример #37
0
    def enterExplode(self, time):
        # Are we exploding?
        self.exploding = True

        # Lets create a specific actor for the explosion and load the explosion stuff.
        loseActor = self.getLoseActor()
        loseActor.reparentTo(render)
        spinningSound = base.loadSfx('phase_3.5/audio/sfx/Cog_Death.ogg')
        deathSound = base.loadSfx('phase_3.5/audio/sfx/ENC_cogfall_apart.ogg')

        # We're done with this guy.
        self.stash()

        # Oh boy, time to load all of our explosion effects!
        explosionInterval = ActorInterval(loseActor,
                                          'lose',
                                          startFrame=0,
                                          endFrame=150)
        deathSoundTrack = Sequence(
            Wait(0.6),
            SoundInterval(spinningSound,
                          duration=1.2,
                          startTime=1.5,
                          volume=0.2,
                          node=loseActor),
            SoundInterval(spinningSound,
                          duration=3.0,
                          startTime=0.6,
                          volume=0.8,
                          node=loseActor),
            SoundInterval(deathSound, volume=0.32, node=loseActor))

        # Load the particles for the explosion.
        BattleParticles.loadParticles()
        smallGears = BattleParticles.createParticleEffect(
            file='gearExplosionSmall')
        singleGear = BattleParticles.createParticleEffect('GearExplosion',
                                                          numParticles=1)
        smallGearExplosion = BattleParticles.createParticleEffect(
            'GearExplosion', numParticles=10)
        bigGearExplosion = BattleParticles.createParticleEffect(
            'BigGearExplosion', numParticles=30)
        gearPoint = Point3(loseActor.getX(), loseActor.getY(),
                           loseActor.getZ())
        smallGears.setDepthWrite(False)
        singleGear.setDepthWrite(False)
        smallGearExplosion.setDepthWrite(False)
        bigGearExplosion.setDepthWrite(False)

        # Create the explosion track.
        explosionTrack = Sequence()
        explosionTrack.append(Wait(5.4))
        explosionTrack.append(self.createKapowExplosionTrack(loseActor))

        gears1Track = Sequence(Wait(2.0),
                               ParticleInterval(smallGears,
                                                loseActor,
                                                worldRelative=0,
                                                duration=4.3,
                                                cleanup=True),
                               name='gears1Track')
        gears2MTrack = Track((0.0, explosionTrack),
                             (0.7,
                              ParticleInterval(singleGear,
                                               loseActor,
                                               worldRelative=0,
                                               duration=5.7,
                                               cleanup=True)),
                             (5.2,
                              ParticleInterval(smallGearExplosion,
                                               loseActor,
                                               worldRelative=0,
                                               duration=1.2,
                                               cleanup=True)),
                             (5.4,
                              ParticleInterval(bigGearExplosion,
                                               loseActor,
                                               worldRelative=0,
                                               duration=1.0,
                                               cleanup=True)),
                             name='gears2MTrack')

        # Cleanup

        cleanupTrack = Track((6.5, Func(self.cleanupLoseActor)
                              ))  # Better delete the poor guy when we're done

        # Blow the sucker up.
        self.explodeTrack = Sequence(
            Parallel(explosionInterval, deathSoundTrack, gears1Track,
                     gears2MTrack))
        self.explodeTrack.delayDelete = DelayDelete(self, 'cleanupExplode')
        self.explodeTrack.append(Func(self.explodeTrack.delayDelete.destroy))
        self.explodeTrack.start()
        self.explodeTrack.setT(time)
Пример #38
0
    def setGeyserAnim(self, task=None):
        if self.done:
            return
        maxSize = 0.4 * random.random() + 0.75
        time = 1.0
        self.geyserTrack = Sequence()
        upPos = Vec3(self.geyserPos[0], self.geyserPos[1], self.geyserPos[2])
        downPos = Vec3(self.geyserPos[0], self.geyserPos[1],
                       self.geyserPos[2] - 8.0)
        avList = copy.copy(Avatar.Avatar.ActiveAvatars)
        avList.append(base.localAvatar)
        playSound = 0
        for av in avList:
            distance = self.geyserPlacer.getDistance(av)
            if distance < 7.0:
                place = base.cr.playGame.getPlace()
                local = 0
                avPos = av.getPos()
                upToon = Vec3(avPos[0], avPos[1],
                              maxSize * self.geyserPos[2] + 40.0)
                midToon = Vec3(avPos[0], avPos[1],
                               maxSize * self.geyserPos[2] + 30.0)
                downToon = Vec3(avPos[0], avPos[1], self.geyserPos[2])
                returnPoints = [(7, 7), (8, 0), (-8, 3), (-7, 7), (3, -7),
                                (0, 8), (-10, 0), (8, -3), (5, 8), (-8, 5),
                                (-1, 7)]
                pick = int((float(av.doId) - 11.0) / 13.0 % len(returnPoints))
                returnChoice = returnPoints[pick]
                toonReturn = Vec3(self.geyserPos[0] + returnChoice[0],
                                  self.geyserPos[1] + returnChoice[1],
                                  self.geyserPos[2] - 1.5)
                topTrack = Sequence()
                av.dropShadow.hide()
                playSound = 1
                if av == base.localAvatar:
                    base.cr.playGame.getPlace().setState('fishing')
                    base.localAvatar.setTeleportAvailable(0)
                    base.localAvatar.collisionsOff()
                    local = 1
                else:
                    topTrack.delayDeletes = [
                        DelayDelete.DelayDelete(
                            av, 'OZSafeZoneLoader.setGeyserAnim')
                    ]
                    av.stopSmooth()
                animTrack = Parallel()
                toonTrack = Sequence()
                toonTrack.append(Wait(0.5))
                animTrack.append(
                    ActorInterval(av, 'jump-idle', loop=1,
                                  endTime=11.5 * time))
                animTrack.append(
                    ActorInterval(av, 'neutral', loop=0, endTime=0.25 * time))
                holder = render.attachNewNode('toon hold')
                base.holder = holder
                toonPos = av.getPos(render)
                toonHpr = av.getHpr(render)
                print('av Pos %s' % av.getPos())
                base.toonPos = toonPos
                holder.setPos(toonPos)
                av.reparentTo(holder)
                av.setPos(0, 0, 0)
                lookAt = 180
                toonH = (lookAt + toonHpr[0]) % 360
                newHpr = Vec3(toonH, toonHpr[1], toonHpr[2])
                if toonH < 180:
                    lookIn = Vec3(0 + lookAt, -30, 0)
                else:
                    lookIn = Vec3(360 + lookAt, -30, 0)
                print('Camera Hprs toon %s; lookIn %s; final %s' %
                      (newHpr, lookIn, lookIn - newHpr))
                if local == 1:
                    camPosOriginal = camera.getPos()
                    camHprOriginal = camera.getHpr()
                    camParentOriginal = camera.getParent()
                    cameraPivot = holder.attachNewNode('camera pivot')
                    chooseHeading = random.choice([-10.0, 15.0, 40.0])
                    cameraPivot.setHpr(chooseHeading, -20.0, 0.0)
                    cameraArm = cameraPivot.attachNewNode('camera arm')
                    cameraArm.setPos(0.0, -23.0, 3.0)
                    camPosStart = Point3(0.0, 0.0, 0.0)
                    camHprStart = Vec3(0.0, 0.0, 0.0)
                    self.changeCamera(cameraArm, camPosStart, camHprStart)
                    cameraTrack = Sequence()
                    cameraTrack.append(Wait(11.0 * time))
                    cameraTrack.append(
                        Func(self.changeCamera, camParentOriginal,
                             camPosOriginal, camHprOriginal))
                    cameraTrack.start()
                moveTrack = Sequence()
                moveTrack.append(Wait(0.5))
                moveTrack.append(
                    LerpPosInterval(holder,
                                    3.0 * time,
                                    pos=upToon,
                                    startPos=downToon,
                                    blendType='easeOut'))
                moveTrack.append(
                    LerpPosInterval(holder,
                                    2.0 * time,
                                    pos=midToon,
                                    startPos=upToon,
                                    blendType='easeInOut'))
                moveTrack.append(
                    LerpPosInterval(holder,
                                    1.0 * time,
                                    pos=upToon,
                                    startPos=midToon,
                                    blendType='easeInOut'))
                moveTrack.append(
                    LerpPosInterval(holder,
                                    2.0 * time,
                                    pos=midToon,
                                    startPos=upToon,
                                    blendType='easeInOut'))
                moveTrack.append(
                    LerpPosInterval(holder,
                                    1.0 * time,
                                    pos=upToon,
                                    startPos=midToon,
                                    blendType='easeInOut'))
                moveTrack.append(
                    LerpPosInterval(holder,
                                    2.5 * time,
                                    pos=toonReturn,
                                    startPos=upToon,
                                    blendType='easeIn'))
                animTrack.append(moveTrack)
                animTrack.append(toonTrack)
                topTrack.append(animTrack)
                topTrack.append(Func(av.setPos, toonReturn))
                topTrack.append(Func(av.reparentTo, render))
                topTrack.append(Func(holder.remove))
                if local == 1:
                    topTrack.append(Func(self.restoreLocal))
                else:
                    topTrack.append(Func(self.restoreRemote, av))
                topTrack.append(Func(self.clearToonTrack, av.doId))
                self.storeToonTrack(av.doId, topTrack)
                topTrack.start()

        self.geyserTrack.append(Func(self.doPrint, 'geyser start'))
        self.geyserTrack.append(
            Func(self.geyserNodePath.setPos, self.geyserPos[0],
                 self.geyserPos[1], self.geyserPos[2]))
        self.geyserTrack.append(
            Parallel(
                LerpScaleInterval(self.geyserActor, 2.0 * time, 0.75, 0.01),
                LerpPosInterval(self.geyserActor,
                                2.0 * time,
                                pos=downPos,
                                startPos=downPos)))
        self.geyserTrack.append(
            Parallel(
                LerpScaleInterval(self.geyserActor, time, maxSize, 0.75),
                LerpPosInterval(self.geyserActor,
                                time,
                                pos=upPos,
                                startPos=downPos)))
        self.geyserTrack.append(
            Parallel(
                LerpScaleInterval(self.geyserActor, 2.0 * time, 0.75, maxSize),
                LerpPosInterval(self.geyserActor,
                                2.0 * time,
                                pos=downPos,
                                startPos=upPos)))
        self.geyserTrack.append(
            Parallel(
                LerpScaleInterval(self.geyserActor, time, maxSize, 0.75),
                LerpPosInterval(self.geyserActor,
                                time,
                                pos=upPos,
                                startPos=downPos)))
        self.geyserTrack.append(
            Parallel(
                LerpScaleInterval(self.geyserActor, 2.0 * time, 0.75, maxSize),
                LerpPosInterval(self.geyserActor,
                                2.0 * time,
                                pos=downPos,
                                startPos=upPos)))
        self.geyserTrack.append(
            Parallel(
                LerpScaleInterval(self.geyserActor, time, maxSize, 0.75),
                LerpPosInterval(self.geyserActor,
                                time,
                                pos=upPos,
                                startPos=downPos)))
        self.geyserTrack.append(
            Parallel(
                LerpScaleInterval(self.geyserActor, 4.0 * time, 0.01, maxSize),
                LerpPosInterval(self.geyserActor,
                                4.0 * time,
                                pos=downPos,
                                startPos=upPos)))
        self.geyserTrack.append(
            Func(self.geyserNodePath.setPos, self.geyserPos[0],
                 self.geyserPos[1], self.geyserPos[2] - 100.0))
        self.geyserTrack.append(Func(self.doPrint, 'geyser end'))
        self.geyserTrack.start()
        if playSound:
            self.geyserSoundInterval.start()
        else:
            self.geyserSoundNoToonInterval.start()
 def clearToonTrack(self, avId):
     oldTrack = self.__toonTracks.get(avId)
     if oldTrack:
         oldTrack.pause()
         DelayDelete.cleanupDelayDeletes(oldTrack)
Пример #40
0
 def knockKnockTrack(self, avatar, duration):
     if avatar == None:
         return
     self.rimshot = base.loadSfx('phase_5/audio/sfx/AA_heal_telljoke.mp3')
     self.knockSfx = base.loadSfx('phase_5/audio/sfx/GUI_knock_3.mp3')
     joke = KnockKnockJokes[self.propId % len(KnockKnockJokes)]
     place = base.cr.playGame.getPlace()
     if place:
         zone = place.getZoneId()
         branch = ZoneUtil.getBranchZone(zone)
         if branch == ToontownGlobals.SillyStreet:
             if self.propId == 44:
                 joke = KnockKnockContestJokes[ToontownGlobals.SillyStreet]
         elif branch == ToontownGlobals.LoopyLane:
             if self.propId in KnockKnockContestJokes[
                     ToontownGlobals.LoopyLane].keys():
                 joke = KnockKnockContestJokes[ToontownGlobals.LoopyLane][
                     self.propId]
         elif branch == ToontownGlobals.PunchlinePlace:
             if self.propId == 1:
                 joke = KnockKnockContestJokes[
                     ToontownGlobals.PunchlinePlace]
         elif branch == ToontownGlobals.PolarPlace:
             if self.propId in KnockKnockContestJokes[
                     ToontownGlobals.PolarPlace].keys():
                 joke = KnockKnockContestJokes[ToontownGlobals.PolarPlace][
                     self.propId]
     self.nametag = None
     self.nametagNP = None
     doorNP = render.find('**/KnockKnockDoorSphere_' + str(self.propId) +
                          ';+s')
     if doorNP.isEmpty():
         self.notify.warning('Could not find KnockKnockDoorSphere_%s' %
                             self.propId)
         return
     self.nametag = NametagGroup()
     self.nametag.setAvatar(doorNP)
     self.nametag.setFont(ToontownGlobals.getToonFont())
     self.nametag.setName(TTLocalizer.DoorNametag)
     self.nametag.setActive(0)
     self.nametag.manage(base.marginManager)
     self.nametag.getNametag3d().setBillboardOffset(4)
     nametagNode = self.nametag.getNametag3d().upcastToPandaNode()
     self.nametagNP = render.attachNewNode(nametagNode)
     self.nametagNP.setName('knockKnockDoor_nt_' + str(self.propId))
     pos = doorNP.node().getSolid(0).getCenter()
     self.nametagNP.setPos(pos + Vec3(0, 0, avatar.getHeight() + 2))
     d = duration * 0.125
     track = Sequence(
         Parallel(
             Sequence(Wait(d * 0.5), SoundInterval(self.knockSfx)),
             Func(self.nametag.setChat, TTLocalizer.DoorKnockKnock,
                  CFSpeech), Wait(d)),
         Func(avatar.setChatAbsolute,
              TTLocalizer.DoorWhosThere,
              CFSpeech | CFTimeout,
              openEnded=0), Wait(d),
         Func(self.nametag.setChat, joke[0], CFSpeech), Wait(d),
         Func(avatar.setChatAbsolute,
              joke[0] + TTLocalizer.DoorWhoAppendix,
              CFSpeech | CFTimeout,
              openEnded=0), Wait(d),
         Func(self.nametag.setChat, joke[1], CFSpeech),
         Parallel(SoundInterval(self.rimshot, startTime=2.0), Wait(d * 4)),
         Func(self.cleanupTrack))
     track.delayDelete = DelayDelete.DelayDelete(avatar, 'knockKnockTrack')
     return track
    def emptySlot(self, index, avId, timestamp):
        def emptySeat(index):
            self.notify.debug('### seat %s now empty' % index)
            self.fullSeat[index] = self.seatState.Empty

        if avId == 0:
            pass
        1
        if avId == 1:
            self.fullSeat[index] = self.seatState.Empty
            track = Sequence(self.generateFoodDisappearTrack(index))
            self.notify.debug('### empty slot - unexpetected: fullSeat = %s' %
                              self.fullSeat)
            if self.fullSeat.count(0) == 4:
                self.notify.debug('### empty slot - unexpected: losing basket')
                if self.picnicBasketTrack:
                    self.picnicBasketTrack.finish()

                waitDuration = track.getDuration()
                self.picnicBasketTrack = Sequence(
                    Wait(waitDuration), self.generateBasketDisappearTrack())
                self.picnicBasketTrack.start()

            track.start()
        else:
            self.fullSeat[index] = self.seatState.Empty
            if self.cr.doId2do.has_key(avId):
                if avId == base.localAvatar.getDoId():
                    if self.clockNode:
                        self.clockNode.hide()

                toon = self.cr.doId2do[avId]
                toon.stopSmooth()
                sitStartDuration = toon.getDuration('sit-start')
                jumpOutTrack = self.generateToonReverseJumpTrack(toon, index)
                track = Sequence(jumpOutTrack)
                track.append(self.generateFoodDisappearTrack(index))
                self.notify.debug('### empty slot: fullSeat = %s' %
                                  self.fullSeat)
                if self.fullSeat.count(0) == 4:
                    self.notify.debug('### empty slot: losing basket')
                    if self.picnicBasketTrack:
                        self.picnicBasketTrack.finish()

                    waitDuration = track.getDuration()
                    self.picnicBasketTrack = Sequence(
                        Wait(waitDuration),
                        self.generateBasketDisappearTrack())
                    self.picnicBasketTrack.start()

                track.append(
                    Sequence(Func(self.notifyToonOffTrolley, toon),
                             Func(self.clearToonTrack, avId),
                             Func(self.doneExit, avId),
                             Func(emptySeat, index),
                             name=toon.uniqueName('emptyTrolley'),
                             autoPause=1))
                track.delayDelete = DelayDelete.DelayDelete(
                    toon, 'PicnicBasket.emptySlot')
                self.storeToonTrack(avId, track)
                track.start()
    def exitDoorExitOpen(self):
        for track in self.avatarExitTracks:
            track.finish()
            DelayDelete.cleanupDelayDeletes(track)

        self.avatarExitTracks = []
Пример #43
0
    def exitDoorExitOpen(self):
        for track in self.avatarExitTracks:
            track.finish()
            DelayDelete.cleanupDelayDeletes(track)

        self.avatarExitTracks = []
Пример #44
0
    def getVictoryRunTrack(self):
        origPosTrack = Sequence()
        delayDeletes = []
        i = 0
        for victor in self.victorList:
            if victor != 0 and self.cr.doId2do.has_key(victor):
                toon = self.cr.doId2do[victor]
                delayDeletes.append(
                    DelayDelete.DelayDelete(toon, 'getVictoryRunTrack'))
                toon.stopSmooth()
                toon.setParent(ToontownGlobals.SPHidden)
                origPosTrack.append(
                    Func(toon.setPosHpr, self.elevatorNodePath,
                         apply(Point3, ElevatorPoints[i]), Point3(180, 0, 0)))
                origPosTrack.append(
                    Func(toon.setParent, ToontownGlobals.SPRender))
            i += 1

        openDoors = getOpenInterval(self, self.leftDoor, self.rightDoor,
                                    self.openSfx, None)

        buildingNodes = self.getNodePaths()
        for np in buildingNodes:
            if np.getName().startswith('tb'):
                doorNodePath = np.find('**/*door_origin')
                if not doorNodePath.isEmpty():
                    break
        else:
            self.notify.error('Could not find door origin!')

        toonDoorPos = doorNodePath.getPos(NodePath())
        useFarExitPoints = toonDoorPos.getZ() > 1.0
        runOutAll = Parallel()
        i = 0
        for victor in self.victorList:
            if victor != 0 and self.cr.doId2do.has_key(victor):
                toon = self.cr.doId2do[victor]
                p0 = Point3(0, 0, 0)
                p1 = Point3(ElevatorPoints[i][0], ElevatorPoints[i][1] - 5.0,
                            ElevatorPoints[i][2])
                if useFarExitPoints:
                    p2 = Point3(ElevatorOutPointsFar[i][0],
                                ElevatorOutPointsFar[i][1],
                                ElevatorOutPointsFar[i][2])
                else:
                    p2 = Point3(ElevatorOutPoints[i][0],
                                ElevatorOutPoints[i][1],
                                ElevatorOutPoints[i][2])
                runOutSingle = Sequence(
                    Func(Emote.globalEmote.disableBody, toon, 'getVictory'),
                    Func(toon.animFSM.request, 'run'),
                    LerpPosInterval(toon,
                                    TOON_VICTORY_EXIT_TIME * 0.25,
                                    p1,
                                    other=self.elevatorNodePath),
                    Func(toon.headsUp, self.elevatorNodePath, p2),
                    LerpPosInterval(toon,
                                    TOON_VICTORY_EXIT_TIME * 0.5,
                                    p2,
                                    other=self.elevatorNodePath),
                    LerpHprInterval(toon,
                                    TOON_VICTORY_EXIT_TIME * 0.25,
                                    Point3(0, 0, 0),
                                    other=self.elevatorNodePath),
                    Func(toon.animFSM.request, 'neutral'),
                    Func(toon.startSmooth),
                    Func(Emote.globalEmote.releaseBody, toon, 'getVictory'))
                runOutAll.append(runOutSingle)
            i += 1

        victoryRunTrack = Sequence(origPosTrack, openDoors, runOutAll)
        return (victoryRunTrack, delayDeletes)
Пример #45
0
 def _deleteTrack(self):
     if self.track:
         DelayDelete.cleanupDelayDeletes(self.track)
         self.track = None
     return
Пример #46
0
    def enterReward(self):
        assert self.notify.debugStateCall(self)
        numToons = 0
        toonLayouts = (
            (2, ),
            (1, 3),
            (0, 2, 4),
            (0, 1, 3, 4),
        )
        toonPositions = (5.0, 1.75, -0.25, -1.75, -5.0)
        self.toons = []
        self.toonsKeep = []
        self.counters = []
        self.totalCounters = []

        # put the camera in a reasonable position
        camera.reparentTo(render)
        base.camLens.setMinFov(ToontownGlobals.DefaultCameraFov)
        camera.setPos(0, 16.0, 2.0)
        camera.lookAt(0, 0, 0.75)
        base.transitions.irisIn(0.4)

        # show background elements
        self.title.reparentTo(aspect2d)
        self.foreground.reparentTo(render)
        self.backgroundL.reparentTo(render)
        self.backgroundR.reparentTo(render)
        self.sidewalk.reparentTo(render)
        self.door.reparentTo(render)

        # The backdrop in this scene is not really under our feet - it is a
        # bit of an optical illusion. So to make the physics behave a bit
        # better, we'll actually put a floor directly under the toons so
        # they stay put and their shadows stay put
        size = 20
        z = -2.5
        floor = CollisionPolygon(Point3(-size, -size, z),
                                 Point3(size, -size, z), Point3(size, size, z),
                                 Point3(-size, size, z))
        floor.setTangible(1)
        floorNode = CollisionNode("collision_floor")
        floorNode.addSolid(floor)
        self.collisionFloor = render.attachNewNode(floorNode)

        # the bean counters take up a lot of real estate: clamp the whisper bubbles
        NametagGlobals.setOnscreenChatForced(1)

        # find out how many toons there are, make point counters for
        # them and get their models
        for index in range(len(self.ids)):
            avId = self.ids[index]
            if ((self.states[index] != PURCHASE_NO_CLIENT_STATE)
                    and (self.states[index] != PURCHASE_DISCONNECTED_STATE)
                    and (avId in base.cr.doId2do)):
                numToons += 1
                toon = base.cr.doId2do[avId]
                toon.stopSmooth()
                self.toons.append(toon)
                self.toonsKeep.append(
                    DelayDelete.DelayDelete(toon, 'Purchase.enterReward'))
                # counter for beans won
                counter = DirectLabel(
                    parent=hidden,
                    relief=None,
                    pos=(0.0, 0.0, 0.0),
                    text=str(0),
                    text_scale=0.2,
                    text_fg=(0.95, 0.95, 0, 1),
                    text_pos=(0, -0.1, 0),
                    text_font=ToontownGlobals.getSignFont(),
                )
                counter['image'] = DGG.getDefaultDialogGeom()
                counter['image_scale'] = (0.33, 1, 0.33)
                counter.setScale(0.5)
                counter.count = 0
                counter.max = self.pointsArray[index]
                self.counters.append(counter)

                # counter for total beans carried
                money = self.playerMoney[index]
                totalCounter = DirectLabel(
                    parent=hidden,
                    relief=None,
                    pos=(0.0, 0.0, 0.0),
                    text=str(money),
                    text_scale=0.2,
                    text_fg=(0.95, 0.95, 0, 1),
                    text_pos=(0, -0.1, 0),
                    text_font=ToontownGlobals.getSignFont(),
                    image=self.jarImage,
                )
                totalCounter.setScale(0.5)
                totalCounter.count = money
                totalCounter.max = toon.getMaxMoney()
                self.totalCounters.append(totalCounter)

        # add a hook when user unexpectedly closes toontown window
        self.accept('clientCleanup', self._handleClientCleanup)

        # display the toons and jars
        pos = 0
        toonLayout = toonLayouts[numToons - 1]
        for toon in self.toons:
            thisPos = toonPositions[toonLayout[pos]]
            toon.setPos(Vec3(thisPos, 1.0, -2.5))
            toon.setHpr(Vec3(0, 0, 0))
            toon.setAnimState("neutral", 1)
            toon.setShadowHeight(0)
            if not toon.isDisabled():
                toon.reparentTo(render)
            self.counters[pos].setPos(thisPos * -0.17, 0,
                                      toon.getHeight() / 10 + 0.25)
            self.counters[pos].reparentTo(aspect2d)
            self.totalCounters[pos].setPos(thisPos * -0.17, 0, -0.825)
            self.totalCounters[pos].reparentTo(aspect2d)
            pos += 1

        # find the max points won
        self.maxPoints = max(self.pointsArray)

        #find the maxVotes left
        if self.votesArray:
            self.maxVotes = max(self.votesArray)
            numToons = len(self.toons)
            self.voteMultiplier = TravelGameGlobals.PercentOfVotesConverted[
                numToons] / 100.0
            self.maxBeansFromVotes = int(self.voteMultiplier * self.maxVotes)
        else:
            self.maxVotes = 0
            self.maxBeansFromVotes = 0

        def reqCountUp(state):
            self.countUp()
            return Task.done

        countUpDelay = DELAY_BEFORE_COUNT_UP
        taskMgr.doMethodLater(countUpDelay, reqCountUp, "countUpTask")

        def reqCountDown(state):
            self.countDown()
            return Task.done

        countDownDelay = (countUpDelay + self.maxPoints * COUNT_UP_RATE +
                          DELAY_AFTER_COUNT_UP)
        taskMgr.doMethodLater(countDownDelay, reqCountDown, "countDownTask")

        # play the jump animation for the winner(s)
        def celebrate(task):
            # hide the counters before we jump!
            for counter in task.counters:
                counter.hide()
            winningPoints = max(task.pointsArray)
            for i in range(len(task.ids)):
                if task.pointsArray[i] == winningPoints:
                    avId = task.ids[i]
                    if avId in base.cr.doId2do:
                        toon = base.cr.doId2do[avId]
                        toon.setAnimState("jump", 1.0)

            base.playSfx(task.celebrateSound)
            return Task.done

        celebrateDelay = (countDownDelay + self.maxPoints * COUNT_DOWN_RATE +
                          DELAY_AFTER_COUNT_DOWN)
        celebrateTask = taskMgr.doMethodLater(celebrateDelay, celebrate,
                                              "celebrate")
        celebrateTask.counters = self.counters
        celebrateTask.pointsArray = self.pointsArray
        celebrateTask.ids = self.ids
        celebrateTask.celebrateSound = self.celebrateSound

        def reqCountVotesUp(state):
            self.countVotesUp()
            return Task.done

        def reqCountVotesDown(state):
            self.countVotesDown()
            return Task.done

        # show the player the votes left being converted to beans
        if self.metagameRound == TravelGameGlobals.FinalMetagameRoundIndex:
            countVotesUpDelay = celebrateDelay + DELAY_AFTER_CELEBRATE
            taskMgr.doMethodLater(countVotesUpDelay, reqCountVotesUp,
                                  "countVotesUpTask")

            countVotesUpTime = (self.maxVotes *
                                COUNT_UP_RATE) + DELAY_AFTER_COUNT_UP
            countVotesDownDelay = countVotesUpDelay + countVotesUpTime
            taskMgr.doMethodLater(countVotesDownDelay, reqCountVotesDown,
                                  "countVotesDownTask")
            celebrateDelay += countVotesUpTime + \
                              (self.maxVotes * COUNT_DOWN_RATE) + DELAY_AFTER_COUNT_DOWN

        # transition to the purchase after the countup is finished
        def reqPurchase(state):
            self.fsm.request("purchase")
            return Task.done

        purchaseDelay = (celebrateDelay + DELAY_AFTER_CELEBRATE)
        taskMgr.doMethodLater(purchaseDelay, reqPurchase, "purchase-trans")

        if base.skipMinigameReward:
            self.fsm.request('purchase')