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 from toontown.toontowngui import TeaserPanel from . 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 return 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) self.restrictHeadType(self.dna.head) 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() self.memberButton.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.upsellModel = loader.loadModel('phase_3/models/gui/tt_m_gui_ups_mainGui') upsellTex = self.upsellModel.find('**/tt_t_gui_ups_banner') self.parentFrame = DirectFrame(relief=DGG.RAISED, pos=(0.98, 0, 0.416), frameColor=(1, 0, 0, 0)) 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.memberButton = DirectButton(relief=None, image=(upsellTex, upsellTex, upsellTex, upsellTex), image_scale=halfButtonScale, image1_scale=halfButtonHoverScale, image2_scale=halfButtonHoverScale, scale=0.9, pos=(0, 0, -0.84), command=self.__restrictForward) self.parentFrame.hide() self.memberButton.hide() self.shuffleFetchMsg = 'BodyShopShuffle' self.shuffleButton = ShuffleButton.ShuffleButton(self, self.shuffleFetchMsg) return def unload(self): self.gui.removeNode() del self.gui self.upsellModel.removeNode() del self.upsellModel 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() self.memberButton.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 del self.memberButton 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.dna.armColor not in ToonDNA.defaultBoyColorList: self.dna.armColor = ToonDNA.defaultBoyColorList[0] if self.dna.legColor not in ToonDNA.defaultBoyColorList: self.dna.legColor = ToonDNA.defaultBoyColorList[0] if self.dna.headColor not in ToonDNA.defaultBoyColorList: self.dna.headColor = ToonDNA.defaultBoyColorList[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.dna.armColor not in ToonDNA.defaultGirlColorList: self.dna.armColor = ToonDNA.defaultGirlColorList[0] if self.dna.legColor not in ToonDNA.defaultGirlColorList: self.dna.legColor = ToonDNA.defaultGirlColorList[0] if self.dna.headColor not in ToonDNA.defaultGirlColorList: self.dna.headColor = ToonDNA.defaultGirlColorList[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) self.restrictHeadType(newHead) 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 restrictHeadType(self, head): if not base.cr.isPaid(): if head[0] in ('h', 'p', 'b'): self.accept('next', self.__restrictForward) else: self.accept('next', self.__handleForward) def __restrictForward(self): TeaserPanel.TeaserPanel(pageName='species') 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'] self.memberButton.hide() elif species == 'c': self.speciesFrame['text'] = TTLocalizer.AnimalToSpecies['cat'] self.memberButton.hide() elif species == 'm': self.speciesFrame['text'] = TTLocalizer.AnimalToSpecies['mouse'] self.memberButton.hide() elif species == 'h': self.speciesFrame['text'] = TTLocalizer.AnimalToSpecies['horse'] self.memberButton.show() elif species == 'r': self.speciesFrame['text'] = TTLocalizer.AnimalToSpecies['rabbit'] self.memberButton.hide() elif species == 'f': self.speciesFrame['text'] = TTLocalizer.AnimalToSpecies['duck'] self.memberButton.hide() elif species == 'p': self.speciesFrame['text'] = TTLocalizer.AnimalToSpecies['monkey'] self.memberButton.show() elif species == 'b': self.speciesFrame['text'] = TTLocalizer.AnimalToSpecies['bear'] self.memberButton.show() elif species == 's': self.speciesFrame['text'] = TTLocalizer.AnimalToSpecies['pig'] self.memberButton.hide() if base.cr.isPaid(): self.memberButton.hide()