extends NinePatchRect # References to UI elements @onready var title_label = $Title/Title @onready var name_label = $Option/Name @onready var icon_rect = $Option/Info/Icon @onready var info1_label = $Option/Info/Info_List_1/Info_1/info # 制造商 (Maker) @onready var info2_label = $Option/Info/Info_List_1/Info_2/info # 发售 (Sales) @onready var info3_label = $Option/Info/Info_List_1/Info_3/info # 市场占比 (Market_share) @onready var info4_label = $Option/Info/Info_List_2/info_4/info # 开发费用 (Cost) # @onready var info5_label = $Option/Info/Info_List_2/info_5/info # 开发次数 - 暂不处理,数据源未知 @onready var prev_button = $Title/previous/Button @onready var next_button = $Title/next/Button @onready var confirm_button = $Confirm # Internal state var enabled_platform_keys: Array[String] = [] # Store keys (names) of enabled platforms var current_platform_index: int = -1 # Index in the enabled_platform_keys array const PLATFORM_ICON_PATH = "res://UI/popup/task_development/platform/" # --- 新增:用于存储从 GameState 获取的平台数据 --- var _platforms_data: Dictionary = {} # --- 新增:用于存储上次确认的平台 Key 的 GameState 键名 --- const SELECTED_PLATFORM_KEY_NAME = "selected_platform_key" # 假设用这个顶层键存储 func _ready(): add_to_group(str(name)) # 保持不变 # Connect button signals (保持不变) if prev_button: if not prev_button.pressed.is_connected(_on_previous_pressed): prev_button.pressed.connect(_on_previous_pressed) if next_button: if not next_button.pressed.is_connected(_on_next_pressed): next_button.pressed.connect(_on_next_pressed) if confirm_button: if not confirm_button.pressed.is_connected(_on_confirm_pressed): confirm_button.pressed.connect(_on_confirm_pressed) # Connect visibility changed signal (保持不变) if not is_connected("visibility_changed", _on_visibility_changed): visibility_changed.connect(_on_visibility_changed) # Initial call if already visible on ready (保持不变) if is_visible_in_tree(): reset_display() # Visibility Change Handler (保持不变) func _on_visibility_changed(): if is_visible_in_tree(): reset_display() # --- 修改:reset_display --- # 重置显示状态,在窗口可见时调用 func reset_display(): print("Platform: Resetting display state.") # 1. 加载并过滤平台数据 _load_and_filter_platforms() # 这会更新 _platforms_data 和 enabled_platform_keys # 2. 检查是否有可用的平台 if enabled_platform_keys.is_empty(): print("Platform: No enabled platforms found during reset.") current_platform_index = -1 _display_current_platform() # 显示 "无可用平台" 状态 return # 3. 获取上次确认的平台 Key var last_confirmed_key = "" if GameState: # --- 修改:使用 get_value 获取上次选择 --- last_confirmed_key = GameState.get_value(SELECTED_PLATFORM_KEY_NAME, "") else: push_error("GameState not available during reset_display.") # 默认使用第一个可用平台 current_platform_index = 0 _display_current_platform() return # 4. 查找上次确认的 Key 在当前可用列表中的索引 if not last_confirmed_key.is_empty(): var found_index = enabled_platform_keys.find(last_confirmed_key) if found_index != -1: # 5. 如果找到,更新当前索引 current_platform_index = found_index print("Platform: Found last confirmed key '%s' at index %d." % [last_confirmed_key, found_index]) else: # 6. 如果找不到(可能平台不再可用),默认使用第一个可用平台 print("Platform: Last confirmed key '%s' not found in enabled list. Defaulting to index 0." % last_confirmed_key) current_platform_index = 0 else: # 7. 如果 GameState 中没有记录,默认使用第一个可用平台 print("Platform: No last confirmed key found in GameState. Defaulting to index 0.") current_platform_index = 0 # 8. 更新显示 _display_current_platform() # --- 修改:_load_and_filter_platforms --- # 从 GameState 获取平台数据并筛选出启用的平台 func _load_and_filter_platforms(): enabled_platform_keys.clear() _platforms_data = {} # 清空旧数据 if not GameState: push_error("GameState not available in _load_and_filter_platforms.") return # --- 修改:从 GameState 获取 task_development 数据 --- var task_dev_data = GameState.get_value("task_development", {}) if task_dev_data.is_empty(): printerr("Platform: Failed to get 'task_development' data from GameState.") return # --- 修改:获取 platforms 字典 --- var all_platforms = task_dev_data.get("platforms", {}) if all_platforms.is_empty(): print("Platform: 'platforms' data in GameState is empty.") return # --- 修改:将获取到的平台数据存储到内部变量 --- _platforms_data = all_platforms # 遍历平台数据,筛选出启用的平台 Key for platform_key in _platforms_data: var platform_info = _platforms_data[platform_key] # 确保 platform_info 是字典并且 'enabled' 键存在且为 true if typeof(platform_info) == TYPE_DICTIONARY and platform_info.get("enabled", false) == true: enabled_platform_keys.append(platform_key) # 可选:按键名排序,保持一致性 #if not enabled_platform_keys.is_empty(): #enabled_platform_keys.sort() # 简单字符串排序 ## current_platform_index 会在 reset_display 中设置 #else: #print("Platform: No enabled platforms found.") #current_platform_index = -1 # 明确设置无可用平台 # 根据 current_platform_index 更新 UI 显示 func _display_current_platform(): # 处理无可用平台或索引无效的情况 if current_platform_index < 0 or current_platform_index >= enabled_platform_keys.size(): title_label.text = "游戏平台" name_label.text = "无可用平台" if icon_rect: icon_rect.texture = null if info1_label: info1_label.text = "-" # Maker if info2_label: info2_label.text = "-" # Sales if info3_label: info3_label.text = "-" # Market_share if info4_label: info4_label.text = "-" # Cost if prev_button: prev_button.disabled = true if next_button: next_button.disabled = true if confirm_button: confirm_button.disabled = true return # --- 如果有有效平台 --- if confirm_button: confirm_button.disabled = false # 启用确认按钮 # 更新标题 var display_index = current_platform_index + 1 var total_count = enabled_platform_keys.size() title_label.text = "游戏平台 %d/%d" % [display_index, total_count] # 获取当前平台的 Key 和数据 var platform_key = enabled_platform_keys[current_platform_index] # --- 从内部缓存 _platforms_data 获取平台信息 --- if not _platforms_data.has(platform_key): push_error("Current platform key '%s' not found in cached _platforms_data!" % platform_key) name_label.text = "错误:数据丢失" # ... 清空其他信息 ... return var platform_info = _platforms_data[platform_key] # 更新平台名称 name_label.text = platform_key # --- 修改:从 platform_info 读取所有需要的信息,数值转为整数显示 --- # 使用 .get(key, default) 确保安全访问 # 制造商 (Maker) - 通常是字符串,保持不变 info1_label.text = platform_info.get("Maker", "-") # 发售 (Sales) - 转换为整数显示 var sales_value = platform_info.get("Sales", null) if typeof(sales_value) == TYPE_INT or typeof(sales_value) == TYPE_FLOAT: info2_label.text = str(int(sales_value)) # 转换为整数再转字符串 else: info2_label.text = "-" # 如果不是数字或不存在,显示 "-" # 市场占比 (Market_share) - 转换为整数显示 var market_share_value = platform_info.get("Market_share", null) if typeof(market_share_value) == TYPE_INT or typeof(market_share_value) == TYPE_FLOAT: info3_label.text = str(int(market_share_value)) # 转换为整数再转字符串 else: info3_label.text = "-" # 开发费用 (Cost) - 转换为整数显示 var cost_value = platform_info.get("Cost", null) if typeof(cost_value) == TYPE_INT or typeof(cost_value) == TYPE_FLOAT: info4_label.text = str(int(cost_value)) # 转换为整数再转字符串 else: info4_label.text = "-" # info5 (开发次数) 暂不处理 # 更新图标 (逻辑不变) var icon_name = platform_info.get("Icon", "") if not icon_name.is_empty(): var icon_path = PLATFORM_ICON_PATH + icon_name + ".png" if ResourceLoader.exists(icon_path): icon_rect.texture = ResourceLoader.load(icon_path) else: push_error("Failed to load platform icon: " + icon_path) icon_rect.texture = null else: print("Platform icon name is empty for key: ", platform_key) icon_rect.texture = null # 更新导航按钮状态 (逻辑不变) var can_navigate = enabled_platform_keys.size() > 1 if prev_button: prev_button.disabled = not can_navigate if next_button: next_button.disabled = not can_navigate # --- _on_previous_pressed (逻辑不变) --- func _on_previous_pressed(): if enabled_platform_keys.size() > 1: current_platform_index -= 1 if current_platform_index < 0: current_platform_index = enabled_platform_keys.size() - 1 _display_current_platform() # --- _on_next_pressed (逻辑不变) --- func _on_next_pressed(): if enabled_platform_keys.size() > 1: current_platform_index += 1 if current_platform_index >= enabled_platform_keys.size(): current_platform_index = 0 _display_current_platform() # --- 修改:_on_confirm_pressed --- # 处理确认选择 func _on_confirm_pressed(): if current_platform_index != -1 and current_platform_index < enabled_platform_keys.size(): # 1. 获取选中的平台 Key var selected_platform_key = enabled_platform_keys[current_platform_index] # 2. 获取父节点 (task_development) var parent_node = get_parent() # 3. 调用父节点的 update_task_options 更新选项 (保持不变) if parent_node and parent_node.has_method("update_task_options"): parent_node.update_task_options({"平台": selected_platform_key}) else: push_error("Platform: Parent node not found or missing 'update_task_options' method.") # 即使父节点更新失败,也尝试关闭窗口 # 4. 调用父节点的方法来处理关闭自身 (保持不变) if parent_node and parent_node.has_method("_close_child_popup_and_return"): parent_node._close_child_popup_and_return(self) else: push_error("Platform: Parent node not found or missing '_close_child_popup_and_return' method.") self.hide() # Fallback hide else: # 处理没有有效平台被选中的情况 print("Platform: No valid platform selected to confirm.") # 仍然尝试关闭窗口 var parent_node = get_parent() if parent_node and parent_node.has_method("_close_child_popup_and_return"): parent_node._close_child_popup_and_return(self) else: self.hide() # Fallback hide