修复契魔者魔刃狂舞影子伤害计算 #9

Merged
imelon merged 1 commits from fix/demon-slayer-blade-dance-damage into master 2026-09-22 20:02:05 +08:00
2 changed files with 69 additions and 3 deletions
@@ -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":["唤魔 : 塔莫斯之袭"]}
]
@@ -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"