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 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 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
     return
    def exitPlaying(self):
        DistributedAnimatedProp.DistributedAnimatedProp.exitPlaying(self)
        for track in self.avatarTracks:
            track.finish()
            DelayDelete.cleanupDelayDeletes(track)

        self.avatarTracks = []
        self.avatarId = 0
示例#6
0
 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 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
     return
示例#8
0
 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)
 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)
 def fillSlot(self, index, avId):
     self.avIds[index] = avId
     if avId == 0:
         pass
     else:
         if avId == base.localAvatar.getDoId():
             self.loader.place.trolley.fsm.request('boarding',
                                                   [self.golfKart])
             self.localToonOnBoard = 1
         if avId == base.localAvatar.getDoId():
             self.loader.place.trolley.fsm.request('boarded')
         if avId in self.cr.doId2do:
             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('fillTrolley'),
                              autoPause=1)
             track.delayDelete = DelayDelete.DelayDelete(
                 toon, 'GolfKart.fillSlot')
             self.storeToonTrack(avId, track)
             track.start()
         else:
             self.notify.warning('toon: ' + str(avId) +
                                 " doesn't exist, and" +
                                 ' cannot board the trolley!')
 def emptySlot(self, index, avId, timestamp):
     if avId == 0:
         pass
     else:
         self.avIds[index] = 0
         if avId in self.cr.doId2do:
             toon = self.cr.doId2do[avId]
             toon.stopSmooth()
             sitStartDuration = toon.getDuration('sit-start')
             jumpOutTrack = self.generateToonReverseJumpTrack(toon, index)
             track = Sequence(jumpOutTrack,
                              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()
             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!')
示例#12
0
 def __init__(self, av, purchaseModels):
     DirectFrame.__init__(self,
                          relief=None,
                          image=purchaseModels.find('**/Char_Pnl'))
     self.initialiseoptions(PurchaseHeadFrame)
     self.statusLabel = DirectLabel(parent=self,
                                    relief=None,
                                    text='',
                                    text_scale=TTLocalizer.PstatusLabel,
                                    text_wordwrap=7.5,
                                    text_fg=(0.05, 0.14, 0.4, 1),
                                    text_pos=(0.1, 0, 0))
     self.av = av
     self.avKeep = DelayDelete.DelayDelete(av, 'PurchaseHeadFrame.av')
     self.accept('clientCleanup', self._handleClientCleanup)
     self.head = self.stateNodePath[0].attachNewNode('head', 20)
     self.head.setPosHprScale(-0.22, 10.0, -0.1, 180.0, 0.0, 0.0, 0.1, 0.1,
                              0.1)
     self.headModel = ToonHead.ToonHead()
     self.headModel.setupHead(self.av.style, forGui=1)
     self.headModel.reparentTo(self.head)
     self.tag2Node = NametagFloat2d()
     self.tag2Node.setContents(Nametag.CName)
     self.av.nametag.addNametag(self.tag2Node)
     self.tag2 = self.attachNewNode(self.tag2Node)
     self.tag2.setPosHprScale(-0.22, 10.0, 0.12, 0, 0, 0, 0.046, 0.046,
                              0.046)
     self.tag1Node = NametagFloat2d()
     self.tag1Node.setContents(Nametag.CSpeech | Nametag.CThought)
     self.av.nametag.addNametag(self.tag1Node)
     self.tag1 = self.attachNewNode(self.tag1Node)
     self.tag1.setPosHprScale(-0.15, 0, -0.1, 0, 0, 0, 0.046, 0.046, 0.046)
     self.hide()
 def knockKnockTrack(self, avatar, duration):
     if avatar is None:
         return
     self.rimshot = base.loadSfx('phase_5/audio/sfx/AA_heal_telljoke.ogg')
     self.knockSfx = base.loadSfx('phase_5/audio/sfx/GUI_knock_%s.ogg' % random.randint(1, 4))
     joke = KnockKnockJokes[self.propId % len(KnockKnockJokes)]
     place = base.cr.playGame.getPlace()
     doorName = TTLocalizer.DoorNametag
     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.setSpeechFont(ToontownGlobals.getToonFont())
     self.nametag.setName(doorName)
     self.nametag.setActive(0)
     self.nametag.manage(base.marginManager)
     self.nametag.getNametag3d().setBillboardOffset(4)
     nametagNode = self.nametag.getNametag3d()
     self.nametagNP = render.attachNewNode(nametagNode)
     self.nametagNP.setName('knockKnockDoor_nt_' + str(self.propId))
     pos = doorNP.getBounds().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))
     if avatar == base.localAvatar:
         track.append(Func(self.sendUpdate, 'requestToonup'))
     track.append(Parallel(SoundInterval(self.rimshot, startTime=2.0), Wait(d * 4)))
     track.append(Func(self.cleanupTrack))
     track.delayDelete = DelayDelete.DelayDelete(avatar, 'knockKnockTrack')
     return track
