274 lines
11 KiB
Python
274 lines
11 KiB
Python
from direct.directnotify import DirectNotifyGlobal
|
|
from toontown.battle import BattlePlace
|
|
from direct.fsm import ClassicFSM, State
|
|
from direct.fsm import State
|
|
from panda3d.core import *
|
|
from otp.distributed.TelemetryLimiter import RotationLimitToH, TLGatherAllAvs
|
|
from toontown.toon import Toon
|
|
from toontown.toonbase import ToontownGlobals
|
|
from toontown.hood import ZoneUtil
|
|
from toontown.toonbase import TTLocalizer
|
|
from toontown.toontowngui import TTDialog
|
|
from toontown.toonbase import ToontownBattleGlobals
|
|
from toontown.building import Elevator
|
|
from otp.nametag.NametagConstants import *
|
|
from otp.nametag import NametagGlobals
|
|
|
|
class FactoryInterior(BattlePlace.BattlePlace):
|
|
notify = DirectNotifyGlobal.directNotify.newCategory('FactoryInterior')
|
|
|
|
def __init__(self, loader, parentFSM, doneEvent):
|
|
BattlePlace.BattlePlace.__init__(self, loader, doneEvent)
|
|
self.parentFSM = parentFSM
|
|
self.zoneId = ToontownGlobals.SellbotFactoryInt
|
|
self.elevatorDoneEvent = 'elevatorDone'
|
|
|
|
def load(self):
|
|
self.fsm = ClassicFSM.ClassicFSM('FactoryInterior', [State.State('start', self.enterStart, self.exitStart, ['walk', 'teleportIn', 'fallDown']),
|
|
State.State('walk', self.enterWalk, self.exitWalk, ['push',
|
|
'sit',
|
|
'stickerBook',
|
|
'WaitForBattle',
|
|
'battle',
|
|
'died',
|
|
'teleportOut',
|
|
'squished',
|
|
'fallDown',
|
|
'elevator']),
|
|
State.State('stopped', self.enterStopped, self.exitStopped, ['walk', 'teleportOut']),
|
|
State.State('sit', self.enterSit, self.exitSit, ['walk', 'died', 'teleportOut']),
|
|
State.State('push', self.enterPush, self.exitPush, ['walk', 'died', 'teleportOut']),
|
|
State.State('stickerBook', self.enterStickerBook, self.exitStickerBook, ['walk',
|
|
'battle',
|
|
'WaitForBattle',
|
|
'died',
|
|
'teleportOut']),
|
|
State.State('WaitForBattle', self.enterWaitForBattle, self.exitWaitForBattle, ['battle',
|
|
'walk',
|
|
'died',
|
|
'teleportOut']),
|
|
State.State('battle', self.enterBattle, self.exitBattle, ['walk', 'teleportOut', 'died']),
|
|
State.State('fallDown', self.enterFallDown, self.exitFallDown, ['walk', 'died', 'teleportOut']),
|
|
State.State('squished', self.enterSquished, self.exitSquished, ['walk', 'died', 'teleportOut']),
|
|
State.State('teleportIn', self.enterTeleportIn, self.exitTeleportIn, ['walk',
|
|
'teleportOut',
|
|
'quietZone',
|
|
'died']),
|
|
State.State('teleportOut', self.enterTeleportOut, self.exitTeleportOut, ['teleportIn',
|
|
'FLA',
|
|
'quietZone',
|
|
'WaitForBattle']),
|
|
State.State('died', self.enterDied, self.exitDied, ['teleportOut']),
|
|
State.State('FLA', self.enterFLA, self.exitFLA, ['quietZone']),
|
|
State.State('quietZone', self.enterQuietZone, self.exitQuietZone, ['teleportIn']),
|
|
State.State('elevator', self.enterElevator, self.exitElevator, ['walk']),
|
|
State.State('final', self.enterFinal, self.exitFinal, ['start'])], 'start', 'final')
|
|
self.parentFSM.getStateNamed('factoryInterior').addChild(self.fsm)
|
|
BattlePlace.BattlePlace.load(self)
|
|
self.music = base.loadMusic('phase_9/audio/bgm/CHQ_FACT_bg.ogg')
|
|
|
|
def unload(self):
|
|
self.parentFSM.getStateNamed('factoryInterior').removeChild(self.fsm)
|
|
del self.fsm
|
|
del self.music
|
|
BattlePlace.BattlePlace.unload(self)
|
|
|
|
def enter(self, requestStatus):
|
|
self.fsm.enterInitialState()
|
|
base.transitions.fadeOut(t=0)
|
|
base.localAvatar.inventory.setRespectInvasions(0)
|
|
self._telemLimiter = TLGatherAllAvs('FactoryInterior', RotationLimitToH)
|
|
|
|
def commence(self = self):
|
|
NametagGlobals.setMasterArrowsOn(1)
|
|
self.fsm.request(requestStatus['how'], [requestStatus])
|
|
base.playMusic(self.music, looping=1, volume=0.8)
|
|
base.transitions.irisIn()
|
|
|
|
if hasattr(base, 'factoryReady'):
|
|
commence()
|
|
else:
|
|
self.acceptOnce('FactoryReady', commence)
|
|
self.factoryDefeated = 0
|
|
self.acceptOnce('FactoryWinEvent', self.handleFactoryWinEvent)
|
|
if __debug__ and 0:
|
|
self.accept('f10', lambda : messenger.send('FactoryWinEvent'))
|
|
self.confrontedForeman = 0
|
|
|
|
def handleConfrontedForeman(self = self):
|
|
self.confrontedForeman = 1
|
|
|
|
self.acceptOnce('localToonConfrontedForeman', handleConfrontedForeman)
|
|
|
|
def exit(self):
|
|
NametagGlobals.setMasterArrowsOn(0)
|
|
self._telemLimiter.destroy()
|
|
del self._telemLimiter
|
|
if hasattr(base, 'factoryReady'):
|
|
del base.factoryReady
|
|
base.localAvatar.inventory.setRespectInvasions(1)
|
|
self.fsm.requestFinalState()
|
|
self.loader.music.stop()
|
|
self.music.stop()
|
|
self.ignoreAll()
|
|
|
|
def enterWalk(self, teleportIn = 0):
|
|
BattlePlace.BattlePlace.enterWalk(self, teleportIn)
|
|
self.ignore('teleportQuery')
|
|
base.localAvatar.setTeleportAvailable(0)
|
|
|
|
def enterPush(self):
|
|
BattlePlace.BattlePlace.enterPush(self)
|
|
self.ignore('teleportQuery')
|
|
base.localAvatar.setTeleportAvailable(0)
|
|
|
|
def enterWaitForBattle(self):
|
|
FactoryInterior.notify.info('enterWaitForBattle')
|
|
BattlePlace.BattlePlace.enterWaitForBattle(self)
|
|
if base.localAvatar.getParent() != render:
|
|
base.localAvatar.wrtReparentTo(render)
|
|
base.localAvatar.b_setParent(ToontownGlobals.SPRender)
|
|
|
|
def exitWaitForBattle(self):
|
|
FactoryInterior.notify.info('exitWaitForBattle')
|
|
BattlePlace.BattlePlace.exitWaitForBattle(self)
|
|
|
|
def enterBattle(self, event):
|
|
FactoryInterior.notify.info('enterBattle')
|
|
self.music.stop()
|
|
BattlePlace.BattlePlace.enterBattle(self, event)
|
|
self.ignore('teleportQuery')
|
|
base.localAvatar.setTeleportAvailable(0)
|
|
|
|
def enterTownBattle(self, event):
|
|
mult = ToontownBattleGlobals.getFactoryCreditMultiplier(self.zoneId)
|
|
base.localAvatar.inventory.setBattleCreditMultiplier(mult)
|
|
self.loader.townBattle.enter(event, self.fsm.getStateNamed('battle'), bldg=1, creditMultiplier=mult)
|
|
|
|
def exitBattle(self):
|
|
FactoryInterior.notify.info('exitBattle')
|
|
BattlePlace.BattlePlace.exitBattle(self)
|
|
self.loader.music.stop()
|
|
base.playMusic(self.music, looping=1, volume=0.8)
|
|
|
|
def enterStickerBook(self, page = None):
|
|
BattlePlace.BattlePlace.enterStickerBook(self, page)
|
|
self.ignore('teleportQuery')
|
|
base.localAvatar.setTeleportAvailable(0)
|
|
|
|
def enterSit(self):
|
|
BattlePlace.BattlePlace.enterSit(self)
|
|
self.ignore('teleportQuery')
|
|
base.localAvatar.setTeleportAvailable(0)
|
|
|
|
def enterZone(self, zoneId):
|
|
pass
|
|
|
|
def enterTeleportOut(self, requestStatus):
|
|
FactoryInterior.notify.info('enterTeleportOut()')
|
|
BattlePlace.BattlePlace.enterTeleportOut(self, requestStatus, self.__teleportOutDone)
|
|
|
|
def __processLeaveRequest(self, requestStatus):
|
|
hoodId = requestStatus['hoodId']
|
|
if hoodId == ToontownGlobals.MyEstate:
|
|
self.getEstateZoneAndGoHome(requestStatus)
|
|
else:
|
|
self.doneStatus = requestStatus
|
|
messenger.send(self.doneEvent)
|
|
|
|
def __teleportOutDone(self, requestStatus):
|
|
FactoryInterior.notify.info('__teleportOutDone()')
|
|
messenger.send('leavingFactory')
|
|
messenger.send('localToonLeft')
|
|
if self.factoryDefeated and not self.confrontedForeman:
|
|
self.fsm.request('FLA', [requestStatus])
|
|
else:
|
|
self.__processLeaveRequest(requestStatus)
|
|
|
|
def exitTeleportOut(self):
|
|
FactoryInterior.notify.info('exitTeleportOut()')
|
|
BattlePlace.BattlePlace.exitTeleportOut(self)
|
|
|
|
def detectedElevatorCollision(self, distElevator):
|
|
self.fsm.request('elevator', [distElevator])
|
|
|
|
def enterElevator(self, distElevator):
|
|
self.accept(self.elevatorDoneEvent, self.handleElevatorDone)
|
|
self.elevator = Elevator.Elevator(self.fsm.getStateNamed('elevator'), self.elevatorDoneEvent, distElevator)
|
|
distElevator.elevatorFSM = self.elevator
|
|
self.elevator.load()
|
|
self.elevator.enter()
|
|
|
|
def exitElevator(self):
|
|
self.ignore(self.elevatorDoneEvent)
|
|
self.elevator.unload()
|
|
self.elevator.exit()
|
|
|
|
def handleElevatorDone(self, doneStatus):
|
|
self.notify.debug('handling elevator done event')
|
|
where = doneStatus['where']
|
|
if where == 'reject':
|
|
if hasattr(base.localAvatar, 'elevatorNotifier') and base.localAvatar.elevatorNotifier.isNotifierOpen():
|
|
pass
|
|
else:
|
|
self.fsm.request('walk')
|
|
elif where == 'exit':
|
|
self.fsm.request('walk')
|
|
elif where == 'factoryInterior' or where == 'suitInterior':
|
|
self.doneStatus = doneStatus
|
|
self.doneEvent = 'lawOfficeFloorDone'
|
|
messenger.send(self.doneEvent)
|
|
else:
|
|
self.notify.error('Unknown mode: ' + where + ' in handleElevatorDone')
|
|
|
|
def handleFactoryWinEvent(self):
|
|
FactoryInterior.notify.info('handleFactoryWinEvent')
|
|
|
|
if base.cr.playGame.getPlace().fsm.getCurrentState().getName() == 'died':
|
|
return
|
|
|
|
self.factoryDefeated = 1
|
|
|
|
if 1:
|
|
zoneId = ZoneUtil.getHoodId(self.zoneId)
|
|
else:
|
|
zoneId = ZoneUtil.getSafeZoneId(base.localAvatar.defaultZone)
|
|
|
|
self.fsm.request('teleportOut', [{
|
|
'loader': ZoneUtil.getLoaderName(zoneId),
|
|
'where': ZoneUtil.getToonWhereName(zoneId),
|
|
'how': 'teleportIn',
|
|
'hoodId': zoneId,
|
|
'zoneId': zoneId,
|
|
'shardId': None,
|
|
'avId': -1,
|
|
}])
|
|
|
|
def enterDied(self, requestStatus, callback = None):
|
|
FactoryInterior.notify.info('enterDied')
|
|
|
|
def diedDone(requestStatus, self = self, callback = callback):
|
|
if callback is not None:
|
|
callback()
|
|
messenger.send('leavingFactory')
|
|
self.doneStatus = requestStatus
|
|
messenger.send(self.doneEvent)
|
|
return
|
|
|
|
BattlePlace.BattlePlace.enterDied(self, requestStatus, diedDone)
|
|
|
|
def enterFLA(self, requestStatus):
|
|
FactoryInterior.notify.info('enterFLA')
|
|
self.flaDialog = TTDialog.TTGlobalDialog(message=TTLocalizer.ForcedLeaveFactoryAckMsg, doneEvent='FLADone', style=TTDialog.Acknowledge, fadeScreen=1)
|
|
|
|
def continueExit(self = self, requestStatus = requestStatus):
|
|
self.__processLeaveRequest(requestStatus)
|
|
|
|
self.accept('FLADone', continueExit)
|
|
self.flaDialog.show()
|
|
|
|
def exitFLA(self):
|
|
FactoryInterior.notify.info('exitFLA')
|
|
if hasattr(self, 'flaDialog'):
|
|
self.flaDialog.cleanup()
|
|
del self.flaDialog
|