from direct.actor.Actor import Actor from direct.directnotify import DirectNotifyGlobal from direct.fsm import ClassicFSM, State from direct.fsm import State from direct.fsm import StateData from direct.gui.DirectGui import * from direct.interval.IntervalGlobal import * from direct.task import Task from pandac.PandaModules import * import random import BodyShop import ColorShop import GenderShop from MakeAToonGlobals import * import MakeClothesGUI import NameShop from otp.avatar import Avatar from toontown.chat.ChatGlobals import * from toontown.distributed.ToontownMsgTypes import * from toontown.toon import LocalToon from toontown.toon import Toon from toontown.toon import ToonDNA from toontown.toonbase import TTLocalizer from toontown.toonbase import ToontownGlobals from toontown.toontowngui import TTDialog class MakeAToon(StateData.StateData): notify = DirectNotifyGlobal.directNotify.newCategory('MakeAToon') def __init__(self, parentFSM, avList, doneEvent, index): StateData.StateData.__init__(self, doneEvent) self.phase = 3 self.names = ['', '', '', ''] self.dnastring = None self.dna = None self.progressing = 0 self.toonPosition = Point3(-1.62, -3.49, 0) self.toonScale = Point3(1, 1, 1) self.toonHpr = Point3(180, 0, 0) self.leftTime = 1.6 self.rightTime = 1 self.slide = 0 self.nameList = [] self.warp = 0 for av in avList: if av.position == index: self.warp = 1 self.namelessPotAv = av self.nameList.append(av.name) self.fsm = ClassicFSM.ClassicFSM('MakeAToon', [State.State('Init', self.enterInit, self.exitInit, ['GenderShop', 'NameShop']), State.State('GenderShop', self.enterGenderShop, self.exitGenderShop, ['BodyShop']), State.State('BodyShop', self.enterBodyShop, self.exitBodyShop, ['GenderShop', 'ColorShop']), State.State('ColorShop', self.enterColorShop, self.exitColorShop, ['BodyShop', 'ClothesShop']), State.State('ClothesShop', self.enterClothesShop, self.exitClothesShop, ['ColorShop', 'NameShop']), State.State('NameShop', self.enterNameShop, self.exitNameShop, ['ClothesShop']), State.State('Done', self.enterDone, self.exitDone, [])], 'Init', 'Done') self.parentFSM = parentFSM self.parentFSM.getStateNamed('createAvatar').addChild(self.fsm) self.gs = GenderShop.GenderShop(self, 'GenderShop-done') self.bs = BodyShop.BodyShop('BodyShop-done') self.cos = ColorShop.ColorShop('ColorShop-done') self.cls = MakeClothesGUI.MakeClothesGUI('ClothesShop-done') self.ns = NameShop.NameShop(self, 'NameShop-done', avList, index, True) self.shop = GENDERSHOP self.shopsVisited = [] if self.warp: self.shopsVisited = [ GENDERSHOP, BODYSHOP, COLORSHOP, CLOTHESSHOP, ] self.music = None self.soundBack = None self.fsm.enterInitialState() self.hprDelta = -1 self.dropIval = None self.roomSquishIval = None self.propSquishIval = None self.focusOutIval = None self.focusInIval = None self.toon = None def getToon(self): return self.toon def enter(self): self.notify.debug('Starting Make A Toon.') if base.config.GetBool('want-qa-regression', 0): self.notify.info('QA-REGRESSION: MAKEATOON: Starting Make A Toon') base.camLens.setMinFov(ToontownGlobals.MakeAToonCameraFov/(4./3.)) base.playMusic(self.music, looping=1, volume=self.musicVolume) camera.setPosHpr(-5.7, -12.3501, 2.15, -24.8499, 2.73, 0) if self.warp: if self.toon.style.torso[1] == 's': self.toon.gender = 's' else: self.toon.gender = 'd' self.toon.reparentTo(render) self.toon.loop('neutral') self.toon.setScale(self.toonScale) self.spotlight.setPos(2, -1.95, 0.41) self.toon.setPos(Point3(1.5, -4, 0)) self.toon.setH(120) self.guiTopBar.show() self.guiBottomBar.show() self.guiCancelButton.show() if self.warp: self.progressing = 0 self.guiLastButton.hide() self.fsm.request('NameShop') else: self.fsm.request('GenderShop') def exit(self): base.camLens.setMinFov(ToontownGlobals.DefaultCameraFov/(4./3.)) self.guiTopBar.hide() self.guiBottomBar.hide() self.music.stop() self.fsm.request('Done') self.room.reparentTo(hidden) 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.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.loadSfx('phase_3/audio/sfx/GUI_create_toon_back.ogg') self.crashSounds = map(base.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 unload(self): self.exit() if self.toon: self.toon.stopBlink() self.toon.stopLookAroundNow() self.gs.unload() self.bs.unload() self.cos.unload() self.cls.unload() self.ns.unload() del self.gs del self.bs del self.cos del self.cls del self.ns self.guiTopBar.destroy() self.guiBottomBar.destroy() self.guiCancelButton.destroy() self.guiCheckButton.destroy() self.eee.destroy() self.guiNextButton.destroy() self.guiLastButton.destroy() self.rotateLeftButton.destroy() self.rotateRightButton.destroy() del self.guiTopBar del self.guiBottomBar del self.guiCancelButton del self.guiCheckButton del self.eee del self.guiNextButton del self.guiLastButton del self.rotateLeftButton del self.rotateRightButton del self.names del self.dnastring del self.nameList del self.music del self.soundBack del self.dna if self.toon: self.toon.delete() del self.toon self.cleanupDropIval() self.cleanupRoomSquishIval() self.cleanupPropSquishIval() self.cleanupFocusInIval() self.cleanupFocusOutIval() self.room.removeNode() del self.room self.genderWalls.removeNode() self.genderProps.removeNode() del self.genderWalls del self.genderProps self.bodyWalls.removeNode() self.bodyProps.removeNode() del self.bodyWalls del self.bodyProps self.colorWalls.removeNode() self.colorProps.removeNode() del self.colorWalls del self.colorProps self.clothesWalls.removeNode() self.clothesProps.removeNode() del self.clothesWalls del self.clothesProps self.nameWalls.removeNode() self.nameProps.removeNode() del self.nameWalls del self.nameProps self.background.removeNode() del self.background self.floor.removeNode() del self.floor self.spotlight.removeNode() del self.spotlight self.smoke.removeNode() del self.smoke while len(self.crashSounds): del self.crashSounds[0] self.parentFSM.getStateNamed('createAvatar').removeChild(self.fsm) del self.parentFSM del self.fsm self.ignoreAll() loader.unloadModel('phase_3/models/gui/create_a_toon_gui') loader.unloadModel('phase_3/models/gui/create_a_toon') ModelPool.garbageCollect() TexturePool.garbageCollect() def getDNA(self): return self.dnastring def __handleBodyShop(self): self.fsm.request('BodyShop') def __handleClothesShop(self): self.fsm.request('ClothesShop') def __handleColorShop(self): self.fsm.request('ColorShop') def __handleNameShop(self): self.fsm.request('NameShop') def __handleCancel(self): self.doneStatus = 'cancel' self.shopsVisited = [] base.transitions.fadeOut(finishIval=EventInterval(self.doneEvent)) def toggleSlide(self): self.slide = 1 - self.slide def goToNextShop(self): self.progressing = 1 if self.shop == GENDERSHOP: self.fsm.request('BodyShop') elif self.shop == BODYSHOP: self.fsm.request('ColorShop') elif self.shop == COLORSHOP: self.fsm.request('ClothesShop') else: self.fsm.request('NameShop') def goToLastShop(self): self.progressing = 0 if self.shop == BODYSHOP: self.fsm.request('GenderShop') elif self.shop == COLORSHOP: self.fsm.request('BodyShop') elif self.shop == CLOTHESSHOP: self.fsm.request('ColorShop') else: self.fsm.request('ClothesShop') def enterInit(self): pass def exitInit(self): pass def enterGenderShop(self): self.shop = GENDERSHOP if GENDERSHOP not in self.shopsVisited: self.shopsVisited.append(GENDERSHOP) self.genderWalls.reparentTo(self.squishJoint) self.genderProps.reparentTo(self.propJoint) self.roomSquishActor.pose('squish', 0) self.guiNextButton['state'] = DGG.DISABLED else: self.dropRoom(self.genderWalls, self.genderProps) self.guiTopBar['text'] = TTLocalizer.CreateYourToonTitle self.guiTopBar['text_fg'] = (1, 0.92, 0.2, 1) self.guiTopBar['text_scale'] = TTLocalizer.MATenterGenderShop base.transitions.fadeIn() self.accept('GenderShop-done', self.__handleGenderShopDone) self.gs.enter() self.guiNextButton.show() self.gs.showButtons() self.rotateLeftButton.hide() self.rotateRightButton.hide() def exitGenderShop(self): self.squishRoom(self.genderWalls) self.squishProp(self.genderProps) self.gs.exit() self.ignore('GenderShop-done') def __handleGenderShopDone(self): self.guiNextButton.hide() self.gs.hideButtons() self.goToNextShop() def bodyShopOpening(self): self.bs.showButtons() self.guiNextButton.show() self.guiLastButton.show() self.rotateLeftButton.show() self.rotateRightButton.show() def enterBodyShop(self): self.toon.show() self.shop = BODYSHOP self.guiTopBar['text'] = TTLocalizer.ShapeYourToonTitle self.guiTopBar['text_fg'] = (0.0, 0.98, 0.5, 1) self.guiTopBar['text_scale'] = TTLocalizer.MATenterBodyShop self.accept('BodyShop-done', self.__handleBodyShopDone) self.dropRoom(self.bodyWalls, self.bodyProps) self.bs.enter(self.toon, self.shopsVisited) if BODYSHOP not in self.shopsVisited: self.shopsVisited.append(BODYSHOP) self.bodyShopOpening() def exitBodyShop(self): self.squishRoom(self.bodyWalls) self.squishProp(self.bodyProps) self.bs.exit() self.ignore('BodyShop-done') def __handleBodyShopDone(self): self.guiNextButton.hide() self.guiLastButton.hide() if self.bs.doneStatus == 'next': self.bs.hideButtons() self.goToNextShop() else: self.bs.hideButtons() self.goToLastShop() def colorShopOpening(self): self.cos.showButtons() self.guiNextButton.show() self.guiLastButton.show() self.rotateLeftButton.show() self.rotateRightButton.show() def enterColorShop(self): self.shop = COLORSHOP self.guiTopBar['text'] = TTLocalizer.PaintYourToonTitle self.guiTopBar['text_fg'] = (0, 1, 1, 1) self.guiTopBar['text_scale'] = TTLocalizer.MATenterColorShop self.accept('ColorShop-done', self.__handleColorShopDone) self.dropRoom(self.colorWalls, self.colorProps) self.toon.setPos(self.toonPosition) self.colorShopOpening() self.cos.enter(self.toon, self.shopsVisited) if COLORSHOP not in self.shopsVisited: self.shopsVisited.append(COLORSHOP) def exitColorShop(self): self.squishRoom(self.colorWalls) self.squishProp(self.colorProps) self.cos.exit() self.ignore('ColorShop-done') def __handleColorShopDone(self): self.guiNextButton.hide() self.guiLastButton.hide() if self.cos.doneStatus == 'next': self.cos.hideButtons() self.goToNextShop() else: self.cos.hideButtons() self.goToLastShop() def clothesShopOpening(self): self.guiNextButton.show() self.guiLastButton.show() self.cls.showButtons() self.rotateLeftButton.show() self.rotateRightButton.show() def enterClothesShop(self): self.shop = CLOTHESSHOP self.guiTopBar['text'] = TTLocalizer.PickClothesTitle self.guiTopBar['text_fg'] = (1, 0.92, 0.2, 1) self.guiTopBar['text_scale'] = TTLocalizer.MATenterClothesShop self.accept('ClothesShop-done', self.__handleClothesShopDone) self.dropRoom(self.clothesWalls, self.clothesProps) self.toon.setScale(self.toonScale) self.toon.setPos(self.toonPosition) if not self.progressing: self.toon.setHpr(self.toonHpr) self.clothesShopOpening() self.cls.enter(self.toon) if CLOTHESSHOP not in self.shopsVisited: self.shopsVisited.append(CLOTHESSHOP) def exitClothesShop(self): self.squishRoom(self.clothesWalls) self.squishProp(self.clothesProps) self.cls.exit() self.ignore('ClothesShop-done') def __handleClothesShopDone(self): self.guiNextButton.hide() self.guiLastButton.hide() if self.cls.doneStatus == 'next': self.cls.hideButtons() self.goToNextShop() else: self.cls.hideButtons() self.goToLastShop() def nameShopOpening(self, task): self.guiCheckButton.show() self.guiLastButton.show() if self.warp: self.guiLastButton.hide() if NAMESHOP not in self.shopsVisited: self.shopsVisited.append(NAMESHOP) return Task.done def enterNameShop(self): self.shop = NAMESHOP self.guiTopBar['text'] = TTLocalizer.NameToonTitle self.guiTopBar['text_fg'] = (0.0, 0.98, 0.5, 1) self.guiTopBar['text_scale'] = TTLocalizer.MATenterNameShop self.accept('NameShop-done', self.__handleNameShopDone) self.dropRoom(self.nameWalls, self.nameProps) self.spotlight.setPos(2, -1.95, 0.41) self.toon.setPos(Point3(1.5, -4, 0)) self.toon.setH(120) self.rotateLeftButton.hide() self.rotateRightButton.hide() if self.progressing: waittime = self.leftTime else: waittime = 0.2 self.ns.enter(self.toon, self.nameList, self.warp) taskMgr.doMethodLater(waittime, self.nameShopOpening, 'nameShopOpeningTask') def exitNameShop(self): self.squishRoom(self.nameWalls) self.squishProp(self.nameProps) self.spotlight.setPos(1.18, -1.27, 0.41) self.ns.exit() self.ignore('NameShop-done') taskMgr.remove('nameShopOpeningTask') def rejectName(self): self.ns.rejectName(TTLocalizer.RejectNameText) def __handleNameShopDone(self): if base.config.GetBool('want-qa-regression', 0): self.notify.info('QA-REGRESSION: MAKEATOON: Creating A Toon') self.guiLastButton.hide() self.guiCheckButton.hide() if self.ns.getDoneStatus() == 'last': self.ns.hideAll() self.goToLastShop() else: self.doneStatus = 'created' base.transitions.fadeOut(finishIval=EventInterval(self.doneEvent)) def __handleNext(self): messenger.send('next') def __handleLast(self): messenger.send('last') def __handleSkipTutorial(self): messenger.send('skipTutorial') def enterDone(self): pass def exitDone(self): pass def create3DGui(self): self.proto = loader.loadModel('phase_3/models/makeatoon/tt_m_ara_mat_protoMachine') self.proto.setScale(0.2) self.proto.reparentTo(render) def setup3DPicker(self): self.accept('mouse1', self.mouseDown) self.accept('mouse1-up', self.mouseUp) self.pickerQueue = CollisionHandlerQueue() self.pickerTrav = CollisionTraverser('MousePickerTraverser') self.pickerTrav.setRespectPrevTransform(True) self.pickerNode = CollisionNode('mouseRay') self.pickerNP = camera.attachNewNode(self.pickerNode) self.pickerNode.setFromCollideMask(GeomNode.getDefaultCollideMask()) self.pickerRay = CollisionRay() self.pickerNode.addSolid(self.pickerRay) self.pickerTrav.addCollider(self.pickerNP, self.pickerQueue) def mouseDown(self): self.notify.debug('Mouse 1 Down') mpos = base.mouseWatcherNode.getMouse() self.pickerRay.setFromLens(base.camNode, mpos.getX(), mpos.getY()) self.pickerTrav.traverse(render) if self.pickerQueue.getNumEntries() > 0: self.pickerQueue.sortEntries() self.pickedObj = self.pickerQueue.getEntry(0).getIntoNodePath() def mouseUp(self): self.notify.debug('Mouse 1 Up') def squishRoom(self, room): if self.roomSquishIval and self.roomSquishIval.isPlaying(): self.roomSquishIval.finish() squishDuration = self.roomSquishActor.getDuration('squish') self.roomSquishIval = Sequence(Func(self.roomSquishActor.play, 'squish'), Wait(squishDuration), Func(room.hide)) self.roomSquishIval.start() def squishProp(self, prop): if not prop.isEmpty(): if self.propSquishIval and self.propSquishIval.isPlaying(): self.propSquishIval.finish() squishDuration = self.propSquishActor.getDuration('propSquish') self.propSquishIval = Sequence(Func(self.propSquishActor.play, 'propSquish'), Wait(squishDuration), Func(prop.hide)) self.propSquishIval.start() def dropRoom(self, walls, props): def propReparentTo(props): if not props.isEmpty(): props.reparentTo(self.propJoint) if self.dropIval and self.dropIval.isPlaying(): self.dropIval.finish() walls.reparentTo(self.dropJoint) walls.show() if not props.isEmpty(): props.reparentTo(self.dropJoint) props.show() dropDuration = self.roomDropActor.getDuration('drop') self.dropIval = Parallel(Sequence(Func(self.roomDropActor.play, 'drop'), Wait(dropDuration), Func(walls.reparentTo, self.squishJoint), Func(propReparentTo, props), Func(self.propSquishActor.pose, 'propSquish', 0), Func(self.roomSquishActor.pose, 'squish', 0)), Sequence(Wait(0.25), Func(self.smoke.show), Func(self.smoke.node().play), LerpColorScaleInterval(self.smoke, 0.5, Vec4(1, 1, 1, 0), startColorScale=Vec4(1, 1, 1, 1)), Func(self.smoke.hide)), Func(self.spotlightActor.play, 'spotlightShake'), Func(self.playRandomCrashSound)) self.dropIval.start() def startFocusOutIval(self): if self.focusInIval.isPlaying(): self.focusInIval.pause() if not self.focusOutIval.isPlaying(): self.focusOutIval = LerpScaleInterval(self.spotlight, 0.25, self.spotlightFinalScale) self.focusOutIval.start() def startFocusInIval(self): if self.focusOutIval.isPlaying(): self.focusOutIval.pause() if not self.focusInIval.isPlaying(): self.focusInIval = LerpScaleInterval(self.spotlight, 0.25, self.spotlightOriginalScale) self.focusInIval.start() def cleanupFocusOutIval(self): if self.focusOutIval: self.focusOutIval.finish() del self.focusOutIval def cleanupFocusInIval(self): if self.focusInIval: self.focusInIval.finish() del self.focusInIval def cleanupDropIval(self): if self.dropIval: self.dropIval.finish() del self.dropIval def cleanupRoomSquishIval(self): if self.roomSquishIval: self.roomSquishIval.finish() del self.roomSquishIval def cleanupPropSquishIval(self): if self.propSquishIval: self.propSquishIval.finish() del self.propSquishIval def setToon(self, toon): self.toon = toon def setNextButtonState(self, state): self.guiNextButton['state'] = state def playRandomCrashSound(self): index = random.randint(0, len(self.crashSounds) - 1) base.playSfx(self.crashSounds[index], volume=self.sfxVolume) def rotateToonLeft(self, event): taskMgr.add(self.rotateToonLeftTask, 'rotateToonLeftTask') def rotateToonLeftTask(self, task): self.toon.setH(self.toon.getH() + self.hprDelta) return task.cont def stopToonRotateLeftTask(self, event): taskMgr.remove('rotateToonLeftTask') def rotateToonRight(self, event): taskMgr.add(self.rotateToonRightTask, 'rotateToonRightTask') def rotateToonRightTask(self, task): self.toon.setH(self.toon.getH() - self.hprDelta) return task.cont def stopToonRotateRightTask(self, event): taskMgr.remove('rotateToonRightTask')