示例#14
0
 def __faRejectEnter(self, message):
     self.rejectDialog = TTDialog.TTGlobalDialog(message = message, doneEvent = 'doorRejectAck', style = TTDialog.Acknowledge)
     self.rejectDialog.show()
     self.rejectDialog.delayDelete = DelayDelete.DelayDelete(self, '__faRejectEnter')
     event = 'clientCleanup'
     self.acceptOnce(event, self.__handleClientCleanup)
     base.cr.playGame.getPlace().setState('stopped')
     self.acceptOnce('doorRejectAck', self.__handleRejectAck)
     self.acceptOnce('stoppedAsleep', self.__handleFallAsleepDoor)
示例#15
0
 def fillSlot(self, index, avId):
     if avId == 0:
         pass
     else:
         if avId == base.localAvatar.getDoId():
             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
             if hasattr(self.loader.place,
                        'trolley') and self.loader.place.trolley:
                 self.loader.place.trolley.fsm.request(
                     'boarding', [self.trolleyCar])
                 self.localToonOnBoard = 1
                 self.loader.place.trolley.fsm.request('boarded')
             else:
                 self.notify.warning(
                     "Can't board the trolley because it doesn't exist")
                 self.sendUpdate('requestExit')
         if avId in self.cr.doId2do:
             toon = self.cr.doId2do[avId]
             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!')
示例#16
0
    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
        elif 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 avId in self.cr.doId2do:
                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()
示例#17
0
 def fillSlot(self, index, avId):
     self.notify.debug('fill Slot: %d for %d' % (index, avId))
     if avId == 0:
         pass
     else:
         self.fullSeat[index] = self.seatState.Full
         if avId == base.localAvatar.getDoId():
             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
         if avId == base.localAvatar.getDoId():
             if hasattr(self.loader.place, 'trolley'):
                 self.loader.place.trolley.fsm.request('boarded')
                 self.loader.place.trolley.exitButton.hide()
         if avId in self.cr.doId2do:
             toon = self.cr.doId2do[avId]
             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))
             self.notify.debug('### fillSlot: fullSeat = %s' %
                               self.fullSeat)
             if self.fullSeat.count(0) == 3:
                 self.notify.debug('### fillSlot: adding basketAppear')
                 if self.picnicBasketTrack:
                     self.picnicBasketTrack.finish()
                 waitDuration = track.getDuration()
                 self.picnicBasketTrack = Sequence(
                     Wait(waitDuration), self.generateBasketAppearTrack())
                 self.picnicBasketTrack.start()
             track.append(self.generateFoodAppearTrack(index))
             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()
