108 lines
4.0 KiB
Python
108 lines
4.0 KiB
Python
from tft.staticdata.parse import parse, resolve_spell
|
|
|
|
RAW = {
|
|
"sets": {
|
|
"17": {
|
|
"name": "Set17",
|
|
"champions": [
|
|
{
|
|
"apiName": "TFT17_Mage",
|
|
"name": "Mage",
|
|
"cost": 2,
|
|
"traits": ["Caster"],
|
|
"role": "Caster",
|
|
"stats": {"hp": 600, "armor": 25, "magicResist": 25, "damage": 40,
|
|
"attackSpeed": 0.7, "mana": 60, "initialMana": 10},
|
|
"squareIcon": "ASSETS/x.TFT_Set17.tex",
|
|
"ability": {
|
|
"name": "Blast",
|
|
"desc": "Deal <magicDamage>@ModifiedDamage@ (%i:scaleAP%)</magicDamage> magic damage.",
|
|
"variables": [{"name": "Damage", "value": [0, 200, 300, 450, 700, 0, 0]}],
|
|
},
|
|
},
|
|
],
|
|
"traits": [
|
|
{
|
|
"apiName": "TFT17_Caster",
|
|
"name": "Caster",
|
|
"icon": "ASSETS/t.tex",
|
|
"effects": [
|
|
{"minUnits": 2, "maxUnits": 3, "style": 1,
|
|
"variables": {"BonusAP": 20.0}},
|
|
],
|
|
},
|
|
],
|
|
},
|
|
},
|
|
"items": [
|
|
{
|
|
"apiName": "TFT_Item_TestSword",
|
|
"name": "Test Sword",
|
|
"composition": ["TFT_Item_A", "TFT_Item_B"],
|
|
"effects": {"AD": 0.35, "CritChance": 35.0},
|
|
"icon": "ASSETS/i.tex",
|
|
},
|
|
],
|
|
}
|
|
|
|
|
|
def test_parse_keeps_effects_and_variables():
|
|
parsed = parse(RAW, set_override=17)
|
|
assert parsed["items"]["TFT_Item_TestSword"]["effects"] == {"AD": 0.35, "CritChance": 35.0}
|
|
bp = parsed["traits"]["TFT17_Caster"]["breakpoints"][0]
|
|
assert bp["variables"] == {"BonusAP": 20.0}
|
|
|
|
|
|
def test_parse_resolves_spell_damage():
|
|
unit = parse(RAW, set_override=17)["units"]["TFT17_Mage"]
|
|
assert unit["spell_damage"] == [0, 200, 300, 450, 700, 0, 0]
|
|
assert unit["spell_damage_type"] == "magic"
|
|
assert unit["spell_scaling"] == "ap"
|
|
|
|
|
|
def test_resolve_spell_on_attack_passive():
|
|
diana_like = {
|
|
"desc": "<spellPassive>Passive:</spellPassive> Attacks deal "
|
|
"<magicDamage>@ModifiedBonusDamageToAttacks@ (%i:scaleAP%)</magicDamage> "
|
|
"bonus magic damage.",
|
|
"variables": [{"name": "BonusDamageToAttacks", "value": [0, 52, 78, 135, 230]}],
|
|
}
|
|
r = resolve_spell(diana_like)
|
|
assert r["spell_on_attack"] is True
|
|
assert r["spell_damage"] == [0, 52, 78, 135, 230]
|
|
|
|
cast = parse(RAW, set_override=17)["units"]["TFT17_Mage"]
|
|
assert cast["spell_on_attack"] is False
|
|
|
|
|
|
def test_resolve_spell_adaptive_and_fallback():
|
|
adaptive = {
|
|
"desc": "Deal <magicDamage>@TotalDamage@</magicDamage> damage. %i:scaleAP% %i:scaleAD%",
|
|
"variables": [
|
|
{"name": "ADDamage", "value": [0, 100, 150, 225, 0, 0, 0]},
|
|
{"name": "APDamage", "value": [0, 50, 75, 110, 0, 0, 0]},
|
|
],
|
|
}
|
|
r = resolve_spell(adaptive)
|
|
assert r["spell_damage"][1] == 150 # 100 + 50
|
|
assert r["spell_scaling"] == "both"
|
|
|
|
utility = {"desc": "Grant a shield.", "variables": [
|
|
{"name": "Shield", "value": [0, 300, 400, 500, 0, 0, 0]}]}
|
|
assert resolve_spell(utility)["spell_damage"] is None
|
|
|
|
|
|
def test_augment_tier_from_icon():
|
|
from tft.staticdata.parse import augment_tier
|
|
assert augment_tier("ASSETS/x/GodAugmentEkko_II.TFT_Set17.tex") == 2
|
|
assert augment_tier("ASSETS/x/LeonaHero_I.TFT_Set17.tex") == 1
|
|
assert augment_tier("ASSETS/x/Big_III.tex") == 3
|
|
assert augment_tier("ASSETS/x/NoSuffix.tex") is None
|
|
|
|
|
|
def test_render_desc():
|
|
from tft.staticdata.parse import render_desc
|
|
desc = "Gain <TFTBonus>@Gold@</TFTBonus> gold and @ADAP*100@% AD.<br>Rest."
|
|
assert render_desc(desc, {"Gold": 4, "ADAP": 0.15}) == "Gain 4 gold and 15% AD. Rest."
|
|
assert render_desc("@Unknown@ gold", {}) == "? gold"
|