feat(sample-v31): E 格高墙立面(用户方案:地面格南邻墙→南部 55% 承接墙面展示,基色采样墙顶瓦片同源;连续墙体内侧不出立面);机检 17/17 全绿
This commit is contained in:
1 parent
51de050b7f
commit
85f1caed50
2 files changed
+71
-3
No files matched your search
@@ -0,0 +1,36 @@
|
|||||||
|
# 样张 v3 方向稿机检报告(2026-09-29,art-bible v3.0——方向稿阶段,机检为参考;冻结闸=目检后机检批)
|
||||||
|
|
||||||
|
生成:`python tools/render_sample_sheet_v3.py`;v3.0 口径:格底分档(世界底层档)/亮墨直画/色牌后备/物件级装饰/B 区舞台;断言阈值随冻结批校准。
|
||||||
|
|
||||||
|
## v1 否决原因 → 断言映射
|
||||||
|
|
||||||
|
| 否决原因(2026-09-28 用户) | 断言承载 |
|
||||||
|
|---|---|
|
||||||
|
| ①显示太丑(总纲) | A6 观感密度(整板明度 std ≥50.9=v1 实测 44.31×1.15)+既有装饰变体 ≥2 种 |
|
||||||
|
| ②封印色冲突 | 封印黑 #000000(9b6fcf6 已落,A1a 对表自动覆盖) |
|
||||||
|
| ③立体感不够 | A3 阈值 40→55 + F6 顶面/立面双明度带 Δ≥18 + F7 整板悬崖 DEPTH_PX 同源 |
|
||||||
|
| ④微光格只留微光 | F5c 微光段零 draw_inlay(d1dea82 已落) |
|
||||||
|
|
||||||
|
## 断言明细
|
||||||
|
|
||||||
|
| 断言 | 判据 | 结果 | 明细 |
|
||||||
|
|---|---|---|---|
|
||||||
|
| F1 | 方案甲 8 邻拼装(词表查表,禁整块) | PASS | 错位 0 处;用件 15 种 ['center', 'center_crack', 'center_speckle', 'end_n', 'end_s', 'end_w', 'hrun', 'in_nw', 'in_sw', 'n', 'nw', 's', 'sw', 'vrun', 'w'] |
|
||||||
|
| F2 | 旗仅出现于未开格 | PASS | 旗位 (1, 2) 格态=W |
|
||||||
|
| F3 | 小人脚锚=自底边 25% 线(两态) | PASS | 脚 y=[213.75, 258.75] 期望=[213.75, 258.75] |
|
||||||
|
| F4 | 数字 0 格无字形(0=纯安全格裸地面) | PASS | 0 态格 38 个(示例 (4,4));数字表含 0 键=False |
|
||||||
|
| F5a | 接触带微光⊆英雄格周界(空间侧,不进墙格) | PASS | 微光 bbox=(86, 176, 119, 230) 英雄格=(90, 180, 135, 225) |
|
||||||
|
| F5b | 类型微光禁整格染色(中心 50% 区零染色像素) | PASS | 五格中心区全净 |
|
||||||
|
| F5c | 微光格零附加图形(微光段无角嵌调用——角嵌退役,微光只留微光) | PASS | 微光段无角嵌调用 |
|
||||||
|
| A1a | 色板对表圣经 §4.1 冻结值 | PASS | {'INK': '#33261B', '青墨': '#132E36', '赭墨': '#3C250C', '锈墨': '#4A1E14', 'PLATE': '#F5EAD3', '封印黑': '#000000', '危险红': '#A8321F', '奖励金': '#F0A828'} |
|
||||||
|
| A1b | 禁入带 HSV300°-345° 零命中 | PASS | 命中 0 像素(抽样) |
|
||||||
|
| A2 | 拼缝周界闭合(墙侧 2px 墨线 <70) | PASS | 全部墙地边界墨线在位 |
|
||||||
|
| A3a | v3 亮墨×格底 WCAG≥4.5:1(直画可行性硬指标) + 色牌后备组 ≥4.5:1 | PASS | 亮墨[('冷亮青白', 6.3), ('暖白', 6.0), ('金亮', 6.0)] 格底L=0.087;后备[('青墨×牌', 12.0), ('赭墨×牌', 12.0), ('锈墨×牌', 11.8)] |
|
||||||
|
| A3b | 图底分离读数(候选 Δ≥30——v2 阈值 55 与格底分档带数学冲突,校准归冻结批) | PASS | 墙顶 113 vs 地面 79,Δ=33(v2 阈值 55 系地板 L0.036 时代校定) |
|
||||||
|
| F6 | 墙格顶面/立面双明度带(南向临地墙格 Δ≥18,体积感机器代理) | PASS | 临地墙格 14 个;最小 Δ 76.3;均 Δ 105.0(v1 实测均 71.6) |
|
||||||
|
| F7 | 整板悬崖 DEPTH_PX 与 game 渲染常量同源(board_view.gd 解析) | PASS | DEPTH_PX=8.0(已解析);悬崖带均亮 69(<100);扩展 +8px |
|
||||||
|
| A6 | 观感密度:明度梯度均值 ≥4.70(v1 实测 4.09 上调 15%——高频细节能量) | PASS | 梯度均值 5.94(低频双峰由 A3 承载) |
|
||||||
|
| A5 | 画布四缘 2px 净空(零溢出) | PASS | 缘带内容像素 0 |
|
||||||
|
| A4 | 混排相融(游戏在库资产可载+UiKit 语义色对表;尺寸基线=换代后实态,校准归冻结批) | PASS | 小人源 (32, 32)(裁透明留白后 (19, 20))/立绘 (46, 48)/状态图标原件;INK/封印黑/奖励金 == ui_kit.gd |
|
||||||
|
|
||||||
|
结论:**全绿**(17/17 PASS)。v3 方向稿机检=可行性参考(A3 亮墨对比为硬指标);冻结 = 用户目检方向稿后机检批(v3.0 闸形:目检先行→机检冻结)。
|
||||||
@@ -59,8 +59,8 @@ def asset_root(*parts):
|
|||||||
BOARD_DIR = ("game", "assets", "art", "board")
|
BOARD_DIR = ("game", "assets", "art", "board")
|
||||||
CHAR_DIR = ("game", "assets", "art", "character")
|
CHAR_DIR = ("game", "assets", "art", "character")
|
||||||
ICON_DIR = ("game", "assets", "ui", "icons")
|
ICON_DIR = ("game", "assets", "ui", "icons")
|
||||||
OUT_PNG = os.path.join(ROOT, "artwork", "mockups", "sample-batch-v3-draft-2026-09-29.png")
|
OUT_PNG = os.path.join(ROOT, "artwork", "mockups", "sample-batch-v31-draft-2026-09-29.png")
|
||||||
OUT_REPORT = os.path.join(ROOT, "design", "research", "sample-v3-draft-机检报告-2026-09-29.md")
|
OUT_REPORT = os.path.join(ROOT, "design", "research", "sample-v31-draft-机检报告-2026-09-29.md")
|
||||||
T_FONT = asset_root("artwork", "ui-reuse-2026-09-23",
|
T_FONT = asset_root("artwork", "ui-reuse-2026-09-23",
|
||||||
"4-字体", "fusion-pixel-12px(OFL)", "fusion-pixel-12px-proportional-latin.ttf")
|
"4-字体", "fusion-pixel-12px(OFL)", "fusion-pixel-12px-proportional-latin.ttf")
|
||||||
ZH_FONT = r"C:\Windows\Fonts\msyh.ttc"
|
ZH_FONT = r"C:\Windows\Fonts\msyh.ttc"
|
||||||
@@ -560,6 +560,34 @@ def draw_hero_on_board(board, ox, oy, cell, hx, hy, records, digit=None):
|
|||||||
records.append(("hero", hx, hy, fx, fy, digit))
|
records.append(("hero", hx, hy, fx, fy, digit))
|
||||||
|
|
||||||
|
|
||||||
|
def draw_facade(board, x0, y0, cell):
|
||||||
|
"""v3.1 高墙立面(用户方案:地面格南邻墙 → 南部承接墙面展示,E 格)。
|
||||||
|
南 45% 画墙身:横层理暗砖+口沿高光顶线(与墙顶分界);程序化示意,终稿=E 瓦片素材(词表扩展)。"""
|
||||||
|
d = ImageDraw.Draw(board)
|
||||||
|
fy0 = y0 + int(cell * 0.45) # 立面占南 55%(高墙感档,目检候选)
|
||||||
|
# 立面基色=墙顶瓦片实测色(E 与南侧墙顶须读作同一堵墙——采样 center 瓦片顶面区)
|
||||||
|
top = WALLS["center"].convert("RGB").crop((4, 4, 28, 14))
|
||||||
|
px = list(top.getdata())
|
||||||
|
wall_top_rgb = tuple(sum(c[i] for c in px) // len(px) for i in range(3))
|
||||||
|
face = _gd_darkened(wall_top_rgb, 0.16) # 北立面=受光面,略暗于顶面 16% 分层
|
||||||
|
d.rectangle([x0, fy0, x0 + cell, y0 + cell], fill=face)
|
||||||
|
for i in range(3): # 横层理(横条纹,禁竖条纹栅栏感——§3.2 高墙条)
|
||||||
|
ly = fy0 + int((i + 1) * (cell - int(cell * 0.45)) / 4.0)
|
||||||
|
d.line([(x0 + 2, ly), (x0 + cell - 2, ly)], fill=_gd_darkened(face, 0.30), width=1)
|
||||||
|
for i in range(2): # 层理错缝竖短线(砖缝)
|
||||||
|
for j in range(3):
|
||||||
|
vx = x0 + 6 + j * 14 + (i * 7)
|
||||||
|
vy0 = fy0 + 5 + i * 11
|
||||||
|
d.line([(vx, vy0), (vx, vy0 + 7)], fill=_gd_darkened(face, 0.34), width=1)
|
||||||
|
d.rectangle([x0, fy0, x0 + cell, fy0 + 1], fill=_gd_darkened(wall_top_rgb, 0.35)) # 口沿(地面与立面交界=檐口阴线)
|
||||||
|
d.rectangle([x0, y0 + cell - 1, x0 + cell, y0 + cell], fill=_gd_darkened(face, 0.30)) # 底缘收头 1px(接墙顶北缘亮棱)
|
||||||
|
|
||||||
|
|
||||||
|
def is_facade_cell(gmap, x, y):
|
||||||
|
"""E 格判定:本格是地面,且南邻(y+1)是墙。连续墙体内部不出立面(立面只露在地格侧)。"""
|
||||||
|
return (0 <= y + 1 < gmap.h) and gmap.grid[y][x] != "W" and gmap.grid[y + 1][x] == "W"
|
||||||
|
|
||||||
|
|
||||||
def render_board(gmap, cell, overlays=None, scale_note=""):
|
def render_board(gmap, cell, overlays=None, scale_note=""):
|
||||||
"""按方案甲查表拼装渲染样张板。返回 (img, placement, glow_layer)。"""
|
"""按方案甲查表拼装渲染样张板。返回 (img, placement, glow_layer)。"""
|
||||||
wpx, hpx = gmap.w * cell, gmap.h * cell
|
wpx, hpx = gmap.w * cell, gmap.h * cell
|
||||||
@@ -585,6 +613,10 @@ def render_board(gmap, cell, overlays=None, scale_note=""):
|
|||||||
board.paste(FLOORS[vi].resize((cell, cell), Image.NEAREST), (x * cell, y * cell))
|
board.paste(FLOORS[vi].resize((cell, cell), Image.NEAREST), (x * cell, y * cell))
|
||||||
placement[(x, y)] = ("floor_%d" % (vi + 1), False)
|
placement[(x, y)] = ("floor_%d" % (vi + 1), False)
|
||||||
if overlays:
|
if overlays:
|
||||||
|
for y in range(gmap.h): # v3.1 E 格立面(高墙双格呈现——结构件,先于投影)
|
||||||
|
for x in range(gmap.w):
|
||||||
|
if is_facade_cell(gmap, x, y):
|
||||||
|
draw_facade(board, x * cell, y * cell, cell)
|
||||||
board = apply_d_projection(board, gmap, cell) # D 投影档(立体承载)
|
board = apply_d_projection(board, gmap, cell) # D 投影档(立体承载)
|
||||||
glow = Image.new("RGBA", (wpx, hpx), (0, 0, 0, 0))
|
glow = Image.new("RGBA", (wpx, hpx), (0, 0, 0, 0))
|
||||||
return board, placement, glow
|
return board, placement, glow
|
||||||
@@ -1042,7 +1074,7 @@ def main():
|
|||||||
ok = run_checks(board, placement, records, band, gmap, canvas)
|
ok = run_checks(board, placement, records, band, gmap, canvas)
|
||||||
|
|
||||||
d = ImageDraw.Draw(canvas)
|
d = ImageDraw.Draw(canvas)
|
||||||
d.text((20, 14), "战斗一屏样张方向稿 v3-draft(2026-09-29,art-bible v3.0)——格底明度分档+亮墨直画+色牌后备+B区地窟看台;机检 %s(方向稿参考,冻结归目检后机检批);巢穴纹=程序占位" %
|
d.text((20, 14), "战斗一屏样张方向稿 v3-draft(2026-09-29,art-bible v3.0)——格底分档+亮墨直画+色牌后备+B区看台+E格高墙立面(v3.1);机检 %s(方向稿参考,冻结归目检后机检批);巢穴纹=程序占位" %
|
||||||
("全绿" if ok else "有 FAIL"), col=(232, 222, 200), font=F_TITLE)
|
("全绿" if ok else "有 FAIL"), col=(232, 222, 200), font=F_TITLE)
|
||||||
|
|
||||||
# 三区 mockup
|
# 三区 mockup
|
||||||
|
|||||||
Reference in new issue
Block a user