docs: 八敌立绘逐键定档 + 方案二排版批(美术线自立批讨论稿定稿,纯文档 + 管线脚本常量)
源委=P0 收口讨论批(2026-10-06,用户令「讨论期只改文档」)——派生自 3549 次 可读性实测(24 糊/32 可读/48 清楚/64 细节完整)与用户三体型约束(钩爪恐魔>灰矮人、 灰矮人<熊地精、食人魔酋长>熊地精)+ 定档总图用户确认。 ① 八敌站桩源档由「全敌共用 48」改逐键定档(tools/pixelize_candidates.py 新增 STANDEE_TIER_H:地精36/巨蜘蛛38/灰矮人46/钩爪恐魔58/熊地精62/食人魔酋长74/ 蛛化卓尔90/灰矮人石君王94;主角 48 不变,显示一律 ×2 整数 NEAREST=72–188)。 旧 f_enemy=48/max_h 系数退役(它把普通怪压到 21–24px、全员低于可读门槛); SIZES 明确降级为「中间分辨率表」(决定中间图多细,不决定最终体量),并纠注 ogre_chief=192 系分辨率选择非 Boss 档归属。派生管线 = pixel-1 紧裁 → 等比缩 至各自档高 → dom_block_resize 块内众数降采样(禁走 recon / 重跑 remove_bg)。 ② 排版改方案二:B 区 252→270(≈1/3 屏)/ C·D 548→530,扫雷盘 438×438 原尺寸 不缩、格子不变(压缩由面板空档吸收);站桩内部重排=立绘双脚落石台上缘、血条 +状态/名字行落底排全场一线;大体档(drider/duergar_king)头部探出盒顶压进光 柱区,血条仍落底、意图徽标压胸;「血条悬浮头顶 + 盒内居中」排式退役。 ③ 体量语义修订(character-design §5.2):强度先验 → 生物体型,小块精英与大体普 通怪并存;§5.1 新增主角描边例外(深褐 40,19,13,浅砖面对比更高);§5.5 登记 钩爪恐魔「宽≥高」豁免(58 高窄条长臂束状剪影,待样张批复验)。 ④ 定值单点纪律(art-bible §8 头注):数字定值只落 §4.1 主色板 + §8.2,其余章指 路禁复述;§4.1 新增色板 48 色上限 + 新色须与既有任一色 RGB 三通道差 ≥8。 ⑤ §8.3 归档纪律(图片不入 git / 过程稿归档+对象存储 / 主文档禁引 artwork 散路径) + 三检查器挂点(色板检查器 / 路径核对器 / standee_asset_check 硬闸升级规格)。 ⑥ 方向:=ission:24 rectifikace 地形色值对齐 §4.1(岩石 #8B755B→#C9AF83、地面 #564232→#B39A78,两处提示词同步);生图渠道改为「远程对话式正主 + 本地 ComfyUI 备选」;地形瓦片改拼表制正主(三步法),分张降为回退路径。 ⑦ 对账更正:asset-path-map 废路径 production/mockups → artwork/mockups; art-status-checklist 格子样张 ⬜→✅、受击反馈/弹道 ⬜→◐(共 ✅4/◐8/⬜3)。 ⑧ 06 新登记四条:站桩帧动画(Alpha 定版闸前)/ 主角描边素材侧复核 / 3349 草稿 dry-run 整理 / 口号型条款机检化(三档标注格式已拍板)。 纯文档 + 1 个 Python 常量表改动,未出图未动引擎代码;重产与实装归后续任务书批。 doc 三闸/冒烟未跑(讨论批:非 loop 批且用户未点名,两入口铁规)。
This commit is contained in:
1 parent
a2b7c215ae
commit
0aa85ddb87
9 files changed
+131
-48
No files matched your search
@@ -25,9 +25,26 @@ from PIL import Image, ImageFilter
|
||||
|
||||
FIXER_EXE_DEFAULT = r"D:\code\pixel-art-fixer\rust\target\release\pixelfixer.exe"
|
||||
FIXER_EXE = FIXER_EXE_DEFAULT # --fixer-exe 可覆写(__main__ 解析)
|
||||
STANDEE_SLOT_H = 48 # 站桩槽位源档高(×2 整数放大=盒高 96——圣经 §8.2)
|
||||
STANDEE_SLOT_H = 48 # 主角站桩源档高(×2 整数放大=盒高 96——圣经 §8.2)
|
||||
STANDEE_SLOT_W_MAX = 75 # 盒宽 150 的一半(超宽才按宽收,现八敌+主角均不触)
|
||||
|
||||
# 八敌站桩源档高 = 生物体型,不是强度档位(2026-10-06 用户裁定)
|
||||
# 口径:体量按「这只生物本来多大」定;强度改由别的通道承载(Boss 的紫赤色相独占、
|
||||
# 精英的垂直延伸、HUD 意图徽标)。因此下表与 §5.5 的普通/精英/Boss 档位**不对齐**——
|
||||
# 例如钩爪恐魔是普通怪却比精英灰矮人大,灰矮人是精英却比普通/精英熊地精小。
|
||||
# 数值经实测校准(视觉体量 = 不透明像素面积,不看高度——蜘蛛宽扁,按高度排会失真):
|
||||
# 地精 828 < 灰矮人 1014 < 巨蜘蛛 1390 < 钩爪恐魔 1538
|
||||
# < 熊地精 2145 < 食人魔酋长 2886 < 蛛化卓尔精灵 3513 < 灰矮人石君王 4385
|
||||
STANDEE_TIER_H = {
|
||||
"goblin": 36, "giant_spider": 38,
|
||||
"duergar": 46, "hook_horror": 58,
|
||||
"bugbear": 62, "ogre_chief": 74,
|
||||
"drider": 90, "duergar_king": 94,
|
||||
}
|
||||
|
||||
# 中间产物(pixel-1)的生成分辨率——只决定中间图有多细,**不决定最终体量**。
|
||||
# 最终体量归 STANDEE_TIER_H。这里取得比最终档高越大,后续降采样越干净。
|
||||
# 注意:ogre_chief 取 192 是分辨率选择(要给它更高的中间精度),不是把它归为 Boss 档。
|
||||
SIZES = {"goblin": 96, "giant_spider": 96, "hook_horror": 96,
|
||||
"bugbear": 128, "duergar": 128,
|
||||
"ogre_chief": 192, "drider": 192, "duergar_king": 192}
|
||||
@@ -440,10 +457,15 @@ def dom_block_resize(im, nw, nh):
|
||||
|
||||
|
||||
def build_standee48(batch_root, out_dir, extra_hero_states=("attack", "hit")):
|
||||
"""九张 48px 站桩槽位档:源=八敌 pixel-1+主角 normal_1x(extra_hero_states 追加 attack/hit,T3 起默认)。
|
||||
"""出八敌 + 主角的站桩源档。源 = 八敌 pixel-1 + 主角 normal_1x(追加 attack/hit,T3 起默认)。
|
||||
|
||||
口径(代拍板待追认): 敌八种统一比例(最大体量归 48 高,相对体量语义=字形回退 ▂▆█ 同构);
|
||||
主角自适比例(48/56);NEAREST 零插值;内容 bbox 裁边后底中锚贴 (w,48) 透明画布。
|
||||
口径(2026-10-06 用户裁定,取代旧的「统一比例」):
|
||||
1. 八敌各自按 STANDEE_TIER_H 定高——那是生物体型,不是强度档位。
|
||||
旧口径是「全敌共用 48/最大值」一个系数,结果普通怪只剩 21–24px,
|
||||
全部低于可读门槛(实测门槛约 32px,48px 舒适),钩爪恐魔被压成一团糊。
|
||||
2. 主角仍按 STANDEE_SLOT_H(48)定高。
|
||||
3. 画布高度 = 该角色自己的档高(不再是统一 48);内容裁透明边后底中锚贴底缘。
|
||||
4. 降采样走 dom_block_resize(块内众数投票,零插值)。
|
||||
"""
|
||||
os.makedirs(out_dir, exist_ok=True)
|
||||
enemy_srcs = {}
|
||||
@@ -460,23 +482,23 @@ def build_standee48(batch_root, out_dir, extra_hero_states=("attack", "hit")):
|
||||
if os.path.isfile(sp):
|
||||
jobs.append(("hero_%s" % st, Image.open(sp).convert("RGBA"),
|
||||
"character_hero_%s.png" % st))
|
||||
max_h = max(im.height for _, im, _ in jobs)
|
||||
f_enemy = STANDEE_SLOT_H / float(max_h) # 敌统一比例(体量语义)
|
||||
made = []
|
||||
for key, im, out_name in jobs:
|
||||
l, t, r, b = _bbox_alpha(im)
|
||||
im = im.crop((l, t, r, b))
|
||||
f = f_enemy if key != "hero_normal" and not key.startswith("hero_") else STANDEE_SLOT_H / float(im.height)
|
||||
is_hero = key == "hero_normal" or key.startswith("hero_")
|
||||
slot_h = STANDEE_SLOT_H if is_hero else STANDEE_TIER_H.get(key, STANDEE_SLOT_H)
|
||||
f = slot_h / float(im.height)
|
||||
nw, nh = max(1, int(round(im.width * f))), max(1, int(round(im.height * f)))
|
||||
if nw > STANDEE_SLOT_W_MAX: # 超宽兜底(现无触)——按宽收再贴底
|
||||
k2 = STANDEE_SLOT_W_MAX / float(nw)
|
||||
nw, nh = STANDEE_SLOT_W_MAX, max(1, int(round(nh * k2)))
|
||||
body = dom_block_resize(im, nw, min(nh, STANDEE_SLOT_H))
|
||||
canvas = Image.new("RGBA", (nw, STANDEE_SLOT_H), (0, 0, 0, 0))
|
||||
canvas.alpha_composite(body, (0, STANDEE_SLOT_H - body.height)) # 底中锚:脚贴画布底缘
|
||||
body = dom_block_resize(im, nw, min(nh, slot_h))
|
||||
canvas = Image.new("RGBA", (nw, slot_h), (0, 0, 0, 0))
|
||||
canvas.alpha_composite(body, (0, slot_h - body.height)) # 底中锚:脚贴画布底缘
|
||||
outp = os.path.join(out_dir, out_name)
|
||||
canvas.save(outp)
|
||||
print("standee48 %-14s %sx%s -> %s" % (key, nw, STANDEE_SLOT_H, outp))
|
||||
print("standee %-14s %sx%s -> %s" % (key, nw, slot_h, outp))
|
||||
made.append(outp)
|
||||
return made
|
||||
|
||||
|
||||
Reference in new issue
Block a user