合并(营地场景重排接线批): 落表——十层新矩形(围墙 (0,220,1280,200)、大门 240×138 底压墙底 (520,282)、告示板 (845,241)、其余六件按 2026-11-05 裁定)+围墙件换代(1280×164 补尖+墙脚入土, 12 色零新增)+视图 expand_mode 修(门扇 138 高矩形生效)+单测 5 条钉值断言+设计文档三件(camp-scene-prompts v1.9/art-bible v3.48/camp.md)+需求卡片成立(两轮独立复核 24 发现全处置)+实现报告/反哺点两件;待办条目随实现完成整条删除。凭据: 营地单测 exit=0、冒烟 PASS、ui_struct_probe PASS、色板零新增、path_check 0、流水线闸 PASS;冲突续提交路径钩子不触发——前置检查手动补跑、推送手动补做(本仓在册坑)
ci / gates (push) Failing after 8m2s

This commit is contained in:
DKChan committed 2026-11-07 18:52:44 +08:00
commit 5f233bac9a
11 files changed
+237 -35

No files matched your search

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

After

Width:  |  Height:  |  Size: 46 KiB

+1 -1
View File
@@ -6,7 +6,7 @@ extends Resource
@export var canvas := Vector2(1280, 800) # 终稿画布(工程档同幅面)
@export var hud_band_h := 48 # 顶栏禁区高度(命中不侵)
@export var gate_gap := Vector2i(520, 760) # 门洞缺口 x 范围(透出背景层小路,禁填死)
@export var wall_band := Rect2(0, 240, 1280, 70) # 围墙带包络(门柱顶 240—桩底 310;围墙贴图须落在其内)
@export var wall_band := Rect2(0, 220, 1280, 200) # 围墙带包络(显示矩形 (0,220,1280,200);围墙贴图须落在其内)
@export var layers: Array[CampSceneLayerSpec] = []
+17 -17
View File
@@ -13,64 +13,64 @@ hotspot_key = &""
[sub_resource type="Resource" id="2"]
script = ExtResource("2")
key = &"wall"
texture_rect = Rect2(0, 261, 1280, 49)
texture_rect = Rect2(0, 220, 1280, 200)
hotspot = Rect2(0, 0, 0, 0)
hotspot_key = &""
[sub_resource type="Resource" id="3"]
script = ExtResource("2")
key = &"board"
texture_rect = Rect2(845, 268, 130, 121)
hotspot = Rect2(845, 268, 130, 140)
texture_rect = Rect2(845, 241, 130, 121)
hotspot = Rect2(845, 241, 130, 140)
hotspot_key = &"board"
[sub_resource type="Resource" id="4"]
script = ExtResource("2")
key = &"gate"
texture_rect = Rect2(520, 250, 240, 211)
hotspot = Rect2(520, 250, 240, 220)
texture_rect = Rect2(520, 282, 240, 138)
hotspot = Rect2(520, 282, 240, 147)
hotspot_key = &"gate"
[sub_resource type="Resource" id="5"]
script = ExtResource("2")
key = &"dummy"
texture_rect = Rect2(340, 520, 120, 180)
hotspot = Rect2(340, 520, 120, 180)
texture_rect = Rect2(340, 474, 120, 180)
hotspot = Rect2(340, 474, 120, 180)
hotspot_key = &"dummy"
[sub_resource type="Resource" id="6"]
script = ExtResource("2")
key = &"forge"
texture_rect = Rect2(40, 467, 240, 193)
hotspot = Rect2(40, 420, 240, 240)
texture_rect = Rect2(40, 421, 240, 193)
hotspot = Rect2(40, 374, 240, 240)
hotspot_key = &"forge"
[sub_resource type="Resource" id="7"]
script = ExtResource("2")
key = &"tent"
texture_rect = Rect2(982, 520, 251, 170)
texture_rect = Rect2(982, 335, 251, 170)
hotspot = Rect2(0, 0, 0, 0)
hotspot_key = &""
[sub_resource type="Resource" id="8"]
script = ExtResource("2")
key = &"chest"
texture_rect = Rect2(1097, 700, 106, 90)
hotspot = Rect2(1085, 700, 130, 90)
texture_rect = Rect2(1097, 654, 106, 90)
hotspot = Rect2(1085, 654, 130, 90)
hotspot_key = &"chest"
[sub_resource type="Resource" id="9"]
script = ExtResource("2")
key = &"notebook"
texture_rect = Rect2(818, 704, 100, 66)
hotspot = Rect2(818, 690, 100, 80)
texture_rect = Rect2(870, 515, 100, 66)
hotspot = Rect2(870, 501, 100, 80)
hotspot_key = &"notebook"
[sub_resource type="Resource" id="10"]
script = ExtResource("2")
key = &"campfire"
texture_rect = Rect2(560, 571, 160, 149)
hotspot = Rect2(560, 640, 160, 80)
texture_rect = Rect2(560, 525, 160, 149)
hotspot = Rect2(560, 594, 160, 80)
hotspot_key = &"campfire"
[resource]
@@ -78,5 +78,5 @@ script = ExtResource("1")
canvas = Vector2(1280, 800)
hud_band_h = 48
gate_gap = Vector2i(520, 760)
wall_band = Rect2(0, 240, 1280, 70)
wall_band = Rect2(0, 220, 1280, 200)
layers = [SubResource("1"), SubResource("2"), SubResource("3"), SubResource("4"), SubResource("5"), SubResource("6"), SubResource("7"), SubResource("8"), SubResource("9"), SubResource("10")]
@@ -133,6 +133,7 @@ func _build_layer_node(spec: CampSceneLayerSpec) -> Control:
if tex != null:
var tr := TextureRect.new()
tr.texture = tex
tr.expand_mode = TextureRect.EXPAND_IGNORE_SIZE # 允许节点小于贴图原尺寸(门扇 240×211→矩形 138 高)
tr.stretch_mode = TextureRect.STRETCH_SCALE
node = tr
else:
@@ -2,7 +2,7 @@ extends SceneTree
# 营地场景布局数据件校验套件(V14——camp_scene_layout.tres 加载期 fail-fast 判据+七命中区几何红线机检)
# 覆盖:校验函数通过(键唯一/贴图在画布/命中成对/围墙带包络)· 七可点件键集 · 两两不相交 ·
# 不越画面 · 不侵顶栏禁区 · 篝火命中只取下半(关系谓词)· 门扇对齐门洞缺口 · 布告板挂围墙带。
# 断言全部为表内关系谓词——禁坐标字面量(数值单一事实源 = 数据行本表)。
# 断言以表内关系谓词为主;2026-11-07 重排追加十层钉值断言(钉值出处见各断言前 oracle 注)。
# 运行:godot --headless --path game --script res://tests/unit/presentation/camp_scene_layout_test.gd(expect 0)
const Kit := preload("res://tests/unit/test_kit.gd")
@@ -85,6 +85,32 @@ func _test_layout_hotspot_geometry() -> void:
and board.hotspot.position.y >= wall.texture_rect.position.y \
and board.hotspot.position.y <= wall.texture_rect.end.y
Kit.check("V14 布告板命中挂围墙带〔营地图批 V14〕", board_ok)
# oracle: design/art/camp-scene-prompts.md:250 (2026-11-07 围墙/门/板钉值,§5 第 12 条)
Kit.check("V14 围墙矩形钉值 (0,220,1280,200)〔营地图批 V14〕",
wall != null and wall.texture_rect == Rect2(0, 220, 1280, 200))
Kit.check("V14 门扇矩形钉值 (520,282,240,138)〔营地图批 V14〕",
gate != null and gate.texture_rect == Rect2(520, 282, 240, 138))
Kit.check("V14 告示板矩形钉值 (845,241,130,121)〔营地图批 V14〕",
board != null and board.texture_rect == Rect2(845, 241, 130, 121))
Kit.check("V14 围墙带钉值 (0,220,1280,200)〔营地图批 V14〕",
table.wall_band == Rect2(0, 220, 1280, 200))
# oracle: design/art/camp-scene-prompts.md:244 (其余七件落位:帐篷:242/笔记本:243/宝箱与其余上移:244)
var seven_ok := true
var seven_bad := ""
for spec in table.layers:
var want: Rect2
match String(spec.key):
"dummy": want = Rect2(340, 474, 120, 180)
"forge": want = Rect2(40, 421, 240, 193)
"tent": want = Rect2(982, 335, 251, 170)
"chest": want = Rect2(1097, 654, 106, 90)
"notebook": want = Rect2(870, 515, 100, 66)
"campfire": want = Rect2(560, 525, 160, 149)
_: continue
if spec.texture_rect != want:
seven_ok = false
seven_bad = "%s %s" % [spec.key, spec.texture_rect]
Kit.check("V14 六件落位钉值(违例 %s)〔营地图批 V14〕" % seven_bad, seven_ok)
# 层序结构:10 层且 bg/wall 压前两位(z0/z1——子节点序=表序先验)
var order_ok := table.layers.size() == 10 \
and String(table.layers[0].key) == "bg" and String(table.layers[1].key) == "wall"