diff --git a/game/core/node_map_generator.gd b/game/core/node_map_generator.gd index 5b6d3d9d..8e5b6627 100644 --- a/game/core/node_map_generator.gd +++ b/game/core/node_map_generator.gd @@ -17,13 +17,13 @@ const REGION_SIGNATURES := ["rest", "reward", "battle"] const SCOPE_STRUCTURE := 0 # 纯流面取数分域:结构流(代拍板 §10 ①——单流多次取数) var _rng_service -var _params: Dictionary = {} -var _pool: Array = [] -var _by_id: Dictionary = {} +var _params := {} +var _pool: Array[Dictionary] = [] +var _by_id := {} var _next_id := 0 -var _detour_heads: Array = [] # 岔口侧链首节点(下一跳类型互异的修型面) -var _detour_ids: Dictionary = {} # 侧链节点 id 集(配比填余不动侧链——战斗保底只由链上槽承载) -var _fatal_flag := false # 致命封印(沿 ConfigDB._fatal_flag 体例——参数无解/产出不合格置位) +var _detour_heads: Array[Dictionary] = [] # 岔口侧链首节点(下一跳类型互异的修型面) +var _detour_ids := {} # 侧链节点 id 集(配比填余不动侧链——战斗保底只由链上槽承载) +var _fatal_flag := false # 致命封印(沿数值表单点入口的致命置位体例——参数无解/产出不合格置位) func _init(rng_service = null) -> void: @@ -118,7 +118,7 @@ static func check_params(params: Dictionary) -> Array: ## structural/dangling_next/dup_key/enum/domain 词表。params 为空时跳过与参数档对照的计数判据。 func validate_output(graph: Dictionary, params: Dictionary = {}) -> Array: var errs: Array[Dictionary] = [] - var nodes: Array = graph.get("nodes", []) + var nodes = graph.get("nodes", []) if nodes.is_empty(): errs.append({"category": "structural", "message": "产出为空图(执行边界①——不合格产出禁止进玩法)"}) return errs @@ -156,7 +156,7 @@ func validate_output(graph: Dictionary, params: Dictionary = {}) -> Array: var terminals := [] for n in nodes: var id0: int = int(n["id"]) - var outs: Array = n["next"] + var outs = n["next"] if int(indeg[id0]) == 0: entries.append(id0) if outs.is_empty(): @@ -201,7 +201,7 @@ func validate_output(graph: Dictionary, params: Dictionary = {}) -> Array: if preds.size() != 1: errs.append({"category": "structural", "message": "终点 %d 直接前驱数 %d ≠ 1" % [tid, preds.size()]}) continue - var pred: Dictionary = preds[0] + var pred = preds[0] if String(pred["type"]) != "shop": errs.append({"category": "structural", "message": "终点 %d 前一位非商店: %s" % [tid, pred["type"]]}) continue @@ -312,17 +312,17 @@ func _add_forks(rg: RandomNumberGenerator, L: int, t: int, e: int) -> void: for a in anchors: if wanted <= 0: break - var node: Dictionary = a + var node = a var nid := int(node["id"]) if (node["next"] as Array).size() != 1: continue # 同一节点不重复扩岔(去路数上限 3) - var v: Dictionary = _by_id[int((node["next"] as Array)[0])] + var v = _by_id[int((node["next"] as Array)[0])] var vid := int(v["id"]) # 相邻两层不得同时扩岔:若主去路 v 也是岔口,v 的侧支会落进本岔口主支路的互斥段, # 使侧支自己的类型不再独有(契约 5③)——两个方向都要拦。 if selected.has(vid) or succ_selected.has(nid): continue - var v_outs: Array = v["next"] + var v_outs = v["next"] if v_outs.is_empty(): continue # 主去路无后继(无可汇入点)——该锚点弃用 var extra := 2 if (int(_params["fork_ways_max"]) >= 3 and rg.randf() < 0.35) else 1 @@ -366,7 +366,7 @@ func _depth_count(d: int) -> int: ## 单出口图的配比填余(摆放优先、配比填余、战斗保底兜底——§8.1 次序),再统一修岔口下一跳互异。 func _assign_types(rg: RandomNumberGenerator, e: int) -> void: if e == 1: - var free: Array = [] + var free: Array[Dictionary] = [] var chain_battles := 0 for n in _pool: if String(n["type"]) == "shop" or String(n["type"]) == "boss": @@ -388,11 +388,11 @@ func _assign_types(rg: RandomNumberGenerator, e: int) -> void: # 战斗保底优先:链上战斗数降到保底下限即停(侧链修型可能再让出战斗位,故保底只看链上) if chain_battles - 1 < floor_n: break - var node: Dictionary = free[i] + var node = free[i] node["type"] = "rest" if ((i % 2 == 0) == rest_first) else "reward" chain_battles -= 1 for head in _detour_heads: - var h: Dictionary = head + var h = head var fork = null for n in _pool: if (n["next"] as Array).has(int(h["id"])): @@ -460,10 +460,10 @@ func _all_paths_one_shop(by_id: Dictionary, entries: Array, terminals: Array) -> for eid in entries: stack.append([int(eid), 1 if String(by_id[int(eid)]["type"]) == "shop" else 0]) while not stack.is_empty(): - var frame: Array = stack.pop_back() + var frame = stack.pop_back() var id: int = int(frame[0]) var shops := int(frame[1]) - var outs: Array = by_id[id]["next"] + var outs = by_id[id]["next"] if outs.is_empty(): if shops != 1 or not terminals.has(id): return false @@ -475,7 +475,7 @@ func _all_paths_one_shop(by_id: Dictionary, entries: Array, terminals: Array) -> func _check_fork_rules(nodes: Array, by_id: Dictionary, errs: Array) -> void: for n in nodes: - var outs: Array = n["next"] + var outs = n["next"] if outs.size() < 2: continue var head_types := {} @@ -535,7 +535,7 @@ func _descendants(start: int, by_id: Dictionary) -> Dictionary: func _fatal(msg: String) -> void: - # 致命面沿 ConfigDB._fatal 体例:Core 层置致命封印+push_error(调用方已落),退出决策归组合根 + # 致命面沿数值表单点入口的既有体例:Core 层置致命封印+push_error(调用方已落),退出决策归组合根 # (main.gd `_fatal_screen`/卡② 起关拒绝路径)。generate 已致命中止时不产出任何图, # 空返回不是兜底图——消费侧必须按 is_fatal() 拒收(契约 4 零软回退)。 _fatal_flag = true