164 lines
5.9 KiB
Python
164 lines
5.9 KiB
Python
from direct.directnotify import DirectNotifyGlobal
|
|
from direct.fsm import StateData
|
|
from direct.fsm import ClassicFSM, State
|
|
from direct.fsm import State
|
|
from . import CogHQLobby
|
|
from toontown.hood import QuietZoneState
|
|
from toontown.hood import ZoneUtil
|
|
from toontown.town import TownBattle
|
|
from toontown.suit import Suit
|
|
from panda3d.core import *
|
|
|
|
class CogHQLoader(StateData.StateData):
|
|
notify = DirectNotifyGlobal.directNotify.newCategory('CogHQLoader')
|
|
|
|
def __init__(self, hood, parentFSMState, doneEvent):
|
|
StateData.StateData.__init__(self, doneEvent)
|
|
self.hood = hood
|
|
self.parentFSMState = parentFSMState
|
|
self.placeDoneEvent = 'cogHQLoaderPlaceDone'
|
|
self.townBattleDoneEvent = 'town-battle-done'
|
|
self.fsm = ClassicFSM.ClassicFSM('CogHQLoader', [State.State('start', None, None, ['quietZone', 'cogHQExterior', 'factoryInterior', 'cogHQBossBattle']),
|
|
State.State('cogHQExterior', self.enterCogHQExterior, self.exitCogHQExterior, ['quietZone', 'cogHQLobby']),
|
|
State.State('cogHQLobby', self.enterCogHQLobby, self.exitCogHQLobby, ['quietZone', 'cogHQExterior', 'cogHQBossBattle']),
|
|
State.State('cogHQBossBattle', self.enterCogHQBossBattle, self.exitCogHQBossBattle, ['quietZone']),
|
|
State.State('quietZone', self.enterQuietZone, self.exitQuietZone, ['cogHQExterior', 'cogHQLobby', 'cogHQBossBattle']),
|
|
State.State('final', None, None, ['start'])], 'start', 'final')
|
|
return
|
|
|
|
def load(self, zoneId):
|
|
self.parentFSMState.addChild(self.fsm)
|
|
self.music = base.loader.loadMusic(self.musicFile)
|
|
self.battleMusic = base.loader.loadMusic('phase_9/audio/bgm/encntr_suit_winning.ogg')
|
|
self.townBattle = TownBattle.TownBattle(self.townBattleDoneEvent)
|
|
self.townBattle.load()
|
|
Suit.loadSuits(3)
|
|
self.loadPlaceGeom(zoneId)
|
|
|
|
def loadPlaceGeom(self, zoneId):
|
|
pass
|
|
|
|
def unloadPlaceGeom(self):
|
|
pass
|
|
|
|
def unload(self):
|
|
self.unloadPlaceGeom()
|
|
self.parentFSMState.removeChild(self.fsm)
|
|
del self.parentFSMState
|
|
del self.fsm
|
|
self.townBattle.unload()
|
|
self.townBattle.cleanup()
|
|
del self.townBattle
|
|
del self.battleMusic
|
|
Suit.unloadSuits(3)
|
|
Suit.unloadSkelDialog()
|
|
del self.hood
|
|
ModelPool.garbageCollect()
|
|
TexturePool.garbageCollect()
|
|
|
|
def enter(self, requestStatus):
|
|
self.fsm.enterInitialState()
|
|
self.fsm.request(requestStatus['where'], [requestStatus])
|
|
|
|
def exit(self):
|
|
self.ignoreAll()
|
|
|
|
def enterQuietZone(self, requestStatus):
|
|
self.quietZoneDoneEvent = uniqueName('quietZoneDone')
|
|
self.acceptOnce(self.quietZoneDoneEvent, self.handleQuietZoneDone)
|
|
self.quietZoneStateData = QuietZoneState.QuietZoneState(self.quietZoneDoneEvent)
|
|
self.quietZoneStateData.load()
|
|
self.quietZoneStateData.enter(requestStatus)
|
|
|
|
def exitQuietZone(self):
|
|
self.ignore(self.quietZoneDoneEvent)
|
|
del self.quietZoneDoneEvent
|
|
self.quietZoneStateData.exit()
|
|
self.quietZoneStateData.unload()
|
|
self.quietZoneStateData = None
|
|
return
|
|
|
|
def handleQuietZoneDone(self):
|
|
status = self.quietZoneStateData.getRequestStatus()
|
|
self.fsm.request(status['where'], [status])
|
|
|
|
def enterPlace(self, requestStatus):
|
|
self.acceptOnce(self.placeDoneEvent, self.placeDone)
|
|
self.place = self.placeClass(self, self.fsm, self.placeDoneEvent)
|
|
base.cr.playGame.setPlace(self.place)
|
|
self.place.load()
|
|
self.place.enter(requestStatus)
|
|
|
|
def exitPlace(self):
|
|
self.ignore(self.placeDoneEvent)
|
|
self.place.exit()
|
|
self.place.unload()
|
|
self.place = None
|
|
base.cr.playGame.setPlace(self.place)
|
|
return
|
|
|
|
def placeDone(self):
|
|
self.requestStatus = self.place.doneStatus
|
|
status = self.place.doneStatus
|
|
if status.get('shardId') == None and self.isInThisHq(status):
|
|
self.unloadPlaceGeom()
|
|
zoneId = status['zoneId']
|
|
self.loadPlaceGeom(zoneId)
|
|
self.fsm.request('quietZone', [status])
|
|
else:
|
|
self.doneStatus = status
|
|
messenger.send(self.doneEvent)
|
|
return
|
|
|
|
def isInThisHq(self, status):
|
|
if ZoneUtil.isDynamicZone(status['zoneId']):
|
|
return status['hoodId'] == self.hood.hoodId
|
|
else:
|
|
return ZoneUtil.getHoodId(status['zoneId']) == self.hood.hoodId
|
|
|
|
def enterCogHQExterior(self, requestStatus):
|
|
self.placeClass = self.getExteriorPlaceClass()
|
|
self.enterPlace(requestStatus)
|
|
self.hood.spawnTitleText(requestStatus['zoneId'])
|
|
|
|
def exitCogHQExterior(self):
|
|
taskMgr.remove('titleText')
|
|
self.hood.hideTitleText()
|
|
self.exitPlace()
|
|
self.placeClass = None
|
|
return
|
|
|
|
def enterCogHQLobby(self, requestStatus):
|
|
self.placeClass = CogHQLobby.CogHQLobby
|
|
self.enterPlace(requestStatus)
|
|
self.hood.spawnTitleText(requestStatus['zoneId'])
|
|
|
|
def exitCogHQLobby(self):
|
|
taskMgr.remove('titleText')
|
|
self.hood.hideTitleText()
|
|
self.exitPlace()
|
|
self.placeClass = None
|
|
return
|
|
|
|
def enterCogHQBossBattle(self, requestStatus):
|
|
self.placeClass = self.getBossPlaceClass()
|
|
self.enterPlace(requestStatus)
|
|
self.hood.hideTitleText()
|
|
|
|
def exitCogHQBossBattle(self):
|
|
self.exitPlace()
|
|
self.placeClass = None
|
|
return
|
|
|
|
if __astron__:
|
|
@staticmethod
|
|
def genDNAFileName(zoneId):
|
|
from toontown.toonbase import ToontownGlobals
|
|
zoneId = ZoneUtil.getCanonicalZoneId(zoneId)
|
|
hoodId = ZoneUtil.getCanonicalHoodId(zoneId)
|
|
hood = ToontownGlobals.dnaMap[hoodId]
|
|
phase = ToontownGlobals.streetPhaseMap[hoodId]
|
|
if hoodId == zoneId:
|
|
zoneId = 'sz'
|
|
|
|
return 'phase_%s/dna/%s_%s.dna' % (phase, hood, zoneId)
|