## VERTICAL SLICE - NOT FOR PRODUCTION ## 格面基座层绘制域件(CellUnit 拆件——单一变化原因=基座层视觉规格): ## 底面/描边/高墙立面/地面投影/接触带微光/顶面倒角的全部绘制入参与绘制命令。 ## 无 class_name(类名缓存面纪律)——经宿主 board_cell_unit preload 引用;宿主 _draw 按层序调 ## draw_base(canvas, rect) 把绘制命令落到宿主画布;setter 经 _owner 回引触发宿主重绘语义逐字。 extends RefCounted # ── D 投影档绘制常量(研究件实测取色——立面高光/双段暗带/地面投影;黑罩 alpha 叠加实测等效)── const FACADE_HIGHLIGHT_PX := 2.0 # 口沿高光线厚(像素) const FACADE_NEAR_FRAC := 0.16 # 立面近段高(格边比——研究件 10/64) const FACADE_FAR_FRAC := 0.25 # 立面远段高(格边比——研究件 16/64) const FACADE_NEAR_COL := Color(0, 0, 0, 0.60) # 立面近段黑罩(墙顶 132→52 实测 α≈0.61) const FACADE_FAR_COL := Color(0, 0, 0, 0.82) # 立面远段黑罩(墙顶 132→24 实测 α≈0.82) const PROJECTION_NEAR_COL := Color(0, 0, 0, 0.28) # 投影贴墙段(地面 66→46 实测 α≈0.28) const PROJECTION_MID_COL := Color(0, 0, 0, 0.16) # 投影中段(渐隐) const PROJECTION_EDGE_COL := Color(0, 0, 0, 0.06) # 投影远段(渐隐收边) # ── E 格高墙面(圣经 v3.5 冻结①——地面格南邻墙→南部 30% 承接墙面:墙顶纹理原亮度 # 直贴零暗档零阴影;墙脚阴线只画地面/墙面交界;(b)-(c) 交界 # 无边框由 BoardView 侧跳过墙格北向描边承载)── const E_FACADE_FRAC := 0.30 # 墙面承接高(格边比 30%) var _owner: Node2D = null var bg_sb: StyleBoxFlat = null # 格底 StyleBox(BoardView 每次 paint 重建;呼吸微光就地改边框) # ── 接触带微光绘制面(可挖域微光画在英雄格周界空间侧——art-bible §3.2 v2.8; # 仅英雄格单元承载,BoardView.refresh 按可挖域写边/角码、_process 逐拍更新呼吸色)── var contact_bands: Array[int] = [] # 正交接触边码 0=N/1=S/2=W/3=E(该侧整条边) var contact_corners: Array[int] = [] # 斜向共享角码 0=NW/1=NE/2=SW/3=SE(角点+两侧各半条边) var contact_col := Color(0, 0, 0, 0) # 当前呼吸色(alpha 0 = 不画) var outline_sides: Array[int] = [] # 墙格地面朝向描边码 0=N/1=S/2=W/3=E(程序侧结构件) # ── 高墙感 D 投影档(研究件四变体定 D=C+地面投影,ITB 同款高度线索)── # 南立面 = 墙格南缘内侧「口沿高光线 + 双段暗带」(邻地面格才画,墙群内聚);地面投影 = 北邻墙格 # 在本已开格北缘投渐隐暗带。参数按研究件 64px 拼版实测比例换算(立面双段 0.16/0.25 格边、投影带 # 0.22 格边;坐标推导留档 commit)。素材缺位程序化回退同样服役(结构归程序——art-bible §8.5)。 var facade_south := false: # 南立面开关(BoardView paint 按「南邻已开格」写入) set(v): facade_south = v _owner.queue_redraw() var proj_band := 0.0: # 地面投影带宽(像素,0 = 不画——BoardView 按北邻墙判定写入) set(v): proj_band = v _owner.queue_redraw() var bevel := 0.0: # 顶面倒角强度(0=关;档位 0/0.35/0.6/1.0) set(v): bevel = v _owner.queue_redraw() var tex_base: Texture2D = null # ① 砖面底(宿主迷雾记忆态公开单向读) var tex_facade: Texture2D = null # ⑥ E 格墙面材质(v3.5——南邻墙顶 center 瓦片同源,BoardView 注入) var facade_strip := false: # E 格开关(BoardView paint 按「已开格且南邻未开墙」写入——瓦片态专用) set(v): facade_strip = v _owner.queue_redraw() func _init(owner: Node2D) -> void: _owner = owner ## ① 砖面底层域(占位 = StyleBoxFlat:格底色 + 暗化描边 + 3px 圆角;瓦片态描边覆盖层; ## 呼吸微光/主角蓝框由 BoardView 改 bg_sb 后触发重绘。素材缺位回退走 elif 程序化原样,零观感变化) func draw_base(canvas: CanvasItem, rect: Rect2) -> void: if tex_base != null: canvas.draw_texture_rect(tex_base, rect, false) # 轮廓加强(轮廓线不明显):墙格地面朝向边补 2px 深墨线(§8.5 结构归程序—— # 素材 1px 墨线在 45/36px 非整数缩放下视觉衰减,程序线保底;墙-墙内界不画,保墙群内聚; # 坐标推导:各边内贴 2px 矩形,相邻边矩形全长相交=周界闭合) if not outline_sides.is_empty(): _draw_outline_sides(canvas, rect) _draw_south_facade(canvas, rect) _draw_north_projection(canvas, rect) _draw_e_facade(canvas, rect) # 瓦片态描边覆盖层:tex_base 在位时 BoardView 传入的 bg_sb # 已降级为「透明底 + 描边」载体——呼吸微光/主角蓝框画在瓦片之上(art-bible §1.2 叠层序 # 不变:底 < 纹带 < 数字 < 封印 < 焦点高亮);素材缺位回退走 elif 程序化原样,零观感变化 if bg_sb != null: canvas.draw_style_box(bg_sb, rect) _draw_contact_or_fallback(canvas, rect) ## 接触带微光或平色回退域(英雄格周界空间侧——正交邻墙=整条边;斜向=共享角点+两侧各半条边;光不进墙格): ## 带宽 4px 贴格边内侧(坐标推导:N=[0,0,edge,4] S=[0,edge-4,edge,4] W=[0,0,4,edge] E=[edge-4,0,4,edge]; ## 半条边=沿邻边自角点起 edge/2;角点圆 r=6 贴角点圆心,近白芯 r=2.5 提亮) func _draw_contact_or_fallback(canvas: CanvasItem, rect: Rect2) -> void: if contact_col.a > 0.0: _draw_north_projection(canvas, rect) # 平色回退+微光并发的英雄格补画(瓦片路径已画——同像素重复无观感差) _draw_e_facade(canvas, rect) # E 格墙面补画(同上——英雄格兼 E 格时瓦片路径已画,重复无害) _draw_contact_bands(canvas, rect) elif bg_sb != null: canvas.draw_style_box(bg_sb, rect) _draw_south_facade(canvas, rect) # 平色回退路径——D 投影档两件同样服役(结构归程序) _draw_north_projection(canvas, rect) _draw_bevel(canvas, rect) ## 墙格轮廓域:地面朝向边补 2px 深墨线(各边内贴 2px 矩形,相邻边矩形全长相交=周界闭合) func _draw_outline_sides(canvas: CanvasItem, rect: Rect2) -> void: var ow := 2.0 var oc := UiKit.FOG_OUTLINE for b in outline_sides: var or_ := Rect2() match int(b): 0: or_ = Rect2(0, 0, rect.size.x, ow) 1: or_ = Rect2(0, rect.size.x - ow, rect.size.x, ow) 2: or_ = Rect2(0, 0, ow, rect.size.x) 3: or_ = Rect2(rect.size.x - ow, 0, ow, rect.size.x) canvas.draw_rect(or_, oc, true) ## 接触带微光域:正交整条边 + 斜向共享角点与两侧半条边 func _draw_contact_bands(canvas: CanvasItem, rect: Rect2) -> void: var band := 4.0 var half := rect.size.x * 0.5 for b in contact_bands: var r := Rect2() match int(b): 0: r = Rect2(0, 0, rect.size.x, band) 1: r = Rect2(0, rect.size.x - band, rect.size.x, band) 2: r = Rect2(0, 0, band, rect.size.x) 3: r = Rect2(rect.size.x - band, 0, band, rect.size.x) canvas.draw_rect(r, contact_col, true) for cc in contact_corners: _draw_contact_corner(canvas, rect, int(cc), band, half) ## 斜向角点域:角点圆 r=6 贴角点圆心 + 近白芯 r=2.5 提亮 + 半条边(角点沿两条邻边各延伸 edge/2—— ## 坐标推导:横带沿 N/S 自角点向板心侧 half;NW/SE 半带 x=y=角点坐标,NE/SE 半带自 edge-half 收进—— ## 正交整边时重叠同色无害) func _draw_contact_corner(canvas: CanvasItem, rect: Rect2, cc: int, band: float, half: float) -> void: var pt := Vector2.ZERO match cc: 0: pt = Vector2(0, 0) 1: pt = Vector2(rect.size.x, 0) 2: pt = Vector2(0, rect.size.x) 3: pt = Vector2(rect.size.x, rect.size.x) canvas.draw_circle(pt, 6.0, contact_col) canvas.draw_circle(pt, 2.5, Color(1, 1, 1, minf(1.0, contact_col.a * 0.95))) if cc == 0 or cc == 1: # N 侧横带:NW 自 x=0、NE 自 x=edge-half canvas.draw_rect(Rect2(pt.x if cc == 0 else pt.x - half, 0.0, half, band), contact_col, true) if cc == 2 or cc == 3: # S 侧横带:SW 自 x=0、SE 自 x=edge-half canvas.draw_rect(Rect2(pt.x if cc == 2 else pt.x - half, rect.size.x - band, half, band), contact_col, true) if cc == 0 or cc == 2: # W 侧竖带:NW 自 y=0、SW 自 y=edge-half canvas.draw_rect(Rect2(0.0, pt.y if cc == 0 else pt.y - half, band, half), contact_col, true) if cc == 1 or cc == 3: # E 侧竖带:NE 自 y=0、SE 自 y=edge-half canvas.draw_rect(Rect2(rect.size.x - band, pt.y if cc == 1 else pt.y - half, band, half), contact_col, true) ## 顶面倒角域(光源左上——上/左内沿受光 2px、下/右内沿背光 2px;内缩 2px 让 ## 呼吸微光/主角蓝边框保持最外沿可见;强度随档位) func _draw_bevel(canvas: CanvasItem, rect: Rect2) -> void: if bevel <= 0.0: return var base: Color = bg_sb.bg_color var lit: Color = base.lightened(0.22 * bevel) var dark: Color = base.darkened(0.22 * bevel) var t := 2.0 canvas.draw_rect(Rect2(t, t, rect.size.x - t * 2.0, t), lit, true) canvas.draw_rect(Rect2(t, t, t, rect.size.x - t * 2.0), lit, true) canvas.draw_rect(Rect2(t, rect.size.x - t * 2.0, rect.size.x - t * 2.0, t), dark, true) canvas.draw_rect(Rect2(rect.size.x - t * 2.0, t, t, rect.size.x - t * 2.0), dark, true) # 南立面(D 档件一——墙格南缘内侧,自底边向上:双段暗带在下、口沿高光线贴其上沿): # 坐标推导(自格底边起算):远段=[edge−far, edge],近段=[edge−far−near, edge−far], # 高光线=[edge−far−near−hl, edge−far−near]——与研究件「墙顶面→高光→暗段→更暗段→格界」下行序一致 func _draw_south_facade(canvas: CanvasItem, rect: Rect2) -> void: if not facade_south: return var far_h := rect.size.x * FACADE_FAR_FRAC var near_h := rect.size.x * FACADE_NEAR_FRAC var y_far := rect.size.x - far_h var y_near := y_far - near_h var y_hl := y_near - FACADE_HIGHLIGHT_PX canvas.draw_rect(Rect2(0.0, y_hl, rect.size.x, FACADE_HIGHLIGHT_PX), UiKit.BRICK, true) # 口沿高光(合并归掩尘枚 BRICK——art-bible §4.1 换色合并①同值单点) canvas.draw_rect(Rect2(0.0, y_near, rect.size.x, near_h), FACADE_NEAR_COL, true) canvas.draw_rect(Rect2(0.0, y_far, rect.size.x, far_h), FACADE_FAR_COL, true) # 地面投影(D 档件二——北邻墙格在本已开格北缘投渐隐暗带,自北缘向南三段衰减): # 坐标推导:三等分 proj_band,α 0.28/0.16/0.06(研究件实测贴墙 α≈0.28、带末渐融入地面) func _draw_north_projection(canvas: CanvasItem, rect: Rect2) -> void: if proj_band <= 0.0: return var seg := proj_band / 3.0 canvas.draw_rect(Rect2(0.0, 0.0, rect.size.x, seg), PROJECTION_NEAR_COL, true) canvas.draw_rect(Rect2(0.0, seg, rect.size.x, seg), PROJECTION_MID_COL, true) canvas.draw_rect(Rect2(0.0, seg * 2.0, rect.size.x, seg), PROJECTION_EDGE_COL, true) # E 格高墙面(圣经 v3.5 冻结①——方向稿 draw_facade 移植):本格已开且南邻为墙 → # 南部 30% 承接墙面。材质 = 墙顶 center 瓦片顶部 30% 区带**原亮度**直贴(零暗档零阴影); # 墙脚阴线只画地面/墙面交界(strip 顶缘 1px);墙面底缘(格界处)不画任何线——直接接南侧墙顶 # (白边导致两截)。仅瓦片态服役(tex_facade 缺位 = 平色回退原语义不动)。 func _draw_e_facade(canvas: CanvasItem, rect: Rect2) -> void: if not facade_strip or tex_facade == null: return var strip_h := rect.size.x * E_FACADE_FRAC var y0 := rect.size.x - strip_h var ts := tex_facade.get_size() canvas.draw_texture_rect_region(tex_facade, Rect2(0.0, y0, rect.size.x, strip_h), Rect2(0.0, 0.0, ts.x, ts.y * E_FACADE_FRAC)) canvas.draw_rect(Rect2(0.0, y0, rect.size.x, 1.0), UiKit.E_FACADE_FOOT_COL, true)