from panda3d.core import * from panda3d.otp import * from direct.interval.IntervalGlobal import * from direct.directnotify import DirectNotifyGlobal from toontown.hood import Place from direct.fsm import ClassicFSM, State from direct.fsm import State from otp.distributed.TelemetryLimiter import RotationLimitToH, TLGatherAllAvs from toontown.toonbase import ToontownGlobals from toontown.toonbase import ToontownBattleGlobals from toontown.battle import BattlePlace from toontown.suit import Suit import math class CogHQBossBattle(BattlePlace.BattlePlace): notify = DirectNotifyGlobal.directNotify.newCategory('CogHQBossBattle') def __init__(self, loader, parentFSM, doneEvent): BattlePlace.BattlePlace.__init__(self, loader, doneEvent) self.parentFSM = parentFSM self.bossCog = None self.teleportInPosHpr = (0, 0, 0, 0, 0, 0) self.fsm = ClassicFSM.ClassicFSM('CogHQBossBattle', [State.State('start', self.enterStart, self.exitStart, ['walk', 'tunnelIn', 'teleportIn', 'movie']), State.State('battle', self.enterBattle, self.exitBattle, ['walk', 'died', 'movie']), State.State('finalBattle', self.enterFinalBattle, self.exitFinalBattle, ['walk', 'stickerBook', 'teleportOut', 'died', 'tunnelOut', 'DFA', 'battle', 'movie', 'ouch', 'crane', 'WaitForBattle', 'squished']), State.State('movie', self.enterMovie, self.exitMovie, ['walk', 'battle', 'finalBattle', 'died', 'teleportOut']), State.State('ouch', self.enterOuch, self.exitOuch, ['walk', 'battle', 'finalBattle', 'died', 'crane']), State.State('crane', self.enterCrane, self.exitCrane, ['walk', 'battle', 'finalBattle', 'died', 'ouch', 'squished']), State.State('walk', self.enterWalk, self.exitWalk, ['stickerBook', 'teleportOut', 'died', 'tunnelOut', 'DFA', 'battle', 'movie', 'ouch', 'crane', 'finalBattle', 'WaitForBattle']), State.State('stickerBook', self.enterStickerBook, self.exitStickerBook, ['walk', 'DFA', 'WaitForBattle', 'movie', 'battle']), State.State('WaitForBattle', self.enterWaitForBattle, self.exitWaitForBattle, ['battle', 'walk', 'movie']), State.State('DFA', self.enterDFA, self.exitDFA, ['DFAReject', 'teleportOut', 'tunnelOut']), State.State('DFAReject', self.enterDFAReject, self.exitDFAReject, ['walk']), State.State('teleportIn', self.enterTeleportIn, self.exitTeleportIn, ['walk']), State.State('teleportOut', self.enterTeleportOut, self.exitTeleportOut, ['teleportIn', 'final', 'WaitForBattle']), State.State('died', self.enterDied, self.exitDied, ['final']), State.State('tunnelIn', self.enterTunnelIn, self.exitTunnelIn, ['walk']), State.State('tunnelOut', self.enterTunnelOut, self.exitTunnelOut, ['final']), State.State('squished', self.enterSquished, self.exitSquished, ['finalBattle', 'crane', 'died', 'teleportOut']), State.State('final', self.enterFinal, self.exitFinal, ['start'])], 'start', 'final') return def load(self): BattlePlace.BattlePlace.load(self) self.parentFSM.getStateNamed('cogHQBossBattle').addChild(self.fsm) self.townBattle = self.loader.townBattle for i in range(1, 3): Suit.loadSuits(i) def unload(self): BattlePlace.BattlePlace.unload(self) self.parentFSM.getStateNamed('cogHQBossBattle').removeChild(self.fsm) del self.parentFSM del self.fsm self.ignoreAll() for i in range(1, 3): Suit.unloadSuits(i) def getTaskZoneId(self): return base.cr.playGame.hood.id def enter(self, requestStatus, bossCog): self.zoneId = requestStatus['zoneId'] BattlePlace.BattlePlace.enter(self) self.fsm.enterInitialState() self.bossCog = bossCog if self.bossCog: self.bossCog.d_avatarEnter() else: # HACK: For some reason, when teleporting to a boss via a magic word, the place may load # first instead of the boss cog. So listen to when the boss is generated. self.acceptOnce('announceBoss', self.__bossGenerate) self._telemLimiter = TLGatherAllAvs('CogHQBossBattle', RotationLimitToH) NametagGlobals.setMasterArrowsOn(1) base.localAvatar.inventory.setRespectInvasions(0) self.fsm.request(requestStatus['how'], [requestStatus]) def __bossGenerate(self, boss): if self.bossCog: return self.bossCog = boss self.bossCog.d_avatarEnter() def exit(self): self.fsm.requestFinalState() base.localAvatar.inventory.setRespectInvasions(1) if self.bossCog: self.bossCog.d_avatarExit() self.bossCog = None self._telemLimiter.destroy() del self._telemLimiter BattlePlace.BattlePlace.exit(self) return def enterBattle(self, event): mult = 1 if self.bossCog: mult = ToontownBattleGlobals.getBossBattleCreditMultiplier(self.bossCog.battleNumber) self.townBattle.enter(event, self.fsm.getStateNamed('battle'), bldg=1, creditMultiplier=mult) base.localAvatar.b_setAnimState('off', 1) base.localAvatar.setTeleportAvailable(0) base.localAvatar.cantLeaveGame = 1 def exitBattle(self): self.townBattle.exit() def enterFinalBattle(self): self.walkStateData.enter() self.walkStateData.fsm.request('walking') base.localAvatar.setTeleportAvailable(0) base.localAvatar.setTeleportAllowed(0) base.localAvatar.cantLeaveGame = 0 base.localAvatar.book.hideButton() self.ignore(ToontownGlobals.StickerBookHotkey) self.ignore('enterStickerBook') self.ignore(ToontownGlobals.OptionsPageHotkey) def exitFinalBattle(self): self.walkStateData.exit() base.localAvatar.setTeleportAllowed(1) def enterMovie(self, requestStatus = None): base.localAvatar.setTeleportAvailable(0) def exitMovie(self): pass def enterOuch(self): base.localAvatar.setTeleportAvailable(0) base.localAvatar.laffMeter.start() def exitOuch(self): base.localAvatar.laffMeter.stop() def enterCrane(self): base.localAvatar.setTeleportAvailable(0) base.localAvatar.laffMeter.start() base.localAvatar.collisionsOn() def exitCrane(self): base.localAvatar.collisionsOff() base.localAvatar.laffMeter.stop() def enterWalk(self, teleportIn = 0): BattlePlace.BattlePlace.enterWalk(self, teleportIn) self.ignore('teleportQuery') base.localAvatar.setTeleportAvailable(0) base.localAvatar.setTeleportAllowed(0) base.localAvatar.book.hideButton() self.ignore(ToontownGlobals.StickerBookHotkey) self.ignore('enterStickerBook') self.ignore(ToontownGlobals.OptionsPageHotkey) self.ignore(self.walkDoneEvent) def exitWalk(self): BattlePlace.BattlePlace.exitWalk(self) base.localAvatar.setTeleportAllowed(1) 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 enterTeleportIn(self, requestStatus): base.localAvatar.detachNode() base.localAvatar.setPosHpr(*self.teleportInPosHpr) BattlePlace.BattlePlace.enterTeleportIn(self, requestStatus) def enterTeleportOut(self, requestStatus): BattlePlace.BattlePlace.enterTeleportOut(self, requestStatus, self.__teleportOutDone) def __teleportOutDone(self, requestStatus): hoodId = requestStatus['hoodId'] if hoodId == ToontownGlobals.MyEstate: self.getEstateZoneAndGoHome(requestStatus) else: self.doneStatus = requestStatus messenger.send(self.doneEvent) def enterSquished(self): base.localAvatar.laffMeter.start() base.localAvatar.b_setAnimState('Flattened') def handleSquishDone(self, extraArgs = []): base.cr.playGame.getPlace().setState('walk') def exitSquished(self): taskMgr.remove(base.localAvatar.uniqueName('finishSquishTask')) base.localAvatar.laffMeter.stop()