extends Node const GENERATOR := preload("res://scripts/levels/distant_sector_generator.gd") var game: Node2D var _status: Label var _return: Button var _refresh := 0.0 func _ready() -> void: name = "DistantSector" var map: Dictionary = GameState.active_distant_map game.system_data = GENERATOR.generate(map) game.player.position = Vector2.ZERO var camera: Camera2D = game.player.get_node("Camera2D") camera.limit_left = -2600 camera.limit_right = 2600 camera.limit_top = -1800 camera.limit_bottom = 1800 for data in game.system_data.enemies: if int(data.tier) == 2: game._pending_boss = data.duplicate() else: game._spawn_enemy(data,data.position) _build_structures() var panel := PanelContainer.new() panel.name = "DistantReturnPanel" game.get_node("HUD/HUDRoot").add_child(panel) panel.set_anchors_and_offsets_preset(Control.PRESET_CENTER_TOP) panel.offset_left = -195 panel.offset_right = 195 panel.offset_top = 136 panel.offset_bottom = 206 var ui := preload("res://scripts/planets/freighter_menu.gd") ui.style(panel,8,0.5) var column := VBoxContainer.new() panel.add_child(column) _status = ui.label(column,"",12,Color("e9b4fc")) _return = ui.button(column,"POWRÓT DO FRACHTOWCA",_return_home,true) _return.name = "ReturnFromDistant" _update_status() func _build_structures() -> void: var group := Node2D.new() group.name = "AncientStructures" group.z_index = -8 game.add_child(group) for data in game.system_data.structures: var sprite := Sprite2D.new() sprite.texture = load("res://assets/expeditions/%s.png" % ["ancient_gate","abandoned_relay","freighter_wreck"][group.get_child_count()/2 % 3]) sprite.position = data.position sprite.rotation = data.rotation if sprite.texture != null: sprite.scale = Vector2.ONE * float(data.size) / maxf(sprite.texture.get_width(),sprite.texture.get_height()) group.add_child(sprite) var label := Label.new() label.text = str(data.name) label.position = data.position+Vector2(-150,float(data.size)*0.4) label.size.x = 300 label.horizontal_alignment = HORIZONTAL_ALIGNMENT_CENTER label.add_theme_font_size_override("font_size",12) label.modulate = Color("8da9ae") group.add_child(label) func _physics_process(delta: float) -> void: if game._transitioning or bool(game.player.get("_is_destroyed")): return if not game.system_cleared and game.get_remaining_enemies() == 0: if not game._boss_spawned and not game._pending_boss.is_empty(): game._spawn_boss() else: game.system_cleared = true _refresh += delta if _refresh >= 0.2: _refresh = 0 _update_status() func return_blocked() -> bool: if float(game.player.get("landing_combat_lock")) > 0: return true for enemy in get_tree().get_nodes_in_group("enemies"): if not enemy.is_queued_for_deletion() and float(enemy.get("hull")) > 0 and enemy.global_position.distance_to(game.player.global_position) < 650: return true return false func _update_status() -> void: _status.text = "WYPRAWA %d · %s" % [GameState.system_level,"SEKTOR OCZYSZCZONY" if game.system_cleared else ("BOSS" if game._boss_spawned else "%d wrogów" % game.get_remaining_enemies())] _return.disabled = bool(game.player.get("_is_destroyed")) or return_blocked() _return.tooltip_text = "Oddal się od przeciwników i zakończ walkę." if _return.disabled else "Wróć do układu startowego. Powrót nie zużywa deuteru. Zbierz łup przed odlotem." func _return_home() -> void: if game._transitioning or bool(game.player.get("_is_destroyed")) or return_blocked(): return game._transitioning = true _load_home.call_deferred() func _load_home() -> void: var active: Dictionary = GameState.active_distant_map.duplicate(true) var home: Dictionary = GameState.distant_home.duplicate(true) var level := GameState.system_level var seed_value := GameState.system_seed game.player.get_node("ShipInventory").preserve_for_restart() GameState.restore_distant_home() GameState.return_to_freighter = true var error := get_tree().reload_current_scene() if error != OK: GameState.return_to_freighter = false GameState.active_distant_map = active GameState.distant_home = home GameState.system_level = level GameState.system_seed = seed_value GameState.restart_inventory.clear() game._transitioning = false