def makeToon(self): if not self.toon: self.toon = Toon.Toon() self.toon.setDNA(base.localAvatar.getStyle()) self.toon.getGeomNode().setDepthWrite(1) self.toon.getGeomNode().setDepthTest(1) self.toon.useLOD(500) self.toon.reparentTo(self.frame) self.toon.setPosHprScale(0, 10, -0.25, 210, 0, 0, 0.12, 0.12, 0.12) self.ignore('nametagAmbientLightChanged')
def getIntroToon(toonProperties, parent, pos): toon = Toon.Toon() dna = ToonDNA.ToonDNA() dna.newToonFromProperties(*toonProperties) toon.setDNA(dna) toon.reparentTo(parent) toon.setPos(*pos) toon.setH(180) toon.startBlink() return toon
def load(self): self.notify.debug('load()') CogdoGameMovie.load(self) backgroundGui = loader.loadModel('phase_5/models/cogdominium/tt_m_gui_csa_flyThru') # Dialogue Box self.bg = backgroundGui.find('**/background') self.chatBubble = backgroundGui.find('**/chatBubble') self.chatBubble.setScale(6.5, 6.5, 7.2999999999999998) self.chatBubble.setPos(0.32000000000000001, 0, -0.78000000000000003) self.bg.setScale(5.2000000000000002) self.bg.setPos(0.14000000000000001, 0, -0.66669999999999996) self.bg.reparentTo(aspect2d) self.chatBubble.reparentTo(aspect2d) self.frame = DirectFrame(geom = self.bg, relief = None, pos = (0.20000000000000001, 0, -0.66669999999999996)) self.bg.wrtReparentTo(self.frame) self.gameTitleText = DirectLabel(parent = self.frame, text = TTLocalizer.CogdoExecutiveSuiteTitle, scale = TTLocalizer.MRPgameTitleText * 0.80000000000000004, text_align = TextNode.ACenter, text_font = getSignFont(), text_fg = (1.0, 0.33000000000000002, 0.33000000000000002, 1.0), pos = TTLocalizer.MRgameTitleTextPos, relief = None) self.chatBubble.wrtReparentTo(self.frame) self.frame.hide() backgroundGui.removeNode() self.toonDNA = ToonDNA.ToonDNA() self.toonDNA.newToonFromProperties('dss', 'ss', 'm', 'm', 2, 0, 2, 2, 1, 8, 1, 8, 1, 14) # Lowdens DNA self.toonHead = Toon.Toon() self.toonHead.setDNA(self.toonDNA) self.makeSuit('sc') self.toonHead.getGeomNode().setDepthWrite(1) self.toonHead.getGeomNode().setDepthTest(1) self.toonHead.loop('neutral') self.toonHead.setPosHprScale(-0.72999999999999998, 0, -1.27, 180, 0, 0, 0.17999999999999999, 0.17999999999999999, 0.17999999999999999) self.toonHead.reparentTo(hidden) self.toonHead.startBlink() self.clipPlane = self.toonHead.attachNewNode(PlaneNode('clip')) self.clipPlane.node().setPlane(Plane(0, 0, 1, 0)) self.clipPlane.setPos(0, 0, 2.4500000000000002) self._toonDialogueSfx = loader.loadSfx('phase_3.5/audio/dial/AV_dog_long.mp3') # Dog speech self._camHelperNode = NodePath('CamHelperNode') self._camHelperNode.reparentTo(render) dialogue = TTLocalizer.CogdoExecutiveSuiteIntroMessage def start(): self.frame.show() base.setCellsAvailable(base.bottomCells + base.leftCells + base.rightCells, 0) def showShopOwner(): self._setCamTarget(self._shopOwner, -10, offset = Point3(0, 0, 5)) def end(): self._dialogueLabel.reparentTo(hidden) self.toonHead.reparentTo(hidden) self.frame.hide() base.setCellsAvailable(base.bottomCells + base.leftCells + base.rightCells, 1) self._stopUpdateTask() self._ival = Sequence(Func(start), Func(self.displayLine, dialogue), Func(showShopOwner), ParallelEndTogether(camera.posInterval(self.cameraMoveDuration, Point3(8, 0, 13), blendType = 'easeInOut'), camera.hprInterval(0.5, self._camHelperNode.getHpr(), blendType = 'easeInOut')), Wait(self.introDuration), Func(end)) self._startUpdateTask()
def getToonHeadModel(self): headType = ToonDNA.toonHeadTypes.index(base.localAvatar.style.head) headName = ToonDNA.toonHeadTypes[headType] gender = base.localAvatar.style.gender toon = Toon.Toon() dna = ToonDNA.ToonDNA() dna.newToon((headName, 'ms', 'm', gender)) dna.headColor = base.localAvatar.style.headColor dna.armColor = base.localAvatar.style.armColor dna.legColor = base.localAvatar.style.legColor toon.setDNA(dna) return toon
def makeToon(self): if not self.toon: self.toon = Toon.Toon() self.toon.setDNA(base.localAvatar.getStyle()) self.toon.getGeomNode().setDepthWrite(1) self.toon.getGeomNode().setDepthTest(1) # Conserve polygons self.toon.useLOD(500) self.toon.reparentTo(self.frame) self.toon.setPosHprScale(0,10,-0.25, 210,0,0, 0.12,0.12,0.12) # This thing is killing us self.ignore("nametagAmbientLightChanged")
def getPicture(self, avatar): # Returns a (DirectWidget, Interval) pair to draw and animate a # little representation of the item, or (None, None) if the # item has no representation. This method is only called on # the client. # Don't import this at the top of the file, since this code # must run on the AI. from toontown.toon import Toon assert (not self.hasPicture) self.hasPicture=True # Make an ToonDNA suitable for showing this clothing. # First, we start with a copy of the avatar's dna. dna = ToonDNA.ToonDNA(type = 't', dna = avatar.style) # Now we apply the properties from this clothing. str = ClothingTypes[self.clothingType][CTString] if self.isShirt(): # It's a shirt. defn = ToonDNA.ShirtStyles[str] dna.topTex = defn[0] dna.topTexColor = defn[2][self.colorIndex][0] dna.sleeveTex = defn[1] dna.sleeveTexColor = defn[2][self.colorIndex][1] pieceNames = ('**/1000/**/torso-top', '**/1000/**/sleeves') else: # It's a skirt or shorts. defn = ToonDNA.BottomStyles[str] dna.botTex = defn[0] dna.botTexColor = defn[1][self.colorIndex] pieceNames = ('**/1000/**/torso-bot',) # Create a toon wearing the clothing, then pull out the # appropriate clothes and throw the rest away. toon = Toon.Toon() toon.setDNA(dna) model = NodePath('clothing') for name in pieceNames: for piece in toon.findAllMatches(name): piece.wrtReparentTo(model) model.setH(180) toon.delete() return self.makeFrameModel(model)
def __init__(self, cr): DistributedEvent.__init__(self, cr) self.cr = cr self.spark = loader.loadSfx('phase_11/audio/sfx/LB_sparks_1.ogg') self.prepostera = Toon.Toon() self.prepostera.setName('Professor Prepostera') self.prepostera.setPickable(0) self.prepostera.setPlayerType(NametagGlobals.CCNonPlayer) dna = ToonDNA.ToonDNA() dna.newToonFromProperties('hss', 'ms', 'm', 'm', 20, 0, 20, 20, 97, 27, 86, 27, 37, 27) self.prepostera.setDNA(dna) self.prepostera.loop('scientistEmcee') self.prepostera.reparentTo(render) self.prepostera.setPosHpr(4, -3, 1, 0, 0, 0) self.prepostera.blinkEyes() self.prepostera.head = self.prepostera.find('**/__Actor_head') self.prepostera.initializeBodyCollisions('toon') self.headHoncho1 = DistributedSuitBase.DistributedSuitBase(self.cr) headHoncho1suitDNA = SuitDNA.SuitDNA() headHoncho1suitDNA.newSuit('hho') self.headHoncho1.setDNA(headHoncho1suitDNA) self.headHoncho1.setDisplayName('???') self.headHoncho1.setPickable(0) self.headHoncho1.setPosHpr(0, 0, 0, 0, 0, 0) self.headHoncho1.reparentTo(render) self.headHoncho1.doId = 0 self.headHoncho1.hide() self.headHoncho1.initializeBodyCollisions('toon') middlemanDNA = SuitDNA.SuitDNA() middlemanDNA.newSuit('mdm') self.middleman1 = DistributedSuitBase.DistributedSuitBase(self.cr) self.middleman1.setDNA(middlemanDNA) self.middleman1.setDisplayName('Middleman') self.middleman1.setPickable(0) self.middleman1.setPosHpr(0, 0, 0, 0, 0, 0) self.middleman1.reparentTo(render) self.middleman1.doId = 1 self.middleman1.hide() self.middleman1.initializeBodyCollisions('toon') self.middleman2 = DistributedSuitBase.DistributedSuitBase(self.cr) self.middleman2.setDNA(middlemanDNA) self.middleman2.setDisplayName('Middleman') self.middleman2.setPickable(0) self.middleman2.setPosHpr(0, 0, 0, 0, 0, 0) self.middleman2.reparentTo(render) self.middleman2.doId = 2 self.middleman2.hide() self.middleman2.initializeBodyCollisions('toon') self.toonMusic = loader.loadMusic( 'phase_14/audio/bgm/tt2_ambient_1.mp3')
def load(self): self.notify.debug('load()') CogdoGameMovie.load(self) backgroundGui = loader.loadModel('phase_5/models/cogdominium/tt_m_gui_csa_flyThru') self.bg = backgroundGui.find('**/background') self.chatBubble = backgroundGui.find('**/chatBubble') self.chatBubble.setScale(6.5, 6.5, 7.3) self.chatBubble.setPos(0.32, 0, -0.78) self.bg.setScale(5.2) self.bg.setPos(0.14, 0, -0.6667) self.bg.reparentTo(aspect2d) self.chatBubble.reparentTo(aspect2d) self.frame = DirectFrame(geom=self.bg, relief=None, pos=(0.2, 0, -0.6667)) self.bg.wrtReparentTo(self.frame) self.gameTitleText = DirectLabel(parent=self.frame, text=TTLocalizer.CogdoBarrelRoomTitle, scale=TTLocalizer.MRPgameTitleText * 0.8, text_align=TextNode.ACenter, text_font=getSignFont(), text_fg=(1.0, 0.33, 0.33, 1.0), pos=TTLocalizer.MRgameTitleTextPos, relief=None) self.chatBubble.wrtReparentTo(self.frame) self.frame.hide() backgroundGui.removeNode() self.toonDNA = ToonDNA.ToonDNA() self.toonDNA.newToonFromProperties('dss', 'ss', 'm', 'm', 2, 0, 2, 2, 1, 8, 1, 8, 1, 14) self.toonHead = Toon.Toon() self.toonHead.setDNA(self.toonDNA) self.makeSuit('sc') self.toonHead.getGeomNode().setDepthWrite(1) self.toonHead.getGeomNode().setDepthTest(1) self.toonHead.loop('neutral') self.toonHead.setPosHprScale(-0.73, 0, -1.27, 180, 0, 0, 0.18, 0.18, 0.18) self.toonHead.reparentTo(hidden) self.toonHead.startBlink() self.clipPlane = self.toonHead.attachNewNode(PlaneNode('clip')) self.clipPlane.node().setPlane(Plane(0, 0, 1, 0)) self.clipPlane.setPos(0, 0, 2.45) self._toonDialogueSfx = loader.loadSfx('phase_3.5/audio/dial/AV_dog_long.ogg') self._camHelperNode = NodePath('CamHelperNode') self._camHelperNode.reparentTo(render) dialogue = TTLocalizer.CogdoBarrelRoomIntroDialog def start(): self.frame.show() base.setCellsActive(base.bottomCells + base.leftCells + base.rightCells, 0) def end(): self._dialogueLabel.reparentTo(hidden) self.toonHead.reparentTo(hidden) self.frame.hide() base.setCellsActive(base.bottomCells + base.leftCells + base.rightCells, 1) self._stopUpdateTask() self._ival = Sequence(Func(start), Func(self.displayLine, dialogue), Wait(CogdoBarrelRoomConsts.BarrelRoomIntroTimeout), Func(end)) self._startUpdateTask() return
def showDropGrid(self): self.hideDropGrid() self.dropMarkers = [] for row in xrange(self.DropRows): self.dropMarkers.append([]) rowList = self.dropMarkers[row] for column in xrange(self.DropColumns): toon = Toon.Toon() toon.setDNA(base.localAvatar.getStyle()) toon.reparentTo(self.root) toon.setScale(1.0 / 3) x, y = self.grid2world(column, row) toon.setPos(x, y, 0) rowList.append(toon)
def getPicture(self, avatar): # Returns a (DirectWidget, Interval) pair to draw and animate a # little representation of the item, or (None, None) if the # item has no representation. This method is only called on # the client. # Don't import this at the top of the file, since this code # must run on the AI. from toontown.toon import Toon from toontown.toon import ToonHead from toontown.toon import TTEmote from otp.avatar import Emote assert (not self.hasPicture) self.hasPicture = True if self.emoteIndex in Emote.globalEmote.getHeadEmotes(): toon = ToonHead.ToonHead() toon.setupHead(avatar.style, forGui=1) else: toon = Toon.Toon() toon.setDNA(avatar.style) toon.loop('neutral') toon.setH(180) model, ival = self.makeFrameModel(toon, 0) # Discard the ival from makeFrameModel, since we don't want to # spin. track, duration = Emote.globalEmote.doEmote(toon, self.emoteIndex, volume=self.volume) if duration == None: duration = 0 name = "emote-item-%s" % (self.sequenceNumber) CatalogEmoteItem.sequenceNumber += 1 if track != None: track = Sequence(Sequence(track, duration=0), Wait(duration + 2), name=name) else: track = Sequence(Func(Emote.globalEmote.doEmote, toon, self.emoteIndex), Wait(duration + 4), name=name) self.pictureToon = toon return (model, track)
def setupStoneToon(self, dna): self.toon = Toon.Toon() self.toon.setPos(0, 0, 0) self.toon.setDNA(dna) self.toon.initializeBodyCollisions('toonStatue') self.toon.stopBlink() self.toon.stopLookAround() self.gender = self.toon.style.gender self.speciesType = self.toon.style.getAnimal() self.headType = self.toon.style.head self.removeTextures() self.setStoneTexture() self.toon.dropShadow.hide() self.toon.setZ(70) self.toon.setScale(20 / 1.5, 20 / 1.5, 20)
def createPreviewToon(self, dna): if hasattr(self, 'previewToon'): self.previewToon.delete() self.dnaSelected = dna self.previewToon = Toon.Toon() self.previewToon.setDNA(dna) self.previewToon.loop('neutral') self.previewToon.setH(180) self.previewToon.setPos(-0.3, 0, -0.3) self.previewToon.setScale(0.13) self.previewToon.reparentTo(self) self.previewToon.startBlink() self.previewToon.startLookAround() self.previewToon.getGeomNode().setDepthWrite(1) self.previewToon.getGeomNode().setDepthTest(1)
def playTutorialReward_3(self, value): self.tutRewardDialog_2.cleanup() from toontown.toon import Toon from toontown.toon import ToonDNA def doneChat1(page, elapsed = 0): self.track2.start() def doneChat2(elapsed): self.track2.pause() self.track3.start() def uniqueName(hook): return 'TutorialTom-' + hook self.tutorialTom = Toon.Toon() dna = ToonDNA.ToonDNA() dnaList = ('dls', 'ms', 'm', 'm', 7, 0, 7, 7, 2, 6, 2, 6, 2, 16) dna.newToonFromProperties(*dnaList) self.tutorialTom.setDNA(dna) self.tutorialTom.setName(TTLocalizer.NPCToonNames[20000]) self.tutorialTom.setPickable(0) self.tutorialTom.setPlayerType(NametagGlobals.CCNonPlayer) self.tutorialTom.uniqueName = uniqueName if base.config.GetString('language', 'english') == 'japanese': self.tomDialogue03 = base.loadSfx('phase_3.5/audio/dial/CC_tom_movie_tutorial_reward01.ogg') self.tomDialogue04 = base.loadSfx('phase_3.5/audio/dial/CC_tom_movie_tutorial_reward02.ogg') self.tomDialogue05 = base.loadSfx('phase_3.5/audio/dial/CC_tom_movie_tutorial_reward03.ogg') self.musicVolume = base.config.GetFloat('tutorial-music-volume', 0.5) else: self.tomDialogue03 = None self.tomDialogue04 = None self.tomDialogue05 = None self.musicVolume = 0.9 music = base.cr.playGame.place.loader.battleMusic if self.questList: self.track1 = Sequence(Wait(1.0), Func(self.rewardPanel.initQuestFrame, base.localAvatar, copy.deepcopy(base.localAvatar.quests)), Wait(1.0), Sequence(*self.questList), Wait(1.0), Func(self.rewardPanel.hide), Func(camera.setPosHpr, render, 34, 19.88, 3.48, -90, -2.36, 0), Func(base.localAvatar.animFSM.request, 'neutral'), Func(base.localAvatar.setPosHpr, 40.31, 22.0, -0.47, 150.0, 360.0, 0.0), Wait(0.5), Func(self.tutorialTom.reparentTo, render), Func(self.tutorialTom.show), Func(self.tutorialTom.setPosHpr, 40.29, 17.9, -0.47, 11.31, 0.0, 0.07), Func(self.tutorialTom.animFSM.request, 'TeleportIn'), Wait(1.517), Func(self.tutorialTom.animFSM.request, 'neutral'), Func(self.acceptOnce, self.tutorialTom.uniqueName('doneChatPage'), doneChat1), Func(self.tutorialTom.addActive), Func(music.setVolume, self.musicVolume), Func(self.tutorialTom.setLocalPageChat, TTLocalizer.MovieTutorialReward3, 0, None, [self.tomDialogue03]), name='tutorial-reward-3a') self.track2 = Sequence(Func(self.acceptOnce, self.tutorialTom.uniqueName('doneChatPage'), doneChat2), Func(self.tutorialTom.setLocalPageChat, TTLocalizer.MovieTutorialReward4, 1, None, [self.tomDialogue04]), Func(self.tutorialTom.setPlayRate, 1.5, 'right-hand-start'), Func(self.tutorialTom.play, 'right-hand-start'), Wait(self.tutorialTom.getDuration('right-hand-start') / 1.5), Func(self.tutorialTom.loop, 'right-hand'), name='tutorial-reward-3b') self.track3 = Parallel(Sequence(Func(self.tutorialTom.setPlayRate, -1.8, 'right-hand-start'), Func(self.tutorialTom.play, 'right-hand-start'), Wait(self.tutorialTom.getDuration('right-hand-start') / 1.8), Func(self.tutorialTom.animFSM.request, 'neutral'), name='tutorial-reward-3ca'), Sequence(Wait(0.5), Func(self.tutorialTom.setChatAbsolute, TTLocalizer.MovieTutorialReward5, CFSpeech | CFTimeout, self.tomDialogue05), Wait(1.0), Func(self.tutorialTom.animFSM.request, 'TeleportOut'), Wait(self.tutorialTom.getDuration('teleport')), Wait(1.0), Func(self.playTutorialReward_4, 0), name='tutorial-reward-3cb'), name='tutorial-reward-3c') self.track1.start() else: self.playTutorialReward_4(0) return
def load(self): CogdoGameMovie.load(self) self.toonDNA = ToonDNA.ToonDNA() self.toonDNA.newToonFromProperties('dss', 'ss', 'm', 'm', 2, 0, 2, 2, 1, 8, 1, 8, 1, 14) self.toonHead = Toon.Toon() self.toonHead.setDNA(self.toonDNA) self.makeSuit('sc') self.toonHead.getGeomNode().setDepthWrite(1) self.toonHead.getGeomNode().setDepthTest(1) self.toonHead.loop('neutral') self.toonHead.setPosHprScale(-0.73, 0, -1.27, 180, 0, 0, 0.18, 0.18, 0.18) self.toonHead.reparentTo(hidden) self.toonHead.startBlink() self.cogHead = Suit.Suit() self.cogDNA = SuitDNA.SuitDNA() self.cogDNA.newSuit('le') self.cogHead.setDNA(self.cogDNA) self.cogHead.getGeomNode().setDepthWrite(1) self.cogHead.getGeomNode().setDepthTest(1) self.cogHead.loop('neutral') self.cogHead.setPosHprScale(-0.74, 0, -1.79, 180, 0, 0, 0.12, 0.14, 0.14) self.cogHead.reparentTo(hidden) self.clipPlane = self.toonHead.attachNewNode(PlaneNode('clip')) self.clipPlane.node().setPlane(Plane(0, 0, 1, 0)) self.clipPlane.setPos(0, 0, 2.45) audioMgr = base.cogdoGameAudioMgr self._cogDialogueSfx = audioMgr.createSfx('cogDialogue') self._toonDialogueSfx = audioMgr.createSfx('toonDialogue') def start(): camera.wrtReparentTo(render) self._startUpdateTask() def end(): self._stopUpdateTask() introDuration = Globals.Gameplay.IntroDurationSeconds dialogue = TTLocalizer.CogdoFlyingIntroMovieDialogue waitDur = introDuration / len(dialogue) flyDur = introDuration - waitDur * 0.5 flyThroughIval = Parallel(camera.posInterval(flyDur, self._exit.getPos(render) + Point3(0, -22, 1), blendType='easeInOut'), camera.hprInterval(flyDur, Point3(0, 5, 0), blendType='easeInOut')) self._ival = Sequence(Func(start), Parallel(flyThroughIval, Sequence(Func(self.displayLine, 'cog', self._getRandomLine(dialogue[0])), Wait(waitDur), Func(self.displayLine, 'toon', self._getRandomLine(dialogue[1])), Wait(waitDur), Func(self.displayLine, 'cog', self._getRandomLine(dialogue[2])), Wait(waitDur))), Func(end))
def begin(self, range, label, gui, tipCategory, zoneId): self.waitBar['range'] = range self.title['text'] = label loadingScreenTex = self.zone2picture.get( ZoneUtil.getBranchZone(zoneId), self.defaultTex) self.background = loader.loadTexture(loadingScreenTex) self.__count = 0 self.__expectedCount = range if gui: if base.localAvatarStyle: from toontown.toon import Toon self.toon = Toon.Toon() self.toon.setDNA(base.localAvatarStyle) self.toon.loop('bored', fromFrame=135, toFrame=135) self.toon.getGeomNode().setDepthWrite(1) self.toon.getGeomNode().setDepthTest(1) self.toon.setHpr(205, 0, 0) self.toon.setScale(0.18) self.toon.setPos(base.a2dBottomRight.getX() / 1.25, 0, -0.034) self.toon.reparentTo(self.waitBar) self.waitBar['frameSize'] = (base.a2dLeft + (base.a2dRight / 8.15), base.a2dRight - (base.a2dRight / 2.57), -0.03, 0.03) self.title.reparentTo(base.a2dpBottomLeft, LOADING_SCREEN_SORT_INDEX) self.title.setPos(0.24, 0, 0.23) self.gui.setPos(0, -0.1, 0) self.gui.reparentTo(aspect2d, LOADING_SCREEN_SORT_INDEX) self.gui.setTexture(self.background, 1) if loadingScreenTex == self.defaultTex: self.logo.reparentTo(base.a2dpTopCenter, LOADING_SCREEN_SORT_INDEX) else: self.title.reparentTo(base.a2dpBottomLeft, LOADING_SCREEN_SORT_INDEX) self.gui.reparentTo(hidden) self.logo.reparentTo(hidden) self.waitBar.reparentTo(base.a2dpBottomCenter, LOADING_SCREEN_SORT_INDEX) self.waitBar.update(self.__count)
def createPreviewToon(self, dna): '''Create a toon to show as a preview on the screen''' # Clean up any old preview toon if hasattr(self, 'previewToon'): self.previewToon.delete() self.dnaSelected = dna self.previewToon = Toon.Toon() self.previewToon.setDNA(dna) self.previewToon.loop('neutral') self.previewToon.setH(180) self.previewToon.setPos(-0.3, 0, -0.3) # @TODO: Adjust height self.previewToon.setScale(0.13) self.previewToon.reparentTo(self) # Start blinking and looking around. self.previewToon.startBlink() self.previewToon.startLookAround() # Turn on depth write and test so that it renders correctly on the 2D frame. self.previewToon.getGeomNode().setDepthWrite(1) self.previewToon.getGeomNode().setDepthTest(1)
def _createRandomToon(self, gender): if self.toon: self.toon.stopBlink() self.toon.stopLookAroundNow() self.toon.delete() self.dna = ToonDNA.ToonDNA() self.dna.newToonRandom(gender=gender, stage=1) self.toon = Toon.Toon() self.toon.setDNA(self.dna) self.toon.useLOD(1000) self.toon.setNameVisible(0) self.toon.startBlink() self.toon.startLookAround() self.toon.reparentTo(render) self.toon.setPos(self.makeAToon.toonPosition) self.toon.setHpr(self.makeAToon.toonHpr) self.toon.setScale(self.makeAToon.toonScale) self.toon.loop('neutral') self.makeAToon.setNextButtonState(DGG.NORMAL) self.makeAToon.setToon(self.toon) messenger.send('MAT-newToonCreated')
def makeToon(self): if self.toon != None: del self.toon self.toon = Toon.Toon() self.toon.setDNA(base.localAvatar.getStyle()) self.toon.getGeomNode().setDepthWrite(1) self.toon.getGeomNode().setDepthTest(1) # Conserve polygons self.toon.useLOD(500) self.toon.reparentTo(self.frame) self.toon.setPosHprScale(0, 10, -0.25, 210, 0, 0, 0.15, 0.15, 0.15) self.toon.loop('neutral') try: anim = emoteAnimDict[self.name] except: print "we didnt get the right animation" anim = 'neutral' #self.toon.pose(anim, self.toon.getNumFrames(anim)/2) self.toon.animFSM.request(anim)
def spawnNPC(command, npcId, name): invoker = spellbook.getTarget() if command == 'add': if npcId == 'regular': npcId = NPC_REGULAR if npcId == 'clerk': npcId = NPC_CLERK npc = Toon.Toon() npc.setName('Generic') npc.setPickable(1) npc.setHp(15) npc.setMaxHp(15) npc.setPlayerType(NametagGlobals.CCBotPlayer) dna = ToonDNA.ToonDNA() dna.newToonRandom(random.choice([99998, 99999]), random.choice(['m', 'f']), 1) dna.head = random.choice(ToonDNA.toonHeadTypes) npc.setDNAString(dna.makeNetString()) npc.animFSM.request('neutral')) npc.setPos(random.nextint(0, 250), random.nextint(0, 100), 8) npc.setHpr(0, 0, 0) else: return 'Invalid or not implemented yet!'
def createToon(instName, toonName, toonPos, toonHpr, toonScale=1, anim='neutral'): try: newToon.cleanup() newToon.removeNode() except: pass newToon = instName newToon = Toon.Toon() newToon.reparentTo(render) newToon.doId = base.localAvatar.doId newToon.setupToonNodes() newToon.setName(toonName) newToon.setPos(toonPos) newToon.setHpr(toonHpr) newToon.setScale(toonScale) newToon.startBlink() newToon.showNametag2d() newToon.startLookAround() newToon.initializeBodyCollisions('FD_NPC-Collisions_' + str(newToon.doId)) newToon.setDNAString('t\x01\x01\x00\x00\x50\x1b\x45\x1b\x21\x1b\x08\x02\x08\x08') newToon.loop(anim) pos = newToon.getPos() hpr = newToon.getHpr() strPos = '(%.3f' % pos[0] + '\n %.3f' % pos[1] + '\n %.3f)' % pos[2] strHpr = '(%.3f' % hpr[0] + '\n %.3f' % hpr[1] + '\n %.3f)' % hpr[2] print "%s = Toon.Toon()" % instName print "%s.reparentTo(render)" % instName print "%s.doId = base.localAvatar.doId" % instName print "%s.setupToonNodes()" % instName print "%s.setName('%s')" % (instName, toonName) print '%s.setPos' % instName, strPos.replace('\n', ',') print '%s.setHpr' % instName, strHpr.replace('\n', ',') print "%s.setScale(%d)" % (instName, toonScale) print "%s.startBlink()" % instName print "%s.showNametag2d()" % instName print "%s.startLookAround()" % instName print "%s.initializeBodyCollisions('FD_NPC-Collisions_' + str(%s.doId))" % (instName, instName) print '%s.setDNAString("t\x01\x01\x00\x00\x50\x1b\x45\x1b\x21\x1b\x08\x02\x08\x08")' % instName print "%s.loop('%s')" % (instName, anim)
def createToon(self, name='', dna=None, addActive=False): toon = Toon.Toon() toon.setName(name) toon.setPickable(0) toon.setPlayerType(NametagGlobals.CCNonPlayer) if addActive: toon.addActive() if not isinstance(dna, ToonDNA.ToonDNA): if isinstance(dna, basestring): dna = ToonDNA.ToonDNA(str=dna) else: dna = ToonDNA.ToonDNA() dna.newToonRandom(seed=dna) toon.setDNA(dna) toon.animFSM.request('neutral') toon.reparentTo(hidden) self.toons.add(toon) return toon
def getPicture(self, avatar): from toontown.toon import Toon self.hasPicture = True if len(avatar.style.torso) == 1: if avatar.style.gender == 'f': bottomPair = ToonDNA.GirlBottoms[avatar.style.botTex] if bottomPair[1] == ToonDNA.SKIRT: avatar.style.torso = avatar.style.torso + 'd' else: avatar.style.torso = avatar.style.torso + 's' else: avatar.style.torso = avatar.style.torso + 's' dna = ToonDNA.ToonDNA(type='t', dna=avatar.style) str = ClothingTypes[self.clothingType][CTString] if self.isShirt(): defn = ToonDNA.ShirtStyles[str] dna.topTex = defn[0] dna.topTexColor = defn[2][self.colorIndex][0] dna.sleeveTex = defn[1] dna.sleeveTexColor = defn[2][self.colorIndex][1] pieceNames = ('**/1000/**/torso-top', '**/1000/**/sleeves') else: defn = ToonDNA.BottomStyles[str] dna.botTex = defn[0] dna.botTexColor = defn[1][self.colorIndex] pieceNames = ('**/1000/**/torso-bot', ) toon = Toon.Toon() toon.setDNA(dna) model = NodePath('clothing') for name in pieceNames: for piece in toon.findAllMatches(name): piece.wrtReparentTo(model) model.setH(180) toon.delete() return self.makeFrameModel(model)
def load(self): gui = loader.loadModelOnce('phase_3/models/gui/create_a_toon_gui') self.guiTopBar = DirectFrame(relief=None, image=gui.find('**/CrtATn_TopBar'), text=TTLocalizer.CreateYourToon, text_font=ToontownGlobals.getSignFont(), text_fg=(0.0, 0.65000000000000002, 0.34999999999999998, 1), text_scale=0.17999999999999999, text_pos=(0, -0.029999999999999999), pos=(0, 0, 0.85999999999999999)) self.guiTopBar.hide() self.guiBottomBar = DirectFrame( relief=None, image=gui.find('**/CrtATn_BtmBar'), image_scale=( (base.win.getXSize() / 948.14814814814814814814814814815) * 0.98765432098765432098765432098765, 1, 1), pos=(0, 0, -0.85999999999999999)) self.guiBottomBar.hide() self.guiCheckButton = DirectButton( parent=self.guiBottomBar, relief=None, image=(gui.find('**/CrtAtoon_Btn1_UP'), gui.find('**/CrtAtoon_Btn1_DOWN'), gui.find('**/CrtAtoon_Btn1_RLLVR')), pos=(base.a2dRight - 0.165, 0, -0.017999999999999999), command=self._MakeAToon__handleNext, text=('', TTLocalizer.MakeAToonDone, TTLocalizer.MakeAToonDone), text_font=ToontownGlobals.getInterfaceFont(), text_scale=0.080000000000000002, text_pos=(0, -0.029999999999999999), text_fg=(1, 1, 1, 1), text_shadow=(0, 0, 0, 1)) self.guiCheckButton.hide() self.guiCancelButton = DirectButton( parent=self.guiBottomBar, relief=None, image=(gui.find('**/CrtAtoon_Btn2_UP'), gui.find('**/CrtAtoon_Btn2_DOWN'), gui.find('**/CrtAtoon_Btn2_RLLVR')), pos=(base.a2dLeft + 0.179, 0, -0.010999999999999999), command=self._MakeAToon__handleCancel, text=('', TTLocalizer.MakeAToonCancel, TTLocalizer.MakeAToonCancel), text_font=ToontownGlobals.getInterfaceFont(), text_scale=0.080000000000000002, text_pos=(0, -0.029999999999999999), text_fg=(1, 1, 1, 1), text_shadow=(0, 0, 0, 1)) self.guiCancelButton.hide() self.guiNextButton = DirectButton( parent=self.guiBottomBar, relief=None, image=(gui.find('**/CrtAtoon_Btn3_UP'), gui.find('**/CrtAtoon_Btn3_DN'), gui.find('**/CrtAtoon_Btn3_RLVR')), pos=(base.a2dRight - 0.165, 0, -0.017999999999999999), command=self._MakeAToon__handleNext, text=('', TTLocalizer.MakeAToonNext, TTLocalizer.MakeAToonNext), text_font=ToontownGlobals.getInterfaceFont(), text_scale=0.080000000000000002, text_pos=(0, -0.029999999999999999), text_fg=(1, 1, 1, 1), text_shadow=(0, 0, 0, 1)) self.guiNextButton.hide() self.guiLastButton = DirectButton( parent=self.guiBottomBar, relief=None, image=(gui.find('**/CrtAtoon_Btn3_UP'), gui.find('**/CrtAtoon_Btn3_DN'), gui.find('**/CrtAtoon_Btn3_RLVR')), image_scale=(-1, 1, 1), pos=(base.a2dRight - 0.505, 0, -0.017999999999999999), command=self._MakeAToon__handleLast, text=('', TTLocalizer.MakeAToonLast, TTLocalizer.MakeAToonLast), text_font=ToontownGlobals.getInterfaceFont(), text_scale=0.080000000000000002, text_pos=(0, -0.029999999999999999), text_fg=(1, 1, 1, 1), text_shadow=(0, 0, 0, 1)) self.guiLastButton.hide() gui.removeNode() self.room = loader.loadModel('phase_3/models/gui/create_a_toon') self.roomWalls = self.room.find('**/wall_floor') self.draftingTable = self.room.find('**/drafting_table') self.easel = self.room.find('**/easel') self.sewingMachine = self.room.find('**/sewing_machine') ee = DirectFrame(pos=(-1, 1, 1), frameSize=(-0.01, 0.01, -0.01, 0.01), frameColor=(0, 0, 0, 0.050000000000000003), state='normal') ee.bind(DGG.B1PRESS, lambda x, ee=ee: self.toggleSlide()) self.eee = ee self.stool = self.room.find('**/stool') self.stool.hide() self.draftingTable.hide() self.easel.hide() self.sewingMachine.hide() if not (self.warp): self.dna = ToonDNA.ToonDNA() animal = random.choice(ToonDNA.toonHeadAnimalIndices) head = ToonDNA.toonHeadTypes[animal] torso = random.choice(ToonDNA.toonTorsoTypes[-3:]) leg = random.choice(ToonDNA.toonLegTypes) self.dna.newToon((head, torso, leg, 'm')) else: self.dna = ToonDNA.ToonDNA() self.dna.makeFromNetString(self.namelessPotAv.dna) self.toon = Toon.Toon() self.toon.setDNA(self.dna) self.toon.useLOD(1000) self.toon.setNameVisible(0) self.toon.startBlink() self.toon.startLookAround() self.mickey = Char.Char() mickeyDNA = CharDNA.CharDNA() mickeyDNA.newChar('mk') self.mickey.setDNA(mickeyDNA) self.mickey.addActive() self.mickey.startEarTask() self.mickey.setNametagScale(0.80000000000000004) self.mickey.hideName() self.mickey.setPickable(1) #self.mickey.nametag.getNametag3d().setChatWordwrap(8) self.minnie = Char.Char() minnieDNA = CharDNA.CharDNA() minnieDNA.newChar('mn') self.minnie.setDNA(minnieDNA) self.minnie.addActive() self.minnie.startEarTask() self.minnie.setNametagScale(0.80000000000000004) self.minnie.hideName() self.minnie.setPickable(1) #self.minnie.nametag.getNametag3d().setChatWordwrap(8) self.gs.load() self.bs.load() self.cos.load() self.cls.load() self.ns.load() self.music = base.loadMusic('phase_3/audio/bgm/create_a_toon.ogg') self.soundBack = base.loadSfx( 'phase_3/audio/sfx/GUI_create_toon_back.ogg') return None
def __init__(self): DirectObject.__init__(self) base.cr.DMENU_SCREEN = self self.seq = None base.cr.avChoice = None self.allButtons = [] base.transitions.fadeOut(0) base.camera.setPosHpr(Point3(MAIN_POS), VBase3(MAIN_HPR)) base.transitions.getFadeInIval(1).start() if base.showDisclaimer: FeatureComingSoonDialog.FeatureComingSoonDialog( text=TTLocalizer.PopupAlphaDisclaimer) self.background2d = OnscreenImage( image='phase_3.5/maps/loading/toon.jpg', parent=render2d) self.background2d.setScale(render2d, Vec3(1)) self.background2d.setBin('background', 1) self.background2d.setTransparency(1) self.background2d.setColorScale(1, 1, 1, 1) self.background = loader.loadModel( 'phase_3.5/models/modules/tt_m_ara_int_toonhall') self.background.reparentTo(render) self.background.setPosHpr(-25, 0, 8.1, -95, 0, 0) self.surlee = Toon.Toon() self.surlee.setName('Doctor Surlee') self.surlee.setPickable(0) self.surlee.setPlayerType(CCNonPlayer) dna = ToonDNA.ToonDNA() dna.newToonFromProperties('pls', 'ls', 'l', 'm', 9, 0, 9, 9, 98, 27, 86, 27, 38, 27) self.surlee.setDNA(dna) self.surlee.loop('scientistGame') self.surlee.reparentTo(self.background) self.surlee.setPosHpr(13, 24, 0.025, -180, 0, 0) self.dimm = Toon.Toon() self.dimm.setName('Doctor Dimm') self.dimm.setPickable(0) self.dimm.setPlayerType(CCNonPlayer) dna = ToonDNA.ToonDNA() dna.newToonFromProperties('fll', 'ss', 's', 'm', 15, 0, 15, 15, 99, 27, 86, 27, 39, 27) self.dimm.setDNA(dna) self.dimm.loop('scientistGame') self.dimm.reparentTo(self.background) self.dimm.setPosHpr(16, 24, 0.025, -180, 0, 0) surleeHand = self.surlee.find('**/def_joint_right_hold') clipBoard = loader.loadModel( 'phase_4/models/props/tt_m_prp_acs_clipboard') surleeHandNode = surleeHand.attachNewNode('ClipBoard') clipBoard.instanceTo(surleeHandNode) surleeHandNode.setH(180) surleeHandNode.setScale(render, 1.0) surleeHandNode.setPos(0, 0, 0.1) dimmHand = self.dimm.find('**/def_joint_right_hold') sillyReader = loader.loadModel( 'phase_4/models/props/tt_m_prp_acs_sillyReader') dimHandNode = dimmHand.attachNewNode('SillyReader') sillyReader.instanceTo(dimHandNode) dimHandNode.setH(180) dimHandNode.setScale(render, 1.0) dimHandNode.setPos(0, 0, 0.1) self.sky = loader.loadModel('phase_3.5/models/props/TT_sky') SkyUtil.startCloudSky(self) base.camera.setPosHpr(MAIN_POS, MAIN_HPR) self.logo = OnscreenImage(image=GameLogo, scale=(.5, .5, .25)) self.logo.reparentTo(aspect2d) self.logo.setTransparency(TransparencyAttrib.MAlpha) scale = self.logo.getScale() self.logo.setPos(0, 0, .6) self.logo.setColorScale(Vec4(0, 0, 0, 0)) fadeInLogo = (LerpColorScaleInterval(self.logo, 1, Vec4(1, 1, 1, 1), Vec4(1, 1, 1, 0))).start() self.releaseNotesBox = None self.releaseNotesText = None self.createButtons() self.fadeOut = None self.optionsMgr = PickAToonOptions.NewPickAToonOptions() self.quitConfirmation = DMenuQuit.DMenuQuit() self.newsMgr = DMenuNewsManager.DMenuNewsManager() self.accept('doQuitGame', self.doQuitFunc) self.accept('doCancelQuitGame', self.doCancelQuitFunc) self.patNode = None # TT: We need these to run the Pick A Toon screen self.patAvList = base.cr.PAT_AVLIST self.patFSM = base.cr.PAT_LOGINFSM self.patDoneEvent = base.cr.PAT_DONEEVENT
def playTutorialReward_2(self, value=None): from toontown.toon import Toon from toontown.toon import ToonDNA def doneChat1(page, elapsed=0): self.track2.start() def doneChat2(elapsed): self.track2.pause() self.track3.start() def uniqueName(hook): return 'TutorialTom-' + hook self.tutorialTom = Toon.Toon() dna = ToonDNA.ToonDNA() dna.newToonFromProperties(*('dls', 'ms', 'm', 'm', 7, 0, 7, 7, 2, 6, 2, 6, 2, 16)) self.tutorialTom.setDNA(dna) self.tutorialTom.setName(TTLocalizer.NPCToonNames[20000]) self.tutorialTom.setPickable(0) self.tutorialTom.setPlayerType(NametagGroup.CCNonPlayer) self.tutorialTom.uniqueName = uniqueName self.musicVolume = 0.9 music = base.cr.playGame.place.loader.battleMusic if self.questList: self.track1 = Sequence( Wait(1.0), Func(self.rewardPanel.initQuestFrame, base.localAvatar, copy.deepcopy(base.localAvatar.quests)), Wait(1.0), Sequence(*self.questList), Wait(1.0), Func(self.rewardPanel.hide), Func(camera.setPosHpr, render, 34, 19.88, 3.48, -90, -2.36, 0), Func(base.localAvatar.animFSM.request, 'neutral'), Func(base.localAvatar.setPosHpr, 40.31, 22.0, -0.47, 150.0, 360.0, 0.0), Wait(0.5), Func(self.tutorialTom.reparentTo, render), Func(self.tutorialTom.show), Func(self.tutorialTom.setPosHpr, 40.29, 17.9, -0.47, 11.31, 0.0, 0.07), Func(self.tutorialTom.animFSM.request, 'TeleportIn'), Wait(1.517), Func(self.tutorialTom.animFSM.request, 'neutral'), Func(self.acceptOnce, self.tutorialTom.uniqueName('doneChatPage'), doneChat1), Func(self.tutorialTom.addActive), Func(music.setVolume, self.musicVolume), Func(self.tutorialTom.setLocalPageChat, TTLocalizer.MovieTutorialReward3, 0, None, [None]), name='tutorial-reward-3a') self.track2 = Sequence( Func(self.acceptOnce, self.tutorialTom.uniqueName('doneChatPage'), doneChat2), Func(self.tutorialTom.setLocalPageChat, TTLocalizer.MovieTutorialReward4, 1, None, [None]), Func(self.tutorialTom.setPlayRate, 1.5, 'right-hand-start'), Func(self.tutorialTom.play, 'right-hand-start'), Wait(self.tutorialTom.getDuration('right-hand-start') / 1.5), Func(self.tutorialTom.loop, 'right-hand'), name='tutorial-reward-3b') self.track3 = Parallel( Sequence(Func(self.tutorialTom.setPlayRate, -1.8, 'right-hand-start'), Func(self.tutorialTom.play, 'right-hand-start'), Wait( self.tutorialTom.getDuration('right-hand-start') / 1.8), Func(self.tutorialTom.animFSM.request, 'neutral'), name='tutorial-reward-3ca'), Sequence(Wait(0.5), Func(self.tutorialTom.setChatAbsolute, TTLocalizer.MovieTutorialReward5, CFSpeech | CFTimeout), Wait(1.0), Func(self.tutorialTom.animFSM.request, 'TeleportOut'), Wait(self.tutorialTom.getDuration('teleport')), Wait(1.0), Func(self.playTutorialReward_3, 0), name='tutorial-reward-3cb'), name='tutorial-reward-3c') self.track1.start() else: self.playTutorialReward_3()
def load(self): self.done = 0 self.geyserTrack = None SafeZoneLoader.load(self) self.birdSound = map(base.loader.loadSfx, [ 'phase_4/audio/sfx/SZ_TC_bird1.ogg', 'phase_4/audio/sfx/SZ_TC_bird2.ogg', 'phase_4/audio/sfx/SZ_TC_bird3.ogg' ]) self.underwaterSound = base.loader.loadSfx( 'phase_4/audio/sfx/AV_ambient_water.ogg') self.swimSound = base.loader.loadSfx( 'phase_4/audio/sfx/AV_swim_single_stroke.ogg') self.submergeSound = base.loader.loadSfx( 'phase_5.5/audio/sfx/AV_jump_in_water.ogg') geyserPlacer = self.geom.find('**/geyser*') waterfallPlacer = self.geom.find('**/waterfall*') binMgr = CullBinManager.getGlobalPtr() binMgr.addBin('water', CullBinManager.BTFixed, 29) binMgr = CullBinManager.getGlobalPtr() water = self.geom.find('**/water1*') water.setTransparency(1) water.setColorScale(1, 1, 1, 1) water.setBin('water', 51, 1) pool = self.geom.find('**/pPlane5*') pool.setTransparency(1) pool.setColorScale(1.0, 1.0, 1.0, 1.0) pool.setBin('water', 50, 1) self.geyserModel = loader.loadModel( 'phase_6/models/golf/golf_geyser_model') self.geyserSound = loader.loadSfx('phase_6/audio/sfx/OZ_Geyser.ogg') self.geyserSoundInterval = SoundInterval(self.geyserSound, node=geyserPlacer, listenerNode=base.camera, seamlessLoop=False, volume=1.0, cutOff=120) self.geyserSoundNoToon = loader.loadSfx( 'phase_6/audio/sfx/OZ_Geyser_No_Toon.ogg') self.geyserSoundNoToonInterval = SoundInterval( self.geyserSoundNoToon, node=geyserPlacer, listenerNode=base.camera, seamlessLoop=False, volume=1.0, cutOff=120) if self.geyserModel: self.geyserActor = Actor.Actor(self.geyserModel) self.geyserActor.loadAnims( {'idle': 'phase_6/models/golf/golf_geyser'}) self.geyserActor.reparentTo(render) self.geyserActor.setPlayRate(8.6, 'idle') self.geyserActor.loop('idle') self.geyserActor.setDepthWrite(0) self.geyserActor.setTwoSided(True, 11) self.geyserActor.setColorScale(1.0, 1.0, 1.0, 1.0) self.geyserActor.setBin('fixed', 0) mesh = self.geyserActor.find('**/mesh_tide1') joint = self.geyserActor.find('**/uvj_WakeWhiteTide1') mesh.setTexProjector(mesh.findTextureStage('default'), joint, self.geyserActor) self.geyserActor.setPos(geyserPlacer.getPos()) self.geyserActor.setZ(geyserPlacer.getZ() - 100.0) self.geyserPos = geyserPlacer.getPos() self.geyserPlacer = geyserPlacer self.startGeyser() base.sfxPlayer.setCutoffDistance(160) self.geyserPoolSfx = loader.loadSfx( 'phase_6/audio/sfx/OZ_Geyser_BuildUp_Loop.ogg') self.geyserPoolSoundInterval = SoundInterval( self.geyserPoolSfx, node=self.geyserPlacer, listenerNode=base.camera, seamlessLoop=True, volume=1.0, cutOff=120) self.geyserPoolSoundInterval.loop() self.bubbles = Bubbles.Bubbles(self.geyserPlacer, render) self.bubbles.renderParent.setDepthWrite(0) self.bubbles.start() self.collBase = render.attachNewNode('collisionBase') self.geyserCollSphere = CollisionSphere(0, 0, 0, 7.5) self.geyserCollSphere.setTangible(1) self.geyserCollNode = CollisionNode('barrelSphere') self.geyserCollNode.setIntoCollideMask(OTPGlobals.WallBitmask) self.geyserCollNode.addSolid(self.geyserCollSphere) self.geyserNodePath = self.collBase.attachNewNode(self.geyserCollNode) self.geyserNodePath.setPos(self.geyserPos[0], self.geyserPos[1], self.geyserPos[2] - 100.0) self.waterfallModel = loader.loadModel( 'phase_6/models/golf/golf_waterfall_model') if self.waterfallModel: self.waterfallActor = Actor.Actor(self.waterfallModel) self.waterfallActor.loadAnims( {'idle': 'phase_6/models/golf/golf_waterfall'}) self.waterfallActor.reparentTo(render) self.waterfallActor.setPlayRate(3.5, 'idle') self.waterfallActor.loop('idle') mesh = self.waterfallActor.find('**/mesh_tide1') joint = self.waterfallActor.find('**/uvj_WakeWhiteTide1') mesh.setTexProjector(mesh.findTextureStage('default'), joint, self.waterfallActor) self.waterfallActor.setPos(waterfallPlacer.getPos()) self.accept('clientLogout', self._handleLogout) # If Chestnut Park is under construction, create the construction site: if base.config.GetBool('want-chestnut-park-construction', False): self.constructionSite = render.attachNewNode('constructionSite') self.constructionSiteBlocker = self.constructionSite.attachNewNode( CollisionNode('constructionSiteBlocker')) self.constructionSiteBlocker.setPos(-48, -154.5, 0) self.constructionSiteBlocker.node().addSolid( CollisionSphere(0, 0, 0, 35)) self.coneModel = loader.loadModel( 'phase_3.5/models/props/unpainted_barrier_cone.bam') self.cone0 = Actor.Actor(self.coneModel) self.cone0.loadAnims({ 'jumptwist': 'phase_3.5/models/props/barrier_cone_chan_jumptwist.bam' }) self.cone0.reparentTo(self.constructionSite) self.cone0.loop('jumptwist') self.cone0.setPos(-43, -142, 0.025) self.cone1 = Actor.Actor(self.coneModel) self.cone1.loadAnims({ 'walktrip': 'phase_3.5/models/props/barrier_cone_chan_walktrip.bam' }) self.cone1.reparentTo(self.constructionSite) self.cone1.loop('walktrip') self.cone1.setPos(-52, -145, 0.025) self.ladder = loader.loadModel('phase_5/models/props/ladder2.bam') self.ladder.reparentTo(self.constructionSite) self.ladder.setPosHpr(-36.460, -130.828, 0.30, 61, -90, 0) self.ladder.find('**/shadow').removeNode() self.paintersWantedSign = loader.loadModel( 'phase_6/models/props/tti_painters_wanted_sign.bam') self.paintersWantedSign.reparentTo(self.constructionSite) self.paintersWantedSign.setPosHpr(-57, -129.613, 0.025, 160, 0, 0) self.constructionSign = loader.loadModel( 'phase_4/models/props/construction_sign.bam') self.constructionSign.reparentTo(self.constructionSite) self.constructionSign.setPosHpr(-47.941, -138.724, 0.122, 181, 0, 0) if base.config.GetBool('want-oz-painter-pete', False): self.painterPete = Toon.Toon() self.painterPete.setName('Painter Pete') self.painterPete.setPickable(0) self.painterPete.setPlayerType(NametagGlobals.CCNonPlayer) dna = ToonDNA.ToonDNA() dna.newToonFromProperties('hls', 'ss', 'm', 'm', 18, 0, 13, 9, 0, 0, 0, 0, 2, 15) self.painterPete.setDNA(dna) self.painterPete.setHat(43, 0, 0) self.painterPete.animFSM.request('neutral') self.painterPete.reparentTo(self.constructionSite) self.painterPete.setPosHpr(-52.5, -133.5, 0.025, 338, 0, 0) self.painterPete.sadEyes() self.painterPete.blinkEyes() speechTextList = ( "Oh, brother. How am I going to clean up all of this? Those painters left a big mess here, and I can't finish the job without them!", "I'm beginning to feel nervous about where all of my painters went off to. Construction can't continue without them!", "These cones are out of my control. They're disobedient, and they will not listen to what I say.", "What's a playground without color, anyway? Walking into something like that would be surreal for you all. As a painter, though, I'm pretty used to it.", "The Cogs couldn't have done this... could they?", "If anyone sees my painters anywhere, please let me know. Then maybe we'll get this playground done!", "Looks like I'll have to finish this sign myself.", 'The documents for this project were just sitting right by this tunnel... Where could they have gone?' ) self.painterPeteSpeech = Sequence() for speechText in speechTextList: self.painterPeteSpeech.append( Func(self.painterPete.setChatAbsolute, speechText, CFSpeech)) self.painterPeteSpeech.append( Wait(0.55 * len(speechText.split(' ')))) self.painterPeteSpeech.append( Func(self.painterPete.clearChat)) self.painterPeteSpeech.append(Wait(6)) self.painterPeteSpeech.loop(0)
def load(self): CogdoGameMovie.load(self) self.toonDNA = ToonDNA.ToonDNA() self.toonDNA.newToonFromProperties('dss', 'ss', 'm', 'm', 2, 0, 2, 2, 1, 8, 1, 8, 1, 14) self.toonHead = Toon.Toon() self.toonHead.setDNA(self.toonDNA) self.makeSuit('sc') self.toonHead.getGeomNode().setDepthWrite(1) self.toonHead.getGeomNode().setDepthTest(1) self.toonHead.loop('neutral') self.toonHead.setPosHprScale(-0.73, 0, -1.27, 180, 0, 0, 0.18, 0.18, 0.18) self.toonHead.reparentTo(hidden) self.toonHead.startBlink() self.cogHead = Suit.Suit() self.cogDNA = SuitDNA.SuitDNA() self.cogDNA.newSuit('ms') self.cogHead.setDNA(self.cogDNA) self.cogHead.getGeomNode().setDepthWrite(1) self.cogHead.getGeomNode().setDepthTest(1) self.cogHead.loop('neutral') self.cogHead.setPosHprScale(-0.73, 0, -1.46, 180, 0, 0, 0.14, 0.14, 0.14) self.cogHead.reparentTo(hidden) self.clipPlane = self.toonHead.attachNewNode(PlaneNode('clip')) self.clipPlane.node().setPlane(Plane(0, 0, 1, 0)) self.clipPlane.setPos(0, 0, 2.45) audioMgr = base.cogdoGameAudioMgr self._cogDialogueSfx = audioMgr.createSfx('cogDialogue') self._toonDialogueSfx = audioMgr.createSfx('toonDialogue') suitData = Globals.SuitData[Globals.SuitTypes.Boss] bossSuit = Suit.Suit() d = SuitDNA.SuitDNA() d.newSuit(suitData['dnaName']) bossSuit.setDNA(d) bossSuit.setScale(suitData['scale']) bossSuit.loop('neutral') bossSuit.reparentTo(render) bossSuit.setPos(self._exit, -5, -5, 0) bossSuit.lookAt(self._exit) self._suits.append(bossSuit) self._camHelperNode = NodePath('CamHelperNode') self._camHelperNode.reparentTo(render) dialogue = TTLocalizer.CogdoMazeIntroMovieDialogue introDuration = Globals.IntroDurationSeconds waitDuration = introDuration / len(dialogue) def start(): camera.wrtReparentTo(render) self._exit.open(animate=False) def showBoss(): self._setCamTarget(bossSuit, 20, offset=Point3(0, 0, 7), angle=Point3(0, 15, 0)) bossSuit.loop('victory') self._state = 1 def showExit(): self._setCamTarget(self._exit, 10, offset=Point3(0, 0, 0), angle=Point3(0, 60, 0)) self._exit.close() self._state = 2 showExitIval = Parallel( camera.posInterval(waitDuration * 0.5, (10, -25, 20), other=self._exit, blendType='easeInOut'), Sequence( Wait(waitDuration * 0.25), Func(bossSuit.play, 'effort'), camera.hprInterval(waitDuration * 0.25, (30, -30, 0), blendType='easeInOut'), Func(self._exit.close), Wait(waitDuration * 0.5))) def showWaterCooler(): wc = self._maze.getWaterCoolers()[0] self._setCamTarget(wc, 25, angle=Point3(-30, 60, 0)) camera.wrtReparentTo(self._camHelperNode) self._state = 3 def end(): self._stopUpdateTask() self._ival = Sequence( Func(start), Func(self.displayLine, 'toon', self._getRandomLine(dialogue[0])), showExitIval, Func(showWaterCooler), Func(self.displayLine, 'toon', self._getRandomLine(dialogue[1])), Wait(waitDuration), Func(showBoss), bossSuit.hprInterval(1.0, bossSuit.getHpr() + Point3(180, 0, 0), blendType='easeInOut'), Func(self.displayLine, 'toon', self._getRandomLine(dialogue[2])), Wait(waitDuration - 1.0), Func(end)) self._startUpdateTask()
def begin(self, range, label, gui, tipCategory, zoneId): info = self.textures[ZoneUtil.isCogHQZone(zoneId) if zoneId else 2] self.waitBar['range'] = range self.title['text'] = label self.__count = 0 self.__expectedCount = range if gui: if base.localAvatarStyle: from toontown.toon import Toon bored = { 'emote': 'bored', 'frame': 135 } #must define before list run = {'emote': 'run', 'frame': 7} victory = {'emote': 'victory', 'frame': 10} applause = {'emote': 'applause', 'frame': 23} dust = {'emote': 'sprinkle-dust', 'frame': 40} hypno = {'emote': 'hypnotize', 'frame': 25} cringe = {'emote': 'cringe', 'frame': 25} wave = {'emote': 'wave', 'frame': 25} shrug = {'emote': 'shrug', 'frame': 30} duck = {'emote': 'duck', 'frame': 40} up = {'emote': 'up', 'frame': 60} pushup = {'emote': 'down', 'frame': 23} bow = {'emote': 'bow', 'frame': 45} emotelist = [ bored, run, victory, applause, dust, hypno, cringe, wave, shrug, duck, up, pushup, bow ] emotechosen = random.choice(emotelist) self.toon = Toon.Toon() self.toon.setDNA(base.localAvatarStyle) self.toon.pose(emotechosen['emote'], emotechosen['frame']) self.toon.getGeomNode().setDepthWrite(1) self.toon.getGeomNode().setDepthTest(1) self.toon.setHpr(205, 0, 0) self.toon.setScale(0.18) self.toon.setPos(base.a2dBottomRight.getX() / 1.25, 0, -0.034) self.toon.reparentTo(self.waitBar) self.waitBar['frameSize'] = (base.a2dLeft + (base.a2dRight / 4.95), base.a2dRight - (base.a2dRight / 4.95), -0.03, 0.03) self.title['text_font'] = info[1] self.title['text_fg'] = info[2] self.title.reparentTo(base.a2dpBottomLeft, LOADING_SCREEN_SORT_INDEX) self.title.setPos(base.a2dRight / 5, 0, 0.235) self.tip['text'] = self.getTip(tipCategory) self.gui.setPos(0, -0.1, 0) self.gui.reparentTo(aspect2d, LOADING_SCREEN_SORT_INDEX) self.gui.setTexture(info[0], 1) self.logo.reparentTo(base.a2dpTopCenter, LOADING_SCREEN_SORT_INDEX) else: self.title.reparentTo(base.a2dpBottomLeft, LOADING_SCREEN_SORT_INDEX) self.gui.reparentTo(hidden) self.logo.reparentTo(hidden) self.tip.reparentTo(base.a2dpBottomCenter, LOADING_SCREEN_SORT_INDEX) self.waitBar.reparentTo(base.a2dpBottomCenter, LOADING_SCREEN_SORT_INDEX) self.waitBar.update(self.__count)
def load(self): gui = loader.loadModel('phase_3/models/gui/tt_m_gui_mat_mainGui') gui.flattenMedium() guiAcceptUp = gui.find('**/tt_t_gui_mat_okUp') guiAcceptUp.flattenStrong() guiAcceptDown = gui.find('**/tt_t_gui_mat_okDown') guiAcceptDown.flattenStrong() guiCancelUp = gui.find('**/tt_t_gui_mat_closeUp') guiCancelUp.flattenStrong() guiCancelDown = gui.find('**/tt_t_gui_mat_closeDown') guiCancelDown.flattenStrong() guiNextUp = gui.find('**/tt_t_gui_mat_nextUp') guiNextUp.flattenStrong() guiNextDown = gui.find('**/tt_t_gui_mat_nextDown') guiNextDown.flattenStrong() guiNextDisabled = gui.find('**/tt_t_gui_mat_nextDisabled') guiNextDisabled.flattenStrong() skipTutorialUp = gui.find('**/tt_t_gui_mat_skipUp') skipTutorialUp.flattenStrong() skipTutorialDown = gui.find('**/tt_t_gui_mat_skipDown') skipTutorialDown.flattenStrong() rotateUp = gui.find('**/tt_t_gui_mat_arrowRotateUp') rotateUp.flattenStrong() rotateDown = gui.find('**/tt_t_gui_mat_arrowRotateDown') rotateDown.flattenStrong() self.guiTopBar = DirectFrame(relief=None, text=TTLocalizer.CreateYourToon, text_font=ToontownGlobals.getSignFont(), text_fg=(0.0, 0.65, 0.35, 1), text_scale=0.18, text_pos=(0, -0.03), pos=(0, 0, 0.86)) self.guiTopBar.hide() self.guiBottomBar = DirectFrame(relief=None, image_scale=(1.25, 1, 1), pos=(0.01, 0, -0.86)) self.guiBottomBar.hide() self.guiCheckButton = DirectButton( parent=self.guiBottomBar, relief=None, image=(guiAcceptUp, guiAcceptDown, guiAcceptUp, guiAcceptDown), image_scale=halfButtonScale, image1_scale=halfButtonHoverScale, image2_scale=halfButtonHoverScale, pos=(1.165, 0, -0.018), command=self.__handleNext, text=('', TTLocalizer.MakeAToonDone, TTLocalizer.MakeAToonDone), text_font=ToontownGlobals.getInterfaceFont(), text_scale=0.08, text_align=TextNode.ARight, text_pos=(0.075, 0.13), text_fg=(1, 1, 1, 1), text_shadow=(0, 0, 0, 1)) self.guiCheckButton.setPos(-0.13, 0, 0.13) self.guiCheckButton.reparentTo(base.a2dBottomRight) self.guiCheckButton.hide() self.guiCancelButton = DirectButton( parent=self.guiBottomBar, relief=None, image=(guiCancelUp, guiCancelDown, guiCancelUp, guiCancelDown), image_scale=halfButtonScale, image1_scale=halfButtonHoverScale, image2_scale=halfButtonHoverScale, pos=(-1.179, 0, -0.011), command=self.__handleCancel, text=('', TTLocalizer.MakeAToonCancel, TTLocalizer.MakeAToonCancel), text_font=ToontownGlobals.getInterfaceFont(), text_scale=TTLocalizer.MATguiCancelButton, text_pos=(0, 0.115), text_fg=(1, 1, 1, 1), text_shadow=(0, 0, 0, 1)) self.guiCancelButton.setPos(0.13, 0, 0.13) self.guiCancelButton.reparentTo(base.a2dBottomLeft) self.guiCancelButton.hide() self.guiNextButton = DirectButton( parent=self.guiBottomBar, relief=None, image=(guiNextUp, guiNextDown, guiNextUp, guiNextDisabled), image_scale=(0.3, 0.3, 0.3), image1_scale=(0.35, 0.35, 0.35), image2_scale=(0.35, 0.35, 0.35), pos=(1.165, 0, -0.018), command=self.__handleNext, text=('', TTLocalizer.MakeAToonNext, TTLocalizer.MakeAToonNext, ''), text_font=ToontownGlobals.getInterfaceFont(), text_scale=TTLocalizer.MATguiNextButton, text_pos=(0, 0.115), text_fg=(1, 1, 1, 1), text_shadow=(0, 0, 0, 1)) self.guiNextButton.setPos(-0.13, 0, 0.13) self.guiNextButton.reparentTo(base.a2dBottomRight) self.guiNextButton.hide() self.guiLastButton = DirectButton( parent=self.guiBottomBar, relief=None, image=(guiNextUp, guiNextDown, guiNextUp, guiNextDown), image3_color=Vec4(0.5, 0.5, 0.5, 0.75), image_scale=(-0.3, 0.3, 0.3), image1_scale=(-0.35, 0.35, 0.35), image2_scale=(-0.35, 0.35, 0.35), pos=(0.825, 0, -0.018), command=self.__handleLast, text=('', TTLocalizer.MakeAToonLast, TTLocalizer.MakeAToonLast, ''), text_font=ToontownGlobals.getInterfaceFont(), text_scale=0.08, text_pos=(0, 0.115), text_fg=(1, 1, 1, 1), text_shadow=(0, 0, 0, 1)) self.guiLastButton.setPos(-0.37, 0, 0.13) self.guiLastButton.reparentTo(base.a2dBottomRight) self.guiLastButton.hide() self.rotateLeftButton = DirectButton(parent=self.guiBottomBar, relief=None, image=(rotateUp, rotateDown, rotateUp, rotateDown), image_scale=(-0.4, 0.4, 0.4), image1_scale=(-0.5, 0.5, 0.5), image2_scale=(-0.5, 0.5, 0.5), pos=(-0.355, 0, 0.36)) self.rotateLeftButton.flattenMedium() self.rotateLeftButton.reparentTo(base.a2dBottomCenter) self.rotateLeftButton.hide() self.rotateLeftButton.bind(DGG.B1PRESS, self.rotateToonLeft) self.rotateLeftButton.bind(DGG.B1RELEASE, self.stopToonRotateLeftTask) self.rotateRightButton = DirectButton(parent=self.guiBottomBar, relief=None, image=(rotateUp, rotateDown, rotateUp, rotateDown), image_scale=(0.4, 0.4, 0.4), image1_scale=(0.5, 0.5, 0.5), image2_scale=(0.5, 0.5, 0.5), pos=(0.355, 0, 0.36)) self.rotateRightButton.flattenStrong() self.rotateRightButton.reparentTo(base.a2dBottomCenter) self.rotateRightButton.hide() self.rotateRightButton.bind(DGG.B1PRESS, self.rotateToonRight) self.rotateRightButton.bind(DGG.B1RELEASE, self.stopToonRotateRightTask) gui.removeNode() self.roomDropActor = Actor() self.roomDropActor.loadModel('phase_3/models/makeatoon/roomAnim_model') self.roomDropActor.loadAnims( {'drop': 'phase_3/models/makeatoon/roomAnim_roomDrop'}) self.roomDropActor.reparentTo(render) self.dropJoint = self.roomDropActor.find('**/droppingJoint') self.roomSquishActor = Actor() self.roomSquishActor.loadModel( 'phase_3/models/makeatoon/roomAnim_model') self.roomSquishActor.loadAnims( {'squish': 'phase_3/models/makeatoon/roomAnim_roomSquish'}) self.roomSquishActor.reparentTo(render) self.squishJoint = self.roomSquishActor.find('**/scalingJoint') self.propSquishActor = Actor() self.propSquishActor.loadModel( 'phase_3/models/makeatoon/roomAnim_model') self.propSquishActor.loadAnims( {'propSquish': 'phase_3/models/makeatoon/roomAnim_propSquish'}) self.propSquishActor.reparentTo(render) self.propSquishActor.pose('propSquish', 0) self.propJoint = self.propSquishActor.find('**/propJoint') self.spotlightActor = Actor() self.spotlightActor.loadModel( 'phase_3/models/makeatoon/roomAnim_model') self.spotlightActor.loadAnims({ 'spotlightShake': 'phase_3/models/makeatoon/roomAnim_spotlightShake' }) self.spotlightActor.reparentTo(render) self.spotlightJoint = self.spotlightActor.find('**/spotlightJoint') ee = DirectFrame(pos=(-1, 1, 1), frameSize=(-.01, 0.01, -.01, 0.01), frameColor=(0, 0, 0, 0.05), state='normal') ee.bind(DGG.B1PRESS, lambda x, ee=ee: self.toggleSlide()) self.eee = ee self.room = loader.loadModel( 'phase_3/models/makeatoon/tt_m_ara_mat_room') self.room.flattenMedium() self.genderWalls = self.room.find('**/genderWalls') self.genderWalls.flattenStrong() self.genderProps = self.room.find('**/genderProps') self.genderProps.flattenStrong() self.bodyWalls = self.room.find('**/bodyWalls') self.bodyWalls.flattenStrong() self.bodyProps = self.room.find('**/bodyProps') self.bodyProps.flattenStrong() self.colorWalls = self.room.find('**/colorWalls') self.colorWalls.flattenStrong() self.colorProps = self.room.find('**/colorProps') self.colorProps.flattenStrong() self.clothesWalls = self.room.find('**/clothWalls') self.clothesWalls.flattenMedium() self.clothesProps = self.room.find('**/clothProps') self.clothesProps.flattenMedium() self.nameWalls = self.room.find('**/nameWalls') self.nameWalls.flattenStrong() self.nameProps = self.room.find('**/nameProps') self.nameProps.flattenStrong() self.background = self.room.find('**/background') self.background.flattenStrong() self.background.reparentTo(render) self.floor = self.room.find('**/floor') self.floor.flattenStrong() self.floor.reparentTo(render) self.spotlight = self.room.find('**/spotlight') self.spotlight.reparentTo(self.spotlightJoint) self.spotlight.setColor(1, 1, 1, 0.3) self.spotlight.setPos(1.18, -1.27, 0.41) self.spotlight.setScale(2.6) self.spotlight.setHpr(0, 0, 0) smokeSeqNode = SequenceNode('smoke') smokeModel = loader.loadModel( 'phase_3/models/makeatoon/tt_m_ara_mat_smoke') smokeFrameList = list(smokeModel.findAllMatches('**/smoke_*')) smokeFrameList.reverse() for smokeFrame in smokeFrameList: smokeSeqNode.addChild(smokeFrame.node()) smokeSeqNode.setFrameRate(12) self.smoke = render.attachNewNode(smokeSeqNode) self.smoke.setScale(1, 1, 0.75) self.smoke.hide() if self.warp: self.dna = ToonDNA.ToonDNA() self.dna.makeFromNetString(self.namelessPotAv.dna) self.toon = Toon.Toon() self.toon.setDNA(self.dna) self.toon.useLOD(1000) self.toon.setNameVisible(0) self.toon.startBlink() self.toon.startLookAround() self.gs.load() self.bs.load() self.cos.load() self.cls.load() self.ns.load() self.music = base.loader.loadMusic( 'phase_3/audio/bgm/create_a_toon.ogg') self.musicVolume = base.config.GetFloat('makeatoon-music-volume', 1) self.sfxVolume = base.config.GetFloat('makeatoon-sfx-volume', 1) self.soundBack = base.loader.loadSfx( 'phase_3/audio/sfx/GUI_create_toon_back.ogg') self.crashSounds = map(base.loader.loadSfx, [ 'phase_3/audio/sfx/tt_s_ara_mat_crash_boing.ogg', 'phase_3/audio/sfx/tt_s_ara_mat_crash_glassBoing.ogg', 'phase_3/audio/sfx/tt_s_ara_mat_crash_wood.ogg', 'phase_3/audio/sfx/tt_s_ara_mat_crash_woodBoing.ogg', 'phase_3/audio/sfx/tt_s_ara_mat_crash_woodGlass.ogg' ])
def playTutorialReward_3(self, value): self.tutRewardDialog_2.cleanup() from toontown.toon import Toon from toontown.toon import ToonDNA def doneChat1(page, elapsed=0): self.track2.start() def doneChat2(elapsed): self.track2.pause() self.track3.start() def uniqueName(hook): return "TutorialTom-" + hook self.tutorialTom = Toon.Toon() dna = ToonDNA.ToonDNA() dnaList = ("dls", "ms", "m", "m", 7, 0, 7, 7, 2, 6, 2, 6, 2, 16) dna.newToonFromProperties(*dnaList) self.tutorialTom.setDNA(dna) self.tutorialTom.setName(TTLocalizer.NPCToonNames[20000]) self.tutorialTom.uniqueName = uniqueName if ConfigVariableString("language", "english").getValue() == "japanese": self.tomDialogue03 = base.loader.loadSfx( "phase_3.5/audio/dial/CC_tom_movie_tutorial_reward01.mp3") self.tomDialogue04 = base.loader.loadSfx( "phase_3.5/audio/dial/CC_tom_movie_tutorial_reward02.mp3") self.tomDialogue05 = base.loader.loadSfx( "phase_3.5/audio/dial/CC_tom_movie_tutorial_reward03.mp3") self.musicVolume = ConfigVariableDouble("tutorial-music-volume", 0.5).getValue() else: self.tomDialogue03 = None self.tomDialogue04 = None self.tomDialogue05 = None self.musicVolume = 0.9 # Need to lower battle music during dialogue music = base.cr.playGame.place.loader.battleMusic # import pdb; pdb.set_trace() # Quest list is generated in playTutorialReward before the avatar's quest description # is updated to reflect defeating the flunky if self.questList: self.track1 = Sequence( Wait(1.0), Func(self.rewardPanel.initQuestFrame, base.localAvatar, copy.deepcopy(base.localAvatar.quests)), Wait(1.0), Sequence(*self.questList), Wait(1.0), Func(self.rewardPanel.hide), Func(camera.setPosHpr, render, 34, 19.88, 3.48, -90, -2.36, 0), Func(base.localAvatar.animFSM.request, "neutral"), Func(base.localAvatar.setPosHpr, 40.31, 22.00, -0.47, 150.00, 360.00, 0.00), Wait(0.5), Func(self.tutorialTom.reparentTo, render), Func(self.tutorialTom.show), Func(self.tutorialTom.setPosHpr, 40.29, 17.9, -0.47, 11.31, 0.00, 0.07), Func(self.tutorialTom.animFSM.request, 'TeleportIn'), Wait(1.5169999999999999), Func(self.tutorialTom.animFSM.request, 'neutral'), Func(self.acceptOnce, self.tutorialTom.uniqueName("doneChatPage"), doneChat1), Func(self.tutorialTom.addActive), Func(music.setVolume, self.musicVolume), Func(self.tutorialTom.setLocalPageChat, TTLocalizer.MovieTutorialReward3, 0, None, [self.tomDialogue03]), name='tutorial-reward-3a') self.track2 = Sequence( Func(self.acceptOnce, self.tutorialTom.uniqueName("doneChatPage"), doneChat2), Func(self.tutorialTom.setLocalPageChat, TTLocalizer.MovieTutorialReward4, 1, None, [self.tomDialogue04]), Func(self.tutorialTom.setPlayRate, 1.5, "right-hand-start"), Func(self.tutorialTom.play, "right-hand-start"), Wait(self.tutorialTom.getDuration("right-hand-start") / 1.5), Func(self.tutorialTom.loop, "right-hand"), name='tutorial-reward-3b') self.track3 = Parallel( Sequence(Func(self.tutorialTom.setPlayRate, -1.8, "right-hand-start"), Func(self.tutorialTom.play, "right-hand-start"), Wait( self.tutorialTom.getDuration("right-hand-start") / 1.8), Func(self.tutorialTom.animFSM.request, 'neutral'), name='tutorial-reward-3ca'), Sequence(Wait(0.5), Func(self.tutorialTom.setChatAbsolute, TTLocalizer.MovieTutorialReward5, CFSpeech | CFTimeout, self.tomDialogue05), Wait(1.0), Func(self.tutorialTom.animFSM.request, 'TeleportOut'), Wait(self.tutorialTom.getDuration("teleport")), Wait(1.0), Func(self.playTutorialReward_4, 0), name='tutorial-reward-3cb'), name='tutorial-reward-3c') self.track1.start() else: self.playTutorialReward_4(0) return