toontown-just-works/toontown/toon/NPCFriendPanel.py
2024-07-07 18:08:39 -05:00

218 lines
8.5 KiB
Python

from direct.gui.DirectGui import *
from toontown.toonbase import TTLocalizer, ToontownGlobals, ToontownBattleGlobals
import NPCToons, ToonDNA, ToonHead
def createNPCToonHead(NPCID, dimension = 0.5):
NPCInfo = NPCToons.NPCToonDict[NPCID]
dnaList = NPCInfo[2]
gender = NPCInfo[3]
if dnaList == 'r':
dnaList = NPCToons.getRandomDNA(NPCID, gender)
dna = ToonDNA.ToonDNA()
dna.newToonFromProperties(*dnaList)
head = ToonHead.ToonHead()
head.setupHead(dna, forGui=1)
fitGeometry(head, fFlip=1, dimension=dimension)
return head
def fitGeometry(geom, fFlip = 0, dimension = 0.5):
p1 = Point3()
p2 = Point3()
geom.calcTightBounds(p1, p2)
if fFlip:
t = p1[0]
p1.setX(-p2[0])
p2.setX(-t)
d = p2 - p1
biggest = max(d[0], d[2])
s = dimension / biggest
mid = (p1 + d / 2.0) * s
geomXform = hidden.attachNewNode('geomXform')
for child in geom.getChildren():
child.reparentTo(geomXform)
geomXform.setPosHprScale(-mid[0], -mid[1] + 1, -mid[2], 180, 0, 0, s, s, s)
geomXform.reparentTo(geom)
class NPCFriendPanel(DirectFrame):
def __init__(self, parent = aspect2d, callable = False, **kw):
optiondefs = (('relief', None, None), ('doneEvent', None, None))
self.defineoptions(kw, optiondefs)
DirectFrame.__init__(self, parent=parent)
self.callable = callable
self.cardList = []
self.friendDict = {}
self.pos = 0
self.updateLayout()
self.initialiseoptions(NPCFriendPanel)
gui = loader.loadModel('phase_3.5/models/gui/battle_gui')
buttonImage = (gui.find('**/PckMn_BackBtn'), gui.find('**/PckMn_BackBtn_Dn'), gui.find('**/PckMn_BackBtn_Rlvr'))
self.leftArrow = DirectButton(parent=self, relief=None, image=buttonImage, pos=(-6.8, 0, 0), scale=3.8, command=self.addPageIndex, extraArgs=[-1])
self.rightArrow = DirectButton(parent=self, relief=None, image=buttonImage, pos=(6.8, 0, 0), scale=-3.8, command=self.addPageIndex, extraArgs=[1])
gui.removeNode()
self.leftArrow.hide()
def addPageIndex(self, index):
self.pos += (16 * index)
if self.pos > 0:
self.leftArrow.show()
else:
self.leftArrow.hide()
self.update()
def update(self):
friendList = sorted(self.friendDict.keys(), reverse=True, key=lambda id: NPCToons.getNPCTrackLevelHpRarity(id)[3])
cardNum = 0
for i in xrange(self.pos, self.pos + 16):
card = self.cardList[cardNum]
if len(friendList) > i:
npcId = friendList[i]
card.update(npcId, self.friendDict[npcId], self.callable)
self.rightArrow.show()
else:
card.update(None, 0, self.callable)
self.rightArrow.hide()
cardNum += 1
def updateLayout(self):
for card in self.cardList:
card.destroy()
self.cardList = []
xOffset = -5.2
yOffset = 3.5
count = 0
for i in xrange(16):
card = NPCFriendCard(parent=self, doneEvent=self['doneEvent'])
self.cardList.append(card)
card.setPos(xOffset, 1, yOffset)
card.setScale(0.75)
xOffset += 3.5
count += 1
if count % 4 == 0:
xOffset = -5.25
yOffset += -2.45
def setFriends(self, friends):
self.friendDict = friends
class NPCFriendCard(DirectFrame):
normalTextColor = (0.3, 0.25, 0.2, 1)
maxRarity = 5
sosTracks = ToontownBattleGlobals.Tracks + ToontownBattleGlobals.NPCTracks
def __init__(self, parent = aspect2dp, **kw):
optiondefs = (('NPCID', 'Uninitialized', None), ('relief', None, None), ('doneEvent', None, None))
self.defineoptions(kw, optiondefs)
DirectFrame.__init__(self, parent=parent)
self.initialiseoptions(NPCFriendCard)
cardModel = loader.loadModel('phase_3.5/models/gui/playingCard')
self.front = DirectFrame(parent=self, relief=None, image=cardModel.find('**/card_front'))
self.front.hide()
self.back = DirectFrame(parent=self, relief=None, image=cardModel.find('**/card_back'))
self.sosTypeInfo = DirectLabel(parent=self.front, relief=None, text='', text_font=ToontownGlobals.getMinnieFont(), text_fg=self.normalTextColor, text_scale=0.35, text_align=TextNode.ACenter, text_wordwrap=16.0, pos=(0, 0, 1.15))
self.NPCHead = None
self.NPCName = DirectLabel(parent=self.front, relief=None, text='', text_fg=self.normalTextColor, text_scale=0.4, text_align=TextNode.ACenter, text_wordwrap=8.0, pos=(0, 0, -0.45))
buttonModels = loader.loadModel('phase_3.5/models/gui/inventory_gui')
upButton = buttonModels.find('**/InventoryButtonUp')
downButton = buttonModels.find('**/InventoryButtonDown')
rolloverButton = buttonModels.find('**/InventoryButtonRollover')
self.sosCallButton = DirectButton(parent=self.front, relief=None, text=TTLocalizer.NPCCallButtonLabel, text_fg=self.normalTextColor, text_scale=0.28, text_align=TextNode.ACenter, image=(upButton,
downButton,
rolloverButton,
upButton), image_color=(1.0, 0.2, 0.2, 1), image0_color=Vec4(1.0, 0.4, 0.4, 1), image3_color=Vec4(1.0, 0.4, 0.4, 0.4), image_scale=(4.4, 1, 3.6), image_pos=Vec3(0, 0, 0.08), pos=(-1.15, 0, -0.9), scale=1.25, command=self.__chooseNPCFriend)
self.sosCallButton.hide()
self.sosCountInfo = DirectLabel(parent=self.front, relief=None, text='', text_fg=self.normalTextColor, text_scale=0.75, text_align=TextNode.ALeft, textMayChange=1, pos=(0.0, 0, -1.0))
star = loader.loadModel('phase_3.5/models/gui/name_star')
self.rarityStars = []
for i in xrange(self.maxRarity):
label = DirectLabel(parent=self.front, relief=None, image=star, image_scale=0.2, image_color=Vec4(0.502, 0.251, 0.251, 1.0), pos=(1.1 - i * 0.24, 0, -1.2))
label.hide()
self.rarityStars.append(label)
def __chooseNPCFriend(self):
if self['NPCID'] and self['doneEvent']:
doneStatus = {}
doneStatus['mode'] = 'NPCFriend'
doneStatus['friend'] = self['NPCID']
messenger.send(self['doneEvent'], [doneStatus])
def destroy(self):
if self.NPCHead:
self.NPCHead.detachNode()
self.NPCHead.delete()
DirectFrame.destroy(self)
def update(self, NPCID, count = 0, fCallable = 0):
oldNPCID = self['NPCID']
self['NPCID'] = NPCID
if NPCID != oldNPCID:
if self.NPCHead:
self.NPCHead.detachNode()
self.NPCHead.delete()
if NPCID is None:
self.showBack()
return
self.front.show()
self.back.hide()
self.NPCName['text'] = TTLocalizer.NPCToonNames[NPCID]
self.NPCHead = createNPCToonHead(NPCID, dimension=1.2)
self.NPCHead.reparentTo(self.front)
self.NPCHead.setZ(0.45)
track, level, hp, rarity = NPCToons.getNPCTrackLevelHpRarity(NPCID)
sosText = self.sosTracks[track]
if track == ToontownBattleGlobals.NPC_RESTOCK_GAGS:
if level == -1:
sosText += ' All'
else:
sosText += ' ' + self.sosTracks[level]
sosText = TextEncoder.upper(sosText)
self.sosTypeInfo['text'] = sosText
for i in xrange(self.maxRarity):
if i < rarity:
self.rarityStars[i].show()
else:
self.rarityStars[i].hide()
if fCallable:
self.sosCallButton.show()
self.sosCountInfo.setPos(-0.4, 0, -0.9)
self.sosCountInfo['text_scale'] = 0.4
self.sosCountInfo['text_align'] = TextNode.ALeft
else:
self.sosCallButton.hide()
self.sosCountInfo.setPos(0, 0, -0.9)
self.sosCountInfo['text_scale'] = 0.5
self.sosCountInfo['text_align'] = TextNode.ACenter
if count > 0:
countText = TTLocalizer.NPCFriendPanelRemaining % count
self.sosCallButton['state'] = DGG.NORMAL
else:
countText = TTLocalizer.NPCFriendUnavailable
self.sosCallButton['state'] = DGG.DISABLED
self.sosCountInfo['text'] = countText
return
def showFront(self):
self.front.show()
self.back.hide()
def showBack(self):
self.front.hide()
self.back.show()