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.setForceOnscreenChat(True) 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 = 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) 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 + 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 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 + 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 reqCountVotesUp(state): self.countVotesUp() return Task.done def reqCountVotesDown(state): self.countVotesDown() return Task.done 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 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 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.getElevatorModelGhost()])) 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 setUpMovieAvatar(self, av): self.avDelayDelete = DelayDelete.DelayDelete(av, 'Pet.setUpMovieAvatar') av.headsUp(self, 0, 0, 0) av.stopLookAround()
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)) 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 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 emptySlot(self, index, avId, bailFlag, timestamp): """Remove someone as dictated by the AI.""" # 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, Func(self.clearToonTrack, avId), # Tell the toon he is free to roam now Func(self.notifyToonOffElevator, toon), name=toon.uniqueName("emptyElevator"), autoPause=1) track.delayDelete = DelayDelete.DelayDelete( toon, 'ClubElevator.emptySlot') self.storeToonTrack(avId, 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 __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 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 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: # 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 place.detectedElevatorCollision(self) 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() # avoid wrtReparent so that we don't muck with the toon's scale #toon.wrtReparentTo(self.getElevatorModel()) if not wantBoardingShow: toon.setZ(self.getElevatorModel(), self.elevatorPoints[index][2]) toon.setShadowHeight(0) if toon.isDisguised: animInFunc = Sequence(Func(toon.suit.loop, "walk")) #RAU this stops the dog's ears from flapping too much 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(), Point3(*self.elevatorPoints[index])) track = Sequence( # Pos 1: -1.5, 5, 0 # Pos 2: 1.5, 5, 0 # Pos 3: -2.5, 3, 0 # Pos 4: 2.5, 3, 0 animInFunc, LerpPosInterval(toon, TOON_BOARD_ELEVATOR_TIME * 0.75, Point3(*self.elevatorPoints[index]), other=self.getElevatorModel()), LerpHprInterval(toon, TOON_BOARD_ELEVATOR_TIME * 0.25, Point3(180, 0, 0), other=self.getElevatorModel()), #Func(toon.setAnimState, "neutral", 1.0), 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 elif (boardingTrackType == BoardingGroupShow.TRACK_TYPE_POOF): cameraWaitTime = 1 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, 'Elevator.fillSlot') self.storeToonTrack(avId, track) track.start() self.fillSlotTrack = track assert avId not in self.boardedAvIds self.boardedAvIds[avId] = None
def emptySlot(self, index, avId, bailFlag, timestamp, timeSent=0): if self.fillSlotTrack: self.fillSlotTrack.finish() self.fillSlotTrack = None #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 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: timeToSet = self.countdownTime if timeSent > 0: timeToSet = timeSent 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 < timeToSet and timestamp >= 0): self.countdown(timeToSet - timestamp) else: self.countdown(timeToSet) # 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() 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) # Place it on the appropriate spot relative to the # elevator track = Sequence( # TODO: Find the right coords for the elevator LerpPosInterval(toon, TOON_EXIT_ELEVATOR_TIME, Point3(*self.JumpOutOffsets[index]), other=self.getElevatorModel()), animFunc, # 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, 'Elevator.emptySlot') self.storeToonTrack(avId, 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 getVictoryRunTrack(self): origPosTrack = Sequence() delayDeletes = [] i = 0 for victor in self.victorList: if victor != 0 and victor in self.cr.doId2do: 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(render).getZ() > 1.0 runOutAll = Parallel() i = 0 for victor in self.victorList: if victor != 0 and victor in self.cr.doId2do: 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 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 not self.cr.doId2do.has_key(avId): # It's someone who hasn't been generated yet. func = PythonUtil.Functor(self.gotToon, index, avId) assert not self.toonRequests.has_key(index) 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 emptySlot(self, index, avId, bailFlag, timestamp, timeSent=0): if self.fillSlotTrack: self.fillSlotTrack.finish() self.fillSlotTrack = None if avId == 0: pass 1 if not self.isSetup: newSlots = [] for slot in self.deferredSlots: if slot[0] != index: newSlots.append(slot) continue 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!')
def makeIntroductionMovie(self, delayDeletes): for toonId in self.involvedToons: toon = self.cr.doId2do.get(toonId) if toon: delayDeletes.append( DelayDelete.DelayDelete( toon, 'CashbotBoss.makeIntroductionMovie')) 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.__makeGoonMovieForIntro() attackToons = TTL.CashbotBossCogAttack rToon = self.resistanceToon rToon.setPosHpr(*ToontownGlobals.CashbotRTBattleOneStartPosHpr) track = Sequence( Func(base.camera.setPosHpr, 82, -219, 5, 267, 0, 0), Func(rToon.setChatAbsolute, TTL.ResistanceToonWelcome, CFSpeech), Wait(3), Sequence(goonTrack, duration=0), Parallel( base.camera.posHprInterval(4, Point3(108, -244, 4), VBase3(211.5, 0, 0)), Sequence( Func(rToon.suit.setPlayRate, 1.4, '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(base.camera.reparentTo, render), Func(base.camera.setPosHpr, 61.1, -228.8, 10.2, -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), base.camera.posHprInterval(1.5, Point3(93.3, -230, 0.7), VBase3(-92.9, 39.7, 8.3)), 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.__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.935, -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(base.camera.setPosHpr, 93.3, -230, 0.7, -92.9, 39.7, 8.3), Func(self.setChatAbsolute, attackToons, CFSpeech), Wait(2), Func(self.clearChat)) return Sequence(Func(base.camera.reparentTo, render), track)
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 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, 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 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(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(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)
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 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 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