示例#18
0
    def doZapToon(self, toon, pos=None, hpr=None, ts=0, fling=1, shake=1):
        zapName = toon.uniqueName('zap')
        self.clearInterval(zapName)
        zapTrack = Sequence(name=zapName)
        if toon == localAvatar:
            self.toOuchMode()
            messenger.send('interrupt-pie')
            self.enableLocalToonSimpleCollisions()
        else:
            zapTrack.append(Func(toon.stopSmooth))

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

        if pos != None and hpr != None:
            (zapTrack.append(Func(toon.setPosHpr, pos, hpr)), )
        toonTrack = Parallel()
        if shake and toon == localAvatar:
            toonTrack.append(
                Sequence(Func(camera.setZ, camera, 1), Wait(0.15),
                         Func(camera.setZ, camera, -2), Wait(0.15),
                         Func(camera.setZ, camera, 1)))
        if fling:
            toonTrack += [
                ActorInterval(toon, 'slip-backward'),
                toon.posInterval(0.5, getSlideToPos, fluid=1)
            ]
        else:
            toonTrack += [ActorInterval(toon, 'slip-forward')]
        zapTrack.append(toonTrack)
        if toon == localAvatar:
            zapTrack.append(Func(self.disableLocalToonSimpleCollisions))
            currentState = self.state
            if currentState == 'BattleThree':
                zapTrack.append(Func(self.toFinalBattleMode))
            elif hasattr(self, 'chairs'):
                zapTrack.append(Func(self.toFinalBattleMode))
            else:
                zapTrack.append(Func(self.toWalkMode))
        else:
            zapTrack.append(Func(toon.startSmooth))
        if ts > 0:
            startTime = ts
        else:
            zapTrack = Sequence(Wait(-ts), zapTrack)
            startTime = 0
        zapTrack.append(Func(self.clearInterval, zapName))
        zapTrack.delayDelete = DelayDelete.DelayDelete(toon,
                                                       'BossCog.doZapToon')
        zapTrack.start(startTime)
        self.storeInterval(zapTrack, zapName)
        return
示例#19
0
 def avatarEnqueueTrack(self, avatar, duration):
     if hasattr(avatar, 'stopSmooth'):
         avatar.stopSmooth()
     back = -5.0 - 2.0 * len(self.avatarIDList)
     if back < -9.0:
         back = -9.0
     offset = Point3(self.doorX, back, ToontownGlobals.FloorOffset)
     otherNP = self.getDoorNodePath()
     walkLike = ActorInterval(avatar, 'walk', startTime = 1, duration = duration, endTime = 0.0001)
     standHere = Sequence(LerpPosHprInterval(nodePath = avatar, other = otherNP, duration = duration, pos = offset, hpr = VBase3(0, 0, 0), blendType = 'easeInOut'), self.getAnimStateInterval(avatar, 'neutral'))
     trackName = 'avatarEnqueueDoor-%d-%d' % (self.doId, avatar.doId)
     track = Parallel(walkLike, standHere, name = trackName)
     track.delayDelete = DelayDelete.DelayDelete(avatar, 'avatarEnqueueTrack')
     return track
示例#20
0
 def announceGenerate(self):
     DistributedObject.DistributedObject.announceGenerate(self)
     if not self.hasLocalToon:
         return
     self.notify.debug('BASE: handleAnnounceGenerate: send setAvatarJoined')
     self.__delayDelete = DelayDelete.DelayDelete(self, 'GolfCourse.self')
     self.request('Join')
     self.normalExit = 1
     count = self.modelCount
     loader.beginBulkLoad('minigame', TTLocalizer.HeadingToMinigameTitle % self.getTitle(), count, 1, TTLocalizer.TIP_GOLF, self.zoneId)
     self.load()
     globalClock.syncFrameTime()
     self.onstage()
     self.accept('clientCleanup', self._handleClientCleanup)
