Files
gplan-2/game/presentation/tune_sim_controller.gd
T
DKChan 2dd3ec5640 merge(master): S9 类型闸修复批与两条工程条目出账 并入 iter37(收口前最后一次并源)
三处冲突全部按「取我方结构+确认对方注解已落新址」处置,零丢弃对方改动:
- main.gd:四解析函数体已由卡② r1-2 搬入 board_resolvers.gd,master 给 _identity_lookup 补的 -> Variant 在新件 identity_lookup:28 同形在位;build_adventure_params 的 SaveManagerCore/MetaProgressionCore 注解经自动合并落住(main.gd:367)
- views/battle_stage_view.gd:卡① d12 已改 (target_id: String, display_name: String) -> Variant,master 对旧一参形态的注解属同址更新,取我方
- views/board_view.gd:查表族/明度归一族已由卡③ r2-1 搬入 tile_palette.gd,master 的 lumas_out: Variant 注解在 tile_palette.gd:134 同形在位
待办清单.md:我方 P0 条目与 master 删两条已完成工程条目自动合并(64 条,S9/S13 条目出账)

合并后复核:13 个触及脚本 --check-only 零 Parse Error;master 修好的 S9 类型闸 PASS(其 26 处补注解零丢失、本批九新件零命中);gdstyle 216/216 基线内、新违规 0、恶化 0
2026-10-25 18:59:27 +08:00

71 lines
3.2 KiB
GDScript

## VERTICAL SLICE - NOT FOR PRODUCTION
## 调整板批量模拟控制器:逐次驱动关卡自动策略(与 headless 扫描同口径),进度/报告经面板 setter 注入。
## 零核心写——表基线复位由组合根在移交前完成,加成施加只走自动策略内部 runner.set_hero_override 单路径。
## presentation 不 preload smoke:驱动实例由调用方注入(须供与 level_autoplay 同款 run_level 签名),缺省 null=运行时 load 兜底。
extends RefCounted
const SEED_BASE := 4200 # 模拟种子基(与历史实现同源——同种子可回放)
const PlaytestLogger := preload("res://presentation/playtest_logger.gd") # 试玩日志(同层依赖——运行时 load 收敛为 preload 常量)
var db
var panel # 调试浮窗 setter 面:atk_pct/hp_pct/set_sim_running/set_sim_progress/set_sim_report
var _base_hp := 0 # 报告中的"基础 HP"口径注记值
var _driver = null # 关卡自动策略驱动(调用方注入;null = 旧行为运行时 load 兜底)
var _running := false # 运行态(run 全程 true——组合根互查守卫用,与面板置灰解耦)
func _init(db_ref, panel_ref, base_hp: int, driver = null) -> void:
db = db_ref
panel = panel_ref
_base_hp = base_hp
_driver = driver
# 驱动解析:注入优先;缺省回退运行时 load(旧行为——编译期反向依赖已解除,运行时口径与拆分前逐位一致)
func _autoplay() -> Variant:
if _driver != null:
return _driver
return load("res://sim/level_autoplay.gd") # 与 headless 扫描同口径的自动策略(P3 兜底路径)
# 运行态查询出口(组合根互查守卫:模拟在跑期禁开调试对局/二次模拟)
func is_running() -> bool:
return _running
func run(n: int) -> void:
_running = true
# 共享日志会话(模拟运行与真人试玩同日志合规——操作/轮次/战斗/通关全量 JSONL;
# 一文件多局,run 行携带种子切分局次)
var logger = PlaytestLogger.new()
logger.ap_per_round = int(db.action_economy.ap_per_round)
var log_path: String = logger.start_session(SEED_BASE)
print("[tune_sim] 模拟日志: %s" % log_path)
panel.set_sim_running(true)
panel.set_sim_progress("模拟中:0/%d …" % n)
var wins := 0
var dmg_all: Array[float] = []
var hp_left_win: Array[float] = []
var hp_boss: Array[float] = []
var rounds_all: Array[int] = []
var death_nodes := {}
var autoplay = _autoplay()
for i in range(n):
var st = autoplay.run_level(db, SEED_BASE + i, 1, panel.atk_pct(), panel.hp_pct(), false, logger)
dmg_all.append(st.hero_dmg)
rounds_all.append(st.rounds)
if st.result == "victory":
wins += 1
hp_left_win.append(st.hp_left)
hp_boss.append(st.hp_at_boss)
elif st.result == "defeat":
var key := "%d.%s" % [st.defeat_node_index, st.defeat_node_type]
death_nodes[key] = int(death_nodes.get(key, 0)) + 1
panel.set_sim_progress("模拟中:%d/%d …" % [i + 1, n])
await panel.get_tree().process_frame
logger.close_session()
panel.set_sim_report(HudPresenter.tune_sim_report(n, panel.atk_pct(), panel.hp_pct(),
wins, dmg_all, hp_left_win, hp_boss, rounds_all, death_nodes, _base_hp))
panel.set_sim_running(false)
_running = false