mirror of
https://github.com/Sneed-Group/Poodletooth-iLand
synced 2024-12-27 05:32:41 -06:00
199 lines
7.1 KiB
Python
199 lines
7.1 KiB
Python
|
from otp.ai.AIBaseGlobal import *
|
||
|
from direct.distributed.ClockDelta import *
|
||
|
from direct.directnotify import DirectNotifyGlobal
|
||
|
from toontown.battle import SuitBattleGlobals
|
||
|
from toontown.toonbase import ToontownGlobals
|
||
|
import DistributedSuitBaseAI
|
||
|
import random
|
||
|
from direct.fsm import ClassicFSM, State
|
||
|
from direct.fsm import State
|
||
|
|
||
|
class DistributedLawbotBossSuitAI(DistributedSuitBaseAI.DistributedSuitBaseAI):
|
||
|
notify = DirectNotifyGlobal.directNotify.newCategory('DistributedLawbotBossSuitAI')
|
||
|
|
||
|
def __init__(self, air, suitPlanner):
|
||
|
DistributedSuitBaseAI.DistributedSuitBaseAI.__init__(self, air, suitPlanner)
|
||
|
self.stunned = False
|
||
|
self.timeToRelease = 3.15
|
||
|
self.timeProsecuteStarted = 0
|
||
|
self.fsm = ClassicFSM.ClassicFSM('DistributedLawbotBossSuitAI', [State.State('Off', self.enterOff, self.exitOff, ['neutral']),
|
||
|
State.State('neutral', self.enterNeutral, self.exitNeutral, ['PreThrowProsecute', 'PreThrowAttack', 'Stunned']),
|
||
|
State.State('PreThrowProsecute', self.enterPreThrowProsecute, self.exitPreThrowProsecute, ['PostThrowProsecute', 'neutral', 'Stunned']),
|
||
|
State.State('PostThrowProsecute', self.enterPostThrowProsecute, self.exitPostThrowProsecute, ['neutral', 'Stunned']),
|
||
|
State.State('PreThrowAttack', self.enterPreThrowAttack, self.exitPreThrowAttack, ['PostThrowAttack', 'neutral', 'Stunned']),
|
||
|
State.State('PostThrowAttack', self.enterPostThrowAttack, self.exitPostThrowAttack, ['neutral', 'Stunned']),
|
||
|
State.State('Stunned', self.enterStunned, self.exitStunned, ['neutral'])], 'Off', 'Off')
|
||
|
self.fsm.enterInitialState()
|
||
|
|
||
|
def delete(self):
|
||
|
self.notify.debug('delete %s' % self.doId)
|
||
|
self.ignoreAll()
|
||
|
DistributedSuitBaseAI.DistributedSuitBaseAI.delete(self)
|
||
|
self.notify.debug('setting self.boss to None')
|
||
|
self.boss = None
|
||
|
taskName = self.uniqueName('ProsecutionHealsBoss')
|
||
|
if taskMgr.hasTaskNamed(taskName):
|
||
|
self.notify.debug('still has task %s' % taskName)
|
||
|
taskMgr.remove(taskName)
|
||
|
taskName = self.uniqueName('unstun')
|
||
|
if taskMgr.hasTaskNamed(taskName):
|
||
|
self.notify.debug('still has task %s' % taskName)
|
||
|
taskMgr.remove(taskName)
|
||
|
self.fsm = None
|
||
|
return
|
||
|
|
||
|
def requestBattle(self, x, y, z, h, p, r):
|
||
|
toonId = self.air.getAvatarIdFromSender()
|
||
|
if self.notify.getDebug():
|
||
|
self.notify.debug(str(self.getDoId()) + str(self.zoneId) + ': request battle with toon: %d' % toonId)
|
||
|
self.confrontPos = Point3(x, y, z)
|
||
|
self.confrontHpr = Vec3(h, p, r)
|
||
|
if self.sp.requestBattle(self.zoneId, self, toonId):
|
||
|
self.acceptOnce(self.getDeathEvent(), self._logDeath, [toonId])
|
||
|
if self.notify.getDebug():
|
||
|
self.notify.debug('Suit %d requesting battle in zone %d' % (self.getDoId(), self.zoneId))
|
||
|
else:
|
||
|
if self.notify.getDebug():
|
||
|
self.notify.debug('requestBattle from suit %d - denied by battle manager' % self.getDoId())
|
||
|
self.b_setBrushOff(SuitDialog.getBrushOffIndex(self.getStyleName()))
|
||
|
self.d_denyBattle(toonId)
|
||
|
|
||
|
def getPosHpr(self):
|
||
|
return (self.getX(),
|
||
|
self.getY(),
|
||
|
self.getZ(),
|
||
|
self.getH(),
|
||
|
self.getP(),
|
||
|
self.getR())
|
||
|
|
||
|
def getConfrontPosHpr(self):
|
||
|
return (self.confrontPos, self.confrontHpr)
|
||
|
|
||
|
def _logDeath(self, toonId):
|
||
|
pass
|
||
|
|
||
|
def doNextAttack(self, lawbotBoss):
|
||
|
if self.stunned:
|
||
|
return
|
||
|
chanceToDoAttack = ToontownGlobals.LawbotBossLawyerChanceToAttack
|
||
|
action = random.randrange(1, 101)
|
||
|
if action > chanceToDoAttack:
|
||
|
self.doProsecute()
|
||
|
else:
|
||
|
if not lawbotBoss.involvedToons:
|
||
|
return
|
||
|
toonToAttackId = random.choice(lawbotBoss.involvedToons)
|
||
|
toon = self.air.doId2do.get(toonToAttackId)
|
||
|
if not toon:
|
||
|
self.doProsecute()
|
||
|
return
|
||
|
toonPos = toon.getPos()
|
||
|
z2 = toonPos[2] + 1.3
|
||
|
toonPos = Point3(toonPos.getX(), toonPos.getY(), 0)
|
||
|
lawyerPos = self.getPos()
|
||
|
lawyerPos = Point3(self.getPos().getX(), self.getPos().getY(), 0)
|
||
|
dirVector = toonPos - lawyerPos
|
||
|
dirVector.normalize()
|
||
|
dirVector *= 200
|
||
|
destPos = Point3(lawyerPos[0] + dirVector[0], lawyerPos[1] + dirVector[1], lawyerPos[2] + dirVector[2] + 1.3)
|
||
|
self.d_doAttack(lawyerPos[0], lawyerPos[1], lawyerPos[2], destPos[0], destPos[1], destPos[2])
|
||
|
|
||
|
def doProsecute(self):
|
||
|
self.notify.debug('doProsecute')
|
||
|
self.timeProsecuteStarted = globalClockDelta.getRealNetworkTime()
|
||
|
self.d_doProsecute()
|
||
|
taskName = self.uniqueName('ProsecutionHealsBoss')
|
||
|
duration = 5.65
|
||
|
taskMgr.doMethodLater(duration, self.__prosecutionHeal, taskName)
|
||
|
|
||
|
def __prosecutionHeal(self, extraArg):
|
||
|
self.notify.debug('__prosecutionHeal extraArg %s' % extraArg)
|
||
|
if self.boss:
|
||
|
self.boss.healBoss(ToontownGlobals.LawbotBossLawyerHeal)
|
||
|
|
||
|
def d_doProsecute(self):
|
||
|
self.notify.debug('d_doProsecute')
|
||
|
self.sendUpdate('doProsecute', [])
|
||
|
|
||
|
def d_doAttack(self, x1, y1, z1, x2, y2, z2):
|
||
|
self.notify.debug('doAttack: x1=%.2f y1=%.2f z2=%.2f x2=%.2f y2=%.2f z2=%.2f' % (x1,
|
||
|
y1,
|
||
|
z1,
|
||
|
x2,
|
||
|
y2,
|
||
|
z2))
|
||
|
self.sendUpdate('doAttack', [x1,
|
||
|
y1,
|
||
|
z1,
|
||
|
x2,
|
||
|
y2,
|
||
|
z2])
|
||
|
|
||
|
def setBoss(self, lawbotBoss):
|
||
|
self.boss = lawbotBoss
|
||
|
|
||
|
def hitByToon(self):
|
||
|
self.notify.debug('I got hit by a toon')
|
||
|
if not self.stunned:
|
||
|
curTime = globalClockDelta.getRealNetworkTime()
|
||
|
deltaTime = curTime - self.timeProsecuteStarted
|
||
|
deltaTime /= 100.0
|
||
|
self.notify.debug('deltaTime = %f, curTime=%f, prosecuteStarted=%f' % (deltaTime, curTime, self.timeProsecuteStarted))
|
||
|
if deltaTime < self.timeToRelease:
|
||
|
taskName = self.uniqueName('ProsecutionHealsBoss')
|
||
|
taskMgr.remove(taskName)
|
||
|
self.sendUpdate('doStun', [])
|
||
|
self.setStun(True)
|
||
|
taskName = self.uniqueName('unstun')
|
||
|
taskMgr.doMethodLater(ToontownGlobals.LawbotBossLawyerStunTime, self.unStun, taskName)
|
||
|
if self.boss:
|
||
|
self.boss.checkForBonusState()
|
||
|
|
||
|
def setStun(self, val):
|
||
|
self.stunned = val
|
||
|
|
||
|
def unStun(self, taskName):
|
||
|
self.setStun(False)
|
||
|
|
||
|
def enterPreThrowProsecute(self):
|
||
|
pass
|
||
|
|
||
|
def exitPreThrowProsecute(self):
|
||
|
pass
|
||
|
|
||
|
def enterPostThrowProsecute(self):
|
||
|
pass
|
||
|
|
||
|
def exitPostThrowProsecute(self):
|
||
|
pass
|
||
|
|
||
|
def enterPreThrowAttack(self):
|
||
|
pass
|
||
|
|
||
|
def exitPreThrowAttack(self):
|
||
|
pass
|
||
|
|
||
|
def enterPostThrowAttack(self):
|
||
|
pass
|
||
|
|
||
|
def exitPostThrowAttack(self):
|
||
|
pass
|
||
|
|
||
|
def enterStunned(self):
|
||
|
pass
|
||
|
|
||
|
def exitStunned(self):
|
||
|
pass
|
||
|
|
||
|
def enterOff(self):
|
||
|
pass
|
||
|
|
||
|
def exitOff(self):
|
||
|
pass
|
||
|
|
||
|
def enterNeutral(self):
|
||
|
pass
|
||
|
|
||
|
def exitNeutral(self):
|
||
|
pass
|