diff --git a/design/art/art-bible.md b/design/art/art-bible.md index 7a2e29c4..f5922970 100644 --- a/design/art/art-bible.md +++ b/design/art/art-bible.md @@ -381,7 +381,7 @@ - **菱形灯光区(遮罩几何)**:灯光区 = 以角色所在格为中心、**曼哈顿距离 ≤ LIGHT_RADIUS** 的格集,区内照常渲染。LIGHT_RADIUS 走表值/常量参数化,**基准 8**——正主「灯光区起步半径=微光环 8 格」的落码口径(半径数值沿微光「周围 8 格」的 8 起步,实测后可调)。**两圈分立注**:类型微光作用圈 = 英雄贴身 8 邻格(与可挖域同圈,正主《HUD框架》「未开格类型微光」节),**不随灯光区扩**(正主配套拍板④)——灯光区只裁可见性,微光锚仍是可挖域,两圈几何分立、半径参数互不读写。提灯插值位:LIGHT_RADIUS_LANTERN_BONUS = **+2**(flat 整数档,正主配套拍板),**预留不接效果**(接线归 Alpha 信息件批)。边界随角色格位逐格重算,无半径插值动画。←正主;§2 光照氛围允许域 - **区外未开格:全黑不渲染(不透明档,照抄正主)**:正主原文「区外**未开格=全黑不渲染**」——不透明纯黑(L=0),**非高遮蔽半透档**。理由注记(为何不用高遮蔽档):①三档信息阶梯干净——未开格不可见=零信息、记忆格=弱信息、活格=全信息,叠读不打架;②高遮蔽档下砖面纹理隐约残留,与「类型微光=未开格唯一信息通道」(§4.2/§4.6.3)冲突——纹理残影泄格面观感;③正主验收线「区外未开格不可见」须二值态才能逐格断言。←正主;§4.2 -- **区外已开格:暗淡记忆态(灰显可读档,明度 provisional)**:整格罩**程序化素色记忆板**(纯色压平纹理,纹理免疫——同 §4.1 色牌兜底的纹理免疫逻辑)+ 格内元素灰阶调制:**记忆板 #3A3A3A(L≈0.045,provisional)**、**记忆墨 #C4C4C4(中性灰 L≈0.55,provisional)**;数字对记忆板 ≈6.3:1 **≥4.5:1**(WCAG,可访问性基线硬指标)。双峰板色牌格在记忆态**退牌归板**——牌面并入记忆板、数字以记忆墨直画(素面无纹理,直画恒可读,无需再算牌墨组合)。可辨性自查判据(三通道,落码后随样张/实机自检):①对全黑未开格——记忆板 L0.045 对 L0,实机目检常光档可分(暗房档一并抽检,provisional);②对灯光区内活态已开格——主判据=数字墨灰度差(记忆墨 L0.55 对亮墨三档 L≥0.75 / 色牌 #F5EAD3 L≈0.83,灰度 ΔL≥0.20)+ 色相通道(记忆态全中性灰零色相,对活态暖底暖墨);格底明度差(L0.045 对 0.08–0.14)为辅助通道;③格态三形在记忆态保持灰度可辨——形通道(完整/碎裂/巢穴纹,§3.2)经灰阶调制形状不变,沿 §1.4 验收 2 同源判据。**旗不在记忆态面**:旗只插在未开格,区外未开格全黑——旗印记随格隐没、灯光区移回复显(纯呈现,旗数据零影响,正主口径的显式推论)。←HUD框架 可访问性基线;§4.1;§1.4;§3.2 +- **区外已开格:暗淡记忆态(灰显可读档,2026-10-06 UI 设计对齐批 P10 乙换装)**:画法 = **地板纹理原样 + 灰罩压顶**(demo 口径换装——原「程序化素色记忆板平涂」退役;纹理直画后 `FOG_MEMORY_PLATE #3A3A3A` α0.66 灰罩盖顶,素材零改动)+ 格内元素灰阶随罩隐现:**记忆墨 #C4C4C4(中性灰 L≈0.55)**;数字对合成底实测 **≈6.7:1 ≥4.5:1**(WCAG 硬指标;地板纹理均值 #453020 与灰罩合成后 #3E3731 复算,迭代 16 T0)。双峰板色牌格在记忆态**退牌归板**——牌面并入记忆态、数字以记忆墨直画。可辨性自查判据(三通道,落码后随样张/实机自检):①对全黑未开格——合成底 #3E3731(L≈0.036)对 L0,实机目检常光档可分(暗房档一并抽检);②对灯光区内活态已开格——主判据=数字墨灰度差(记忆墨 L0.55 对亮墨三档 L≥0.75 / 色牌 #F5EAD3 L≈0.83,灰度 ΔL≥0.20)+ 色相通道(记忆态近中性灰,对活态暖底暖墨);格底明度差为辅助通道;③格态三形在记忆态保持灰度可辨——形通道经纹理+灰罩形态不变,沿 §1.4 验收 2 同源判据。**旗不在记忆态面**:旗只插在未开格,区外未开格全黑——旗印记随格隐没、灯光区移回复显(纯呈现,旗数据零影响,正主口径的显式推论)。←HUD框架 可访问性基线;§4.1;§1.4;§3.2 - **迷雾过渡边:硬边(逐格二值)**:灯光区边界 = **整格二值切换**(区内全渲染 / 区外全黑或记忆态),**不做渐变过渡带、不做半透明晕边**。理由:①边界是信息边界不是氛围晕——渐变中间态 =「看得见但看不清」,破数字可读硬指标与记忆态明度档;②正主验收断言(边界格呈态、两态逐位一致)须格级二值可判;③与砖面整格表达(§3.2 高墙瓦片体系)、ITB 格内信息分层气质同轴。无动画,减动效无涉。←正主;§1.2 原则一;§3.2 - **与结算期去饱和的叠加共存**:结算期去饱和偏移(settlement_fx_view,同族先例)与迷雾调制叠加口径 = **记忆态为终态档**——区外已开格在结算期保持记忆态档、**不再叠加**结算去饱和(灰显已含去饱和语义,二次调制无信息增量且明度不可控);灯光区内格照常吃结算去饱和;全黑格两态无差。叠加态随实施批共存校验 + 探针断言(provisional,实机目检可代拍)。←任务书 T3/T4 - **§2 明度禁令自查**:迷雾遮蔽与记忆态灰显属 §2 明度分层**光照氛围允许域**(洞穴举灯的空间光照呈现,与 Moonlighter 取列「亮地板/暗深渊/发光体」光照层次同族),非情绪压暗(§9.2 Darkest 反面条款不触——那禁的是情绪表达)、非状态明暗编码(格态语义仍由形+色相承载,灰度下三态可辨不受扰)。←§2;§9.1;§9.2 @@ -444,6 +444,7 @@ - **缩放纪律(硬规则,2026-09-30 v3.1 起按资产两类分级——2026-09-26 用户裁「更改规则,不做个案豁免」)**: - **甲类·文本与语义件**(数字、图标、旗、砖面 tile、格面纹样):维持严格整数倍缩放硬规则——可读性与语义精确性优先,**禁非整数缩放不变**。 + - **显示档登记例外(2026-10-06 UI 设计对齐批 P6 甲——64 源 0.5×,待素材批消除)**:柜台四枚 `icon_forge/workshop/atlas/keystone`(64×64 源)显示档统一 **32px = 0.5×**;状态九枚(32×32 源)mini(站桩)档 **16px = 0.5×**。两处均系「显示尺寸侧唯一可调、素材一字节禁改」红线下的人工检整数半倍档,登记为**待消除例外**——素材批出 32px 源后回归 1×。常规档显示一律 1×(状态九枚 32px、手绘十枚 20px/40px 双档、BCard 图标槽 40px=2×)。 - **乙类·角色与单位精灵**(有机形体、非文字):允许运行时非整数倍缩放(NEAREST 过滤不变),容忍轻度像素宽窄不均;判据 = 实机目检,可感不适即回整数档。乙类今后免逐案豁免(豁免蔓延断根)。 - **站桩立绘槽位=高定宽随(2026-10-04 原型审计教训落规)**:立绘/精灵槽位只定「高度的整数倍档」,宽度随源图宽高比自适应——**禁止把全部立绘塞进统一方框强拉**(纵横倍率必须恒等)。实例=UI 原型 88×92 方框把 23×48 地精源横拉 3.83×/纵拉 1.92×、26×48 熊地精 3.38×/1.92× 压扁发花,46×48 主角近方恰等比故独活——方框是按主角比例定的,窄条生物(细长本体裁掉透明边)进主角的框必变形。乙类的非整数豁免只覆盖**等比**缩放,不含纵横异倍变形。 - **1920×1080 档策略(2026-09-30 三裁决案甲落定——三案呈报见 design/qa/m3-iter9-t8-rulings-2026-09-30.md)**:全局等比(stretch=canvas_items+aspect **keep**)——16:10 设计在 16:9 窗口=等比 1.35×+左右黑边各 ~96px,构图与 1280×800 基准档完全一致(逻辑布局 1920/1280 逐键一致实测);甲类 1.35 非整数缩放例外注记:轻度宽窄不均系本档位接受代价(像素游戏 shipped 常态),实机目检可感不适→回乙案(1920 独立 2× 基准)重议;乙类同前款。 diff --git a/game/presentation/views/board_cell_unit.gd b/game/presentation/views/board_cell_unit.gd index 113e93cf..592a020b 100644 --- a/game/presentation/views/board_cell_unit.gd +++ b/game/presentation/views/board_cell_unit.gd @@ -254,7 +254,12 @@ func _draw() -> void: if fog_state == 1: draw_rect(Rect2(Vector2.ZERO, Vector2(edge, edge)), Color(0, 0, 0, 1.0), true) elif fog_state == 2: - draw_rect(Rect2(Vector2.ZERO, Vector2(edge, edge)), UiKit.FOG_MEMORY_PLATE, true) + # 记忆态换装(P10 乙 2026-10-06——demo 口径「地板纹理 + 灰罩 α.66」:原 #3A3A3A 平涂退役; + # 地板纹理原样直画 + FOG_MEMORY_PLATE α.66 灰罩压顶;素材零改动、格边长零改动。 + # 记忆墨 FOG_MEMORY_INK 对合成底实测 ≈6.7:1 ≥4.5:1(§7.2 硬指标;floor avg #453020 复算在册)) + if tex_base != null: + draw_texture_rect(tex_base, Rect2(Vector2.ZERO, Vector2(edge, edge)), false) + draw_rect(Rect2(Vector2.ZERO, Vector2(edge, edge)), Color(UiKit.FOG_MEMORY_PLATE, 0.66), true) if glyph != "": _draw_glyph(glyph, UiKit.FOG_MEMORY_INK, maxi(18, int(ceil(edge * 0.5)))) # 字号下限 18(§7.4 冻结公式同源) # ⑦ 中立移除退色层(迭代 13 T8/D6——P2 甲退色降档:暗幕压顶全层覆盖,暗淡记忆态同族呈现语义; diff --git a/game/presentation/views/camp_overlay_view.gd b/game/presentation/views/camp_overlay_view.gd index 88de1ed9..1feeb813 100644 --- a/game/presentation/views/camp_overlay_view.gd +++ b/game/presentation/views/camp_overlay_view.gd @@ -87,7 +87,7 @@ func _init() -> void: var bal_row := HBoxContainer.new() bal_row.add_theme_constant_override("separation", 6) badge.add_child(bal_row) - var keystone_icon := UiKit.icon_rect(UiKit.TEX_ICON_KEYSTONE, 20) # 缺位 null → 纯文本回退(M3 18→20) + var keystone_icon := UiKit.icon_rect(UiKit.TEX_ICON_KEYSTONE, 32) # P6 甲②(2026-10-06):64 源 0.5×(原 20=0.3125× 违 §8.2);缺位 null → 纯文本回退 if keystone_icon != null: bal_row.add_child(keystone_icon) _balance_label = UiKit.label("钥石 0",UiKit.FS_SUB, true, UiKit.INK_ON_GOLD) @@ -162,7 +162,7 @@ func _counter_panel(title_text: String, icon_path: String, holder: Control, min_ head.add_theme_constant_override("separation", 6) band.add_child(head) if icon_path != "": - var ic := UiKit.icon_rect(icon_path, 20) # M3 16→20(demo 头带图标档) # 缺位 null → 纯文本回退 + var ic := UiKit.icon_rect(icon_path, 32) # P6 甲②(2026-10-06):柜台头带 64 源 0.5×(原 20 违 §8.2);缺位 null → 纯文本回退 if ic != null: head.add_child(ic) var l := UiKit.label(title_text,UiKit.FS_BODY, true, UiKit.WARM) diff --git a/game/presentation/views/level_map_screen.gd b/game/presentation/views/level_map_screen.gd index 18eac718..4f6bbdc3 100644 --- a/game/presentation/views/level_map_screen.gd +++ b/game/presentation/views/level_map_screen.gd @@ -130,9 +130,14 @@ func _init() -> void: bottom.add_child(strip) var face := TextureRect.new() var face_tex := UiKit.load_tex(UiKit.TEX_HERO_PORTRAIT) + # P6 甲⑤(2026-10-06):定高 48px=1×、宽随源图比自适应(源 46×48 → 46×48;纵横异倍消除) + var face_h := 48.0 + var face_w := face_h if face_tex != null: face.texture = face_tex - face.custom_minimum_size = Vector2(50, 52) + if face_tex.get_height() > 0: + face_w = floorf(face_h * face_tex.get_width() / float(face_tex.get_height())) + face.custom_minimum_size = Vector2(face_w, face_h) face.expand_mode = TextureRect.EXPAND_IGNORE_SIZE face.stretch_mode = TextureRect.STRETCH_KEEP_ASPECT_CENTERED face.texture_filter = CanvasItem.TEXTURE_FILTER_NEAREST diff --git a/game/presentation/views/status_slot_row.gd b/game/presentation/views/status_slot_row.gd index c233a3b6..3cd3c09d 100644 --- a/game/presentation/views/status_slot_row.gd +++ b/game/presentation/views/status_slot_row.gd @@ -118,9 +118,10 @@ func _make_slot() -> PanelContainer: if compact: col.add_theme_constant_override("separation", 0) slot.add_child(col) - # 定稿纹理图标(32px 源 → 24px 槽内呈现;线性过滤匹配抗锯齿矢量风源图) + # 定稿纹理图标(P6 甲③ 2026-10-06:32px 源 → 常规档 32px=1×;mini(站桩)档 16px=0.5× + # 共用 §8.2 例外登记——线性过滤匹配抗锯齿矢量风源图) var icon := TextureRect.new() - icon.custom_minimum_size = Vector2(24, 24) if not compact else Vector2(16, 16) + icon.custom_minimum_size = Vector2(32, 32) if not compact else Vector2(16, 16) icon.expand_mode = TextureRect.EXPAND_IGNORE_SIZE icon.stretch_mode = TextureRect.STRETCH_KEEP_ASPECT_CENTERED icon.texture_filter = CanvasItem.TEXTURE_FILTER_LINEAR diff --git a/game/presentation/views/ui_kit.gd b/game/presentation/views/ui_kit.gd index 122560eb..b76deb00 100644 --- a/game/presentation/views/ui_kit.gd +++ b/game/presentation/views/ui_kit.gd @@ -479,7 +479,7 @@ class BCard: var itex := UiKit.load_tex(icon_path) if itex != null: icon_tr.texture = itex - icon_tr.custom_minimum_size = Vector2(56, 56) + icon_tr.custom_minimum_size = Vector2(40, 40) # P6 甲④(2026-10-06):20×20 源 2× 档(原 56=2.8× 违 §8.2) icon_tr.expand_mode = TextureRect.EXPAND_IGNORE_SIZE icon_tr.stretch_mode = TextureRect.STRETCH_KEEP_ASPECT_CENTERED icon_tr.texture_filter = CanvasItem.TEXTURE_FILTER_NEAREST