# 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 / bTarget(RecvDamageInfoPacket)---------------------------- _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_px:FONT_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)")