782 lines
31 KiB
Python
782 lines
31 KiB
Python
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 panda3d.core import *
|
|
import random
|
|
|
|
import BodyShop
|
|
import ColorShop
|
|
import GenderShop
|
|
from MakeAToonGlobals import *
|
|
import MakeClothesGUI
|
|
import NameShop
|
|
from otp.avatar import Avatar
|
|
from otp.nametag.NametagConstants 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)
|
|
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(settings['fov']/(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')
|