328 lines
17 KiB
Python
328 lines
17 KiB
Python
from panda3d.core import *
|
|
from toontown.toon import ToonDNA
|
|
from direct.fsm import StateData
|
|
from direct.gui.DirectGui import *
|
|
from MakeAToonGlobals import *
|
|
import random
|
|
from toontown.toonbase import TTLocalizer
|
|
from direct.directnotify import DirectNotifyGlobal
|
|
import ShuffleButton
|
|
|
|
class BodyShop(StateData.StateData):
|
|
notify = DirectNotifyGlobal.directNotify.newCategory('BodyShop')
|
|
|
|
def __init__(self, doneEvent):
|
|
StateData.StateData.__init__(self, doneEvent)
|
|
self.toon = None
|
|
self.torsoChoice = 0
|
|
self.legChoice = 0
|
|
self.headChoice = 0
|
|
self.speciesChoice = 0
|
|
|
|
def enter(self, toon, shopsVisited = []):
|
|
base.disableMouse()
|
|
self.toon = toon
|
|
self.dna = self.toon.getStyle()
|
|
gender = self.toon.style.getGender()
|
|
self.speciesStart = self.getSpeciesStart()
|
|
self.speciesChoice = self.speciesStart
|
|
self.headStart = 0
|
|
self.headChoice = ToonDNA.toonHeadTypes.index(self.dna.head) - ToonDNA.getHeadStartIndex(self.species)
|
|
self.torsoStart = 0
|
|
self.torsoChoice = ToonDNA.toonTorsoTypes.index(self.dna.torso) % 3
|
|
self.legStart = 0
|
|
self.legChoice = ToonDNA.toonLegTypes.index(self.dna.legs)
|
|
if CLOTHESSHOP in shopsVisited:
|
|
self.clothesPicked = 1
|
|
else:
|
|
self.clothesPicked = 0
|
|
self.clothesPicked = 1
|
|
if gender == 'm' or ToonDNA.GirlBottoms[self.dna.botTex][1] == ToonDNA.SHORTS:
|
|
torsoStyle = 's'
|
|
torsoPool = ToonDNA.toonTorsoTypes[:3]
|
|
else:
|
|
torsoStyle = 'd'
|
|
torsoPool = ToonDNA.toonTorsoTypes[3:6]
|
|
self.__swapSpecies(0)
|
|
self.__swapHead(0)
|
|
self.__swapTorso(0)
|
|
self.__swapLegs(0)
|
|
choicePool = [ToonDNA.toonHeadTypes, torsoPool, ToonDNA.toonLegTypes]
|
|
self.shuffleButton.setChoicePool(choicePool)
|
|
self.accept(self.shuffleFetchMsg, self.changeBody)
|
|
self.acceptOnce('last', self.__handleBackward)
|
|
self.accept('next', self.__handleForward)
|
|
self.acceptOnce('MAT-newToonCreated', self.shuffleButton.cleanHistory)
|
|
|
|
def getSpeciesStart(self):
|
|
for species in ToonDNA.toonSpeciesTypes:
|
|
if species == self.dna.head[0]:
|
|
self.species = species
|
|
return ToonDNA.toonSpeciesTypes.index(species)
|
|
|
|
def showButtons(self):
|
|
self.parentFrame.show()
|
|
|
|
def hideButtons(self):
|
|
self.parentFrame.hide()
|
|
|
|
def exit(self):
|
|
try:
|
|
del self.toon
|
|
except:
|
|
self.notify.warning('BodyShop: toon not found')
|
|
|
|
self.hideButtons()
|
|
self.ignore('last')
|
|
self.ignore('next')
|
|
self.ignore('enter')
|
|
self.ignore(self.shuffleFetchMsg)
|
|
|
|
def load(self):
|
|
self.gui = loader.loadModel('phase_3/models/gui/tt_m_gui_mat_mainGui')
|
|
guiRArrowUp = self.gui.find('**/tt_t_gui_mat_arrowUp')
|
|
guiRArrowDown = self.gui.find('**/tt_t_gui_mat_arrowDown')
|
|
guiRArrowRollover = self.gui.find('**/tt_t_gui_mat_arrowUp')
|
|
guiRArrowDisabled = self.gui.find('**/tt_t_gui_mat_arrowDisabled')
|
|
shuffleFrame = self.gui.find('**/tt_t_gui_mat_shuffleFrame')
|
|
shuffleArrowUp = self.gui.find('**/tt_t_gui_mat_shuffleArrowUp')
|
|
shuffleArrowDown = self.gui.find('**/tt_t_gui_mat_shuffleArrowDown')
|
|
shuffleArrowRollover = self.gui.find('**/tt_t_gui_mat_shuffleArrowUp')
|
|
shuffleArrowDisabled = self.gui.find('**/tt_t_gui_mat_shuffleArrowDisabled')
|
|
self.parentFrame = DirectFrame(relief=DGG.RAISED, pos=(0.98, 0, 0.416), frameColor=(1, 0, 0, 0))
|
|
self.parentFrame.setPos(-0.36, 0, -0.5)
|
|
self.parentFrame.reparentTo(base.a2dTopRight)
|
|
self.speciesFrame = DirectFrame(parent=self.parentFrame, image=shuffleFrame, image_scale=halfButtonInvertScale, relief=None, pos=(0, 0, -0.073), hpr=(0, 0, 0), scale=1.3, frameColor=(1, 1, 1, 1), text='Species', text_scale=0.0625, text_pos=(-0.001, -0.015), text_fg=(1, 1, 1, 1))
|
|
self.speciesLButton = DirectButton(parent=self.speciesFrame, relief=None, image=(shuffleArrowUp,
|
|
shuffleArrowDown,
|
|
shuffleArrowRollover,
|
|
shuffleArrowDisabled), image_scale=halfButtonScale, image1_scale=halfButtonHoverScale, image2_scale=halfButtonHoverScale, pos=(-0.2, 0, 0), command=self.__swapSpecies, extraArgs=[-1])
|
|
self.speciesRButton = DirectButton(parent=self.speciesFrame, relief=None, image=(shuffleArrowUp,
|
|
shuffleArrowDown,
|
|
shuffleArrowRollover,
|
|
shuffleArrowDisabled), image_scale=halfButtonInvertScale, image1_scale=halfButtonInvertHoverScale, image2_scale=halfButtonInvertHoverScale, pos=(0.2, 0, 0), command=self.__swapSpecies, extraArgs=[1])
|
|
self.headFrame = DirectFrame(parent=self.parentFrame, image=shuffleFrame, image_scale=halfButtonInvertScale, relief=None, pos=(0, 0, -0.3), hpr=(0, 0, 2), scale=0.9, frameColor=(1, 1, 1, 1), text=TTLocalizer.BodyShopHead, text_scale=0.0625, text_pos=(-0.001, -0.015), text_fg=(1, 1, 1, 1))
|
|
self.headLButton = DirectButton(parent=self.headFrame, relief=None, image=(shuffleArrowUp,
|
|
shuffleArrowDown,
|
|
shuffleArrowRollover,
|
|
shuffleArrowDisabled), image_scale=halfButtonScale, image1_scale=halfButtonHoverScale, image2_scale=halfButtonHoverScale, pos=(-0.2, 0, 0), command=self.__swapHead, extraArgs=[-1])
|
|
self.headRButton = DirectButton(parent=self.headFrame, relief=None, image=(shuffleArrowUp,
|
|
shuffleArrowDown,
|
|
shuffleArrowRollover,
|
|
shuffleArrowDisabled), image_scale=halfButtonInvertScale, image1_scale=halfButtonInvertHoverScale, image2_scale=halfButtonInvertHoverScale, pos=(0.2, 0, 0), command=self.__swapHead, extraArgs=[1])
|
|
self.bodyFrame = DirectFrame(parent=self.parentFrame, image=shuffleFrame, image_scale=halfButtonScale, relief=None, pos=(0, 0, -0.5), hpr=(0, 0, -2), scale=0.9, frameColor=(1, 1, 1, 1), text=TTLocalizer.BodyShopBody, text_scale=0.0625, text_pos=(-0.001, -0.015), text_fg=(1, 1, 1, 1))
|
|
self.torsoLButton = DirectButton(parent=self.bodyFrame, relief=None, image=(shuffleArrowUp,
|
|
shuffleArrowDown,
|
|
shuffleArrowRollover,
|
|
shuffleArrowDisabled), image_scale=halfButtonScale, image1_scale=halfButtonHoverScale, image2_scale=halfButtonHoverScale, pos=(-0.2, 0, 0), command=self.__swapTorso, extraArgs=[-1])
|
|
self.torsoRButton = DirectButton(parent=self.bodyFrame, relief=None, image=(shuffleArrowUp,
|
|
shuffleArrowDown,
|
|
shuffleArrowRollover,
|
|
shuffleArrowDisabled), image_scale=halfButtonInvertScale, image1_scale=halfButtonInvertHoverScale, image2_scale=halfButtonInvertHoverScale, pos=(0.2, 0, 0), command=self.__swapTorso, extraArgs=[1])
|
|
self.legsFrame = DirectFrame(parent=self.parentFrame, image=shuffleFrame, image_scale=halfButtonInvertScale, relief=None, pos=(0, 0, -0.7), hpr=(0, 0, 3), scale=0.9, frameColor=(1, 1, 1, 1), text=TTLocalizer.BodyShopLegs, text_scale=0.0625, text_pos=(-0.001, -0.015), text_fg=(1, 1, 1, 1))
|
|
self.legLButton = DirectButton(parent=self.legsFrame, relief=None, image=(shuffleArrowUp,
|
|
shuffleArrowDown,
|
|
shuffleArrowRollover,
|
|
shuffleArrowDisabled), image_scale=halfButtonScale, image1_scale=halfButtonHoverScale, image2_scale=halfButtonHoverScale, pos=(-0.2, 0, 0), command=self.__swapLegs, extraArgs=[-1])
|
|
self.legRButton = DirectButton(parent=self.legsFrame, relief=None, image=(shuffleArrowUp,
|
|
shuffleArrowDown,
|
|
shuffleArrowRollover,
|
|
shuffleArrowDisabled), image_scale=halfButtonInvertScale, image1_scale=halfButtonInvertHoverScale, image2_scale=halfButtonInvertHoverScale, pos=(0.2, 0, 0), command=self.__swapLegs, extraArgs=[1])
|
|
self.parentFrame.hide()
|
|
self.shuffleFetchMsg = 'BodyShopShuffle'
|
|
self.shuffleButton = ShuffleButton.ShuffleButton(self, self.shuffleFetchMsg)
|
|
return
|
|
|
|
def unload(self):
|
|
self.gui.removeNode()
|
|
del self.gui
|
|
self.parentFrame.destroy()
|
|
self.speciesFrame.destroy()
|
|
self.headFrame.destroy()
|
|
self.bodyFrame.destroy()
|
|
self.legsFrame.destroy()
|
|
self.speciesLButton.destroy()
|
|
self.speciesRButton.destroy()
|
|
self.headLButton.destroy()
|
|
self.headRButton.destroy()
|
|
self.torsoLButton.destroy()
|
|
self.torsoRButton.destroy()
|
|
self.legLButton.destroy()
|
|
self.legRButton.destroy()
|
|
del self.parentFrame
|
|
del self.speciesFrame
|
|
del self.headFrame
|
|
del self.bodyFrame
|
|
del self.legsFrame
|
|
del self.speciesLButton
|
|
del self.speciesRButton
|
|
del self.headLButton
|
|
del self.headRButton
|
|
del self.torsoLButton
|
|
del self.torsoRButton
|
|
del self.legLButton
|
|
del self.legRButton
|
|
self.shuffleButton.unload()
|
|
self.ignore('MAT-newToonCreated')
|
|
|
|
def __swapTorso(self, offset):
|
|
gender = self.toon.style.getGender()
|
|
if not self.clothesPicked:
|
|
length = len(ToonDNA.toonTorsoTypes[6:])
|
|
torsoOffset = 6
|
|
elif gender == 'm':
|
|
length = len(ToonDNA.toonTorsoTypes[:3])
|
|
torsoOffset = 0
|
|
if self.toon.style.topTex not in ToonDNA.MakeAToonBoyShirts:
|
|
randomShirt = ToonDNA.getRandomTop(gender, ToonDNA.MAKE_A_TOON)
|
|
shirtTex, shirtColor, sleeveTex, sleeveColor = randomShirt
|
|
self.toon.style.topTex = shirtTex
|
|
self.toon.style.topTexColor = shirtColor
|
|
self.toon.style.sleeveTex = sleeveTex
|
|
self.toon.style.sleeveTexColor = sleeveColor
|
|
if self.toon.style.botTex not in ToonDNA.MakeAToonBoyBottoms:
|
|
botTex, botTexColor = ToonDNA.getRandomBottom(gender, ToonDNA.MAKE_A_TOON)
|
|
self.toon.style.botTex = botTex
|
|
self.toon.style.botTexColor = botTexColor
|
|
else:
|
|
length = len(ToonDNA.toonTorsoTypes[3:6])
|
|
if self.toon.style.torso[1] == 'd':
|
|
torsoOffset = 3
|
|
else:
|
|
torsoOffset = 0
|
|
if self.toon.style.topTex not in ToonDNA.MakeAToonGirlShirts:
|
|
randomShirt = ToonDNA.getRandomTop(gender, ToonDNA.MAKE_A_TOON)
|
|
shirtTex, shirtColor, sleeveTex, sleeveColor = randomShirt
|
|
self.toon.style.topTex = shirtTex
|
|
self.toon.style.topTexColor = shirtColor
|
|
self.toon.style.sleeveTex = sleeveTex
|
|
self.toon.style.sleeveTexColor = sleeveColor
|
|
if self.toon.style.botTex not in ToonDNA.MakeAToonGirlBottoms:
|
|
if self.toon.style.torso[1] == 'd':
|
|
botTex, botTexColor = ToonDNA.getRandomBottom(gender, ToonDNA.MAKE_A_TOON, girlBottomType=ToonDNA.SKIRT)
|
|
self.toon.style.botTex = botTex
|
|
self.toon.style.botTexColor = botTexColor
|
|
torsoOffset = 3
|
|
else:
|
|
botTex, botTexColor = ToonDNA.getRandomBottom(gender, ToonDNA.MAKE_A_TOON, girlBottomType=ToonDNA.SHORTS)
|
|
self.toon.style.botTex = botTex
|
|
self.toon.style.botTexColor = botTexColor
|
|
torsoOffset = 0
|
|
self.torsoChoice = (self.torsoChoice + offset) % length
|
|
self.__updateScrollButtons(self.torsoChoice, length, self.torsoStart, self.torsoLButton, self.torsoRButton)
|
|
torso = ToonDNA.toonTorsoTypes[torsoOffset + self.torsoChoice]
|
|
self.dna.torso = torso
|
|
self.toon.swapToonTorso(torso)
|
|
self.toon.loop('neutral', 0)
|
|
self.toon.swapToonColor(self.dna)
|
|
|
|
def __swapLegs(self, offset):
|
|
length = len(ToonDNA.toonLegTypes)
|
|
self.legChoice = (self.legChoice + offset) % length
|
|
self.notify.debug('self.legChoice=%d, length=%d, self.legStart=%d' % (self.legChoice, length, self.legStart))
|
|
self.__updateScrollButtons(self.legChoice, length, self.legStart, self.legLButton, self.legRButton)
|
|
newLeg = ToonDNA.toonLegTypes[self.legChoice]
|
|
self.dna.legs = newLeg
|
|
self.toon.swapToonLegs(newLeg)
|
|
self.toon.loop('neutral', 0)
|
|
self.toon.swapToonColor(self.dna)
|
|
|
|
def __swapHead(self, offset):
|
|
self.headList = ToonDNA.getHeadList(self.species)
|
|
length = len(self.headList)
|
|
self.headChoice = (self.headChoice + offset) % length
|
|
self.__updateHead()
|
|
|
|
def __swapSpecies(self, offset):
|
|
length = len(ToonDNA.toonSpeciesTypes)
|
|
self.speciesChoice = (self.speciesChoice + offset) % length
|
|
self.__updateScrollButtons(self.speciesChoice, length, self.speciesStart, self.speciesLButton, self.speciesRButton)
|
|
self.species = ToonDNA.toonSpeciesTypes[self.speciesChoice]
|
|
self.headList = ToonDNA.getHeadList(self.species)
|
|
self.__changeSpeciesName(self.species)
|
|
maxHeadChoice = len(self.headList) - 1
|
|
if self.headChoice > maxHeadChoice:
|
|
self.headChoice = maxHeadChoice
|
|
self.__updateHead()
|
|
|
|
def __updateHead(self):
|
|
self.__updateScrollButtons(self.headChoice, len(self.headList), self.headStart, self.headLButton, self.headRButton)
|
|
headIndex = ToonDNA.getHeadStartIndex(self.species) + self.headChoice
|
|
newHead = ToonDNA.toonHeadTypes[headIndex]
|
|
self.dna.head = newHead
|
|
self.toon.swapToonHead(newHead)
|
|
self.toon.loop('neutral', 0)
|
|
self.toon.swapToonColor(self.dna)
|
|
|
|
def __updateScrollButtons(self, choice, length, start, lButton, rButton):
|
|
if choice == (start - 1) % length:
|
|
rButton['state'] = DGG.DISABLED
|
|
elif choice != (start - 1) % length:
|
|
rButton['state'] = DGG.NORMAL
|
|
if choice == start % length:
|
|
lButton['state'] = DGG.DISABLED
|
|
elif choice != start % length:
|
|
lButton['state'] = DGG.NORMAL
|
|
if lButton['state'] == DGG.DISABLED and rButton['state'] == DGG.DISABLED:
|
|
self.notify.info('Both buttons got disabled! Doing fallback code. choice%d, length=%d, start=%d, lButton=%s, rButton=%s' % (choice,
|
|
length,
|
|
start,
|
|
lButton,
|
|
rButton))
|
|
if choice == start % length:
|
|
lButton['state'] = DGG.DISABLED
|
|
rButton['state'] = DGG.NORMAL
|
|
elif choice == (start - 1) % length:
|
|
lButton['state'] = DGG.NORMAL
|
|
rButton['state'] = DGG.DISABLED
|
|
else:
|
|
lButton['state'] = DGG.NORMAL
|
|
rButton['state'] = DGG.NORMAL
|
|
|
|
def __handleForward(self):
|
|
self.doneStatus = 'next'
|
|
messenger.send(self.doneEvent)
|
|
|
|
def __handleBackward(self):
|
|
self.doneStatus = 'last'
|
|
messenger.send(self.doneEvent)
|
|
|
|
def changeBody(self):
|
|
newChoice = self.shuffleButton.getCurrChoice()
|
|
newHead = newChoice[0]
|
|
newSpeciesIndex = ToonDNA.toonSpeciesTypes.index(ToonDNA.getSpecies(newHead))
|
|
newHeadIndex = ToonDNA.toonHeadTypes.index(newHead) - ToonDNA.getHeadStartIndex(ToonDNA.getSpecies(newHead))
|
|
newTorsoIndex = ToonDNA.toonTorsoTypes.index(newChoice[1])
|
|
newLegsIndex = ToonDNA.toonLegTypes.index(newChoice[2])
|
|
oldHead = self.toon.style.head
|
|
oldSpeciesIndex = ToonDNA.toonSpeciesTypes.index(ToonDNA.getSpecies(oldHead))
|
|
oldHeadIndex = ToonDNA.toonHeadTypes.index(oldHead) - ToonDNA.getHeadStartIndex(ToonDNA.getSpecies(oldHead))
|
|
oldTorsoIndex = ToonDNA.toonTorsoTypes.index(self.toon.style.torso)
|
|
oldLegsIndex = ToonDNA.toonLegTypes.index(self.toon.style.legs)
|
|
self.__swapSpecies(newSpeciesIndex - oldSpeciesIndex)
|
|
self.__swapHead(newHeadIndex - oldHeadIndex)
|
|
self.__swapTorso(newTorsoIndex - oldTorsoIndex)
|
|
self.__swapLegs(newLegsIndex - oldLegsIndex)
|
|
|
|
def getCurrToonSetting(self):
|
|
return [self.toon.style.head, self.toon.style.torso, self.toon.style.legs]
|
|
|
|
def __changeSpeciesName(self, species):
|
|
if species == 'd':
|
|
self.speciesFrame['text'] = TTLocalizer.AnimalToSpecies['dog']
|
|
elif species == 'c':
|
|
self.speciesFrame['text'] = TTLocalizer.AnimalToSpecies['cat']
|
|
elif species == 'm':
|
|
self.speciesFrame['text'] = TTLocalizer.AnimalToSpecies['mouse']
|
|
elif species == 'h':
|
|
self.speciesFrame['text'] = TTLocalizer.AnimalToSpecies['horse']
|
|
elif species == 'r':
|
|
self.speciesFrame['text'] = TTLocalizer.AnimalToSpecies['rabbit']
|
|
elif species == 'f':
|
|
self.speciesFrame['text'] = TTLocalizer.AnimalToSpecies['duck']
|
|
elif species == 'p':
|
|
self.speciesFrame['text'] = TTLocalizer.AnimalToSpecies['monkey']
|
|
elif species == 'b':
|
|
self.speciesFrame['text'] = TTLocalizer.AnimalToSpecies['bear']
|
|
elif species == 's':
|
|
self.speciesFrame['text'] = TTLocalizer.AnimalToSpecies['pig']
|