Poodletooth-iLand/toontown/battle/BattleBase.py

310 lines
8.3 KiB
Python

from panda3d.core import *
from toontown.toonbase.ToontownBattleGlobals import *
from direct.task.Timer import *
import math
from direct.directnotify import DirectNotifyGlobal
from toontown.toon import NPCToons
from toontown.toonbase import TTLocalizer
TOON_ID_COL = 0
TOON_TRACK_COL = 1
TOON_LVL_COL = 2
TOON_TGT_COL = 3
TOON_HP_COL = 4
TOON_ACCBONUS_COL = 5
TOON_HPBONUS_COL = 6
TOON_KBBONUS_COL = 7
SUIT_DIED_COL = 8
SUIT_REVIVE_COL = 9
SUIT_ID_COL = 0
SUIT_ATK_COL = 1
SUIT_TGT_COL = 2
SUIT_HP_COL = 3
TOON_DIED_COL = 4
SUIT_BEFORE_TOONS_COL = 5
SUIT_TAUNT_COL = 6
NO_ID = -1
NO_ATTACK = -1
UN_ATTACK = -2
PASS_ATTACK = -3
NO_TRAP = -1
LURE_SUCCEEDED = -1
PASS = 98
SOS = 99
NPCSOS = 97
PETSOS = 96
FIRE = 100
HEAL = HEAL_TRACK
TRAP = TRAP_TRACK
LURE = LURE_TRACK
SOUND = SOUND_TRACK
THROW = THROW_TRACK
SQUIRT = SQUIRT_TRACK
DROP = DROP_TRACK
TOON_ATTACK_TIME = 15.0
SUIT_ATTACK_TIME = 12.0
TOON_TRAP_DELAY = 0.8
TOON_SOUND_DELAY = 1.0
TOON_THROW_DELAY = 0.5
TOON_THROW_SUIT_DELAY = 1.0
TOON_SQUIRT_DELAY = 0.5
TOON_SQUIRT_SUIT_DELAY = 1.0
TOON_DROP_DELAY = 0.8
TOON_DROP_SUIT_DELAY = 1.0
TOON_RUN_T = 3.3
TIMEOUT_PER_USER = 5
TOON_FIRE_DELAY = 0.5
TOON_FIRE_SUIT_DELAY = 1.0
REWARD_TIMEOUT = 120
FLOOR_REWARD_TIMEOUT = 4
BUILDING_REWARD_TIMEOUT = 300
CLIENT_INPUT_TIMEOUT = config.GetFloat('battle-input-timeout', TTLocalizer.BBbattleInputTimeout)
def levelAffectsGroup(track, level):
return attackAffectsGroup(track, level)
def attackAffectsGroup(track, level, type = None):
if track == NPCSOS or type == NPCSOS or track == PETSOS or type == PETSOS:
return 1
elif track >= 0 and track <= DROP_TRACK:
return AvPropTargetCat[AvPropTarget[track]][level]
else:
return 0
def getToonAttack(id, track = NO_ATTACK, level = -1, target = -1):
return [id,
track,
level,
target,
[],
0,
0,
[],
0,
0]
def getDefaultSuitAttacks():
suitAttacks = [[NO_ID,
NO_ATTACK,
-1,
[],
0,
0,
0],
[NO_ID,
NO_ATTACK,
-1,
[],
0,
0,
0],
[NO_ID,
NO_ATTACK,
-1,
[],
0,
0,
0],
[NO_ID,
NO_ATTACK,
-1,
[],
0,
0,
0]]
return suitAttacks
def getDefaultSuitAttack():
return [NO_ID,
NO_ATTACK,
-1,
[],
0,
0,
0]
def findToonAttack(toons, attacks, track):
foundAttacks = []
for t in toons:
if t in attacks:
attack = attacks[t]
local_track = attack[TOON_TRACK_COL]
if track != NPCSOS and attack[TOON_TRACK_COL] == NPCSOS:
local_track = NPCToons.getNPCTrack(attack[TOON_TGT_COL])
if local_track == track:
if local_track == FIRE:
canFire = 1
for attackCheck in foundAttacks:
if attackCheck[TOON_TGT_COL] == attack[TOON_TGT_COL]:
canFire = 0
if canFire:
foundAttacks.append(attack)
else:
foundAttacks.append(attack)
def compFunc(a, b):
if a[TOON_LVL_COL] > b[TOON_LVL_COL]:
return 1
elif a[TOON_LVL_COL] < b[TOON_LVL_COL]:
return -1
return 0
foundAttacks.sort(compFunc)
return foundAttacks
SERVER_BUFFER_TIME = 2.0
SERVER_INPUT_TIMEOUT = CLIENT_INPUT_TIMEOUT + SERVER_BUFFER_TIME
MAX_JOIN_T = TTLocalizer.BBbattleInputTimeout
FACEOFF_TAUNT_T = 3.5
ELEVATOR_T = 4.0
BATTLE_SMALL_VALUE = 1e-07
MAX_EXPECTED_DISTANCE_FROM_BATTLE = 50.0
class BattleBase:
notify = DirectNotifyGlobal.directNotify.newCategory('BattleBase')
suitPoints = (((Point3(0, 5, 0), 179),),
((Point3(2, 5.3, 0), 170), (Point3(-2, 5.3, 0), 180)),
((Point3(4, 5.2, 0), 170), (Point3(0, 6, 0), 179), (Point3(-4, 5.2, 0), 190)),
((Point3(6, 4.4, 0), 160),
(Point3(2, 6.3, 0), 170),
(Point3(-2, 6.3, 0), 190),
(Point3(-6, 4.4, 0), 200)))
suitPendingPoints = ((Point3(-4, 8.2, 0), 190),
(Point3(0, 9, 0), 179),
(Point3(4, 8.2, 0), 170),
(Point3(8, 3.2, 0), 160))
toonPoints = (((Point3(0, -6, 0), 0),),
((Point3(1.5, -6.5, 0), 5), (Point3(-1.5, -6.5, 0), -5)),
((Point3(3, -6.75, 0), 5), (Point3(0, -7, 0), 0), (Point3(-3, -6.75, 0), -5)),
((Point3(4.5, -7, 0), 10),
(Point3(1.5, -7.5, 0), 5),
(Point3(-1.5, -7.5, 0), -5),
(Point3(-4.5, -7, 0), -10)))
toonPendingPoints = ((Point3(-3, -8, 0), -5),
(Point3(0, -9, 0), 0),
(Point3(3, -8, 0), 5),
(Point3(5.5, -5.5, 0), 20))
posA = Point3(0, 10, 0)
posB = Point3(-7.071, 7.071, 0)
posC = Point3(-10, 0, 0)
posD = Point3(-7.071, -7.071, 0)
posE = Point3(0, -10, 0)
posF = Point3(7.071, -7.071, 0)
posG = Point3(10, 0, 0)
posH = Point3(7.071, 7.071, 0)
allPoints = (posA,
posB,
posC,
posD,
posE,
posF,
posG,
posH)
toonCwise = [posA,
posB,
posC,
posD,
posE]
toonCCwise = [posH,
posG,
posF,
posE]
suitCwise = [posE,
posF,
posG,
posH,
posA]
suitCCwise = [posD,
posC,
posB,
posA]
suitSpeed = 4.8
toonSpeed = 8.0
maxTimeToon = 3.0
maxTimeSuit = 4.0
def __init__(self):
self.pos = Point3(0, 0, 0)
self.initialSuitPos = Point3(0, 1, 0)
self.timer = Timer()
self.resetLists()
def resetLists(self):
self.suits = []
self.pendingSuits = []
self.joiningSuits = []
self.activeSuits = []
self.luredSuits = []
self.suitGone = 0
self.toons = []
self.joiningToons = []
self.pendingToons = []
self.activeToons = []
self.runningToons = []
self.toonGone = 0
self.helpfulToons = []
def calcFaceoffTime(self, centerpos, suitpos):
facing = Vec3(centerpos - suitpos)
facing.normalize()
suitdest = Point3(centerpos - Point3(facing * 6.0))
dist = Vec3(suitdest - suitpos).length()
return min(dist / BattleBase.suitSpeed, BattleBase.maxTimeSuit)
def calcSuitMoveTime(self, pos0, pos1):
dist = Vec3(pos0 - pos1).length()
return min(dist / BattleBase.suitSpeed, BattleBase.maxTimeSuit)
def calcToonMoveTime(self, pos0, pos1):
dist = Vec3(pos0 - pos1).length()
return min(dist / BattleBase.toonSpeed, BattleBase.maxTimeToon)
def buildJoinPointList(self, avPos, destPos, toon = 0):
minDist = 999999.0
nearestP = None
for p in BattleBase.allPoints:
dist = Vec3(avPos - p).length()
if dist < minDist:
nearestP = p
minDist = dist
self.notify.debug('buildJoinPointList() - avp: %s nearp: %s' % (avPos, nearestP))
dist = Vec3(avPos - destPos).length()
if dist < minDist:
self.notify.debug('buildJoinPointList() - destPos is nearest')
return []
if toon == 1:
if nearestP == BattleBase.posE:
self.notify.debug('buildJoinPointList() - posE')
plist = [BattleBase.posE]
elif BattleBase.toonCwise.count(nearestP) == 1:
self.notify.debug('buildJoinPointList() - clockwise')
index = BattleBase.toonCwise.index(nearestP)
plist = BattleBase.toonCwise[index + 1:]
else:
self.notify.debug('buildJoinPointList() - counter-clockwise')
index = BattleBase.toonCCwise.index(nearestP)
plist = BattleBase.toonCCwise[index + 1:]
elif nearestP == BattleBase.posA:
self.notify.debug('buildJoinPointList() - posA')
plist = [BattleBase.posA]
elif BattleBase.suitCwise.count(nearestP) == 1:
self.notify.debug('buildJoinPointList() - clockwise')
index = BattleBase.suitCwise.index(nearestP)
plist = BattleBase.suitCwise[index + 1:]
else:
self.notify.debug('buildJoinPointList() - counter-clockwise')
index = BattleBase.suitCCwise.index(nearestP)
plist = BattleBase.suitCCwise[index + 1:]
self.notify.debug('buildJoinPointList() - plist: %s' % plist)
return plist
def addHelpfulToon(self, toonId):
if toonId not in self.helpfulToons:
self.helpfulToons.append(toonId)