diff --git a/.gitea/workflows/ci.yml b/.gitea/workflows/ci.yml index 5f245aa1..d166db11 100644 --- a/.gitea/workflows/ci.yml +++ b/.gitea/workflows/ci.yml @@ -48,6 +48,14 @@ jobs: rm -rf game/.godot/imported /usr/local/bin/godot --headless --path game --editor --quit + - name: 棋盘黄金图自愈补采(full 批——缺基准时 runner 会话渲染→提交回 master→下一轮拉取生效) + if: steps.route.outputs.mode == 'full' + env: + GODOT_BIN: /usr/local/bin/godot + run: | + cd "$GITHUB_WORKSPACE/repo" + bash tools/ci/golden_selfheal.sh + - name: 跑闸 if: steps.route.outputs.mode != 'skip' env: diff --git a/game/presentation/views/board_view.gd b/game/presentation/views/board_view.gd index 9ad8f01c..7db729d0 100644 --- a/game/presentation/views/board_view.gd +++ b/game/presentation/views/board_view.gd @@ -582,7 +582,7 @@ func _paint_cell_ink(c: Vector2i, u: Node2D, revealed: bool, seal: bool) -> Colo # 封印受理即揭示:身份字形按板事实当场可见(cell_identity 单点——不用等轮末判定; # 数字遮蔽不适用——遮蔽打脸受理即揭示)。 bg = COL_FLOOR - var ident: Dictionary = _board.cell_identity(c) + var ident := _board.cell_identity(c) # 推断形态(规约§76 合法面)——参数化注解拒收函数返回的裸 Dictionary if String(ident.get("kind", "")) == "mine": glyph = "危" digit_col = UiKit.RED_MINE diff --git a/game/tests/unit/presentation/pacing_queue_test.gd b/game/tests/unit/presentation/pacing_queue_test.gd index 30f7e13e..def26380 100644 --- a/game/tests/unit/presentation/pacing_queue_test.gd +++ b/game/tests/unit/presentation/pacing_queue_test.gd @@ -188,6 +188,7 @@ class FakeBoardZone extends BoardZoneView: func _assert_fx_chain(main: Node, rows_seen: Array) -> void: + # 判据出处: design/gdd/systems/表现与支撑/HUD框架.md:272 (结算逐行实时滚出——行→FX 排播链计数逐位一致) var rp = RowPacerScript.new() var fstage := FakeStage.new(null, root.get_node("/root/ConfigDB").presentation.battle_layout) var ffx := FakeFx.new() diff --git a/tools/ci/golden_selfheal.sh b/tools/ci/golden_selfheal.sh new file mode 100644 index 00000000..7d7a0193 --- /dev/null +++ b/tools/ci/golden_selfheal.sh @@ -0,0 +1,43 @@ +#!/usr/bin/env bash +# 棋盘黄金图 CI 自愈补采(2026-11-08 用户裁:补采自动化——渲染能力在 runner 会话里,人手不做二进制搬运)。 +# 背景:golden 基线按平台分目录(render_gate.sh:37 gate_platform_id),改版批只能重制本平台侧; +# 他平台基线缺失=渲染闸红(基准未建),而补采必须在他平台真实渲染——只有 runner 会话做得到。 +# 本件挂 CI full 批(ci.yml 导入步之后、跑闸步之前):缺棋盘三件基线时跑 golden_baseline_refresh +# 棋盘模式,产物提交回 master 并推送,下一轮 full 批拉取后渲染闸绿。 +# 护栏: +# - 只认 CI 跑批环境(GITHUB_WORKSPACE 必在)——本地误跑立即拒(防人手把本平台基线提交出去)。 +# - 三件基线齐盘即零动作退出(幂等——不会每轮提交,无循环)。 +# - 只 add 三件 PNG;刷新红/落盘缺/提交败/push 败一律置红不静默,下一轮 full 批自动重试。 +set -u +: "${GITHUB_WORKSPACE:?本件只属 CI 跑批环境(GITHUB_WORKSPACE 必在)——人手补采走 tools/golden_baseline_refresh.sh}" +REPO="$(cd "$(dirname "$0")/../.." && pwd)" +cd "$REPO" +. "$REPO/tools/gate_platform.sh" +PLAT="$(gate_platform_id)" +GOLDEN_DIR="game/tests/golden/$PLAT" +BOARD_FILES="board_L1_dungeon.png board_L2_underdark.png board_L3_deep_underdark.png" + +_miss=0 +for b in $BOARD_FILES; do + [ -s "$GOLDEN_DIR/$b" ] || { _miss=1; echo "[selfheal] 缺基准: $GOLDEN_DIR/$b"; } +done +if [ "$_miss" -eq 0 ]; then + echo "[selfheal] $PLAT 棋盘三件基线在库——零动作(幂等护栏)" + exit 0 +fi + +GODOT_BIN="${GODOT_BIN:?GODOT_BIN 必注(runner 自举件安装位)}" \ + bash "$REPO/tools/golden_baseline_refresh.sh" game || { + echo "[selfheal] FAIL — 补采刷新脚本红(探针自检/裁剪失败见上)"; exit 1 +} +for b in $BOARD_FILES; do + [ -s "$GOLDEN_DIR/$b" ] || { echo "[selfheal] FAIL — 刷新后仍缺: $b"; exit 1; } +done +for b in $BOARD_FILES; do + git add "$GOLDEN_DIR/$b" +done +git -c user.name="gitea-actions" -c user.email="actions@noreply.git.kuaimeo.com" \ + commit -m "黄金图自愈补采($PLAT·棋盘三件): 渲染闸缺基准——golden_baseline_refresh棋盘模式在runner会话渲染产出,本提交由CI采集步自动落库,下一轮full批拉取后渲染闸绿;触发源提交见父提交" \ + || { echo "[selfheal] FAIL — git commit 失败(无差异或工作区异常)"; exit 1; } +git push origin HEAD:master || { echo "[selfheal] FAIL — push 失败(令牌权限/分支保护;修复前每轮 full 批会重试)"; exit 1; } +echo "[selfheal] 完成 — 基线已落库,下一轮 CI 拉取生效"