D5/Autoload/InitializationManager.gd

159 lines
7.6 KiB
GDScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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