oldschool-toontown/toontown/coghq/DistributedLevelBattleAI.py

153 lines
5.7 KiB
Python
Raw Normal View History

2019-11-02 17:27:54 -05:00
from toontown.battle import DistributedBattleAI
from toontown.battle import DistributedBattleBaseAI
from direct.directnotify import DirectNotifyGlobal
from direct.fsm import State
from direct.fsm import ClassicFSM
from toontown.battle.BattleBase import *
from . import CogDisguiseGlobals
2019-11-02 17:27:54 -05:00
from direct.showbase.PythonUtil import addListsByValue
class DistributedLevelBattleAI(DistributedBattleAI.DistributedBattleAI):
notify = DirectNotifyGlobal.directNotify.newCategory('DistributedLevelBattleAI')
def __init__(self, air, battleMgr, pos, suit, toonId, zoneId, level, battleCellId, winState, roundCallback=None, finishCallback=None, maxSuits=4):
self.blocker = None
self.level = level
self.battleCellId = battleCellId
self.winState = winState
self.roundCallback = roundCallback
self.suitTrack = suit.dna.dept
DistributedBattleAI.DistributedBattleAI.__init__(self, air, battleMgr, pos, suit, toonId, zoneId, finishCallback, maxSuits, tutorialFlag=0, levelFlag=1)
isBossBattle = 0
for suit in self.battleMgr.level.planner.battleCellId2suits[battleCellId]:
if suit.boss:
isBossBattle = 1
break
self.setBossBattle(isBossBattle)
self.bossDefeated = 0
return
def generate(self):
DistributedBattleAI.DistributedBattleAI.generate(self)
battleBlocker = self.battleMgr.battleBlockers.get(self.battleCellId)
if battleBlocker:
self.blocker = battleBlocker
battleBlocker.b_setBattle(self.doId)
def getLevelDoId(self):
return self.level.doId
def getBattleCellId(self):
return self.battleCellId
def getTaskZoneId(self):
pass
def localMovieDone(self, needUpdate, deadToons, deadSuits, lastActiveSuitDied):
self.timer.stop()
self.resumeNeedUpdate = needUpdate
self.resumeDeadToons = deadToons
self.resumeDeadSuits = deadSuits
self.resumeLastActiveSuitDied = lastActiveSuitDied
if len(self.toons) == 0:
self.d_setMembers()
self.b_setState('Resume')
else:
totalHp = 0
for suit in self.suits:
if suit.currHP > 0:
totalHp += suit.currHP
self.roundCallback(self.battleCellId, self.activeToons, totalHp, deadSuits)
def storeSuitsKilledThisBattle(self):
self.suitsKilledPerFloor.append(self.suitsKilledThisBattle)
def resume(self, topFloor=0):
if len(self.suits) == 0:
avList = []
for toonId in self.activeToons:
toon = self.getToon(toonId)
if toon:
avList.append(toon)
self.d_setMembers()
self.storeSuitsKilledThisBattle()
if self.bossBattle == 0:
self.b_setState('Reward')
else:
self.handleToonsWon(avList)
self.d_setBattleExperience()
self.b_setState(self.winState)
if self.blocker:
if len(self.activeToons):
self.blocker.b_setBattleFinished()
else:
if self.resumeNeedUpdate == 1:
self.d_setMembers()
if len(self.resumeDeadSuits) > 0 and self.resumeLastActiveSuitDied == 0 or len(self.resumeDeadToons) > 0:
self.needAdjust = 1
self.setState('WaitForJoin')
self.resumeNeedUpdate = 0
self.resumeDeadToons = []
self.resumeDeadSuits = []
self.resumeLastActiveSuitDied = 0
def handleToonsWon(self, toons):
pass
def enterFaceOff(self):
self.notify.debug('DistributedLevelBattleAI.enterFaceOff()')
self.joinableFsm.request('Joinable')
self.runableFsm.request('Unrunable')
self.suits[0].releaseControl()
faceOffTime = self.calcToonMoveTime(self.pos, self.initialSuitPos) + FACEOFF_TAUNT_T + SERVER_BUFFER_TIME
self.notify.debug('faceOffTime = %s' % faceOffTime)
self.timer.startCallback(faceOffTime, self.__serverFaceOffDone)
return None
def __serverFaceOffDone(self):
self.notify.debug('faceoff timed out on server')
self.ignoreFaceOffDone = 1
self.handleFaceOffDone()
def exitFaceOff(self):
self.notify.debug('DistributedLevelBattleAI.exitFaceOff()')
self.timer.stop()
return None
def faceOffDone(self):
toonId = self.air.getAvatarIdFromSender()
if self.ignoreFaceOffDone == 1:
self.notify.debug('faceOffDone() - ignoring toon: %d' % toonId)
return
else:
if self.fsm.getCurrentState().getName() != 'FaceOff':
self.notify.warning('faceOffDone() - in state: %s' % self.fsm.getCurrentState().getName())
return
else:
if self.toons.count(toonId) == 0:
self.notify.warning('faceOffDone() - toon: %d not in toon list' % toonId)
return
self.notify.debug('toon: %d done facing off' % toonId)
if not self.ignoreFaceOffDone:
self.handleFaceOffDone()
def suitRequestJoin(self, suit):
self.notify.debug('DistributedLevelBattleAI.suitRequestJoin(%d)' % suit.getDoId())
if suit in self.suits:
self.notify.warning('suit %s already in this battle' % suit.getDoId())
return 0
DistributedBattleBaseAI.DistributedBattleBaseAI.suitRequestJoin(self, suit)
def enterReward(self):
self.joinableFsm.request('Unjoinable')
self.runableFsm.request('Unrunable')
self.timer.startCallback(FLOOR_REWARD_TIMEOUT, self.serverRewardDone)
return None
def exitReward(self):
self.timer.stop()
return None