class_name GameSceneContext extends RefCounted # 主场景上下文。 # # 这个对象收敛跨 UI 模块共享的状态、资源和宿主操作入口: # - 新模块优先注入 context,按显式方法读取玩家、库存、纹理和路由能力。 # - 旧面板仍可通过 legacy_callbacks() 取兼容表,避免一次性重写所有面板。 # - Bootstrap 不再维护一大段散落 callback 字典,后续迁移只改这里。 const UiMotionScript := preload("res://scripts/ui/common/ui_motion.gd") var owner: Node var ui_builder var texture_provider var game_config var player_state var inventory_facade var panel_router var constants: Dictionary = {} var _callbacks: Dictionary = {} func setup(options: Dictionary) -> void: owner = options.get("owner") as Node ui_builder = options.get("ui_builder") texture_provider = options.get("texture_provider") game_config = options.get("game_config") player_state = options.get("player_state") inventory_facade = options.get("inventory_facade") panel_router = options.get("panel_router") constants = options.get("constants", {}).duplicate(true) _rebuild_callbacks() func legacy_callbacks() -> Dictionary: return _callbacks func callback(name: String) -> Callable: return _callbacks.get(name, Callable()) as Callable func call_action(name: String, args: Array = [], fallback: Variant = null) -> Variant: var callable := callback(name) if not callable.is_valid(): return fallback return callable.callv(args) func call_action_async(name: String, args: Array = []) -> Variant: var callable := callback(name) if not callable.is_valid(): return null return await callable.callv(args) func player_data() -> Dictionary: if owner != null and owner.has_method("_player_data_ref"): var result = owner.call("_player_data_ref") if result is Dictionary: return result if player_state != null and player_state.has_method("player_data"): return player_state.player_data() if inventory_facade != null and inventory_facade.has_method("player_data"): return inventory_facade.player_data() return {} func token() -> String: if player_state != null and player_state.has_method("token"): return player_state.token() return "" func player_id() -> int: if player_state != null and player_state.has_method("int_value"): var id := int(player_state.int_value("id", 0)) if id <= 0: id = int(player_state.int_value("user_id", 0)) return id return 0 func item_icon(icon_id: int) -> Texture2D: if texture_provider != null and texture_provider.has_method("item_icon"): return texture_provider.item_icon(icon_id) return null func house_texture(level: int) -> Texture2D: if texture_provider != null and texture_provider.has_method("house"): return texture_provider.house(level, int(constants.get("max_farm_level", 12))) return null func common_atlas_path() -> String: return str(constants.get("common_atlas_path", "")) func friend_atlas_path() -> String: return str(constants.get("friend_atlas_path", "")) func landup_atlas_path() -> String: return str(constants.get("landup_atlas_path", "")) func _rebuild_callbacks() -> void: _callbacks = { "common_atlas_path": common_atlas_path(), "friend_atlas_path": friend_atlas_path(), "landup_atlas_path": landup_atlas_path(), "create_common_panel_shell": Callable(ui_builder, "create_common_panel_shell"), "add_nine_patch": Callable(ui_builder, "add_nine_patch"), "add_texture": Callable(ui_builder, "add_texture"), "add_texture_button": Callable(ui_builder, "add_texture_button"), "add_panel_label": Callable(ui_builder, "add_panel_label"), "create_tab_bar": Callable(ui_builder, "create_tab_bar"), "configure_vertical_scroll": Callable(ui_builder, "configure_vertical_scroll"), "apply_empty_button_style": Callable(UiMotionScript, "apply_empty_button_style"), "style_label": Callable(ui_builder, "style_label"), "common_texture": Callable(texture_provider, "common"), "friend_texture": Callable(texture_provider, "friend"), "sign_texture": Callable(texture_provider, "sign"), "get_item_icon_texture": Callable(self, "item_icon"), "get_house_texture": Callable(self, "house_texture"), "shop_tab_pressed": Callable(panel_router, "on_shop_tab_pressed"), "warehouse_tab_pressed": Callable(panel_router, "on_warehouse_tab_pressed"), "open_modal_panel": Callable(panel_router, "open_modal_panel"), "close_modal_panel": Callable(panel_router, "close_modal_panel"), "player_data": Callable(self, "player_data"), "player_id": Callable(self, "player_id"), "lands_by_position": Callable(owner, "_lands_by_position_ref"), "token": Callable(self, "token"), "is_operation_in_progress": Callable(owner, "_is_operation_in_progress"), "set_operation_in_progress": Callable(owner, "_set_operation_in_progress"), "show_toast": Callable(owner, "_show_toast"), "response_data": Callable(owner, "_response_data"), "render_player": Callable(owner, "_render_player"), "render_house_art": Callable(owner, "_render_house_art"), "render_scene_skin": Callable(owner, "_render_scene_skin"), "render_lands": Callable(owner, "_render_lands"), "add_player_exp": Callable(owner, "_add_player_exp"), "apply_land_data": Callable(owner, "_apply_land_data"), "refresh_store_house": Callable(owner, "_refresh_store_house"), "decrease_player_currency": Callable(owner, "_decrease_player_currency"), "warehouse_items": Callable(owner, "_warehouse_items_ref"), "decrease_warehouse_item": Callable(owner, "_decrease_warehouse_item"), "add_player_gold": Callable(owner, "_add_player_gold"), "owned_amount": Callable(owner, "_get_owned_amount"), "parse_cost_string": Callable(owner, "_parse_cost_string"), "has_costs": Callable(owner, "_has_costs"), "apply_cost_deduction": Callable(owner, "_apply_cost_deduction"), "reward_fields_to_text": Callable(owner, "_reward_fields_to_text"), "format_reward_text": Callable(owner, "_format_reward_text"), "add_reward_items": Callable(owner, "_add_reward_items"), "response_status_text": Callable(owner, "_response_status_text"), "format_duration": Callable(owner, "_format_duration"), "set_dog_hunger_end_time": Callable(owner, "_set_dog_hunger_end_time"), "set_use_dog_item_id": Callable(owner, "_set_use_dog_item_id"), "set_texture_button_enabled": Callable(owner, "_set_texture_button_enabled"), "open_pay_panel": Callable(panel_router, "open_pay_panel"), "open_pet_panel": Callable(panel_router, "open_pet_panel"), "visit_friend_home": Callable(owner, "_visit_friend_home"), }