ToonTownRewritten/toontown/toontowngui/NewsPageButtonManager.py

243 lines
10 KiB
Python

from pandac.PandaModules import VBase4, VBase3
from direct.fsm import FSM
from direct.directnotify import DirectNotifyGlobal
from direct.gui.DirectButton import DirectButton
from toontown.toonbase import ToontownGlobals
from direct.gui.DirectGui import *
from direct.interval.IntervalGlobal import *
from toontown.toonbase import TTLocalizer
from toontown.coghq import CogHQBossBattle
class NewsPageButtonManager(FSM.FSM):
notify = DirectNotifyGlobal.directNotify.newCategory('NewsPageButtonManager')
def __init__(self):
FSM.FSM.__init__(self, 'NewsPageButtonManager')
self.buttonsLoaded = False
self.clearGoingToNewsInfo()
self.__blinkIval = None
self.load()
return
def load(self):
btnGui = loader.loadModel('phase_3.5/models/gui/tt_m_gui_ign_newsBtnGui')
bookModel = loader.loadModel('phase_3.5/models/gui/tt_m_gui_ign_shtickerBook')
self.openNewNewsUp = btnGui.find('**/tt_t_gui_ign_new')
self.openNewNewsUpBlink = btnGui.find('**/tt_t_gui_ign_newBlink')
self.openNewNewsHover = btnGui.find('**/tt_t_gui_ign_newHover')
self.openOldNewsUp = btnGui.find('**/tt_t_gui_ign_oldNews')
self.openOldNewsHover = btnGui.find('**/tt_t_gui_ign_oldHover')
self.closeNewsUp = bookModel.find('**/tt_t_gui_sbk_newsPage1')
self.closeNewsHover = bookModel.find('**/tt_t_gui_sbk_newsPage2')
btnGui.removeNode()
bookModel.removeNode()
oldScale = 0.5
newScale = 0.9
shtickerBookScale = 0.305
newPos = VBase3(0.914, 0, 0.862)
shtickerBookPos = VBase3(1.175, 0, -0.83)
textScale = 0.06
self.newIssueButton = DirectButton(relief=None, sortOrder=DGG.BACKGROUND_SORT_INDEX - 1, image=(self.openNewNewsUp, self.openNewNewsHover, self.openNewNewsHover), text=('', TTLocalizer.EventsPageNewsTabName, TTLocalizer.EventsPageNewsTabName), text_fg=(1, 1, 1, 1), text_shadow=(0, 0, 0, 1), text_scale=textScale, text_font=ToontownGlobals.getInterfaceFont(), pos=newPos, scale=newScale, command=self.__handleGotoNewsButton)
self.gotoPrevPageButton = DirectButton(relief=None, image=(self.closeNewsUp, self.closeNewsHover, self.closeNewsHover), text_fg=(1, 1, 1, 1), text_shadow=(0, 0, 0, 1), text_scale=textScale, text_font=ToontownGlobals.getInterfaceFont(), pos=shtickerBookPos, scale=shtickerBookScale, command=self.__handleGotoPrevPageButton)
self.goto3dWorldButton = DirectButton(relief=None, image=(self.closeNewsUp, self.closeNewsHover, self.closeNewsHover), text_fg=(1, 1, 1, 1), text_shadow=(0, 0, 0, 1), text_scale=textScale, text_font=ToontownGlobals.getInterfaceFont(), pos=shtickerBookPos, scale=shtickerBookScale, command=self.__handleGoto3dWorldButton)
self.hideNewIssueButton()
self.gotoPrevPageButton.hide()
self.goto3dWorldButton.hide()
self.accept('newIssueOut', self.handleNewIssueOut)
bounce1Pos = VBase3(newPos.getX(), newPos.getY(), newPos.getZ() + 0.022)
bounce2Pos = VBase3(newPos.getX(), newPos.getY(), newPos.getZ() + 0.015)
bounceIval = Sequence(LerpPosInterval(self.newIssueButton, 0.1, bounce1Pos, blendType='easeOut'), LerpPosInterval(self.newIssueButton, 0.1, newPos, blendType='easeIn'), LerpPosInterval(self.newIssueButton, 0.07, bounce2Pos, blendType='easeOut'), LerpPosInterval(self.newIssueButton, 0.07, newPos, blendType='easeIn'))
self.__blinkIval = Sequence(Func(self.__showOpenEyes), Wait(2), bounceIval, Wait(0.5), Func(self.__showClosedEyes), Wait(0.1), Func(self.__showOpenEyes), Wait(0.1), Func(self.__showClosedEyes), Wait(0.1))
self.__blinkIval.loop()
self.__blinkIval.pause()
self.buttonsLoaded = True
return
def __showOpenEyes(self):
self.newIssueButton['image'] = (self.openNewNewsUp, self.openNewNewsHover, self.openNewNewsHover)
def __showClosedEyes(self):
self.newIssueButton['image'] = (self.openNewNewsUpBlink, self.openNewNewsHover, self.openNewNewsHover)
def clearGoingToNewsInfo(self):
self.goingToNewsPageFrom3dWorld = False
self.setGoingToNewsPageFromStickerBook(False)
def __handleGotoNewsButton(self):
currentState = base.localAvatar.animFSM.getCurrentState().getName()
if currentState == 'jumpAirborne':
return
from toontown.toon import LocalToon
if not LocalToon.WantNewsPage:
return
if base.cr and base.cr.playGame and base.cr.playGame.getPlace() and base.cr.playGame.getPlace().fsm:
fsm = base.cr.playGame.getPlace().fsm
curState = fsm.getCurrentState().getName()
if curState == 'walk':
if hasattr(localAvatar, 'newsPage'):
base.cr.centralLogger.writeClientEvent('news gotoNewsButton clicked')
localAvatar.book.setPage(localAvatar.newsPage)
fsm.request('stickerBook')
self.goingToNewsPageFrom3dWorld = True
elif curState == 'stickerBook':
if hasattr(localAvatar, 'newsPage'):
base.cr.centralLogger.writeClientEvent('news gotoNewsButton clicked')
fsm.request('stickerBook')
if hasattr(localAvatar, 'newsPage') and localAvatar.newsPage:
localAvatar.book.goToNewsPage(localAvatar.newsPage)
def __handleGotoPrevPageButton(self):
self.clearGoingToNewsInfo()
localAvatar.book.setPageBeforeNews()
self.showAppropriateButton()
self.ignoreEscapeKeyPress()
def __handleGoto3dWorldButton(self):
localAvatar.book.closeBook()
def hideNewIssueButton(self):
if hasattr(self, 'newIssueButton') and self.newIssueButton:
self.newIssueButton.hide()
localAvatar.clarabelleNewsPageCollision(False)
def __showNewIssueButton(self):
self.newIssueButton.show()
localAvatar.clarabelleNewsPageCollision(True)
def hideAllButtons(self):
if not self.buttonsLoaded:
return
self.gotoPrevPageButton.hide()
self.goto3dWorldButton.hide()
self.hideNewIssueButton()
self.__blinkIval.pause()
def isNewIssueButtonShown(self):
if not config.GetBool('want-news-tab', 1):
return False
if localAvatar.getLastTimeReadNews() < base.cr.inGameNewsMgr.getLatestIssue():
return True
return False
def enterHidden(self):
self.hideAllButtons()
def exitHidden(self):
pass
def enterNormalWalk(self):
if not self.buttonsLoaded:
return
if localAvatar.getLastTimeReadNews() < base.cr.inGameNewsMgr.getLatestIssue():
self.__showNewIssueButton()
self.__blinkIval.resume()
else:
self.hideNewIssueButton()
self.gotoPrevPageButton.hide()
self.goto3dWorldButton.hide()
def exitNormalWalk(self):
if not self.buttonsLoaded:
return
self.hideAllButtons()
def enterGotoWorld(self):
if not self.buttonsLoaded:
return
self.hideAllButtons()
self.goto3dWorldButton.show()
def exitGotoWorld(self):
if not self.buttonsLoaded:
return
self.hideAllButtons()
localAvatar.book.setPageBeforeNews(enterPage=False)
self.clearGoingToNewsInfo()
def enterPrevPage(self):
if not self.buttonsLoaded:
return
self.hideAllButtons()
self.gotoPrevPageButton.show()
def exitPrevPage(self):
if not self.buttonsLoaded:
return
self.hideAllButtons()
def showAppropriateButton(self):
self.notify.debugStateCall(self)
from toontown.toon import LocalToon
if not LocalToon.WantNewsPage:
return
if not self.buttonsLoaded:
return
if base.cr and base.cr.playGame and base.cr.playGame.getPlace() and hasattr(base.cr.playGame.getPlace(), 'fsm') and base.cr.playGame.getPlace().fsm:
fsm = base.cr.playGame.getPlace().fsm
curState = fsm.getCurrentState().getName()
book = localAvatar.book
if curState == 'walk':
if localAvatar.tutorialAck and not localAvatar.isDisguised and not isinstance(base.cr.playGame.getPlace(), CogHQBossBattle.CogHQBossBattle):
self.request('NormalWalk')
else:
self.request('Hidden')
elif curState == 'stickerBook':
if self.goingToNewsPageFrom3dWorld:
if localAvatar.tutorialAck:
self.request('GotoWorld')
else:
self.request('Hidden')
elif self.goingToNewsPageFromStickerBook or hasattr(localAvatar, 'newsPage') and localAvatar.book.isOnPage(localAvatar.newsPage):
if localAvatar.tutorialAck:
self.request('PrevPage')
else:
self.request('Hidden')
elif localAvatar.tutorialAck:
self.request('NormalWalk')
else:
self.request('Hidden')
def setGoingToNewsPageFromStickerBook(self, newVal):
self.goingToNewsPageFromStickerBook = newVal
def enterOff(self):
self.ignoreAll()
if not self.buttonsLoaded:
return
if self.__blinkIval:
self.__blinkIval.finish()
self.__blinkIval = None
self.newIssueButton.destroy()
self.gotoPrevPageButton.destroy()
self.goto3dWorldButton.destroy()
del self.openNewNewsUp
del self.openNewNewsUpBlink
del self.openNewNewsHover
del self.openOldNewsUp
del self.openOldNewsHover
del self.closeNewsUp
del self.closeNewsHover
return
def exitOff(self):
self.notify.warning('Should not get here. NewsPageButtonManager.exitOff')
def simulateEscapeKeyPress(self):
if self.goingToNewsPageFrom3dWorld:
self.__handleGoto3dWorldButton()
if self.goingToNewsPageFromStickerBook:
self.__handleGotoPrevPageButton()
def handleNewIssueOut(self):
if localAvatar.isReadingNews():
pass
else:
self.showAppropriateButton()
def acceptEscapeKeyPress(self):
self.accept(ToontownGlobals.StickerBookHotkey, self.simulateEscapeKeyPress)
self.accept(ToontownGlobals.OptionsPageHotkey, self.simulateEscapeKeyPress)
def ignoreEscapeKeyPress(self):
self.ignore(ToontownGlobals.StickerBookHotkey)
self.ignore(ToontownGlobals.OptionsPageHotkey)