卡①T4c(拆件批wr5/wr9/V12): settlement 拆两子 Resource 段——新建 settlement_core_table.gd(7列:source_label_map/effect_pool_map/pool_clamp_lo/pool_clamp_hi/round_direction/p_perfect/seal_hit_premium)+damage_roll_table.gd(10列:equivalence_ref_damage/armor_effectiveness/roll_faces/attack_bonus/roll_tier_bounds/roll_tier_discounts/crit_roll/crit_multiplier/damage_floor/armor_roll_stream)+.uid边车;主表三列形(segment_order留主表+core+damage_roll,类变量18→3,const四枚随主表),validate拆五私有(_validate_scalars/_validate_roll_scalars(9分支超阈续拆)/_validate_frozen/_validate_tier_table/_validate_armor_matrix)错误载荷逐字同构+段缺失fail-fast;settlement.tres单文件嵌套重建(两sub_resource,18列值与尾注批注史逐字—脚本比对18/18无diff+tail_equal);消费方改址97处(.settlement.<列>→.settlement.core./damage_roll. 链式95处+cross_validator局部2处,逐规则计数断言全中;segment_order直读1处零改址);测试改址9文件含G15清单(sim/probe/config_db交叉校验)。验收:gdstyle基线外0 NEW+16套件924 PASS+零SCRIPT ERROR〔拆件批 V12〕
This commit is contained in:
1 parent
bc7a171e3d
commit
e2a2fbf3ee
23 files changed
+221
-160
No files matched your search
@@ -79,12 +79,12 @@ func _run_recipe_sequence(db) -> Array:
|
||||
for e in units.all_enemies():
|
||||
enemy_hp_before.append(int(e.hp))
|
||||
var front = units.default_target()
|
||||
var threshold_expected: int = ctrl.defender_ac(front) + int(h.db.settlement.attack_bonus)
|
||||
var threshold_expected: int = ctrl.defender_ac(front) + int(h.db.settlement.damage_roll.attack_bonus)
|
||||
var atk_type := ""
|
||||
var eff_keys: Array = h.db.settlement.armor_effectiveness.keys()
|
||||
var eff_keys: Array = h.db.settlement.damage_roll.armor_effectiveness.keys()
|
||||
if eff_keys.size() > 0:
|
||||
atk_type = String(eff_keys[0])
|
||||
var floor_v: int = int(h.db.settlement.damage_floor)
|
||||
var floor_v: int = int(h.db.settlement.damage_roll.damage_floor)
|
||||
|
||||
var t1: int = ctrl.submit(ctrl.open_ticket(DamageControllerScript.KIND_HERO_ATTACK, "hero_attack",
|
||||
"T1主角攻击", "战斗段", int(h.db.hero.atk), DamageControllerScript.TARGET_FRONT_ALIVE, 1))
|
||||
@@ -123,9 +123,9 @@ func _run_recipe_sequence(db) -> Array:
|
||||
var r1: Dictionary = _row_by_display_prefix("T1主角攻击")
|
||||
var ex1: Dictionary = r1.get("extra", {})
|
||||
Kit.check("主角攻击行 AC = 防守方 AC + 攻击加成(开单前快照一致)", int(ex1.get("ac", -1)) == threshold_expected)
|
||||
Kit.check("掷点 ∈ [1, 骰面]", int(ex1.get("roll", -1)) >= 1 and int(ex1.get("roll", -1)) <= int(h.db.settlement.roll_faces))
|
||||
Kit.check("掷点 ∈ [1, 骰面]", int(ex1.get("roll", -1)) >= 1 and int(ex1.get("roll", -1)) <= int(h.db.settlement.damage_roll.roll_faces))
|
||||
var tier_ok := false
|
||||
for dv in h.db.settlement.roll_tier_discounts:
|
||||
for dv in h.db.settlement.damage_roll.roll_tier_discounts:
|
||||
if int(dv) == int(ex1.get("tier", -1)):
|
||||
tier_ok = true
|
||||
if int(ex1.get("tier", -1)) == 100:
|
||||
@@ -158,7 +158,7 @@ func _run_recipe_sequence(db) -> Array:
|
||||
continue
|
||||
if String(r.source_class).is_empty() or String(r.display).is_empty():
|
||||
protocol_ok = false
|
||||
if int(r.value) < int(h.db.settlement.damage_floor):
|
||||
if int(r.value) < int(h.db.settlement.damage_roll.damage_floor):
|
||||
protocol_ok = false
|
||||
if not (r.extra is Dictionary) or not r.extra.has("target"):
|
||||
protocol_ok = false
|
||||
@@ -186,7 +186,7 @@ func _test_policy_immediate_mode(db) -> void:
|
||||
if not h.spawn_ok:
|
||||
return
|
||||
h.ctrl.policy = DamageControllerScript.POLICY_IMMEDIATE
|
||||
var floor_v: int = int(h.db.settlement.damage_floor)
|
||||
var floor_v: int = int(h.db.settlement.damage_roll.damage_floor)
|
||||
var t: int = h.ctrl.submit(h.ctrl.open_ticket(DamageControllerScript.KIND_BOARD_FLAT_HERO, "mine_hit",
|
||||
"A模式反噬", "棋盘兑付", floor_v, DamageControllerScript.TARGET_HERO, 1))
|
||||
Kit.check("A 模式开单即结(无 flush 即 redeemed)", h.ctrl.outcome(t) == "redeemed")
|
||||
@@ -282,7 +282,7 @@ func _test_requires_gate_and_zero(db) -> void:
|
||||
var h = _harness(db)
|
||||
if not h.spawn_ok:
|
||||
return
|
||||
var floor_v: int = int(h.db.settlement.damage_floor)
|
||||
var floor_v: int = int(h.db.settlement.damage_roll.damage_floor)
|
||||
# 先清场(flush_submit 同步开单——清图批专用通道的契约面同时被覆盖)
|
||||
var front_hp: int = int(h.units.query_alive("enemy")[0].max_hp)
|
||||
var big: int = front_hp * 10
|
||||
@@ -326,7 +326,7 @@ func _test_ac_merge(db) -> void:
|
||||
return
|
||||
var base_ac: int = int(h.db.hero.armor_class)
|
||||
Kit.check("缺省兜底:defender_ac(hero) = hero 表值", h.ctrl.defender_ac(h.units.hero_unit()) == base_ac)
|
||||
var override_v: int = base_ac + int(h.db.settlement.damage_floor)
|
||||
var override_v: int = base_ac + int(h.db.settlement.damage_roll.damage_floor)
|
||||
h.ctrl.set_hero_ac_override(override_v)
|
||||
Kit.check("override 合流入参生效", h.ctrl.defender_ac(h.units.hero_unit()) == override_v)
|
||||
# ac 型状态效果叠其上(找 hero 侧 unit=ac 行)
|
||||
@@ -351,15 +351,15 @@ func _test_pool_clamp(db) -> void:
|
||||
var h = _harness(db)
|
||||
if not h.spawn_ok:
|
||||
return
|
||||
var lo: int = int(h.db.settlement.pool_clamp_lo)
|
||||
var hi: int = int(h.db.settlement.pool_clamp_hi)
|
||||
var lo: int = int(h.db.settlement.core.pool_clamp_lo)
|
||||
var hi: int = int(h.db.settlement.core.pool_clamp_hi)
|
||||
Kit.check("空效果池读 0(表 clamp 域含 0 前提)", h.ctrl.clamped_pool("hero_offense") == 0 and lo <= 0 and hi >= 0)
|
||||
# 找 hero_offense 池的 percent 型 hero 侧效果行
|
||||
var pool_eff := {}
|
||||
for row in h.db.status_effects.rows:
|
||||
var eid := String(row.get("effect_id", ""))
|
||||
if String(row.get("unit", "")) == "percent" and String(row.get("target_side", "")) == "hero" \
|
||||
and String(h.db.settlement.effect_pool_map.get(eid, "")) == "hero_offense":
|
||||
and String(h.db.settlement.core.effect_pool_map.get(eid, "")) == "hero_offense":
|
||||
pool_eff = row
|
||||
break
|
||||
if pool_eff.is_empty():
|
||||
|
||||
Reference in new issue
Block a user