151 lines
6.5 KiB
GDScript
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
|