113 lines
6.7 KiB
GDScript
113 lines
6.7 KiB
GDScript
# 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)")
|