oldschool-toontown/toontown/shtiker/SuitPage.py

590 lines
21 KiB
Python
Raw Normal View History

from . import ShtikerPage
2019-11-02 17:27:54 -05:00
from direct.task.Task import Task
from . import SummonCogDialog
2019-11-02 17:27:54 -05:00
from direct.gui.DirectGui import *
from pandac.PandaModules import *
from toontown.toonbase import ToontownGlobals
from toontown.toonbase import TTLocalizer
from toontown.suit import SuitDNA
from toontown.suit import Suit
from toontown.battle import SuitBattleGlobals
from .CogPageGlobals import *
2019-11-02 17:27:54 -05:00
SCALE_FACTOR = 1.5
RADAR_DELAY = 0.2
BUILDING_RADAR_POS = (0.375,
0.065,
-0.225,
-0.5)
PANEL_COLORS = (Vec4(0.8, 0.78, 0.77, 1),
Vec4(0.75, 0.78, 0.8, 1),
Vec4(0.75, 0.82, 0.79, 1),
Vec4(0.825, 0.76, 0.77, 1))
PANEL_COLORS_COMPLETE1 = (Vec4(0.7, 0.725, 0.545, 1),
Vec4(0.625, 0.725, 0.65, 1),
Vec4(0.6, 0.75, 0.525, 1),
Vec4(0.675, 0.675, 0.55, 1))
PANEL_COLORS_COMPLETE2 = (Vec4(0.9, 0.725, 0.32, 1),
Vec4(0.825, 0.725, 0.45, 1),
Vec4(0.8, 0.75, 0.325, 1),
Vec4(0.875, 0.675, 0.35, 1))
SHADOW_SCALE_POS = ((1.225,
0,
10,
-0.03),
(0.9,
0,
10,
0),
(1.125,
0,
10,
-0.015),
(1.0,
0,
10,
-0.02),
(1.0,
-0.02,
10,
-0.01),
(1.05,
0,
10,
-0.0425),
(1.0,
0,
10,
-0.05),
(0.9,
-0.0225,
10,
-0.025),
(1.25,
0,
10,
-0.03),
(1.0,
0,
10,
-0.01),
(1.0,
0.005,
10,
-0.01),
(1.0,
0,
10,
-0.01),
(0.9,
0.005,
10,
-0.01),
(0.95,
0,
10,
-0.01),
(1.125,
0.005,
10,
-0.035),
(0.85,
-0.005,
10,
-0.035),
(1.2,
0,
10,
-0.01),
(1.05,
0,
10,
0),
(1.1,
0,
10,
-0.04),
(1.0,
0,
10,
0),
(0.95,
0.0175,
10,
-0.015),
(1.0,
0,
10,
-0.06),
(0.95,
0.02,
10,
-0.0175),
(0.9,
0,
10,
-0.03),
(1.15,
0,
10,
-0.01),
(1.0,
0,
10,
0),
(1.0,
0,
10,
0),
(1.1,
0,
10,
-0.04),
(0.93,
0.005,
10,
-0.01),
(0.95,
0.005,
10,
-0.01),
(1.0,
0,
10,
-0.02),
(0.9,
0.0025,
10,
-0.03))
class SuitPage(ShtikerPage.ShtikerPage):
def __init__(self):
ShtikerPage.ShtikerPage.__init__(self)
def load(self):
ShtikerPage.ShtikerPage.load(self)
frameModel = loader.loadModel('phase_3.5/models/gui/suitpage_frame')
frameModel.setScale(0.03375, 1, 0.045)
frameModel.setPos(0, 10, -0.575)
self.guiTop = NodePath('guiTop')
self.guiTop.reparentTo(self)
self.frameNode = NodePath('frameNode')
self.frameNode.reparentTo(self.guiTop)
self.panelNode = NodePath('panelNode')
self.panelNode.reparentTo(self.guiTop)
self.iconNode = NodePath('iconNode')
self.iconNode.reparentTo(self.guiTop)
self.enlargedPanelNode = NodePath('enlargedPanelNode')
self.enlargedPanelNode.reparentTo(self.guiTop)
frame = frameModel.find('**/frame')
frame.wrtReparentTo(self.frameNode)
screws = frameModel.find('**/screws')
screws.wrtReparentTo(self.iconNode)
icons = frameModel.find('**/icons')
del frameModel
self.title = DirectLabel(parent=self.iconNode, relief=None, text=TTLocalizer.SuitPageTitle, text_scale=0.1, text_pos=(0.04, 0), textMayChange=0)
self.radarButtons = []
icon = icons.find('**/corp_icon')
self.corpRadarButton = DirectButton(parent=self.iconNode, relief=None, state=DGG.DISABLED, image=icon, image_scale=(0.03375, 1, 0.045), image2_color=Vec4(1.0, 1.0, 1.0, 0.75), pos=(-0.2, 10, -0.575), command=self.toggleRadar, extraArgs=[0])
self.radarButtons.append(self.corpRadarButton)
icon = icons.find('**/legal_icon')
self.legalRadarButton = DirectButton(parent=self.iconNode, relief=None, state=DGG.DISABLED, image=icon, image_scale=(0.03375, 1, 0.045), image2_color=Vec4(1.0, 1.0, 1.0, 0.75), pos=(-0.2, 10, -0.575), command=self.toggleRadar, extraArgs=[1])
self.radarButtons.append(self.legalRadarButton)
icon = icons.find('**/money_icon')
self.moneyRadarButton = DirectButton(parent=self.iconNode, relief=None, state=DGG.DISABLED, image=(icon, icon, icon), image_scale=(0.03375, 1, 0.045), image2_color=Vec4(1.0, 1.0, 1.0, 0.75), pos=(-0.2, 10, -0.575), command=self.toggleRadar, extraArgs=[2])
self.radarButtons.append(self.moneyRadarButton)
icon = icons.find('**/sales_icon')
self.salesRadarButton = DirectButton(parent=self.iconNode, relief=None, state=DGG.DISABLED, image=(icon, icon, icon), image_scale=(0.03375, 1, 0.045), image2_color=Vec4(1.0, 1.0, 1.0, 0.75), pos=(-0.2, 10, -0.575), command=self.toggleRadar, extraArgs=[3])
self.radarButtons.append(self.salesRadarButton)
for radarButton in self.radarButtons:
radarButton.building = 0
radarButton.buildingRadarLabel = None
gui = loader.loadModel('phase_3.5/models/gui/suitpage_gui')
self.panelModel = gui.find('**/card')
self.shadowModels = []
for index in range(1, len(SuitDNA.suitHeadTypes) + 1):
self.shadowModels.append(gui.find('**/shadow' + str(index)))
del gui
self.makePanels()
self.radarOn = [0,
0,
0,
0]
priceScale = 0.1
emblemIcon = loader.loadModel('phase_3.5/models/gui/tt_m_gui_gen_emblemIcons')
silverModel = emblemIcon.find('**/tt_t_gui_gen_emblemSilver')
goldModel = emblemIcon.find('**/tt_t_gui_gen_emblemGold')
self.silverLabel = DirectLabel(parent=self, relief=None, pos=(-0.25, 0, -0.69), scale=priceScale, image=silverModel, image_pos=(-0.4, 0, 0.4), text=str(localAvatar.emblems[ToontownGlobals.EmblemTypes.Silver]), text_fg=(0.95, 0.95, 0, 1), text_shadow=(0, 0, 0, 1), text_font=ToontownGlobals.getSignFont(), text_align=TextNode.ALeft)
self.goldLabel = DirectLabel(parent=self, relief=None, pos=(0.25, 0, -0.69), scale=priceScale, image=goldModel, image_pos=(-0.4, 0, 0.4), text=str(localAvatar.emblems[ToontownGlobals.EmblemTypes.Gold]), text_fg=(0.95, 0.95, 0, 1), text_shadow=(0, 0, 0, 1), text_font=ToontownGlobals.getSignFont(), text_align=TextNode.ALeft)
if not base.cr.wantEmblems:
self.silverLabel.hide()
self.goldLabel.hide()
self.accept(localAvatar.uniqueName('emblemsChange'), self.__emblemChange)
self.guiTop.setZ(0.625)
return
def unload(self):
self.ignoreAll()
self.title.destroy()
self.corpRadarButton.destroy()
self.legalRadarButton.destroy()
self.moneyRadarButton.destroy()
self.salesRadarButton.destroy()
for panel in self.panels:
panel.destroy()
del self.panels
for shadow in self.shadowModels:
shadow.removeNode()
self.panelModel.removeNode()
ShtikerPage.ShtikerPage.unload(self)
def enter(self):
self.updatePage()
self.bigPanel = None
self.nextPanel = None
ShtikerPage.ShtikerPage.enter(self)
return
def exit(self):
taskMgr.remove('buildingListResponseTimeout-later')
taskMgr.remove('suitListResponseTimeout-later')
taskMgr.remove('showCogRadarLater')
taskMgr.remove('showBuildingRadarLater')
for index in range(0, len(self.radarOn)):
if self.radarOn[index]:
self.toggleRadar(index)
self.radarButtons[index]['state'] = DGG.NORMAL
ShtikerPage.ShtikerPage.exit(self)
def __emblemChange(self, newEmblems):
self.silverLabel['text'] = str(newEmblems[0])
self.goldLabel['text'] = str(newEmblems[1])
def grow(self, panel, pos):
if self.bigPanel:
print('setting next panel - ' + str(panel))
2019-11-02 17:27:54 -05:00
self.nextPanel = panel
self.nextPanelPos = pos
return
print('big panel - ' + str(panel))
2019-11-02 17:27:54 -05:00
self.bigPanel = panel
panel.reparentTo(self.enlargedPanelNode)
panel.setScale(panel.getScale() * SCALE_FACTOR)
if panel.summonButton:
panel.summonButton.show()
panel.summonButton['state'] = DGG.NORMAL
def shrink(self, panel, pos):
print('trying to shrink - ' + str(panel))
2019-11-02 17:27:54 -05:00
if panel != self.bigPanel:
self.nextPanel = None
return
print('shrink panel - ' + str(panel))
2019-11-02 17:27:54 -05:00
self.bigPanel = None
panel.setScale(panel.scale)
panel.reparentTo(self.panelNode)
if panel.summonButton:
panel.summonButton.hide()
panel.summonButton['state'] = DGG.DISABLED
if self.nextPanel:
self.grow(self.nextPanel, self.nextPanelPos)
return
def toggleRadar(self, deptNum):
messenger.send('wakeup')
if self.radarOn[deptNum]:
self.radarOn[deptNum] = 0
else:
self.radarOn[deptNum] = 1
deptSize = SuitDNA.suitsPerDept
panels = self.panels[deptSize * deptNum:SuitDNA.suitsPerDept * (deptNum + 1)]
if self.radarOn[deptNum]:
if hasattr(base.cr, 'currSuitPlanner'):
if base.cr.currSuitPlanner != None:
base.cr.currSuitPlanner.d_suitListQuery()
self.acceptOnce('suitListResponse', self.updateCogRadar, extraArgs=[deptNum, panels])
taskMgr.doMethodLater(1.0, self.suitListResponseTimeout, 'suitListResponseTimeout-later', extraArgs=(deptNum, panels))
if self.radarButtons[deptNum].building:
base.cr.currSuitPlanner.d_buildingListQuery()
self.acceptOnce('buildingListResponse', self.updateBuildingRadar, extraArgs=[deptNum])
taskMgr.doMethodLater(1.0, self.buildingListResponseTimeout, 'buildingListResponseTimeout-later', extraArgs=(deptNum,))
else:
self.updateCogRadar(deptNum, panels)
self.updateBuildingRadar(deptNum)
else:
self.updateCogRadar(deptNum, panels)
self.updateBuildingRadar(deptNum)
self.radarButtons[deptNum]['state'] = DGG.DISABLED
else:
self.updateCogRadar(deptNum, panels)
self.updateBuildingRadar(deptNum)
return
def suitListResponseTimeout(self, deptNum, panels):
self.updateCogRadar(deptNum, panels, 1)
def buildingListResponseTimeout(self, deptNum):
self.updateBuildingRadar(deptNum, 1)
def makePanels(self):
self.panels = []
base.panels = []
xStart = -0.66
yStart = -0.18
xOffset = 0.199
yOffset = 0.284
for dept in range(0, len(SuitDNA.suitDepts)):
row = []
color = PANEL_COLORS[dept]
for type in range(0, SuitDNA.suitsPerDept):
panel = DirectLabel(parent=self.panelNode, pos=(xStart + type * xOffset, 0.0, yStart - dept * yOffset), relief=None, state=DGG.NORMAL, image=self.panelModel, image_scale=(1, 1, 1), image_color=color, text=TTLocalizer.SuitPageMystery, text_scale=0.045, text_fg=(0, 0, 0, 1), text_pos=(0, 0.185, 0), text_font=ToontownGlobals.getSuitFont(), text_wordwrap=7)
panel.scale = 0.6
panel.setScale(panel.scale)
panel.quotaLabel = None
panel.head = None
panel.shadow = None
panel.count = 0
panel.summonButton = None
self.addCogRadarLabel(panel)
self.panels.append(panel)
base.panels.append(panel)
return
def addQuotaLabel(self, panel):
index = self.panels.index(panel)
count = str(base.localAvatar.cogCounts[index])
if base.localAvatar.cogs[index] < COG_COMPLETE1:
quota = str(COG_QUOTAS[0][index % SuitDNA.suitsPerDept])
else:
quota = str(COG_QUOTAS[1][index % SuitDNA.suitsPerDept])
quotaLabel = DirectLabel(parent=panel, pos=(0.0, 0.0, -0.215), relief=None, state=DGG.DISABLED, text=TTLocalizer.SuitPageQuota % (count, quota), text_scale=0.045, text_fg=(0, 0, 0, 1), text_font=ToontownGlobals.getSuitFont())
panel.quotaLabel = quotaLabel
return
def addSuitHead(self, panel, suitName):
panelIndex = self.panels.index(panel)
shadow = panel.attachNewNode('shadow')
shadowModel = self.shadowModels[panelIndex]
shadowModel.copyTo(shadow)
coords = SHADOW_SCALE_POS[panelIndex]
shadow.setScale(coords[0])
shadow.setPos(coords[1], coords[2], coords[3])
panel.shadow = shadow
panel.head = Suit.attachSuitHead(panel, suitName)
def addCogRadarLabel(self, panel):
cogRadarLabel = DirectLabel(parent=panel, pos=(0.0, 0.0, -0.215), relief=None, state=DGG.DISABLED, text='', text_scale=0.05, text_fg=(0, 0, 0, 1), text_font=ToontownGlobals.getSuitFont())
panel.cogRadarLabel = cogRadarLabel
return
def addSummonButton(self, panel):
buttons = loader.loadModel('phase_3/models/gui/dialog_box_buttons_gui')
okButtonList = (buttons.find('**/ChtBx_OKBtn_UP'), buttons.find('**/ChtBx_OKBtn_DN'), buttons.find('**/ChtBx_OKBtn_Rllvr'))
gui = loader.loadModel('phase_3.5/models/gui/stickerbook_gui')
iconGeom = gui.find('**/summons')
summonButton = DirectButton(parent=panel, pos=(0.1, 0.0, -0.13), scale=0.1, relief=None, state=DGG.NORMAL, image=okButtonList, image_scale=13.0, geom=iconGeom, geom_scale=0.7, text=('',
TTLocalizer.IssueSummons,
TTLocalizer.IssueSummons,
''), text_scale=0.4, text_pos=(-1.1, -0.4), command=self.summonButtonPressed, extraArgs=[panel])
panel.summonButton = summonButton
return
def summonButtonPressed(self, panel):
panelIndex = self.panels.index(panel)
self.summonDialog = SummonCogDialog.SummonCogDialog(panelIndex)
self.summonDialog.load()
self.accept(self.summonDialog.doneEvent, self.summonDone, extraArgs=[panel])
self.summonDialog.enter()
def summonDone(self, panel):
if self.summonDialog:
self.summonDialog.unload()
self.summonDialog = None
index = self.panels.index(panel)
if not base.localAvatar.hasCogSummons(index):
panel.summonButton.hide()
return
def addBuildingRadarLabel(self, button):
gui = loader.loadModel('phase_3.5/models/gui/suit_detail_panel')
zPos = BUILDING_RADAR_POS[self.radarButtons.index(button)]
buildingRadarLabel = DirectLabel(parent=button, relief=None, pos=(0.225, 0.0, zPos), state=DGG.DISABLED, image=gui.find('**/avatar_panel'), image_hpr=(0, 0, 90), image_scale=(0.05, 1, 0.1), image_pos=(0, 0, 0.015), text=TTLocalizer.SuitPageBuildingRadarP % '0', text_scale=0.05, text_fg=(1, 0, 0, 1), text_font=ToontownGlobals.getSuitFont())
gui.removeNode()
button.buildingRadarLabel = buildingRadarLabel
return
def resetPanel(self, dept, type):
panel = self.panels[dept * SuitDNA.suitsPerDept + type]
panel['text'] = TTLocalizer.SuitPageMystery
if panel.cogRadarLabel:
panel.cogRadarLabel.hide()
if panel.quotaLabel:
panel.quotaLabel.hide()
if panel.head:
panel.head.hide()
if panel.shadow:
panel.shadow.hide()
if panel.summonButton:
panel.summonButton.hide()
color = PANEL_COLORS[dept]
panel['image_color'] = color
for button in self.radarButtons:
if button.buildingRadarLabel:
button.buildingRadarLabel.hide()
def setPanelStatus(self, panel, status):
index = self.panels.index(panel)
if status == COG_UNSEEN:
panel['text'] = TTLocalizer.SuitPageMystery
elif status == COG_BATTLED:
suitName = SuitDNA.suitHeadTypes[index]
suitFullName = SuitBattleGlobals.SuitAttributes[suitName]['name']
panel['text'] = suitFullName
if panel.quotaLabel:
panel.quotaLabel.show()
else:
self.addQuotaLabel(panel)
if panel.head and panel.shadow:
panel.head.show()
panel.shadow.show()
else:
self.addSuitHead(panel, suitName)
if base.localAvatar.hasCogSummons(index):
if panel.summonButton:
panel.summonButton.show()
else:
self.addSummonButton(panel)
elif status == COG_DEFEATED:
count = str(base.localAvatar.cogCounts[index])
if base.localAvatar.cogs[index] < COG_COMPLETE1:
quota = str(COG_QUOTAS[0][index % SuitDNA.suitsPerDept])
else:
quota = str(COG_QUOTAS[1][index % SuitDNA.suitsPerDept])
panel.quotaLabel['text'] = TTLocalizer.SuitPageQuota % (count, quota)
elif status == COG_COMPLETE1:
panel['image_color'] = PANEL_COLORS_COMPLETE1[index / SuitDNA.suitsPerDept]
elif status == COG_COMPLETE2:
panel['image_color'] = PANEL_COLORS_COMPLETE2[index / SuitDNA.suitsPerDept]
def updateAllCogs(self, status):
for index in range(0, len(base.localAvatar.cogs)):
base.localAvatar.cogs[index] = status
self.updatePage()
def updatePage(self):
index = 0
cogs = base.localAvatar.cogs
for dept in range(0, len(SuitDNA.suitDepts)):
for type in range(0, SuitDNA.suitsPerDept):
self.updateCogStatus(dept, type, cogs[index])
index += 1
self.updateCogRadarButtons(base.localAvatar.cogRadar)
self.updateBuildingRadarButtons(base.localAvatar.buildingRadar)
def updateCogStatus(self, dept, type, status):
if dept < 0 or dept > len(SuitDNA.suitDepts):
print('ucs: bad cog dept: ', dept)
2019-11-02 17:27:54 -05:00
elif type < 0 or type > SuitDNA.suitsPerDept:
print('ucs: bad cog type: ', type)
2019-11-02 17:27:54 -05:00
elif status < COG_UNSEEN or status > COG_COMPLETE2:
print('ucs: bad status: ', status)
2019-11-02 17:27:54 -05:00
else:
self.resetPanel(dept, type)
panel = self.panels[dept * SuitDNA.suitsPerDept + type]
if status == COG_UNSEEN:
self.setPanelStatus(panel, COG_UNSEEN)
elif status == COG_BATTLED:
self.setPanelStatus(panel, COG_BATTLED)
elif status == COG_DEFEATED:
self.setPanelStatus(panel, COG_BATTLED)
self.setPanelStatus(panel, COG_DEFEATED)
elif status == COG_COMPLETE1:
self.setPanelStatus(panel, COG_BATTLED)
self.setPanelStatus(panel, COG_DEFEATED)
self.setPanelStatus(panel, COG_COMPLETE1)
elif status == COG_COMPLETE2:
self.setPanelStatus(panel, COG_BATTLED)
self.setPanelStatus(panel, COG_DEFEATED)
self.setPanelStatus(panel, COG_COMPLETE2)
def updateCogRadarButtons(self, radars):
for index in range(0, len(radars)):
if radars[index] == 1:
self.radarButtons[index]['state'] = DGG.NORMAL
def updateCogRadar(self, deptNum, panels, timeout = 0):
taskMgr.remove('suitListResponseTimeout-later')
if not timeout and hasattr(base.cr, 'currSuitPlanner') and base.cr.currSuitPlanner != None:
cogList = base.cr.currSuitPlanner.suitList
else:
cogList = []
for panel in panels:
panel.count = 0
for cog in cogList:
self.panels[cog].count += 1
for panel in panels:
panel.cogRadarLabel['text'] = TTLocalizer.SuitPageCogRadar % panel.count
if self.radarOn[deptNum]:
panel.quotaLabel.hide()
def showLabel(label):
label.show()
taskMgr.doMethodLater(RADAR_DELAY * panels.index(panel), showLabel, 'showCogRadarLater', extraArgs=(panel.cogRadarLabel,))
def activateButton(s = self, index = deptNum):
self.radarButtons[index]['state'] = DGG.NORMAL
return Task.done
if not self.radarButtons[deptNum].building:
taskMgr.doMethodLater(RADAR_DELAY * len(panels), activateButton, 'activateButtonLater')
else:
panel.cogRadarLabel.hide()
panel.quotaLabel.show()
return
def updateBuildingRadarButtons(self, radars):
for index in range(0, len(radars)):
if radars[index] == 1:
self.radarButtons[index].building = 1
def updateBuildingRadar(self, deptNum, timeout = 0):
taskMgr.remove('buildingListResponseTimeout-later')
if not timeout and hasattr(base.cr, 'currSuitPlanner') and base.cr.currSuitPlanner != None:
buildingList = base.cr.currSuitPlanner.buildingList
else:
buildingList = [0,
0,
0,
0]
button = self.radarButtons[deptNum]
if button.building:
if not button.buildingRadarLabel:
self.addBuildingRadarLabel(button)
if self.radarOn[deptNum]:
num = buildingList[deptNum]
if num == 1:
button.buildingRadarLabel['text'] = TTLocalizer.SuitPageBuildingRadarS % num
else:
button.buildingRadarLabel['text'] = TTLocalizer.SuitPageBuildingRadarP % num
def showLabel(button):
button.buildingRadarLabel.show()
button['state'] = DGG.NORMAL
taskMgr.doMethodLater(RADAR_DELAY * SuitDNA.suitsPerDept, showLabel, 'showBuildingRadarLater', extraArgs=(button,))
else:
button.buildingRadarLabel.hide()
return