mrbot/bot/export_abilities.iss

286 lines
11 KiB
Plaintext

#include "${LavishScript.HomeDirectory}/Scripts/mr/common/StringHelpers.iss"
variable jsonvalue stealthRequiredEffects = "[ \"I need to be stealthed!\", \"You must be in stealth to use this!\", \"You must be sneaking to use this ability.\"]"
variable jsonvalue flankingRequiredEffects = "[ \"Must be flanking or behind\" ]"
variable jsonvalue noEpicEffects = "[ \"Does not affect Epic targets\"]"
variable jsonvalue interruptEffects = "[ \"Interrupts target\" ]"
variable jsonvalue stunEffects = "[ \"Stuns target\" ]"
function:bool matchesItemInArray(jsonvalueref arr, string val)
{
if !${arr.Type.Equal[array]}
{
echo "effects is not an array ${arr.Type}"
return FALSE
}
variable jsoniterator iter
arr:GetIterator[iter]
if ${iter:First(exists)}
{
do
{
if ${val.Equal["${iter.Value}"]}
{
return TRUE
}
}
while ${iter:Next(exists)}
}
return FALSE
}
function:bool hasMatchingEffect(jsonvalueref effects, jsonvalueref specialEffects)
{
if !${effects.Type.Equal[array]}
{
echo "effects is not an array ${effects.Type}"
return FALSE
}
variable jsoniterator effectIterator
effects:GetIterator[effectIterator]
if ${effectIterator:First(exists)}
{
do
{
call matchesItemInArray specialEffects "${effectIterator.Value.Get["description"]}"
if ${Return}
{
return TRUE
}
}
while ${effectIterator:Next(exists)}
}
return FALSE
}
function:jsonvalueref extractDamageFromEffect(jsonvalueref effectJo)
{
variable string description
description:Set["${effectJo.Get["description"]}"]
if ${description.Left[8].NotEqual["Inflicts"]}
{
return "{}"
}
variable int64 minDamage
variable int64 maxDamage
variable string damageType
minDamage:Set["${description.Token[2, " "].Replace[",", ""]}"]
if ${description.Token[3, " "].Equal["-"]}
{
maxDamage:Set["${description.Token[4, " "].Replace[",", ""]}"]
damageType:Set["${description.Token[5, " "]}"]
}
else
{
maxDamage:Set["${description.Token[2, " "].Replace[",", ""]}"]
damageType:Set["${description.Token[3, " "]}"]
}
variable jsonvalue damage
damage:SetValue["$$>{
"type": "${damageType}",
"min": ${minDamage},
"max": ${maxDamage}
}<$$"]
if !${damageType(exists)}
{
echo "huh?: ${description}"
}
return ${damage.AsJSON~}
}
function main()
{
variable index:ability MyAbilities
variable iterator MyAbilitiesIterator
variable jsonvalue abilityList = "{}"
variable jsonvalue currentAbility = {}
variable jsonvalue effects = []
variable jsonvalue abilityEffect = {}
variable string abilityLineName
variable int idx = 1
variable int Counter = 1
variable int Timer = 0
Me:QueryAbilities[MyAbilities]
MyAbilities:GetIterator[MyAbilitiesIterator]
if ${MyAbilitiesIterator:First(exists)}
{
do
{
if (!${MyAbilitiesIterator.Value.IsAbilityInfoAvailable})
{
do
{
wait 2
}
while (!${MyAbilitiesIterator.Value.IsAbilityInfoAvailable} && ${Timer:Inc} < 1500)
}
wait 5
echo "Exporting (${Counter} / ${MyAbilities.Used}) - ${MyAbilitiesIterator.Value.ToAbilityInfo.Name} (ID: ${MyAbilitiesIterator.Value.ID})"
currentAbility:SetValue["$$>{
"id": ${MyAbilitiesIterator.Value.ID},
"name": "${MyAbilitiesIterator.Value.ToAbilityInfo.Name}",
"description": ${MyAbilitiesIterator.Value.ToAbilityInfo.Description.AsJSON~},
"level": ${MyAbilitiesIterator.Value.ToAbilityInfo.Class[${Me.SubClass}].Level},
"tier": "${MyAbilitiesIterator.Value.ToAbilityInfo.Tier}",
"healthCost": ${MyAbilitiesIterator.Value.ToAbilityInfo.HealthCost},
"powerCost": ${MyAbilitiesIterator.Value.ToAbilityInfo.PowerCost},
"dissonanceCost": ${MyAbilitiesIterator.Value.ToAbilityInfo.DissonanceCost},
"savageryCost": ${MyAbilitiesIterator.Value.ToAbilityInfo.SavageryCost},
"concentrationCost": ${MyAbilitiesIterator.Value.ToAbilityInfo.ConcentrationCost},
"mainIconID": ${MyAbilitiesIterator.Value.ToAbilityInfo.MainIconID},
"hoIconID": ${MyAbilitiesIterator.Value.ToAbilityInfo.HOIconID},
"castingTime": ${MyAbilitiesIterator.Value.ToAbilityInfo.CastingTime},
"recoveryTime": ${MyAbilitiesIterator.Value.ToAbilityInfo.RecoveryTime},
"recastTime": ${MyAbilitiesIterator.Value.ToAbilityInfo.RecastTime},
"maxDuration": ${MyAbilitiesIterator.Value.ToAbilityInfo.MaxDuration},
"numClasses": ${MyAbilitiesIterator.Value.ToAbilityInfo.NumClasses},
"numEffects": ${MyAbilitiesIterator.Value.ToAbilityInfo.NumEffects},
"backDropIconID": ${MyAbilitiesIterator.Value.ToAbilityInfo.BackDropIconID},
"healthCostPerTick": ${MyAbilitiesIterator.Value.ToAbilityInfo.HealthCostPerTick},
"powerCostPerTick": ${MyAbilitiesIterator.Value.ToAbilityInfo.PowerCostPerTick},
"dissonanceCostPerTick": ${MyAbilitiesIterator.Value.ToAbilityInfo.DissonanceCostPerTick},
"savageryCostPerTick": ${MyAbilitiesIterator.Value.ToAbilityInfo.SavageryCostPerTick},
"maxAOETargets": ${MyAbilitiesIterator.Value.ToAbilityInfo.MaxAOETargets},
"isBeneficial": "${MyAbilitiesIterator.Value.ToAbilityInfo.IsBeneficial.AsJSON}",
"doesNotExpire": "${MyAbilitiesIterator.Value.ToAbilityInfo.DoesNotExpire.AsJSON}",
"groupRestricted": "${MyAbilitiesIterator.Value.ToAbilityInfo.GroupRestricted.AsJSON}",
"allowRaid": "${MyAbilitiesIterator.Value.ToAbilityInfo.AllowRaid.AsJSON}",
"effectRadius": ${MyAbilitiesIterator.Value.ToAbilityInfo.EffectRadius},
"targetType": ${MyAbilitiesIterator.Value.ToAbilityInfo.TargetType},
"spellBookType": ${MyAbilitiesIterator.Value.ToAbilityInfo.SpellBookType},
"minRange": ${MyAbilitiesIterator.Value.ToAbilityInfo.MinRange},
"maxRange": ${MyAbilitiesIterator.Value.ToAbilityInfo.MaxRange}
}<$$"]
for (idx:Set[1] ; ${idx} < ${MyAbilitiesIterator.Value.ToAbilityInfo.NumEffects} ; idx:Inc )
{
abilityEffect:SetValue["$$>{
"percentSuccess": ${MyAbilitiesIterator.Value.ToAbilityInfo.Effect[${idx}].PercentSuccess.AsJSON~},
"indentation": "${MyAbilitiesIterator.Value.ToAbilityInfo.Effect[${idx}].Indentation.AsJSON~}",
"description": ${MyAbilitiesIterator.Value.ToAbilityInfo.Effect[${idx}].Description.AsJSON~}
}<$$"]
effects:Add["${abilityEffect.AsJSON~}"]
call matchesItemInArray stealthRequiredEffects ${abilityEffect.Get["description"]}
if ${Return}
{
currentAbility:Set["requiresStealth", ${Return.AsJSON~}]
}
call matchesItemInArray flankingRequiredEffects ${abilityEffect.Get["description"]}
if ${Return}
{
currentAbility:Set["requiresFlanking", ${Return.AsJSON~}]
}
call matchesItemInArray noEpicEffects ${abilityEffect.Get["description"]}
if ${Return}
{
currentAbility:Set["noEpic", ${Return.AsJSON~}]
}
call matchesItemInArray stunEffects ${abilityEffect.Get["description"]}
if ${Return}
{
currentAbility:Set["stuns", ${Return.AsJSON~}]
}
call matchesItemInArray interruptEffects ${abilityEffect.Get["description"]}
if ${Return}
{
currentAbility:Set["interrupts", ${Return.AsJSON~}]
}
call extractDamageFromEffect abilityEffect
if ${Return.Get["type"](exists)}
{
variable string damageType
variable int64 minDamage
; TODO: Add a loop to handle multiple damage effects.
; TODO: Modify extractDmaageFromEffect to also calculate damage for
; damage over time effects.
damageType:Set["${Return.Get["type"]}"]
minDamage:Set["${Return.Get["min"]}"]
currentAbility:Set["doesDamage", TRUE]
if ${currentAbility.Has["damage", "${Return.Get["type"]}"]}
{
variable int64 currentMinDamageTotal
currentMinDamageTotal:Set["${currentAbility.Get["damage", ${damageType}]}"]
currentMinDamageTotal:Inc[${minDamage}]
currentAbility.Get["damage", ${damageType}]:Set[${currentMinDamageTotal}]
}
else
{
if ${currentAbility.Has["damage"]}
{
currentAbility.Get["damage"]:Set["${damageType}", "${minDamage}"]
}
else
{
currentAbility:Set["damage", "$$>{
"${damageType}": ${minDamage},
}<$$"]
}
}
}
abilityEffect:Clear
}
currentAbility:Set["effects", "${effects.AsJSON~}"]
effects:Clear
abilityLineName:Set["${MRStringHelpers.StripRomanNumerals[${currentAbility.Get["name"]}]}"]
if !${abilityList.Has["${abilityLineName}"]}
{
abilityList:Set["${abilityLineName}", "[${currentAbility.AsJSON~}]"]
}
else
{
abilityList.Get["${abilityLineName}"]:Add["${currentAbility.AsJSON~}"]
}
Counter:Inc
Timer:Set[0]
}
while ${MyAbilitiesIterator:Next(exists)}
}
abilityList:WriteFile["${LavishScript.HomeDirectory}/Scripts/mr/bot/ability_exports/${Me.Name}_${Me.SubClass}.json", multiline]
}