示例#21
0
    def play(self, ts, callback):
        self.hasBeenReset = 0
        ptrack = Sequence()
        camtrack = Sequence()
        if random.random() > 0.5:
            MovieUtil.shotDirection = 'left'
        else:
            MovieUtil.shotDirection = 'right'
        for s in self.battle.activeSuits:
            s.battleTrapIsFresh = 0

        tattacks, tcam = self.__doToonAttacks()
        if tattacks:
            ptrack.append(tattacks)
            camtrack.append(tcam)
        sattacks, scam = self.__doSuitAttacks()
        if sattacks:
            ptrack.append(sattacks)
            camtrack.append(scam)
        ptrack.append(Func(callback))
        self._deleteTrack()
        self.track = Sequence(ptrack, name='movie-track-%d' % self.battle.doId)
        if self.battle.localToonPendingOrActive():
            self.track = Parallel(self.track, Sequence(camtrack), name='movie-track-with-cam-%d' % self.battle.doId)
        if randomBattleTimestamp == 1:
            randNum = random.randint(0, 99)
            dur = self.track.getDuration()
            ts = float(randNum) / 100.0 * dur
        self.track.delayDeletes = []
        for suit in self.battle.suits:
            self.track.delayDeletes.append(DelayDelete.DelayDelete(suit, 'Movie.play'))

        for toon in self.battle.toons:
            self.track.delayDeletes.append(DelayDelete.DelayDelete(toon, 'Movie.play'))

        self.track.start(ts)
        return None
示例#22
0
 def avatarEnterDoorTrack(self, avatar, duration):
     trackName = 'avatarEnterDoor-%d-%d' % (self.doId, avatar.doId)
     track = Parallel(name = trackName)
     otherNP = self.getDoorNodePath()
     if hasattr(avatar, 'stopSmooth'):
         avatar.stopSmooth()
     if avatar.doId == base.localAvatar.doId:
         track.append(LerpPosHprInterval(nodePath = camera, other = avatar, duration = duration, pos = Point3(0, -8, avatar.getHeight()), hpr = VBase3(0, 0, 0), blendType = 'easeInOut'))
     finalPos = avatar.getParent().getRelativePoint(otherNP, Point3(self.doorX, 2, ToontownGlobals.FloorOffset))
     moveHere = Sequence(self.getAnimStateInterval(avatar, 'walk'), LerpPosInterval(nodePath = avatar, duration = duration, pos = finalPos, blendType = 'easeIn'))
     track.append(moveHere)
     if avatar.doId == base.localAvatar.doId:
         track.append(Sequence(Wait(duration * 0.5), Func(base.transitions.irisOut, duration * 0.5), Wait(duration * 0.5), Func(avatar.b_setParent, ToontownGlobals.SPHidden)))
     track.delayDelete = DelayDelete.DelayDelete(avatar, 'avatarEnterDoorTrack')
     return track
示例#23
0
    def emptySlot(self, index, avId, bailFlag, timestamp, timeSent = 0):
        if self.fillSlotTrack:
            self.fillSlotTrack.finish()
            self.fillSlotTrack = None
        if avId == 0:
            pass
        elif 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 avId in self.cr.doId2do:
                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
