2022-12-16 18:40:57 -06:00
|
|
|
from panda3d.core import VBase4
|
2019-11-02 17:27:54 -05:00
|
|
|
from direct.gui.DirectGui import DirectLabel
|
|
|
|
from direct.directnotify.DirectNotifyGlobal import directNotify
|
|
|
|
from direct.distributed.ClockDelta import globalClockDelta
|
|
|
|
from direct.distributed.DistributedObject import DistributedObject
|
|
|
|
from direct.fsm import ClassicFSM, State
|
|
|
|
from direct.fsm.StatePush import StateVar, FunctionCall
|
|
|
|
from toontown.cogdominium import CogdoGameConsts
|
|
|
|
from toontown.cogdominium.DistCogdoGameBase import DistCogdoGameBase
|
|
|
|
from toontown.minigame.MinigameRulesPanel import MinigameRulesPanel
|
|
|
|
from toontown.cogdominium.CogdoGameRulesPanel import CogdoGameRulesPanel
|
|
|
|
from toontown.minigame import MinigameGlobals
|
|
|
|
from toontown.toonbase import TTLocalizer as TTL
|
|
|
|
SCHELLGAMES_DEV = __debug__ and base.config.GetBool('schellgames-dev', False)
|
|
|
|
|
|
|
|
class DistCogdoGame(DistCogdoGameBase, DistributedObject):
|
|
|
|
notify = directNotify.newCategory('DistCogdoGame')
|
|
|
|
|
|
|
|
def __init__(self, cr):
|
|
|
|
DistributedObject.__init__(self, cr)
|
|
|
|
base.cogdoGame = self
|
|
|
|
self._waitingStartLabel = DirectLabel(text=TTL.MinigameWaitingForOtherPlayers, text_fg=VBase4(1, 1, 1, 1), relief=None, pos=(-0.6, 0, -0.75), scale=0.075)
|
|
|
|
self._waitingStartLabel.hide()
|
|
|
|
self.loadFSM = ClassicFSM.ClassicFSM('DistCogdoGame.loaded', [State.State('NotLoaded', self.enterNotLoaded, self.exitNotLoaded, ['Loaded']), State.State('Loaded', self.enterLoaded, self.exitLoaded, ['NotLoaded'])], 'NotLoaded', 'NotLoaded')
|
|
|
|
self.loadFSM.enterInitialState()
|
|
|
|
self.fsm = ClassicFSM.ClassicFSM('DistCogdoGame', [State.State('Visible', self.enterVisible, self.exitVisible, ['Intro']),
|
|
|
|
State.State('Intro', self.enterIntro, self.exitIntro, ['WaitServerStart']),
|
|
|
|
State.State('WaitServerStart', self.enterWaitServerStart, self.exitWaitServerStart, ['Game']),
|
|
|
|
State.State('Game', self.enterGame, self.exitGame, ['Finish']),
|
|
|
|
State.State('Finish', self.enterFinish, self.exitFinish, ['Off']),
|
|
|
|
State.State('Off', self.enterOff, self.exitOff, ['Visible'])], 'Off', 'Off')
|
|
|
|
self.fsm.enterInitialState()
|
|
|
|
self.difficultyOverride = None
|
|
|
|
self.exteriorZoneOverride = None
|
|
|
|
self._gotInterior = StateVar(False)
|
|
|
|
self._toonsInEntranceElev = StateVar(False)
|
|
|
|
self._wantStashElevator = StateVar(False)
|
|
|
|
self._stashElevatorFC = FunctionCall(self._doStashElevator, self._toonsInEntranceElev, self._gotInterior, self._wantStashElevator)
|
|
|
|
return
|
|
|
|
|
|
|
|
def getTitle(self):
|
|
|
|
pass
|
|
|
|
|
|
|
|
def getInstructions(self):
|
|
|
|
pass
|
|
|
|
|
|
|
|
def setInteriorId(self, interiorId):
|
|
|
|
self._interiorId = interiorId
|
|
|
|
|
|
|
|
def setExteriorZone(self, exteriorZone):
|
|
|
|
self.exteriorZone = exteriorZone
|
|
|
|
|
|
|
|
def setDifficultyOverrides(self, difficultyOverride, exteriorZoneOverride):
|
|
|
|
if difficultyOverride != CogdoGameConsts.NoDifficultyOverride:
|
|
|
|
self.difficultyOverride = difficultyOverride / float(CogdoGameConsts.DifficultyOverrideMult)
|
|
|
|
if exteriorZoneOverride != CogdoGameConsts.NoExteriorZoneOverride:
|
|
|
|
self.exteriorZoneOverride = exteriorZoneOverride
|
|
|
|
|
|
|
|
def getInterior(self):
|
|
|
|
return self.cr.getDo(self._interiorId)
|
|
|
|
|
|
|
|
def getEntranceElevator(self, callback):
|
|
|
|
return self.getInterior().getEntranceElevator(callback)
|
|
|
|
|
|
|
|
def getToonIds(self):
|
|
|
|
interior = self.getInterior()
|
|
|
|
if interior is not None:
|
|
|
|
return interior.getToonIds()
|
|
|
|
else:
|
|
|
|
return []
|
|
|
|
return
|
|
|
|
|
|
|
|
def getToon(self, toonId):
|
2019-12-30 00:07:56 -06:00
|
|
|
if toonId in self.cr.doId2do:
|
2019-11-02 17:27:54 -05:00
|
|
|
return self.cr.doId2do[toonId]
|
|
|
|
else:
|
|
|
|
return None
|
|
|
|
return None
|
|
|
|
|
|
|
|
def getNumPlayers(self):
|
|
|
|
return len(self.getToonIds())
|
|
|
|
|
|
|
|
def isSinglePlayer(self):
|
|
|
|
if self.getNumPlayers() == 1:
|
|
|
|
return 1
|
|
|
|
else:
|
|
|
|
return 0
|
|
|
|
|
|
|
|
def announceGenerate(self):
|
|
|
|
DistributedObject.announceGenerate(self)
|
|
|
|
self._requestInterior()
|
|
|
|
self.loadFSM.request('Loaded')
|
|
|
|
self.notify.info('difficulty: %s, safezoneId: %s' % (self.getDifficulty(), self.getSafezoneId()))
|
|
|
|
|
|
|
|
def _requestInterior(self):
|
|
|
|
self.cr.relatedObjectMgr.requestObjects([self._interiorId], allCallback=self._handleGotInterior)
|
|
|
|
|
|
|
|
def _handleGotInterior(self, objs):
|
|
|
|
self._gotInterior.set(True)
|
|
|
|
self.getEntranceElevator(self.placeEntranceElev)
|
|
|
|
|
|
|
|
def stashEntranceElevator(self):
|
|
|
|
self._wantStashElevator.set(True)
|
|
|
|
|
|
|
|
def placeEntranceElev(self, elev):
|
|
|
|
pass
|
|
|
|
|
|
|
|
def _doStashElevator(self, toonsInEntranceElev, gotInterior, wantStashElevator):
|
|
|
|
if gotInterior:
|
|
|
|
interior = self.getInterior()
|
|
|
|
if interior:
|
|
|
|
if not toonsInEntranceElev and wantStashElevator:
|
|
|
|
interior.stashElevatorIn()
|
|
|
|
else:
|
|
|
|
interior.stashElevatorIn(False)
|
|
|
|
|
|
|
|
def disable(self):
|
|
|
|
base.cogdoGame = None
|
|
|
|
self.fsm.requestFinalState()
|
|
|
|
self.loadFSM.requestFinalState()
|
|
|
|
self.fsm = None
|
|
|
|
self.loadFSM = None
|
|
|
|
DistributedObject.disable(self)
|
|
|
|
return
|
|
|
|
|
|
|
|
def delete(self):
|
|
|
|
self._stashElevatorFC.destroy()
|
|
|
|
self._wantStashElevator.destroy()
|
|
|
|
self._toonsInEntranceElev.destroy()
|
|
|
|
self._gotInterior.destroy()
|
|
|
|
self._waitingStartLabel.destroy()
|
|
|
|
self._waitingStartLabel = None
|
|
|
|
DistributedObject.delete(self)
|
|
|
|
return
|
|
|
|
|
|
|
|
def getDifficulty(self):
|
|
|
|
if self.difficultyOverride is not None:
|
|
|
|
return self.difficultyOverride
|
|
|
|
if hasattr(base, 'cogdoGameDifficulty'):
|
|
|
|
return float(base.cogdoGameDifficulty)
|
|
|
|
return CogdoGameConsts.getDifficulty(self.getSafezoneId())
|
|
|
|
|
|
|
|
def getSafezoneId(self):
|
|
|
|
if self.exteriorZoneOverride is not None:
|
|
|
|
return self.exteriorZoneOverride
|
|
|
|
if hasattr(base, 'cogdoGameSafezoneId'):
|
|
|
|
return CogdoGameConsts.getSafezoneId(base.cogdoGameSafezoneId)
|
|
|
|
return CogdoGameConsts.getSafezoneId(self.exteriorZone)
|
|
|
|
|
|
|
|
def enterNotLoaded(self):
|
|
|
|
pass
|
|
|
|
|
|
|
|
def exitNotLoaded(self):
|
|
|
|
pass
|
|
|
|
|
|
|
|
def enterLoaded(self):
|
|
|
|
pass
|
|
|
|
|
|
|
|
def exitLoaded(self):
|
|
|
|
pass
|
|
|
|
|
|
|
|
def enterOff(self):
|
|
|
|
pass
|
|
|
|
|
|
|
|
def exitOff(self):
|
|
|
|
pass
|
|
|
|
|
|
|
|
def setVisible(self):
|
|
|
|
self.fsm.request('Visible')
|
|
|
|
|
|
|
|
def setIntroStart(self):
|
|
|
|
self.fsm.request('Intro')
|
|
|
|
|
|
|
|
def enterVisible(self):
|
|
|
|
self._toonsInEntranceElev.set(True)
|
|
|
|
|
|
|
|
def exitVisible(self):
|
|
|
|
pass
|
|
|
|
|
|
|
|
def enterIntro(self, duration = MinigameGlobals.rulesDuration):
|
|
|
|
base.cr.playGame.getPlace().fsm.request('Game')
|
|
|
|
self._rulesDoneEvent = self.uniqueName('cogdoGameRulesDone')
|
|
|
|
self.accept(self._rulesDoneEvent, self._handleRulesDone)
|
|
|
|
self._rulesPanel = CogdoGameRulesPanel('CogdoGameRulesPanel', self.getTitle(), '', self._rulesDoneEvent, timeout=duration)
|
|
|
|
self._rulesPanel.load()
|
|
|
|
self._rulesPanel.enter()
|
|
|
|
|
|
|
|
def exitIntro(self):
|
|
|
|
self._toonsInEntranceElev.set(False)
|
|
|
|
self.ignore(self._rulesDoneEvent)
|
|
|
|
if self._rulesPanel:
|
|
|
|
self._rulesPanel.exit()
|
|
|
|
self._rulesPanel.unload()
|
|
|
|
self._rulesPanel = None
|
|
|
|
return
|
|
|
|
|
|
|
|
def _handleRulesDone(self):
|
|
|
|
self.ignore(self._rulesDoneEvent)
|
|
|
|
self._rulesPanel.exit()
|
|
|
|
self._rulesPanel.unload()
|
|
|
|
self._rulesPanel = None
|
|
|
|
self.fsm.request('WaitServerStart')
|
|
|
|
self.d_setAvatarReady()
|
|
|
|
return
|
|
|
|
|
|
|
|
def d_setAvatarReady(self):
|
|
|
|
self.sendUpdate('setAvatarReady', [])
|
|
|
|
|
|
|
|
def enterWaitServerStart(self):
|
|
|
|
numToons = 1
|
|
|
|
interior = self.getInterior()
|
|
|
|
if interior:
|
|
|
|
numToons = len(interior.getToonIds())
|
|
|
|
if numToons > 1:
|
|
|
|
msg = TTL.MinigameWaitingForOtherPlayers
|
|
|
|
else:
|
|
|
|
msg = TTL.MinigamePleaseWait
|
|
|
|
self._waitingStartLabel['text'] = msg
|
|
|
|
self._waitingStartLabel.show()
|
|
|
|
|
|
|
|
def exitWaitServerStart(self):
|
|
|
|
self._waitingStartLabel.hide()
|
|
|
|
|
|
|
|
def setGameStart(self, timestamp):
|
|
|
|
self._startTime = globalClockDelta.networkToLocalTime(timestamp)
|
|
|
|
self.fsm.request('Game')
|
|
|
|
|
|
|
|
def getStartTime(self):
|
|
|
|
return self._startTime
|
|
|
|
|
|
|
|
def enterGame(self):
|
|
|
|
if SCHELLGAMES_DEV:
|
|
|
|
self.acceptOnce('escape', messenger.send, ['magicWord', ['~endgame']])
|
|
|
|
|
|
|
|
def exitGame(self):
|
|
|
|
if SCHELLGAMES_DEV:
|
|
|
|
self.ignore('escape')
|
|
|
|
|
|
|
|
def setGameFinish(self, timestamp):
|
|
|
|
self._finishTime = globalClockDelta.networkToLocalTime(timestamp)
|
|
|
|
self.fsm.request('Finish')
|
|
|
|
|
|
|
|
def getFinishTime(self):
|
|
|
|
return self._finishTime
|
|
|
|
|
|
|
|
def enterFinish(self):
|
|
|
|
pass
|
|
|
|
|
|
|
|
def exitFinish(self):
|
|
|
|
pass
|
|
|
|
|
|
|
|
def setToonSad(self, toonId):
|
|
|
|
pass
|
|
|
|
|
|
|
|
def setToonDisconnect(self, toonId):
|
|
|
|
pass
|