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
@@ -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
|
||||
|
||||
Reference in new issue
Block a user