feat(sample-v31): E 格高墙立面(用户方案:地面格南邻墙→南部 55% 承接墙面展示,基色采样墙顶瓦片同源;连续墙体内侧不出立面);机检 17/17 全绿

This commit is contained in:
DKChan committed 2026-09-29 19:03:14 +08:00
1 parent 51de050b7f
commit 85f1caed50
2 files changed
+71 -3

No files matched your search

+35 -3
View File
@@ -59,8 +59,8 @@ def asset_root(*parts):
BOARD_DIR = ("game", "assets", "art", "board")
CHAR_DIR = ("game", "assets", "art", "character")
ICON_DIR = ("game", "assets", "ui", "icons")
OUT_PNG = os.path.join(ROOT, "artwork", "mockups", "sample-batch-v3-draft-2026-09-29.png")
OUT_REPORT = os.path.join(ROOT, "design", "research", "sample-v3-draft-机检报告-2026-09-29.md")
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-v31-draft-机检报告-2026-09-29.md")
T_FONT = asset_root("artwork", "ui-reuse-2026-09-23",
"4-字体", "fusion-pixel-12px(OFL)", "fusion-pixel-12px-proportional-latin.ttf")
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))
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=""):
"""按方案甲查表拼装渲染样张板。返回 (img, placement, glow_layer)。"""
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))
placement[(x, y)] = ("floor_%d" % (vi + 1), False)
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 投影档(立体承载)
glow = Image.new("RGBA", (wpx, hpx), (0, 0, 0, 0))
return board, placement, glow
@@ -1042,7 +1074,7 @@ def main():
ok = run_checks(board, placement, records, band, gmap, 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)
# 三区 mockup