2015-03-03 16:10:12 -06:00
|
|
|
from direct.gui.DirectGui import *
|
2015-06-23 18:11:48 -05:00
|
|
|
from panda3d.core import *
|
2015-03-29 17:16:26 -05:00
|
|
|
from direct.directnotify import DirectNotifyGlobal
|
|
|
|
from direct.showbase.DirectObject import DirectObject
|
|
|
|
from toontown.toonbase import ToontownGlobals
|
|
|
|
from toontown.toonbase import TTLocalizer
|
|
|
|
from toontown.toonbase import ToontownTimer
|
|
|
|
from direct.task import Task
|
|
|
|
from otp.namepanel import NameTumbler
|
|
|
|
from otp.otpbase import OTPGlobals
|
|
|
|
from otp.otpbase import OTPLocalizer
|
2015-03-03 16:10:12 -06:00
|
|
|
from toontown.fishing import FishSellGUI
|
|
|
|
from toontown.pets import Pet, PetConstants
|
|
|
|
from toontown.pets import PetDNA
|
2015-03-29 17:16:26 -05:00
|
|
|
from toontown.pets import PetUtil
|
2015-03-03 16:10:12 -06:00
|
|
|
from toontown.pets import PetDetail
|
|
|
|
from toontown.pets import PetTraits
|
2015-03-29 17:16:26 -05:00
|
|
|
from toontown.hood import ZoneUtil
|
|
|
|
import string
|
|
|
|
import random
|
2015-03-03 16:10:12 -06:00
|
|
|
Dialog_MainMenu = 0
|
|
|
|
Dialog_AdoptPet = 1
|
|
|
|
Dialog_ChoosePet = 2
|
|
|
|
Dialog_ReturnPet = 3
|
|
|
|
Dialog_SellFish = 4
|
|
|
|
Dialog_NamePicker = 5
|
|
|
|
Dialog_GoHome = 6
|
|
|
|
disabledImageColor = Vec4(0.6, 0.6, 0.6, 1)
|
|
|
|
text0Color = Vec4(0.65, 0, 0.87, 1)
|
|
|
|
text1Color = Vec4(0.65, 0, 0.87, 1)
|
|
|
|
text2Color = Vec4(1, 1, 0.5, 1)
|
|
|
|
text3Color = Vec4(0.4, 0.4, 0.4, 1)
|
|
|
|
|
|
|
|
class PetshopGUI(DirectObject):
|
|
|
|
notify = DirectNotifyGlobal.directNotify.newCategory('PetshopGui')
|
|
|
|
|
|
|
|
class GoHomeDlg(DirectFrame):
|
|
|
|
notify = DirectNotifyGlobal.directNotify.newCategory('GoHomeDlg')
|
|
|
|
|
|
|
|
def __init__(self, doneEvent):
|
|
|
|
DirectFrame.__init__(self, pos=(0.0, 0.0, 0.0), image_color=ToontownGlobals.GlobalDialogColor, image_scale=(1.0, 1.0, 0.6), text='', text_wordwrap=13.5, text_scale=0.06, text_pos=(0.0, 0.13))
|
|
|
|
self['image'] = DGG.getDefaultDialogGeom()
|
|
|
|
self['text'] = TTLocalizer.PetshopGoHomeText
|
|
|
|
buttons = loader.loadModel('phase_3/models/gui/dialog_box_buttons_gui')
|
|
|
|
gui = loader.loadModel('phase_3.5/models/gui/avatar_panel_gui')
|
|
|
|
self.bYes = DirectButton(self, image=(buttons.find('**/ChtBx_OKBtn_UP'), buttons.find('**/ChtBx_OKBtn_DN'), buttons.find('**/ChtBx_OKBtn_Rllvr')), relief=None, text=TTLocalizer.TutorialYes, text_scale=0.05, text_pos=(0.0, -0.1), pos=(-0.15, 0.0, -0.1), command=lambda : messenger.send(doneEvent, [1]))
|
|
|
|
self.bNo = DirectButton(self, image=(buttons.find('**/CloseBtn_UP'), buttons.find('**/CloseBtn_DN'), buttons.find('**/CloseBtn_Rllvr')), relief=None, text=TTLocalizer.TutorialNo, text_scale=0.05, text_pos=(0.0, -0.1), pos=(0.15, 0.0, -0.1), command=lambda : messenger.send(doneEvent, [0]))
|
|
|
|
buttons.removeNode()
|
|
|
|
gui.removeNode()
|
2015-03-29 17:16:26 -05:00
|
|
|
return
|
2015-03-03 16:10:12 -06:00
|
|
|
|
|
|
|
class NamePicker(DirectFrame):
|
|
|
|
notify = DirectNotifyGlobal.directNotify.newCategory('PetshopGUI.NamePicker')
|
|
|
|
|
|
|
|
def __init__(self, doneEvent, petSeed, gender):
|
2015-04-07 09:19:50 -05:00
|
|
|
zoneId = ZoneUtil.getCanonicalSafeZoneId(base.localAvatar.getZoneId())
|
2015-03-03 16:10:12 -06:00
|
|
|
name, dna, traitSeed = PetUtil.getPetInfoFromSeed(petSeed, zoneId)
|
|
|
|
self.gui = loader.loadModel('phase_4/models/gui/PetNamePanel')
|
|
|
|
self.guiScale = 0.09
|
|
|
|
DirectFrame.__init__(self, relief=None, geom=self.gui, geom_scale=self.guiScale, state='normal', frameSize=(-1, 1, -1, 1))
|
|
|
|
self.initialiseoptions(PetshopGUI.NamePicker)
|
|
|
|
self.petView = self.attachNewNode('petView')
|
|
|
|
self.petView.setPos(-0.21, 0, -0.04)
|
|
|
|
self.petModel = Pet.Pet(forGui=1)
|
|
|
|
self.petModel.setDNA(dna)
|
|
|
|
self.petModel.fitAndCenterHead(0.435, forGui=1)
|
|
|
|
self.petModel.reparentTo(self.petView)
|
|
|
|
self.petModel.setH(225)
|
2015-07-07 06:15:10 -05:00
|
|
|
self.petModel.setScale(0.125)
|
2015-03-03 16:10:12 -06:00
|
|
|
self.petModel.enterNeutralHappy()
|
2015-03-14 17:15:24 -05:00
|
|
|
self.allNames = TTLocalizer.NeutralPetNames
|
|
|
|
if gender == 0:
|
|
|
|
self.allNames += TTLocalizer.BoyPetNames
|
2015-03-03 16:10:12 -06:00
|
|
|
else:
|
2015-03-14 17:15:24 -05:00
|
|
|
self.allNames += TTLocalizer.GirlPetNames
|
2015-03-03 16:10:12 -06:00
|
|
|
self.allNames.sort()
|
|
|
|
self.letters = []
|
|
|
|
for name in self.allNames:
|
|
|
|
if name[0:TTLocalizer.PGUIcharLength] not in self.letters:
|
|
|
|
self.letters.append(name[0:TTLocalizer.PGUIcharLength])
|
|
|
|
|
|
|
|
self.curLetter = self.letters[0]
|
|
|
|
self.curNames = []
|
|
|
|
self.curName = ''
|
|
|
|
self.alphabetList = self.makeScrollList(self.gui, (-0.012, 0, -0.075), (1, 0.8, 0.8, 1), self.letters, self.makeLabel, [TextNode.ACenter, 'alphabet'], 6)
|
|
|
|
self.nameList = None
|
|
|
|
self.rebuildNameList()
|
|
|
|
self.randomButton = DirectButton(parent=self, relief=None, image=(self.gui.find('**/RandomUpButton'), self.gui.find('**/RandomDownButton'), self.gui.find('**/RandomRolloverButton')), scale=self.guiScale, text=TTLocalizer.RandomButton, text_pos=(-0.8, -5.7), text_scale=0.8, text_fg=text2Color, pressEffect=False, command=self.randomName)
|
|
|
|
self.nameResult = DirectLabel(parent=self, relief=None, scale=self.guiScale, text='', text_align=TextNode.ACenter, text_pos=(-1.85, 2.6), text_fg=text0Color, text_scale=0.6, text_wordwrap=8)
|
2015-03-14 17:15:24 -05:00
|
|
|
self.submitButton = DirectButton(parent=self, relief=None, image=(self.gui.find('**/SubmitUpButton'), self.gui.find('**/SubmitDownButton'), self.gui.find('**/SubmitRolloverButton')), scale=self.guiScale, text=TTLocalizer.PetshopAdopt, text_pos=(3.3, -5.7), text_scale=TTLocalizer.PGUIsubmitButton, text_fg=text0Color, pressEffect=False, command=lambda : messenger.send(doneEvent, [TTLocalizer.getPetNameId(self.curName)]))
|
2015-03-03 16:10:12 -06:00
|
|
|
model = loader.loadModel('phase_4/models/gui/PetShopInterface')
|
|
|
|
modelScale = 0.1
|
|
|
|
cancelImageList = (model.find('**/CancelButtonUp'), model.find('**/CancelButtonDown'), model.find('**/CancelButtonRollover'))
|
|
|
|
cancelIcon = model.find('**/CancelIcon')
|
|
|
|
self.cancelButton = DirectButton(parent=self, relief=None, pos=(-0.04, 0, -0.47), image=cancelImageList, geom=cancelIcon, scale=modelScale, pressEffect=False, command=lambda : messenger.send(doneEvent, [-1]))
|
|
|
|
self.randomName()
|
2015-03-29 17:16:26 -05:00
|
|
|
return
|
2015-03-03 16:10:12 -06:00
|
|
|
|
|
|
|
def destroy(self):
|
|
|
|
self.petModel.delete()
|
|
|
|
DirectFrame.destroy(self)
|
|
|
|
|
|
|
|
def rebuildNameList(self):
|
|
|
|
self.curNames = []
|
|
|
|
for name in self.allNames:
|
|
|
|
if name[0:TTLocalizer.PGUIcharLength] == self.curLetter:
|
|
|
|
self.curNames += [name]
|
|
|
|
|
|
|
|
if self.nameList:
|
|
|
|
self.nameList.destroy()
|
|
|
|
self.nameList = self.makeScrollList(self.gui, (0.277, 0, -0.075), (1, 0.8, 0.8, 1), self.curNames, self.makeLabel, [TextNode.ACenter, 'name'], 5)
|
|
|
|
|
|
|
|
def updateNameText(self):
|
|
|
|
self.nameResult['text'] = self.curName
|
|
|
|
|
|
|
|
def nameClickedOn(self, listType, index):
|
|
|
|
if listType == 'alphabet':
|
|
|
|
self.curLetter = self.letters[index]
|
|
|
|
self.rebuildNameList()
|
|
|
|
elif listType == 'name':
|
|
|
|
self.curName = self.curNames[index]
|
|
|
|
self.updateNameText()
|
|
|
|
|
|
|
|
def makeLabel(self, te, index, others):
|
|
|
|
alig = others[0]
|
|
|
|
listName = others[1]
|
|
|
|
if alig == TextNode.ARight:
|
|
|
|
newpos = (0.44, 0, 0)
|
|
|
|
elif alig == TextNode.ALeft:
|
|
|
|
newpos = (0, 0, 0)
|
|
|
|
else:
|
|
|
|
newpos = (0.2, 0, 0)
|
|
|
|
df = DirectButton(parent=self, state='normal', relief=None, text=te, text_scale=0.1, text_pos=(0.2, 0, 0), text_align=alig, textMayChange=0, command=lambda : self.nameClickedOn(listName, index))
|
|
|
|
return df
|
|
|
|
|
|
|
|
def makeScrollList(self, gui, ipos, mcolor, nitems, nitemMakeFunction, nitemMakeExtraArgs, nVisibleItems):
|
|
|
|
decScale = self.guiScale / 0.44
|
|
|
|
incScale = (decScale, decScale, -decScale)
|
|
|
|
it = nitems[:]
|
|
|
|
listType = nitemMakeExtraArgs[1]
|
|
|
|
if listType == 'alphabet':
|
|
|
|
arrowList = (gui.find('**/ArrowSmUpButton'),
|
|
|
|
gui.find('**/ArrowSmUpRollover'),
|
|
|
|
gui.find('**/ArrowSmUpRollover'),
|
|
|
|
gui.find('**/ArrowSmUpButton'))
|
|
|
|
fHeight = 0.09
|
|
|
|
elif listType == 'name':
|
|
|
|
arrowList = (gui.find('**/ArrowUpBigButton'),
|
|
|
|
gui.find('**/ArrowUpBigRollover'),
|
|
|
|
gui.find('**/ArrowUpBigRollover'),
|
|
|
|
gui.find('**/ArrowUpBigButton'))
|
|
|
|
fHeight = 0.119
|
|
|
|
ds = DirectScrolledList(parent=self, items=it, itemMakeFunction=nitemMakeFunction, itemMakeExtraArgs=nitemMakeExtraArgs, relief=None, command=None, pos=ipos, scale=0.44, incButton_image=arrowList, incButton_image_pos=(1.015, 0, 3.32), incButton_relief=None, incButton_scale=incScale, incButton_image3_color=Vec4(0.4, 0.4, 0.4, 1), decButton_image=arrowList, decButton_image_pos=(1.015, 0, 1.11), decButton_relief=None, decButton_scale=decScale, decButton_image3_color=Vec4(0.4, 0.4, 0.4, 1), numItemsVisible=nVisibleItems, forceHeight=fHeight)
|
|
|
|
return ds
|
|
|
|
|
|
|
|
def randomName(self):
|
|
|
|
numNames = len(self.allNames)
|
|
|
|
self.curName = self.allNames[random.randrange(numNames)]
|
|
|
|
self.curLetter = self.curName[0:TTLocalizer.PGUIcharLength]
|
|
|
|
self.rebuildNameList()
|
|
|
|
self.updateNameText()
|
|
|
|
self.alphabetList.scrollTo(self.letters.index(self.curLetter))
|
|
|
|
self.nameList.scrollTo(self.curNames.index(self.curName))
|
|
|
|
|
|
|
|
class MainMenuDlg(DirectFrame):
|
|
|
|
notify = DirectNotifyGlobal.directNotify.newCategory('PetshopGUI.MainMenuDlg')
|
|
|
|
|
|
|
|
def __init__(self, doneEvent):
|
|
|
|
model = loader.loadModel('phase_4/models/gui/AdoptReturnSell')
|
|
|
|
modelPos = (0, 0, -0.3)
|
|
|
|
modelScale = 0.055
|
|
|
|
DirectFrame.__init__(self, relief=None, state='normal', geom=model, geom_scale=(modelScale, modelScale, modelScale), pos=modelPos, frameSize=(-1, 1, -1, 1))
|
|
|
|
self.initialiseoptions(PetshopGUI.MainMenuDlg)
|
|
|
|
textScale = TTLocalizer.PGUItextScale
|
|
|
|
sellFishImageList = (model.find('**/SellButtonUp'),
|
|
|
|
model.find('**/SellButtonDown'),
|
|
|
|
model.find('**/SellButtonRollover'),
|
|
|
|
model.find('**/SellButtonDown'))
|
|
|
|
fishLogoImageList = model.find('**/Fish')
|
|
|
|
cancelImageList = (model.find('**/CancelButtonUp'), model.find('**/cancelButtonDown'), model.find('**/CancelButtonRollover'))
|
|
|
|
XImageList = model.find('**/CancelIcon')
|
|
|
|
adoptImageList = (model.find('**/AdoptButtonUp'), model.find('**/AdoptButtonDown'), model.find('**/AdoptButtonRollover'))
|
|
|
|
pawLogoAdoptImageList = model.find('**/PawPink')
|
|
|
|
returnImageList = (model.find('**/ReturnButtonUp'),
|
|
|
|
model.find('**/ReturnButtonDown'),
|
|
|
|
model.find('**/ReturnButtonRollover'),
|
|
|
|
model.find('**/ReturnButtonDown'))
|
|
|
|
pawLogoReturnImageList = model.find('**/PawYellow')
|
|
|
|
self.cancelButton = DirectButton(parent=self, relief=None, scale=(modelScale, modelScale, modelScale), geom=XImageList, image=cancelImageList, text=('', TTLocalizer.PetshopCancel), text_pos=TTLocalizer.PGUIcancelButtonPos, text_scale=0.8, pressEffect=False, command=lambda : messenger.send(doneEvent, [0]))
|
|
|
|
self.sellFishButton = DirectButton(parent=self, relief=None, image=sellFishImageList, image3_color=disabledImageColor, geom=fishLogoImageList, scale=(modelScale, modelScale, modelScale), text=TTLocalizer.PetshopSell, text_scale=textScale, text_pos=(0, 6), text0_fg=text2Color, text1_fg=text2Color, text2_fg=text0Color, text3_fg=text3Color, pressEffect=False, command=lambda : messenger.send(doneEvent, [1]))
|
|
|
|
fishValue = base.localAvatar.fishTank.getTotalValue()
|
|
|
|
if fishValue == 0:
|
|
|
|
self.sellFishButton['state'] = DGG.DISABLED
|
|
|
|
self.adoptPetButton = DirectButton(parent=self, relief=None, image=adoptImageList, geom=pawLogoAdoptImageList, scale=(modelScale, modelScale, modelScale), text=TTLocalizer.PetshopAdoptAPet, text_scale=textScale, text_pos=(0, 12.5), text0_fg=text0Color, text1_fg=text1Color, text2_fg=text2Color, text3_fg=text3Color, pressEffect=False, command=lambda : messenger.send(doneEvent, [2]))
|
|
|
|
self.returnPetButton = DirectButton(parent=self, relief=None, image=returnImageList, geom=pawLogoReturnImageList, image3_color=disabledImageColor, scale=(modelScale, modelScale, modelScale), text=TTLocalizer.PetshopReturnPet, text_scale=textScale, text_pos=(-0.6, 9.2), text0_fg=text2Color, text1_fg=text2Color, text2_fg=text0Color, text3_fg=text3Color, pressEffect=False, command=lambda : messenger.send(doneEvent, [3]))
|
|
|
|
if not base.localAvatar.hasPet():
|
|
|
|
self.returnPetButton['state'] = DGG.DISABLED
|
|
|
|
model.removeNode()
|
2015-03-29 17:16:26 -05:00
|
|
|
return
|
2015-03-03 16:10:12 -06:00
|
|
|
|
|
|
|
class AdoptPetDlg(DirectFrame):
|
|
|
|
notify = DirectNotifyGlobal.directNotify.newCategory('PetshopGUI.AdoptPetDlg')
|
|
|
|
|
|
|
|
def __init__(self, doneEvent, petSeed, petNameIndex):
|
2015-04-07 09:19:50 -05:00
|
|
|
zoneId = ZoneUtil.getCanonicalSafeZoneId(base.localAvatar.getZoneId())
|
2015-03-03 16:10:12 -06:00
|
|
|
name, dna, traitSeed = PetUtil.getPetInfoFromSeed(petSeed, zoneId)
|
2015-03-14 17:15:24 -05:00
|
|
|
name = TTLocalizer.getPetName(petNameIndex)
|
2015-03-03 16:10:12 -06:00
|
|
|
cost = PetUtil.getPetCostFromSeed(petSeed, zoneId)
|
|
|
|
model = loader.loadModel('phase_4/models/gui/AdoptPet')
|
|
|
|
modelPos = (0, 0, -0.3)
|
|
|
|
modelScale = 0.055
|
|
|
|
DirectFrame.__init__(self, relief=None, state='normal', geom=model, geom_color=ToontownGlobals.GlobalDialogColor, geom_scale=modelScale, frameSize=(-1, 1, -1, 1), pos=modelPos, text=TTLocalizer.PetshopAdoptConfirm % (name, cost), text_wordwrap=12, text_scale=0.05, text_pos=(0, 0.55), text_fg=text0Color)
|
|
|
|
self.initialiseoptions(PetshopGUI.AdoptPetDlg)
|
|
|
|
self.petView = self.attachNewNode('petView')
|
|
|
|
self.petView.setPos(-0.13, 0, 0.8)
|
|
|
|
self.petModel = Pet.Pet(forGui=1)
|
|
|
|
self.petModel.setDNA(dna)
|
|
|
|
self.petModel.fitAndCenterHead(0.395, forGui=1)
|
|
|
|
self.petModel.reparentTo(self.petView)
|
|
|
|
self.petModel.setH(130)
|
2015-07-07 06:15:10 -05:00
|
|
|
self.petModel.setScale(0.125)
|
2015-03-03 16:10:12 -06:00
|
|
|
self.petModel.enterNeutralHappy()
|
|
|
|
self.moneyDisplay = DirectLabel(parent=self, relief=None, text=str(base.localAvatar.getTotalMoney()), text_scale=0.075, text_fg=(0.95, 0.95, 0, 1), text_shadow=(0, 0, 0, 1), text_pos=(0.225, 0.33), text_font=ToontownGlobals.getSignFont())
|
|
|
|
self.accept(localAvatar.uniqueName('moneyChange'), self.__moneyChange)
|
|
|
|
self.accept(localAvatar.uniqueName('bankMoneyChange'), self.__moneyChange)
|
|
|
|
okImageList = (model.find('**/CheckButtonUp'), model.find('**/CheckButtonDown'), model.find('**/CheckButtonRollover'))
|
|
|
|
cancelImageList = (model.find('**/CancelButtonUp'), model.find('**/CancelButtonDown'), model.find('**/CancelRollover'))
|
|
|
|
cancelIcon = model.find('**/CancelIcon')
|
|
|
|
checkIcon = model.find('**/CheckIcon')
|
|
|
|
self.cancelButton = DirectButton(parent=self, relief=None, image=cancelImageList, geom=cancelIcon, scale=modelScale, text=('', TTLocalizer.PetshopGoBack), text_pos=(-5.8, 4.4), text_scale=0.7, pressEffect=False, command=lambda : messenger.send(doneEvent, [0]))
|
|
|
|
self.okButton = DirectButton(parent=self, relief=None, image=okImageList, geom=checkIcon, scale=modelScale, text=('', TTLocalizer.PetshopAdopt), text_pos=(5.8, 4.4), text_scale=0.7, pressEffect=False, command=lambda : messenger.send(doneEvent, [1]))
|
|
|
|
model.removeNode()
|
2015-03-29 17:16:26 -05:00
|
|
|
return
|
2015-03-03 16:10:12 -06:00
|
|
|
|
|
|
|
def destroy(self):
|
|
|
|
self.ignore(localAvatar.uniqueName('moneyChange'))
|
|
|
|
self.ignore(localAvatar.uniqueName('bankMoneyChange'))
|
|
|
|
self.petModel.delete()
|
|
|
|
DirectFrame.destroy(self)
|
|
|
|
|
|
|
|
def __moneyChange(self, money):
|
|
|
|
self.moneyDisplay['text'] = str(base.localAvatar.getTotalMoney())
|
|
|
|
|
|
|
|
class ReturnPetDlg(DirectFrame):
|
|
|
|
notify = DirectNotifyGlobal.directNotify.newCategory('PetshopGUI.ReturnPetDlg')
|
|
|
|
|
|
|
|
def __init__(self, doneEvent):
|
|
|
|
|
|
|
|
def showDialog(avatar):
|
|
|
|
model = loader.loadModel('phase_4/models/gui/ReturnPet')
|
|
|
|
modelPos = (0, 0, -0.3)
|
|
|
|
modelScale = (0.055, 0.055, 0.055)
|
|
|
|
base.r = self
|
|
|
|
DirectFrame.__init__(self, relief=None, state='normal', geom=model, geom_scale=modelScale, frameSize=(-1, 1, -1, 1), pos=modelPos, text=TTLocalizer.PetshopReturnConfirm % avatar.getName(), text_wordwrap=12, text_scale=TTLocalizer.PGUIreturnConfirm, text_pos=(0, 0.45), text_fg=text2Color)
|
|
|
|
self.initialiseoptions(PetshopGUI.ReturnPetDlg)
|
|
|
|
okImageList = (model.find('**/CheckButtonUp'), model.find('**/CheckButtonDown'), model.find('**/CheckRollover'))
|
|
|
|
cancelImageList = (model.find('**/CancelButtonUp'), model.find('**/CancelButtonDown'), model.find('**/CancelRollover'))
|
|
|
|
cancelIcon = model.find('**/CancelIcon')
|
|
|
|
checkIcon = model.find('**/CheckIcon')
|
|
|
|
self.cancelButton = DirectButton(parent=self, relief=None, image=cancelImageList, geom=cancelIcon, scale=modelScale, text=('', TTLocalizer.PetshopGoBack), text_pos=(-5.8, 4.4), text_scale=0.7, pressEffect=False, command=lambda : messenger.send(doneEvent, [0]))
|
|
|
|
self.okButton = DirectButton(parent=self, relief=None, image=okImageList, geom=checkIcon, scale=modelScale, text=('', TTLocalizer.PetshopReturn), text_pos=(5.8, 4.4), text_scale=0.7, pressEffect=False, command=lambda : messenger.send(doneEvent, [1]))
|
|
|
|
self.petView = self.attachNewNode('petView')
|
|
|
|
self.petView.setPos(-0.15, 0, 0.8)
|
2015-03-29 10:41:02 -05:00
|
|
|
avatar.announceGenerate()
|
2015-03-03 16:10:12 -06:00
|
|
|
self.petModel = Pet.Pet(forGui=1)
|
|
|
|
self.petModel.setDNA(avatar.getDNA())
|
|
|
|
self.petModel.fitAndCenterHead(0.395, forGui=1)
|
|
|
|
self.petModel.reparentTo(self.petView)
|
|
|
|
self.petModel.setH(130)
|
2015-07-07 06:15:10 -05:00
|
|
|
self.petModel.setScale(0.125)
|
2015-03-03 16:10:12 -06:00
|
|
|
self.petModel.enterNeutralSad()
|
|
|
|
model.removeNode()
|
|
|
|
self.initialized = True
|
|
|
|
return
|
|
|
|
|
|
|
|
self.initialized = False
|
|
|
|
self.petPanel = PetDetail.PetDetail(base.localAvatar.getPetId(), showDialog)
|
|
|
|
|
|
|
|
def destroy(self):
|
|
|
|
if self.initialized:
|
|
|
|
self.petPanel.avatar.disable()
|
|
|
|
self.petPanel.avatar.delete()
|
|
|
|
self.petPanel.avatar = None
|
|
|
|
self.PetPanel = None
|
|
|
|
self.petModel.delete()
|
|
|
|
DirectFrame.destroy(self)
|
2015-03-29 17:16:26 -05:00
|
|
|
return
|
2015-03-03 16:10:12 -06:00
|
|
|
|
|
|
|
class ChoosePetDlg(DirectFrame):
|
|
|
|
notify = DirectNotifyGlobal.directNotify.newCategory('PetshopGUI.ChoosePetDlg')
|
|
|
|
|
|
|
|
def __init__(self, doneEvent, petSeeds):
|
|
|
|
model = loader.loadModel('phase_4/models/gui/PetShopInterface')
|
|
|
|
modelPos = (0, 0, -0.9)
|
|
|
|
modelScale = (0.185, 0.185, 0.185)
|
|
|
|
DirectFrame.__init__(self, relief=None, state='normal', geom=model, geom_scale=modelScale, frameSize=(-1, 1, -1, 1), pos=modelPos, text=TTLocalizer.PetshopChooserTitle, text_wordwrap=26, text_scale=TTLocalizer.PGUIchooserTitle, text_fg=Vec4(0.36, 0.94, 0.93, 1), text_pos=(0, 1.58))
|
|
|
|
self.initialiseoptions(PetshopGUI.ChoosePetDlg)
|
|
|
|
adoptImageList = (model.find('**/AdoptButtonUp'),
|
|
|
|
model.find('**/AdoptButtonDown'),
|
|
|
|
model.find('**/AdoptButtonRollover'),
|
|
|
|
model.find('**/AdoptButtonRollover'))
|
|
|
|
cancelImageList = (model.find('**/CancelButtonUp'), model.find('**/CancelButtonDown'), model.find('**/CancelButtonRollover'))
|
|
|
|
cancelIcon = model.find('**/CancelIcon')
|
|
|
|
pawLImageList = (model.find('**/Paw1Up'), model.find('**/Paw1Down'), model.find('**/Paw1Rollover'))
|
|
|
|
pawLArrowImageList = model.find('**/Arrow1')
|
|
|
|
pawRImageList = (model.find('**/Paw2Up'), model.find('**/Paw2Down'), model.find('**/Paw2Rollover'))
|
|
|
|
pawRArrowImageList = model.find('**/Arrow2')
|
|
|
|
self.cancelButton = DirectButton(parent=self, relief=None, image=cancelImageList, geom=cancelIcon, scale=modelScale, pressEffect=False, command=lambda : messenger.send(doneEvent, [-1]))
|
|
|
|
self.pawLButton = DirectButton(parent=self, relief=None, image=pawLImageList, geom=pawLArrowImageList, scale=modelScale, pressEffect=False, command=lambda : self.__handlePetChange(-1))
|
|
|
|
self.pawRButton = DirectButton(parent=self, relief=None, image=pawRImageList, geom=pawRArrowImageList, scale=modelScale, pressEffect=False, command=lambda : self.__handlePetChange(1))
|
|
|
|
self.okButton = DirectButton(parent=self, relief=None, image=adoptImageList, image3_color=disabledImageColor, scale=modelScale, text=TTLocalizer.PetshopAdopt, text_scale=TTLocalizer.PGUIokButton, text_pos=TTLocalizer.PGUIokButtonPos, text0_fg=text0Color, text1_fg=text1Color, text2_fg=text2Color, text3_fg=text3Color, pressEffect=False, command=lambda : messenger.send(doneEvent, [self.curPet]))
|
|
|
|
self.moneyDisplay = DirectLabel(parent=self, relief=None, text=str(base.localAvatar.getTotalMoney()), text_scale=0.1, text_fg=(0.95, 0.95, 0, 1), text_shadow=(0, 0, 0, 1), text_pos=(0.34, 0.12), text_font=ToontownGlobals.getSignFont())
|
|
|
|
self.accept(localAvatar.uniqueName('moneyChange'), self.__moneyChange)
|
|
|
|
self.accept(localAvatar.uniqueName('bankMoneyChange'), self.__moneyChange)
|
|
|
|
self.petView = self.attachNewNode('petView')
|
|
|
|
self.petView.setPos(-0.05, 0, 1.15)
|
|
|
|
model.removeNode()
|
|
|
|
self.petSeeds = petSeeds
|
|
|
|
self.makePetList()
|
|
|
|
self.showPet()
|
2015-03-29 17:16:26 -05:00
|
|
|
return
|
2015-03-03 16:10:12 -06:00
|
|
|
|
|
|
|
def makePetList(self):
|
|
|
|
self.numPets = len(self.petSeeds)
|
|
|
|
self.curPet = 0
|
|
|
|
self.petDNA = []
|
|
|
|
self.petName = []
|
|
|
|
self.petDesc = []
|
|
|
|
self.petCost = []
|
2015-07-05 20:02:35 -05:00
|
|
|
for i in xrange(self.numPets):
|
2015-03-03 16:10:12 -06:00
|
|
|
random.seed(self.petSeeds[i])
|
2015-04-07 09:19:50 -05:00
|
|
|
zoneId = ZoneUtil.getCanonicalSafeZoneId(base.localAvatar.getZoneId())
|
2015-03-03 16:10:12 -06:00
|
|
|
name, dna, traitSeed = PetUtil.getPetInfoFromSeed(self.petSeeds[i], zoneId)
|
|
|
|
cost = PetUtil.getPetCostFromSeed(self.petSeeds[i], zoneId)
|
|
|
|
traits = PetTraits.PetTraits(traitSeed, zoneId)
|
|
|
|
traitList = traits.getExtremeTraitDescriptions()
|
|
|
|
numGenders = len(PetDNA.PetGenders)
|
|
|
|
gender = i % numGenders
|
|
|
|
PetDNA.setGender(dna, gender)
|
|
|
|
self.petDNA.append(dna)
|
|
|
|
self.petName.append(TTLocalizer.PetshopUnknownName)
|
|
|
|
descList = []
|
|
|
|
descList.append(TTLocalizer.PetshopDescGender % PetDNA.getGenderString(gender=gender))
|
|
|
|
if traitList:
|
|
|
|
descList.append(TTLocalizer.PetshopDescTrait % traitList[0])
|
|
|
|
else:
|
|
|
|
descList.append(TTLocalizer.PetshopDescTrait % TTLocalizer.PetshopDescStandard)
|
|
|
|
traitList.extend(['',
|
|
|
|
'',
|
|
|
|
'',
|
|
|
|
''])
|
|
|
|
for trait in traitList[1:4]:
|
|
|
|
descList.append('\t%s' % trait)
|
|
|
|
|
|
|
|
descList.append(TTLocalizer.PetshopDescCost % cost)
|
2015-03-29 10:41:02 -05:00
|
|
|
self.petDesc.append('\n'.join(descList))
|
2015-03-03 16:10:12 -06:00
|
|
|
self.petCost.append(cost)
|
|
|
|
|
|
|
|
def destroy(self):
|
|
|
|
self.ignore(localAvatar.uniqueName('moneyChange'))
|
|
|
|
self.ignore(localAvatar.uniqueName('bankMoneyChange'))
|
|
|
|
self.petModel.delete()
|
|
|
|
DirectFrame.destroy(self)
|
|
|
|
|
|
|
|
def __handlePetChange(self, nDir):
|
|
|
|
self.curPet = (self.curPet + nDir) % self.numPets
|
|
|
|
self.nameLabel.destroy()
|
|
|
|
self.petModel.delete()
|
|
|
|
self.descLabel.destroy()
|
|
|
|
self.showPet()
|
|
|
|
|
|
|
|
def showPet(self):
|
|
|
|
self.nameLabel = DirectLabel(parent=self, pos=(0, 0, 1.35), relief=None, text=self.petName[self.curPet], text_fg=Vec4(0.45, 0, 0.61, 1), text_pos=(0, 0), text_scale=0.08, text_shadow=(1, 1, 1, 1))
|
|
|
|
self.petModel = Pet.Pet(forGui=1)
|
|
|
|
self.petModel.setDNA(self.petDNA[self.curPet])
|
|
|
|
self.petModel.fitAndCenterHead(0.57, forGui=1)
|
|
|
|
self.petModel.reparentTo(self.petView)
|
|
|
|
self.petModel.setH(130)
|
2015-07-07 06:15:10 -05:00
|
|
|
self.petModel.setScale(0.125)
|
2015-03-03 16:10:12 -06:00
|
|
|
self.petModel.enterNeutralHappy()
|
|
|
|
self.descLabel = DirectLabel(parent=self, pos=(-0.4, 0, 0.72), relief=None, scale=0.05, text=self.petDesc[self.curPet], text_align=TextNode.ALeft, text_wordwrap=TTLocalizer.PGUIwordwrap, text_scale=TTLocalizer.PGUIdescLabel)
|
|
|
|
if self.petCost[self.curPet] > base.localAvatar.getTotalMoney():
|
|
|
|
self.okButton['state'] = DGG.DISABLED
|
|
|
|
else:
|
|
|
|
self.okButton['state'] = DGG.NORMAL
|
2015-03-29 17:16:26 -05:00
|
|
|
return
|
2015-03-03 16:10:12 -06:00
|
|
|
|
|
|
|
def __moneyChange(self, money):
|
|
|
|
self.moneyDisplay['text'] = str(base.localAvatar.getTotalMoney())
|
|
|
|
|
|
|
|
def __init__(self, eventDict, petSeeds):
|
|
|
|
self.eventDict = eventDict
|
|
|
|
self.mainMenuDoneEvent = 'MainMenuGuiDone'
|
|
|
|
self.adoptPetDoneEvent = 'AdoptPetGuiDone'
|
|
|
|
self.returnPetDoneEvent = 'ReturnPetGuiDone'
|
|
|
|
self.petChooserDoneEvent = 'PetChooserGuiDone'
|
|
|
|
self.fishGuiDoneEvent = 'MyFishGuiDone'
|
|
|
|
self.namePickerDoneEvent = 'NamePickerGuiDone'
|
|
|
|
self.goHomeDlgDoneEvent = 'GoHomeDlgDone'
|
|
|
|
self.dialog = None
|
|
|
|
self.dialogStack = []
|
|
|
|
self.petSeeds = petSeeds
|
|
|
|
self.timer = ToontownTimer.ToontownTimer()
|
|
|
|
self.timer.reparentTo(aspect2d)
|
|
|
|
self.timer.posInTopRightCorner()
|
|
|
|
self.timer.countdown(PetConstants.PETCLERK_TIMER, self.__timerExpired)
|
|
|
|
self.doDialog(Dialog_MainMenu)
|
2015-03-29 17:16:26 -05:00
|
|
|
return
|
2015-03-03 16:10:12 -06:00
|
|
|
|
|
|
|
def __timerExpired(self):
|
|
|
|
messenger.send(self.eventDict['guiDone'], [True])
|
|
|
|
|
|
|
|
def destroy(self):
|
|
|
|
self.destroyDialog()
|
|
|
|
self.timer.destroy()
|
|
|
|
del self.timer
|
|
|
|
self.ignore(self.mainMenuDoneEvent)
|
|
|
|
self.ignore(self.adoptPetDoneEvent)
|
|
|
|
self.ignore(self.returnPetDoneEvent)
|
|
|
|
self.ignore(self.petChooserDoneEvent)
|
|
|
|
self.ignore(self.fishGuiDoneEvent)
|
|
|
|
self.ignore(self.namePickerDoneEvent)
|
|
|
|
self.ignore(self.goHomeDlgDoneEvent)
|
|
|
|
|
|
|
|
def destroyDialog(self):
|
|
|
|
if self.dialog != None:
|
|
|
|
self.dialog.destroy()
|
|
|
|
self.dialog = None
|
2015-03-29 17:16:26 -05:00
|
|
|
return
|
2015-03-03 16:10:12 -06:00
|
|
|
|
|
|
|
def popDialog(self):
|
|
|
|
self.dialogStack.pop()
|
|
|
|
self.doDialog(self.dialogStack.pop())
|
|
|
|
|
|
|
|
def doDialog(self, nDialog):
|
|
|
|
self.destroyDialog()
|
|
|
|
self.dialogStack.append(nDialog)
|
|
|
|
if nDialog == Dialog_MainMenu:
|
|
|
|
self.acceptOnce(self.mainMenuDoneEvent, self.__handleMainMenuDlg)
|
|
|
|
self.dialog = self.MainMenuDlg(self.mainMenuDoneEvent)
|
|
|
|
elif nDialog == Dialog_AdoptPet:
|
|
|
|
self.acceptOnce(self.adoptPetDoneEvent, self.__handleAdoptPetDlg)
|
|
|
|
self.dialog = self.AdoptPetDlg(self.adoptPetDoneEvent, self.petSeeds[self.adoptPetNum], self.adoptPetNameIndex)
|
|
|
|
elif nDialog == Dialog_ChoosePet:
|
|
|
|
self.acceptOnce(self.petChooserDoneEvent, self.__handleChoosePetDlg)
|
|
|
|
self.dialog = self.ChoosePetDlg(self.petChooserDoneEvent, self.petSeeds)
|
|
|
|
elif nDialog == Dialog_ReturnPet:
|
|
|
|
self.acceptOnce(self.returnPetDoneEvent, self.__handleReturnPetDlg)
|
|
|
|
self.dialog = self.ReturnPetDlg(self.returnPetDoneEvent)
|
|
|
|
elif nDialog == Dialog_SellFish:
|
|
|
|
self.acceptOnce(self.fishGuiDoneEvent, self.__handleFishSellDlg)
|
|
|
|
self.dialog = FishSellGUI.FishSellGUI(self.fishGuiDoneEvent)
|
|
|
|
elif nDialog == Dialog_NamePicker:
|
|
|
|
self.acceptOnce(self.namePickerDoneEvent, self.__handleNamePickerDlg)
|
|
|
|
self.dialog = self.NamePicker(self.namePickerDoneEvent, self.petSeeds[self.adoptPetNum], gender=self.adoptPetNum % 2)
|
|
|
|
elif nDialog == Dialog_GoHome:
|
|
|
|
self.acceptOnce(self.goHomeDlgDoneEvent, self.__handleGoHomeDlg)
|
|
|
|
self.dialog = self.GoHomeDlg(self.goHomeDlgDoneEvent)
|
|
|
|
|
|
|
|
def __handleMainMenuDlg(self, exitVal):
|
|
|
|
if exitVal == 0:
|
|
|
|
messenger.send(self.eventDict['guiDone'])
|
|
|
|
elif exitVal == 1:
|
|
|
|
self.doDialog(Dialog_SellFish)
|
|
|
|
elif exitVal == 2:
|
|
|
|
self.doDialog(Dialog_ChoosePet)
|
|
|
|
elif exitVal == 3:
|
|
|
|
self.doDialog(Dialog_ReturnPet)
|
|
|
|
|
|
|
|
def __handleFishSellDlg(self, exitVal):
|
|
|
|
if exitVal == 0:
|
|
|
|
self.popDialog()
|
|
|
|
elif exitVal == 1:
|
|
|
|
self.destroyDialog()
|
|
|
|
messenger.send(self.eventDict['fishSold'])
|
|
|
|
|
|
|
|
def __handleChoosePetDlg(self, exitVal):
|
|
|
|
if exitVal == -1:
|
|
|
|
self.popDialog()
|
|
|
|
else:
|
|
|
|
self.adoptPetNum = exitVal
|
|
|
|
self.doDialog(Dialog_NamePicker)
|
|
|
|
|
|
|
|
def __handleNamePickerDlg(self, exitVal):
|
|
|
|
if exitVal == -1:
|
|
|
|
self.popDialog()
|
|
|
|
else:
|
|
|
|
self.adoptPetNameIndex = exitVal
|
|
|
|
if base.localAvatar.hasPet():
|
|
|
|
self.doDialog(Dialog_ReturnPet)
|
|
|
|
else:
|
|
|
|
self.doDialog(Dialog_AdoptPet)
|
|
|
|
|
|
|
|
def __handleAdoptPetDlg(self, exitVal):
|
|
|
|
if exitVal == 0:
|
|
|
|
self.popDialog()
|
|
|
|
elif exitVal == 1:
|
|
|
|
self.destroyDialog()
|
|
|
|
messenger.send(self.eventDict['petAdopted'], [self.adoptPetNum, self.adoptPetNameIndex])
|
|
|
|
messenger.send(self.eventDict['guiDone'])
|
|
|
|
|
|
|
|
def __handleGoHomeDlg(self, exitVal):
|
|
|
|
if exitVal == 0:
|
|
|
|
messenger.send(self.eventDict['guiDone'])
|
|
|
|
elif exitVal == 1:
|
|
|
|
messenger.send(self.eventDict['guiDone'])
|
|
|
|
place = base.cr.playGame.getPlace()
|
|
|
|
if place == None:
|
|
|
|
self.notify.warning('Tried to go home, but place is None.')
|
|
|
|
return
|
|
|
|
place.goHomeNow(base.localAvatar.lastHood)
|
2015-03-29 17:16:26 -05:00
|
|
|
return
|
2015-03-03 16:10:12 -06:00
|
|
|
|
|
|
|
def __handleReturnPetDlg(self, exitVal):
|
|
|
|
if exitVal == 0:
|
|
|
|
self.popDialog()
|
|
|
|
elif exitVal == 1:
|
|
|
|
if self.dialogStack[len(self.dialogStack) - 2] == Dialog_NamePicker:
|
|
|
|
self.doDialog(Dialog_AdoptPet)
|
|
|
|
else:
|
|
|
|
self.destroyDialog()
|
|
|
|
messenger.send(self.eventDict['petReturned'])
|
|
|
|
messenger.send(self.eventDict['guiDone'])
|