From c5f35c2043bd4bbd7580f5836fefb37e4c1898a9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=BB=9D=E5=94=B1?= <791583861@qq.com> Date: Tue, 22 Sep 2026 19:05:12 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=A5=91=E9=AD=94=E8=80=85?= =?UTF-8?q?=E9=AD=94=E5=88=83=E7=8B=82=E8=88=9E=E5=BD=B1=E5=AD=90=E4=BC=A4?= =?UTF-8?q?=E5=AE=B3=E8=AE=A1=E7=AE=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../GF/swordman_female/demon_slayer.py | 6 +- .../unit/test_demon_slayer_blade_dance.py | 66 +++++++++++++++++++ 2 files changed, 69 insertions(+), 3 deletions(-) create mode 100644 backend/tests/unit/test_demon_slayer_blade_dance.py 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" -- 2.54.0