Randoloot/scripts/game/distant_sector.gd
2026-10-20 19:53:03 +02:00

103 lines
4.2 KiB
GDScript

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 = 104
panel.offset_bottom = 174
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