Randoloot/scripts/game/distant_sector.gd
2026-10-25 12:34:56 +01:00

107 lines
4.3 KiB
GDScript

extends Node
const GENERATOR := preload("res://scripts/levels/distant_sector_generator.gd")
var game: Node2D
var _status: Label
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 expeditions := Node.new()
expeditions.set_script(preload("res://scripts/planets/expedition_controller.gd"))
expeditions.game = game
expeditions.player = game.player
game.add_child(expeditions)
var panel := PanelContainer.new()
panel.name = "DistantStatusPanel"
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 = 120
panel.offset_bottom = 190
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"))
_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())]
func _return_home() -> bool:
var controller := game.get_node_or_null("PlanetExpeditions")
if controller == null or not is_instance_valid(controller.screen) or not game.player.is_docked: return false
if not preload("res://scripts/planets/orbital_contact_range.gd").at_freighter(game.player, controller.freighter): return false
if game._transitioning or bool(game.player.get("_is_destroyed")) or return_blocked(): return false
game._transitioning = true
_load_home.call_deferred()
return true
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