197 lines
7.8 KiB
GDScript
197 lines
7.8 KiB
GDScript
extends UIPage # 继承自我们之前创建的 UIPage
|
||
|
||
@onready var platform_page_path = $platform
|
||
@onready var gameplay_page_path: Control = $gameplay
|
||
@onready var theme_page_path: Control = $theme
|
||
@onready var strategy_page_path: Control = $strategy
|
||
@onready var notice_path: Control = $notice
|
||
@onready var dialogue_secretary: Control = $dialogue_secretary
|
||
|
||
|
||
# Part_2: 预算
|
||
@onready var budget_button: Button = $BG/Part_2/HBoxContainer/Button
|
||
|
||
# Part_3: 选择列表中的按钮
|
||
@onready var platform_select_button: Button = $"BG/Part_3/Select_List/1_right/Button"
|
||
@onready var gameplay_select_button: Button = $"BG/Part_3/Select_List/2_right/Button"
|
||
@onready var theme_select_button: Button = $"BG/Part_3/Select_List/3_right/Button"
|
||
@onready var strategy_select_button: Button = $"BG/Part_3/Select_List/4_right/Button"
|
||
|
||
# 确认按钮
|
||
@onready var confirm_button: Button = $BG/Confirm
|
||
|
||
func _ready():
|
||
super._ready() # 调用父类的 _ready() (如果 UIPage 中有 _ready() 逻辑)
|
||
if platform_select_button:
|
||
platform_select_button.pressed.connect(_on_platform_select_button_pressed)
|
||
if gameplay_select_button:
|
||
gameplay_select_button.pressed.connect(_on_gameplay_select_button_pressed)
|
||
if theme_select_button:
|
||
theme_select_button.pressed.connect(_on_theme_select_button_pressed)
|
||
if strategy_select_button:
|
||
strategy_select_button.pressed.connect(_on_strategy_select_button_pressed)
|
||
|
||
if confirm_button:
|
||
confirm_button.pressed.connect(_on_confirm_button_pressed)
|
||
|
||
func _on_page_activated():
|
||
super._on_page_activated() # 调用父类的激活逻辑
|
||
|
||
if GameState.get_value("is_on_task"):
|
||
self_modulate.a = 0.0
|
||
go_to_child_page(dialogue_secretary)
|
||
return
|
||
|
||
print(name + " 页面已激活")
|
||
# 当从其它页面退回到当前页面的时候,money恢复show_up起始值
|
||
if get_main_data("original_money") > GameState.get_value("money"):
|
||
GameState.set_value("money",get_main_data("original_money"))
|
||
|
||
_calculate_and_update_budget()
|
||
# 从 MainController 加载并显示数据
|
||
# 例如,加载项目预算
|
||
var current_budget = get_main_data("预算", 0) # 假设默认预算为500
|
||
if budget_button:
|
||
budget_button.text = str(current_budget)
|
||
|
||
# 加载并显示已选的平台、玩法、题材、开发策略
|
||
# 这些值可能在其他子页面选择后被设置到 shared_workflow_data 中,
|
||
# 或者在此页面有默认值/初始值。
|
||
var selected_platform = get_main_data("平台", "") # 默认值来自场景
|
||
if platform_select_button:
|
||
platform_select_button.text = selected_platform
|
||
|
||
var selected_gameplay = get_main_data("玩法", "") # 默认值来自场景
|
||
if gameplay_select_button:
|
||
gameplay_select_button.text = selected_gameplay
|
||
|
||
var selected_theme = get_main_data("题材", "") # 默认值来自场景
|
||
if theme_select_button:
|
||
theme_select_button.text = selected_theme
|
||
|
||
var selected_strategy = get_main_data("开发策略", "") # 默认值来自场景
|
||
if strategy_select_button:
|
||
strategy_select_button.text = selected_strategy
|
||
|
||
# 可以在这里根据条件设置按钮是否可用等
|
||
# 例如: if some_condition: confirm_button.disabled = true
|
||
|
||
func _on_page_deactivated():
|
||
super._on_page_deactivated() # 调用父类的停用逻辑
|
||
print(name + " 页面已停用")
|
||
# 可以在这里保存任何未提交的临时数据
|
||
# 例如: set_main_data("temp_project_name", project_name_line_edit.text)
|
||
|
||
|
||
# 辅助函数:安全地从嵌套字典中获取值
|
||
# source_dict: 要从中查找的源字典
|
||
# path_keys: 一个包含路径中各个键的数组 (e.g., ["platforms", "Switch", "Cost"])
|
||
# default_value: 如果路径无效或键未找到,则返回此值
|
||
func _get_nested_value_from_dict(source_dict: Dictionary, path_keys: Array, default_value = null):
|
||
var current_item = source_dict
|
||
for key_part in path_keys:
|
||
if not (current_item is Dictionary and current_item.has(key_part)):
|
||
#printerr("Debug: Key '", key_part, "' not found or item not a dict at path: ", path_keys)
|
||
return default_value
|
||
current_item = current_item[key_part]
|
||
return current_item
|
||
|
||
# 根据选择计算并更新预算的函数
|
||
func _calculate_and_update_budget() -> void:
|
||
# 1. 从 shared_workflow_data 获取当前的选择
|
||
var selected_platform = get_main_data("平台", "")
|
||
var selected_gameplay = get_main_data("玩法", "")
|
||
var selected_theme = get_main_data("题材", "")
|
||
var selected_strategy = get_main_data("开发策略", "")
|
||
|
||
var platform_cost: float = 0.0
|
||
var gameplay_cost: float = 0.0
|
||
var theme_cost: float = 0.0
|
||
var strategy_cost_multiplier: float = 0.0 # 注意:策略的 "Cost" 是一个成本系数
|
||
|
||
# 2. 从 GameState 获取 "task_development" 数据
|
||
# 注意:根据提供的 GameState.gd,get_value() 仅获取顶层键。
|
||
var task_dev_data = GameState.get_value("task_development")
|
||
|
||
if not (task_dev_data is Dictionary):
|
||
printerr("MainPage: 'task_development' key not found in GameState or is not a Dictionary.")
|
||
if budget_button:
|
||
budget_button.text = "错误: 数据缺失"
|
||
set_main_data("预算", 0.0) # 在共享数据中将预算设为0
|
||
return
|
||
|
||
# 3. 获取各项成本
|
||
# 平台成本
|
||
if not selected_platform.is_empty():
|
||
var cost_val = _get_nested_value_from_dict(task_dev_data, ["platforms", selected_platform, "Cost"])
|
||
if cost_val != null:
|
||
platform_cost = float(cost_val)
|
||
else:
|
||
printerr("MainPage: 平台 '", selected_platform, "' 的成本未找到或路径无效。使用 0.0。")
|
||
platform_cost = 0.0 # 确保为 float
|
||
|
||
# 玩法成本
|
||
if not selected_gameplay.is_empty():
|
||
var cost_val = _get_nested_value_from_dict(task_dev_data, ["gameplays", selected_gameplay, "Cost"])
|
||
if cost_val != null:
|
||
gameplay_cost = float(cost_val)
|
||
else:
|
||
printerr("MainPage: 玩法 '", selected_gameplay, "' 的成本未找到或路径无效。使用 0.0。")
|
||
gameplay_cost = 0.0
|
||
|
||
# 题材成本
|
||
if not selected_theme.is_empty():
|
||
var cost_val = _get_nested_value_from_dict(task_dev_data, ["themes", selected_theme, "Cost"])
|
||
if cost_val != null:
|
||
theme_cost = float(cost_val)
|
||
else:
|
||
printerr("MainPage: 题材 '", selected_theme, "' 的成本未找到或路径无效。使用 0.0。")
|
||
theme_cost = 0.0
|
||
|
||
# 开发策略成本系数
|
||
if not selected_strategy.is_empty():
|
||
var cost_val = _get_nested_value_from_dict(task_dev_data, ["strategies", selected_strategy, "Cost"])
|
||
if cost_val != null:
|
||
strategy_cost_multiplier = float(cost_val)
|
||
else:
|
||
printerr("MainPage: 开发策略 '", selected_strategy, "' 的成本系数未找到或路径无效。使用 0.0。")
|
||
strategy_cost_multiplier = 0.0
|
||
|
||
# 4. 计算预算
|
||
# 公式: (平台成本 + 玩法成本 + 题材成本) * (1 + 策略成本系数)
|
||
var base_cost = platform_cost + gameplay_cost + theme_cost
|
||
var calculated_budget = base_cost * (1.0 + strategy_cost_multiplier)
|
||
|
||
# 5. 更新预算按钮的文本和共享数据中的预算值
|
||
if budget_button:
|
||
budget_button.text = "¥" + str(snapped(calculated_budget, 0.01)) # 显示为货币格式,保留两位小数
|
||
|
||
set_main_data("预算", int(calculated_budget)) # 将计算得到的预算存回 shared_workflow_data
|
||
|
||
print("MainPage: 计算得到的预算: ", calculated_budget,
|
||
" (平台:", platform_cost, " 玩法:", gameplay_cost, " 题材:", theme_cost, " 策略系数:", strategy_cost_multiplier, ")")
|
||
|
||
# --- 信号处理函数 ---
|
||
func _on_platform_select_button_pressed():
|
||
go_to_child_page(platform_page_path)
|
||
|
||
func _on_gameplay_select_button_pressed():
|
||
go_to_child_page(gameplay_page_path)
|
||
|
||
func _on_theme_select_button_pressed():
|
||
go_to_child_page(theme_page_path)
|
||
|
||
func _on_strategy_select_button_pressed():
|
||
go_to_child_page(strategy_page_path)
|
||
|
||
func _on_confirm_button_pressed():
|
||
# 导航到下一个页面或结束工作流
|
||
if GameState.get_value("money") < get_main_data("预算"):
|
||
go_to_child_page(notice_path)
|
||
return
|
||
else:
|
||
next_ui_node_path = "../product_focus"
|
||
var new_money = GameState.get_value("money")-get_main_data("预算")
|
||
GameState.set_value("money",new_money)
|
||
go_next()
|