Files
gplan-2/game/presentation/debug_session.gd
T
DKChan 6c2dbc37c1 docs: ADR 体系废除 + architecture.md 确立为架构唯一事实源(2026-10-15 用户令:决策记录归 git commit log,不另存决策文档)
- 删除 design/dev/architecture/adr-0001~0007 共 7 份文件(内容留 git 历史可查)
- architecture.md:删「ADR 审计」「ADR 立项清单」两节;清除全文 ADR-000X 注记、QQ 表/S 表 ADR 引用;未决表关闭已落定项(QQ-01/02/03),立项清单在途事项转登记 QQ-11~14;补 A1 生成姿态事实、autoload 四件清单、board_generator 性能姿态;文档状态立「事实源地位」条
- CLAUDE.md:恢复 RNG 单点硬性红线(去 ADR-0007 引用);新增「架构事实唯一源」红线;规范导航架构行标注唯一事实源
- doc-conventions:§5 增「架构事实唯一源」行;§11 活文档清单补架构文档
- registry:architecture.yaml 删 18 处 adr 字段、autoload_set 补 SaveManager/MetaProgression、board_rending 更新为 Node2D 已落地事实;entities.yaml 12 处引用清除
- game/ 代码注释约 60 处清 ADR-000X 引用(事实与日期保留);豁免标记 ADR-0007-exempt → rng-seed-exempt(main.gd/static_scan.sh/architecture.md/06/iter27 五处同步)
- GDD/qa 实现报告/research 卡片/roadmap/tests README 引用全清;死链校验 1206 链接 0 死链、gdd_lint 0 不通过
- 代码中 adr/adr5 等为 adventure_runner 既有局部变量名(非 ADR 引用),未动
2026-10-15 23:52:30 +08:00

89 lines
4.0 KiB
GDScript
Raw 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.
# VERTICAL SLICE - NOT FOR PRODUCTION
# Date: 2026-09-13(自 main.gd 拆出——规范 1.1 审视线 / 调试语义单一实现纪律)
# 调试模式编排控制器:单场遭遇(第 1/2 层)与连续两层(HP 关内延续)的模式状态机与战斗生命周期。
# 职责边界:层序/携带 HP + 战斗结算 生命周期编排(创建 / begin_battle)。
# 层间延续 = HP 关内延续(库存与共享 地图战斗资源 已下线)。
# 授权边界:与 tune_sim_controller 同款——控制器承接模式编排,
# 组合根仍持有全部信号接线(battle_created 先于 begin_battle 发出,接线唯一归组合根)
# 与终局 UI 决策;玩家意图写调用(settle_batch / 刷新)不经本类。
# 加成生效值经注入 Callable 供给(组合根从面板百分比现算)→ encounter
# 显式传入战斗——零表写。
extends RefCounted
signal battle_created(settlement, level: int, carry_hp: int) # begin_battle 前——组合根完成信号接线
signal battle_ready(settlement, level: int, carry_hp: int) # begin_battle 完成后——组合根 rebuild 棋盘 + 刷新呈现
var db
var rng # /root/RngService(组合根注入)
var _hero_override: Callable # 组合根生效值供给(→ {atk, max_hp};E4:经 encounter 传参,零表写)
var _seed_value: Callable # 组合根种子读取(LineEdit)
var _level_mode := false
var _level_battles: Array[int] = []
var _level_idx := 0
var _carry_hp := 0
var settlement = null # 当前战斗编排器(组合根在 battle_created 接线、battle_ready 接手)
func _init(db_ref, rng_ref, hero_override: Callable, seed_value: Callable) -> void:
db = db_ref
rng = rng_ref
_hero_override = hero_override
_seed_value = seed_value
# 单场遭遇原语(2026-09-13 用户裁决:单场用户入口已删——本方法仅 ui_probe 单场段使用;
# 无延续、standalone 终局语义保留供探针战斗收尾)
func start_single(level: int) -> bool:
_level_mode = false
return _start_battle(level, -1)
# 连续两层(调试入口——HP 关内延续;首层满血开局)
func start_debug_levels() -> bool:
_level_mode = true
_level_battles = [1, 2]
_level_idx = 0
_carry_hp = 0
rng.new_adventure(_seed_value.call())
return _start_battle(_level_battles[0], -1)
# 层间"进入下一层"(组合根过渡覆盖层确认后调用)
func next_layer() -> bool:
return _start_battle(_level_battles[_level_idx], _carry_hp)
# 终局处置(组合根 battle_finished 处理器调用)→ 决策载荷:
# {outcome: "next_layer"|"level_end"|"standalone_end", layer, carry_hp}
func on_battle_finished(payload: Dictionary) -> Dictionary:
var result: String = String(payload.get("result", ""))
if result == "victory" and _level_mode and _level_idx < _level_battles.size() - 1:
_carry_hp = maxi(1, int(payload.get("hero_hp", 0))) # despawn 前捕获值
_level_idx += 1
return {"outcome": "next_layer", "layer": _level_idx, "carry_hp": _carry_hp}
var is_level_end := result == "victory" and _level_mode
return {"outcome": "level_end" if is_level_end else "standalone_end",
"layer": _level_idx, "carry_hp": _carry_hp}
# 会话复位(组合根终局出口"返回开始界面"调用)
func reset() -> void:
_level_mode = false
settlement = null
func _start_battle(level: int, carry_hp: int) -> bool:
if not _level_mode or _level_idx == 0:
rng.new_adventure(_seed_value.call())
var ov: Dictionary[Variant, Variant] = _hero_override.call() # E4:生效值经 encounter 传入——零表写
settlement = BattleOrchestrator.new(db, rng)
battle_created.emit(settlement, level, carry_hp)
var hp: int = carry_hp if carry_hp > 0 else int(ov.max_hp)
if not settlement.begin_battle({"level_index": level, "node_depth": 0, "hero_hp": hp,
"hero_atk": int(ov.atk), "hero_max_hp": int(ov.max_hp)}):
push_error("[DebugSession] 战斗启动失败(level %d)" % level)
return false
battle_ready.emit(settlement, level, carry_hp)
return true