D5/Autoload/InitializationManager.gd
2025-05-09 15:36:04 +08:00

151 lines
6.5 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()
if settings_data.is_empty() or task_dev_data.is_empty():
printerr("InitializationManager: Failed to retrieve initial settings or task development data. Aborting new game.")
return false
# 3. 构建注入 GameState 的初始状态字典
var initial_state = _build_initial_state(settings_data, task_dev_data)
if initial_state.is_empty(): # _build_initial_state 内部可能有错误检查
printerr("InitializationManager: Failed to build initial game state. 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
# --- 内部辅助函数 ---
# 根据从 InitialDataManager 获取的蓝图数据,构建注入 GameState 的初始状态字典
func _build_initial_state(settings: Dictionary, task_dev: 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) - 存入 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:
# 将从 InitialDataManager 获取的该平台的完整数据字典 (p_data)
# 直接存入 GameState 的 task_development.platforms 下。
# 假设 p_data 已经包含了 Maker, Cost, Icon, Sales, enabled, Market_share 等所有字段。
# 使用 duplicate(true) 确保 GameState 拥有独立的数据副本。
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")
# 处理玩法 (Gameplays) - 存入 task_dev_state (保持不变,只存动态)
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")
# 处理主题 (Themes) - 存入 task_dev_state (保持不变,只存动态)
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")
# 处理开发策略 (Strategies) - 存入 task_dev_state (保持不变,只存动态)
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")
# 处理产品侧重点 (Product Focus Points) - 存入 task_dev_state (保持不变,存完整结构)
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"] = {}
# 4. 将包含所有任务开发状态的字典 task_dev_state 赋值给 initial_state 下的 "task_development" 键
initial_state["task_development"] = task_dev_state
print("InitializationManager: Initial game state built with 'task_development' structure.")
return initial_state