55 lines
2.6 KiB
GDScript
55 lines
2.6 KiB
GDScript
# VERTICAL SLICE - NOT FOR PRODUCTION
|
||
# Date: 2026-09-12(code-review 修复批——自 main.gd 拆出,规范 1.1/1.2 模拟编排独立成类)
|
||
# 调整板批量模拟控制器:逐次驱动 LevelAutoplay(与 headless 扫描同口径)+ 进度/报告 setter 注入面板。
|
||
# 职责边界:零核心写——表基线复位由组合根在移交前完成(_apply_hero_override(0,0)),
|
||
# 加成施加 = LevelAutoplay 内部 runner.set_hero_override 单路径;报告文案装配归 HudPresenter。
|
||
# 组合根只转发 simulate_requested 信号。await 依赖面板所在场景树(进度逐帧刷新)。
|
||
extends RefCounted
|
||
|
||
const SEED_BASE := 4200 # 模拟种子基(与历史实现同源——同种子可回放)
|
||
const LevelAutoplay := preload("res://smoke/level_autoplay.gd") # 与 headless 扫描同口径的自动策略(P3:preload 编译期路径校验)
|
||
|
||
var db
|
||
var panel # TunePanel setter 面:atk_pct/hp_pct/set_sim_running/set_sim_progress/set_sim_report
|
||
var _base_hp := 0 # 报告中的"基础 HP"口径注记值
|
||
|
||
|
||
func _init(db_ref, panel_ref, base_hp: int) -> void:
|
||
db = db_ref
|
||
panel = panel_ref
|
||
_base_hp = base_hp
|
||
|
||
|
||
func run(n: int) -> void:
|
||
# 共享日志会话(2026-09-12 用户要求:模拟运行与真人试玩同日志合规——操作/轮次/战斗/通关全量 JSONL;
|
||
# 一文件多局,run 行携带种子切分局次)
|
||
var logger = load("res://presentation/playtest_logger.gd").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 := {}
|
||
for i in range(n):
|
||
var st = LevelAutoplay.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)
|