159 lines
7.6 KiB
GDScript
159 lines
7.6 KiB
GDScript
# InitializationManager.gd
|
||
# Autoload Singleton
|
||
# 负责协调游戏的初始化流程,包括启动新游戏和加载游戏。
|
||
|
||
extends Node
|
||
|
||
# 信号:当新游戏数据准备好,注入 GameState 后发出
|
||
signal new_game_initialized
|
||
# 信号:当从存档加载游戏数据,恢复 GameState 后发出
|
||
signal game_loaded
|
||
|
||
# --- 核心流程函数 ---
|
||
|
||
# 启动新游戏的处理流程
|
||
func start_new_game_process() -> bool:
|
||
print("InitializationManager: Starting new game process...")
|
||
|
||
# 1. 确保基础数据已加载
|
||
if not InitialDataManager.ensure_data_loaded():
|
||
printerr("InitializationManager: Failed to ensure initial data is loaded. Aborting new game.")
|
||
return false
|
||
|
||
# 2. 获取初始蓝图数据
|
||
var settings_data = InitialDataManager.get_starting_settings()
|
||
var task_dev_data = InitialDataManager.get_task_development_data()
|
||
var npc_initial_data = InitialDataManager.get_npc_initial_data() # MODIFIED: 获取NPC初始数据
|
||
|
||
# MODIFIED: 更新空值检查
|
||
if settings_data.is_empty() or task_dev_data.is_empty() or npc_initial_data.is_empty():
|
||
var error_msg = "InitializationManager: Failed to retrieve initial data. Aborting new game. Details:\n"
|
||
if settings_data.is_empty(): error_msg += " - Settings data is empty.\n"
|
||
if task_dev_data.is_empty(): error_msg += " - Task development data is empty.\n"
|
||
if npc_initial_data.is_empty(): error_msg += " - NPC initial data is empty (check npc.json or InitialDataManager logs).\n"
|
||
printerr(error_msg)
|
||
return false
|
||
|
||
# 3. 构建注入 GameState 的初始状态字典
|
||
# MODIFIED: 传递 npc_initial_data 给 _build_initial_state
|
||
var initial_state = _build_initial_state(settings_data, task_dev_data, npc_initial_data)
|
||
if initial_state.is_empty(): # _build_initial_state 内部可能有错误检查导致返回空
|
||
printerr("InitializationManager: Failed to build initial game state (returned empty). Aborting new game.")
|
||
return false
|
||
|
||
# 4. 初始化 GameState
|
||
GameState.initialize_for_new_game(initial_state)
|
||
print("InitializationManager: GameState initialized for new game.")
|
||
|
||
# 5. 发出信号,通知其他系统新游戏已准备就绪
|
||
new_game_initialized.emit()
|
||
print("InitializationManager: New game initialized successfully.")
|
||
return true
|
||
|
||
# 加载游戏的流程
|
||
func load_game_process(save_data: Dictionary) -> bool:
|
||
print("InitializationManager: Starting load game process...")
|
||
# 1. 确保基础数据已加载 (可能需要,以防某些静态数据需要参考)
|
||
if not InitialDataManager.ensure_data_loaded():
|
||
printerr("InitializationManager: Failed to ensure initial data is loaded during load game.")
|
||
# 这里不一定需要中止,取决于后续逻辑是否依赖 InitialData
|
||
# return false
|
||
|
||
# 2. 使用存档数据恢复 GameState
|
||
# 假设 save_data 就是从 SaveLoadManager.load_game 获取的 game_state 字典
|
||
GameState.restore_state(save_data)
|
||
print("InitializationManager: GameState restored from save data.")
|
||
|
||
# 3. 发出信号,通知其他系统游戏已加载
|
||
game_loaded.emit()
|
||
print("InitializationManager: Game loaded successfully.")
|
||
return true
|
||
|
||
|
||
# --- 内部辅助函数 ---
|
||
|
||
# MODIFIED: 函数签名增加了 npc_defs 参数
|
||
# 根据从 InitialDataManager 获取的蓝图数据,构建注入 GameState 的初始状态字典
|
||
func _build_initial_state(settings: Dictionary, task_dev: Dictionary, npc_defs: Dictionary) -> Dictionary:
|
||
var initial_state: Dictionary = {}
|
||
|
||
# 1. 合并基础设置 (Init_Base.json) - 这些保持为顶级键
|
||
# 使用深拷贝确保数据独立
|
||
initial_state.merge(settings.duplicate(true), true)
|
||
|
||
# 2. 创建一个新的字典来存储所有与任务开发相关的动态状态 (以及需要的静态信息)
|
||
var task_dev_state: Dictionary = {}
|
||
|
||
# 3. 处理 Task Development 数据 (task_development.json),将其存入 task_dev_state
|
||
# ... (这部分关于 platforms, gameplays, themes, strategies, product_focus_points 的代码保持不变) ...
|
||
# (为了简洁,我省略了这部分重复代码,请确保您保留了原有的task_dev_state构建逻辑)
|
||
# --- START: task_dev_state 构建逻辑 (假设已存在) ---
|
||
task_dev_state["platforms"] = {}
|
||
if task_dev.has("platforms") and typeof(task_dev["platforms"]) == TYPE_DICTIONARY:
|
||
for platform_key in task_dev["platforms"]:
|
||
var p_data = task_dev["platforms"][platform_key]
|
||
if typeof(p_data) == TYPE_DICTIONARY:
|
||
task_dev_state["platforms"][platform_key] = p_data.duplicate(true)
|
||
else:
|
||
printerr("InitializationManager: Invalid data format for platform: ", platform_key)
|
||
else:
|
||
print("InitializationManager: No 'platforms' data found or invalid format in task_development.json")
|
||
|
||
task_dev_state["gameplays"] = {}
|
||
if task_dev.has("gameplays") and typeof(task_dev["gameplays"]) == TYPE_DICTIONARY:
|
||
for gameplay_key in task_dev["gameplays"]:
|
||
var g_data = task_dev["gameplays"][gameplay_key]
|
||
if typeof(g_data) == TYPE_DICTIONARY:
|
||
task_dev_state["gameplays"][gameplay_key] = g_data.duplicate(true)
|
||
else:
|
||
printerr("InitializationManager: Invalid data format for gameplay: ", gameplay_key)
|
||
else:
|
||
print("InitializationManager: No 'gameplays' data found or invalid format in task_development.json")
|
||
|
||
task_dev_state["themes"] = {}
|
||
if task_dev.has("themes") and typeof(task_dev["themes"]) == TYPE_DICTIONARY:
|
||
for theme_key in task_dev["themes"]:
|
||
var t_data = task_dev["themes"][theme_key]
|
||
if typeof(t_data) == TYPE_DICTIONARY:
|
||
task_dev_state["themes"][theme_key] = t_data.duplicate(true)
|
||
else:
|
||
printerr("InitializationManager: Invalid data format for theme: ", theme_key)
|
||
else:
|
||
print("InitializationManager: No 'themes' data found or invalid format in task_development.json")
|
||
|
||
task_dev_state["strategies"] = {}
|
||
if task_dev.has("strategies") and typeof(task_dev["strategies"]) == TYPE_DICTIONARY:
|
||
for strategy_key in task_dev["strategies"]:
|
||
var s_data = task_dev["strategies"][strategy_key]
|
||
if typeof(s_data) == TYPE_DICTIONARY:
|
||
task_dev_state["strategies"][strategy_key] = s_data.duplicate(true)
|
||
else:
|
||
printerr("InitializationManager: Invalid data format for strategy: ", strategy_key)
|
||
else:
|
||
print("InitializationManager: No 'strategies' data found or invalid format in task_development.json")
|
||
|
||
if task_dev.has("product_focus_points") and typeof(task_dev["product_focus_points"]) == TYPE_DICTIONARY:
|
||
task_dev_state["product_focus_points"] = task_dev["product_focus_points"].duplicate(true)
|
||
else:
|
||
print("InitializationManager: No 'product_focus_points' data found or invalid format in task_development.json")
|
||
task_dev_state["product_focus_points"] = {}
|
||
# --- END: task_dev_state 构建逻辑 ---
|
||
|
||
# 4. 将包含所有任务开发状态的字典 task_dev_state 赋值给 initial_state 下的 "task_development" 键
|
||
initial_state["task_development"] = task_dev_state
|
||
|
||
# 5. NEW: 处理 NPC 数据,将其存入 initial_state 的 "npcs" 键下
|
||
# npc_defs 是从 npc.json 加载的完整内容,结构为 {"npc": {"米子一": {...}, "塔奇": {...}}}
|
||
# 我们希望将 {"米子一": {...}, "塔奇": {...}} 这部分存入 GameState
|
||
if npc_defs.has("npc") and typeof(npc_defs["npc"]) == TYPE_DICTIONARY:
|
||
initial_state["npcs"] = npc_defs["npc"].duplicate(true) # 深拷贝NPC数据
|
||
print("InitializationManager: NPC data added to initial state under 'npcs' key.")
|
||
else:
|
||
# 如果 npc.json 结构不符合预期 (例如顶层没有 "npc" 键,或其值不是字典)
|
||
# 打印错误,并为 "npcs" 设置一个空字典,以避免后续代码因键不存在而出错
|
||
printerr("InitializationManager: 'npc' key not found or not a Dictionary in npc_initial_data from npc.json. Initializing 'npcs' as empty.")
|
||
initial_state["npcs"] = {}
|
||
|
||
print("InitializationManager: Initial game state built with 'task_development' and 'npcs' structure.")
|
||
return initial_state
|