Complete remaining client gap features

This commit is contained in:
shenlei
2026-09-04 13:25:05 +09:00
parent 13ccb8d02d
commit 9a4a044da5
47 changed files with 6667 additions and 140 deletions
+112
View File
@@ -0,0 +1,112 @@
# damage_effect_test —— §8.8 / §5.4 头顶伤害飘字 1:1
# CInstanceBase::AddDamageEffect / ProcessDamage 的分类(DODGE|BLOCK -> MISS、
# self -> "damage_"、nontarget -> 不渲染、target -> "target_")、数字逐位拆分、
# CPythonSystem::IsShowDamage / SetShowDamageFlag 门。
# godot --headless --path project --script damage_effect_test.gd
# 退出码 0 = 全过。
extends SceneTree
const DamageEffect = preload("res://damage_effect.gd")
var _fail := 0
func _ck(c: bool, m: String) -> void:
if not c:
_fail += 1
printerr("FAIL: " + m)
func _init() -> void:
_run()
if _fail == 0:
print("PASS: damage_effect_test (§8.8/§5.4 AddDamageEffect / ProcessDamage 分类 + IsShowDamage 1:1)")
quit(0)
else:
printerr("%d check(s) failed" % _fail)
quit(1)
func _run() -> void:
# --- 0. 常量(InstanceBase.h / PythonSystem.cpp / InstanceBaseEffect.cpp----
_ck(DamageEffect.DAMAGE_NORMAL == 1 << 0, "DAMAGE_NORMAL == 1<<0")
_ck(DamageEffect.DAMAGE_POISON == 1 << 1, "DAMAGE_POISON == 1<<1")
_ck(DamageEffect.DAMAGE_DODGE == 1 << 2, "DAMAGE_DODGE == 1<<2")
_ck(DamageEffect.DAMAGE_BLOCK == 1 << 3, "DAMAGE_BLOCK == 1<<3")
_ck(DamageEffect.DAMAGE_PENETRATE == 1 << 4, "DAMAGE_PENETRATE == 1<<4")
_ck(DamageEffect.DAMAGE_CRITICAL == 1 << 5, "DAMAGE_CRITICAL == 1<<5")
_ck(DamageEffect.SHOW_DAMAGE_DEFAULT == true, "m_Config.bShowDamage 默认 true")
_ck(DamageEffect.CFG_KEY == "SHOW_DAMAGE", "配置键 == SHOW_DAMAGE")
_ck(DamageEffect.FONT_WIDTH == 30, "FONT_WIDTH == 30")
_ck(DamageEffect.MAX_DIGITS == 8, "index 上限 8>7 break")
# --- 1. IsShowDamage 门 -----------------------------------------------------
_ck(DamageEffect.should_queue(true) == true, "IsShowDamage() -> 入队")
_ck(DamageEffect.should_queue(false) == false, "!IsShowDamage() -> 不入队")
_ck(DamageEffect.show_damage_from_flag(1) == true, "SetShowDamageFlag(1) -> true")
_ck(DamageEffect.show_damage_from_flag(0) == false, "SetShowDamageFlag(0) -> false")
_ck(DamageEffect.show_damage_from_flag(2) == false, "SetShowDamageFlag(2) -> false(严格 == 1")
_ck(DamageEffect.show_damage_from_cfg("1") == true, "cfg \"1\" -> true")
_ck(DamageEffect.show_damage_from_cfg("0") == false, "cfg \"0\" -> false")
_ck(DamageEffect.show_damage_from_cfg("2") == false, "cfg \"2\" -> false")
_ck(DamageEffect.show_damage_from_cfg(1) == true, "cfg int 1 -> true")
# --- 2. bSelf / bTargetRecvDamageInfoPacket----------------------------
_ck(DamageEffect.is_self(42, 42) == true, "vid == main -> bSelf")
_ck(DamageEffect.is_self(42, 7) == false, "vid != main -> !bSelf")
_ck(DamageEffect.is_self(0, 0) == false, "vid 0 -> !bSelf")
_ck(DamageEffect.is_target(9, 9) == true, "vid == targetBoard VID -> bTarget")
_ck(DamageEffect.is_target(9, 0) == false, "无目标 -> !bTarget")
_ck(DamageEffect.is_target(0, 0) == false, "vid 0 -> !bTarget")
# --- 3. damage >= 0 门 --------------------------------------------------
_ck(DamageEffect.valid_amount(0) == true, "damage 0 -> 处理(>= 0")
_ck(DamageEffect.valid_amount(5) == true, "damage 5 -> 处理")
_ck(DamageEffect.valid_amount(-1) == false, "damage < 0 -> TraceError 不处理")
# --- 4. ProcessDamage 分类 --------------------------------------------------
var m := DamageEffect.Kind.MISS
var g := DamageEffect.Kind.DIGITS
# DODGE / BLOCK -> MISS
var c := DamageEffect.classify(DamageEffect.DAMAGE_DODGE, true, true)
_ck(c["kind"] == m and c["type"] == "damage_" and c["show"] and c["self"], "DODGE + self -> MISS damage_ show self")
c = DamageEffect.classify(DamageEffect.DAMAGE_DODGE, false, true)
_ck(c["kind"] == m and c["type"] == "target_" and c["show"] and not c["self"], "DODGE + 非 self -> MISS target_")
c = DamageEffect.classify(DamageEffect.DAMAGE_BLOCK, true, false)
_ck(c["kind"] == m and c["type"] == "damage_", "BLOCK + self -> MISS damage_")
c = DamageEffect.classify(DamageEffect.DAMAGE_BLOCK, false, false)
_ck(c["kind"] == m and c["type"] == "target_", "BLOCK + 非 self -> MISS target_(即便非 target")
c = DamageEffect.classify(DamageEffect.DAMAGE_DODGE | DamageEffect.DAMAGE_BLOCK, false, true)
_ck(c["kind"] == m, "DODGE|BLOCK 合并 -> MISS")
# 数字:self / target / nontarget
c = DamageEffect.classify(DamageEffect.DAMAGE_NORMAL, true, false)
_ck(c["kind"] == g and c["type"] == "damage_" and c["show"] and c["self"], "普通 + self -> DIGITS damage_ show self")
c = DamageEffect.classify(DamageEffect.DAMAGE_NORMAL, false, true)
_ck(c["kind"] == g and c["type"] == "target_" and c["show"] and not c["self"], "普通 + target -> DIGITS target_ show")
c = DamageEffect.classify(DamageEffect.DAMAGE_NORMAL, false, false)
_ck(c["kind"] == g and c["type"] == "nontarget_" and c["show"] == false, "普通 + 非 self 非 target -> nontarget_ 不渲染")
# CRITICAL 在该 build 无独立视觉 -> 仍按数字
c = DamageEffect.classify(DamageEffect.DAMAGE_CRITICAL, true, false)
_ck(c["kind"] == g and c["type"] == "damage_" and c["show"], "CRITICAL + self -> 仍普通数字 damage_")
c = DamageEffect.classify(DamageEffect.DAMAGE_CRITICAL, false, true)
_ck(c["kind"] == g and c["type"] == "target_" and c["show"], "CRITICAL + target -> 普通数字 target_")
c = DamageEffect.classify(DamageEffect.DAMAGE_CRITICAL, false, false)
_ck(c["show"] == false, "CRITICAL + nontarget -> 仍不渲染")
# POISON 分支被注释掉 -> 走普通
c = DamageEffect.classify(DamageEffect.DAMAGE_POISON, false, true)
_ck(c["kind"] == g and c["type"] == "target_", "POISON(分支注释掉)+ target -> 普通数字 target_")
# --- 5. digits:低位在前,最多 8 位 --------------------------------------
_ck(DamageEffect.digits(0) == [], "digits(0) == []while 零次)")
_ck(DamageEffect.digits(-5) == [], "digits(-5) == []")
_ck(DamageEffect.digits(7) == [7], "digits(7) == [7]")
_ck(DamageEffect.digits(123) == [3, 2, 1], "digits(123) == [3,2,1](低位在前)")
_ck(DamageEffect.digits(90) == [0, 9], "digits(90) == [0,9]")
_ck(DamageEffect.digits(2000000) == [0, 0, 0, 0, 0, 0, 2], "digits(2000000) 7 位")
_ck(DamageEffect.digits(999999999).size() == 8, "digits(9 位) 截到 8 位(index>7 break")
_ck(DamageEffect.digits(999999999) == [9, 9, 9, 9, 9, 9, 9, 9], "digits(999999999) == 8×9")
# --- 6. digit_offset_pxFONT_WIDTH*index ------------------------------
_ck(is_equal_approx(DamageEffect.digit_offset_px(0), 0.0), "第 0 位偏移 0")
_ck(is_equal_approx(DamageEffect.digit_offset_px(1), 30.0), "第 1 位偏移 30")
_ck(is_equal_approx(DamageEffect.digit_offset_px(3), 90.0), "第 3 位偏移 90")
# --- 7. self 特效交替(m_bDamageEffectType---------------------------
_ck(DamageEffect.self_damage_slot(false) == 0, "toggle false -> SELFDAMAGE(0)")
_ck(DamageEffect.self_damage_slot(true) == 1, "toggle true -> SELFDAMAGE2(1)")