extends Control signal next_level_requested @onready var next_button: Button = $Center/Panel/Contents/NextButton @onready var buy_ammunition_button: Button = $Center/Panel/Contents/BuyAmmunitionButton @onready var reset_skills_button: Button = $Center/Panel/Contents/ResetSkillsButton @onready var services_label: Label = $Center/Panel/Contents/Services @onready var status_label: Label = $Center/Panel/Contents/Status @onready var panel: PanelContainer = $Center/Panel var _inventory: ShipInventory var planet: Node2D var _open_tween: Tween func _ready() -> void: next_button.pressed.connect(func() -> void: next_level_requested.emit()) buy_ammunition_button.pressed.connect(_buy_ammunition) reset_skills_button.pressed.connect(_reset_skills) _inventory = get_tree().get_first_node_in_group("ship_inventory") as ShipInventory if _inventory: _inventory.ammunition_changed.connect(_refresh_ammunition_service) GameState.captain.changed.connect(_refresh_ammunition_service) _refresh_ammunition_service() func show_services(at_level_cap: bool, portal_open: bool = false) -> void: _refresh_ammunition_service() next_button.disabled = at_level_cap or portal_open next_button.text = "OSIĄGNIĘTO OSTATNI UKŁAD" if at_level_cap else ("WORMHOLE OTWARTY" if portal_open else "IDŹ DO NASTĘPNEGO POZIOMU") status_label.text = "Wleć w wormhole, aby przejść dalej." if portal_open else "Układ bezpieczny. Usługi dostępne." if visible: return show() _position_at_planet() scale = Vector2(0.05, 1.0) _open_tween = create_tween() _open_tween.tween_property(self, "scale:x", 1.0, 0.2).set_trans(Tween.TRANS_CUBIC).set_ease(Tween.EASE_OUT) func hide_services() -> void: if _open_tween != null and _open_tween.is_running(): _open_tween.kill() hide() scale = Vector2.ONE func _process(_delta: float) -> void: if visible: _position_at_planet() func _position_at_planet() -> void: if not is_instance_valid(planet): return var canvas := get_viewport().get_canvas_transform() var planet_screen := canvas * planet.global_position var planet_radius := float(planet.get("radius")) * canvas.x.length() size = panel.get_combined_minimum_size() var viewport_size := get_viewport_rect().size var screen_right := viewport_size.x - 320.0 var target := planet_screen + Vector2(planet_radius + 24.0, -size.y * 0.5) if target.x + size.x > screen_right: target.x = planet_screen.x - planet_radius - 24.0 - size.x position = Vector2(clampf(target.x, 8.0, maxf(8.0, screen_right - size.x)), clampf(target.y, 8.0, maxf(8.0, viewport_size.y - size.y - 80.0))) func _refresh_ammunition_service() -> void: reset_skills_button.disabled = not GameState.captain.can_reset_skills() reset_skills_button.text = "RESET SKILLI — %d KREDYTÓW" % GameState.captain.get_skill_reset_cost() reset_skills_button.tooltip_text = "Zwraca wszystkie %d wydanych punktów nauki. Koszt: 100 kredytów × poziom kapitana." % GameState.captain.get_spent_learning_points() buy_ammunition_button.disabled = _inventory == null or not _inventory.can_buy_ammunition() if _inventory: buy_ammunition_button.text = "KUP %d AMUNICJI — %d KREDYTÓW" % [ShipInventory.AMMUNITION_BUY_AMOUNT, _inventory.get_ammunition_buy_cost()] services_label.text = "Amunicja: %d • Kredyty: %d\nCena: %d kredytów × poziom układu (%d)" % [_inventory.ammunition, GameState.captain.credits, ShipInventory.AMMUNITION_BUY_BASE_COST, GameState.system_level] func _buy_ammunition() -> void: if visible and _inventory: _inventory.buy_ammunition() func _reset_skills() -> void: if visible: GameState.captain.reset_skills()