示例#24
0
    def emptySlot(self, index, avId, bailFlag, timestamp, timeSent=0):
        if self.fillSlotTrack:
            self.fillSlotTrack.finish()
            self.fillSlotTrack = None
        if avId == 0:
            pass
        elif not self.isSetup:
            newSlots = []
            for slot in self.deferredSlots:
                if slot[0] != index:
                    newSlots.append(slot)

            self.deferredSlots = newSlots
        elif avId in self.cr.doId2do:
            if bailFlag == 1 and hasattr(self, 'clockNode'):
                if timestamp < self.countdownTime and timestamp >= 0:
                    self.countdown(self.countdownTime - timestamp)
                else:
                    self.countdown(self.countdownTime)
            toon = self.cr.doId2do[avId]
            toon.stopSmooth()
            sitStartDuration = toon.getDuration('sit-start')
            jumpOutTrack = self.generateToonReverseJumpTrack(toon, index)
            track = Sequence(jumpOutTrack,
                             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, 'CogKart.emptySlot')
            self.storeToonTrack(toon.doId, 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
示例#25
0
 def avatarExitTrack(self, avatar, duration):
     if hasattr(avatar, 'stopSmooth'):
         avatar.stopSmooth()
     otherNP = self.getDoorNodePath()
     trackName = 'avatarExitDoor-%d-%d' % (self.doId, avatar.doId)
     track = Sequence(name=trackName)
     track.append(self.getAnimStateInterval(avatar, 'walk'))
     track.append(
         PosHprInterval(
             avatar, Point3(-self.doorX, 0, ToontownGlobals.FloorOffset),
             VBase3(179, 0, 0), other=otherNP
         )
     )
     track.append(Func(avatar.setParent, ToontownGlobals.SPRender))
     if avatar.doId == base.localAvatar.doId:
         track.append(
             PosHprInterval(
                 camera, VBase3(-self.doorX, 5, avatar.getHeight()),
                 VBase3(180, 0, 0), other=otherNP
             )
         )
     if avatar.doId == base.localAvatar.doId:
         finalPos = render.getRelativePoint(
             otherNP, Point3(-self.doorX, -6, ToontownGlobals.FloorOffset)
         )
     else:
         finalPos = render.getRelativePoint(
             otherNP, Point3(-self.doorX, -3, ToontownGlobals.FloorOffset)
         )
     track.append(
         LerpPosInterval(
             nodePath=avatar, duration=duration, pos=finalPos,
             blendType='easeInOut'
         )
     )
     if avatar.doId == base.localAvatar.doId:
         track.append(Func(self.exitCompleted))
         track.append(Func(base.transitions.irisIn))
     if hasattr(avatar, 'startSmooth'):
         track.append(Func(avatar.startSmooth))
     track.delayDelete = DelayDelete.DelayDelete(avatar, 'DistributedDoor.avatarExitTrack')
     return track
示例#26
0
 def emptySlot(self, index, avId, timestamp):
     if avId == 0:
         pass
     elif avId in self.cr.doId2do:
         toon = self.cr.doId2do[avId]
         toon.setHpr(self.trolleyCar, 90, 0, 0)
         toon.wrtReparentTo(render)
         toon.stopSmooth()
         sitStartDuration = toon.getDuration('sit-start')
         track = Sequence(Parallel(
             ActorInterval(toon,
                           'sit-start',
                           startTime=sitStartDuration,
                           endTime=0.0),
             Sequence(
                 Wait(sitStartDuration * 0.5),
                 LerpPosInterval(toon,
                                 sitStartDuration * 0.25,
                                 Point3(-5, -4.5 + index * 3, 1.4),
                                 other=self.trolleyCar))),
                          Func(toon.setAnimState, 'run', 1.0),
                          LerpPosInterval(toon,
                                          TOON_EXIT_TIME,
                                          Point3(21 - index * 3, -5, 0.02),
                                          other=self.trolleyStation),
                          Func(self.notifyToonOffTrolley, toon),
                          Func(self.clearToonTrack, avId),
                          name=toon.uniqueName('emptyTrolley'),
                          autoPause=1)
         track.delayDelete = DelayDelete.DelayDelete(
             toon, 'Trolley.emptySlot')
         self.storeToonTrack(avId, track)
         track.start()
         if avId == base.localAvatar.getDoId() and hasattr(
                 self.loader.place,
                 'trolley') and self.loader.place.trolley:
             self.loader.place.trolley.fsm.request('exiting')
     else:
         DistributedTrolley.notify.warning('toon: ' + str(avId) +
                                           " doesn't exist, and" +
                                           ' cannot exit the trolley!')
示例#27
0
 def __init__(self, av, color = ToontownGlobals.GlobalDialogColor, g = DGG.getDefaultDialogGeom()):
     DirectFrame.__init__(self, relief=None, geom=g, geom_color=color, geom_scale=(1, 1, 0.5), pos=(0, 0, 0))
     self.initialiseoptions(ToonHeadFrame)
     self.av = av
     self.avKeep = DelayDelete.DelayDelete(av, 'ToonHeadFrame.avKeep')
     self.head = self.stateNodePath[0].attachNewNode('head', 20)
     self.head.setPosHprScale(-0.27, 10.0, -0.09, 180.0, 0.0, 0.0, 0.2, 0.2, 0.2)
     self.headModel = ToonHead.ToonHead()
     self.headModel.startBlink()
     self.headModel.setupHead(self.av.style, forGui=1)
     self.headModel.reparentTo(self.head)
     self.tag1Node = NametagFloat2d()
     self.tag1Node.setContents(Nametag.CSpeech | Nametag.CThought)
     self.av.nametag.addNametag(self.tag1Node)
     self.tag1 = self.attachNewNode(self.tag1Node)
     self.tag1.setPosHprScale(-0.16, 0, -0.09, 0, 0, 0, 0.055, 0.055, 0.055)
     self.tag2Node = NametagFloat2d()
     self.tag2Node.setContents(Nametag.CName)
     self.av.nametag.addNametag(self.tag2Node)
     self.tag2 = self.attachNewNode(self.tag2Node)
     self.tag2.setPosHprScale(-0.27, 10.0, 0.16, 0, 0, 0, 0.05, 0.05, 0.05)
     self.extraData = DirectLabel(parent=self, relief=None, pos=(0.0, 0.0, 0.06), scale=1.0, text='', text0_fg=(0.3, 0.2, 1, 1), text_scale=(0.14, 0.06), text_pos=(0, -0.01))
     self.extraData.hide()
示例#28
0
    def enterReward(self):
        self.cleanupIntervals()
        self.clearChat()
        self.resistanceToon.clearChat()
        self.stash()
        self.stopAnimate()
        self.controlToons()
        panelName = self.uniqueName('reward')
        self.rewardPanel = RewardPanel.RewardPanel(panelName)
        victory, camVictory, skipper = MovieToonVictory.doToonVictory(1, self.involvedToons, self.toonRewardIds, self.toonRewardDicts, self.deathList, self.rewardPanel, allowGroupShot=0, uberList=self.uberList, noSkip=True)
        ival = Sequence(Parallel(victory, camVictory), Func(self.__doneReward))
        intervalName = 'RewardMovie'
        delayDeletes = []
        for toonId in self.involvedToons:
            toon = self.cr.doId2do.get(toonId)
            if toon:
                delayDeletes.append(DelayDelete.DelayDelete(toon, 'CashbotBoss.enterReward'))

        ival.delayDeletes = delayDeletes
        ival.start()
        self.storeInterval(ival, intervalName)
        if self.oldState != 'Victory':
            base.playMusic(self.battleThreeMusic, looping=1, volume=0.9)
示例#29
0
 def getIntroInterval(self):
     avatar = base.localAvatar
     trackName = '__introBarrelRoom-%d' % avatar.doId
     track = Parallel(name=trackName)
     track.append(self.__stomperIntervals())
     track.append(
         Sequence(
             Func(camera.reparentTo, render),
             Func(camera.setPosHpr, self.model, -20.0, -87.9, 12.0, -30, 0,
                  0), Func(base.transitions.irisIn, 0.5), Wait(1.0),
             LerpHprInterval(camera,
                             duration=2.0,
                             startHpr=Vec3(-30, 0, 0),
                             hpr=Vec3(0, 0, 0),
                             blendType='easeInOut'), Wait(2.5),
             LerpHprInterval(camera,
                             duration=3.0,
                             startHpr=Vec3(0, 0, 0),
                             hpr=Vec3(-45, 0, 0),
                             blendType='easeInOut'), Wait(2.5)))
     track.delayDelete = DelayDelete.DelayDelete(avatar,
                                                 'introBarrelRoomTrack')
     track.setDoneEvent(trackName)
     return (track, trackName)
示例#30
0
    def playReward(self, ts, name, callback, noSkip = False):
        self.rewardHasBeenReset = 0
        ptrack = Sequence()
        camtrack = Sequence()
        self.rewardPanel = RewardPanel.RewardPanel(name)
        self.rewardPanel.hide()
        victory, camVictory, skipper = MovieToonVictory.doToonVictory(self.battle.localToonActive(), self.battle.activeToons, self.toonRewardIds, self.toonRewardDicts, self.deathList, self.rewardPanel, 1, self.uberList, self.helpfulToonsList, noSkip=noSkip)
        if victory:
            skipper.setIvals((ptrack, camtrack), ptrack.getDuration())
            ptrack.append(victory)
            camtrack.append(camVictory)
        ptrack.append(Func(callback))
        self._deleteTrack()
        self.track = Sequence(ptrack, name='movie-reward-track-%d' % self.battle.doId)
        if self.battle.localToonActive():
            self.track = Parallel(self.track, camtrack, name='movie-reward-track-with-cam-%d' % self.battle.doId)
        self.track.delayDeletes = []
        for t in self.battle.activeToons:
            self.track.delayDeletes.append(DelayDelete.DelayDelete(t, 'Movie.playReward'))

        skipper.setIvals((self.track,), 0.0)
        skipper.setBattle(self.battle)
        self.track.start(ts)
        return None
 def fillSlot(self, index, avId):
     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
     elif avId not in self.cr.doId2do:
         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))
     else:
         if avId == base.localAvatar.getDoId():
             self.localToonOnBoard = 1
             elevator = self.getPlaceElevator()
             elevator.fsm.request('boarding', [self.getElevatorModel()])
             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)
         track.delayDelete = DelayDelete.DelayDelete(toon, 'fillSlot')
         self.storeToonTrack(avId, track)
         track.start()
         self.boardedAvIds[avId] = None
     return
 def exitDoorExitOpen(self):
     for track in self.avatarExitTracks:
         track.finish()
         DelayDelete.cleanupDelayDeletes(track)
     self.avatarExitTracks = []
 def _deleteTrack(self):
     if self.track:
         DelayDelete.cleanupDelayDeletes(self.track)
         self.track = None
     return
