补提交(布局几何单点化批·代码面+工具面+architecture行·跨会话遗留): battle_layout.tres 新表单行五字段(stage_h/info_panel_w/ap_bar_h/log_band_h_dig/log_band_h_settle)经 schema battle_layout_table.gd+域容器 config_domain_presentation.gd 收进 ConfigDb.presentation(ConfigDB 三容器→四容器,manifest 增 battle_layout 键,B区高度裁决 2026-10-30 用户裁=取代码标准 stage_h);views 五件构造签名增 layout 参(BattleStageView/HeroInfoPanelView/BoardZoneView/ApBarView/BattleLogView 常量高度改表值驱动)+ui_assembler 装配传 layout+probes 两件改址+main.gd 结算带注释去数值;tools/layout_config.py 新件+render_sample_sheet 两版读布局表现算(样张工具面);文档面: architecture.md ConfigDB 行换代(四容器成员 7/7/5/1、类变量 10)+HUD框架.md 三区表/装板不等式/调参表去数值化改指布局表+数据配置.md+interaction-patterns.md 明细带句去数值(battle.md 区表与待办清单登记面已随 1cdef6ba 在库);消费漏网 L1 就地补改九处(构造签名换型与 iter45 断点件收编的测试改址漏网,判据零变化): theme_projection_test:386/player_copy_sweep_test:44,98/adventure_feats_test:772/standee_fx_sweep_test:75/feat_vouchers_test:292 六处补 layout 实参,adventure_feats_test:791/level_shop_economy_test:1480/feat_vouchers_test:81 三处断点成员直读改经 a._bp_store(iter45卡②六成员搬移漏网,02 闸合回后首全量暴露);load_tables 超函数长键清偿(容器装配块抽 _assign_loaded 私有协函数——表行按域收进四容器+resolver 注入单一职责,与 _cross_validate 委托先例同型,S13 新增红修至基线口径内);窄验: 四件修复套件单跑全绿+gdstyle 基线外新违规 0
This commit is contained in:
1 parent
39907d82f6
commit
4b174877be
29 files changed
+231
-118
No files matched your search
@@ -35,9 +35,21 @@ import re
|
||||
import hashlib
|
||||
from collections import deque
|
||||
|
||||
from layout_config import load as load_layout
|
||||
|
||||
ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
|
||||
MAIN_ROOT = "D:/code/g-plan2"
|
||||
|
||||
CANVAS_W = 1280
|
||||
CANVAS_H = 800
|
||||
_LAYOUT = load_layout()
|
||||
B_H = _LAYOUT["stage_h"] # B 区高(布局表单点——与游戏侧同源)
|
||||
C_W = _LAYOUT["info_panel_w"] # C 区宽
|
||||
D_X = C_W + 4 # D 区左边 = C 区宽 + 列间距
|
||||
D_W = CANVAS_W - D_X # D 区宽
|
||||
BAND_DIG = _LAYOUT["log_band_h_dig"] # 明细带收起高
|
||||
AP_H = _LAYOUT["ap_bar_h"] # D 区 AP 条高
|
||||
|
||||
|
||||
def asset_root(*parts):
|
||||
"""素材路径两级回退:worktree → 主检出(素材不入 git,fresh worktree 缺位)。"""
|
||||
@@ -638,10 +650,11 @@ def draw_standee(canvas, ox, oy, kind, name, enemy_id, order=1, armor="light",
|
||||
|
||||
def render_battle_screen():
|
||||
"""B/C/D 三区全内容 1280×800 mockup。"""
|
||||
scr = Image.new("RGBA", (1280, 800), (24, 20, 17, 255))
|
||||
scr = Image.new("RGBA", (CANVAS_W, CANVAS_H), (24, 20, 17, 255))
|
||||
d = ImageDraw.Draw(scr)
|
||||
# ── B 区 252px 全宽 ──
|
||||
d.rectangle([0, 0, 1280, 252], fill=UIKIT["PANEL_STAGE"], outline=UIKIT["PANEL_BORDER"])
|
||||
c_y = B_H + 4
|
||||
# ── B 区(高读布局表)全宽 ──
|
||||
d.rectangle([0, 0, CANVAS_W, B_H], fill=UIKIT["PANEL_STAGE"], outline=UIKIT["PANEL_BORDER"])
|
||||
d.text((640, 14), "第 3 轮 · 挖掘", font=ImageFont.truetype(ZH_FONT, 15), fill=(30, 26, 22), anchor="mm")
|
||||
draw_standee(scr, 40, 34, "hero", "主角", "", hp=0.7, statuses=("attack_up", "ac_up"))
|
||||
d.text((560, 120), "兑现演出区\n(结算期:光带 → 弹道 → 受击)", font=ImageFont.truetype(ZH_FONT, 13),
|
||||
@@ -650,33 +663,34 @@ def render_battle_screen():
|
||||
draw_standee(scr, 973, 34, "enemy", "熊地精", "bugbear", order=2, armor="light", hp=0.8, intent="charge",
|
||||
statuses=("alert",))
|
||||
draw_standee(scr, 1128, 34, "enemy", "食人魔酋长", "ogre_chief", order=3, armor="light", hp=1.0, intent="buff")
|
||||
# 明细带(挖掘期收起 24px)
|
||||
d.rectangle([0, 228, 1280, 252], fill=(90, 80, 66))
|
||||
d.text((10, 240), "── 第 3 轮 ── 地精 受到 4 点伤害(增伤 ×1)· 熊地精 蓄力(重击预告)…", font=F_LBL2,
|
||||
# 明细带(挖掘期收起——高读布局表)
|
||||
d.rectangle([0, B_H - BAND_DIG, CANVAS_W, B_H], fill=(90, 80, 66))
|
||||
d.text((10, B_H - BAND_DIG // 2), "── 第 3 轮 ── 地精 受到 4 点伤害(增伤 ×1)· 熊地精 蓄力(重击预告)…", font=F_LBL2,
|
||||
fill=(232, 222, 200), anchor="lm")
|
||||
# ── C 区 240×548 ──
|
||||
d.rectangle([0, 256, 240, 800], fill=UIKIT["PANEL_HERO"], outline=UIKIT["PANEL_BORDER"])
|
||||
d.rectangle([8, 264, 232, 340], outline=(120, 106, 88), width=1) # 攻击数据框(直角细线)
|
||||
d.text((16, 276), "攻击 6", font=ImageFont.truetype(ZH_FONT, 15), fill=(30, 26, 22))
|
||||
d.text((16, 298), "(+50% 增伤 ×1)", font=F_LBL2, fill=(140, 90, 30))
|
||||
d.text((16, 318), "护甲 AC 12", font=ImageFont.truetype(ZH_FONT, 15), fill=(30, 26, 22))
|
||||
d.text((8, 352), "魔法道具槽(预留)", font=F_LBL2, fill=(120, 110, 98))
|
||||
# ── C 区(宽读布局表)──
|
||||
d.rectangle([0, c_y, C_W, CANVAS_H], fill=UIKIT["PANEL_HERO"], outline=UIKIT["PANEL_BORDER"])
|
||||
d.rectangle([8, c_y + 8, C_W - 8, c_y + 84], outline=(120, 106, 88), width=1) # 攻击数据框(直角细线)
|
||||
d.text((16, c_y + 20), "攻击 6", font=ImageFont.truetype(ZH_FONT, 15), fill=(30, 26, 22))
|
||||
d.text((16, c_y + 42), "(+50% 增伤 ×1)", font=F_LBL2, fill=(140, 90, 30))
|
||||
d.text((16, c_y + 62), "护甲 AC 12", font=ImageFont.truetype(ZH_FONT, 15), fill=(30, 26, 22))
|
||||
d.text((8, c_y + 96), "魔法道具槽(预留)", font=F_LBL2, fill=(120, 110, 98))
|
||||
for i in range(4):
|
||||
d.rectangle([8 + i * 40, 368, 8 + i * 40 + 34, 402], outline=(120, 106, 88), width=1)
|
||||
d.text((8, 416), "本关强化列表(预留)", font=F_LBL2, fill=(120, 110, 98))
|
||||
d.rectangle([8 + i * 40, c_y + 112, 8 + i * 40 + 34, c_y + 146], outline=(120, 106, 88), width=1)
|
||||
d.text((8, c_y + 160), "本关强化列表(预留)", font=F_LBL2, fill=(120, 110, 98))
|
||||
# ── D 区 ──
|
||||
d.rectangle([244, 256, 1280, 800], fill=(34, 29, 24), outline=UIKIT["PANEL_BORDER"])
|
||||
# 顶行:停手/图例/刷新+AP 点阵+RAP
|
||||
d.rectangle([252, 262, 304, 284], fill=(90, 80, 66), outline=(120, 106, 88))
|
||||
d.text((278, 273), "停手", font=F_LBL2, fill=(232, 222, 200), anchor="mm")
|
||||
d.rectangle([310, 262, 354, 284], fill=(90, 80, 66), outline=(120, 106, 88))
|
||||
d.text((332, 273), "?图例", font=F_LBL2, fill=(232, 222, 200), anchor="mm")
|
||||
d.rectangle([360, 262, 428, 284], fill=(90, 80, 66), outline=(120, 106, 88))
|
||||
d.text((394, 273), "刷新 8|剩2", font=F_LBL2, fill=(232, 222, 200), anchor="mm")
|
||||
d.rectangle([D_X, c_y, CANVAS_W, CANVAS_H], fill=(34, 29, 24), outline=UIKIT["PANEL_BORDER"])
|
||||
# 顶行:停手/图例/刷新+AP 点阵+RAP(坐标随 C 区宽平移)
|
||||
dx = D_X + 8
|
||||
d.rectangle([dx, c_y + 6, dx + 52, c_y + 28], fill=(90, 80, 66), outline=(120, 106, 88))
|
||||
d.text((dx + 26, c_y + 17), "停手", font=F_LBL2, fill=(232, 222, 200), anchor="mm")
|
||||
d.rectangle([dx + 58, c_y + 6, dx + 102, c_y + 28], fill=(90, 80, 66), outline=(120, 106, 88))
|
||||
d.text((dx + 80, c_y + 17), "?图例", font=F_LBL2, fill=(232, 222, 200), anchor="mm")
|
||||
d.rectangle([dx + 108, c_y + 6, dx + 176, c_y + 28], fill=(90, 80, 66), outline=(120, 106, 88))
|
||||
d.text((dx + 142, c_y + 17), "刷新 8|剩2", font=F_LBL2, fill=(232, 222, 200), anchor="mm")
|
||||
for i in range(6):
|
||||
col = (232, 200, 120) if i < 4 else (120, 106, 88)
|
||||
d.ellipse([440 + i * 18, 266, 452 + i * 18, 278], fill=col)
|
||||
d.text((552, 273), "RAP 6/6", font=F_LBL2, fill=(200, 180, 140), anchor="lm")
|
||||
d.ellipse([dx + 188 + i * 18, c_y + 10, dx + 200 + i * 18, c_y + 22], fill=col)
|
||||
d.text((dx + 300, c_y + 17), "RAP 6/6", font=F_LBL2, fill=(200, 180, 140), anchor="lm")
|
||||
return scr
|
||||
|
||||
|
||||
@@ -938,8 +952,8 @@ def main():
|
||||
# 三区 mockup
|
||||
scr = render_battle_screen()
|
||||
# D 区主样张板(10×10@45px=450×450)嵌进 mockup D 区(工具行之下居中)
|
||||
bx = 244 + (1036 - board.size[0]) // 2
|
||||
by = 256 + 34 + (800 - 256 - 34 - board.size[1]) // 2
|
||||
bx = D_X + (D_W - board.size[0]) // 2
|
||||
by = B_H + 4 + AP_H + (CANVAS_H - B_H - 4 - AP_H - board.size[1]) // 2
|
||||
scr.paste(board.convert("RGB"), (bx, by), board)
|
||||
canvas.paste(scr, (20, 52))
|
||||
d.text((20, 866), "三区 mockup(1280×800 实比):B 区站桩(主角立绘 48×48 朝右/敌字形占位 ▂▆█/顺位/意图/名行=护甲图标+纯名字)",
|
||||
|
||||
Reference in new issue
Block a user