107 lines
4.3 KiB
GDScript
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
|