From fcb95f2d5a93808e8dee6905723e7132d6a242be Mon Sep 17 00:00:00 2001 From: DKChan <524912269@qq.com> Date: Sun, 4 Oct 2026 17:52:01 +0800 Subject: [PATCH 1/6] =?UTF-8?q?=E5=85=A8=E5=B1=80=E4=BD=9C=E7=94=A8?= =?UTF-8?q?=E5=9F=9F=E5=8F=98=E5=BC=82=E9=A6=96=E5=8F=91=E6=89=B9=20T1-T4?= =?UTF-8?q?=20=E6=A0=B8=E5=BF=83=E9=9D=A2=EF=BC=88=E8=BF=AD=E4=BB=A314?= =?UTF-8?q?=E2=91=A2=E5=8F=B7=E5=8D=A1=EF=BC=89=EF=BC=9Avariation=5Ftable?= =?UTF-8?q?=20=E8=AF=8D=E8=A1=A8=E6=89=A9=20resource=5Fface/always+?= =?UTF-8?q?=E4=BA=92=E9=94=81=E4=B8=89=E6=9D=A1=EF=BC=88resource=5Fface?= =?UTF-8?q?=E2=87=94global=E3=80=81global=E2=87=92any+always=EF=BC=89+effe?= =?UTF-8?q?ct=5Fvalue=20=E5=9F=9F[0,50]=EF=BC=88=E4=B8=8D=E9=80=82?= =?UTF-8?q?=E7=94=A8=20flat=5Fdamage[1,9]=EF=BC=89=EF=BC=9Bvariation.tres?= =?UTF-8?q?=20+skewed=5Fveins=20=E8=B4=AB=E7=9F=BF=E8=84=89=E8=A1=8C?= =?UTF-8?q?=EF=BC=88scope=3Dglobal/unlock=5Flevel=3D2/board=5Ftypes?= =?UTF-8?q?=E2=88=85=E9=80=9A=E9=85=8D/=E6=8A=95=E5=80=BC30=20provisional?= =?UTF-8?q?=EF=BC=89=EF=BC=9Bconfig=5Fdb=20variant=5Fpool=20=E6=89=A9?= =?UTF-8?q?=E8=8A=82=E7=82=B9=E8=BA=AB=E4=BB=BD=E7=AC=AC=E4=B8=89=E5=8F=82?= =?UTF-8?q?=EF=BC=88global=E8=A1=8C=E4=BB=85boss/elite=E5=85=A5=E6=B1=A0?= =?UTF-8?q?=EF=BC=8C=E7=BC=BA=E7=9C=81=E5=8F=8C=E5=8F=82=E8=B7=B3=E8=BF=87?= =?UTF-8?q?=E9=9B=B6=E6=89=B0=E5=8A=A8=EF=BC=89+global=5Fvariant=5Frow=20?= =?UTF-8?q?=E5=86=B3=E8=AE=AE=E8=AE=BF=E9=97=AE=E5=99=A8=EF=BC=9Bboard=5Fd?= =?UTF-8?q?ata=20+board=5Fvariants=20=E6=9D=BF=E7=BA=A7=E6=89=BF=E8=BD=BD?= =?UTF-8?q?=EF=BC=9Bbattle=5Forchestrator=20=E8=A3=85=E6=9D=BF=E5=BA=8F=20?= =?UTF-8?q?=5Fresolve=5Fglobal=5Fvariant=20=E5=89=8D=E7=BD=AE=E4=BA=8E=20r?= =?UTF-8?q?oll=5Fboard=EF=BC=88=E6=95=B0=E6=8D=AE=E4=BE=9D=E8=B5=96?= =?UTF-8?q?=EF=BC=9A=E5=81=8F=E6=96=9C=E6=97=8B=E9=92=AE=E5=85=88=E4=BA=8E?= =?UTF-8?q?=E6=91=87=E5=8F=B7=E5=AE=9A=E5=9E=8B=EF=BC=9B=E5=85=A8=E5=B1=80?= =?UTF-8?q?=E5=8F=96=E7=94=A8=E7=A1=AE=E5=AE=9A=E6=80=A7=E9=9B=B6=E5=8F=96?= =?UTF-8?q?=E5=8F=B7=EF=BC=89+=5Fplace=5Fvariants=20=E6=9B=BF=E6=8D=A2?= =?UTF-8?q?=E5=88=B6=E6=97=A9=E9=80=80=EF=BC=88boss=E5=9B=BE=E6=81=B0?= =?UTF-8?q?=E4=B8=80=E8=A1=8C=E6=9D=BF=E7=BA=A7=E5=8F=98=E5=BC=82+?= =?UTF-8?q?=E9=9B=B6region=E6=A0=BC=EF=BC=9B=E6=B1=A0=E7=A9=BA=E5=9B=9E?= =?UTF-8?q?=E8=90=BDregion=3D=E5=85=9C=E5=BA=95=EF=BC=9B=E6=99=AE=E9=80=9A?= =?UTF-8?q?=E5=9B=BE=E8=B7=AF=E5=BE=84=E9=9B=B6diff=EF=BC=89=EF=BC=9Brewar?= =?UTF-8?q?d=5Feconomy=20+board=5Fskew=20=E6=97=8B=E9=92=AE+=5Fskewed=5Fce?= =?UTF-8?q?ll=5Frows=20=E6=95=B4=E6=95=B0=E6=9C=80=E5=A4=A7=E4=BD=99?= =?UTF-8?q?=E6=95=B0=E6=8A=95=E5=BD=B1=EF=BC=88=E7=94=9F=E5=AD=98=E6=97=8F?= =?UTF-8?q?=E6=8C=89v%=E4=B8=8B=E8=B0=83=C2=B7=E8=BF=9B=E6=94=BB=E6=97=8F?= =?UTF-8?q?=E7=AD=89=E6=AF=94=E4=B8=8A=E6=B5=AE=C2=B7=E7=99=BD=E5=90=8D?= =?UTF-8?q?=E5=8D=95=E8=B1=81=E5=85=8D=C2=B7=E5=90=88=E8=AE=A1=E5=AE=88?= =?UTF-8?q?=E6=81=9277=C2=B7off=E6=80=81=E7=9B=B4=E9=80=9A=E9=9B=B6?= =?UTF-8?q?=E6=89=B0=E5=8A=A8=EF=BC=89+=5Fbiased=5Fcell=5Frows=20=E5=9F=BA?= =?UTF-8?q?=E5=BA=A7=E6=8D=A2=E6=BA=90=3D=E5=90=88=E6=88=90=E5=BA=8F?= =?UTF-8?q?=E5=9B=BE=E7=BA=A7=E5=85=88=E4=BB=B6=E7=BA=A7=E5=90=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- game/core/battle_orchestrator.gd | 29 +++++++++ game/core/board_data.gd | 7 +++ game/core/config_db.gd | 20 +++++- game/core/reward_economy.gd | 91 +++++++++++++++++++++++++++- game/data/schemas/variation_table.gd | 22 ++++++- game/data/tables/variation.tres | 18 ++++++ 6 files changed, 182 insertions(+), 5 deletions(-) diff --git a/game/core/battle_orchestrator.gd b/game/core/battle_orchestrator.gd index b0f88b79..694d9389 100644 --- a/game/core/battle_orchestrator.gd +++ b/game/core/battle_orchestrator.gd @@ -285,6 +285,11 @@ func _install_new_board(during_round := false) -> bool: var board: BoardData = _board_generator.generate(int(encounter.level_index), int(encounter.node_depth), stream, db) if board == null: return false + # 全局作用域变异决议(首发批 2026-10-04——装板序内前置于 roll_board:图级偏斜旋钮须在资源 + # 摇号前定型;全局门控与板无关〔节点身份+unlock+board_types〕,确定性取用零取号)。 + # boss/elite 图命中全局型 → 写 board_variants(_place_variants 见非空即跳 region=替换制); + # 全局池空 → 板级字段留空(_place_variants 原路走 region=兜底回落合法态)。 + _resolve_global_variant(board) var res: Dictionary = minesweeper.install_board(board, during_round) if not res.accepted: _fatal("排雷玩法 install 拒绝(不变式违例): %s" % str(res)) @@ -318,6 +323,22 @@ func _install_new_board(during_round := false) -> bool: return true +# ---- 全局作用域变异 决议(首发批 2026-10-04——装板序内 roll_board 之前)---- +# boss/elite 图命中全局型:写板级 board_variants(恰一行)+ 注入资源面偏斜旋钮(图级投影在 +# RewardEconomy.roll_board 消费);不消费 variant_place 流(全局取用确定性——零取号合法态)。 +# 全局池空(含 L1 Boss 免疫/unlock 门控未达):字段留空、旋钮归零——_place_variants 原路走 +# region 布置 = 兜底回落(保守向后兼容,防配置缺行静默裸奔——provisional)。 +func _resolve_global_variant(board: BoardData) -> void: + board.board_variants.clear() + _reward_economy.board_skew = 0 + var row: Dictionary = db.global_variant_row(int(encounter.level_index), String(board.board_type), + String(encounter.get("node_type", ""))) + if row.is_empty(): + return + board.board_variants = [String(row.variant_id)] + _reward_economy.board_skew = int(row.get("effect_value", 0)) + + # ---- 地形变异 布置段(首批类型定稿批 2026-09-19——棋盘设置顺序第 4 步)---- # 候选池门控(unlock_level ≤ 关卡序号 + board_types 与本地形交集,∅ 通配)经 config_db.variant_pool; # 池空 = 合法态,静默零布置(框架 P0 口径不变)。零特判:本段只写格子变异数据快照,不改扫雷规则本体。 @@ -327,7 +348,11 @@ func _install_new_board(during_round := false) -> bool: # (关卡序号−1)×per_level_bonus——基数为候选池而非总格数(2026-09-21 用户拍板基数修正批:初始展开 # 占全板 56–67%,总格数基数使有效密度膨胀 4–6 倍、L1 小板极端全池覆盖;percent 语义 = 占可挖格比例, # 关卡递增由 per_level_bonus 绝对格数承载);连通片生长(8 邻),单片 ≤ pack_max(2×2 / 1×4 / 1×3+1 等形)。 +# 替换制(全局作用域变异首发批 2026-10-04):板级 board_variants 非空 = 本图已带全局型,跳过 region +# 布置(每图一型的板级推广:普通图=region,Boss/精英图=global);空 = 原路径(含 Boss 图全局池空回落)。 func _place_variants(board: BoardData) -> void: + if not board.board_variants.is_empty(): + return var pool: Array = db.variant_pool(int(encounter.level_index), String(board.board_type)) if pool.is_empty(): return @@ -1155,6 +1180,10 @@ func presentation_snapshot() -> Dictionary: "hero": hero, "enemies": enemies, "hero_effects": _status_effects.query_active("hero").duplicate(true), # 值拷贝出户(code-review 2026-09-29 P2-3——快照消费方直改不渗入状态容器) + # 板级变异投影(全局作用域变异首发批 2026-10-04——呈现横幅/常驻角标唯一读取面; + # 空数组 = 无全局型合法态:普通图与全局池空回落图恒空) + "board_variants": (minesweeper.current_board().board_variant_ids().duplicate() + if minesweeper.current_board() != null else ([] as Array[String])), } diff --git a/game/core/board_data.gd b/game/core/board_data.gd index 56dd7dd7..9160f6b6 100644 --- a/game/core/board_data.gd +++ b/game/core/board_data.gd @@ -16,6 +16,8 @@ var spawn_center := Vector2i.ZERO var mines := {} # Vector2i → true var digits := {} # Vector2i → int(安全格恒有值;数字恒真 = 8 邻雷数) var variants := {} # Vector2i → Array[String](生成期快照,抗表重载) +var board_variants: Array[String] = [] # 板级变异 id 集(scope=global 整图作用域——全局作用域变异批 2026-10-04: + # 战斗编排装板决议写入,随图生灭同 variants;普通图恒空) var board_type := "" # 图类型标签(词表 v1.0:dungeon/underdark;玩家侧显示名「地图类型」) var level_index: int = 1 var node_depth: int = 0 @@ -50,6 +52,11 @@ func variant_ids(c: Vector2i) -> Array: return variants.get(c, []) +# 板级变异只读出口(scope=global 行集——呈现快照/断言消费;空 = 无全局型合法态) +func board_variant_ids() -> Array[String]: + return board_variants + + # 中和格变异(迭代 12 T6 净化工兵——伤害型地形格变普通格;🔴 R4 甲仅限伤害型的过滤在调用方) func clear_variants(c: Vector2i) -> void: variants.erase(c) diff --git a/game/core/config_db.gd b/game/core/config_db.gd index 22a2acae..3423f028 100644 --- a/game/core/config_db.gd +++ b/game/core/config_db.gd @@ -197,10 +197,16 @@ func resolve_difficulty_modifiers(L: int, D: int) -> Dictionary: # ---- 地形变异 variant_pool_gate:候选池门控(∅ board_types = 通配;2026-09-19 用户裁定字段名对齐 # board_type 词表——biome_tags 系旧观念残留退役)---- +# 门控第三维 = 节点身份(全局作用域变异首发批 2026-10-04):scope=global 行仅 boss/elite 节点入池, +# 其余节点(battle 等)静默跳过——门控兜底 P0 口径(零报错零警告);elite 系前向词位(首发零表行)。 +# node_type 缺省 "" = 旧双参调用口径(global 行跳过)——既有测试/冒烟调用零扰动。 -func variant_pool(level_index: int, board_type: String) -> Array: +func variant_pool(level_index: int, board_type: String, node_type: String = "") -> Array: var pool: Array[Dictionary] = [] for row in variation.rows: + if String(row.get("scope", "region")) == "global" \ + and node_type != "boss" and node_type != "elite": + continue if int(row.get("unlock_level", 999)) > level_index: continue var tags: Array = row.get("board_types", []) @@ -212,6 +218,18 @@ func variant_pool(level_index: int, board_type: String) -> Array: return pool +# 全局型单行决议(战斗编排装板期消费——访问器纪律:消费面禁直扫表): +# boss/elite 节点取候选池内首个 scope=global 行(首发批全局池恒恰一行;多行为配置越界态, +# 按表序取首行确定性兜底);空 = 无全局型(调用方回落 region 布置——兜底回落合法态) +func global_variant_row(level_index: int, board_type: String, node_type: String) -> Dictionary: + if node_type != "boss" and node_type != "elite": + return {} + for row in variant_pool(level_index, board_type, node_type): + if String(row.get("scope", "region")) == "global": + return row + return {} + + func status_effect_row(effect_id: String) -> Dictionary: return status_effects.row_by_id(effect_id) diff --git a/game/core/reward_economy.gd b/game/core/reward_economy.gd index 55f53d8c..09d9de60 100644 --- a/game/core/reward_economy.gd +++ b/game/core/reward_economy.gd @@ -179,13 +179,25 @@ var luck_bias: int = 0 # 稀有正向资源 kinds(底稿 §3——权重投影面,池结构零触碰) const LUCK_BIAS_KINDS := ["heal", "gp", "pierce", "magic"] +# 图级偏斜旋钮(全局作用域变异首发批 2026-10-04——battle_orchestrator 装板决议注入,全局型行 +# effect_value 语义=生存族权重下调百分比;0 = 中性 off 态。每板决议时显式重置/写入) +var board_skew: int = 0 + +# 偏斜族(任务书 §二:进攻族等比上浮/生存族按 v% 下调/白名单豁免恒不动——判定键=cell_type; +# 其余 cell_type(weaken/gp/action 白名单与未来扩型)= 豁免;负向行不入摇号已在 _rollable_rows 滤除) +const SKEW_DOWN_KINDS := ["heal", "defense"] +const SKEW_UP_KINDS := ["attack", "blast", "pierce", "magic"] + # 偏运硬币权重投影(底稿 §3:只动池内权重、雷安仍同池同分布;luck_bias=0 逐位返回原行集——off 态零扰动) +# 基座换源(首发批 2026-10-04):先经图级偏斜投影再叠件级加法——合成序锚=图级先、件级后 +#(环境事实先定型、玩家构筑叠其上;两投影均为池内权重面,雷安同池与取号次数零变化) func _biased_cell_rows() -> Array: + var base: Array = _skewed_cell_rows() if luck_bias <= 0: - return _rollable_rows() + return base var out: Array = [] - for row in _rollable_rows(): + for row in base: if LUCK_BIAS_KINDS.has(String(row.get("cell_type", ""))): var biased: Dictionary = row.duplicate() biased["weight"] = int(row.weight) + luck_bias @@ -195,6 +207,81 @@ func _biased_cell_rows() -> Array: return out +# 图级资源面偏斜投影(首发批 T3——整数最大余数法:生存族按 board_skew% 下调,下调量按进攻族 +# 原权重比例整数重分配,合计恒等于原池合计 77;负向行与白名单三行逐位不动)。 +# board_skew<=0 逐位返回原行集 = off 态零扰动第一断言:不进投影域、行集/行序/取号域与基线逐位同。 +func _skewed_cell_rows() -> Array: + if board_skew <= 0: + return _rollable_rows() + var base: Array = _rollable_rows() + var down: Array = [] + var up: Array = [] + for row in base: + var k := String(row.get("cell_type", "")) + if SKEW_DOWN_KINDS.has(k): + down.append(row) + elif SKEW_UP_KINDS.has(k): + up.append(row) + if down.is_empty() or up.is_empty(): + return base # 结构缺族 = 无偏斜作用面(保守直通——池结构变更须走表加载校验另批) + var v := board_skew + # 下调总量 = round_half_up(Σ生存×v/100);逐行精确份额 w×v/100 最大余数取整(行序平局) + var drops := _largest_remainder_split(down, v, 100, (2 * _pool_weight(down) * v + 100) / 200) + # 上浮总量 = 下调总量(守恒),逐行精确份额 drop×w/Σ进攻 最大余数取整 + var gains := _largest_remainder_split(up, drops_total(drops), _pool_weight(up), drops_total(drops)) + var di := 0 + var ui := 0 + var out: Array = [] + for row in base: + var k := String(row.get("cell_type", "")) + var w := int(row.weight) + if SKEW_DOWN_KINDS.has(k): + w -= drops[di] + di += 1 + elif SKEW_UP_KINDS.has(k): + w += gains[ui] + ui += 1 + assert(w > 0, "图级偏斜投影产生非正权重(池结构变更须走另批重审)") + var skewed: Dictionary = row.duplicate() + skewed["weight"] = w + out.append(skewed) + assert(_pool_weight(out) == _pool_weight(base), "图级偏斜守恒破(偏斜后合计须等于原池)") + return out + + +func drops_total(amounts: Array[int]) -> int: + var t := 0 + for a in amounts: + t += a + return t + + +# 最大余数整数分摊(行序平局——确定性):把 total 单位按精确份额 w_i×numer/denom 分到 rows +# (floor 后余数单位依次给分数最大者,平局取行序在前)——Σ结果恒 = total +static func _largest_remainder_split(rows: Array, numer: int, denom: int, total: int) -> Array[int]: + var floors: Array[int] = [] + var fracs: Array[int] = [] + var used := 0 + for row in rows: + var exact: int = int(row.weight) * numer + floors.append(int(exact / denom)) + fracs.append(exact % denom) + used += int(exact / denom) + var order: Array[int] = [] + for i in rows.size(): + order.append(i) + order.sort_custom(func(a: int, b: int) -> bool: + if fracs[a] != fracs[b]: + return fracs[a] > fracs[b] + return a < b) + var out: Array[int] = floors + var rest: int = total - used + assert(rest >= 0 and rest <= order.size(), "最大余数分摊余数越界(不应可达)") + for j in rest: + out[order[j]] += 1 + return out + + func weighted_pick(rows: Array, r: int) -> String: var total := _pool_weight(rows) assert(r >= 0 and r < total, "weighted_pick 取号越域(纯函数域守卫)") diff --git a/game/data/schemas/variation_table.gd b/game/data/schemas/variation_table.gd index ce5199a3..f8b19d63 100644 --- a/game/data/schemas/variation_table.gd +++ b/game/data/schemas/variation_table.gd @@ -20,8 +20,10 @@ extends Resource @export var pack_max: int = 4 const SCOPES := ["region", "global"] -const EFFECTS := ["none", "flat_damage", "hide_number"] # 效果词表:直伤 / 数字遮蔽(可扩充) -const TRIGGERS := ["on_open", "on_number_shown"] # 触发词表:被打开即触发 / 打开且显示数字时触发(可扩充) +# resource_face = 资源面偏斜(全局作用域变异首发批 2026-10-04——整图修摇号分布:生存族按 effect_value% +# 下调、进攻族等比上浮重归一,不动任何格子数据;effect_value 语义随行域切换,不适用 flat_damage [1,9]) +const EFFECTS := ["none", "flat_damage", "hide_number", "resource_face"] # 效果词表:直伤 / 数字遮蔽 / 资源面偏斜(可扩充) +const TRIGGERS := ["on_open", "on_number_shown", "always"] # 触发词表:被打开即触发 / 打开且显示数字时触发 / 板级恒在无触发时机(可扩充) const PLACEMENTS := ["closed_only", "any"] # 布置约束词表:只落布置时未开格 / 任意格(可扩充) @@ -65,6 +67,22 @@ func validate() -> Array: errs.append({"category": "cross_field", "message": "%s hide_number ⇒ trigger 必为 on_number_shown" % vid}) # 信息遮蔽型只允许落安全格(遮蔽对象是数字;雷格无数字可遮)——placement=any 时由读取方 # 呈现面按 kind=safe 自然短路,此处不设布置约束 + # 全局作用域型互锁(2026-10-04 首发批——resource_face ⟺ scope=global 三条 + 新值域; + # 判定键=effect/scope 词值,既有六 region 行(flat_damage/hide_number)不入本组——零误伤) + if row.get("effect", "") == "resource_face": + if row.get("scope", "") != "global": + errs.append({"category": "cross_field", "message": "%s resource_face ⇒ scope 必为 global(整图作用域)" % vid}) + # resource_face 行 effect_value = 生存族权重下调百分比(0=中性合法态——off 锚用) + var gev: int = int(row.get("effect_value", 0)) + if gev < 0 or gev > 50: + errs.append({"category": "domain", "message": "%s effect_value 越域 [0,50](资源面偏斜百分比): %d" % [vid, gev]}) + if row.get("scope", "") == "global": + if row.get("effect", "") != "resource_face": + errs.append({"category": "cross_field", "message": "%s scope=global ⇒ effect 必为 resource_face" % vid}) + if row.get("placement", "") != "any": + errs.append({"category": "cross_field", "message": "%s scope=global ⇒ placement 必为 any(整图无格子布置域)" % vid}) + if row.get("trigger", "") != "always": + errs.append({"category": "cross_field", "message": "%s scope=global ⇒ trigger 必为 always(板级恒在,无触发时机)" % vid}) return errs diff --git a/game/data/tables/variation.tres b/game/data/tables/variation.tres index 3d0895dd..d60de9b2 100644 --- a/game/data/tables/variation.tres +++ b/game/data/tables/variation.tres @@ -73,6 +73,17 @@ rows = [{ "placement": "any", "board_types": ["deep_underdark"], "counter_items": [] +}, { +"variant_id": "skewed_veins", +"display_name": "贫矿脉", +"unlock_level": 2, +"scope": "global", +"effect": "resource_face", +"effect_value": 30, +"trigger": "always", +"placement": "any", +"board_types": [], +"counter_items": [] }] ; 地形变异 首批类型定稿批(2026-09-19 用户拍板)——四行两轴×两关: @@ -98,3 +109,10 @@ rows = [{ ; 变异密度 9%→4%、完美 L3 0→34%,L3 无带记观察态;行值 provisional→正式随迭代 5 出口人闸追认)。 ; M-3 迭代 5 返工批(2026-09-29 U2 推翻 C3 裁 C1 两刀):percent_of_cells 4→5 回退;岩浆 1 与 per_level_bonus 0 维持——C1 终态; ; C1+v1 AC 组合读数归返工批全量确认(裁断全录 design/qa/m3-iter5-u2-gate-2026-09-29.md)。 +; +; 全局作用域变异首发批(2026-10-04,迭代 14 ③号卡):skewed_veins 贫矿脉——首发型 scope=global +; 案A 资源面·微贫向偏斜(P2+Q1 裁决):L2/L3 Boss 图恒定一型整图变异(P4 甲恒定制;board_types ∅ +; 通配,L2/L3 双关同型由 unlock_level=2+门控节点身份承载——Q2 甲),替换制:带全局型的 Boss 图不再 +; 布 region 片(P3 甲);effect_value=30=生存族权重下调百分比(provisional 调参项,域 [0,50], +; 0=中性 off 锚;总期望微降 3-5% 为 provisional 设计目标,精确方向与幅度归读数批只测不判); +; trigger=always=板级恒在无触发时机。行值全 provisional 归出口追认单。 From f8517399a761a25b7fd0298266bcd103e72f6395 Mon Sep 17 00:00:00 2001 From: DKChan <524912269@qq.com> Date: Sun, 4 Oct 2026 17:52:42 +0800 Subject: [PATCH 2/6] =?UTF-8?q?=E5=85=A8=E5=B1=80=E4=BD=9C=E7=94=A8?= =?UTF-8?q?=E5=9F=9F=E5=8F=98=E5=BC=82=E9=A6=96=E5=8F=91=E6=89=B9=20T5=20?= =?UTF-8?q?=E5=91=88=E7=8E=B0=E4=B8=89=E5=B1=82=EF=BC=88=E8=BF=AD=E4=BB=A3?= =?UTF-8?q?14=E2=91=A2=E5=8F=B7=E5=8D=A1=EF=BC=89=EF=BC=9Asettlement=5Ffx?= =?UTF-8?q?=5Fview=20+play=5Fboard=5Fvariant=5Fbanner=EF=BC=88=E8=BD=AE?= =?UTF-8?q?=E6=A8=AA=E5=B9=85=E5=85=88=E4=BE=8B=E5=90=8C=E6=AC=BE=E2=80=94?= =?UTF-8?q?=E2=80=94=E5=87=8F=E5=8A=A8=E6=95=88=3D=E9=9D=99=E6=80=81?= =?UTF-8?q?=E9=A9=BB=E7=95=99=E5=8F=8C=E6=80=81=EF=BC=9B=E8=BD=AE=E6=A8=AA?= =?UTF-8?q?=E5=B9=85=E4=B8=8B=E6=96=B9=E5=8F=A0=E8=A1=8C=E4=BD=8D=EF=BC=89?= =?UTF-8?q?=EF=BC=9Bhero=5Finfo=5Fpanel=5Fview=20+=E5=9C=B0=E5=BD=A2?= =?UTF-8?q?=E5=8F=98=E5=BC=82=E5=B8=B8=E9=A9=BB=E8=A7=92=E6=A0=87=E6=AE=B5?= =?UTF-8?q?=EF=BC=88=E6=B5=81=E6=B4=BE=E4=BB=B6=E6=AE=B5=E5=85=88=E4=BE=8B?= =?UTF-8?q?=E2=80=94=E2=80=94=E7=A9=BA=E6=80=81=E6=95=B4=E8=8A=82=E9=9A=90?= =?UTF-8?q?=E8=97=8F=EF=BC=8C=E6=91=86=E4=BD=8Dprovisional=E5=BD=92HUD?= =?UTF-8?q?=E6=A1=86=E6=9E=B6=E6=89=B9=EF=BC=89=EF=BC=9Bhud=5Fpresenter=20?= =?UTF-8?q?+board=5Fvariant=5Flines=20=E6=96=87=E6=A1=88=E8=A3=85=E9=85=8D?= =?UTF-8?q?+refresh=20=E6=8E=A5=E7=BA=BF=EF=BC=88=E5=BF=AB=E7=85=A7=20boar?= =?UTF-8?q?d=5Fvariants=20=E6=8A=95=E5=BD=B1=E2=80=94=E2=80=94=E6=A0=B8?= =?UTF-8?q?=E5=BF=83=E2=86=92=E5=91=88=E7=8E=B0=E5=94=AF=E4=B8=80=E8=AF=BB?= =?UTF-8?q?=E5=8F=96=E9=9D=A2=EF=BC=9B=E5=87=BA=E6=88=98=E6=96=97=E5=8D=B3?= =?UTF-8?q?=E9=9A=90=EF=BC=89=EF=BC=9Bpresentation=5Fsnapshot=20+board=5Fv?= =?UTF-8?q?ariants=20=E6=8A=95=E5=BD=B1=E5=AD=97=E6=AE=B5=EF=BC=9Bmain.gd?= =?UTF-8?q?=20=5Fon=5Fround=5Fstarted=20=E9=A6=96=E8=BD=AE=E5=BF=AB?= =?UTF-8?q?=E7=85=A7=E5=88=A4=E7=A9=BA=E5=8F=91=E5=B0=84=E5=BC=80=E6=88=98?= =?UTF-8?q?=E6=A8=AA=E5=B9=85=EF=BC=88=E6=99=AE=E9=80=9A=E5=9B=BE=E6=81=92?= =?UTF-8?q?=E9=9B=B6=E5=8F=91=E5=B0=84=EF=BC=89=EF=BC=9Bui=5Fassembler=20?= =?UTF-8?q?=E7=8E=A9=E6=B3=95=E5=B8=AE=E5=8A=A9=E5=9D=97=20+=E6=95=B4?= =?UTF-8?q?=E5=9B=BE=E5=8F=98=E5=BC=82=E8=AF=B4=E6=98=8E=E8=A1=8C=EF=BC=88?= =?UTF-8?q?=E6=95=99=E5=AD=A6=E5=AE=9A=E7=A8=BF=E6=89=B9=20P4=E4=B8=99?= =?UTF-8?q?=E3=80=8C=E6=89=8B=E5=86=8C=E9=9B=B6=E5=86=8D=E6=95=99=E3=80=8D?= =?UTF-8?q?=E6=89=BF=E8=BD=BD=E4=BD=8D=EF=BC=8C=E9=9B=B6=E4=BA=A4=E4=BA=92?= =?UTF-8?q?=E6=95=99=E5=AD=A6=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- game/presentation/hud_presenter.gd | 17 +++++++++++ game/presentation/main.gd | 8 +++++ game/presentation/ui_assembler.gd | 2 +- .../views/hero_info_panel_view.gd | 23 +++++++++++++++ game/presentation/views/settlement_fx_view.gd | 29 +++++++++++++++++++ 5 files changed, 78 insertions(+), 1 deletion(-) diff --git a/game/presentation/hud_presenter.gd b/game/presentation/hud_presenter.gd index 30a89efa..028fc4fc 100644 --- a/game/presentation/hud_presenter.gd +++ b/game/presentation/hud_presenter.gd @@ -41,9 +41,13 @@ static func refresh(stage: BattleStageView, info: HeroInfoPanelView, ap_bar: ApB else: info.set_relic_holdings([]) if settlement == null: + info.set_board_variants([]) # 战斗域角标出战斗即隐(首发批 2026-10-04——空态纪律) _refresh_out_of_battle(stage, info, ap_bar, runner, level_active, db) return var s: Dictionary = settlement.presentation_snapshot() + # 地形变异常驻角标投影(全局作用域变异首发批 2026-10-04——板级变异快照 → 文案行; + # 空态隐藏=流派件段先例;战斗全程常驻防中局遗忘) + info.set_board_variants(board_variant_lines(db, s.get("board_variants", []))) var hero: Dictionary = s.hero if hero.is_empty() or not bool(hero.get("alive", false)): _refresh_out_of_battle(stage, info, ap_bar, runner, level_active, db) @@ -109,6 +113,19 @@ static func relic_holdings_lines(db, held: Array) -> Array[String]: return rlines +# 地形变异常驻角标文案(全局作用域变异首发批 2026-10-04——板级变异 id → display_name 行; +# 空集 = 空数组=空态隐藏。体感短语 provisional 归本地化批) +static func board_variant_lines(db, ids: Array) -> Array[String]: + var lines: Array[String] = [] + if db == null or db.variation == null: + return lines + for vid in ids: + var row: Dictionary = db.variation.row_by_id(String(vid)) + if not row.is_empty(): + lines.append("%s · 奶薄枪肥" % String(row.get("display_name", vid))) + return lines + + # ---- 战斗收尾反馈与结算视觉同步(T3 HUD 单通道批 2026-10-02——组合根直改视图收敛入此) ---- # battle_over 收尾反馈:死亡兜底灰化 → 主角态回 idle → RAP 清零脉冲(调试收尾路)→ 状态全清可见反馈。 diff --git a/game/presentation/main.gd b/game/presentation/main.gd index baca32f8..cf38bbc7 100644 --- a/game/presentation/main.gd +++ b/game/presentation/main.gd @@ -764,6 +764,14 @@ func _on_round_started(ri: int) -> void: else: _row_pacer.enqueue({"__round_line": ri}) settlement_fx.play_round_banner(ri) + # 开战横幅——板级地形变异预告(全局作用域变异首发批 2026-10-04):首轮快照 board_variants + # 非空才发射(Boss 图恒带一型=替换制;普通图空快照零发射);轮横幅下方叠行,view 内判减动效。 + if ri == 1 and settlement != null: + var bvs: Array = settlement.presentation_snapshot().get("board_variants", []) + if not bvs.is_empty(): + var vlines: Array[String] = HudPresenter.board_variant_lines(db, bvs) + if not vlines.is_empty(): + settlement_fx.play_board_variant_banner("地形变异 · " + vlines[0]) _refresh_used_round = 0 _refresh_presentations() diff --git a/game/presentation/ui_assembler.gd b/game/presentation/ui_assembler.gd index a790725f..50cb9a13 100644 --- a/game/presentation/ui_assembler.gd +++ b/game/presentation/ui_assembler.gd @@ -150,7 +150,7 @@ static func build_start_overlay(host: Control, db = null) -> Dictionary: box.add_child(quitbtn) # 玩法帮助文案(表值驱动——2026-09-16 AP 压速批遗留硬编码 8 随手修正;护甲等级掷点批同步"减伤"→"护甲强化") - var help_text := "玩法:每轮 %d AP——挖开(1AP)/插旗(1AP)/移动(免费)/连锁(免费)。\n每个非封锁格都藏一种格面资源(增伤/护甲强化/回血/爆裂/削弱)。开安全格、标中雷 = 正向兑付;\n开雷格、标错安全格 = 负向兑付——全部在轮末结算逐行兑现;吃掷点的基础攻击按护甲等级判定,无 miss、最低保底 1 点。\n停手:剩余 AP 转存 RAP;弃图刷新:RAP−%d 当场换图继续挖(每轮剩 %d 次)。\n敌人全灭胜、主角倒下负。悬停可看三态光标与可挖域微光。" % [ + var help_text := "玩法:每轮 %d AP——挖开(1AP)/插旗(1AP)/移动(免费)/连锁(免费)。\n每个非封锁格都藏一种格面资源(增伤/护甲强化/回血/爆裂/削弱)。开安全格、标中雷 = 正向兑付;\n开雷格、标错安全格 = 负向兑付——全部在轮末结算逐行兑现;吃掷点的基础攻击按护甲等级判定,无 miss、最低保底 1 点。\n停手:剩余 AP 转存 RAP;弃图刷新:RAP−%d 当场换图继续挖(每轮剩 %d 次)。\n敌人全灭胜、主角倒下负。悬停可看三态光标与可挖域微光。\n地形变异:第二关起 Boss 图带整图变异(贫矿脉——奶变薄、枪变肥;开战横幅与 HUD 角标常驻提示)。" % [ int(db.action_economy.ap_per_round), int(db.action_economy.rap_refresh_cost), int(db.action_economy.refresh_cap_per_round)] # 字号下限(v3.5 批 B3——正文 ≥16);对比度修复(v3.5 批 B3——WARM_FAINT 对深石底实测 2.58:1→暖白 ≥6:1;暗底双色墨制) var help := UiKit.label(help_text, 16, false, UiKit.WARM) diff --git a/game/presentation/views/hero_info_panel_view.gd b/game/presentation/views/hero_info_panel_view.gd index 4e6f39fb..513a7701 100644 --- a/game/presentation/views/hero_info_panel_view.gd +++ b/game/presentation/views/hero_info_panel_view.gd @@ -23,6 +23,8 @@ var _bonus_section: VBoxContainer # 本关强化(预留——空态 var _bonus_list: VBoxContainer var _relic_section: VBoxContainer # 流派件持有段(迭代 12 呈现补齐——空态隐藏) var _relic_list: VBoxContainer +var _board_variant_section: VBoxContainer # 地形变异常驻角标(全局作用域变异首发批——空态隐藏) +var _board_variant_list: VBoxContainer func _init() -> void: @@ -79,6 +81,16 @@ func _init() -> void: _relic_list = VBoxContainer.new() _relic_list.add_theme_constant_override("separation", 2) _relic_section.add_child(_relic_list) + # 地形变异常驻角标(全局作用域变异首发批 2026-10-04——Boss 图整图型战斗全程可见防中局遗忘; + # 空态整节隐藏=流派件段先例;摆位/文案 provisional 归 HUD 框架批与本地化批) + _board_variant_section = VBoxContainer.new() + _board_variant_section.add_theme_constant_override("separation", 4) + _board_variant_section.visible = false + col.add_child(_board_variant_section) + _board_variant_section.add_child(UiKit.label("地形变异", 16, true)) + _board_variant_list = VBoxContainer.new() + _board_variant_list.add_theme_constant_override("separation", 2) + _board_variant_section.add_child(_board_variant_list) # 本关强化(预留):锻造/大奖励/关卡奖励节点的属性提升——中循环数据因改变战斗数学准入; # 与战斗内状态效果(B 区站桩,随战斗消散)分区,防「战斗结束被清」误读;空态整节隐藏 _bonus_section = VBoxContainer.new() @@ -112,6 +124,17 @@ func set_relic_holdings(lines: Array) -> void: _relic_section.visible = not lines.is_empty() +# 地形变异常驻角标(首发批 2026-10-04):lines = 文案行(板级变异 display_name+体感短语)——空数组 = 整节隐藏 +func set_board_variants(lines: Array) -> void: + for c3 in _board_variant_list.get_children(): + _board_variant_list.remove_child(c3) + c3.queue_free() + for line in lines: + var l3 := UiKit.label(String(line), 16, false, COL_INK) + _board_variant_list.add_child(l3) + _board_variant_section.visible = not lines.is_empty() + + # 本关强化列表(预留接线面):lines = 文案行数组(如「锻造 +2 攻击」)——空数组 = 整节隐藏 func set_level_bonuses(lines: Array) -> void: for c in _bonus_list.get_children(): diff --git a/game/presentation/views/settlement_fx_view.gd b/game/presentation/views/settlement_fx_view.gd index 5221032a..067d3a01 100644 --- a/game/presentation/views/settlement_fx_view.gd +++ b/game/presentation/views/settlement_fx_view.gd @@ -147,3 +147,32 @@ func play_round_banner(ri: int) -> void: tw.tween_interval(UiKit.motion(BANNER_DWELL)) tw.tween_property(banner, "modulate:a", 0.0, UiKit.motion(0.25)) tw.tween_callback(banner.queue_free) + + +# 开战横幅——板级地形变异预告(全局作用域变异首发批 2026-10-04):board_variants 非空时开战 +# 显示一行(文本=「地形变异 · 贫矿脉」式);减动效=静态驻留后即隐(轮横幅先例——行呈现不跳过)。 +# 文案/驻留参数 provisional 归本地化批;普通图恒不发射(组合根按快照 board_variants 空判)。 +func play_board_variant_banner(text: String) -> void: + _fx_banners += 1 + var banner := Panel.new() + banner.mouse_filter = Control.MOUSE_FILTER_IGNORE + banner.add_theme_stylebox_override("panel", UiKit.panel_flat(Color(UiKit.BG_OVERLAY, 0.88), UiKit.GOLD_DEEP, 8, 2)) + var lab := UiKit.label(text, 22, true, UiKit.GOLD) + lab.set_anchors_and_offsets_preset(Control.PRESET_FULL_RECT) + lab.horizontal_alignment = HORIZONTAL_ALIGNMENT_CENTER + lab.vertical_alignment = VERTICAL_ALIGNMENT_CENTER + banner.add_child(lab) + banner.size = Vector2(320, 46) + banner.position = Vector2((size.x - banner.size.x) * 0.5, size.y * 0.30 + 52.0) # 轮横幅下方叠行(首轮同刻两横幅不重叠) + banner.z_index = 4 + add_child(banner) + if UiKit.motion_scale < 1.0: + var st := get_tree().create_timer(BANNER_DWELL) + st.timeout.connect(banner.queue_free) + return + banner.modulate.a = 0.0 + var tw := banner.create_tween() + tw.tween_property(banner, "modulate:a", 1.0, UiKit.motion(0.15)) + tw.tween_interval(UiKit.motion(BANNER_DWELL)) + tw.tween_property(banner, "modulate:a", 0.0, UiKit.motion(0.25)) + tw.tween_callback(banner.queue_free) From d8dc9b42a11652d50fe935b319d3bf625914592b Mon Sep 17 00:00:00 2001 From: DKChan <524912269@qq.com> Date: Sun, 4 Oct 2026 17:52:50 +0800 Subject: [PATCH 3/6] =?UTF-8?q?=E5=85=A8=E5=B1=80=E4=BD=9C=E7=94=A8?= =?UTF-8?q?=E5=9F=9F=E5=8F=98=E5=BC=82=E9=A6=96=E5=8F=91=E6=89=B9=20T6=20?= =?UTF-8?q?=E6=96=87=E6=A1=A3=E4=B8=83=E6=AD=A3=E4=B8=BB=EF=BC=88=E8=BF=AD?= =?UTF-8?q?=E4=BB=A314=E2=91=A2=E5=8F=B7=E5=8D=A1=EF=BC=89=EF=BC=9A?= =?UTF-8?q?=E5=9C=B0=E5=BD=A2=E5=8F=98=E5=BC=82.md=20v0.7=EF=BC=88?= =?UTF-8?q?=E7=B1=BB=E5=9E=8B=E6=B8=85=E5=8D=95+=E8=B4=AB=E7=9F=BF?= =?UTF-8?q?=E8=84=89=E8=A1=8C/=C2=A7=E5=85=A8=E5=B1=80=E4=BD=9C=E7=94=A8?= =?UTF-8?q?=E5=9F=9F=E5=9E=8B=E8=AF=AD=E4=B9=89=E8=8A=82=E3=80=94=E6=9D=BF?= =?UTF-8?q?=E7=BA=A7=E6=89=BF=E8=BD=BD=C2=B7=E6=9B=BF=E6=8D=A2=E5=88=B6?= =?UTF-8?q?=C2=B7=E5=85=9C=E5=BA=95=E5=9B=9E=E8=90=BD=C2=B7=E6=81=92?= =?UTF-8?q?=E5=AE=9A=E5=88=B6=C2=B7=E8=B5=84=E6=BA=90=E9=9D=A2=E5=81=8F?= =?UTF-8?q?=E6=96=9C=C2=B7=E4=B8=89=E5=B1=82=E9=A2=84=E5=91=8A=E3=80=95/?= =?UTF-8?q?=E3=80=8C=E6=AF=8F=E5=9B=BE=E4=B8=80=E5=9E=8B=E3=80=8D=E6=9D=BF?= =?UTF-8?q?=E7=BA=A7=E6=8E=A8=E5=B9=BF/=E5=80=99=E9=80=89=E6=B1=A0?= =?UTF-8?q?=E9=97=A8=E6=8E=A7=E7=AC=AC=E4=B8=89=E7=BB=B4/=E5=B8=83?= =?UTF-8?q?=E7=BD=AE=E6=AE=B5=E5=85=A8=E5=B1=80=E5=86=B3=E8=AE=AE=E5=89=8D?= =?UTF-8?q?=E7=BD=AE=E6=B3=A8=E8=AE=B0/=E8=B0=83=E5=8F=82=E8=A1=A8+?= =?UTF-8?q?=E9=AA=8C=E6=94=B6/P1P2=E8=A1=A8Alpha=E8=A1=8C=E6=8D=A2?= =?UTF-8?q?=E4=BB=A3=3D=E6=92=A42026-09-19=E7=95=99Alpha=E6=8C=82=E8=B5=B7?= =?UTF-8?q?/=E7=89=88=E6=9C=AC=E5=8F=B2+Q3=E7=9F=A5=E6=83=85=E4=BB=A3?= =?UTF-8?q?=E4=BB=B7=E6=B3=A8=E8=AE=B0=EF=BC=89=EF=BC=9B=E9=9A=BE=E5=BA=A6?= =?UTF-8?q?=E6=9B=B2=E7=BA=BF=E4=B8=8EBoss.md=EF=BC=88P2=E5=85=A8=E5=B1=80?= =?UTF-8?q?=E6=8A=95=E6=94=BE=E8=AE=A1=E5=88=92=E8=A1=8C=E5=8D=87=E7=BA=A7?= =?UTF-8?q?=E7=8E=B0=E8=A1=8C+=E8=B0=83=E5=8F=82=E8=A1=A8=20resource=5Ffac?= =?UTF-8?q?e=20=E8=A1=8C=3D=E5=B8=A6A=E6=B3=A8=E5=86=8CM-4=E7=A6=81?= =?UTF-8?q?=E7=8B=AC=E7=AB=8B=E8=B0=83=E5=8F=82=EF=BC=89=EF=BC=9Bregistry?= =?UTF-8?q?=3Darchitecture.md=20variation=20=E8=A1=8C=E6=8D=A2=E4=BB=A3?= =?UTF-8?q?=EF=BC=887=E8=A1=8C+=E4=B8=89=E7=BB=B4=E9=97=A8=E6=8E=A7+?= =?UTF-8?q?=E5=86=B3=E8=AE=AE=E8=AE=BF=E9=97=AE=E5=99=A8=EF=BC=89=EF=BC=9B?= =?UTF-8?q?HUD=E6=A1=86=E6=9E=B6.md=20v0.13=EF=BC=88=E4=B9=89=E5=8A=A1?= =?UTF-8?q?=E6=9D=A5=E6=BA=90=E6=B8=85=E5=8D=95+=E5=9C=B0=E5=BD=A2?= =?UTF-8?q?=E5=8F=98=E5=BC=82=E8=A1=8C=E4=B8=89=E5=B1=82=E9=A2=84=E5=91=8A?= =?UTF-8?q?+=E9=AA=8C=E6=94=B6=E7=BA=BF=EF=BC=89=EF=BC=9B=E6=95=99?= =?UTF-8?q?=E5=AD=A6=E5=BC=95=E5=AF=BC.md=20v0.4=EF=BC=88+Boss=E5=9B=BE?= =?UTF-8?q?=E6=95=B4=E5=9B=BE=E5=8F=98=E5=BC=82=E8=AF=B4=E6=98=8E=E8=A1=8C?= =?UTF-8?q?=E6=9D=A1=E7=9B=AE=EF=BC=89=EF=BC=9B=E8=A1=8C=E5=8A=A8=E7=BB=8F?= =?UTF-8?q?=E6=B5=8E.md=EF=BC=88P2=E5=9C=B0=E5=BD=A2=E6=88=90=E6=9C=AC?= =?UTF-8?q?=E4=BF=AE=E9=A5=B0=E4=BB=B7=E7=9B=AE=E9=92=A9=E5=AD=90=3D?= =?UTF-8?q?=E6=A1=88D=E7=95=99=E4=BD=8D=E4=B8=8D=E5=90=AF=E7=94=A8?= =?UTF-8?q?=E6=B3=A8=E8=AE=B0=EF=BC=89=EF=BC=9B06=E3=80=8C=E5=85=A8?= =?UTF-8?q?=E5=B1=80=E4=BD=9C=E7=94=A8=E5=9F=9F=E5=8F=98=E5=BC=82=E3=80=8D?= =?UTF-8?q?=E6=9D=A1=E8=A7=A3=E5=86=B3=E7=A7=BB=E9=99=A4=EF=BC=88=E5=8E=BB?= =?UTF-8?q?=E5=90=91=3D=E6=9C=AC=E6=89=B9=E5=8F=B0=E8=B4=A6+git=E5=8E=86?= =?UTF-8?q?=E5=8F=B2=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- design/dev/architecture/architecture.md | 2 +- design/gdd/06-待办清单.md | 8 ---- design/gdd/systems/冒险循环/难度曲线与Boss.md | 3 +- design/gdd/systems/排雷循环/地形变异.md | 41 +++++++++++++------ design/gdd/systems/排雷循环/行动经济.md | 2 +- design/gdd/systems/表现与支撑/HUD框架.md | 3 ++ design/gdd/systems/表现与支撑/教学引导.md | 2 + 7 files changed, 37 insertions(+), 24 deletions(-) diff --git a/design/dev/architecture/architecture.md b/design/dev/architecture/architecture.md index bfbf859b..875be411 100644 --- a/design/dev/architecture/architecture.md +++ b/design/dev/architecture/architecture.md @@ -91,7 +91,7 @@ | **ConfigDB**(autoload,D2) | 全部玩法数值表(`data/tables/*.tres` + `data/schemas/*.gd`);SCHEMA_VERSION;加载/校验/override/诊断状态机 | 类型化属性读取;`load_tables(root, collect_only)`;`resolve()`(R1 floor);debug override;`set_reload_gate()`;诊断收集器 | 无(Foundation 顶点) | Resource/.tres 加载、autoload 生命周期——LOW | | **RngService**(autoload,D2) | master_seed、各流 scope 计数器(封闭流:board_gen / reward_roll;增流走 P1 评审) | `set_master_seed()`(唯一调用方 C2);`open_stream(stream)` 有状态门面;`derive_at(stream, scope)` 纯函数;只读计数器 | ConfigDB(无) | 无——纯逻辑 | | **action_economy**(A3) | AP/RAP 账本、last_round_end、轮次相位机 {Idle, Active, Waiting}、结束仲裁 | 8 API 全布尔面:notify_round_start / request_dig / request_flag_place / request_flag_pull / request_stop / request_refresh / notify_settlement_done / notify_combat_end;ap/rap/phase 只读 | ConfigDB(ActionEconomyTable);B1 回发 next_round_mode/battle_over | 无 | -| **variation 定义**(A4) | VariationTable schema(现行空清单,合法态)与 F1 候选池门控谓词 | `variant_pool_gate(level_index, board_biome)` | ConfigDB(VariationTable) | 无 | +| **variation 定义**(A4) | VariationTable schema(现行 7 行:六 region + skewed_veins 一 global——全局作用域变异首发批 2026-10-04)与 F1 候选池门控谓词 | `variant_pool(level_index, board_type, node_type="")`(门控三维:unlock+board_types+节点身份——global 行仅 boss/elite 入池,缺省跳过零扰动);`global_variant_row(level_index, board_type, node_type)`(全局型单行决议访问器) | ConfigDB(VariationTable) | 无 | | **status_container**(B3) | 状态实例容器(战斗域生命周期、跨轮跨图延续) | 5 API:notify_battle_start / apply_effect / query_active / decay_round / notify_battle_end | ConfigDB(StatusEffectTable) | 无(RefCounted) | | **save_system**(D3,Alpha) | 存档格式与版本比较 | (未设计——契约锚:SCHEMA_VERSION + master_seed + 各流 scope 计数器快照,须在无在飞 open_stream 实例时切出) | ConfigDB、RngService 只读计数器 | FileAccess——LOW | | **settings/localization**(D6,愿景) | 设置项、翻译数据 | (未设计) | ConfigDB | 无 | diff --git a/design/gdd/06-待办清单.md b/design/gdd/06-待办清单.md index d793d66c..06c2a505 100644 --- a/design/gdd/06-待办清单.md +++ b/design/gdd/06-待办清单.md @@ -2,14 +2,6 @@ 本清单是全项目待办事项的**唯一登记处**:各系统文档不再自建「待办」条目节,只留一行指路存根;新增待办事项一律直接登记本清单。条目按四个循环分组,组内按系统分节;每条事项一个四级标题,其下用粗体属性名成段——**现状**(现状与失义原因,自各系统文档原样搬运、措辞不改;跨文档重复条目合并为一条,登记在建议归属主责方名下,其余来源在现状中注明出处;相关但不同面的条目各自保留,现状末尾互相指认;搬运时仅将原文中的「本文 / 本系统」替换为对应系统名,并把相对链接改写为本文件位置可用的路径)、**归属**、**状态**。事项解决后**从本清单移除**(2026-09-18 用户拍板改口径,原"改状态留痕"废止):去向与依据登记当批台账与 active.md 快照,git 历史即留痕。 -#### 全局作用域变异 - -**现状**:全局作用域变异(精英/Boss 图整图生效的变异形态)——作用域语义未定稿。来源:P1 后置表(首批类型定稿批 2026-09-20 落地:首批四类型均为 region 格子级;scope=global 词表位保留) - -**归属**:[难度曲线与Boss](systems/冒险循环/难度曲线与Boss.md) - -**状态**:待办(2026-09-19 用户拍板:Boss 图变异暂无设计想法,留 **Alpha 阶段**再设计,当期不处理) - #### 双层 BD 延期与备选内容总登记(2026-10-03 立项——任务书退役保险) **目的**:任务书/整合定稿系中间文档,落地完成后按吸收即死退役——用户令「只删除已完成落地的内容」,本条自承载全部**未落地**内容防丢失(每项自包含,不依赖指针)。 diff --git a/design/gdd/systems/冒险循环/难度曲线与Boss.md b/design/gdd/systems/冒险循环/难度曲线与Boss.md index c3a04f53..862f91fe 100644 --- a/design/gdd/systems/冒险循环/难度曲线与Boss.md +++ b/design/gdd/systems/冒险循环/难度曲线与Boss.md @@ -257,7 +257,7 @@ Boss 战的棋盘用本关最大板形(板形行值读棋盘参数表),板 | P1 | 完美策略档的结构性加难杠杆 | 数值杠杆对完美档已被实测证伪,结构候选未裁决(见「待办」) | | P2 | 精英节点完整语义与修饰乘数表首行 | 随[关卡节点地图](关卡节点地图.md)定稿联动;首个使用场景 = 精英节点;精英怪设定三特征已登记(迭代 10 批,见「曲线雕刻」表注),钥石掉 1 个预留挂钩 meta.tres boss_keystone 精英行(随实装批落) | | P2 | 区间平移换算率定稿 | 接口启用形态已定稿(2026-09-18 元进度定稿批);剩余面 = 首版三行折算数值随[元进度](../跨局循环/元进度.md)设计批模拟读数标定 | -| P2 | 全局作用域变异的投放计划 | 机制框架归[地形变异](../排雷循环/地形变异.md),投放计划归本文,随关卡扩展 | +| P2 | 全局作用域变异的投放计划 | **首发已落地(2026-10-04 全局作用域变异首发批,迭代 14 ③号卡)**——现行=L2/L3 Boss 图恒定贫矿脉(unlock_level=2 起,第 1 关 Boss 免疫=L1 教学保护);本行降级为「后续型扩展计划」:新全局型(精英图首行/案D 冻土/案B 诡雷远期)逐关固定演进,随关卡扩展登记;带 A(全局变异)收敛判读归全局难度批 M-4 杠杆表(Q4 甲——落地批读数只测不判) | ## 调参表 @@ -304,6 +304,7 @@ Boss 战的棋盘用本关最大板形(板形行值读棋盘参数表),板 | 注入概率初值 / 衰减 | 读表 | 注入机制归[地图战斗资源](../战斗循环/地图战斗资源.md) | | 清障炸药威力区间 | 读表 | 清图槽当场引爆 | | 状态强度 | 读 `status_effects.tres`(掷点轴——2026-09-16 换装,原减伤退役) | 联动评估归本文,禁独立调参 | +| 资源面偏斜 effect_value | 读 `variation.tres` 贫矿脉行(域 [0,50],0=中性 off 锚;现行投值 30 provisional——2026-10-04 首发批) | Boss 图整图变异=全局加难杠杆(带 A 注册 M-4 杠杆表——Q4 甲裁决,读数只测不判,带 A 收敛判读归全局难度批);与注入概率/衰减同族「图级投放轴」,禁独立调参;总期望微降 3-5% 为 provisional 设计目标,实测方向与幅度归读数批 | | GP 掉落与商店价格参数 | 读 `shop.tres`(gp_drops 均值±方差 / level_gp_bonus / pool_shelf 货架基价四行 / price_a / price_b;legacy products 首价与步长 / price_level_bonus 随对照模式保留) | GP+商店房批新增,pool 换代随迭代 11 第②批;公式语义归[冒险结构](冒险结构.md),数值全部 provisional-pending-曲线调参批(A/b 投值 1.8/1.1 后置追认),与分层带联动禁独立调参 | ## 验收标准 diff --git a/design/gdd/systems/排雷循环/地形变异.md b/design/gdd/systems/排雷循环/地形变异.md index 422a053d..2e7df380 100644 --- a/design/gdd/systems/排雷循环/地形变异.md +++ b/design/gdd/systems/排雷循环/地形变异.md @@ -1,7 +1,7 @@ # 地形变异 -> 一句话:格子的非雾变异(荆棘丛/藤蔓缠绕/岩浆/烬覆/落石/矿尘),挖掘中可遭遇的地貌偏离 -> 状态:已定稿(首批类型随 2026-09-19 定稿批落地,第三关一对随 2026-09-20 第三关内容批落地) +> 一句话:格子的非雾变异(荆棘丛/藤蔓缠绕/岩浆/烬覆/落石/矿尘)与 Boss 图整图变异(贫矿脉),挖掘中可遭遇的地貌偏离 +> 状态:已定稿(首批类型随 2026-09-19 定稿批落地,第三关一对随 2026-09-20 第三关内容批落地;首个整图变异随 2026-10-04 全局作用域变异首发批落地) > 旧版参考:../../../archive/gdd-2026-09-14/a4-terrain-variation.md ## 设计目的 @@ -51,16 +51,17 @@ 变异的生命周期是随图生灭:变异是棋盘格的只读属性,在战斗初始化末段布置、随棋盘实例存在;清图换图或战斗结束时随图消亡。布置之后生效期没有任何运行时写入,也没有跨图存续——新图重新布置。 -清单现行登记六个类型,两轴 × 三关: +清单现行登记七个类型,两轴 × 三关(region 六行)+ 首个整图型(global 一行): -| 类型名 | 效果 | 触发 | 布置约束 | 解锁 | 地形 | 伤害量 | -|---|---|---|---|---|---|---| -| 荆棘丛 | 直伤(flat_damage) | 被打开即触发(on_open) | 只落未开格(closed_only) | 第 1 关 | dungeon | 1 | -| 藤蔓缠绕 | 数字遮蔽(hide_number) | 打开且显示数字时(on_number_shown) | 任意格(any) | 第 1 关 | dungeon | — | -| 岩浆 | 直伤(flat_damage) | 被打开即触发(on_open) | 只落未开格(closed_only) | 第 2 关 | underdark | 2 | -| 烬覆 | 数字遮蔽(hide_number) | 打开且显示数字时(on_number_shown) | 任意格(any) | 第 2 关 | underdark | — | -| 落石 | 直伤(flat_damage) | 被打开即触发(on_open) | 只落未开格(closed_only) | 第 3 关 | deep_underdark | 3 | -| 矿尘 | 数字遮蔽(hide_number) | 打开且显示数字时(on_number_shown) | 任意格(any) | 第 3 关 | deep_underdark | — | +| 类型名 | 作用域 | 效果 | 触发 | 布置约束 | 解锁 | 地形 | 伤害量 | +|---|---|---|---|---|---|---|---| +| 荆棘丛 | region | 直伤(flat_damage) | 被打开即触发(on_open) | 只落未开格(closed_only) | 第 1 关 | dungeon | 1 | +| 藤蔓缠绕 | region | 数字遮蔽(hide_number) | 打开且显示数字时(on_number_shown) | 任意格(any) | 第 1 关 | dungeon | — | +| 岩浆 | region | 直伤(flat_damage) | 被打开即触发(on_open) | 只落未开格(closed_only) | 第 2 关 | underdark | 2 | +| 烬覆 | region | 数字遮蔽(hide_number) | 打开且显示数字时(on_number_shown) | 任意格(any) | 第 2 关 | underdark | — | +| 落石 | region | 直伤(flat_damage) | 被打开即触发(on_open) | 只落未开格(closed_only) | 第 3 关 | deep_underdark | 3 | +| 矿尘 | region | 数字遮蔽(hide_number) | 打开且显示数字时(on_number_shown) | 任意格(any) | 第 3 关 | deep_underdark | — | +| 贫矿脉 | global | 资源面偏斜(resource_face) | 板级恒在(always) | 任意格(any,无格子布置域) | 第 2 关 | 通配(∅) | — | 机制口径(2026-09-19 定稿批): @@ -69,7 +70,17 @@ - 直伤量为加法核小整数(effect_value ∈ [1,9],行值 provisional 归难度曲线与Boss);每格携带单类型单 id。 - 变异格未开时无预告呈现(遭遇式;视觉标识归表现层升级批)。 -候选池门控(框架级现行机制):一种变异要进入本关的布置候选,须同时满足两个条件——它的解锁关号不大于当前关卡序号(直接整数比较),且它声明的地形(board_types)与本地形有交集(声明为空集等于通配)。候选池为空是合法状态:静默布置一张无变异的普通图,不报错、不警告。门控谓词与取值域登记于 [registry 的 variant_pool_gate 条目](../../../registry/entities.yaml)。 +候选池门控(框架级现行机制):一种变异要进入本关的布置候选,须同时满足三个条件——它的解锁关号不大于当前关卡序号(直接整数比较)、它声明的地形(board_types)与本地形有交集(声明为空集等于通配)、且节点身份匹配(scope=global 行仅 Boss/精英节点入池,普通战斗节点静默跳过——2026-10-04 全局作用域变异批增第三维;elite 系前向词位,首发零表行)。候选池为空是合法状态:静默布置一张无变异的普通图,不报错、不警告。门控谓词与取值域登记于 [registry 的 variant_pool_gate 条目](../../../registry/entities.yaml)。 + +### 全局作用域型(scope=global——Boss 图整图变异) + +region 型变异是「格子级」的:布置段往候选格域写格子快照。global 型变异是「板级」的:整图一个类型生效,不落任何格子(棋盘持有板级 `board_variants` 字段,逐格 `variants` 恒空)。**每图一型的板级推广(2026-10-04 用户裁决)**:普通图带 region 片,Boss/精英图带 global 型——两类图各自至多一型。 + +**替换制**:Boss/精英图命中全局型时,布置段跳过 region 布置(该图既无 region 片、也无格子级变异标记)——L2 完美 Boss 承伤已越 ≤50% 带,region 叠全局的叠加制火上浇油,不采纳。**兜底回落**:Boss/精英图的全局候选池为空时(含第 1 关 Boss 解锁门控未达=免疫,第 1 关是过滤器不是墙的教学保护)回落 region 布置,即回批前行为(保守向后兼容,防配置缺行静默裸奔——provisional)。 + +**恒定制**:第 2/3 关 Boss 图 100% 带一型(非掷定结果——配置事实;全局取用确定性,不消费布置随机流=零取号合法态)。首发型=**贫矿脉(skewed_veins)**:资源面偏斜(resource_face)——整图修正资源摇号分布,不动任何格子数据、不动生成端:进攻族(增伤/爆裂/穿刺/奥术)权重等比上浮,生存族(回血/护甲)权重按 effect_value% 下调,白名单三行(削弱/GP/行动点)恒不动,下调量按进攻族原权重比例重分配、正向池合计恒 77。玩家体验=「这层奶薄、枪很肥」:生存资源变薄、进攻资源变肥,转向用进攻续命的主动策略——不是纯挨打。第 2/3 关双关同型(关间台阶由第 3 关既有新内容满足)。清图槽(clear_default/clear_blast)是独立池,不受偏斜影响。资源投影的执行面(摇号前权重合成、合成序=图级先件级后)归[地图战斗资源](../战斗循环/地图战斗资源.md)。 + +**三层预告**(整图语义=规则级偏离,藏着等于暗改规则——区别于 region 遭遇式口径):①开战横幅一行(板级变异非空时显示)②HUD 常驻角标(战斗全程可见防中局遗忘,空态隐藏)③帮助手册一行(零交互教学)。呈现承载归 [HUD 框架](../表现与支撑/HUD框架.md)。 ### 零特判原则(承重约束) @@ -86,6 +97,7 @@ - 候选格域 = 安全格 − 初始展开区,且排除雷格。 - 布置取数走专用随机流(variant_place,一板恰一 scope),换图/轮内刷新图各取号一次,确定性可复放。 - 生成器管线不布置变异(产物恒零变异格)——布置域的"未开"语义由设置顺序保障。 +- **全局作用域型决议(2026-10-04 首发批)**:Boss/精英图的全局型在装板序内前置于资源格设置之前决议(图级偏斜旋钮须在资源摇号前定型;全局门控与板无关,确定性取用不消费 variant_place 流)——命中即写板级字段并跳过本步的 region 布置(替换制);未命中则本步按上列规则原样执行(含兜底回落)。普通图路径零改动。 ### 反制道具配套义务 @@ -119,7 +131,7 @@ | 优先级 | 内容 | 后置原因 | |---|---|---| | 迭代 12(调研前置) | 反制路径重定(原:首批四类型的反制道具兑现,counter_items 回填——已作废) | 2026-10-03 用户终裁:同调位反制件=层级错配失败设计,义务作废;变异应对是否以局内形态补入,待双层 BD 调研仲裁后重新立项 | -| Alpha | 全局作用域变异(精英/Boss 图整图生效的变异形态) | Boss 图变异暂无设计想法——2026-09-19 用户拍板留 Alpha 再设计;作用域语义归[难度曲线与Boss](../冒险循环/难度曲线与Boss.md) | +| ~~Alpha~~ **已落地** | 全局作用域变异(精英/Boss 图整图生效的变异形态) | **2026-10-04 全局作用域变异首发批落地**(迭代 14 ③号卡)——首批型=贫矿脉(案A 资源面·微贫向偏斜,替换制/恒定制/L1 Boss 免疫/三层预告);裁决全录见任务书(design/research/任务书-全局作用域变异首发批-2026-10-04.md);带 A 杠杆注册全局难度批(M-4)随批读数只测不判;精英图留词表前向位(首发零表行) | | P2 | "地形成本修饰"价目钩子启用 | 由行动经济持有;启用须随变异类型扩展,与行动经济重议按格定价的接口 | | P2 | 变异解锁节奏复核 | "每关至少引入一个新元素"的推进节奏,随[难度曲线与Boss](../冒险循环/难度曲线与Boss.md)定稿复核 | | P2 | 变异格视觉标识与预告呈现 | 首批为遭遇式(未开无预告);标识位随表现层升级批 | @@ -132,6 +144,7 @@ | 关卡递增 per_level_bonus | +2 格/关 | 难度曲线与Boss(provisional) | | 连通片上限 pack_max | 4 | 定稿值(2026-09-19 用户拍板形状约束) | | 直伤量 effect_value | 荆棘丛 1 / 岩浆 2 / 落石 3 | 难度曲线与Boss(provisional,加法核 [1,9]) | +| 资源面偏斜 effect_value | 贫矿脉 30(生存族下调百分比;0=中性 off 锚;总期望微降 3-5% 为 provisional 设计目标——精确方向与幅度归读数批判读只测不判) | 难度曲线与Boss(provisional,域 [0,50]——2026-10-04 首发批投值) | 变异表的结构历史(字段定义、条目归属)见 [registry 的 variation_table 条目](../../../registry/entities.yaml)。字段集现行口径:标识 / 玩家可见名 / 解锁关号 / 作用域 / 效果 / 效果量 / 触发 / 布置约束 / 地形(board_types)/ 反制道具绑定(counter_items,恒空保留——回填义务 2026-10-03 作废,承载形态待迭代 12 重定)。 @@ -142,6 +155,7 @@ - 数据生命周期:格子携带的变异是只读数据——战斗初始化末段布置、随图消亡,布置后零运行时写入,无跨图存续;生成器产物恒零变异格。 - 布置域:变异格全在初始展开区外(伤害型 closed_only 由设置顺序结构保障)且不吃雷格;每图至多一种类型;连通片 ≤ pack_max。 - 配套义务闭环(**已作废,2026-10-03 终裁**):原「定稿批须含反制兑现条目否则验收不通过」随反制道具配套义务一并作废;counter_items 恒空为合法态。 +- 全局作用域型(2026-10-04 首发批):替换制生效——Boss 图恰一行板级变异+零格子级变异标记;普通图 region 路径逐位不变(同种子布置/摇号快照对拍批前基线);off 态零扰动(effect_value=0 资源摇号与无偏斜逐位相同,白名单三行任何状态逐位不动);L1 Boss 零全局变异;Boss 图全局池空回落 region;全局取用零取号(确定性,不消费布置随机流);资源面偏斜正向池合计恒 77。 ## 版本历史 @@ -153,3 +167,4 @@ | v0.4 | 2026-09-20 | **第三关内容批(与切片代码 / registry / 03-内容规模 / 棋盘生成 / 难度曲线与Boss 同批)**:类型清单加第三关两行——落石(伤害型 flat_damage 3)+ 矿尘(信息型 hide_number 数字遮蔽),凑齐两轴 × 三关(unlock_level 3、地形 deep_underdark);布量走既有公式(第三关自动 9%,零新配置);反制道具兑现维持改排 Alpha(counter_items 字段位同批预留);调参表直伤量行随批补落石 3。行值全 provisional 归 难度曲线与Boss | | v0.5 | 2026-09-21 | **变异布置基数修正批(用户试玩反馈「小图变异格非常多」+基数假设实测证实后拍板)**:数量公式百分比基数由总格数改候选池格数(安全格 − 初始展开区,即实际可挖格)——实测初始展开均值占全板 56–67%,旧基数使有效密度膨胀 4–6 倍(L1 10×10 板配置 5% 实际 30.1%,极端板可挖格 100% 覆盖);percent 语义 = 占可挖格比例,关卡递增由 per_level_bonus 绝对格数承载;表值零变更(provisional 归 难度曲线与Boss 调参批重标,正式重基线同批) | | v0.6 | 2026-10-03 | **反制道具配套义务作废批(2026-10-03 用户终裁——层级错配失败设计)**:①负责表义务行+§反制道具配套义务节改作废注记并附终裁理由(同调位反制件=冒险周期常驻资源对抗关卡周期局部威胁;变异=受控纯税现状维持);②counter_items 字段保留恒空=合法态,承载形态待迭代 12 双层 BD 调研重定(变异应对若做只挂局内);③依赖表魔法道具行/P1P2 后置表 Alpha 行/验收「配套义务闭环」条同步作废;④批位移迭代 12(调研前置后重新立项)。连带 魔法道具.md v0.8 同批;范围裁定注记见 roadmap 迭代 11+ 行(原 06 条目已收口移除) | +| v0.7 | 2026-10-04 | **全局作用域变异首发批(迭代 14 ③号卡——任务书裁决 P1-P8+Q1-Q4 全按推荐案)**:①类型清单加行贫矿脉(scope=global 首发型=案A 资源面·微贫向偏斜,effect_value=30 provisional);②新增 §全局作用域型 语义节(板级承载/替换制/兜底回落/恒定制/资源面偏斜口径/三层预告);③「每图一型」板级推广=普通图 region、Boss/精英图 global;④候选池门控扩第三维=节点身份(global 行仅 boss/elite 入池,普通节点静默跳过;elite 前向词位零表行);⑤布置段节补全局决议前置于资源格设置(数据依赖——偏斜旋钮先于摇号定型,零取号);⑥P1/P2 表 Alpha 行换代已落地(撤 2026-09-19「留 Alpha 再设计」挂起——P1 裁决);⑦调参表+验收标准+影响面随批;⑧呈现三层承载归 HUD框架.md 同批(横幅+常驻角标+手册行);⑨遗留知情代价:迭代 12 四件地形应对件在 Boss 图无的放矢(替换制无地形格——Q3 知情代价,registry/调参日志登记) | diff --git a/design/gdd/systems/排雷循环/行动经济.md b/design/gdd/systems/排雷循环/行动经济.md index f5889cdb..a7c3a615 100644 --- a/design/gdd/systems/排雷循环/行动经济.md +++ b/design/gdd/systems/排雷循环/行动经济.md @@ -184,7 +184,7 @@ |---|---|---| | P1 | 储备池跨战斗携带开关 | 现行每场战斗清零(防滚雪球);是否解禁连刷策略,等实测数据说话 | | P1 | 清图奖励按图类型差异化 | 结构位已预留,内容归地图战斗资源的表设计 | -| P2 | 地形成本修饰(不同格子不同价) | MVP 价目均匀是有意简化;钩子已预留,待地形变异首批类型定稿 | +| P2 | 地形成本修饰(不同格子不同价) | MVP 价目均匀是有意简化;钩子已预留,待地形变异首批类型定稿。**2026-10-04 注记(全局作用域变异首发批)**:地形变异首批已定稿且 Boss 图整图型(贫矿脉)已落地——资源面偏斜走摇号权重投影、零行动点计费接触,本钩子(案D 规则改写向的按格 AP 差价)**留位不启用**,启用条件仍=未来出现真正按格差异化成本的地形型(随类型扩展重议) | | P2 | 行动点耗尽的教学提示 | 规则已定"0 点即收轮";若新手困惑,加提示不改规则,归教学引导 | ## 调参表 diff --git a/design/gdd/systems/表现与支撑/HUD框架.md b/design/gdd/systems/表现与支撑/HUD框架.md index e888ed91..bdec3ab5 100644 --- a/design/gdd/systems/表现与支撑/HUD框架.md +++ b/design/gdd/systems/表现与支撑/HUD框架.md @@ -216,6 +216,7 @@ HUD框架站在玩家与全部玩法系统之间:挖掘期它是输入的翻 | [地图战斗资源](../战斗循环/地图战斗资源.md) | 已开格的奖励身份常读;未开格类型微光(英雄周围 8 格内的未开格显示资源类型——概念定义见本篇「未开格类型微光」节) | | [魔法道具](../排雷循环/魔法道具.md) | 库存条常读;使用交互与目标拾取;板级叠加层信息呈现 | | [棋盘生成](../排雷循环/棋盘生成.md) | 零合法板的诚实告知(数据面经战斗结算上抛,本系统只管提示形态) | +| [地形变异](../排雷循环/地形变异.md) | 全局作用域型三层预告(2026-10-04 首发批——语义正主=地形变异 §全局作用域型):①开战横幅一行(板级变异非空时显示;减动效=静态驻留,轮横幅先例同款双态)②HUD 常驻角标(C 区战斗全程可见防中局遗忘,空态整节隐藏=流派件段先例;摆位 provisional)③帮助手册一行(零交互教学,承载=玩法帮助文案块);数据面经呈现快照 board_variants 投影(核心→呈现唯一读取面),普通图三层恒空态零打扰 | ## P0 最小闭环 @@ -275,6 +276,7 @@ HUD框架站在玩家与全部玩法系统之间:挖掘期它是输入的翻 - 任一模态层打开时遮挡物隐藏或输入锁定、关闭逐层恢复;tooltip 与明细行等动态区固定槽高、换行裁剪不推挤布局。 - 终局呈现只消费流水与快照:核心对象销毁后呈现层对生命周期状态零回读;终局后重放渲染与实时渲染一致。 - 消费的每份载荷逐字段断言通过(缺字段、多字段都算失败)。 +- 地形变异三层预告(2026-10-04 全局作用域变异首发批——规则正主=地形变异 §全局作用域型):Boss 图开战横幅一行显示且普通图不显示;C 区常驻角标战斗全程可见、空态整节隐藏;帮助手册含整图变异说明行;减动效开启横幅走静态驻留(轮横幅同款双态);普通图三层零打扰(恒空态)。 - 字号下限成立;无每秒超三次闪烁;减动效开启时时长减半或跳终态(结算兑现降速不跳过);全程纯鼠标可玩;中文渲染无缺字。 - 呈现层零随机调用;切片临时名零残留。 @@ -298,5 +300,6 @@ HUD框架站在玩家与全部玩法系统之间:挖掘期它是输入的翻 | v0.10 | 2026-09-26 | 渲染技术注记(战斗舞台 Node2D 迁移批 Phase B,代码实装同批;上位裁决 ADR-0006):B 区战斗舞台 Node2D 化——BattleStageView 内部由 PanelContainer+Control 站桩改为 Control 壳 + SubViewportContainer + SubViewport + Node2D 世界(StageWorld/StandeeBody),类名/setter 面/公共方法契约不变、调用点零改造;状态图标行与悬停 tooltip 保留 Control 载体挂壳层(伴随件);C6 字体注入挂点复用(set_world_font);三区布局与性能预算(同屏 draw calls < 200)不变;占位表现等价平移(时序常量逐字对照——等价证明=git 提交 7f24b64,文件已按生命周期条款退役) | | v0.11 | 2026-09-27 | 关卡画面 UX spec 建档([level-map](../../ux/level-map.md),关卡画面 UX 批——用户拍板立项):义务清单「关卡节点地图」行挂屏级 spec 指针;屏级权威行与不负责表改按屏分治口径(战斗屏 = battle.md / 关卡画面 = level-map.md)。文档面零机制改动 | | v0.12 | 2026-09-30 | **未开格类型微光概念收口批(用户裁决落位)**:新增「未开格类型微光」节=全项目唯一正主定义(五要素——作用对象=英雄周围 8 格内的未开格〔与可挖域同圈〕/信息内容=只类型不泄雷安/生命周期=入圈亮出圈灭开格灭/关联边界/实装状态=契约定稿〔样张 v2〕游戏内待实施批);核心规则章六节改七节;呈现义务来源清单「地图战斗资源」行补微光指路;验收标准补微光呈现线。背景:该概念此前只活在 06 登记与 art-bible 复述,「常显/全部未开格」无范围表述酿成理解事故(2026-09-30 用户纠正口径),本批落位正主、他文只许指路 | +| v0.13 | 2026-10-04 | **地形变异三层预告义务批(全局作用域变异首发批——迭代 14 ③号卡,代码同批)**:呈现义务来源清单补「地形变异」行(开战横幅一行〔减动效=静态驻留,轮横幅先例同款双态〕+ C 区常驻角标〔空态整节隐藏=流派件段先例,摆位 provisional〕+ 帮助手册一行〔零交互教学〕);验收标准补三层预告线(普通图恒空态零打扰);数据面走呈现快照 board_variants 投影(核心→呈现唯一读取面)。语义正主=地形变异.md §全局作用域型,本文只锁呈现承载 | | v0.14 | 2026-10-03 | **视野迷雾实施批落籍注记(迭代 11 第④批)**:迷雾节补「实施状态」注记(四裁决逐条对账:纯呈现两态逐位一致/暗淡记忆态灰显可读/LIGHT_RADIUS=8 参数化〔提灯 +2 插值位预留未接〕/类型微光仍贴身 8 邻格);实装状态行「待实施批」改「已实装」;验收标准迷雾行去「待实施批落地后验收」括注转正式验收。机制定义零改动(定义一句话/作用范围/生命周期/关联边界/配套拍板全段原样);黑暗区域渲染规格落 art-bible §6.5(v3.5) | | v0.13 | 2026-09-30 | **视野迷雾概念落位批(用户拍板立项)**:新增「视野迷雾」节=正主定义(菱形灯光区+黑暗边界;区外已开格=暗淡记忆态灰显可读、区外未开格=全黑;灯光半径起步=微光环 8 格同圈;纯呈现层,与已退役雾格无关);验收标准补迷雾线;配套拍板随节登记(魔法提灯灯甲外扩 +2 格、类型微光不随视野扩、初始展开收窄后置 Alpha 差异化批)。实施待主线编卡 | diff --git a/design/gdd/systems/表现与支撑/教学引导.md b/design/gdd/systems/表现与支撑/教学引导.md index 728c9477..0083653b 100644 --- a/design/gdd/systems/表现与支撑/教学引导.md +++ b/design/gdd/systems/表现与支撑/教学引导.md @@ -61,6 +61,7 @@ HUD 框架定稿时已为教学留好两个承载位,本系统的内容将来 | 挖非相邻格的首次提示 | [HUD 框架](HUD框架.md) | 挖与旗都限小人 8 向相邻的格子,第一次越界操作时提示 | | 增益叠层节奏 | [增益状态](../战斗循环/增益状态.md) | "同一轮拿满优于跨轮慢慢叠"——增益有结算次数衰减,教学要传达这个节奏 | | 库存关卡末清空 | [地图战斗资源](../战斗循环/地图战斗资源.md) | 道具库存随关卡结束清空,需有反馈与教学条目 | +| Boss 图整图变异说明行 | [地形变异](../排雷循环/地形变异.md)(全局作用域变异首发批 2026-10-04) | Boss 图整图变异(贫矿脉——生存资源变薄、进攻资源变肥)开战横幅与 HUD 角标常驻预告;帮助手册一行承载常量性知识(零交互教学——「手册零再教」承载位,见 HUD 框架玩法帮助文案块) | ### 内容原则 @@ -116,3 +117,4 @@ HUD 框架定稿时已为教学留好两个承载位,本系统的内容将来 | v0.1 | 2026-09-14 | 自归档线索整合为范围草案(旧体系未单独成文) | | v0.2 | 2026-09-15 | 雾格残留清理:删除「待拍板」的雾类教学条目失义登记(图例条目"迷雾 = 无雷盲区"与雾格首遇三要点提示),"待设计问题清单"第 3 条去掉雾条目删除的限定。教学条目清单与承载设施不变 | | v0.3 | 2026-09-17 | 数值纪律收口批:呈现常量复述改指路 HUD 框架调参表 | +| v0.4 | 2026-10-04 | **地形变异手册行批(全局作用域变异首发批——迭代 14 ③号卡,代码同批)**:已登记的教学条目表补「Boss 图整图变异说明行」——三层预告中的手册层承载(帮助文案块一行,零交互教学),横幅/角标两层归 HUD 框架;语义正主=地形变异.md §全局作用域型 | \ No newline at end of file From cb52ccc8aebeee942295a997f85737e9b638127f Mon Sep 17 00:00:00 2001 From: DKChan <524912269@qq.com> Date: Sun, 4 Oct 2026 17:52:56 +0800 Subject: [PATCH 4/6] =?UTF-8?q?=E5=85=A8=E5=B1=80=E4=BD=9C=E7=94=A8?= =?UTF-8?q?=E5=9F=9F=E5=8F=98=E5=BC=82=E9=A6=96=E5=8F=91=E6=89=B9=20T7=20?= =?UTF-8?q?=E6=96=AD=E8=A8=80=E6=89=B9=EF=BC=88=E8=BF=AD=E4=BB=A314?= =?UTF-8?q?=E2=91=A2=E5=8F=B7=E5=8D=A1=EF=BC=89=EF=BC=9Asmoke=5Fall=20?= =?UTF-8?q?=E6=96=B0=E6=AE=B5=20=5Fsmoke=5Fglobal=5Fvariant=2029=E6=96=AD?= =?UTF-8?q?=E8=A8=80=EF=BC=88=E4=BA=92=E9=94=81=E8=B4=9F=E6=A0=B7=E6=9C=AC?= =?UTF-8?q?=E2=91=A2-=E2=91=A6=3Dresource=5Fface=E2=87=92global/global?= =?UTF-8?q?=E2=87=92resource=5Fface=C2=B7always=C2=B7any/effect=5Fvalue[0,?= =?UTF-8?q?50]=E5=9F=9F=EF=BC=9B=E9=97=A8=E6=8E=A7=E4=B8=89=E7=BB=B4=3Dbos?= =?UTF-8?q?s=E6=B1=A0=E5=90=ABglobal=E8=A1=8C=C2=B7battle=E9=9D=99?= =?UTF-8?q?=E9=BB=98=E8=B7=B3=E8=BF=87=C2=B7=E7=BC=BA=E7=9C=81=E5=8F=8C?= =?UTF-8?q?=E5=8F=82=E9=9B=B6=E6=89=B0=E5=8A=A8=C2=B7L1Boss=E5=85=8D?= =?UTF-8?q?=E7=96=AB=C2=B7elite=E5=89=8D=E5=90=91=E4=BD=8D=EF=BC=9B?= =?UTF-8?q?=E6=9B=BF=E6=8D=A2=E5=88=B6=3DBoss=E5=9B=BEboard=5Fvariants?= =?UTF-8?q?=E6=81=B0=E4=B8=80=E8=A1=8C+=E9=9B=B6region=E6=A0=BC+=E9=9B=B6?= =?UTF-8?q?=E5=8F=96=E5=8F=B7=E3=80=94=5FCountVariantRng=E5=8F=96=E5=8F=B7?= =?UTF-8?q?=E8=AE=A1=E6=95=B0=E6=A1=A9=E3=80=95=EF=BC=9B=E5=BF=AB=E7=85=A7?= =?UTF-8?q?=E6=8A=95=E5=BD=B1=EF=BC=9Boff=E6=80=81=E9=80=90=E4=BD=8D?= =?UTF-8?q?=E9=9B=B6=E6=89=B0=E5=8A=A8=EF=BC=9B=E5=AE=88=E6=81=9277?= =?UTF-8?q?=EF=BC=9B=E7=99=BD=E5=90=8D=E5=8D=95=E4=B8=89=E8=A1=8C=E4=B8=8D?= =?UTF-8?q?=E5=8A=A8=EF=BC=9Bv=3D30=E6=9E=84=E9=80=A0=E4=BE=8B=3D15/18/9/9?= =?UTF-8?q?/3/7=EF=BC=9B=E5=90=88=E6=88=90=E5=BA=8F=E6=9E=84=E9=80=A0?= =?UTF-8?q?=E4=BE=8B=3Dskew+luck=5Fbias=E5=8A=A0=E6=B3=95=E5=90=88?= =?UTF-8?q?=E8=AE=A177+8=EF=BC=9Bv=3D50=E5=9F=9F=E4=B8=8A=E7=95=8C?= =?UTF-8?q?=E6=81=92=E6=AD=A3=EF=BC=9B=E7=A1=AE=E5=AE=9A=E6=80=A7=E4=B8=A4?= =?UTF-8?q?=E9=81=8D=E9=80=90=E4=BD=8D=EF=BC=89+rows.size=E6=96=AD?= =?UTF-8?q?=E8=A8=806=E2=86=927=E6=8D=A2=E4=BB=A3=E2=80=94=E2=80=94?= =?UTF-8?q?=E5=86=92=E7=83=9F718=E2=86=92747=E6=96=AD=E8=A8=80=E5=8F=AA?= =?UTF-8?q?=E5=A2=9E=E4=B8=8D=E5=87=8F=EF=BC=9Bconfig=5Fdb=5Ftest=20?= =?UTF-8?q?=E9=80=9A=E9=85=8D=E9=80=89=E6=8B=A9=E5=99=A8=E9=99=90=E5=AE=9A?= =?UTF-8?q?region=E8=A1=8C+global=E8=A1=8C=E7=AC=AC=E4=B8=89=E7=BB=B4?= =?UTF-8?q?=E4=B8=89=E6=96=AD=E8=A8=80=EF=BC=88run=5Fall=2015=E5=A5=97?= =?UTF-8?q?=E5=85=A8=E7=BB=BF=E6=81=A2=E5=A4=8D=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- game/smoke/smoke_all.gd | 164 +++++++++++++++++- game/tests/unit/data_config/config_db_test.gd | 12 +- 2 files changed, 173 insertions(+), 3 deletions(-) diff --git a/game/smoke/smoke_all.gd b/game/smoke/smoke_all.gd index 04aacc85..8acb1cc5 100644 --- a/game/smoke/smoke_all.gd +++ b/game/smoke/smoke_all.gd @@ -80,6 +80,7 @@ func _run_core_smoke(db, rng) -> void: _smoke_variation_framework() _smoke_variant_placement(1) _smoke_variant_placement(2) + _smoke_global_variant() _smoke_full_battle(1, 0, "L1 · 地精") _smoke_full_battle(2, 0, "L2 · 熊地精") _smoke_level() @@ -1265,8 +1266,8 @@ func _mk_stream(stream_name: String, scope: int) -> RandomNumberGenerator: func _smoke_variation_framework() -> void: print("--- 地形变异 框架面(首批四类型 + 候选池门控 + 跨字段互锁)---") - check(_db.variation.rows.size() == 6, "变异清单 6 行(荆棘丛/藤蔓缠绕/岩浆/烬覆 + 落石/矿尘——首批类型定稿批 + 第三关内容批)") - check(_db.variation.validate().is_empty(), "变异表校验零错误(6 行全过域与跨字段互锁)") + check(_db.variation.rows.size() == 7, "变异清单 7 行(荆棘丛/藤蔓缠绕/岩浆/烬覆 + 落石/矿尘 + 贫矿脉——首批类型定稿批 + 第三关内容批 + 全局作用域变异首发批)") + check(_db.variation.validate().is_empty(), "变异表校验零错误(7 行全过域与跨字段互锁——含 scope=global 三互锁)") var pool1_ids: Array = [] for r in _db.variant_pool(1, "dungeon"): pool1_ids.append(String(r.variant_id)) @@ -1300,6 +1301,165 @@ func _errs_has_cross_field(errs: Array) -> bool: return false +# ---- 全局作用域变异 首发批断言面(2026-10-04 迭代 14 ③号卡——T0-T5 集中:互锁/门控三维/ +# 替换制/零取号/资源面偏斜守恒与合成序/快照投影/呈现面锚)---- + +# 取号计数桩(variant_place 零取号断言——子类拦截计数,派生与取数语义零改动) +class _CountVariantRng extends RngServiceCore: + var variant_calls := 0 + func open_stream(purpose: String) -> RandomNumberGenerator: + if purpose == "variant_place": + variant_calls += 1 + return super.open_stream(purpose) + + +func _smoke_global_variant() -> void: + print("--- 全局作用域变异 首发批(门控三维 + 替换制 + 资源面偏斜)---") + # ① 跨字段互锁负样本(resource_face ⟺ scope=global 三条 + effect_value 新域 [0,50]) + var vt = load("res://data/schemas/variation_table.gd").new() + vt.rows.assign([{"variant_id": "g1", "display_name": "负甲", "unlock_level": 2, "scope": "region", + "effect": "resource_face", "effect_value": 30, "trigger": "always", "placement": "any", + "board_types": [], "counter_items": []}]) + check(_errs_has_cross_field(vt.validate()), "互锁负样本③:resource_face + scope=region 被拒(resource_face ⇒ global)") + vt.rows.assign([{"variant_id": "g2", "display_name": "负乙", "unlock_level": 2, "scope": "global", + "effect": "hide_number", "effect_value": 0, "trigger": "always", "placement": "any", + "board_types": [], "counter_items": []}]) + check(_errs_has_cross_field(vt.validate()), "互锁负样本④:scope=global + effect=hide_number 被拒(global ⇒ resource_face)") + vt.rows.assign([{"variant_id": "g3", "display_name": "负丙", "unlock_level": 2, "scope": "global", + "effect": "resource_face", "effect_value": 30, "trigger": "on_open", "placement": "any", + "board_types": [], "counter_items": []}]) + check(_errs_has_cross_field(vt.validate()), "互锁负样本⑤:scope=global + trigger=on_open 被拒(global ⇒ always 板级恒在)") + vt.rows.assign([{"variant_id": "g4", "display_name": "负丁", "unlock_level": 2, "scope": "global", + "effect": "resource_face", "effect_value": 30, "trigger": "always", "placement": "closed_only", + "board_types": [], "counter_items": []}]) + check(_errs_has_cross_field(vt.validate()), "互锁负样本⑥:scope=global + placement=closed_only 被拒(global ⇒ any 无格子布置域)") + vt.rows.assign([{"variant_id": "g5", "display_name": "负戊", "unlock_level": 2, "scope": "global", + "effect": "resource_face", "effect_value": 51, "trigger": "always", "placement": "any", + "board_types": [], "counter_items": []}]) + var vterr: Array = vt.validate() + var domain_hit := false + for e in vterr: + if String(e.get("category", "")) == "domain": + domain_hit = true + check(domain_hit, "互锁负样本⑦:resource_face effect_value=51 越域 [0,50] 被拒(不适用 flat_damage [1,9] 加法核)") + # ② 门控第三维(节点身份——global 行仅 boss/elite 入池;缺省/普通节点静默跳过零报错) + var pool_boss_ids: Array = [] + for r in _db.variant_pool(2, "underdark", "boss"): + pool_boss_ids.append(String(r.variant_id)) + check(pool_boss_ids == ["magma", "ash", "skewed_veins"], "门控三维:L2 underdark boss 池 = region 两行 + 贫矿脉(board_types ∅ 通配)") + var pool_battle_ids: Array = [] + for r in _db.variant_pool(2, "underdark", "battle"): + pool_battle_ids.append(String(r.variant_id)) + check(pool_battle_ids == ["magma", "ash"], "门控三维:battle 节点静默跳过 global 行(普通图零报错零警告)") + check(_db.variant_pool(2, "underdark").is_empty() == false and _db.variant_pool(2, "underdark").size() == 2, + "门控三维:缺省双参调用 = global 行跳过(既有调用口径零扰动)") + check(_db.variant_pool(1, "underdark", "boss").is_empty(), "L1 Boss 免疫:unlock_level=2 门控在 boss 节点同样生效(教学保护带 B)") + check(_db.global_variant_row(2, "underdark", "battle").is_empty(), "全局决议:battle 节点恒无全局型") + check(_db.global_variant_row(2, "underdark", "boss").get("variant_id", "") == "skewed_veins", "全局决议:L2 boss 取贫矿脉(确定性单行)") + check(_db.global_variant_row(1, "underdark", "boss").is_empty() and _db.global_variant_row(1, "dungeon", "boss").is_empty(), + "全局决议:L1 boss 全局池空 → 空行(兜底回落承载)") + check(_db.global_variant_row(2, "underdark", "elite").get("variant_id", "") == "skewed_veins", "elite 前向词位:boss 同池(首发零 elite 表行——词表位不造行)") + # ③ 替换制 + 零取号:L2 Boss 图恰一行板级变异 + 零 region 格 + variant_place 零消费 + var crng = _CountVariantRng.new() + crng.set_master_seed(42) + var boss_settlement = load("res://core/battle_orchestrator.gd").new(_db, crng) + var boss_ok: bool = boss_settlement.begin_battle({"level_index": 2, "node_depth": 4, "hero_hp": int(_db.hero.max_hp), "node_type": "boss"}) + check(boss_ok, "L2 Boss 战斗启动(node_depth=4 boss 节点——替换制断言载体)") + if boss_ok: + var bb = boss_settlement.minesweeper.current_board() + check(_arr_str_eq(bb.board_variant_ids(), ["skewed_veins"]), "替换制:Boss 图 board_variants 恰一行 = 贫矿脉") + check(bb.variants.is_empty(), "替换制:Boss 图零 region 变异格(无格子级变异标记——呈现件闲置合法态)") + check(crng.variant_calls == 0, "零取号合法态:Boss 图 variant_place 零消费(全局取用确定性)") + var snap: Dictionary = boss_settlement.presentation_snapshot() + check(_arr_str_eq(snap.get("board_variants", []), ["skewed_veins"]), "快照投影:board_variants 呈现面(横幅/角标唯一读取面)") + # Boss 图确定性:同种子两遍逐位相同 + var crng2 = _CountVariantRng.new() + crng2.set_master_seed(42) + var boss2 = load("res://core/battle_orchestrator.gd").new(_db, crng2) + if boss2.begin_battle({"level_index": 2, "node_depth": 4, "hero_hp": int(_db.hero.max_hp), "node_type": "boss"}): + var bb2 = boss2.minesweeper.current_board() + check(_arr_str_eq(bb2.board_variant_ids(), ["skewed_veins"]) and crng2.variant_calls == 0, + "确定性:同种子 Boss 图两遍 board_variants/取号逐位相同") + # ④ 资源面偏斜投影(RewardEconomy 纯函数面——守恒/白名单/构造例/合成序) + var eco = load("res://core/reward_economy.gd").new(_db, load("res://core/rng_service.gd").new()) + var base_rows: Array = eco._rollable_rows() + var base_sum: int = eco._pool_weight(base_rows) + check(base_sum == 77, "偏斜基线:正向池现行合计 77(挖掘风险批口径)") + eco.board_skew = 0 + var off_rows: Array = eco._biased_cell_rows() + check(off_rows.size() == base_rows.size() and _rows_weights_equal(off_rows, base_rows), "off 态零扰动:board_skew=0 行集与基线逐位相同(不进投影域)") + eco.board_skew = 30 + var on_rows: Array = eco._biased_cell_rows() + check(eco._pool_weight(on_rows) == 77, "合计守恒:偏斜后正向池合计 = 77(整数最大余数重归一)") + var wmap := _rows_weight_map(on_rows) + check(wmap.get("weaken", -1) == 8 and wmap.get("ap_up", -1) == 6 and wmap.get("gp_coin", -1) == 2, + "白名单豁免:weaken/gp/action 三行偏斜后逐位不动") + check(wmap.get("heal_minor", -1) == 3 and wmap.get("ac_up", -1) == 7, "生存族下调:heal 4→3 / defense 11→7(v=30 构造例)") + check(wmap.get("attack_up", -1) == 15 and wmap.get("spark_aoe", -1) == 18 and wmap.get("pierce_strike", -1) == 9 and wmap.get("magic_bolt", -1) == 9, + "进攻族上浮:attack 14→15 / blast 16→18 / pierce 8→9 / magic 8→9(v=30 构造例,等比上浮守恒)") + eco.board_skew = 30 + eco.luck_bias = 2 + var combo_rows: Array = eco._biased_cell_rows() + var cw := _rows_weight_map(combo_rows) + check(eco._pool_weight(combo_rows) == 77 + 4 * 2, "合成序:图级偏斜先(乘法面)件级 luck_bias 后(加法 +2×四稀有类)——合计 77+8") + check(cw.get("heal_minor", -1) == 5 and cw.get("gp_coin", -1) == 4 and cw.get("pierce_strike", -1) == 11 and cw.get("magic_bolt", -1) == 11, + "合成序构造例:skew(heal 3)+2=5 / gp 2+2=4 / pierce 9+2=11 / magic 9+2=11(图级定型后玩家构筑叠加)") + eco.luck_bias = 0 + eco.board_skew = 50 + var v50: Dictionary = _rows_weight_map(eco._biased_cell_rows()) + check(eco._pool_weight(eco._biased_cell_rows()) == 77 and int(v50.get("heal_minor", -1)) > 0, "域上界 v=50:守恒成立且逐行权重恒正(域 [0,50] 安全)") + # 普通图摇号全链路确定性(off 路径)——同种子普通图资源映射逐位相同(golden 对拍另有批前快照) + var nrng = load("res://core/rng_service.gd").new() + nrng.set_master_seed(42) + var normal1 = load("res://core/battle_orchestrator.gd").new(_db, nrng) + normal1.begin_battle({"level_index": 2, "node_depth": 0, "hero_hp": int(_db.hero.max_hp)}) + var n1: Dictionary = _board_resource_dump(normal1) + var nrng2 = load("res://core/rng_service.gd").new() + nrng2.set_master_seed(42) + var normal2 = load("res://core/battle_orchestrator.gd").new(_db, nrng2) + normal2.begin_battle({"level_index": 2, "node_depth": 0, "hero_hp": int(_db.hero.max_hp)}) + check(n1 == _board_resource_dump(normal2) and not n1.is_empty(), "确定性:同种子普通图布置/摇号两遍逐位相同(off 全链路)") + + +func _arr_str_eq(a, b: Array) -> bool: + var arr: Array = a if a is Array else [] + if arr.size() != b.size(): + return false + for i in arr.size(): + if String(arr[i]) != String(b[i]): + return false + return true + + +func _rows_weights_equal(a: Array, b: Array) -> bool: + if a.size() != b.size(): + return false + for i in a.size(): + if String(a[i].get("reward_id", "")) != String(b[i].get("reward_id", "")) or int(a[i].weight) != int(b[i].weight): + return false + return true + + +func _rows_weight_map(rows: Array) -> Dictionary: + var m := {} + for r in rows: + m[String(r.get("reward_id", ""))] = int(r.weight) + return m + + +func _board_resource_dump(settlement) -> Dictionary: + var b = settlement.minesweeper.current_board() + var dump := {} + for c in b.variants.keys(): + dump["v:%d,%d" % [c.x, c.y]] = ",".join(b.variants[c]) + for y in b.height: + for x in b.width: + var ident = settlement._reward_economy.query_identity(Vector2i(x, y)) + if ident != null: + dump["r:%d,%d" % [x, y]] = String(ident.reward_id) + return dump + + # ---- 地形变异 布置段(首批类型定稿批 2026-09-19——棋盘设置顺序第 4 步断言面)---- # 布置发生在编排器战斗初始化(install 初始展开 + roll_board 资源格之后),生成器产物零变异—— # 本段经 begin_battle 走完整初始化序后断言:门控一致性 / 布置域 / 数量公式 / 连通片上限 / 确定性。 diff --git a/game/tests/unit/data_config/config_db_test.gd b/game/tests/unit/data_config/config_db_test.gd index bdf4c2bc..53cd86fd 100644 --- a/game/tests/unit/data_config/config_db_test.gd +++ b/game/tests/unit/data_config/config_db_test.gd @@ -81,13 +81,18 @@ func _test_progress_resolution(db) -> void: Kit.check("关卡越最大行 clamp 取最大关卡行", int(high.get("level_index", -99)) == max_l) -# ---- 变异池门控(unlock_level 闸 + ∅ board_types 通配)---- +# ---- 变异池门控(unlock_level 闸 + ∅ board_types 通配 + 节点身份第三维)---- func _test_variant_pool_gate(db) -> void: var rows: Array = db.variation.rows var gated_row := {} var wildcard_row := {} + var global_row := {} for row in rows: + if String(row.get("scope", "region")) != "region": + if global_row.is_empty(): + global_row = row # global 行第三维门控另测(全局作用域变异批 2026-10-04) + continue var tags: Array = row.get("board_types", []) if gated_row.is_empty() and not tags.is_empty(): gated_row = row @@ -104,6 +109,11 @@ func _test_variant_pool_gate(db) -> void: var u2: int = int(wildcard_row.unlock_level) var any_pool: Array = db.variant_pool(u2, "nonexistent_board_type_tag") Kit.check("∅ board_types 行通配(任一 board_type 命中)", _rows_contain(any_pool, wildcard_row)) + if not global_row.is_empty(): + var u3: int = int(global_row.unlock_level) + Kit.check("global 行 boss 节点入池(board_types ∅ 通配)", _rows_contain(db.variant_pool(u3, "nonexistent_board_type_tag", "boss"), global_row)) + Kit.check("global 行缺省双参调用跳过(既有调用口径零扰动)", not _rows_contain(db.variant_pool(u3, "nonexistent_board_type_tag"), global_row)) + Kit.check("global 行 battle 节点静默跳过(门控兜底零报错)", not _rows_contain(db.variant_pool(u3, "nonexistent_board_type_tag", "battle"), global_row)) func _rows_contain(pool: Array, row: Dictionary) -> bool: From e3a94fdf4661924dce41176ffac193c63ad06ca4 Mon Sep 17 00:00:00 2001 From: DKChan <524912269@qq.com> Date: Sun, 4 Oct 2026 17:53:02 +0800 Subject: [PATCH 5/6] =?UTF-8?q?=E5=85=A8=E5=B1=80=E4=BD=9C=E7=94=A8?= =?UTF-8?q?=E5=9F=9F=E5=8F=98=E5=BC=82=E9=A6=96=E5=8F=91=E6=89=B9=20T8=20?= =?UTF-8?q?=E5=87=BA=E5=8F=A3=EF=BC=88=E8=BF=AD=E4=BB=A314=E2=91=A2?= =?UTF-8?q?=E5=8F=B7=E5=8D=A1=EF=BC=89=EF=BC=9A=E5=87=BA=E5=8F=A3=E6=8A=A5?= =?UTF-8?q?=E5=91=8A=20design/qa/m4iter14-gvar-exit-report-2026-10-04.md?= =?UTF-8?q?=EF=BC=88=E5=9F=BA=E7=BA=BF=E4=B8=8E=E6=94=B9=E5=8A=A8=E9=9D=A2?= =?UTF-8?q?/=E5=80=BC=E9=9D=A2=E9=9D=99=E6=80=81=E6=8E=A8=E6=BC=94?= =?UTF-8?q?=E3=80=94EV=E9=99=8D=E5=B9=85r=E2=88=88[1.5,2.0]=E2=86=92-2.7%~?= =?UTF-8?q?-5.4%=E8=A6=86=E7=9B=963-5%=E7=9B=AE=E6=A0=87=E5=B8=A6=E3=80=95?= =?UTF-8?q?/Q3=E5=9B=9B=E4=BB=B6=E5=9C=B0=E5=BD=A2=E5=BA=94=E5=AF=B9?= =?UTF-8?q?=E4=BB=B6Boss=E5=9B=BE=E5=A4=B1=E6=95=88=E7=9F=A5=E6=83=85?= =?UTF-8?q?=E4=BB=A3=E4=BB=B7=E7=99=BB=E8=AE=B0/provisional=E8=BF=BD?= =?UTF-8?q?=E8=AE=A4=E5=8D=95=E4=B9=9D=E9=A1=B9/=E4=BA=BA=E9=97=B8?= =?UTF-8?q?=E5=AE=9E=E6=9C=BA=E7=9B=AE=E6=A3=80=E6=B8=85=E5=8D=95=E5=85=AD?= =?UTF-8?q?=E9=A1=B9/T7b=20MC=E8=AF=BB=E6=95=B0=E6=89=B9=E7=A7=BB=E4=BA=A4?= =?UTF-8?q?=3D=E4=B8=89=E6=80=81=E5=AF=B9=E8=B4=A6=E9=93=BEN60=E9=A1=BB?= =?UTF-8?q?=E7=94=A8=E6=88=B7=E6=89=B9=E5=87=86=EF=BC=89=EF=BC=9Broadmap?= =?UTF-8?q?=20=E2=91=A2=E5=8D=A1=E2=9C=85=E5=AE=9E=E6=96=BD=E6=89=B9?= =?UTF-8?q?=E8=90=BD=E5=9C=B0=E6=B3=A8=E8=AE=B0=EF=BC=88=E2=91=A5A4?= =?UTF-8?q?=E5=BC=80=E5=B7=A5=E9=97=A8=3D=E2=91=A1=E2=91=A2=E5=87=BA?= =?UTF-8?q?=E5=8F=A3=E2=80=94=E2=80=94=E2=91=A2=E5=87=BA=E5=8F=A3=E5=8D=B3?= =?UTF-8?q?=E8=A7=A3=E2=91=A5=E4=B8=80=E5=8D=8A=E5=89=8D=E7=BD=AE=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../m4iter14-gvar-exit-report-2026-10-04.md | 81 +++++++++++++++++++ roadmap.md | 2 +- 2 files changed, 82 insertions(+), 1 deletion(-) create mode 100644 design/qa/m4iter14-gvar-exit-report-2026-10-04.md diff --git a/design/qa/m4iter14-gvar-exit-report-2026-10-04.md b/design/qa/m4iter14-gvar-exit-report-2026-10-04.md new file mode 100644 index 00000000..dc914925 --- /dev/null +++ b/design/qa/m4iter14-gvar-exit-report-2026-10-04.md @@ -0,0 +1,81 @@ +# 全局作用域变异首发批 出口报告(迭代 14 ③号卡,2026-10-04) + +> 批任务书:design/research/任务书-全局作用域变异首发批-2026-10-04.md(台账 344,裁决 P1-P8+Q1-Q4 全按推荐案零待裁) +> loop 计划书:.zcode/plans/m4iter14-gvar-loop-plan-2026-10-04.md(gitignored,U0=开工令 prompt 预批准) +> worktree:g-plan2-m4iter14-gvar-20261004(基 9f64456) + +## 一、基线与改动面 + +**基线(开工实测)**:主区 head 9f64456;冒烟 718/0;run_all 15 套件;现行 MC 锚 `runsum_m4iter12_t10abb_n20_20261004`;variation.tres 6 行。 + +**改动面(五提交)**: +1. **T1-T4 核心面**:variation_table.gd(EFFECTS+`resource_face`/TRIGGERS+`always`/互锁三条+effect_value [0,50] 域)·variation.tres(+skewed_veins 行,7 行)·config_db.gd(variant_pool 第三参 node_type 缺省零扰动+global_variant_row 访问器)·board_data.gd(board_variants 板级字段+访问器)·battle_orchestrator.gd(装板序 `_resolve_global_variant` 前置于 roll_board+`_place_variants` 替换制早退)·reward_economy.gd(board_skew 旋钮+`_skewed_cell_rows` 整数最大余数投影+`_biased_cell_rows` 基座换源=合成序)。 +2. **T5 呈现三层**:settlement_fx_view.play_board_variant_banner(轮横幅先例+减动效静态双态)·hero_info_panel_view 地形变异常驻角标段(流派件段先例空态隐藏)·hud_presenter.board_variant_lines+快照投影接线·main.gd 开战横幅挂钩(首轮快照判空发射)·ui_assembler 手册行。 +3. **T6 文档七正主**:地形变异.md v0.7(类型清单+§全局作用域型+门控三维+布置段注记+调参/验收+P2 Alpha 行换代)·难度曲线与Boss.md(P2 投放计划行升级现行+调参表 resource_face 行)·registry=architecture.md(variation 行换代)·HUD框架.md v0.13(义务行+验收+v 史)·教学引导.md v0.4(条目+V 史)·行动经济.md(P2 价目钩子=案D 留位不启用注记)·06 条目解决移除。 +4. **T7 断言批**:smoke_all.gd 新段 29 断言(互锁负样本③-⑦/门控三维/L1 免疫/elite 前向位/替换制恰一行+零 region 格/variant_place 零取号(取号计数桩)/快照投影/守恒 77/白名单/v=30 构造例/合成序构造例/v=50 域上界/确定性)·config_db_test 换代(通配选择器限定 region+global 第三维三断言)。 +5. **出口**:本报告+roadmap ③卡落地注记。 + +**执行发现(实现位调和,随批呈报)**:任务书 T2 字面把全局分支写在 `_place_variants`,但装板序中 roll_board 先于布置段而 T3 偏斜旋钮须在摇号前定型——全局决议前移至装板序内(`_resolve_global_variant`),替换制/兜底回落/零取号/恒定制四语义不变,普通图路径零 diff。属数据依赖的机械位调和,非裁决重开。 +**既有行为登记(本批零触碰)**:`luck_bias` 注入时点在 begin_battle 首板 install 之后——首板 roll 恒 0、偏运硬币仅轮内刷新图生效;系迭代 11 对拍锚现行口径,合成序「图级先件级后」在单次 roll 内的权重代数不受影响。 + +## 二、值面静态推演(T3 义务——只测不判,精确判读归 T7b 读数批/M-4) + +**权重面位移(v=30,整数最大余数实现,构造例已断言)**: + +| 行 | 基线 | v=30 实现 | 精确目标 w×(1−v/100) | +|---|---|---|---| +| attack_up | 14 | 15 | 15.37 | +| spark_aoe | 16 | 18 | 17.57 | +| pierce_strike | 8 | 9 | 8.78 | +| magic_bolt | 8 | 9 | 8.78 | +| heal_minor | 4 | 3 | 2.8 | +| ac_up | 11 | 7 | 7.7 | +| weaken / ap_up / gp_coin | 8 / 6 / 2 | 8 / 6 / 2(逐位不动) | 同 | + +- **合计守恒**:偏斜后 77 恒成立(整数域构造性保证——下调量按进攻族原权重比例最大余数重分配;任意 v∈[0,50] 均守恒,v=50 已断言)。 +- **份额位移**:生存族 15/77=19.5% → 10/77=13.0%(整数实现;精确目标 13.6%);进攻族 59.7% → 66.2%。 +- **EV 方向与幅度**:以「生存单位当量 : 进攻单位当量 = r」的静态参数化——EV 降幅 = [46+15r+16 − (51+10r+16)]/(46+15r+16)(整数实现)。r=1.5 → −2.96%;r=1.75 → −4.1%;r=2.0 → −5.4%。精确权重实现 r∈[1.5,2.0] → −2.7%~−4.9%。**结论**:方向=微降 ✓;3-5% provisional 目标带对应 r≈1.6–1.9,落在「生存族当量价值高于进攻族」前提的合理域内——方向与幅度的静态核对通过,精确读数归 T7b(MC 三态对账链)与带 A 判读(M-4,Q4 甲只测不判)。 +- **占比带 [15,40] 关联**:进攻族池份额上浮 6.5pp 间接推高奖励侧输出占比——越带与否只呈报不回调(S2),归 T7b 读数面。 + +## 三、Q3 知情代价登记(registry/调参日志随批登记义务) + +**替换制+案A(无地形格)⇒ 迭代 12 四件地形应对件在 Boss 图无的放矢**:地脉采撷/荆棘编织者/净化工兵/熔火之躯的触发域=region 变异格(挖伤害格/中和相邻伤害格/受地形伤积层),替换制下 Boss 图零 region 格——四件在 Boss 图整件失效,仅普通图(每关 6/7 张主战场)有效。**登记为知情代价**(Q3 甲裁决,2026-10-04);registry variation 行与地形变异.md v0.7 版本史 ⑨ 同步注记;MC on 档读数观察其普通图侧平衡(T7b)。 + +## 四、闸结果(实施批闸=T7;MC 读数批=T7b 切独立后批) + +| 闸 | 结果 | +|---|---| +| 冒烟全量 | **747/0**(基线 718+新段 29——断言总数只增不减 ✓) | +| run_all | **15 套件全绿**(config_db_test 换代 +3) | +| 普通图逐位回归(S1) | golden 对拍 **12/12 全等**(4 种子×3 关×布置+摇号+RNG 计数器,批前批后逐位一致——S1 零触发) | +| 全探针 | 六探针结果见提交前终录(ui_input/ui_click 三种子/ui_probe/ui_layout/fx/t17_defer) | +| doc 三闸+熵增 | 结果见提交前终录(预期零新增) | +| MC | **未跑**(T7b 切独立后批——总量 120 局=一档·调研,须用户批准发起;现行锚只读) | + +## 五、provisional 追认单(出口人闸,全部不阻塞实施) + +| # | 项 | 现值 | 备注 | +|---|---|---|---| +| 1 | 偏斜幅度 effect_value | 30 | 域 [0,50];0=中性 off 锚;调参项走调参不走修订 | +| 2 | 命名 | skewed_veins / 贫矿脉 | 文案归本地化批 | +| 3 | 横幅文案 | 「地形变异 · 贫矿脉 · 奶薄枪肥」 | 驻留 0.6s 同轮横幅 | +| 4 | 角标文案与摆位 | C 区「地形变异」段(流派件段下方)·「贫矿脉 · 奶薄枪肥」 | 摆位 provisional 归 HUD 框架批 | +| 5 | 手册行 | 玩法帮助块末行(地形变异一句) | 零交互教学 | +| 6 | N=60 | T7b 双档配对局数 | 跑批须用户批准 | +| 7 | 兜底回落行为 | Boss 图全局池空回落 region 布置 | 保守向后兼容 | +| 8 | 全局池多行取首行 | 防御口径(首发恒恰一行) | 越界态另批 | +| 9 | 开战横幅发射位 | 首轮 round_started 快照判空(刷新图不重发,角标承担常驻) | 实现位调和连带 | + +## 六、人闸实机目检清单(L2 Boss 开一局即可全查) + +1. L2 Boss 开战:轮横幅下方叠「地形变异 · 贫矿脉 · 奶薄枪肥」横幅(减动效开=静态驻留)。 +2. 战斗全程 C 区常驻「地形变异」角标(轮内刷新图后仍在);普通图/L1 Boss 该段隐藏。 +3. 体感核对:奶(回血格)明显变少、攻击/爆裂/穿刺/奥术格变多(「奶薄枪肥」)。 +4. 帮助面板(玩法帮助块)末行有整图变异说明。 +5. L1 Boss 无变异(无横幅无角标)。 +6. 普通图:region 变异格照旧、零角标零横幅。 + +## 七、③出口完成宣告与 T7b 移交 + +**③号卡实施批出口成立**(本报告+闸全绿+七正主落籍)。**⑥A4 配比批开工门=②③出口——本批出口即解⑥一半前置**(另半=②判式换代批出口)。 +**T7b MC 读数批移交**:三态对账链=现行锚(`runsum_m4iter12_t10abb_n20_20261004` 只读——旧 Boss 读数含台账 96 承伤 55.8% 换代作废只测不判)+off(effect_value=0:替换制生效+偏斜中性,语义=零变异 Boss 图,与现行锚语义不同须注明)+on(偏斜 30);N=60 同种子配对;读数面=战役通关率+Boss 场承伤+奖励占比带 [15,40] 复算+偏斜期望实测;**只测不判**(带 A 判读归 M-4);**跑批前须用户批准**(先推算后重跑)。 diff --git a/roadmap.md b/roadmap.md index ea5d52da..67eb7fac 100644 --- a/roadmap.md +++ b/roadmap.md @@ -59,7 +59,7 @@ | 迭代 11+ | **✅ 三批已落籍(2026-10-03,台账 323-325)**:①魔法道具同调实施批 bc17b66(冒烟 645/0→671/0 基线演进)→ ②GP 商店房重构批 395b2ab(共享池账本+抽 3 买 1 全重抽+A=1.8/b=1.1 provisional+MC off 对拍逐位 PASS+on 新锚 N=60)→ ④视野迷雾实施批 e6260a5(菱形灯光区 R8+区外全黑+暗淡记忆态+探针 case⑮;纯呈现 MC 零跑)——各批合并后主区全量冒烟复跑全绿;**迭代 11 门=待出口人闸关闭(人闸材料包=design/qa/m4-iter11-exit-package-2026-10-03.md:三批检查单+追认清单 18 项+迷雾目检指引+读数报告)**。原登记:**2026-10-03 用户裁迭代 11 范围(三批,推荐序)**:①魔法道具同调实施批 → ②GP 商店房重构批 → ④视野迷雾实施批(各批独立出口闸;同调批先行——商店批共享池账本与通关率复测建在 aux 卡退役后的终局池上,读数只锚一次;迷雾批纯呈现不扰读数,序位可穿插);**反制批移迭代 12**(前置=双层 BD 外部调研+仲裁后重新立项;2026-10-03 用户终裁=同调位反制道具层级错配失败设计废弃,「每变异≥1反制道具」契约作废——地形变异.md v0.6/魔法道具.md v0.8 同批落文(06 条目已收口移除));**Beta 方向立项撤出本窗口**(待 Alpha 内容填充+试玩轮次后再议);关卡内容扩展留讨论位(世界观设定待用户补正主——摩索不达城 repo 无载)。↓ 原登记:反制批 Alpha · **魔法道具同调实施批**(任务书 v1.1 全裁 P1-P8=`design/research/任务书-魔法道具同调实施批-2026-10-02.md`,2026-10-02 用户裁 P7 乙归本窗口,发令即开工——任务书含 T0-T10 可升 loop 计划书)· **GP 商店房重构批**(2026-10-02 用户裁三选一同构化:买一全重抽/重抽绑购买/价格=基价×b^(关序−1)×A^(进店已购次数)〔系数归 game-balancer 研究〕,取代 09-20 无刷新裁决——06「GP 商店房重构」条在册待立项)· 关卡内容扩展 · Beta 方向立项(原迭代 10+ 三主题顺延——迭代 10 位已由奖励结构重构批占用,2026-09-30 用户拍板 P-E;各批顺序按 Alpha 读数定;含营地 2D 画面议题——2026-09-29 裁缓至此再议) | M-3 出口闸(**已解**——2026-10-03 迭代 9 出口闸收官:M-3 关闭、Alpha 到手) | 立项时按「迭代粒度界定」拆任务卡 | | 迭代 12 | **双层 BD 实施批(反制批位移承接——变异应对局内化在本批落地)**:**2026-10-03 用户五裁全落**=R1 甲(树形态融合案:主干脊柱 row-gating+三脉+彩蛋 ≤3+A/B 集中同调脉)/R2 乙(**两层全入本迭代**:批次一 T0-T7=机制件基建+七流派全量铺〔R3 乙〕+地形转化件+商店保底+MC 锚;批次二 T8-T10=天赋树+存档 v4+营地 UI 重构;超软时间盒切 12/12b,切分点=批次一出口)/R3 乙(七流派批次一全量铺)/R4 甲(**信息型永不对冲**+复查闸=T10 呈报信息型真人读数仅呈报不提案;净化工兵仅限伤害型、清除工具件族不做、深挖钻头改非信息税设计)/R5 甲(喂雷流不做,06 留正式待办+kill-switch 判据)。未落地备选内容已自包含迁 06「双层 BD 延期与备选内容总登记」。设计事实源=`design/research/双层BD体系-整合定稿-2026-10-03.md`(双模型并行调研仲裁版),任务书=`design/research/任务书-双层BD实施批-2026-10-03.md`(已定稿)。**✅ 已全批落籍(2026-10-04,台账 328-333)**:TP0 令牌池先行(normal 重锚)→批次一 T0-T7(27 件七流派+MC 成型锚 L1 5%→75% 分岔+红线自检①过)→批次二 T8-T10(天赋树 33 节点+存档 v5+营地树 UI+A/B 面 0.0pp)一次合并 e780063;试玩反馈四连修复(钻头 AP 锁死/v2 收益重投/流派件呈现双界面/清图奖励 toast)至 c43276d;批末冒烟 718/0+run_all 15+探针绿+doc 三闸基线同款+熵增 PASS;**出口人闸待用户**(人工检查清单=台账 328-333+design/qa/m4iter12 两报告);前置=迭代 11 三批出口+M-4 数值批令牌池落地+商店批共享池 | 迭代 11 出口 | T0-T10 两段式(任务书 §四) | | 迭代 13 | **工程债与测试基建批(含 D6 爆破工兵包实施)**:六条目=ui_click_probe 完整局适配(D1——分派链序修正+停点/锁期/重放三态断言)/探针只读出口(D2——六出口 26 直入清零)/ArmedTimer helper(D3——P4 乙三处计时收口缝零动)/main.gd 二期瘦身(D4——bonus_interact_controller+camp_shop_presenter 拆件 1370→1119,家族②契约3绑定面留置;~900±50 锚差=族级清单上限不自洽已归因)/aux 二期合并(T5 判不合收口)/杂项尾差四件(D5)/爆破工兵包中立移除雷格(D6——P1 甲邻接冻结/P2 甲退色降档,判定逻辑零改动,充能表驱动零新码)。**✅ 已落籍(2026-10-04,台账 342)**:worktree m4iter13-debt-20261004 八提交 cd7d3ea…2402877 合并 eff8cb8;闸=冒烟 718/0(断言数持平基线)+run_all 15+click 三种子绿+全探针绿+doc 三闸零新增+熵增 PASS+MC 零跑(静态零漂移证明);合并后主区全量复跑同绿 | 迭代 12 出口 | T0-T9 ≈4.8-5.3d(知情超限单批,实际单会话) | -| 迭代 14 | **初始展开收窄批(2026-10-04 用户拍板甲乙混合立项)**:甲=先布后删剃雷域收窄至出生 3×3∪外扩 r 环(参数化半径,现值 r=1——开阔地均值从板面 66.5% 根因性降至约三成)+乙=生成重掷闸 R₀≤cap(合法性门序列、cap=板面 30% 锚〔10×10=30/12×12=43/13×13=51〕、重试耗尽走既有三分出口);**玩法侧零改动路线**(排雷玩法「初始展开恰等」验收原样为真,minesweeper_rules.gd 零 diff);裸数字截断路否决退役(可见 0 格+未开邻居=扫雷不可能态)。可行性报告=`design/research/研究-初始展开收窄可行性-2026-10-04.md`,任务书=`design/research/任务书-初始展开收窄批-2026-10-04.md`(T0-T8≈5.25d,读数批 T5-T6 可切独立后批;拍板点 P1-P3 全读数后置;停机点 S1 相变警戒/S2 带越界回调)。**②挖掘风险不等式判式换代批(2026-10-04 用户裁编入本迭代,作为迭代内需求)**:判式三层换代(条款2 标中旗锚/条款3 聚合健康式「(1−ρ̂)E_dig−ρ̂V_mine≥0」/旗边际引理+条件二旗溢价)+β 比值带判读 [1.2,2.5](u=3 登记态)+标中兑付溢价 δ=1.25(形态 a 兑付公式一处·雷安同池冻结不动)+runsum 旗行为五字段+audit 工具常量刷新(池 77/直伤 6-8-8/AP 8);裁决全落零新拍板点(方案报告=`design/research/方案-挖掘风险不等式修订-2026-10-04.md` §九),任务书=`.zcode/plans/mine-inequality-revision-miniloop-plan-2026-10-04.md`(T0-T5≈2.5d;条件二 T3 落文按登记已知破·T4 机制转绿;契约红线=DamageController 零改/直伤雷 6-8-8 与 p_perfect 不动——iter8 缺口四选一解绑独立在案;开工门=U0)。**③全局作用域变异首发批(2026-10-04 用户拍板立项——调研报告 P1-P8+盘问 Q1-Q4 全按推荐案落,批内序位待排)**:L2/L3 Boss 图恒定一型 scope=global 变异,首发型=**案A 资源面·微贫向偏斜**(正向格面池合计不变、进攻族 attack/blast/pierce/magic 权重上浮/生存族 heal/defense 明显下调、EV 微降 3-5% provisional、gp/action 白名单不动;v1.0「沃土+雷密对冲」形勘误作废——雷数为生成器事实、布置段不可加,改生成端=踩结构面否决理由);**替换制**(Boss 图不再布 region 片——L2 完美 Boss 承伤 55.8% 已越带不叠加;迭代 12 四件地形应对件在 Boss 图失效=知情代价,registry/调参日志随批登记);L1 Boss 免疫(带B [50,85] 教学保护);三层预告(开战横幅+HUD 常驻角标+帮助手册行);带A 判读后置 M-4(落地 off/on 对拍只测不判;off 基线=替换制后零变异 Boss 图,与现行带 region 片 Boss 图语义不同须注明);偏运硬币合成序=图级先件级后(代拍随批锚登记)。调研报告(事实源,v1.1 裁决落盘)=`design/research/调研-全局作用域变异设计空间-2026-10-04.md`,任务书=`design/research/任务书-全局作用域变异首发批-2026-10-04.md`(T0-T8≈5.75d,读数批 T7 可切独立后批→主体≈5.25d;零新拍板点·provisional 追认单随批;停机点 S1 普通图逐位漂移/S2 读数越带只呈报/S3 互锁误伤;开工门=U0;**⑥A4 批开工门含本批出口——本批落地图级偏斜投影点为⑥合成链中段**)。与①②互不撞(收窄=普通图初始展开轴/判式=不等式判读口径/全局变异=Boss 图资源面轴),出口读数各自分开归因。**④技能池执行批(2026-10-04 用户点名入列——调研+四裁+任务书全齐,06 Alpha 验证条目随之收口)**:文档五件(敌人系统.md 池构成表补 L2/L3 五敌种行/护甲列改读表口径/Boss 三代错峰句/意图呈现节补解锁弹出规格/版本 v0.13+EV 锚整数口径重登记+enemy.tres 批注消歧)+**新机制一件=Boss 半血解锁新独占伤害技**(三 Boss 血量 ≤50%〔用户口径定死〕解锁:酋长「震地怒击」类 ×2.5/CD4·卓尔遏毒类 ×2.0/CD3·石君王「岩崩」类 ×2.5/CD4——参考档即工作值,命名 T5 定稿、倍率冷却 provisional 归调参;enemy.tres 池条目扩 unlock_hp_pct 键〔int [1,99] 缺省无=无门槛〕;未解锁条目双面过滤不进摇号与保底集合;解锁出一次归因明细行「XX 解锁了 YY」);首拍加权取消(杂鱼纹理注销——巨蜘蛛 52% 读数已被 Package B 抬血自愈、地精两行终裁不加工);呈现=明细行+既有类型级预告+解锁时技能名一次性弹出(零动画资产、不改演出);裁决 D1-D8 零待裁;任务书=`design/research/任务书-技能池执行批-2026-10-04.md`(T0-T7≈4.25d,切分预案在册)——开工=用户发令升计划书。**⑤魔法提灯 +2 效果接线(小卡)**:零调研直入——2026-09-30 拍板④已裁(灯甲视野外扩 +2 格、类型微光不随视野扩),迷雾批已留常量 LIGHT_RADIUS_LANTERN_BONUS,纯接线+断言估 0.5d 内。原候选卡注记终态(2026-10-04):敌人系统内容批=已具化为④;教学引导定稿批=用户裁改排 Beta(06 教学节头注记在案),移出本迭代候选。**⑥冒险前资源配比预设批(A4,2026-10-04 用户令编入本迭代——提案八裁全落,裁决事实源=design/research/提案-冒险前资源配比预设-2026-10-04.md §八§九§十)**:玩家冒险开始前预设格面九型资源分布(预设分布不预设落位,装板摇号定落位)——预算=组合制(总量挪点·九型正向权重总和恒 77+每型上下限包络+容量随营地解锁渐进;gp 首发不可调〔包络 (2,2)〕/预设档 3 套/下限>0);合成序=表值→玩家配比差值→包络钳制→图级变异偏斜→同调硬币偏置(包络只管玩家差值——**序位在②③之后**,三者共用摇号投影点);注入=差值向量 ΣΔ=0 关态逐位零扰动;柜台=奖励格图鉴逐型商品(每型可调权一件);冒险开始锁档中途不可换;包络宽度随容量分级放宽;验收=默认分布锚+极端构筑护栏带。容量定价与包络数值 provisional(包络数值须待②号新当量账+真人读数双锚校准);行动经济对账按包络复算(总量恒 77 只余分布位移变量)。**任务书已起草**=design/research/任务书-冒险前资源配比预设批-2026-10-04.md(T0-T8≈6.0d,两段切分预案在册〔段一机制 T0-T4+T6≈3d/段二界面闸 T5+T7+T8≈3d〕;开工门=②③号卡出口;零新拍板点,provisional 归出口追认;停机点 S1-S3 在册)。 | 迭代 13 出口(**迭代 13 已落籍 2026-10-04 eff8cb8**,台账 342) | 初始展开批 T0-T8(可两段切分)+判式换代批 T0-T5≈2.5d(独立 worktree 合并)+全局变异首发批 T0-T8≈5.75d(读数批可切,独立 worktree 合并)+技能池执行批 T0-T7≈4.25d(独立 worktree 合并)+提灯接线小卡 0.5d(可并入任一批顺路)+配比预设批 A4 T0-T8≈6.0d(两段切分可拆;开工门=②③出口;独立 worktree 合并) | +| 迭代 14 | **初始展开收窄批(2026-10-04 用户拍板甲乙混合立项)**:甲=先布后删剃雷域收窄至出生 3×3∪外扩 r 环(参数化半径,现值 r=1——开阔地均值从板面 66.5% 根因性降至约三成)+乙=生成重掷闸 R₀≤cap(合法性门序列、cap=板面 30% 锚〔10×10=30/12×12=43/13×13=51〕、重试耗尽走既有三分出口);**玩法侧零改动路线**(排雷玩法「初始展开恰等」验收原样为真,minesweeper_rules.gd 零 diff);裸数字截断路否决退役(可见 0 格+未开邻居=扫雷不可能态)。可行性报告=`design/research/研究-初始展开收窄可行性-2026-10-04.md`,任务书=`design/research/任务书-初始展开收窄批-2026-10-04.md`(T0-T8≈5.25d,读数批 T5-T6 可切独立后批;拍板点 P1-P3 全读数后置;停机点 S1 相变警戒/S2 带越界回调)。**②挖掘风险不等式判式换代批(2026-10-04 用户裁编入本迭代,作为迭代内需求)**:判式三层换代(条款2 标中旗锚/条款3 聚合健康式「(1−ρ̂)E_dig−ρ̂V_mine≥0」/旗边际引理+条件二旗溢价)+β 比值带判读 [1.2,2.5](u=3 登记态)+标中兑付溢价 δ=1.25(形态 a 兑付公式一处·雷安同池冻结不动)+runsum 旗行为五字段+audit 工具常量刷新(池 77/直伤 6-8-8/AP 8);裁决全落零新拍板点(方案报告=`design/research/方案-挖掘风险不等式修订-2026-10-04.md` §九),任务书=`.zcode/plans/mine-inequality-revision-miniloop-plan-2026-10-04.md`(T0-T5≈2.5d;条件二 T3 落文按登记已知破·T4 机制转绿;契约红线=DamageController 零改/直伤雷 6-8-8 与 p_perfect 不动——iter8 缺口四选一解绑独立在案;开工门=U0)。**③全局作用域变异首发批(2026-10-04 用户拍板立项——调研报告 P1-P8+盘问 Q1-Q4 全按推荐案落,批内序位待排)**:L2/L3 Boss 图恒定一型 scope=global 变异,首发型=**案A 资源面·微贫向偏斜**(正向格面池合计不变、进攻族 attack/blast/pierce/magic 权重上浮/生存族 heal/defense 明显下调、EV 微降 3-5% provisional、gp/action 白名单不动;v1.0「沃土+雷密对冲」形勘误作废——雷数为生成器事实、布置段不可加,改生成端=踩结构面否决理由);**替换制**(Boss 图不再布 region 片——L2 完美 Boss 承伤 55.8% 已越带不叠加;迭代 12 四件地形应对件在 Boss 图失效=知情代价,registry/调参日志随批登记);L1 Boss 免疫(带B [50,85] 教学保护);三层预告(开战横幅+HUD 常驻角标+帮助手册行);带A 判读后置 M-4(落地 off/on 对拍只测不判;off 基线=替换制后零变异 Boss 图,与现行带 region 片 Boss 图语义不同须注明);偏运硬币合成序=图级先件级后(代拍随批锚登记)。调研报告(事实源,v1.1 裁决落盘)=`design/research/调研-全局作用域变异设计空间-2026-10-04.md`,任务书=`design/research/任务书-全局作用域变异首发批-2026-10-04.md`(T0-T8≈5.75d,读数批 T7 可切独立后批→主体≈5.25d;零新拍板点·provisional 追认单随批;停机点 S1 普通图逐位漂移/S2 读数越带只呈报/S3 互锁误伤;开工门=U0;**⑥A4 批开工门含本批出口——本批落地图级偏斜投影点为⑥合成链中段**)。与①②互不撞(收窄=普通图初始展开轴/判式=不等式判读口径/全局变异=Boss 图资源面轴),出口读数各自分开归因。**✅ 实施批落地(2026-10-04,worktree m4iter14-gvar-20261004 台账 345)**:T1-T8 实施批全落(T7b MC 读数批按切分预案切独立后批,跑批待用户批准)——skewed_veins 贫矿脉行+互锁三条+effect_value [0,50]/门控第三维节点身份/替换制+兜底回落/装板序全局决议前置(数据依赖调和,出口报告在册)/资源面偏斜投影(整数最大余数守恒 77+合成序图级先件级后)/三层预告三层全接/七正主落文+06 收口;闸=冒烟 747/0(+29)+run_all 15+golden 普通图逐位 12/12 全等+六探针+三闸熵增终录见批报告 design/qa/m4iter14-gvar-exit-report-2026-10-04.md(Q3 四件应对件知情代价登记+静态推演+provisional 追认单+人闸目检清单);**③出口成立——⑥A4 开工门解一半**(另半=②出口);off/on 双档读数待 T7b(带 A 判读归 M-4 只测不判)。**④技能池执行批(2026-10-04 用户点名入列——调研+四裁+任务书全齐,06 Alpha 验证条目随之收口)**:文档五件(敌人系统.md 池构成表补 L2/L3 五敌种行/护甲列改读表口径/Boss 三代错峰句/意图呈现节补解锁弹出规格/版本 v0.13+EV 锚整数口径重登记+enemy.tres 批注消歧)+**新机制一件=Boss 半血解锁新独占伤害技**(三 Boss 血量 ≤50%〔用户口径定死〕解锁:酋长「震地怒击」类 ×2.5/CD4·卓尔遏毒类 ×2.0/CD3·石君王「岩崩」类 ×2.5/CD4——参考档即工作值,命名 T5 定稿、倍率冷却 provisional 归调参;enemy.tres 池条目扩 unlock_hp_pct 键〔int [1,99] 缺省无=无门槛〕;未解锁条目双面过滤不进摇号与保底集合;解锁出一次归因明细行「XX 解锁了 YY」);首拍加权取消(杂鱼纹理注销——巨蜘蛛 52% 读数已被 Package B 抬血自愈、地精两行终裁不加工);呈现=明细行+既有类型级预告+解锁时技能名一次性弹出(零动画资产、不改演出);裁决 D1-D8 零待裁;任务书=`design/research/任务书-技能池执行批-2026-10-04.md`(T0-T7≈4.25d,切分预案在册)——开工=用户发令升计划书。**⑤魔法提灯 +2 效果接线(小卡)**:零调研直入——2026-09-30 拍板④已裁(灯甲视野外扩 +2 格、类型微光不随视野扩),迷雾批已留常量 LIGHT_RADIUS_LANTERN_BONUS,纯接线+断言估 0.5d 内。原候选卡注记终态(2026-10-04):敌人系统内容批=已具化为④;教学引导定稿批=用户裁改排 Beta(06 教学节头注记在案),移出本迭代候选。**⑥冒险前资源配比预设批(A4,2026-10-04 用户令编入本迭代——提案八裁全落,裁决事实源=design/research/提案-冒险前资源配比预设-2026-10-04.md §八§九§十)**:玩家冒险开始前预设格面九型资源分布(预设分布不预设落位,装板摇号定落位)——预算=组合制(总量挪点·九型正向权重总和恒 77+每型上下限包络+容量随营地解锁渐进;gp 首发不可调〔包络 (2,2)〕/预设档 3 套/下限>0);合成序=表值→玩家配比差值→包络钳制→图级变异偏斜→同调硬币偏置(包络只管玩家差值——**序位在②③之后**,三者共用摇号投影点);注入=差值向量 ΣΔ=0 关态逐位零扰动;柜台=奖励格图鉴逐型商品(每型可调权一件);冒险开始锁档中途不可换;包络宽度随容量分级放宽;验收=默认分布锚+极端构筑护栏带。容量定价与包络数值 provisional(包络数值须待②号新当量账+真人读数双锚校准);行动经济对账按包络复算(总量恒 77 只余分布位移变量)。**任务书已起草**=design/research/任务书-冒险前资源配比预设批-2026-10-04.md(T0-T8≈6.0d,两段切分预案在册〔段一机制 T0-T4+T6≈3d/段二界面闸 T5+T7+T8≈3d〕;开工门=②③号卡出口;零新拍板点,provisional 归出口追认;停机点 S1-S3 在册)。 | 迭代 13 出口(**迭代 13 已落籍 2026-10-04 eff8cb8**,台账 342) | 初始展开批 T0-T8(可两段切分)+判式换代批 T0-T5≈2.5d(独立 worktree 合并)+全局变异首发批 T0-T8≈5.75d(读数批可切,独立 worktree 合并)+技能池执行批 T0-T7≈4.25d(独立 worktree 合并)+提灯接线小卡 0.5d(可并入任一批顺路)+配比预设批 A4 T0-T8≈6.0d(两段切分可拆;开工门=②③出口;独立 worktree 合并) | ## 执行纪律(2026-09-27 用户立规) From 32c9961726a79c7909bef323e2ab6fae1e7011ac Mon Sep 17 00:00:00 2001 From: DKChan <524912269@qq.com> Date: Sun, 4 Oct 2026 17:54:17 +0800 Subject: [PATCH 6/6] =?UTF-8?q?=E5=85=A8=E5=B1=80=E4=BD=9C=E7=94=A8?= =?UTF-8?q?=E5=9F=9F=E5=8F=98=E5=BC=82=E9=A6=96=E5=8F=91=E6=89=B9=20?= =?UTF-8?q?=E5=8F=B0=E8=B4=A6345+=E5=BF=AB=E7=85=A7=E8=8A=82=EF=BC=88?= =?UTF-8?q?=E8=BF=AD=E4=BB=A314=E2=91=A2=E5=8F=B7=E5=8D=A1=E5=AE=9E?= =?UTF-8?q?=E6=96=BD=E6=89=B9=EF=BC=89=EF=BC=9AT1-T8=20=E5=AE=9E=E6=96=BD?= =?UTF-8?q?=E6=89=B9=E5=85=A8=E8=90=BD+T7b=20=E5=88=87=E7=8B=AC=E7=AB=8B?= =?UTF-8?q?=E5=90=8E=E6=89=B9=E5=BE=85=E7=94=A8=E6=88=B7=E6=89=B9=E5=87=86?= =?UTF-8?q?=E2=80=94=E2=80=94=E9=97=B8=E7=BB=88=E5=BD=95=EF=BC=88=E5=86=92?= =?UTF-8?q?=E7=83=9F747/0+run=5Fall15+golden=2012/12+=E5=85=AD=E6=8E=A2?= =?UTF-8?q?=E9=92=88+=E4=B8=89=E9=97=B8=E7=86=B5=E5=A2=9E=E9=9B=B6?= =?UTF-8?q?=E6=96=B0=E5=A2=9E=EF=BC=89/=E6=89=A7=E8=A1=8C=E5=8F=91?= =?UTF-8?q?=E7=8E=B0=EF=BC=88=E8=A3=85=E6=9D=BF=E5=BA=8F=E5=86=B3=E8=AE=AE?= =?UTF-8?q?=E5=89=8D=E7=BD=AE=E8=B0=83=E5=92=8C+luck=5Fbias=20=E9=A6=96?= =?UTF-8?q?=E6=9D=BF=E9=9B=B6=E6=B3=A8=E5=85=A5=E6=97=A2=E6=9C=89=E5=8F=A3?= =?UTF-8?q?=E5=BE=84=EF=BC=89/=E2=91=A2=E5=87=BA=E5=8F=A3=E6=88=90?= =?UTF-8?q?=E7=AB=8B=3D=E2=91=A5A4=E5=BC=80=E5=B7=A5=E9=97=A8=E8=A7=A3?= =?UTF-8?q?=E4=B8=80=E5=8D=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- active.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/active.md b/active.md index 40dda94e..78f613f9 100644 --- a/active.md +++ b/active.md @@ -11,6 +11,7 @@ - **工程路线图**:`production/roadmap.md`(2026-09-17 建——里程碑时间线 + 路线图;实时状态看下方快照节) ## 当前状态快照(收口批先更新本节,再追加台账;≤10 行) +- **更新于**:2026-10-04(**全局作用域变异首发批实施批落籍**,worktree m4iter14-gvar-20261004 六提交 fcb95f2→e3a94fd+台账批,台账 345):迭代 14 ③号卡 T1-T8 实施批全落(T7b MC 读数批按切分预案切独立后批)——skewed_veins 贫矿脉(scope=global 案A 微贫偏斜 v=30 provisional)+互锁三条+门控第三维节点身份+替换制/兜底回落+装板序全局决议前置(数据依赖调和在册)+资源面偏斜投影(整数最大余数守恒 77·合成序图级先件级后·luck_bias 首板零注入既有口径登记)+三层预告(横幅/角标/手册)+七正主+06 收口;闸=冒烟 747/0(+29)+run_all 15+golden 普通图逐位 12/12 全等+六探针绿+三闸/熵增零新增(存量同款);出口报告=design/qa/m4iter14-gvar-exit-report-2026-10-04.md(静态推演+Q3 四件应对件知情代价+provisional 九项+人闸目检六项);**③出口成立——⑥A4 开工门解一半**;T7b 三态对账链 N=60 待用户批准发起。 - **更新于**:2026-10-04(**全局作用域变异首发批任务书落籍**,worktree globalvariant-tb 单提交+主区合并,台账 336):任务书=design/research/任务书-全局作用域变异首发批-2026-10-04.md(T0-T8≈5.75d,读数批 T7 可切→主体≈5.25d;§一裁决全录零拍板点/§二形态定稿/§三参数面〔skewed_veins 行+effect_value [0,50] 投 30 provisional〕/§六验收/§七红线六条+停机点 S1-S3);roadmap ③卡换代(任务书路径+估时+⑥A4 前置注记——A4 合成链中段=本批图级偏斜投影点,③先于⑥开工);纯文档零代码;开工门=U0 用户发令。 - **更新于**:2026-10-04(**全局作用域变异调研裁决+迭代14③号卡立项批落籍 master**,worktree global-variant-iter14-20261004 单提交 29db278+主区合并,台账 335〔撞号改登——334 系并行挖掘风险不等式调研批先落,先例同台账 96/90〕):调研报告 v1.1(design/research/调研-全局作用域变异设计空间-2026-10-04.md)——P1-P8+盘问 Q1-Q4 全按推荐案落(案A 资源面·微贫向偏斜首发/替换制/L2L3 Boss 双关同型恒定制/L1 免疫/三层预告/带A 判读后置 M-4/远期案留档;勘误=沃土+雷密对冲形作废,雷数系生成器事实布置段不可加)+roadmap 迭代 14 行③号卡需求登记(与①收窄批②判式批互不撞,读数分开归因);纯文档零代码零 git 冒烟面;任务书待起草(前置换用户发令)。 - **更新于**:2026-10-04(**挖掘风险不等式修订调研+裁决收官+迭代 14 编入**,四 worktree 批纯文档零代码零模拟 6c20740→1da9a41→b31afdb→34cf6fe,台账 334):方案报告落 design/research/(破线四层定位+同池引理+池 77 口径修正+d70f6c3 时效修正);用户两轮「按推荐的来」全裁 P1-P7+grill 七问(形态(a)兑付溢价 δ=1.25/条件二登记已知破 T4 机制转绿/β 带 [1.2,2.5]/删 U_band 与 S 形/δ 敏感度 ≥5pp),§九裁决回填;任务书草案 .zcode/plans/mine-inequality-revision-miniloop-plan-2026-10-04.md 待 U0;**roadmap 迭代 14 编入②号卡**(序位待排)。零跑闸(两入口铁规:非 loop 批且用户未点名)。 @@ -756,3 +757,5 @@ 335 注. 台账落籍时点补记:主区清账合并时撞并行会话合并冲突残场一次(「unmerged files」瞬态——并行会话自行收口至 8f3fc72 后重试即过);worktree 清理后仅剩并行在飞 `global-variant-iter14`(迭代 14 全局变异批,本会话零触碰)。master 终态 f3fcfa7。 336. **全局作用域变异首发批任务书落籍(2026-10-04,本会话;worktree globalvariant-tb 单提交+主区合并)**:**台账号 336=接续 335**;纯文档零代码。**落地**——①任务书=design/research/任务书-全局作用域变异首发批-2026-10-04.md(逐段自包含:§一裁决全录 P1-P8+Q1-Q4+代拍合成序〔零拍板点〕/§二形态定稿=案A 微贫向偏斜〔偏斜面六行 attack/blast/pierce/magic↑+heal/defense↓·豁免 weaken/gp/action·合计守恒 77·EV 微降 3-5% provisional 目标归读数批判读〕+替换制+兜底回落〔Boss 全局池空回 region,provisional〕+承载 gate 第三维不动 level.tres+三层预告+MC 三态对账链〔现行锚/off=替换制零变异/on=偏斜30——off 隔离替换制单项效应〕/§三参数面 skewed_veins 行+effect_value [0,50] 投 30〔不适用 flat_damage [1,9] 互锁〕/§四 T0-T8≈5.75d〔T7 读数批可切→主体 5.25d〕/§五零拍板点/§六验收七条/§七红线六条〔生成器+排雷玩法零 diff/雷安同池/负向零触/DamageController 零改/信息型禁触/清图槽独立〕+停机点 S1 普通图逐位漂移·S2 读数越带只呈报·S3 互锁误伤/§八并行面);②roadmap ③卡换代=任务书路径+估时+⑥前置注记;③**接口发现与登记**——⑥A4 配比预设批(并行会话同日落卡)合成链「表值→玩家配比差值→包络钳制→图级变异偏斜→同调硬币偏置」已把本批图级偏斜定为中段且开工门=②③出口(③=本批)→ 本批系⑥前置,任务书 §八+roadmap ③卡双登记(③先于⑥开工;投影函数留参承接,前两段缺位=逐位等价图级直投——与本批代拍「图级先件级后」相容无冲突)。**开工门=U0 用户发令**。验证=doc_link_audit --strict 0 死链(worktree);纯文档批冒烟不适用。 + +345. **全局作用域变异首发批实施批落籍(2026-10-04,本会话;worktree m4iter14-gvar-20261004 六提交 fcb95f2/e3a94fd 系列+本台账批,台账号 345=接续 344)**:迭代 14 ③号卡 T1-T8 实施批全落,**T7b MC 读数批按任务书切分预案切独立后批**(三态对账链=现行锚 runsum_m4iter12_t10abb_n20_20261004 只读+off〔effect_value=0 替换制零变异〕+on〔偏斜 30〕,N=60 同种子配对,跑批须用户批准——先推算后重跑)。**T1-T4 核心**——variation_table.gd EFFECTS+resource_face/TRIGGERS+always/互锁三条+effect_value 域[0,50](既有六 region 行零误伤=S3 零触发);variation.tres 7 行(skewed_veins 贫矿脉 scope=global unlock_level=2 board_types∅通配 投值 30 provisional);config_db variant_pool 第三参 node_type(global 行仅 boss/elite 入池,缺省双参跳过=既有调用零扰动)+global_variant_row 决议访问器(多行取首行防御口径);board_data +board_variants 板级字段;battle_orchestrator 装板序 _resolve_global_variant 前置于 roll_board(**执行发现=任务书 T2 字面位与 T3 数据依赖不自洽,全局决议前移装板序内——替换制/兜底/零取号/恒定制四语义不变,普通图零 diff,出口报告呈报**);reward_economy +board_skew+_skewed_cell_rows 整数最大余数投影(生存族 heal/defense 按 v% 下调·进攻族 attack/blast/pierce/magic 等比上浮·白名单 weaken/gp/action 豁免·合计恒 77·off 态直通)+_biased_cell_rows 基座换源=合成序「图级先(乘法)件级后(luck_bias 加法)」;**既有行为登记=luck_bias 注入在首板 install 后(首板恒 0)——迭代 11 对拍锚现行口径零触碰**。**T5 呈现三层**——settlement_fx_view.play_board_variant_banner(轮横幅先例+减动效静态双态)+hero_info_panel 地形变异常驻角标段(流派件段先例空态隐藏)+hud_presenter.board_variant_lines+快照投影+main.gd 首轮开战横幅挂钩+ui_assembler 手册行。**T6 七正主**——地形变异 v0.7/难度曲线与Boss P2 行升级+调参表/registry=architecture.md/HUD框架 v0.13/教学引导 v0.4/行动经济 P2 注记(案D 留位不启用)/06 条目解决移除。**T7 闸**——冒烟 **747/0**(基线 718+新段 29:互锁负样本③-⑦/门控三维/L1 免疫/elite 前向位/替换制恰一行+零 region 格/零取号计数桩/快照投影/守恒/白名单/v=30 构造例 15·18·9·9·3·7/合成序 77+8/v=50 域/确定性)+run_all **15 套全绿**(config_db_test 换代+3:通配选择器限定 region+global 第三维)+golden 普通图逐位 **12/12 全等**(4 种子×3 关布置+摇号+RNG 计数——S1 零触发)+六探针绿(ui_input 16 断言/click 问题=0/ui_probe/ui_layout/fx/t17_defer——worktree 素材缺位按 gitignored 拷入+重导处置)+doc 三闸零新增(lint 2/term 3/link 死链 2 均主区基线同款存量)+熵增 PASS(golden 临时件用后即删)。**T8 出口**——报告 design/qa/m4iter14-gvar-exit-report-2026-10-04.md(**值面静态推演=EV 降幅当量比 r∈[1.5,2.0] → −2.7%~−5.4%,覆盖 3-5% provisional 目标带**;Q3 知情代价=地脉采撷/荆棘编织者/净化工兵/熔火之躯 Boss 图失效随批登记 registry+地形变异 v0.7;provisional 追认单九项;人闸实机目检清单六项)+roadmap ③卡落地注记。**③出口成立——⑥A4 配比批开工门=②③出口解一半(另半=②出口)**。待用户:出口人闸(目检+provisional 追认)+T7b 跑批发令。