diff --git a/backend/core/character/GF/swordman_female/demon_slayer.py b/backend/core/character/GF/swordman_female/demon_slayer.py index 8c4987e0..5ad6c1d6 100644 --- a/backend/core/character/GF/swordman_female/demon_slayer.py +++ b/backend/core/character/GF/swordman_female/demon_slayer.py @@ -922,7 +922,7 @@ class Skill28(ActiveSkill): data4 = data0 hit4 = 10 - data5 = data1 + data5 = data2 hit5 = 1 power4 = 0 power5 = 0 @@ -1403,8 +1403,8 @@ class Skill36(PassiveSkill): {"data":data0,"type":"*skillDamage","exceptSkills":["魔刃狂舞","蛇腹剑 : 缠","唤魔 : 塔莫斯之袭"]}, {"data":data1,"type":"+power8","skills":["蛇腹剑 : 缠"]}, {"data":data1,"type":"+power9","skills":["蛇腹剑 : 缠"]}, - {"data":data2,"type":"+power4","skills":["魔刃狂舞"]}, - {"data":data2,"type":"+power5","skills":["魔刃狂舞"]}, + {"data":data3,"type":"+power4","skills":["魔刃狂舞"]}, + {"data":data3,"type":"+power5","skills":["魔刃狂舞"]}, {"data":data4,"type":"+hit1","skills":["唤魔 : 塔莫斯之袭"],"ratio": 1}, {"data":data5,"type":"*power3","skills":["唤魔 : 塔莫斯之袭"]} ] diff --git a/backend/tests/unit/test_demon_slayer_blade_dance.py b/backend/tests/unit/test_demon_slayer_blade_dance.py new file mode 100644 index 00000000..16d06e11 --- /dev/null +++ b/backend/tests/unit/test_demon_slayer_blade_dance.py @@ -0,0 +1,66 @@ +import ast +from pathlib import Path + + +SKILL_FILE = ( + Path(__file__).resolve().parents[2] + / "core" + / "character" + / "GF" + / "swordman_female" + / "demon_slayer.py" +) + + +def _skill_class(name: str) -> ast.ClassDef: + module = ast.parse(SKILL_FILE.read_text(encoding="utf-8")) + return next( + node + for node in module.body + if isinstance(node, ast.ClassDef) + and any( + isinstance(item, ast.Assign) + and any(isinstance(target, ast.Name) and target.id == "name" for target in item.targets) + and isinstance(item.value, ast.Constant) + and item.value.value == name + for item in node.body + ) + ) + + +def test_blade_dance_shadow_uses_final_hit_damage_not_hit_count(): + skill = _skill_class("魔刃狂舞") + shadow_final_hit = next( + item + for item in skill.body + if isinstance(item, ast.Assign) + and any(isinstance(target, ast.Name) and target.id == "data5" for target in item.targets) + ) + + assert isinstance(shadow_final_hit.value, ast.Name) + assert shadow_final_hit.value.id == "data2" + + +def test_blade_dance_shadow_uses_its_own_passive_ratio(): + passive = _skill_class("唤魔 : 弑神剑") + associations = next( + item.value + for item in passive.body + if isinstance(item, ast.Assign) + and any(isinstance(target, ast.Name) and target.id == "associate" for target in item.targets) + ) + shadow_associations = [ + dict(zip((key.value for key in entry.keys), entry.values)) + for entry in associations.elts + if isinstance(entry, ast.Dict) + ] + + for power in ("+power4", "+power5"): + association = next( + entry + for entry in shadow_associations + if isinstance(entry.get("type"), ast.Constant) + and entry["type"].value == power + ) + assert isinstance(association["data"], ast.Name) + assert association["data"].id == "data3"