卡①T5(拆件批wr6/V13): damage_controller 拆分+参数束——open_ticket 12参→(kind,source_class,display,spec)四参 spec 束(必载 channel/base_value/target_rule/ri 缺载 assert;可选 origin_cell/attack_type/rider/highlight/context 缺省同原签名;返回单据字典九栏目+requires/source_unit 逐字不变=契约8);类变量 19→15(dig_streak/charge_layers/rider_tier_bonus/rider_tier_crit→inject 束;fx_reveal_request/fx_ac_request→fx_calls 束 {reveal,ac});函数级拆分=_hero_attack_ctx→_ctx_rewrites(按序改写族四拍+armor_roll 发射+clamp_check 唯一发射点)+_ctx_clamp_delta(克制点数+订阅改写,消费同批命中禁重复发射);_hero_attack_redeem→_kill_overflow(kill 发射+贯穿弹射);_resolve_enemy_skill→_enemy_roll(掷点/折扣/克制/池乘/下限)+_enemy_shield_apply(damage_taken 施加面 {total,shield} 穿线,发射位留主函数保减伤落快照先后序)。调用点 30 处全改 spec 形(core 14=reward_grant 3+grant_segment 7+combat_segment 3+控制器内部 overflow 1;damage_controller_test 15;system_contracts_test 1)+inject/fx_calls 注入点改键(combat_segment :34/:37/:62、begin_battle :341-347)。验收:gdstyle 基线外 0 NEW(damage_controller 9 条存量键全清:branches/length/locals×3/class-vars 19→15/params 12→4)+ unit/integration 62 套件 1698 PASS 零 SCRIPT ERROR(〔dc1〕damage_controller 44 检查全绿含 A/B 模式/死亡作废/requires 门/flush_submit/AC 合流/池乘区;〔dc2〕system_contracts 九栏目契约绿;〔dc3〕round_flow/seal_polarity/level_shop 全绿)+ system_test 70 项 0 失败三闸过〔拆件批 V13〕
This commit is contained in:
1 parent
e2a2fbf3ee
commit
139cef098e
8 files changed
+231
-172
No files matched your search
@@ -86,24 +86,25 @@ func _run_recipe_sequence(db) -> Array:
|
||||
atk_type = String(eff_keys[0])
|
||||
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))
|
||||
var t1: int = ctrl.submit(ctrl.open_ticket(DamageControllerScript.KIND_HERO_ATTACK, "hero_attack", "T1主角攻击",
|
||||
{"channel": "战斗段", "base_value": int(h.db.hero.atk),
|
||||
"target_rule": DamageControllerScript.TARGET_FRONT_ALIVE, "ri": 1}))
|
||||
# 敌方技来源取后位敌(前位是攻击/直伤/群伤的靶位——来源与靶位分离,免死置干扰配方 redeemed 断言)
|
||||
var alive_list: Array = units.query_alive("enemy")
|
||||
var src0: Dictionary = alive_list[alive_list.size() - 1]
|
||||
var ticket2: Dictionary = ctrl.open_ticket(DamageControllerScript.KIND_ENEMY_SKILL, "enemy_action",
|
||||
"T2敌方技", "战斗段", int(src0.atk), DamageControllerScript.TARGET_HERO, 1,
|
||||
Vector2i(-1, -1), "", floor_v, "", {"skill_id": "fixture_skill", "baseline": int(src0.atk)})
|
||||
var ticket2: Dictionary = ctrl.open_ticket(DamageControllerScript.KIND_ENEMY_SKILL, "enemy_action", "T2敌方技",
|
||||
{"channel": "战斗段", "base_value": int(src0.atk), "target_rule": DamageControllerScript.TARGET_HERO,
|
||||
"ri": 1, "rider": floor_v, "context": {"skill_id": "fixture_skill", "baseline": int(src0.atk)}})
|
||||
ticket2["source_unit"] = src0
|
||||
var t2: int = ctrl.submit(ticket2)
|
||||
var t3: int = ctrl.submit(ctrl.open_ticket(DamageControllerScript.KIND_BOARD_TYPED, "clear_reward",
|
||||
"T3克制直伤", "棋盘兑付", floor_v, DamageControllerScript.TARGET_FRONT_ALIVE, 1,
|
||||
Vector2i(-1, -1), atk_type))
|
||||
var t4: int = ctrl.submit(ctrl.open_ticket(DamageControllerScript.KIND_BOARD_BLAST, "clear_reward",
|
||||
"T4群伤", "棋盘兑付", floor_v, DamageControllerScript.TARGET_ALL_ALIVE, 1))
|
||||
var t5: int = ctrl.submit(ctrl.open_ticket(DamageControllerScript.KIND_BOARD_FLAT_HERO, "mine_hit",
|
||||
"T5反噬", "棋盘兑付", floor_v, DamageControllerScript.TARGET_HERO, 1,
|
||||
Vector2i(-1, -1), "", 0, "", {"terrain": "fixture"}))
|
||||
var t3: int = ctrl.submit(ctrl.open_ticket(DamageControllerScript.KIND_BOARD_TYPED, "clear_reward", "T3克制直伤",
|
||||
{"channel": "棋盘兑付", "base_value": floor_v, "target_rule": DamageControllerScript.TARGET_FRONT_ALIVE,
|
||||
"ri": 1, "attack_type": atk_type}))
|
||||
var t4: int = ctrl.submit(ctrl.open_ticket(DamageControllerScript.KIND_BOARD_BLAST, "clear_reward", "T4群伤",
|
||||
{"channel": "棋盘兑付", "base_value": floor_v, "target_rule": DamageControllerScript.TARGET_ALL_ALIVE, "ri": 1}))
|
||||
var t5: int = ctrl.submit(ctrl.open_ticket(DamageControllerScript.KIND_BOARD_FLAT_HERO, "mine_hit", "T5反噬",
|
||||
{"channel": "棋盘兑付", "base_value": floor_v, "target_rule": DamageControllerScript.TARGET_HERO,
|
||||
"ri": 1, "context": {"terrain": "fixture"}}))
|
||||
ctrl.flush()
|
||||
|
||||
var outcomes_redeemed := true
|
||||
@@ -187,8 +188,8 @@ func _test_policy_immediate_mode(db) -> void:
|
||||
return
|
||||
h.ctrl.policy = DamageControllerScript.POLICY_IMMEDIATE
|
||||
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))
|
||||
var t: int = h.ctrl.submit(h.ctrl.open_ticket(DamageControllerScript.KIND_BOARD_FLAT_HERO, "mine_hit", "A模式反噬",
|
||||
{"channel": "棋盘兑付", "base_value": floor_v, "target_rule": DamageControllerScript.TARGET_HERO, "ri": 1}))
|
||||
Kit.check("A 模式开单即结(无 flush 即 redeemed)", h.ctrl.outcome(t) == "redeemed")
|
||||
Kit.check("A 模式主角即时扣血", int(h.units.hero_unit().hp) == int(h.db.hero.max_hp) - floor_v)
|
||||
|
||||
@@ -203,8 +204,8 @@ func _test_source_death_void(db) -> void:
|
||||
var alive_list: Array = h.units.query_alive("enemy")
|
||||
var src: Dictionary = alive_list[alive_list.size() - 1]
|
||||
var hero_before: int = int(h.units.hero_unit().hp)
|
||||
var ticket: Dictionary = h.ctrl.open_ticket(DamageControllerScript.KIND_ENEMY_SKILL, "enemy_action",
|
||||
"亡敌未结单", "战斗段", int(src.atk), DamageControllerScript.TARGET_HERO, 1)
|
||||
var ticket: Dictionary = h.ctrl.open_ticket(DamageControllerScript.KIND_ENEMY_SKILL, "enemy_action", "亡敌未结单",
|
||||
{"channel": "战斗段", "base_value": int(src.atk), "target_rule": DamageControllerScript.TARGET_HERO, "ri": 1})
|
||||
ticket["source_unit"] = src
|
||||
var t: int = h.ctrl.submit(ticket)
|
||||
h.units.apply_damage(src, int(src.max_hp)) # 敌当场倒下 → unit_died → 该敌未结单作废
|
||||
@@ -234,8 +235,8 @@ func _test_identical_content_dual_enemy(db: ConfigDb) -> void:
|
||||
var h = _harness(db)
|
||||
if not h.spawn_ok:
|
||||
return
|
||||
var ticket: Dictionary = h.ctrl.open_ticket(DamageControllerScript.KIND_BOARD_FLAT_HERO, "mine_hit",
|
||||
"同容双敌单", "棋盘兑付", 1, DamageControllerScript.TARGET_HERO, 1)
|
||||
var ticket: Dictionary = h.ctrl.open_ticket(DamageControllerScript.KIND_BOARD_FLAT_HERO, "mine_hit", "同容双敌单",
|
||||
{"channel": "棋盘兑付", "base_value": 1, "target_rule": DamageControllerScript.TARGET_HERO, "ri": 1})
|
||||
ticket["source_unit"] = a
|
||||
var t: int = h.ctrl.submit(ticket)
|
||||
h.units.unit_died.emit(b) # 真实死亡事件(单位自行宣布)——同容异实例
|
||||
@@ -244,8 +245,8 @@ func _test_identical_content_dual_enemy(db: ConfigDb) -> void:
|
||||
var h2 = _harness(db)
|
||||
if not h2.spawn_ok:
|
||||
return
|
||||
var ticket2: Dictionary = h2.ctrl.open_ticket(DamageControllerScript.KIND_BOARD_FLAT_HERO, "mine_hit",
|
||||
"同容双敌单·自亡", "棋盘兑付", 1, DamageControllerScript.TARGET_HERO, 1)
|
||||
var ticket2: Dictionary = h2.ctrl.open_ticket(DamageControllerScript.KIND_BOARD_FLAT_HERO, "mine_hit", "同容双敌单·自亡",
|
||||
{"channel": "棋盘兑付", "base_value": 1, "target_rule": DamageControllerScript.TARGET_HERO, "ri": 1})
|
||||
ticket2["source_unit"] = a
|
||||
var t2: int = h2.ctrl.submit(ticket2)
|
||||
h2.units.unit_died.emit(a)
|
||||
@@ -265,8 +266,9 @@ func _test_target_id_payload(db: ConfigDb) -> void:
|
||||
var target = h.units.default_target()
|
||||
var expect_id := String(target.get("enemy_id", ""))
|
||||
Kit.check("前置:目标敌携非空 enemy_id", expect_id != "")
|
||||
var ticket: Dictionary = h.ctrl.open_ticket(DamageControllerScript.KIND_HERO_ATTACK, "hero_attack",
|
||||
"T6目标id", "战斗段", int(db.hero.atk), DamageControllerScript.TARGET_FRONT_ALIVE, 1)
|
||||
var ticket: Dictionary = h.ctrl.open_ticket(DamageControllerScript.KIND_HERO_ATTACK, "hero_attack", "T6目标id",
|
||||
{"channel": "战斗段", "base_value": int(db.hero.atk),
|
||||
"target_rule": DamageControllerScript.TARGET_FRONT_ALIVE, "ri": 1})
|
||||
var fx_payload: Dictionary = ticket.context.get("fx_attack_payload", {})
|
||||
Kit.check("attack_commit fx 载荷携 target_id〔wd12〕",
|
||||
String(fx_payload.get("target_id", "")) == expect_id and String(fx_payload.get("target", "")) != "")
|
||||
@@ -286,13 +288,14 @@ func _test_requires_gate_and_zero(db) -> void:
|
||||
# 先清场(flush_submit 同步开单——清图批专用通道的契约面同时被覆盖)
|
||||
var front_hp: int = int(h.units.query_alive("enemy")[0].max_hp)
|
||||
var big: int = front_hp * 10
|
||||
var t_clear: int = h.ctrl.flush_submit(h.ctrl.open_ticket(DamageControllerScript.KIND_BOARD_BLAST, "clear_reward",
|
||||
"清场群伤", "棋盘兑付", big, DamageControllerScript.TARGET_ALL_ALIVE, 1))
|
||||
var t_clear: int = h.ctrl.flush_submit(h.ctrl.open_ticket(DamageControllerScript.KIND_BOARD_BLAST, "clear_reward", "清场群伤",
|
||||
{"channel": "棋盘兑付", "base_value": big, "target_rule": DamageControllerScript.TARGET_ALL_ALIVE, "ri": 1}))
|
||||
Kit.check("flush_submit 同步开单即结(清图批契约)", h.ctrl.outcome(t_clear) == "redeemed" and h.units.query_alive("enemy").is_empty())
|
||||
var t_zero: int = h.ctrl.submit(h.ctrl.open_ticket(DamageControllerScript.KIND_BOARD_BLAST, "clear_reward",
|
||||
"空场群伤", "棋盘兑付", floor_v, DamageControllerScript.TARGET_ALL_ALIVE, 1))
|
||||
var gated_ticket: Dictionary = h.ctrl.open_ticket(DamageControllerScript.KIND_HERO_ATTACK, "hero_attack",
|
||||
"前置门攻击", "战斗段", int(h.db.hero.atk), DamageControllerScript.TARGET_FRONT_ALIVE, 1)
|
||||
var t_zero: int = h.ctrl.submit(h.ctrl.open_ticket(DamageControllerScript.KIND_BOARD_BLAST, "clear_reward", "空场群伤",
|
||||
{"channel": "棋盘兑付", "base_value": floor_v, "target_rule": DamageControllerScript.TARGET_ALL_ALIVE, "ri": 1}))
|
||||
var gated_ticket: Dictionary = h.ctrl.open_ticket(DamageControllerScript.KIND_HERO_ATTACK, "hero_attack", "前置门攻击",
|
||||
{"channel": "战斗段", "base_value": int(h.db.hero.atk),
|
||||
"target_rule": DamageControllerScript.TARGET_FRONT_ALIVE, "ri": 1})
|
||||
gated_ticket["requires"] = t_zero
|
||||
var t_gated: int = h.ctrl.submit(gated_ticket)
|
||||
h.ctrl.flush()
|
||||
@@ -308,10 +311,10 @@ func _test_hero_death_halt(db) -> void:
|
||||
if not h.spawn_ok:
|
||||
return
|
||||
var max_hp: int = int(h.db.hero.max_hp)
|
||||
var t_kill: int = h.ctrl.submit(h.ctrl.open_ticket(DamageControllerScript.KIND_BOARD_FLAT_HERO, "mine_hit",
|
||||
"致死反噬", "棋盘兑付", max_hp, DamageControllerScript.TARGET_HERO, 1))
|
||||
var t_after: int = h.ctrl.submit(h.ctrl.open_ticket(DamageControllerScript.KIND_BOARD_FLAT_HERO, "mine_hit",
|
||||
"余单", "棋盘兑付", 1, DamageControllerScript.TARGET_HERO, 2))
|
||||
var t_kill: int = h.ctrl.submit(h.ctrl.open_ticket(DamageControllerScript.KIND_BOARD_FLAT_HERO, "mine_hit", "致死反噬",
|
||||
{"channel": "棋盘兑付", "base_value": max_hp, "target_rule": DamageControllerScript.TARGET_HERO, "ri": 1}))
|
||||
var t_after: int = h.ctrl.submit(h.ctrl.open_ticket(DamageControllerScript.KIND_BOARD_FLAT_HERO, "mine_hit", "余单",
|
||||
{"channel": "棋盘兑付", "base_value": 1, "target_rule": DamageControllerScript.TARGET_HERO, "ri": 2}))
|
||||
h.ctrl.flush()
|
||||
Kit.check("致死单 redeemed 且主角 hp 归零", h.ctrl.outcome(t_kill) == "redeemed" and int(h.units.hero_unit().hp) == 0)
|
||||
Kit.check("主角倒下后余单 voided(flush 终止)", h.ctrl.outcome(t_after) == "voided")
|
||||
|
||||
@@ -71,8 +71,8 @@ func _test_rng_tag_closure(db) -> void:
|
||||
|
||||
func _test_ticket_nine_columns() -> void:
|
||||
var ctrl = _bare_controller()
|
||||
var t: Dictionary = ctrl.open_ticket(DamageControllerScript.KIND_BOARD_FLAT_HERO, "mine_hit",
|
||||
"契约探针", "棋盘兑付", 1, DamageControllerScript.TARGET_HERO, 0)
|
||||
var t: Dictionary = ctrl.open_ticket(DamageControllerScript.KIND_BOARD_FLAT_HERO, "mine_hit", "契约探针",
|
||||
{"channel": "棋盘兑付", "base_value": 1, "target_rule": DamageControllerScript.TARGET_HERO, "ri": 0})
|
||||
var columns := ["kind", "source_class", "origin_cell", "round_index", "display",
|
||||
"channel", "attack_type", "base_value", "target_rule", "rider", "highlight", "context",
|
||||
"requires", "source_unit"]
|
||||
|
||||
Reference in new issue
Block a user