feat(t6): flat_damage 变异格视觉标记——危险红角标+resolver 注入面

①board_cell_unit 增 mutation_mark 程序化角标(flat_damage=左下角危险红三角 0.28 格边,危险红=「开此格有代价」语义位与雷族同源;tex_mutation 纹带槽留给变异纹带六型自产批——代拍板二选一择角标待追认)
②board_view 增 set_variant_mark_resolver 只读回调(同 mask_resolver 注入先例)+_paint_cell 未开格赋值(已开=威胁已兑现标记退位;回调缺位=无标记回退态)
③main 增 _variant_mark_lookup(flat_damage 效应解析,变异数据行动零特判)+接线
④ui_input_probe 扩 case⑭(角标落位+resolver 复位断言,十三→十四断言)
轻闸=冒烟 576/0+三探针 PASS;交叉对拍=master HEAD MC 与 worktree T0 锚 400/400 逐位一致(重锚验证闭合,主区在飞文件全非行为面)
This commit is contained in:
DKChan committed 2026-09-29 04:21:26 +08:00
1 parent 6578b284b1
commit 442156bfb7
4 files changed
+57 -1

No files matched your search

+16
View File
@@ -122,6 +122,7 @@ func _build_ui() -> void:
board_view.set_identity_resolver(_identity_lookup)
# 数字遮蔽数据源:地形变异 hide_number 解析只读回调(信息型呈现——board_view 渲染面读取)
board_view.set_variant_mask_resolver(_variant_mask_lookup)
board_view.set_variant_mark_resolver(_variant_mark_lookup) # 迭代 6 T6——flat_damage 未开格角标
logger = PlaytestLogger.new()
logger.ap_per_round = int(db.action_economy.ap_per_round)
@@ -433,6 +434,21 @@ func _variant_mask_lookup(c: Vector2i) -> bool:
return false
# 地形变异 角标解析(迭代 6 T6——伤害型变异未开格视觉标记;读取方按格子变异数据行动,规则本体零特判。
# 策略纹理非数值墙:标记=玩家绕行/承担的决策输入,难度本体仍住数值包络)
func _variant_mark_lookup(c: Vector2i) -> String:
if settlement == null:
return ""
var b = settlement.minesweeper.current_board()
if b == null:
return ""
for vid in b.variant_ids(c):
var vrow: Dictionary = settlement.db.variation.row_by_id(String(vid))
if String(vrow.get("effect", "")) == "flat_damage":
return "flat_damage"
return ""
func _show_board_fx_for_node(node_type: String = "") -> void:
# Boss 遭遇变体:紫赤影子爬棋盘一次性占位演出(§2.6)
if node_type == "boss":
@@ -80,6 +80,14 @@ var tex_glyph: Texture2D = null # ③ 数字
var tex_badge: Texture2D = null # ③' 徽章
var tex_flag: Texture2D = null # ④ 旗
# 变异角标(迭代 6 T6——程序化,tex_mutation 纹带槽留给变异纹带六型自产批):
# "flat_damage" = 未开格伤害型变异,左下角危险红三角(开格有代价的策略纹理标记)
var mutation_mark := "":
set(v):
if mutation_mark != v:
mutation_mark = v
queue_redraw()
func _draw() -> void:
var rect := Rect2(Vector2.ZERO, Vector2(edge, edge))
@@ -165,6 +173,12 @@ func _draw() -> void:
# ② 变异纹带(占位批次无程序化纹带——槽位先行,终稿换入即用)
if tex_mutation != null:
draw_texture_rect(tex_mutation, rect, false)
# ②' 变异角标(迭代 6 T6):左下角危险红三角(危险红=「开此格有代价」语义位,与雷族同源;
# 尺寸随格边比例——灰色可辨辅助=红对砖面明度差,禁喧宾)
if mutation_mark == "flat_damage":
var mw := edge * 0.28
var mpts := PackedVector2Array([Vector2(0, edge - mw), Vector2(0, edge), Vector2(mw, edge)])
draw_colored_polygon(mpts, Color(UiKit.RED_MINE, 0.85))
# ③ 数字/徽章(数字 ≥ 格高 50% 墨族对格底 ≥4.5:1;徽章右下角金,遮蔽态 = "?")
if glyph != "":
# 数字色牌(原则二:数字一律垫素色直角牌——对比由牌墨承载,可读不依赖格底。
+13
View File
@@ -97,6 +97,7 @@ var _board: BoardData = null
var _minesweeper = null # 排雷玩法 只读查询引用(refresh 更新;null = 无战斗)
var _identity_cb := Callable() # 地图战斗资源 身份解析回调(组合根注入只读面)——Vector2i → Dictionary/null
var _mask_cb := Callable() # 地形变异 数字遮蔽回调(组合根注入只读面)——Vector2i → bool(true = 该格数字不显示)
var _vmark_cb := Callable() # 地形变异 角标回调(迭代 6 T6 只读面)——Vector2i → String("flat_damage"=伤害型变异未开格;""=无)
var _diggable := {} # 可挖域(8 向相邻未开格)——呼吸微光作用集
var _breath_t := 0.0
var _contact_unit: Node2D = null # 接触带承载单元(=英雄格 CellUnit;rebuild 随清场复位)
@@ -187,6 +188,12 @@ func set_variant_mask_resolver(cb: Callable) -> void:
_mask_cb = cb
# 组合根注入 地形变异 角标只读回调(迭代 6 T6——flat_damage 未开格视觉标记;变异是策略纹理非数值墙:
# 玩家可据此绕行/承担的决策输入。空 Callable = 全板无标记(缺位回退态)
func set_variant_mark_resolver(cb: Callable) -> void:
_vmark_cb = cb
# SubViewport 主题/字体显式注入挂点(Phase B 两舞台复用——SubViewport 不自动继承主场景 Control 主题;
# 本项目无自定义主题,缺省 = 引擎回退字体,与旧 Button 渲染同源)
func set_world_font(f: Font) -> void:
@@ -715,6 +722,12 @@ func _paint_cell(c: Vector2i, hero: Vector2i) -> void:
# 地面投影:北邻墙格在本已开格北缘投渐隐暗带(ITB 同款高度线索——带宽按格边比例常量)
if north_in and not _minesweeper.is_revealed(north_n):
u.proj_band = u.edge * WALL_PROJECTION_FRAC
# ②' 变异角标(迭代 6 T6):未开格带伤害型变异 → 危险红角标(已开=威胁已兑现标记退位);
# 回调缺位 = 无标记(程序化角标,tex_mutation 纹带槽留给变异纹带自产批)
if not revealed and _vmark_cb.is_valid():
u.mutation_mark = String(_vmark_cb.call(c))
else:
u.mutation_mark = ""
u.badge_glyph = _update_badge(c)
u.queue_redraw()
+14 -1
View File
@@ -293,8 +293,21 @@ func _ready() -> void:
_problems.append("case⑪ 缺位态数字格字形被破坏(glyph=%s 应=%d)" % [u11.glyph, digit11])
bv._hero_tex_idle = tex_saved
bv.refresh()
# ---- case⑭ 变异角标(迭代 6 T6——flat_damage 未开格视觉标记;resolver 注入面+落位+复位) ----
var mark_t: Vector2i = _pick_forbidden(bv, ms) # 任一未开格(禁入=未开非相邻)
if mark_t.x >= 0:
bv.set_variant_mark_resolver(func(_c): return "flat_damage")
bv.refresh()
if String(bv._cells[mark_t].mutation_mark) != "flat_damage":
_problems.append("case⑭ 变异角标未落位(mutation_mark=%s)" % str(bv._cells[mark_t].mutation_mark))
bv.set_variant_mark_resolver(Callable())
bv.refresh()
if String(bv._cells[mark_t].mutation_mark) != "":
_problems.append("case⑭ 角标未随 resolver 复位(mutation_mark=%s)" % str(bv._cells[mark_t].mutation_mark))
else:
_problems.append("case⑭ 无未开格可验(板面异常)")
if _problems.is_empty():
print("[ui_input_probe] PASS — 悬停金框/禁入信号/路径预览/flag_place/chord/dig/英雄落位/影子构成/朝向/缩格重排/缺位回退 十三断言全绿(真实 push_input 路径——⑫图上命中⑬画布拟合 2026-09-28 增)")
print("[ui_input_probe] PASS — 悬停金框/禁入信号/路径预览/flag_place/chord/dig/英雄落位/影子构成/朝向/缩格重排/缺位回退/变异角标 十四断言全绿(真实 push_input 路径——⑫图上命中⑬画布拟合 2026-09-28 增,⑭变异角标 2026-09-29 增)")
get_tree().quit(0)
else:
for p in _problems: