def exitBarrelRoomIntro(self): if self._wantBarrelRoom and not self.isBossFloor(self.currentFloor): self.ignore(self.barrelRoomIntroDoneEvent) if self.barrelRoomIntroTrack: self.barrelRoomIntroTrack.finish() DelayDelete.cleanupDelayDeletes(self.barrelRoomIntroTrack) self.barrelRoomIntroTrack = None
def clearToonTrack(self, avId): oldTrack = self.__toonTracks.get(avId) if oldTrack: oldTrack.pause() if self.__toonTracks.get(avId): DelayDelete.cleanupDelayDeletes(self.__toonTracks[avId]) del self.__toonTracks[avId]
def avatarExit(self, avatarId): if avatarId == self.avatarId: for track in self.avatarTracks: track.finish() DelayDelete.cleanupDelayDeletes(track) self.avatarTracks = []
def clearToonTrack(self, avId): oldTrack = self._DistributedClubElevator__toonTracks.get(avId) if oldTrack: oldTrack.pause() if self._DistributedClubElevator__toonTracks.get(avId): DelayDelete.cleanupDelayDeletes(self._DistributedClubElevator__toonTracks[avId]) del self._DistributedClubElevator__toonTracks[avId]
def stopTracks(self): for track in self.avatarTracks: track.pause() DelayDelete.cleanupDelayDeletes(track) self.cleanupTrack() self.avatarTracks = [] self.avatarId = 0
def exitPlaying(self): DistributedAnimatedProp.DistributedAnimatedProp.exitPlaying(self) for track in self.avatarTracks: track.finish() DelayDelete.cleanupDelayDeletes(track) self.avatarTracks = [] self.avatarId = 0
def exitReward(self): self.notify.debug('exitReward') if self.penthouseOutroTrack: self.penthouseOutroTrack.finish() DelayDelete.cleanupDelayDeletes(self.penthouseOutroTrack) self.penthouseOutroTrack = None if not self.penthouseOutroChatDoneTrack: self.notify.debug('exitReward: instanting outroPenthouseChatDone track') self.__outroPenthouseChatDone() self.penthouseOutroChatDoneTrack.finish() self.penthouseOutroChatDoneTrack = None
def finishAllTracks(self): self.finishDoorTrack() self.finishDoorExitTrack() for t in self.avatarTracks: t.finish() DelayDelete.cleanupDelayDeletes(t) self.avatarTracks = [] for t in self.avatarExitTracks: t.finish() DelayDelete.cleanupDelayDeletes(t) self.avatarExitTracks = []
def clearInterval(self, name, finish = 1): if name in self.activeIntervals: ival = self.activeIntervals[name] if finish: ival.finish() else: ival.pause() if name in self.activeIntervals: DelayDelete.cleanupDelayDeletes(ival) del self.activeIntervals[name] else: self.notify.debug('interval: %s already cleared' % name)
def _deleteTransitionTrack(self): if self.transitionTrack: DelayDelete.cleanupDelayDeletes(self.transitionTrack) self.transitionTrack = None
def fillSlot(self, index, avId): #print "fill Slot: %d for %d" % (index, avId) if avId == 0: # This means that the slot is now empty, and no action should # be taken. pass else: # If localToon is boarding, he needs to change state and board the trolley. if avId == base.localAvatar.getDoId(): # Ignore this message if it comes late (e.g., trolley is in the leaving state). if not (self.fsm.getCurrentState().getName() == 'waitEmpty' or self.fsm.getCurrentState().getName() == 'waitCountdown'): self.notify.warning( "Can't board the trolley while in the '%s' state." % (self.fsm.getCurrentState().getName())) self.loader.place.fsm.request('walk') return self.loader.place.trolley.fsm.request("boarding", [self.trolleyCar]) self.localToonOnBoard = 1 # Tell him he's on the trolley now. self.loader.place.trolley.fsm.request("boarded") if avId in self.cr.doId2do: # If the toon exists, look it up toon = self.cr.doId2do[avId] # Parent it to the trolley toon.stopSmooth() toon.wrtReparentTo(self.trolleyCar) toon.setAnimState("run", 1.0) toon.headsUp(-5, -4.5 + (index * 3), 1.4) sitStartDuration = toon.getDuration("sit-start") track = Sequence(LerpPosInterval( toon, TOON_BOARD_TIME * 0.75, Point3(-5, -4.5 + (index * 3), 1.4)), LerpHprInterval(toon, TOON_BOARD_TIME * 0.25, Point3(90, 0, 0)), Parallel( Sequence( Wait(sitStartDuration * 0.25), LerpPosInterval( toon, sitStartDuration * 0.25, Point3(-3.9, -4.5 + (index * 3), 3.0)), ), ActorInterval(toon, "sit-start"), ), Func(toon.setAnimState, "Sit", 1.0), Func(self.clearToonTrack, avId), name=toon.uniqueName("fillTrolley"), autoPause=1) track.delayDelete = DelayDelete.DelayDelete( toon, 'Trolley.fillSlot') self.storeToonTrack(avId, track) track.start() else: DistributedTrolley.notify.warning("toon: " + str(avId) + " doesn't exist, and" + " cannot board the trolley!")
def cleanupIntervals(self): for interval in self.activeIntervals.values(): interval.finish() DelayDelete.cleanupDelayDeletes(interval) self.activeIntervals = {}
def clearToonTrack(self, avId): oldTrack = self._DistributedPicnicBasket__toonTracks.get(avId) if oldTrack: oldTrack.pause() DelayDelete.cleanupDelayDeletes(oldTrack) del self._DistributedPicnicBasket__toonTracks[avId]
def __faceOff(self, ts, name, callback): if len(self.suits) == 0: self.notify.warning('__faceOff(): no suits.') return if len(self.toons) == 0: self.notify.warning('__faceOff(): no toons.') return suit = self.suits[0] point = self.suitPoints[0][0] suitPos = point[0] suitHpr = VBase3(point[1], 0.0, 0.0) toon = self.toons[0] point = self.toonPoints[0][0] toonPos = point[0] toonHpr = VBase3(point[1], 0.0, 0.0) p = toon.getPos(self) toon.setPos(self, p[0], p[1], 0.0) toon.setShadowHeight(0) suit.setState('Battle') suitTrack = Sequence() toonTrack = Sequence() suitTrack.append(Func(suit.loop, 'neutral')) suitTrack.append(Func(suit.headsUp, toon)) taunt = SuitBattleGlobals.getFaceoffTaunt(suit.getStyleName(), suit.doId) suitTrack.append(Func(suit.setChatAbsolute, taunt, CFSpeech | CFTimeout)) toonTrack.append(Func(toon.loop, 'neutral')) toonTrack.append(Func(toon.headsUp, suit)) suitHeight = suit.getHeight() suitOffsetPnt = Point3(0, 0, suitHeight) faceoffTime = self.calcFaceoffTime(self.getPos(), self.initialSuitPos) faceoffTime = max(faceoffTime, BATTLE_SMALL_VALUE) delay = FACEOFF_TAUNT_T if self.hasLocalToon(): MidTauntCamHeight = suitHeight * 0.66 MidTauntCamHeightLim = suitHeight - 1.8 if MidTauntCamHeight < MidTauntCamHeightLim: MidTauntCamHeight = MidTauntCamHeightLim TauntCamY = 16 TauntCamX = random.choice((-5, 5)) TauntCamHeight = random.choice((MidTauntCamHeight, 1, 11)) camTrack = Sequence() camTrack.append(Func(camera.wrtReparentTo, suit)) camTrack.append(Func(base.camLens.setMinFov, self.camFOFov / (4.0 / 3.0))) camTrack.append(Func(camera.setPos, TauntCamX, TauntCamY, TauntCamHeight)) camTrack.append(Func(camera.lookAt, suit, suitOffsetPnt)) camTrack.append(Wait(delay)) camTrack.append(Func(base.camLens.setMinFov, self.camFov / (4.0 / 3.0))) camTrack.append(Func(camera.wrtReparentTo, self)) camTrack.append(Func(camera.setPos, self.camFOPos)) camTrack.append(Func(camera.lookAt, suit.getPos(self))) camTrack.append(Wait(faceoffTime)) if self.interactiveProp: camTrack.append(Func(camera.lookAt, self.interactiveProp.node.getPos(self))) camTrack.append(Wait(FACEOFF_LOOK_AT_PROP_T)) suitTrack.append(Wait(delay)) toonTrack.append(Wait(delay)) suitTrack.append(Func(suit.headsUp, self, suitPos)) suitTrack.append(Func(suit.clearChat)) toonTrack.append(Func(toon.headsUp, self, toonPos)) suitTrack.append(Func(suit.loop, 'walk')) suitTrack.append(LerpPosInterval(suit, faceoffTime, suitPos, other=self)) suitTrack.append(Func(suit.loop, 'neutral')) suitTrack.append(Func(suit.setHpr, self, suitHpr)) toonTrack.append(Func(toon.loop, 'run')) toonTrack.append(LerpPosInterval(toon, faceoffTime, toonPos, other=self)) toonTrack.append(Func(toon.loop, 'neutral')) toonTrack.append(Func(toon.setHpr, self, toonHpr)) if base.localAvatar == toon: soundTrack = Sequence(Wait(delay), SoundInterval(base.localAvatar.soundRun, loop=1, duration=faceoffTime, node=base.localAvatar)) else: soundTrack = Wait(delay + faceoffTime) mtrack = Parallel(suitTrack, toonTrack, soundTrack) if self.hasLocalToon(): NametagGlobals.setMasterArrowsOn(0) mtrack = Parallel(mtrack, camTrack) done = Func(callback) track = Sequence(mtrack, done, name=name) track.delayDeletes = [DelayDelete.DelayDelete(toon, '__faceOff'), DelayDelete.DelayDelete(suit, '__faceOff')] track.start(ts) self.storeInterval(track, name)
def emptySlot(self, index, avId, bailFlag, timestamp, timeSent=0): """Remove someone as dictated by the AI.""" if self.fillSlotTrack: self.fillSlotTrack.finish() self.fillSlotTrack = None # If localToon is exiting, he needs to change state if avId == 0: # This means that no one is currently exiting, and no action # should be taken pass elif not self.isSetup: # We haven't set up the elevator yet. Remove the toon # from the deferredSlots list, if it is there. newSlots = [] for slot in self.deferredSlots: if slot[0] != index: newSlots.append(slot) self.deferredSlots = newSlots else: if avId in self.cr.doId2do: # See if we need to reset the clock # (countdown assumes we've created a clockNode already) if (bailFlag == 1 and hasattr(self, 'clockNode')): if (timestamp < self.countdownTime and timestamp >= 0): self.countdown(self.countdownTime - timestamp) else: self.countdown(self.countdownTime) # If the toon exists, look it up toon = self.cr.doId2do[avId] # avoid wrtReparent so that we don't muck with the toon's scale # Parent it to render #toon.wrtReparentTo(render) toon.stopSmooth() sitStartDuration = toon.getDuration("sit-start") jumpOutTrack = self.generateToonReverseJumpTrack(toon, index) # Place it on the appropriate spot relative to the # elevator track = Sequence( # TODO: Find the right coords for the elevator jumpOutTrack, # Tell the toon he is free to roam now Func(self.notifyToonOffElevator, toon), Func(self.clearToonTrack, avId), name = toon.uniqueName("emptyElevator"), autoPause = 1) if self.canHideBoardingQuitBtn(avId): # Enable the Boarding Group Panel Quit Button here if it is relevant. track.append(Func(localAvatar.boardingParty.groupPanel.enableQuitButton)) # Enable the Boarding Group GO Button here if it is relevant. track.append(Func(localAvatar.boardingParty.enableGoButton)) track.delayDelete = DelayDelete.DelayDelete(toon, 'CogKart.emptySlot') self.storeToonTrack(toon.doId, track) track.start() # Tell localToon he is exiting (if localToon is on board) if avId == base.localAvatar.getDoId(): messenger.send("exitElevator") # if the elevator is generated as a toon is leaving it, # we will not have gotten a corresponding 'fillSlot' message # for that toon, hence the toon will not be found in # boardedAvIds if avId in self.boardedAvIds: del self.boardedAvIds[avId] else: self.notify.warning("toon: " + str(avId) + " doesn't exist, and" + " cannot exit the elevator!")
def exitOpen(self): assert (self.debugPrint("exitOpen()")) for track in self.avatarTracks: track.finish() DelayDelete.cleanupDelayDeletes(track) self.avatarTracks = []
def knockKnockTrack(self, avatar, duration): if avatar == None: return None # NOTE: the use of this rimshot sfx (which is in phase_5) # means we better not have any knock knock doors in phase_4, # which is true now. self.rimshot = base.loadSfx("phase_5/audio/sfx/AA_heal_telljoke.mp3") self.knockSfx = base.loadSfx("phase_5/audio/sfx/GUI_knock_3.mp3") joke = KnockKnockJokes[self.propId%len(KnockKnockJokes)] # For a marketing contest we are putting user-submitted knock knock jokes on # the first side doors (on the left) of the three TTC streets. place = base.cr.playGame.getPlace() if place: zone = place.getZoneId() branch = ZoneUtil.getBranchZone(zone) if branch == ToontownGlobals.SillyStreet: if self.propId == 44: joke = KnockKnockContestJokes[ToontownGlobals.SillyStreet] elif branch == ToontownGlobals.LoopyLane: if self.propId in list(KnockKnockContestJokes[ToontownGlobals.LoopyLane].keys()): joke = KnockKnockContestJokes[ToontownGlobals.LoopyLane][self.propId] elif branch == ToontownGlobals.PunchlinePlace: if self.propId == 1: joke = KnockKnockContestJokes[ToontownGlobals.PunchlinePlace] elif branch == ToontownGlobals.PolarPlace: if self.propId in list(KnockKnockContestJokes[ToontownGlobals.PolarPlace].keys()): joke = KnockKnockContestJokes[ToontownGlobals.PolarPlace][self.propId] self.nametag = None self.nametagNP = None doorNP=render.find("**/KnockKnockDoorSphere_"+str(self.propId)+";+s") if doorNP.isEmpty(): self.notify.warning("Could not find KnockKnockDoorSphere_%s" % (self.propId)) return None self.nametag = NametagGroup() self.nametag.setAvatar(doorNP) self.nametag.setFont(ToontownGlobals.getToonFont()) # nametag.setName must come after setFont(). self.nametag.setName(TTLocalizer.DoorNametag) # Do not allow user to click on door nametag self.nametag.setActive(0) self.nametag.manage(base.marginManager) self.nametag.getNametag3d().setBillboardOffset(4) nametagNode = self.nametag.getNametag3d().upcastToPandaNode() self.nametagNP=render.attachNewNode(nametagNode) self.nametagNP.setName("knockKnockDoor_nt_"+str(self.propId)) pos=doorNP.node().getSolid(0).getCenter() self.nametagNP.setPos(pos+Vec3(0, 0, avatar.getHeight()+2)) d=duration*0.125 track=Sequence( Parallel( Sequence(Wait(d * 0.5), SoundInterval(self.knockSfx)), Func(self.nametag.setChat, TTLocalizer.DoorKnockKnock, CFSpeech), Wait(d) ), Func(avatar.setChatAbsolute, TTLocalizer.DoorWhosThere, CFSpeech | CFTimeout, openEnded = 0), Wait(d), Func(self.nametag.setChat, joke[0], CFSpeech), Wait(d), Func(avatar.setChatAbsolute, joke[0]+TTLocalizer.DoorWhoAppendix, CFSpeech | CFTimeout, openEnded = 0), Wait(d), Func(self.nametag.setChat, joke[1], CFSpeech), Parallel( SoundInterval(self.rimshot, startTime = 2.0), Wait(d*4), ), Func(self.cleanupTrack) ) track.delayDelete = DelayDelete.DelayDelete(avatar, 'knockKnockTrack') return track
def fillSlot(self, index, avId, wantBoardingShow=0): self.notify.debug('%s.fillSlot(%s, %s, ...)' % (self.doId, index, avId)) request = self.toonRequests.get(index) if request: self.cr.relatedObjectMgr.abortRequest(request) del self.toonRequests[index] if avId == 0: pass else: if not self.cr.doId2do.has_key(avId): func = PythonUtil.Functor(self.gotToon, index, avId) self.toonRequests[ index] = self.cr.relatedObjectMgr.requestObjects( [avId], allCallback=func) else: if not self.isSetup: self.deferredSlots.append((index, avId, wantBoardingShow)) else: if avId == base.localAvatar.getDoId(): place = base.cr.playGame.getPlace() if not place: return place.detectedElevatorCollision(self) elevator = self.getPlaceElevator() if elevator == None: if place.fsm.hasStateNamed('elevator'): place.fsm.request('elevator') else: if place.fsm.hasStateNamed('Elevator'): place.fsm.request('Elevator') elevator = self.getPlaceElevator() if not elevator: return self.localToonOnBoard = 1 if hasattr( localAvatar, 'boardingParty') and localAvatar.boardingParty: localAvatar.boardingParty.forceCleanupInviteePanel( ) localAvatar.boardingParty.forceCleanupInviterPanels( ) if hasattr(base.localAvatar, 'elevatorNotifier'): base.localAvatar.elevatorNotifier.cleanup() cameraTrack = Sequence() cameraTrack.append( Func(elevator.fsm.request, 'boarding', [self.getElevatorModel()])) cameraTrack.append( Func(elevator.fsm.request, 'boarded')) toon = self.cr.doId2do[avId] toon.stopSmooth() if not wantBoardingShow: toon.setZ(self.getElevatorModel(), self.elevatorPoints[index][2]) toon.setShadowHeight(0) if toon.isDisguised: animInFunc = Sequence(Func(toon.suit.loop, 'walk')) animFunc = Sequence( Func(toon.setAnimState, 'neutral', 1.0), Func(toon.suit.loop, 'neutral')) else: animInFunc = Sequence( Func(toon.setAnimState, 'run', 1.0)) animFunc = Func(toon.setAnimState, 'neutral', 1.0) toon.headsUp(self.getElevatorModel(), apply(Point3, self.elevatorPoints[index])) track = Sequence( animInFunc, LerpPosInterval(toon, TOON_BOARD_ELEVATOR_TIME * 0.75, apply(Point3, self.elevatorPoints[index]), other=self.getElevatorModel()), LerpHprInterval(toon, TOON_BOARD_ELEVATOR_TIME * 0.25, Point3(180, 0, 0), other=self.getElevatorModel()), Func(self.clearToonTrack, avId), animFunc, name=toon.uniqueName('fillElevator'), autoPause=1) if wantBoardingShow: boardingTrack, boardingTrackType = self.getBoardingTrack( toon, index, False) track = Sequence(boardingTrack, track) if avId == base.localAvatar.getDoId(): cameraWaitTime = 2.5 if boardingTrackType == BoardingGroupShow.TRACK_TYPE_RUN: cameraWaitTime = 0.5 else: if boardingTrackType == BoardingGroupShow.TRACK_TYPE_POOF: cameraWaitTime = 1 cameraTrack = Sequence(Wait(cameraWaitTime), cameraTrack) if self.canHideBoardingQuitBtn(avId): track = Sequence( Func(localAvatar.boardingParty.groupPanel. disableQuitButton), track) if avId == base.localAvatar.getDoId(): track = Parallel(cameraTrack, track) track.delayDelete = DelayDelete.DelayDelete( toon, 'Elevator.fillSlot') self.storeToonTrack(avId, track) track.start() self.fillSlotTrack = track self.boardedAvIds[avId] = None return
def emptySlot(self, index, avId, bailFlag, timestamp, timeSent=0): if self.fillSlotTrack: self.fillSlotTrack.finish() self.fillSlotTrack = None if avId == 0: pass else: if not self.isSetup: newSlots = [] for slot in self.deferredSlots: if slot[0] != index: newSlots.append(slot) self.deferredSlots = newSlots else: timeToSet = self.countdownTime if timeSent > 0: timeToSet = timeSent if self.cr.doId2do.has_key(avId): if bailFlag == 1 and hasattr(self, 'clockNode'): if timestamp < timeToSet and timestamp >= 0: self.countdown(timeToSet - timestamp) else: self.countdown(timeToSet) toon = self.cr.doId2do[avId] toon.stopSmooth() if toon.isDisguised: toon.suit.loop('walk') animFunc = Func(toon.suit.loop, 'neutral') else: toon.setAnimState('run', 1.0) animFunc = Func(toon.setAnimState, 'neutral', 1.0) track = Sequence(LerpPosInterval( toon, TOON_EXIT_ELEVATOR_TIME, Point3(*self.JumpOutOffsets[index]), other=self.getElevatorModel()), animFunc, Func(self.notifyToonOffElevator, toon), Func(self.clearToonTrack, avId), name=toon.uniqueName('emptyElevator'), autoPause=1) if self.canHideBoardingQuitBtn(avId): track.append( Func(localAvatar.boardingParty.groupPanel. enableQuitButton)) track.append( Func(localAvatar.boardingParty.enableGoButton)) track.delayDelete = DelayDelete.DelayDelete( toon, 'Elevator.emptySlot') self.storeToonTrack(avId, track) track.start() if avId == base.localAvatar.getDoId(): messenger.send('exitElevator') if avId in self.boardedAvIds: del self.boardedAvIds[avId] else: self.notify.warning('toon: ' + str(avId) + " doesn't exist, and" + ' cannot exit the elevator!') return
def __faceOff(self, ts, name, callback): if (len(self.suits) == 0): self.notify.warning('__faceOff(): no suits.') return if (len(self.toons) == 0): self.notify.warning('__faceOff(): no toons.') return # Pick only the first suit for the faceoff, if there happen to # be more than one. suit = self.suits[0] point = self.suitPoints[0][0] suitPos = point[0] suitHpr = VBase3(point[1], 0.0, 0.0) # And ditto for the first toon. toon = self.toons[0] point = self.toonPoints[0][0] toonPos = point[0] toonHpr = VBase3(point[1], 0.0, 0.0) p = toon.getPos(self) toon.setPos(self, p[0], p[1], 0.0) toon.setShadowHeight(0) suit.setState('Battle') suitTrack = Sequence() toonTrack = Sequence() # Make suit and toon face each other (and exchange taunts) suitTrack.append(Func(suit.loop, 'neutral')) suitTrack.append(Func(suit.headsUp, toon)) taunt = SuitBattleGlobals.getFaceoffTaunt(suit.getStyleName(), suit.doId) suitTrack.append( Func(suit.setChatAbsolute, taunt, CFSpeech | CFTimeout)) toonTrack.append(Func(toon.loop, 'neutral')) toonTrack.append(Func(toon.headsUp, suit)) suitHeight = suit.getHeight() suitOffsetPnt = Point3(0, 0, suitHeight) # Determine the battle positions based on initial angle # between the suit and the battle center (we want the suit to walk # as short a distance as possible) faceoffTime = self.calcFaceoffTime(self.getPos(), self.initialSuitPos) #assert(faceoffTime > BATTLE_SMALL_VALUE) # make sure the faceoff time is non-zero faceoffTime = max(faceoffTime, BATTLE_SMALL_VALUE) delay = FACEOFF_TAUNT_T if (self.hasLocalToon()): # empirical hack to pick a mid-height view, left in to sortof match the old view MidTauntCamHeight = suitHeight * 0.66 MidTauntCamHeightLim = suitHeight - 1.8 if (MidTauntCamHeight < MidTauntCamHeightLim): MidTauntCamHeight = MidTauntCamHeightLim TauntCamY = 16 TauntCamX = random.choice((-5, 5)) TauntCamHeight = random.choice((MidTauntCamHeight, 1, 11)) camTrack = Sequence() camTrack.append(Func(camera.wrtReparentTo, suit)) camTrack.append(Func(base.camLens.setFov, self.camFOFov)) camTrack.append( Func(camera.setPos, TauntCamX, TauntCamY, TauntCamHeight)) camTrack.append(Func(camera.lookAt, suit, suitOffsetPnt)) camTrack.append(Wait(delay)) camTrack.append(Func(base.camLens.setFov, self.camFov)) camTrack.append(Func(camera.wrtReparentTo, self)) camTrack.append(Func(camera.setPos, self.camFOPos)) camTrack.append(Func(camera.lookAt, suit.getPos(self))) camTrack.append(Wait(faceoffTime)) if self.interactiveProp: camTrack.append( Func(camera.lookAt, self.interactiveProp.node.getPos(self))) camTrack.append(Wait(FACEOFF_LOOK_AT_PROP_T)) suitTrack.append(Wait(delay)) toonTrack.append(Wait(delay)) # Make suit and toon face their destination spots in the battle suitTrack.append(Func(suit.headsUp, self, suitPos)) suitTrack.append(Func(suit.clearChat)) toonTrack.append(Func(toon.headsUp, self, toonPos)) # Make suit and toon walk to their battle spots suitTrack.append(Func(suit.loop, 'walk')) suitTrack.append( LerpPosInterval(suit, faceoffTime, suitPos, other=self)) suitTrack.append(Func(suit.loop, 'neutral')) suitTrack.append(Func(suit.setHpr, self, suitHpr)) toonTrack.append(Func(toon.loop, 'run')) toonTrack.append( LerpPosInterval(toon, faceoffTime, toonPos, other=self)) toonTrack.append(Func(toon.loop, 'neutral')) toonTrack.append(Func(toon.setHpr, self, toonHpr)) if base.localAvatar == toon: soundTrack = Sequence( Wait(delay), SoundInterval(base.localAvatar.soundRun, loop=1, duration=faceoffTime, node=base.localAvatar), ) else: soundTrack = Wait(delay + faceoffTime) mtrack = Parallel(suitTrack, toonTrack, soundTrack) if (self.hasLocalToon()): # No arrows - they just get in the way NametagGlobals.setMasterArrowsOn(0) mtrack = Parallel(mtrack, camTrack) done = Func(callback) track = Sequence(mtrack, done, name=name) track.delayDeletes = [ DelayDelete.DelayDelete(toon, '__faceOff'), DelayDelete.DelayDelete(suit, '__faceOff') ] track.start(ts) self.storeInterval(track, name)
def makePrepareBattleThreeMovie(self, delayDeletes, crane, safe): for toonId in self.involvedToons: toon = self.cr.doId2do.get(toonId) if toon: delayDeletes.append( DelayDelete.DelayDelete( toon, 'CashbotBoss.makePrepareBattleThreeMovie')) continue startPos = Point3(ToontownGlobals.CashbotBossBattleOnePosHpr[0], ToontownGlobals.CashbotBossBattleOnePosHpr[1], ToontownGlobals.CashbotBossBattleOnePosHpr[2]) battlePos = Point3(ToontownGlobals.CashbotBossBattleThreePosHpr[0], ToontownGlobals.CashbotBossBattleThreePosHpr[1], ToontownGlobals.CashbotBossBattleThreePosHpr[2]) startHpr = Point3(ToontownGlobals.CashbotBossBattleOnePosHpr[3], ToontownGlobals.CashbotBossBattleOnePosHpr[4], ToontownGlobals.CashbotBossBattleOnePosHpr[5]) battleHpr = VBase3(ToontownGlobals.CashbotBossBattleThreePosHpr[3], ToontownGlobals.CashbotBossBattleThreePosHpr[4], ToontownGlobals.CashbotBossBattleThreePosHpr[5]) finalHpr = VBase3(135, 0, 0) bossTrack = Sequence() bossTrack.append(Func(self.reparentTo, render)) bossTrack.append(Func(self.getGeomNode().setH, 180)) bossTrack.append(Func(self.pelvis.setHpr, self.pelvisForwardHpr)) bossTrack.append(Func(self.loop, 'Ff_neutral')) (track, hpr) = self.rollBossToPoint(startPos, startHpr, startPos, battleHpr, 0) bossTrack.append(track) (track, hpr) = self.rollBossToPoint(startPos, None, battlePos, None, 0) bossTrack.append(track) (track, hpr) = self.rollBossToPoint(battlePos, battleHpr, battlePos, finalHpr, 0) bossTrack.append(track) rToon = self.resistanceToon rToon.setPosHpr(93.935000000000002, -341.065, 0, -45, 0, 0) goon = self.fakeGoons[0] crane = self.cranes[0] track = Sequence( Func(self._DistributedCashbotBoss__hideToons), Func(crane.request, 'Movie'), Func(crane.accomodateToon, rToon), Func(goon.request, 'Stunned'), Func(goon.setPosHpr, 104, -316, 0, 165, 0, 0), Parallel(self.door2.posInterval(4.5, VBase3(0, 0, 30)), self.door3.posInterval(4.5, VBase3(0, 0, 30)), bossTrack), Func(rToon.loop, 'leverNeutral'), Func(camera.reparentTo, self.geom), Func(camera.setPosHpr, 105, -326, 5, 136.30000000000001, 0, 0), Func(rToon.setChatAbsolute, TTL.ResistanceToonWatchThis, CFSpeech), Wait(2), Func(rToon.clearChat), Func(camera.setPosHpr, 105, -326, 20, -45.299999999999997, 11, 0), Func(self.setChatAbsolute, TTL.CashbotBossGetAwayFromThat, CFSpeech), Wait(2), Func(self.clearChat), camera.posHprInterval(1.5, Point3(105, -326, 5), Point3(136.30000000000001, 0, 0), blendType='easeInOut'), Func(rToon.setChatAbsolute, TTL.ResistanceToonCraneInstructions1, CFSpeech), Wait(4), Func(rToon.setChatAbsolute, TTL.ResistanceToonCraneInstructions2, CFSpeech), Wait(4), Func(rToon.setChatAbsolute, TTL.ResistanceToonCraneInstructions3, CFSpeech), Wait(4), Func(rToon.setChatAbsolute, TTL.ResistanceToonCraneInstructions4, CFSpeech), Wait(4), Func(rToon.clearChat), Func(camera.setPosHpr, 102, -323.60000000000002, 0.90000000000000002, -10.6, 14, 0), Func(goon.request, 'Recovery'), Wait(2), Func(camera.setPosHpr, 95.400000000000006, -332.60000000000002, 4.2000000000000002, 167.09999999999999, -13.199999999999999, 0), Func(rToon.setChatAbsolute, TTL.ResistanceToonGetaway, CFSpeech), Func(rToon.animFSM.request, 'jump'), Wait(1.8), Func(rToon.clearChat), Func(camera.setPosHpr, 109.09999999999999, -300.69999999999999, 13.9, -15.6, -13.6, 0), Func(rToon.animFSM.request, 'run'), Func(goon.request, 'Walk'), Parallel( self.door3.posInterval(3, VBase3(0, 0, 0)), rToon.posHprInterval(3, Point3(136, -212.90000000000001, 0), VBase3(-14, 0, 0), startPos=Point3(110.8, -292.69999999999999, 0), startHpr=VBase3(-14, 0, 0)), goon.posHprInterval(3, Point3(125.2, -243.5, 0), VBase3(-14, 0, 0), startPos=Point3(104.8, -309.5, 0), startHpr=VBase3(-14, 0, 0))), Func(self._DistributedCashbotBoss__hideFakeGoons), Func(crane.request, 'Free'), Func(self.getGeomNode().setH, 0), self.moveToonsToBattleThreePos(self.involvedToons), Func(self._DistributedCashbotBoss__showToons)) return Sequence(Func(camera.reparentTo, self), Func(camera.setPosHpr, 0, -27, 25, 0, -18, 0), track)
def makeIntroductionMovie(self, delayDeletes): for toonId in self.involvedToons: toon = self.cr.doId2do.get(toonId) if toon: delayDeletes.append( DelayDelete.DelayDelete( toon, 'CashbotBoss.makeIntroductionMovie')) continue rtTrack = Sequence() startPos = Point3(ToontownGlobals.CashbotBossOffstagePosHpr[0], ToontownGlobals.CashbotBossOffstagePosHpr[1], ToontownGlobals.CashbotBossOffstagePosHpr[2]) battlePos = Point3(ToontownGlobals.CashbotBossBattleOnePosHpr[0], ToontownGlobals.CashbotBossBattleOnePosHpr[1], ToontownGlobals.CashbotBossBattleOnePosHpr[2]) battleHpr = VBase3(ToontownGlobals.CashbotBossBattleOnePosHpr[3], ToontownGlobals.CashbotBossBattleOnePosHpr[4], ToontownGlobals.CashbotBossBattleOnePosHpr[5]) bossTrack = Sequence() bossTrack.append(Func(self.reparentTo, render)) bossTrack.append(Func(self.getGeomNode().setH, 180)) bossTrack.append(Func(self.pelvis.setHpr, self.pelvisForwardHpr)) bossTrack.append(Func(self.loop, 'Ff_neutral')) (track, hpr) = self.rollBossToPoint(startPos, None, battlePos, None, 0) bossTrack.append(track) (track, hpr) = self.rollBossToPoint(battlePos, hpr, battlePos, battleHpr, 0) bossTrack.append(track) bossTrack.append(Func(self.getGeomNode().setH, 0)) bossTrack.append(Func(self.pelvis.setHpr, self.pelvisReversedHpr)) goonTrack = self._DistributedCashbotBoss__makeGoonMovieForIntro() attackToons = TTL.CashbotBossCogAttack rToon = self.resistanceToon rToon.setPosHpr(*ToontownGlobals.CashbotRTBattleOneStartPosHpr) track = Sequence( Func(camera.setPosHpr, 82, -219, 5, 267, 0, 0), Func(rToon.setChatAbsolute, TTL.ResistanceToonWelcome, CFSpeech), Wait(3), Sequence(goonTrack, duration=0), Parallel( camera.posHprInterval(4, Point3(108, -244, 4), VBase3(211.5, 0, 0)), Sequence( Func(rToon.suit.setPlayRate, 1.3999999999999999, 'walk'), Func(rToon.suit.loop, 'walk'), Parallel(rToon.hprInterval(1, VBase3(180, 0, 0)), rToon.posInterval(3, VBase3(120, -255, 0)), Sequence(Wait(2), Func(rToon.clearChat))), Func(rToon.suit.loop, 'neutral'), self.door2.posInterval(3, VBase3(0, 0, 30)))), Func(rToon.setHpr, 0, 0, 0), Func(rToon.setChatAbsolute, TTL.ResistanceToonTooLate, CFSpeech), Func(camera.reparentTo, render), Func(camera.setPosHpr, 61.100000000000001, -228.80000000000001, 10.199999999999999, -90, 0, 0), self.door1.posInterval(2, VBase3(0, 0, 30)), Parallel( bossTrack, Sequence(Wait(3), Func(rToon.clearChat), self.door1.posInterval(3, VBase3(0, 0, 0)))), Func(self.setChatAbsolute, TTL.CashbotBossDiscoverToons1, CFSpeech), camera.posHprInterval( 1.5, Point3(93.299999999999997, -230, 0.69999999999999996), VBase3(-92.900000000000006, 39.700000000000003, 8.3000000000000007)), Func(self.setChatAbsolute, TTL.CashbotBossDiscoverToons2, CFSpeech), Wait(4), Func(self.clearChat), self.loseCogSuits(self.toonsA + self.toonsB, render, (113, -228, 10, 90, 0, 0)), Wait(1), Func(rToon.setHpr, 0, 0, 0), self.loseCogSuits([rToon], render, (133, -243, 5, 143, 0, 0), True), Func(rToon.setChatAbsolute, TTL.ResistanceToonKeepHimBusy, CFSpeech), Wait(1), Func(self._DistributedCashbotBoss__showResistanceToon, False), Sequence( Func(rToon.animFSM.request, 'run'), rToon.hprInterval(1, VBase3(180, 0, 0)), Parallel( Sequence( rToon.posInterval(1.5, VBase3(109, -294, 0)), Parallel(Func(rToon.animFSM.request, 'jump')), rToon.posInterval( 1.5, VBase3(93.935000000000002, -341.065, 2))), self.door2.posInterval(3, VBase3(0, 0, 0))), Func(rToon.animFSM.request, 'neutral')), self.toonNormalEyes(self.involvedToons), self.toonNormalEyes([self.resistanceToon], True), Func(rToon.clearChat), Func(camera.setPosHpr, 93.299999999999997, -230, 0.69999999999999996, -92.900000000000006, 39.700000000000003, 8.3000000000000007), Func(self.setChatAbsolute, attackToons, CFSpeech), Wait(2), Func(self.clearChat)) return Sequence(Func(camera.reparentTo, render), track)
def getVictoryRunTrack(self): origPosTrack = Sequence() delayDeletes = [] i = 0 for victor in self.victorList: if victor != 0 and self.cr.doId2do.has_key(victor): toon = self.cr.doId2do[victor] delayDeletes.append( DelayDelete.DelayDelete(toon, 'getVictoryRunTrack')) toon.stopSmooth() toon.setParent(ToontownGlobals.SPHidden) origPosTrack.append( Func(toon.setPosHpr, self.elevatorNodePath, apply(Point3, ElevatorPoints[i]), Point3(180, 0, 0))) origPosTrack.append( Func(toon.setParent, ToontownGlobals.SPRender)) i += 1 openDoors = getOpenInterval(self, self.leftDoor, self.rightDoor, self.openSfx, None) toonDoorPosHpr = self.cr.playGame.dnaStore.getDoorPosHprFromBlockNumber( self.block) useFarExitPoints = toonDoorPosHpr.getPos().getZ() > 1.0 runOutAll = Parallel() i = 0 for victor in self.victorList: if victor != 0 and self.cr.doId2do.has_key(victor): toon = self.cr.doId2do[victor] p0 = Point3(0, 0, 0) p1 = Point3(ElevatorPoints[i][0], ElevatorPoints[i][1] - 5.0, ElevatorPoints[i][2]) if useFarExitPoints: p2 = Point3(ElevatorOutPointsFar[i][0], ElevatorOutPointsFar[i][1], ElevatorOutPointsFar[i][2]) else: p2 = Point3(ElevatorOutPoints[i][0], ElevatorOutPoints[i][1], ElevatorOutPoints[i][2]) runOutSingle = Sequence( Func(Emote.globalEmote.disableBody, toon, 'getVictory'), Func(toon.animFSM.request, 'run'), LerpPosInterval(toon, TOON_VICTORY_EXIT_TIME * 0.25, p1, other=self.elevatorNodePath), Func(toon.headsUp, self.elevatorNodePath, p2), LerpPosInterval(toon, TOON_VICTORY_EXIT_TIME * 0.5, p2, other=self.elevatorNodePath), LerpHprInterval(toon, TOON_VICTORY_EXIT_TIME * 0.25, Point3(0, 0, 0), other=self.elevatorNodePath), Func(toon.animFSM.request, 'neutral'), Func(toon.startSmooth), Func(Emote.globalEmote.releaseBody, toon, 'getVictory')) runOutAll.append(runOutSingle) i += 1 victoryRunTrack = Sequence(origPosTrack, openDoors, runOutAll) return (victoryRunTrack, delayDeletes)
def _deleteTransitionTrack(self): if self.transitionTrack: DelayDelete.cleanupDelayDeletes(self.transitionTrack) self.transitionTrack = None return
def fillSlot(self, index, avId): assert self.notify.debugStateCall(self) self.notify.debug("fill Slot: %d for %d" % (index, avId)) if avId == 0: # This means that the slot is now empty, and no action should # be taken. pass else: self.fullSeat[index] = self.seatState.Full # If localToon is boarding, he needs to change state if avId == base.localAvatar.getDoId(): # Start the countdown clock... self.clockNode.show() if index == 0 or index == 3: side = -1 else: side = 1 if hasattr(self.loader.place, "trolley"): self.loader.place.trolley.fsm.request( "boarding", [self.tablecloth, side]) else: self.notify.warning('fillSlot no trolley in place') self.localToonOnBoard = 1 # Put that toon on the table # If it's localToon, tell him he's on the trolley now if avId == base.localAvatar.getDoId(): if hasattr(self.loader.place, "trolley"): self.loader.place.trolley.fsm.request("boarded") # hide the exit button until basket interval is over self.loader.place.trolley.exitButton.hide() if avId in self.cr.doId2do: # If the toon exists, look it up toon = self.cr.doId2do[avId] # Parent it to the trolley toon.stopSmooth() toon.wrtReparentTo(self.tablecloth) sitStartDuration = toon.getDuration("sit-start") jumpTrack = self.generateToonJumpTrack(toon, index) track = Sequence(jumpTrack, Func(toon.setAnimState, "Sit", 1.0)) # only add basket appear if there is no toons are already sitting self.notify.debug("### fillSlot: fullSeat = %s" % self.fullSeat) if self.fullSeat.count(0) == 3: self.notify.debug("### fillSlot: adding basketAppear") #track.append(self.generateBasketAppearTrack()) if self.picnicBasketTrack: self.picnicBasketTrack.finish() waitDuration = track.getDuration() self.picnicBasketTrack = Sequence( Wait(waitDuration), self.generateBasketAppearTrack()) self.picnicBasketTrack.start() # make a random food appear track.append(self.generateFoodAppearTrack(index)) # finish the rest of the staging track.append( Sequence(Func(self.clearToonTrack, avId), name=toon.uniqueName("fillTrolley"), autoPause=1)) if avId == base.localAvatar.getDoId(): if hasattr(self.loader.place, "trolley"): track.append( Func(self.loader.place.trolley.exitButton.show)) track.delayDelete = DelayDelete.DelayDelete( toon, 'PicnicBasket.fillSlot') self.storeToonTrack(avId, track) track.start()
def setUpMovieAvatar(self, av): self.avDelayDelete = DelayDelete.DelayDelete(av, 'Pet.setUpMovieAvatar') av.headsUp(self, 0, 0, 0) av.stopLookAround()
def emptySlot(self, index, avId, timestamp): def emptySeat(index): # If localToon is exiting, he needs to change state self.notify.debug("### seat %s now empty" % index) self.fullSeat[index] = self.seatState.Empty if avId == 0: # This means that the slot is now empty, and no action should # be taken. pass elif avId == 1: # Special cardinal value for unexpected exit. # The toon is gone, but we may still need to clean up his food self.fullSeat[index] = self.seatState.Empty track = Sequence(self.generateFoodDisappearTrack(index)) # if no toons left, make the basket go away self.notify.debug("### empty slot - unexpetected: fullSeat = %s" % self.fullSeat) if self.fullSeat.count(0) == 4: self.notify.debug("### empty slot - unexpected: losing basket") if self.picnicBasketTrack: self.picnicBasketTrack.finish() #track.append(self.generateBasketDisappearTrack()) waitDuration = track.getDuration() self.picnicBasketTrack = Sequence( Wait(waitDuration), self.generateBasketDisappearTrack()) self.picnicBasketTrack.start() track.start() else: self.fullSeat[index] = self.seatState.Empty if avId in self.cr.doId2do: if avId == base.localAvatar.getDoId(): # Stop the countdown clock.. if (self.clockNode): self.clockNode.hide() # If the toon exists, look it up toon = self.cr.doId2do[avId] toon.stopSmooth() sitStartDuration = toon.getDuration("sit-start") jumpOutTrack = self.generateToonReverseJumpTrack(toon, index) track = Sequence(jumpOutTrack) # make the food go away track.append(self.generateFoodDisappearTrack(index)) # if no toons left, make the basket go away self.notify.debug("### empty slot: fullSeat = %s" % self.fullSeat) if self.fullSeat.count(0) == 4: self.notify.debug("### empty slot: losing basket") if self.picnicBasketTrack: self.picnicBasketTrack.finish() #track.append(self.generateBasketDisappearTrack()) waitDuration = track.getDuration() self.picnicBasketTrack = Sequence( Wait(waitDuration), self.generateBasketDisappearTrack()) self.picnicBasketTrack.start() # let the toon loose track.append( Sequence( # Tell the toon he is free to roam now Func(self.notifyToonOffTrolley, toon), Func(self.clearToonTrack, avId), Func(self.doneExit, avId), Func(emptySeat, index), name=toon.uniqueName("emptyTrolley"), autoPause=1)) track.delayDelete = DelayDelete.DelayDelete( toon, 'PicnicBasket.emptySlot') self.storeToonTrack(avId, track) track.start()
def fillSlot(self, index, avId, wantBoardingShow = 0): """Put someone in the kart, as dictated by the AI.""" self.notify.debug("%s.fillSlot(%s, %s, ... %s)" % (self.doId, index, avId, globalClock.getRealTime())) request = self.toonRequests.get(index) if request: self.cr.relatedObjectMgr.abortRequest(request) del self.toonRequests[index] if avId == 0: # This means that the slot is now empty, and no action should # be taken. pass elif avId not in self.cr.doId2do: # It's someone who hasn't been generated yet. func = PythonUtil.Functor( self.gotToon, index, avId) assert index not in self.toonRequests self.toonRequests[index] = self.cr.relatedObjectMgr.requestObjects( [avId], allCallback = func) elif not self.isSetup: # We haven't set up the elevator yet. self.deferredSlots.append((index, avId, wantBoardingShow)) else: # If localToon is boarding, he needs to change state if avId == base.localAvatar.getDoId(): place = base.cr.playGame.getPlace() if not place: return elevator = self.getPlaceElevator() if elevator == None: place.fsm.request('elevator') elevator = self.getPlaceElevator() if not elevator: return self.localToonOnBoard = 1 if hasattr(localAvatar, "boardingParty") and localAvatar.boardingParty: localAvatar.boardingParty.forceCleanupInviteePanel() localAvatar.boardingParty.forceCleanupInviterPanels() # Cleanup any leftover elevator messages before boarding the elevator. if hasattr(base.localAvatar, "elevatorNotifier"): base.localAvatar.elevatorNotifier.cleanup() cameraTrack = Sequence() # Move the camera towards and face the elevator. cameraTrack.append(Func(elevator.fsm.request, "boarding", [self.getElevatorModel()])) # Enable the Hop off button. cameraTrack.append(Func(elevator.fsm.request, "boarded")) toon = self.cr.doId2do[avId] # Parent it to the elevator toon.stopSmooth() toon.wrtReparentTo(self.golfKart) sitStartDuration = toon.getDuration("sit-start") jumpTrack = self.generateToonJumpTrack(toon, index) track = Sequence( jumpTrack, Func(toon.setAnimState, "Sit", 1.0), Func(self.clearToonTrack, avId), name = toon.uniqueName("fillElevator"), autoPause = 1) if wantBoardingShow: boardingTrack, boardingTrackType = self.getBoardingTrack(toon, index, True) track = Sequence(boardingTrack, track) if avId == base.localAvatar.getDoId(): cameraWaitTime = 2.5 if (boardingTrackType == BoardingGroupShow.TRACK_TYPE_RUN): cameraWaitTime = 0.5 cameraTrack = Sequence(Wait(cameraWaitTime), cameraTrack) if self.canHideBoardingQuitBtn(avId): track = Sequence(Func(localAvatar.boardingParty.groupPanel.disableQuitButton), track) # Start the camera track in parallel here if avId == base.localAvatar.getDoId(): track = Parallel(cameraTrack, track) track.delayDelete = DelayDelete.DelayDelete(toon, 'CogKart.fillSlot') self.storeToonTrack(avId, track) track.start() self.fillSlotTrack = track assert avId not in self.boardedAvIds self.boardedAvIds[avId] = None
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 clearToonTrack(self, avId): oldTrack = self.__toonTracks.get(avId) if oldTrack: oldTrack.pause() DelayDelete.cleanupDelayDeletes(oldTrack) del self.__toonTracks[avId]
def _deleteTrack(self): if self.track: DelayDelete.cleanupDelayDeletes(self.track) self.track = None
def fillSlot(self, index, avId, wantBoardingShow=0): self.notify.debug('%s.fillSlot(%s, %s, ... %s)' % (self.doId, index, avId, globalClock.getRealTime())) request = self.toonRequests.get(index) if request: self.cr.relatedObjectMgr.abortRequest(request) del self.toonRequests[index] if avId == 0: pass elif not self.cr.doId2do.has_key(avId): func = PythonUtil.Functor(self.gotToon, index, avId) self.toonRequests[index] = self.cr.relatedObjectMgr.requestObjects( [avId], allCallback=func) elif not self.isSetup: self.deferredSlots.append((index, avId, wantBoardingShow)) else: if avId == base.localAvatar.getDoId(): place = base.cr.playGame.getPlace() if not place: return elevator = self.getPlaceElevator() if elevator == None: place.fsm.request('elevator') elevator = self.getPlaceElevator() if not elevator: return self.localToonOnBoard = 1 if hasattr(localAvatar, 'boardingParty') and localAvatar.boardingParty: localAvatar.boardingParty.forceCleanupInviteePanel() localAvatar.boardingParty.forceCleanupInviterPanels() if hasattr(base.localAvatar, 'elevatorNotifier'): base.localAvatar.elevatorNotifier.cleanup() cameraTrack = Sequence() cameraTrack.append( Func(elevator.fsm.request, 'boarding', [self.getElevatorModel()])) cameraTrack.append(Func(elevator.fsm.request, 'boarded')) toon = self.cr.doId2do[avId] toon.stopSmooth() toon.wrtReparentTo(self.golfKart) sitStartDuration = toon.getDuration('sit-start') jumpTrack = self.generateToonJumpTrack(toon, index) track = Sequence(jumpTrack, Func(toon.setAnimState, 'Sit', 1.0), Func(self.clearToonTrack, avId), name=toon.uniqueName('fillElevator'), autoPause=1) if wantBoardingShow: boardingTrack, boardingTrackType = self.getBoardingTrack( toon, index, True) track = Sequence(boardingTrack, track) if avId == base.localAvatar.getDoId(): cameraWaitTime = 2.5 if boardingTrackType == BoardingGroupShow.TRACK_TYPE_RUN: cameraWaitTime = 0.5 cameraTrack = Sequence(Wait(cameraWaitTime), cameraTrack) if self.canHideBoardingQuitBtn(avId): track = Sequence( Func(localAvatar.boardingParty.groupPanel.disableQuitButton ), track) if avId == base.localAvatar.getDoId(): track = Parallel(cameraTrack, track) track.delayDelete = DelayDelete.DelayDelete( toon, 'CogKart.fillSlot') self.storeToonTrack(avId, track) track.start() self.fillSlotTrack = track self.boardedAvIds[avId] = None return
def emptySlot(self, index, avId, timestamp): #print "Emptying slot: %d for %d" % (index, avId) # If localToon is exiting, he needs to change state if avId == 0: # This means that no one is currently exiting, and no action # should be taken pass else: self.avIds[index] = 0 if avId in self.cr.doId2do: # If the toon exists, look it up toon = self.cr.doId2do[avId] # Parent it to render #toon.setHpr(self.golfKart, 90,0,0) #toon.wrtReparentTo(render) toon.stopSmooth() # toon.setAnimState("run", 1.0) # Place it on the appropriate spot relative to the # trolley station sitStartDuration = toon.getDuration("sit-start") jumpOutTrack = self.generateToonReverseJumpTrack(toon, index) track = Sequence( # Hop off the seat #Parallel(ActorInterval(toon, "sit-start", # startTime=sitStartDuration, # endTime=0.0), # Sequence(Wait(sitStartDuration*0.5), # LerpPosInterval(toon, sitStartDuration*0.25, # Point3( -4.5 + (index * 3), 5, 1.4), # other=self.golfKart), # ), # ), # Then run ## Func(toon.setAnimState, "run", 1.0), ## LerpPosInterval(toon, TOON_EXIT_TIME, ## Point3(21 - (index * 3), ## -5, ## 0.02), ## #Point3(165, 0, 0), ## other=self.golfKart ## ), jumpOutTrack, # Tell the toon he is free to roam now Func(self.notifyToonOffTrolley, toon), Func(self.clearToonTrack, avId), name = toon.uniqueName("emptyTrolley"), autoPause = 1) track.delayDelete = DelayDelete.DelayDelete(toon, 'GolfKart.emptySlot') self.storeToonTrack(avId, track) track.start() # Tell localToon he is exiting (if localToon is on board) if avId == base.localAvatar.getDoId(): self.loader.place.trolley.fsm.request("exiting") else: self.notify.warning("toon: " + str(avId) + " doesn't exist, and" + " cannot exit the trolley!")
def clearToonTrack(self, avId): oldTrack = self._OZSafeZoneLoader__toonTracks.get(avId) if oldTrack: oldTrack.pause() DelayDelete.cleanupDelayDeletes(oldTrack) del self._OZSafeZoneLoader__toonTracks[avId]
def enterExplode(self, time): # Are we exploding? self.exploding = True # Lets create a specific actor for the explosion and load the explosion stuff. loseActor = self.getLoseActor() loseActor.reparentTo(render) spinningSound = base.loadSfx('phase_3.5/audio/sfx/Cog_Death.ogg') deathSound = base.loadSfx('phase_3.5/audio/sfx/ENC_cogfall_apart.ogg') # We're done with this guy. self.stash() # Oh boy, time to load all of our explosion effects! explosionInterval = ActorInterval(loseActor, 'lose', startFrame=0, endFrame=150) deathSoundTrack = Sequence( Wait(0.6), SoundInterval(spinningSound, duration=1.2, startTime=1.5, volume=0.2, node=loseActor), SoundInterval(spinningSound, duration=3.0, startTime=0.6, volume=0.8, node=loseActor), SoundInterval(deathSound, volume=0.32, node=loseActor)) # Load the particles for the explosion. BattleParticles.loadParticles() smallGears = BattleParticles.createParticleEffect( file='gearExplosionSmall') singleGear = BattleParticles.createParticleEffect('GearExplosion', numParticles=1) smallGearExplosion = BattleParticles.createParticleEffect( 'GearExplosion', numParticles=10) bigGearExplosion = BattleParticles.createParticleEffect( 'BigGearExplosion', numParticles=30) gearPoint = Point3(loseActor.getX(), loseActor.getY(), loseActor.getZ()) smallGears.setDepthWrite(False) singleGear.setDepthWrite(False) smallGearExplosion.setDepthWrite(False) bigGearExplosion.setDepthWrite(False) # Create the explosion track. explosionTrack = Sequence() explosionTrack.append(Wait(5.4)) explosionTrack.append(self.createKapowExplosionTrack(loseActor)) gears1Track = Sequence(Wait(2.0), ParticleInterval(smallGears, loseActor, worldRelative=0, duration=4.3, cleanup=True), name='gears1Track') gears2MTrack = Track((0.0, explosionTrack), (0.7, ParticleInterval(singleGear, loseActor, worldRelative=0, duration=5.7, cleanup=True)), (5.2, ParticleInterval(smallGearExplosion, loseActor, worldRelative=0, duration=1.2, cleanup=True)), (5.4, ParticleInterval(bigGearExplosion, loseActor, worldRelative=0, duration=1.0, cleanup=True)), name='gears2MTrack') # Cleanup cleanupTrack = Track((6.5, Func(self.cleanupLoseActor) )) # Better delete the poor guy when we're done # Blow the sucker up. self.explodeTrack = Sequence( Parallel(explosionInterval, deathSoundTrack, gears1Track, gears2MTrack)) self.explodeTrack.delayDelete = DelayDelete(self, 'cleanupExplode') self.explodeTrack.append(Func(self.explodeTrack.delayDelete.destroy)) self.explodeTrack.start() self.explodeTrack.setT(time)
def setGeyserAnim(self, task=None): if self.done: return maxSize = 0.4 * random.random() + 0.75 time = 1.0 self.geyserTrack = Sequence() upPos = Vec3(self.geyserPos[0], self.geyserPos[1], self.geyserPos[2]) downPos = Vec3(self.geyserPos[0], self.geyserPos[1], self.geyserPos[2] - 8.0) avList = copy.copy(Avatar.Avatar.ActiveAvatars) avList.append(base.localAvatar) playSound = 0 for av in avList: distance = self.geyserPlacer.getDistance(av) if distance < 7.0: place = base.cr.playGame.getPlace() local = 0 avPos = av.getPos() upToon = Vec3(avPos[0], avPos[1], maxSize * self.geyserPos[2] + 40.0) midToon = Vec3(avPos[0], avPos[1], maxSize * self.geyserPos[2] + 30.0) downToon = Vec3(avPos[0], avPos[1], self.geyserPos[2]) returnPoints = [(7, 7), (8, 0), (-8, 3), (-7, 7), (3, -7), (0, 8), (-10, 0), (8, -3), (5, 8), (-8, 5), (-1, 7)] pick = int((float(av.doId) - 11.0) / 13.0 % len(returnPoints)) returnChoice = returnPoints[pick] toonReturn = Vec3(self.geyserPos[0] + returnChoice[0], self.geyserPos[1] + returnChoice[1], self.geyserPos[2] - 1.5) topTrack = Sequence() av.dropShadow.hide() playSound = 1 if av == base.localAvatar: base.cr.playGame.getPlace().setState('fishing') base.localAvatar.setTeleportAvailable(0) base.localAvatar.collisionsOff() local = 1 else: topTrack.delayDeletes = [ DelayDelete.DelayDelete( av, 'OZSafeZoneLoader.setGeyserAnim') ] av.stopSmooth() animTrack = Parallel() toonTrack = Sequence() toonTrack.append(Wait(0.5)) animTrack.append( ActorInterval(av, 'jump-idle', loop=1, endTime=11.5 * time)) animTrack.append( ActorInterval(av, 'neutral', loop=0, endTime=0.25 * time)) holder = render.attachNewNode('toon hold') base.holder = holder toonPos = av.getPos(render) toonHpr = av.getHpr(render) print('av Pos %s' % av.getPos()) base.toonPos = toonPos holder.setPos(toonPos) av.reparentTo(holder) av.setPos(0, 0, 0) lookAt = 180 toonH = (lookAt + toonHpr[0]) % 360 newHpr = Vec3(toonH, toonHpr[1], toonHpr[2]) if toonH < 180: lookIn = Vec3(0 + lookAt, -30, 0) else: lookIn = Vec3(360 + lookAt, -30, 0) print('Camera Hprs toon %s; lookIn %s; final %s' % (newHpr, lookIn, lookIn - newHpr)) if local == 1: camPosOriginal = camera.getPos() camHprOriginal = camera.getHpr() camParentOriginal = camera.getParent() cameraPivot = holder.attachNewNode('camera pivot') chooseHeading = random.choice([-10.0, 15.0, 40.0]) cameraPivot.setHpr(chooseHeading, -20.0, 0.0) cameraArm = cameraPivot.attachNewNode('camera arm') cameraArm.setPos(0.0, -23.0, 3.0) camPosStart = Point3(0.0, 0.0, 0.0) camHprStart = Vec3(0.0, 0.0, 0.0) self.changeCamera(cameraArm, camPosStart, camHprStart) cameraTrack = Sequence() cameraTrack.append(Wait(11.0 * time)) cameraTrack.append( Func(self.changeCamera, camParentOriginal, camPosOriginal, camHprOriginal)) cameraTrack.start() moveTrack = Sequence() moveTrack.append(Wait(0.5)) moveTrack.append( LerpPosInterval(holder, 3.0 * time, pos=upToon, startPos=downToon, blendType='easeOut')) moveTrack.append( LerpPosInterval(holder, 2.0 * time, pos=midToon, startPos=upToon, blendType='easeInOut')) moveTrack.append( LerpPosInterval(holder, 1.0 * time, pos=upToon, startPos=midToon, blendType='easeInOut')) moveTrack.append( LerpPosInterval(holder, 2.0 * time, pos=midToon, startPos=upToon, blendType='easeInOut')) moveTrack.append( LerpPosInterval(holder, 1.0 * time, pos=upToon, startPos=midToon, blendType='easeInOut')) moveTrack.append( LerpPosInterval(holder, 2.5 * time, pos=toonReturn, startPos=upToon, blendType='easeIn')) animTrack.append(moveTrack) animTrack.append(toonTrack) topTrack.append(animTrack) topTrack.append(Func(av.setPos, toonReturn)) topTrack.append(Func(av.reparentTo, render)) topTrack.append(Func(holder.remove)) if local == 1: topTrack.append(Func(self.restoreLocal)) else: topTrack.append(Func(self.restoreRemote, av)) topTrack.append(Func(self.clearToonTrack, av.doId)) self.storeToonTrack(av.doId, topTrack) topTrack.start() self.geyserTrack.append(Func(self.doPrint, 'geyser start')) self.geyserTrack.append( Func(self.geyserNodePath.setPos, self.geyserPos[0], self.geyserPos[1], self.geyserPos[2])) self.geyserTrack.append( Parallel( LerpScaleInterval(self.geyserActor, 2.0 * time, 0.75, 0.01), LerpPosInterval(self.geyserActor, 2.0 * time, pos=downPos, startPos=downPos))) self.geyserTrack.append( Parallel( LerpScaleInterval(self.geyserActor, time, maxSize, 0.75), LerpPosInterval(self.geyserActor, time, pos=upPos, startPos=downPos))) self.geyserTrack.append( Parallel( LerpScaleInterval(self.geyserActor, 2.0 * time, 0.75, maxSize), LerpPosInterval(self.geyserActor, 2.0 * time, pos=downPos, startPos=upPos))) self.geyserTrack.append( Parallel( LerpScaleInterval(self.geyserActor, time, maxSize, 0.75), LerpPosInterval(self.geyserActor, time, pos=upPos, startPos=downPos))) self.geyserTrack.append( Parallel( LerpScaleInterval(self.geyserActor, 2.0 * time, 0.75, maxSize), LerpPosInterval(self.geyserActor, 2.0 * time, pos=downPos, startPos=upPos))) self.geyserTrack.append( Parallel( LerpScaleInterval(self.geyserActor, time, maxSize, 0.75), LerpPosInterval(self.geyserActor, time, pos=upPos, startPos=downPos))) self.geyserTrack.append( Parallel( LerpScaleInterval(self.geyserActor, 4.0 * time, 0.01, maxSize), LerpPosInterval(self.geyserActor, 4.0 * time, pos=downPos, startPos=upPos))) self.geyserTrack.append( Func(self.geyserNodePath.setPos, self.geyserPos[0], self.geyserPos[1], self.geyserPos[2] - 100.0)) self.geyserTrack.append(Func(self.doPrint, 'geyser end')) self.geyserTrack.start() if playSound: self.geyserSoundInterval.start() else: self.geyserSoundNoToonInterval.start()
def clearToonTrack(self, avId): oldTrack = self.__toonTracks.get(avId) if oldTrack: oldTrack.pause() DelayDelete.cleanupDelayDeletes(oldTrack)
def knockKnockTrack(self, avatar, duration): if avatar == None: return self.rimshot = base.loadSfx('phase_5/audio/sfx/AA_heal_telljoke.mp3') self.knockSfx = base.loadSfx('phase_5/audio/sfx/GUI_knock_3.mp3') joke = KnockKnockJokes[self.propId % len(KnockKnockJokes)] place = base.cr.playGame.getPlace() if place: zone = place.getZoneId() branch = ZoneUtil.getBranchZone(zone) if branch == ToontownGlobals.SillyStreet: if self.propId == 44: joke = KnockKnockContestJokes[ToontownGlobals.SillyStreet] elif branch == ToontownGlobals.LoopyLane: if self.propId in KnockKnockContestJokes[ ToontownGlobals.LoopyLane].keys(): joke = KnockKnockContestJokes[ToontownGlobals.LoopyLane][ self.propId] elif branch == ToontownGlobals.PunchlinePlace: if self.propId == 1: joke = KnockKnockContestJokes[ ToontownGlobals.PunchlinePlace] elif branch == ToontownGlobals.PolarPlace: if self.propId in KnockKnockContestJokes[ ToontownGlobals.PolarPlace].keys(): joke = KnockKnockContestJokes[ToontownGlobals.PolarPlace][ self.propId] self.nametag = None self.nametagNP = None doorNP = render.find('**/KnockKnockDoorSphere_' + str(self.propId) + ';+s') if doorNP.isEmpty(): self.notify.warning('Could not find KnockKnockDoorSphere_%s' % self.propId) return self.nametag = NametagGroup() self.nametag.setAvatar(doorNP) self.nametag.setFont(ToontownGlobals.getToonFont()) self.nametag.setName(TTLocalizer.DoorNametag) self.nametag.setActive(0) self.nametag.manage(base.marginManager) self.nametag.getNametag3d().setBillboardOffset(4) nametagNode = self.nametag.getNametag3d().upcastToPandaNode() self.nametagNP = render.attachNewNode(nametagNode) self.nametagNP.setName('knockKnockDoor_nt_' + str(self.propId)) pos = doorNP.node().getSolid(0).getCenter() self.nametagNP.setPos(pos + Vec3(0, 0, avatar.getHeight() + 2)) d = duration * 0.125 track = Sequence( Parallel( Sequence(Wait(d * 0.5), SoundInterval(self.knockSfx)), Func(self.nametag.setChat, TTLocalizer.DoorKnockKnock, CFSpeech), Wait(d)), Func(avatar.setChatAbsolute, TTLocalizer.DoorWhosThere, CFSpeech | CFTimeout, openEnded=0), Wait(d), Func(self.nametag.setChat, joke[0], CFSpeech), Wait(d), Func(avatar.setChatAbsolute, joke[0] + TTLocalizer.DoorWhoAppendix, CFSpeech | CFTimeout, openEnded=0), Wait(d), Func(self.nametag.setChat, joke[1], CFSpeech), Parallel(SoundInterval(self.rimshot, startTime=2.0), Wait(d * 4)), Func(self.cleanupTrack)) track.delayDelete = DelayDelete.DelayDelete(avatar, 'knockKnockTrack') return track
def emptySlot(self, index, avId, timestamp): def emptySeat(index): self.notify.debug('### seat %s now empty' % index) self.fullSeat[index] = self.seatState.Empty if avId == 0: pass 1 if avId == 1: self.fullSeat[index] = self.seatState.Empty track = Sequence(self.generateFoodDisappearTrack(index)) self.notify.debug('### empty slot - unexpetected: fullSeat = %s' % self.fullSeat) if self.fullSeat.count(0) == 4: self.notify.debug('### empty slot - unexpected: losing basket') if self.picnicBasketTrack: self.picnicBasketTrack.finish() waitDuration = track.getDuration() self.picnicBasketTrack = Sequence( Wait(waitDuration), self.generateBasketDisappearTrack()) self.picnicBasketTrack.start() track.start() else: self.fullSeat[index] = self.seatState.Empty if self.cr.doId2do.has_key(avId): if avId == base.localAvatar.getDoId(): if self.clockNode: self.clockNode.hide() toon = self.cr.doId2do[avId] toon.stopSmooth() sitStartDuration = toon.getDuration('sit-start') jumpOutTrack = self.generateToonReverseJumpTrack(toon, index) track = Sequence(jumpOutTrack) track.append(self.generateFoodDisappearTrack(index)) self.notify.debug('### empty slot: fullSeat = %s' % self.fullSeat) if self.fullSeat.count(0) == 4: self.notify.debug('### empty slot: losing basket') if self.picnicBasketTrack: self.picnicBasketTrack.finish() waitDuration = track.getDuration() self.picnicBasketTrack = Sequence( Wait(waitDuration), self.generateBasketDisappearTrack()) self.picnicBasketTrack.start() track.append( Sequence(Func(self.notifyToonOffTrolley, toon), Func(self.clearToonTrack, avId), Func(self.doneExit, avId), Func(emptySeat, index), name=toon.uniqueName('emptyTrolley'), autoPause=1)) track.delayDelete = DelayDelete.DelayDelete( toon, 'PicnicBasket.emptySlot') self.storeToonTrack(avId, track) track.start()
def exitDoorExitOpen(self): for track in self.avatarExitTracks: track.finish() DelayDelete.cleanupDelayDeletes(track) self.avatarExitTracks = []
def getVictoryRunTrack(self): origPosTrack = Sequence() delayDeletes = [] i = 0 for victor in self.victorList: if victor != 0 and self.cr.doId2do.has_key(victor): toon = self.cr.doId2do[victor] delayDeletes.append( DelayDelete.DelayDelete(toon, 'getVictoryRunTrack')) toon.stopSmooth() toon.setParent(ToontownGlobals.SPHidden) origPosTrack.append( Func(toon.setPosHpr, self.elevatorNodePath, apply(Point3, ElevatorPoints[i]), Point3(180, 0, 0))) origPosTrack.append( Func(toon.setParent, ToontownGlobals.SPRender)) i += 1 openDoors = getOpenInterval(self, self.leftDoor, self.rightDoor, self.openSfx, None) buildingNodes = self.getNodePaths() for np in buildingNodes: if np.getName().startswith('tb'): doorNodePath = np.find('**/*door_origin') if not doorNodePath.isEmpty(): break else: self.notify.error('Could not find door origin!') toonDoorPos = doorNodePath.getPos(NodePath()) useFarExitPoints = toonDoorPos.getZ() > 1.0 runOutAll = Parallel() i = 0 for victor in self.victorList: if victor != 0 and self.cr.doId2do.has_key(victor): toon = self.cr.doId2do[victor] p0 = Point3(0, 0, 0) p1 = Point3(ElevatorPoints[i][0], ElevatorPoints[i][1] - 5.0, ElevatorPoints[i][2]) if useFarExitPoints: p2 = Point3(ElevatorOutPointsFar[i][0], ElevatorOutPointsFar[i][1], ElevatorOutPointsFar[i][2]) else: p2 = Point3(ElevatorOutPoints[i][0], ElevatorOutPoints[i][1], ElevatorOutPoints[i][2]) runOutSingle = Sequence( Func(Emote.globalEmote.disableBody, toon, 'getVictory'), Func(toon.animFSM.request, 'run'), LerpPosInterval(toon, TOON_VICTORY_EXIT_TIME * 0.25, p1, other=self.elevatorNodePath), Func(toon.headsUp, self.elevatorNodePath, p2), LerpPosInterval(toon, TOON_VICTORY_EXIT_TIME * 0.5, p2, other=self.elevatorNodePath), LerpHprInterval(toon, TOON_VICTORY_EXIT_TIME * 0.25, Point3(0, 0, 0), other=self.elevatorNodePath), Func(toon.animFSM.request, 'neutral'), Func(toon.startSmooth), Func(Emote.globalEmote.releaseBody, toon, 'getVictory')) runOutAll.append(runOutSingle) i += 1 victoryRunTrack = Sequence(origPosTrack, openDoors, runOutAll) return (victoryRunTrack, delayDeletes)
def _deleteTrack(self): if self.track: DelayDelete.cleanupDelayDeletes(self.track) self.track = None return
def enterReward(self): assert self.notify.debugStateCall(self) numToons = 0 toonLayouts = ( (2, ), (1, 3), (0, 2, 4), (0, 1, 3, 4), ) toonPositions = (5.0, 1.75, -0.25, -1.75, -5.0) self.toons = [] self.toonsKeep = [] self.counters = [] self.totalCounters = [] # put the camera in a reasonable position camera.reparentTo(render) base.camLens.setMinFov(ToontownGlobals.DefaultCameraFov) camera.setPos(0, 16.0, 2.0) camera.lookAt(0, 0, 0.75) base.transitions.irisIn(0.4) # show background elements self.title.reparentTo(aspect2d) self.foreground.reparentTo(render) self.backgroundL.reparentTo(render) self.backgroundR.reparentTo(render) self.sidewalk.reparentTo(render) self.door.reparentTo(render) # The backdrop in this scene is not really under our feet - it is a # bit of an optical illusion. So to make the physics behave a bit # better, we'll actually put a floor directly under the toons so # they stay put and their shadows stay put size = 20 z = -2.5 floor = CollisionPolygon(Point3(-size, -size, z), Point3(size, -size, z), Point3(size, size, z), Point3(-size, size, z)) floor.setTangible(1) floorNode = CollisionNode("collision_floor") floorNode.addSolid(floor) self.collisionFloor = render.attachNewNode(floorNode) # the bean counters take up a lot of real estate: clamp the whisper bubbles NametagGlobals.setOnscreenChatForced(1) # find out how many toons there are, make point counters for # them and get their models for index in range(len(self.ids)): avId = self.ids[index] if ((self.states[index] != PURCHASE_NO_CLIENT_STATE) and (self.states[index] != PURCHASE_DISCONNECTED_STATE) and (avId in base.cr.doId2do)): numToons += 1 toon = base.cr.doId2do[avId] toon.stopSmooth() self.toons.append(toon) self.toonsKeep.append( DelayDelete.DelayDelete(toon, 'Purchase.enterReward')) # counter for beans won counter = DirectLabel( parent=hidden, relief=None, pos=(0.0, 0.0, 0.0), text=str(0), text_scale=0.2, text_fg=(0.95, 0.95, 0, 1), text_pos=(0, -0.1, 0), text_font=ToontownGlobals.getSignFont(), ) counter['image'] = DGG.getDefaultDialogGeom() counter['image_scale'] = (0.33, 1, 0.33) counter.setScale(0.5) counter.count = 0 counter.max = self.pointsArray[index] self.counters.append(counter) # counter for total beans carried money = self.playerMoney[index] totalCounter = DirectLabel( parent=hidden, relief=None, pos=(0.0, 0.0, 0.0), text=str(money), text_scale=0.2, text_fg=(0.95, 0.95, 0, 1), text_pos=(0, -0.1, 0), text_font=ToontownGlobals.getSignFont(), image=self.jarImage, ) totalCounter.setScale(0.5) totalCounter.count = money totalCounter.max = toon.getMaxMoney() self.totalCounters.append(totalCounter) # add a hook when user unexpectedly closes toontown window self.accept('clientCleanup', self._handleClientCleanup) # display the toons and jars pos = 0 toonLayout = toonLayouts[numToons - 1] for toon in self.toons: thisPos = toonPositions[toonLayout[pos]] toon.setPos(Vec3(thisPos, 1.0, -2.5)) toon.setHpr(Vec3(0, 0, 0)) toon.setAnimState("neutral", 1) toon.setShadowHeight(0) if not toon.isDisabled(): toon.reparentTo(render) self.counters[pos].setPos(thisPos * -0.17, 0, toon.getHeight() / 10 + 0.25) self.counters[pos].reparentTo(aspect2d) self.totalCounters[pos].setPos(thisPos * -0.17, 0, -0.825) self.totalCounters[pos].reparentTo(aspect2d) pos += 1 # find the max points won self.maxPoints = max(self.pointsArray) #find the maxVotes left if self.votesArray: self.maxVotes = max(self.votesArray) numToons = len(self.toons) self.voteMultiplier = TravelGameGlobals.PercentOfVotesConverted[ numToons] / 100.0 self.maxBeansFromVotes = int(self.voteMultiplier * self.maxVotes) else: self.maxVotes = 0 self.maxBeansFromVotes = 0 def reqCountUp(state): self.countUp() return Task.done countUpDelay = DELAY_BEFORE_COUNT_UP taskMgr.doMethodLater(countUpDelay, reqCountUp, "countUpTask") def reqCountDown(state): self.countDown() return Task.done countDownDelay = (countUpDelay + self.maxPoints * COUNT_UP_RATE + DELAY_AFTER_COUNT_UP) taskMgr.doMethodLater(countDownDelay, reqCountDown, "countDownTask") # play the jump animation for the winner(s) def celebrate(task): # hide the counters before we jump! for counter in task.counters: counter.hide() winningPoints = max(task.pointsArray) for i in range(len(task.ids)): if task.pointsArray[i] == winningPoints: avId = task.ids[i] if avId in base.cr.doId2do: toon = base.cr.doId2do[avId] toon.setAnimState("jump", 1.0) base.playSfx(task.celebrateSound) return Task.done celebrateDelay = (countDownDelay + self.maxPoints * COUNT_DOWN_RATE + DELAY_AFTER_COUNT_DOWN) celebrateTask = taskMgr.doMethodLater(celebrateDelay, celebrate, "celebrate") celebrateTask.counters = self.counters celebrateTask.pointsArray = self.pointsArray celebrateTask.ids = self.ids celebrateTask.celebrateSound = self.celebrateSound def reqCountVotesUp(state): self.countVotesUp() return Task.done def reqCountVotesDown(state): self.countVotesDown() return Task.done # show the player the votes left being converted to beans if self.metagameRound == TravelGameGlobals.FinalMetagameRoundIndex: countVotesUpDelay = celebrateDelay + DELAY_AFTER_CELEBRATE taskMgr.doMethodLater(countVotesUpDelay, reqCountVotesUp, "countVotesUpTask") countVotesUpTime = (self.maxVotes * COUNT_UP_RATE) + DELAY_AFTER_COUNT_UP countVotesDownDelay = countVotesUpDelay + countVotesUpTime taskMgr.doMethodLater(countVotesDownDelay, reqCountVotesDown, "countVotesDownTask") celebrateDelay += countVotesUpTime + \ (self.maxVotes * COUNT_DOWN_RATE) + DELAY_AFTER_COUNT_DOWN # transition to the purchase after the countup is finished def reqPurchase(state): self.fsm.request("purchase") return Task.done purchaseDelay = (celebrateDelay + DELAY_AFTER_CELEBRATE) taskMgr.doMethodLater(purchaseDelay, reqPurchase, "purchase-trans") if base.skipMinigameReward: self.fsm.request('purchase')