197 lines
No EOL
7.4 KiB
Python
197 lines
No EOL
7.4 KiB
Python
from direct.directnotify import DirectNotifyGlobal
|
|
from toontown.toonbase import ToontownBattleGlobals, ToontownGlobals
|
|
from toontown.suit import SuitDNA
|
|
BattleExperienceAINotify = DirectNotifyGlobal.directNotify.newCategory('BattleExprienceAI')
|
|
|
|
def getSkillGained(toonSkillPtsGained, toonId, track):
|
|
exp = 0
|
|
expList = toonSkillPtsGained.get(toonId, None)
|
|
if expList != None:
|
|
exp = expList[track]
|
|
return int(exp + 0.5)
|
|
|
|
def getBattleExperience(numToons, activeToons, toonExp, toonSkillPtsGained, toonOrigQuests, toonItems, toonOrigMerits, toonMerits, toonParts, suitsKilled, helpfulToonsList = None):
|
|
if helpfulToonsList == None:
|
|
BattleExperienceAINotify.warning('=============\nERROR ERROR helpfulToons=None in assignRewards , tell Red')
|
|
p = []
|
|
for k in xrange(numToons):
|
|
toon = None
|
|
if k < len(activeToons):
|
|
toonId = activeToons[k]
|
|
toon = simbase.air.doId2do.get(toonId)
|
|
if toon == None:
|
|
p.append(-1)
|
|
p.append([0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0])
|
|
p.append([0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0])
|
|
p.append([])
|
|
p.append([])
|
|
p.append([])
|
|
p.append([0,
|
|
0,
|
|
0,
|
|
0])
|
|
p.append([0,
|
|
0,
|
|
0,
|
|
0])
|
|
p.append([0,
|
|
0,
|
|
0,
|
|
0])
|
|
else:
|
|
p.append(toonId)
|
|
origExp = toonExp[toonId]
|
|
earnedExp = []
|
|
for i in xrange(len(ToontownBattleGlobals.Tracks)):
|
|
earnedExp.append(getSkillGained(toonSkillPtsGained, toonId, i))
|
|
|
|
p.append(origExp)
|
|
p.append(earnedExp)
|
|
origQuests = toonOrigQuests.get(toonId, [])
|
|
p.append(origQuests)
|
|
items = toonItems.get(toonId, ([], []))
|
|
p.append(items[0])
|
|
p.append(items[1])
|
|
origMerits = toonOrigMerits.get(toonId, [])
|
|
p.append(origMerits)
|
|
merits = toonMerits.get(toonId, [0,
|
|
0,
|
|
0,
|
|
0])
|
|
p.append(merits)
|
|
parts = toonParts.get(toonId, [0,
|
|
0,
|
|
0,
|
|
0])
|
|
p.append(parts)
|
|
|
|
deathList = []
|
|
toonIndices = {}
|
|
for i in xrange(len(activeToons)):
|
|
toonIndices[activeToons[i]] = i
|
|
|
|
for deathRecord in suitsKilled:
|
|
level = deathRecord['level']
|
|
type = deathRecord['type']
|
|
if deathRecord['isBoss'] > 0:
|
|
level = 0
|
|
typeNum = SuitDNA.suitDepts.index(deathRecord['track'])
|
|
else:
|
|
typeNum = SuitDNA.suitHeadTypes.index(type)
|
|
involvedToonIds = deathRecord['activeToons']
|
|
toonBits = 0
|
|
for toonId in involvedToonIds:
|
|
if toonId in toonIndices:
|
|
toonBits |= 1 << toonIndices[toonId]
|
|
|
|
flags = 0
|
|
if deathRecord['isSkelecog']:
|
|
flags |= ToontownBattleGlobals.DLF_SKELECOG
|
|
if deathRecord['isForeman']:
|
|
flags |= ToontownBattleGlobals.DLF_FOREMAN
|
|
if deathRecord['isBoss'] > 0:
|
|
flags |= ToontownBattleGlobals.DLF_BOSS
|
|
if deathRecord['isSupervisor']:
|
|
flags |= ToontownBattleGlobals.DLF_SUPERVISOR
|
|
if deathRecord['isVirtual']:
|
|
flags |= ToontownBattleGlobals.DLF_VIRTUAL
|
|
if 'hasRevies' in deathRecord and deathRecord['hasRevives']:
|
|
flags |= ToontownBattleGlobals.DLF_REVIVES
|
|
deathList.extend([typeNum,
|
|
level,
|
|
toonBits,
|
|
flags])
|
|
|
|
p.append(deathList)
|
|
uberStats = getToonUberStatus(activeToons, numToons)
|
|
p.append(uberStats)
|
|
if helpfulToonsList == None:
|
|
helpfulToonsList = []
|
|
p.append(helpfulToonsList)
|
|
return p
|
|
|
|
|
|
def getToonUberStatus(toons, numToons):
|
|
fieldList = []
|
|
uberIndex = ToontownBattleGlobals.LAST_REGULAR_GAG_LEVEL + 1
|
|
for toonId in toons:
|
|
toonList = []
|
|
toon = simbase.air.doId2do.get(toonId)
|
|
if toon == None:
|
|
fieldList.append(-1)
|
|
else:
|
|
for trackIndex in xrange(ToontownBattleGlobals.MAX_TRACK_INDEX + 1):
|
|
toonList.append(toon.inventory.numItem(trackIndex, uberIndex))
|
|
|
|
fieldList.append(ToontownBattleGlobals.encodeUber(toonList))
|
|
|
|
lenDif = numToons - len(toons)
|
|
if lenDif > 0:
|
|
for index in xrange(lenDif):
|
|
fieldList.append(-1)
|
|
|
|
return fieldList
|
|
|
|
|
|
def assignRewards(activeToons, toonSkillPtsGained, suitsKilled, zoneId, helpfulToons = None):
|
|
if helpfulToons == None:
|
|
BattleExperienceAINotify.warning('=============\nERROR ERROR helpfulToons=None in assignRewards , tell Red')
|
|
activeToonList = []
|
|
for t in activeToons:
|
|
toon = simbase.air.doId2do.get(t)
|
|
if toon != None:
|
|
activeToonList.append(toon)
|
|
|
|
for toon in activeToonList:
|
|
for i in xrange(len(ToontownBattleGlobals.Tracks)):
|
|
uberIndex = ToontownBattleGlobals.LAST_REGULAR_GAG_LEVEL + 1
|
|
exp = getSkillGained(toonSkillPtsGained, toon.doId, i)
|
|
needed = ToontownBattleGlobals.Levels[i][ToontownBattleGlobals.LAST_REGULAR_GAG_LEVEL + 1] + ToontownBattleGlobals.UberSkill
|
|
hasUber = 0
|
|
totalExp = exp + toon.experience.getExp(i)
|
|
if toon.inventory.numItem(i, uberIndex) > 0:
|
|
hasUber = 1
|
|
if totalExp >= needed or totalExp >= ToontownBattleGlobals.MaxSkill:
|
|
if toon.inventory.totalProps < toon.getMaxCarry() and not hasUber:
|
|
uberLevel = ToontownBattleGlobals.LAST_REGULAR_GAG_LEVEL + 1
|
|
toon.inventory.addItem(i, uberLevel)
|
|
toon.experience.setExp(i, ToontownBattleGlobals.Levels[i][ToontownBattleGlobals.LAST_REGULAR_GAG_LEVEL + 1])
|
|
else:
|
|
toon.experience.setExp(i, ToontownBattleGlobals.MaxSkill)
|
|
else:
|
|
if exp > 0:
|
|
newGagList = toon.experience.getNewGagIndexList(i, exp)
|
|
toon.experience.addExp(i, amount=exp)
|
|
toon.inventory.addItemWithList(i, newGagList)
|
|
toon.b_setExperience(toon.experience.makeNetString())
|
|
toon.d_setInventory(toon.inventory.makeNetString())
|
|
toon.b_setAnimState('victory', 1)
|
|
|
|
if simbase.air.config.GetBool('battle-passing-no-credit', True):
|
|
if helpfulToons and toon.doId in helpfulToons:
|
|
simbase.air.questManager.toonKilledCogs(toon, suitsKilled, zoneId)
|
|
simbase.air.cogPageManager.toonKilledCogs(toon, suitsKilled, zoneId)
|
|
addStats(toon, suitsKilled)
|
|
else:
|
|
BattleExperienceAINotify.debug('toon=%d unhelpful not getting killed cog quest credit' % toon.doId)
|
|
else:
|
|
simbase.air.questManager.toonKilledCogs(toon, suitsKilled, zoneId)
|
|
simbase.air.cogPageManager.toonKilledCogs(toon, suitsKilled, zoneId)
|
|
addStats(toon, suitsKilled)
|
|
|
|
def addStats(toon, suitsKilled):
|
|
toon.addStat(ToontownGlobals.STAT_COGS, len(suitsKilled))
|
|
toon.addStat(ToontownGlobals.STAT_V2, len([suit for suit in suitsKilled if 'hasRevives' in suit and suit['hasRevives']]))
|
|
toon.addStat(ToontownGlobals.STAT_SKELE, len([suit for suit in suitsKilled if 'isSkelecog' in suit and suit['isSkelecog']])) |