示例#34
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
示例#35
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. / 3.)))
         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. / 3.)))
         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))
     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)
    def cleanupIntervals(self):
        for interval in self.activeIntervals.values():
            interval.finish()
            DelayDelete.cleanupDelayDeletes(interval)

        self.activeIntervals = {}
 def clearToonTrack(self, avId):
     oldTrack = self.__toonTracks.get(avId)
     if oldTrack:
         oldTrack.pause()
         DelayDelete.cleanupDelayDeletes(oldTrack)
示例#38
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'))

        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(base.playMusic, self.intermissionMusic, 1, 0.9))
        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.935, -341.065, 0, -45, 0, 0)
        goon = self.fakeGoons[0]
        crane = self.cranes[0]
        track = Sequence(
            Func(self.__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(base.camera.reparentTo, self.geom),
            Func(base.camera.setPosHpr, 105, -326, 5, 136.3, 0, 0),
            Func(rToon.setChatAbsolute, TTL.ResistanceToonWatchThis, CFSpeech),
            Wait(2),
            Func(rToon.clearChat),
            Func(base.camera.setPosHpr, 105, -326, 20, -45.3, 11, 0),
            Func(self.setChatAbsolute, TTL.CashbotBossGetAwayFromThat, CFSpeech),
            Wait(2),
            Func(self.clearChat),
            base.camera.posHprInterval(1.5, Point3(105, -326, 5), Point3(136.3, 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(base.camera.setPosHpr, 102, -323.6, 0.9, -10.6, 14, 0),
            Func(goon.request, 'Recovery'),
            Wait(2),
            Func(base.camera.setPosHpr, 95.4, -332.6, 4.2, 167.1, -13.2, 0),
            Func(rToon.setChatAbsolute, TTL.ResistanceToonGetaway, CFSpeech),
            Func(rToon.animFSM.request, 'jump'),
            Wait(1.8),
            Func(rToon.clearChat),
            Func(base.camera.setPosHpr, 109.1, -300.7, 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.9, 0), VBase3(-14, 0, 0), startPos=Point3(110.8, -292.7, 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.__hideFakeGoons),
            Func(self.intermissionMusic.stop),
            Func(crane.request, 'Free'),
            Func(self.getGeomNode().setH, 0),
            self.moveToonsToBattleThreePos(self.involvedToons),
            Func(self.__showToons))
        return Sequence(Func(base.camera.reparentTo, self), Func(base.camera.setPosHpr, 0, -27, 25, 0, -18, 0), track)