Files
mtgodot-poc/project/damage_effect_test.gd

113 lines
6.7 KiB
GDScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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)")