toontown-just-works/toontown/shtiker/QuestPage.py
2024-07-07 18:08:39 -05:00

174 lines
5.5 KiB
Python

from panda3d.core import *
import ShtikerPage
from direct.gui.DirectGui import *
from toontown.quest import Quests
from toontown.toon import NPCToons
from toontown.hood import ZoneUtil
from toontown.toonbase import ToontownGlobals
from toontown.toonbase import TTLocalizer
from toontown.quest import QuestBookPoster
from direct.directnotify import DirectNotifyGlobal
class QuestPage(ShtikerPage.ShtikerPage):
notify = DirectNotifyGlobal.directNotify.newCategory('QuestPage')
def __init__(self):
ShtikerPage.ShtikerPage.__init__(self)
self.quests = {0: None,
1: None,
2: None,
3: None}
self.textRolloverColor = Vec4(1, 1, 0, 1)
self.textDownColor = Vec4(0.5, 0.9, 1, 1)
self.textDisabledColor = Vec4(0.4, 0.8, 0.4, 1)
self.onscreen = 0
self.lastQuestTime = globalClock.getRealTime()
return
def load(self):
self.title = DirectLabel(parent=self, relief=None, text=TTLocalizer.QuestPageToonTasks, text_scale=0.12, textMayChange=0, pos=(0, 0, 0.6))
questFramePlaceList = ((-0.45,
0,
0.25,
0,
0,
0),
(-0.45,
0,
-0.35,
0,
0,
0),
(0.45, 0, 0.25, 0, 0, 0),
(0.45,
0,
-0.35,
0,
0,
0))
self.questFrames = []
for i in xrange(ToontownGlobals.MaxQuestCarryLimit):
frame = QuestBookPoster.QuestBookPoster(reverse=i > 1, mapIndex=i + 1)
frame.reparentTo(self)
frame.setPosHpr(*questFramePlaceList[i])
frame.setScale(1.06)
self.questFrames.append(frame)
self.accept('questsChanged', self.updatePage)
return
def acceptOnscreenHooks(self):
self.accept(ToontownGlobals.QuestsHotkeyOn, self.showQuestsOnscreen)
self.accept(ToontownGlobals.QuestsHotkeyOff, self.hideQuestsOnscreen)
def ignoreOnscreenHooks(self):
self.ignore(ToontownGlobals.QuestsHotkeyOn)
self.ignore(ToontownGlobals.QuestsHotkeyOff)
def unload(self):
self.ignore('questsChanged')
del self.title
del self.quests
del self.questFrames
loader.unloadModel('phase_3.5/models/gui/stickerbook_gui')
ShtikerPage.ShtikerPage.unload(self)
def clearQuestFrame(self, index):
self.questFrames[index].clear()
self.quests[index] = None
return
def fillQuestFrame(self, questDesc, index):
self.questFrames[index].update(questDesc)
self.quests[index] = questDesc
def getLowestUnusedIndex(self):
for i in xrange(ToontownGlobals.MaxQuestCarryLimit):
if self.quests[i] == None:
return i
return -1
def updatePage(self):
self.notify.debug('updatePage()')
newQuests = base.localAvatar.quests
carryLimit = base.localAvatar.getQuestCarryLimit()
for i in xrange(ToontownGlobals.MaxQuestCarryLimit):
if i < carryLimit:
self.questFrames[i].show()
else:
self.questFrames[i].hide()
for index, questDesc in self.quests.items():
if questDesc is not None and list(questDesc) not in newQuests:
self.clearQuestFrame(index)
for questDesc in newQuests:
newQuestDesc = tuple(questDesc)
if newQuestDesc not in self.quests.values():
index = self.getLowestUnusedIndex()
self.fillQuestFrame(newQuestDesc, index)
for i, questDesc in self.quests.iteritems():
if questDesc:
if self.canDeleteQuest(questDesc):
self.questFrames[i].setDeleteCallback(self.__deleteQuest)
else:
self.questFrames[i].setDeleteCallback(None)
self.questFrames[i].update(questDesc)
else:
self.questFrames[i].unbindMouseEnter()
messenger.send('questPageUpdated')
return
def enter(self):
self.updatePage()
ShtikerPage.ShtikerPage.enter(self)
def exit(self):
ShtikerPage.ShtikerPage.exit(self)
def showQuestsOnscreenTutorial(self):
self.setPos(0, 0, -0.2)
self.showQuestsOnscreen()
def showQuestsOnscreen(self):
messenger.send('wakeup')
timedif = globalClock.getRealTime() - self.lastQuestTime
if timedif < 0.7:
return
self.lastQuestTime = globalClock.getRealTime()
if self.onscreen or base.localAvatar.invPage.onscreen:
return
self.onscreen = 1
for i in xrange(ToontownGlobals.MaxQuestCarryLimit):
if hasattr(self.questFrames[i], 'mapIndex'):
self.questFrames[i].mapIndex.show()
self.updatePage()
self.reparentTo(aspect2d)
self.title.hide()
self.show()
def hideQuestsOnscreenTutorial(self):
self.setPos(0, 0, 0)
self.hideQuestsOnscreen()
def hideQuestsOnscreen(self):
if not self.onscreen:
return
self.onscreen = 0
for i in xrange(ToontownGlobals.MaxQuestCarryLimit):
if hasattr(self.questFrames[i], 'mapIndex'):
self.questFrames[i].mapIndex.hide()
self.reparentTo(self.book)
self.title.show()
self.hide()
def canDeleteQuest(self, questDesc):
return Quests.isQuestJustForFun(questDesc[0], questDesc[3]) and self.onscreen == 0
def __deleteQuest(self, questDesc):
base.localAvatar.d_requestDeleteQuest(questDesc)