fix(review-batch3): 类型收紧生产清零137处(P1-2三步+延伸)+autoload class_name(ConfigDb/RngServiceCore)与_init标注(P2-1)+validate_skill_pool_links/ShopTable标注(P2-4)+相位enum外String面(P2-2)+typed-rows探针实证.tres装载转换;smoke缝合20处rows.assign+str(bb)同语义;审计生产双归零(240→103/83→59全测试链),单测7套绿,冒烟576/0同基线

This commit is contained in:
DKChan committed 2026-09-29 07:01:29 +08:00
1 parent f5edb65d25
commit 104cea6461
46 files changed
+233 -218

No files matched your search

+2 -2
View File
@@ -28,7 +28,7 @@ static func shop_line(gp: int) -> String:
# 选路口行(零自动推进停点——战斗胜利/兑付确认后出现)
static func route_line(candidates: Array, runner) -> String:
var names: Array = []
var names: Array[String] = []
for cand in candidates:
names.append("节点 %d" % runner.node_id_of(cand))
return "[color=#e0b860]── 岔路口:可选下一跳 %s ──[/color]" % " / ".join(names)
@@ -105,7 +105,7 @@ static func keystone_settle_text(detail: Dictionary, name_lookup: Dictionary = {
var line := "钥石入账:" + " · ".join(parts)
var unlocks: Array = detail.get("new_unlocks", [])
if not unlocks.is_empty():
var names: Array = []
var names: Array[String] = []
for iid in unlocks:
names.append(String(name_lookup.get(String(iid), String(iid))))
line += "\n工坊新解锁:" + "、".join(names)
+1 -1
View File
@@ -20,7 +20,7 @@ var _hero_override: Callable # 组合根生效值供给(→ {atk, m
var _seed_value: Callable # 组合根种子读取(LineEdit)
var _level_mode := false
var _level_battles: Array = []
var _level_battles: Array[int] = []
var _level_idx := 0
var _carry_hp := 0
var settlement = null # 当前战斗编排器(组合根在 battle_created 接线、battle_ready 接手)
+3 -3
View File
@@ -41,7 +41,7 @@ static func _refresh_hero(stage: BattleStageView, info: HeroInfoPanelView, s: Di
var atk: int = int(hero.atk)
# 修正 = attack_up 池有效值(hero_offense);来源角标 = 效果 display_name(快照 hero_effects 投影)
var mod_total := 0
var sources: Array = []
var sources: Array[String] = []
for eff in s.hero_effects:
if String(eff.effect_id) == "attack_up":
mod_total += int(eff.effective_value)
@@ -111,7 +111,7 @@ static func outcome_text(outcome: Dictionary) -> String:
# ---- 调整板批量模拟报告装配(文案归 presenter——视图只 set_text;code-review 2026-09-12 批) ----
static func tune_sim_report(n: int, atk_pct: int, hp_pct: int, wins: int, dmg_all: Array, hp_left_win: Array, hp_boss: Array, rounds_all: Array, death_nodes: Dictionary, base_hp: int) -> String:
var lines: Array = []
var lines: Array[String] = []
lines.append("[b]模拟 N=%d(atk+%d%% / hp+%d%%)[/b]" % [n, atk_pct, hp_pct])
lines.append("通关率 [color=#80d080]%.0f%%[/color](%d/%d)" % [100.0 * float(wins) / float(maxi(1, n)), wins, n])
lines.append("整关承伤:均 %.1f · p90 %.0f(基础 HP %d)" % [_mean(dmg_all), _p90(dmg_all), base_hp])
@@ -121,7 +121,7 @@ static func tune_sim_report(n: int, atk_pct: int, hp_pct: int, wins: int, dmg_al
if death_nodes.is_empty():
lines.append("败北节点:—")
else:
var parts: Array = []
var parts: Array[String] = []
for k in death_nodes.keys():
parts.append("%s×%d" % [k, death_nodes[k]])
lines.append("败北节点:%s(0-3=战斗序,4=Boss)" % " ".join(parts))
+3 -3
View File
@@ -321,9 +321,9 @@ func _on_adventure_finished(summary: Dictionary) -> void:
stage.settle_hero_idle() # 主角态回 idle(迭代 6 T3 三态收尾)
# 存档入账(元进度实现批):settle = Boss 两档入账 + 工坊解锁 + 摘要入档 + 写盘(唯一写档点不变——
# 调试两层不经过本处理器,天然不写档不污染生涯数据)。
var detail: Dictionary = {}
var detail: Dictionary[String, Variant] = {}
if meta != null:
detail = meta.settle_adventure(summary)
detail.assign(meta.settle_adventure(summary))
var text := Narrator.adventure_summary_text(summary)
if not detail.is_empty():
text += "\n" + Narrator.keystone_settle_text(detail, _item_name_lookup())
@@ -671,7 +671,7 @@ func _on_camp_closed() -> void:
# 营地快照投影(纯读——锻造三行/工坊六行/余额/最近冒险;拼句归 CampOverlay,账面归 MetaProgression)
func _camp_data() -> Dictionary:
var forge_rows: Array = []
var forge_rows: Array[Dictionary] = []
if meta != null:
for attr in MetaTable.FORGE_ATTRS:
var row: Dictionary = db.meta_forge_row(attr)
+2 -2
View File
@@ -6,7 +6,7 @@
# 纯逻辑零节点构建——组合根持有本类并喂入 Control;不持久化核心状态。
extends RefCounted
var _list: Array = [] # 登记序 = z 遮挡序(低 → 高)
var _list: Array[Control] = [] # 登记序 = z 遮挡序(低 → 高)
var _occluded := {} # modal → 被其隐藏的上方层(关闭恢复)
@@ -15,7 +15,7 @@ func register(m: Control) -> void:
func open(m: Control) -> void:
var hidden: Array = []
var hidden: Array[Control] = []
var idx := _list.find(m)
for i in range(idx + 1, _list.size()):
var higher: Control = _list[i]
+2 -2
View File
@@ -17,8 +17,8 @@ const RING_SIZE := 200
var _file: FileAccess = null
var _path := ""
var _seed := 0
var _recent_steps: Array = [] # 环形缓冲:最近结算行
var _recent_actions: Array = [] # 环形缓冲:最近玩家动作
var _recent_steps: Array[Dictionary] = [] # 环形缓冲:最近结算行
var _recent_actions: Array[Dictionary] = [] # 环形缓冲:最近玩家动作
var _snap_count := 0
var ap_per_round := 8 # 组合根注入(AP 消耗口径分母——行动经济 无推送信号)
var _ux_inputs := 0 # 本结算轮原始输入动作数(log_action 计数,快照后归零)
+4 -4
View File
@@ -30,10 +30,10 @@ func run(n: int) -> void:
panel.set_sim_running(true)
panel.set_sim_progress("模拟中:0/%d …" % n)
var wins := 0
var dmg_all: Array = []
var hp_left_win: Array = []
var hp_boss: Array = []
var rounds_all: Array = []
var dmg_all: Array[float] = []
var hp_left_win: Array[float] = []
var hp_boss: Array[float] = []
var rounds_all: Array[int] = []
var death_nodes := {}
for i in range(n):
var st = LevelAutoplay.run_level(db, SEED_BASE + i, 1, panel.atk_pct(), panel.hp_pct(), false, logger)
@@ -137,7 +137,7 @@ func _play_flag_recall(count: int) -> void:
# ---- 演出密度终稿(样张 v2 冻结批 T3——程序化 tween,确定性散布,零新帧资产) ----
var _crest_bricks: Array = [] # 纹章碎砖驻留面(close 时回收)
var _crest_bricks: Array[ColorRect] = [] # 纹章碎砖驻留面(close 时回收)
var _fx_crest_shards := 0
var _fx_dust_motes := 0
var _fx_flag_dots := 0
+3 -3
View File
@@ -27,7 +27,7 @@ var _log: RichTextLabel
var _summary: Label
var _hint: Label
var _mode := "dig" # dig = 收起摘要 / settle = 实时流(模式归组合根驱动)
var _round_rows: Array = [] # 本结算轮行缓冲(上轮摘要构建源)
var _round_rows: Array[Dictionary] = [] # 本结算轮行缓冲(上轮摘要构建源)
var _pending_agg := {} # 聚合计数行 pending(type+batch_key → {row, count})
@@ -85,9 +85,9 @@ func finish_settlement_round() -> void:
_flush_pending_agg()
if _round_rows.is_empty():
return
var parts: Array = []
var parts: Array[String] = []
for bb in _round_rows:
parts.append(_strip_bb(String(bb)))
parts.append(_strip_bb(str(bb)))
var text := "上轮: " + " | ".join(parts)
if text.length() > 190:
text = text.substr(0, 190) + "…"
+1 -1
View File
@@ -31,7 +31,7 @@ var round_label: Label
var stage_center: Label
var enemy_box: Control # 站桩壳层伴随件容器(T3 语义改写:HBoxContainer → Control)
var log_view: BattleLogView
var _cards: Array = [] # StandeeBody(世界本体,敌)
var _cards: Array[Node2D] = [] # StandeeBody(世界本体,敌)
var _row: HBoxContainer # 文本半区行(stage_center 载体 + 世界布局基准)
var _companion_layer: Control # 壳层伴随件层(主角 slot_row 宿主;敌伴随件宿主 = enemy_box)
var _svp_container: SubViewportContainer
+3 -3
View File
@@ -17,11 +17,11 @@ var edge := 46.0: # 格边长(BoardView.set_cell_area 单点
var bg_sb: StyleBoxFlat = null # 格底 StyleBox(BoardView 每次 paint 重建;呼吸微光就地改边框)
# ── 接触带微光绘制面(2026-09-26 批:可挖域微光自"墙格整框"改"英雄格周界空间侧"——art-bible §3.2 v2.8;
# 仅英雄格单元承载,BoardView.refresh 按可挖域写边/角码、_process 逐拍更新呼吸色)──
var contact_bands: Array = [] # 正交接触边码 0=N/1=S/2=W/3=E(该侧整条边)
var contact_corners: Array = [] # 斜向共享角码 0=NW/1=NE/2=SW/3=SE(角点+两侧各半条边)
var contact_bands: Array[int] = [] # 正交接触边码 0=N/1=S/2=W/3=E(该侧整条边)
var contact_corners: Array[int] = [] # 斜向共享角码 0=NW/1=NE/2=SW/3=SE(角点+两侧各半条边)
var contact_col := Color(0, 0, 0, 0) # 当前呼吸色(alpha 0 = 不画)
var plate := false # 数字色牌开关(BoardView paint 按已开格 glyph 写入——原则二)
var outline_sides: Array = [] # 墙格地面朝向描边码 0=N/1=S/2=W/3=E(轮廓加强批——程序侧结构件)
var outline_sides: Array[int] = [] # 墙格地面朝向描边码 0=N/1=S/2=W/3=E(轮廓加强批——程序侧结构件)
# ── 高墙感 D 投影档(2026-09-28 挑档落码——研究件四变体用户裁 D=C+地面投影,ITB 同款高度线索)──
# 南立面 = 墙格南缘内侧「口沿高光线 + 双段暗带」(邻地面格才画,墙群内聚);地面投影 = 北邻墙格
# 在本已开格北缘投渐隐暗带。参数按研究件 64px 拼版实测比例换算(立面双段 0.16/0.25 格边、投影带
+1 -1
View File
@@ -127,7 +127,7 @@ const SHOVEL_FRAME_PX := 32.0 # 铲帧画布边长(缩放比与英雄帧
const SHOVEL_FRAME_S := 0.08 # ~80ms/帧(f0→f1→f2 共 ~240ms 即收)
const SHOVEL_GRIP := Vector2(18, 12) # 握把锚点(素材侧锁定的画布坐标——英雄持握手位对齐点)
var _shovel_texs: Array = [] # 惰性装载缓存(素材缺位 = 空表静默回退——素材不入 git)
var _shovel_texs: Array[Texture2D] = [] # 惰性装载缓存(素材缺位 = 空表静默回退——素材不入 git)
# 挖掘挥铲:hand = 英雄持握手位(BoardView.hero_hand_point 出口,fx 与棋盘同层同系)——
+3 -3
View File
@@ -102,7 +102,7 @@ var _diggable := {} # 可挖域(8 向相邻未开格)——呼吸微
var _breath_t := 0.0
var _contact_unit: Node2D = null # 接触带承载单元(=英雄格 CellUnit;rebuild 随清场复位)
var _install_tw: Tween # 入场淡入 tween(rebuild 重入先杀)
var _ripple_tws: Array = [] # R0 涟漪逐格 tween(rebuild 重入全杀)
var _ripple_tws: Array[Tween] = [] # R0 涟漪逐格 tween(rebuild 重入全杀)
var _dig_glow := false # 挖掘期才允许唯一在动元素(art-bible §2.1)
var _hover := Vector2i(-9, -9)
var _last_click := {"cell": Vector2i(-9, -9), "ms": -100000}
@@ -768,8 +768,8 @@ func _apply_contact_bands() -> void:
if hu == null:
return
_contact_unit = hu
var bands: Array = []
var corners: Array = []
var bands: Array[int] = []
var corners: Array[int] = []
for d in [Vector2i(0, -1), Vector2i(0, 1), Vector2i(-1, 0), Vector2i(1, 0)]:
if _diggable.has(_minesweeper.hero_pos() + d):
bands.append(0 if d.y < 0 else (1 if d.y > 0 else (2 if d.x < 0 else 3)))
+3 -3
View File
@@ -21,8 +21,8 @@ const ATTR_LABELS := {"atk": "攻击", "max_hp": "生命上限", "armor_class":
var _balance_label: Label
var _forge_holder: VBoxContainer
var _workshop_holder: VBoxContainer
var _forge_rows: Array = [] # [{attr, level_l, price_l, btn}]——refresh_camp 就地重刷(零重建回流)
var _workshop_rows: Array = [] # [{item_id, progress_l, status_l}]
var _forge_rows: Array[Dictionary] = [] # [{attr, level_l, price_l, btn}]——refresh_camp 就地重刷(零重建回流)
var _workshop_rows: Array[Dictionary] = [] # [{item_id, progress_l, status_l}]
var _recent_list: Label # 最近冒险(逐行拼接 label——只读账面,随 open_camp 重建)
@@ -198,7 +198,7 @@ func _rebuild_workshop(data: Dictionary) -> void:
func _rebuild_recent(data: Dictionary) -> void:
var lines: Array = []
var lines: Array[String] = []
var recent: Array = data.get("recent", [])
if recent.is_empty():
lines.append(" (暂无冒险记录——完成或结束一次冒险后入账)")
+4 -4
View File
@@ -52,7 +52,7 @@ var _hp_bar: Control
var _attr_value: Label
var _bonus_row: HBoxContainer
var _bonus_value: Label
var _cand_ids: Array = [] # 本停点候选 id 集(图上命中合法集)
var _cand_ids: Array[int] = [] # 本停点候选 id 集(图上命中合法集)
var _content_size := Vector2(620, 240) # 图内容包络(open_choices 按图拟合——画布 min 尺寸随它)
var _hover_id := -1 # 悬停预承诺候选(-1 = 无)
var abandon_btn: Button # 放弃入口(可见性归组合根 set_abandon_available——只在冒险模式开)
@@ -230,7 +230,7 @@ func open_choices(cands: Array, runner) -> void:
_runner = runner
_hover_id = -1
_reset_abandon_confirm()
var visited: Array = []
var visited: Array[int] = []
if runner != null:
visited = runner.visited_ids()
if cands.size() > 1:
@@ -308,7 +308,7 @@ func _refresh_status() -> void:
ac_txt += " +%d" % ac_bonus
_attr_value.text = "攻击 %s · 护甲 AC %s" % [atk_txt, ac_txt]
var hp_bonus := int(_runner.bonus.get("max_hp", 0))
var parts: Array = []
var parts: Array[String] = []
if atk_bonus > 0:
parts.append("攻 +%d" % atk_bonus)
if hp_bonus > 0:
@@ -458,7 +458,7 @@ func _layout(nodes: Array, canvas: Control) -> Dictionary:
func _assign_layers(nodes: Array, layer: Dictionary, slot: Dictionary) -> void:
var layer_counts := {}
var entry := _entry(nodes)
var queue: Array = []
var queue: Array[Dictionary] = []
if not entry.is_empty():
queue.append(entry)
layer[entry] = 0
+1 -1
View File
@@ -15,7 +15,7 @@ const ATTR_LABELS := {"atk": "攻击", "max_hp": "生命上限", "armor_class":
var _gp_label: Label
var _cards_box: VBoxContainer
var _card_rows: Array = [] # [{product_id, price, bought, btn}]——refresh_state 就地重刷(零重建回流)
var _card_rows: Array[Dictionary] = [] # [{product_id, price, bought, btn}]——refresh_state 就地重刷(零重建回流)
func _init() -> void: