141 lines
7.0 KiB
GDScript
141 lines
7.0 KiB
GDScript
## VERTICAL SLICE - NOT FOR PRODUCTION
|
||
## 格面标识与顶层叠加绘制域件(CellUnit 拆件——单一变化原因=标识与叠加层视觉规格):
|
||
## 变异标记/数字色牌与字形/奖励徽章/封印/路径点迹/焦点高亮/中立移除退色的全部绘制入参与绘制命令。
|
||
## 无 class_name(类名缓存面纪律)——经宿主 board_cell_unit preload 引用;宿主 _draw 按层序调
|
||
## draw_marks/draw_glyph_layer/draw_overlay_under/draw_removed_dim(雾层由宿主夹在 overlay_under 与 removed_dim 之间);
|
||
## setter 经 _owner 回引触发宿主重绘语义逐字(badge_glyph 的 glow mask 经构造交付 Callable 下发——pres封装 C)。
|
||
extends RefCounted
|
||
|
||
var _owner: Node2D = null
|
||
var _mask_set: Callable # 徽章遮罩下发口(构造交付——宿主 CellUnit 自持 glow 层引用,本件零回引宿主私有面)
|
||
var badge_glyph := "": # 奖励徽章文字(右下角金——封印之下、变异纹之上、不进数字区)
|
||
set(v):
|
||
badge_glyph = v
|
||
if _mask_set.is_valid():
|
||
_mask_set.call(v != "")
|
||
_owner.queue_redraw()
|
||
var dot_visible := false: # BFS 路径预览点迹(中心 6×6 小人蓝)
|
||
set(v):
|
||
dot_visible = v
|
||
_owner.queue_redraw()
|
||
var hl_visible := false: # 焦点高亮(悬停态边框覆盖层)
|
||
set(v):
|
||
hl_visible = v
|
||
_owner.queue_redraw()
|
||
var hl_color := UiKit.GOLD: # 高亮色(金目标/封印朱/禁入灰禁红)
|
||
set(v):
|
||
hl_color = v
|
||
_owner.queue_redraw()
|
||
var font: Font = null # 字体槽位(null = ThemeDB.fallback_font——BoardView.set_world_font 注入)
|
||
# ── 素材槽位(现全 null = 程序化占位服役;art-bible §8.2 格面 32×32 暂定档)──
|
||
var tex_mutation: Texture2D = null # ② 变异纹带
|
||
var tex_glyph: Texture2D = null # ③ 数字
|
||
var tex_badge: Texture2D = null # ③' 徽章
|
||
# 变异角标(程序化,tex_mutation 纹带槽暂留):
|
||
# "flat_damage" = 未开格伤害型变异,左下角危险红三角(开格有代价的策略纹理标记)
|
||
# 叠加层标记(秘宝整图叠加层的格面呈现;派生信息层零回写):
|
||
# "mine_reveal" = 真视格(危险红内缩框——「这格是雷」的确定决策标记,封印照常计费);
|
||
# "reward_preview" 格不复用本字段——预读徽章走 badge_glyph 注入(board_view refresh 注入 REWARD_BADGE 字形)
|
||
var treasure_mark := "":
|
||
set(v):
|
||
if treasure_mark != v:
|
||
treasure_mark = v
|
||
_owner.queue_redraw()
|
||
var mutation_mark := "":
|
||
set(v):
|
||
if mutation_mark != v:
|
||
mutation_mark = v
|
||
_owner.queue_redraw()
|
||
var removed_dim := false: # 中立移除退色层(BoardView paint 按排雷玩法 is_removed 写入)
|
||
set(v):
|
||
removed_dim = v
|
||
_owner.queue_redraw()
|
||
|
||
|
||
func _init(owner: Node2D, mask_set: Callable) -> void:
|
||
_owner = owner
|
||
_mask_set = mask_set
|
||
|
||
|
||
## 变异标记域:真视格=危险红内缩框/未开格伤害型变异=左下角危险红三角
|
||
func draw_marks(canvas: CanvasItem, rect: Rect2) -> void:
|
||
if treasure_mark == "mine_reveal":
|
||
var inset := rect.size.x * 0.14
|
||
canvas.draw_rect(Rect2(inset, inset, rect.size.x - inset * 2.0, rect.size.x - inset * 2.0),
|
||
Color(UiKit.RED_MINE, 0.9), false, 2.0)
|
||
if mutation_mark == "flat_damage":
|
||
var mw := rect.size.x * 0.28
|
||
var mpts := PackedVector2Array([Vector2(0, rect.size.x - mw), Vector2(0, rect.size.x), Vector2(mw, rect.size.x)])
|
||
canvas.draw_colored_polygon(mpts, Color(UiKit.RED_MINE, 0.85))
|
||
|
||
|
||
## ②③④ 中层域:变异纹带与标记/数字色牌与字形/徽章/封印
|
||
##(glyph/glyph_color/plate 三者住宿主冻结面——探针直读成员,作参数传入)
|
||
func draw_glyph_layer(canvas: CanvasItem, rect: Rect2, glyph: String, glyph_color: Color, plate: bool) -> void:
|
||
# ② 变异纹带(无程序化纹带——槽位先行,贴图落位即用)
|
||
if tex_mutation != null:
|
||
canvas.draw_texture_rect(tex_mutation, rect, false)
|
||
# ③ 数字/徽章(数字 ≥ 格高 50% 墨族对格底 ≥4.5:1;徽章右下角金,遮蔽态 = "?")
|
||
if glyph != "":
|
||
if plate:
|
||
_draw_digit_plate(canvas, rect)
|
||
if tex_glyph != null:
|
||
canvas.draw_texture_rect(tex_glyph, rect, false)
|
||
else:
|
||
draw_centered_text(canvas, rect, glyph, glyph_color, maxi(18, int(ceil(rect.size.x * 0.5)))) # 字号下限 18(§7.4 冻结公式)
|
||
if badge_glyph != "":
|
||
if tex_badge != null:
|
||
canvas.draw_texture_rect(tex_badge, rect, false)
|
||
else:
|
||
_draw_badge(canvas, rect, badge_glyph)
|
||
# ④ 封印:印记由 CellUnit 封印子件(seal_mark_layer)参数化绘制——本域件零封印绘制(卡④ 法阵化)
|
||
|
||
|
||
## 数字色牌后备域(圣经 v3.5 冻结④:数字亮墨直画已开格底须垫牌;
|
||
## 牌=后备件——雷/「?」维持牌载保读性(牌上深墨族 12:1);
|
||
## 牌尺寸 0.60/0.62 格边居中;封印=未开格不垫牌)
|
||
func _draw_digit_plate(canvas: CanvasItem, rect: Rect2) -> void:
|
||
var pw := rect.size.x * 0.60
|
||
var ph := rect.size.x * 0.62
|
||
var pr := Rect2((rect.size.x - pw) * 0.5, (rect.size.x - ph) * 0.5, pw, ph)
|
||
canvas.draw_rect(pr, UiKit.DIGIT_PLATE, true)
|
||
canvas.draw_rect(pr, UiKit.DIGIT_PLATE_EDGE, false, 1.0)
|
||
|
||
|
||
## ⑤ 路径点迹 + 焦点高亮(悬停态覆盖层,不参与命中)——宿主时序器在其后插雾层
|
||
func draw_overlay_under(canvas: CanvasItem, rect: Rect2) -> void:
|
||
if dot_visible:
|
||
var ds := 6.0
|
||
canvas.draw_rect(Rect2(Vector2((rect.size.x - ds) * 0.5, (rect.size.x - ds) * 0.5), Vector2(ds, ds)), UiKit.HERO_BLUE, true)
|
||
if hl_visible:
|
||
# 悬停高亮减淡(金框太明显——绘制时 55% alpha,hl_color 属性与探针断言面不动)
|
||
canvas.draw_rect(Rect2(1, 1, rect.size.x - 2.0, rect.size.x - 2.0), Color(hl_color, 0.55), false, 2.0) # 2px 内描边
|
||
|
||
|
||
## ⑦ 中立移除退色层(退色降档:暗幕压顶全层覆盖,暗淡记忆态同族呈现语义;
|
||
## 顶层于迷雾之上——移除格不再参与迷雾语义。本实现移除集=未揭示危险格(无数字无封印印))
|
||
func draw_removed_dim(canvas: CanvasItem, rect: Rect2) -> void:
|
||
if removed_dim:
|
||
canvas.draw_rect(rect, Color(0.12, 0.10, 0.09, 0.62), true)
|
||
|
||
|
||
## 文字位绘制单点(宿主迷雾记忆态复用——同公式同字号;水平居中 + 垂直居中,基线 = (格高 − 字高)/2 + 上伸部)
|
||
func draw_centered_text(canvas: CanvasItem, rect: Rect2, text: String, col: Color, fs: int) -> void:
|
||
var f := font if font != null else ThemeDB.fallback_font
|
||
if f == null:
|
||
return
|
||
var asc := f.get_ascent(fs)
|
||
var desc := f.get_descent(fs)
|
||
canvas.draw_string(f, Vector2(0.0, (rect.size.x - (asc + desc)) * 0.5 + asc), text,
|
||
HORIZONTAL_ALIGNMENT_CENTER, rect.size.x, fs, col)
|
||
|
||
|
||
# 徽章绘制:右下角金(文字贴角内缩 2–3px)
|
||
func _draw_badge(canvas: CanvasItem, rect: Rect2, g: String) -> void:
|
||
var f := font if font != null else ThemeDB.fallback_font
|
||
if f == null:
|
||
return
|
||
var fs := maxi(10, int(rect.size.x * 0.28))
|
||
var sz := f.get_string_size(g, HORIZONTAL_ALIGNMENT_LEFT, -1, fs)
|
||
canvas.draw_string(f, Vector2(rect.size.x - sz.x - 2.0, rect.size.x - 3.0), g, HORIZONTAL_ALIGNMENT_LEFT, -1, fs, UiKit.GOLD)
|