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
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
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!')
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
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)
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!')
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()
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()
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
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
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)
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
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
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
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
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
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!')
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()
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)
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)
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
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
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)
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)