ArkSol/scripts/SectorData.gd

66 lines
2.0 KiB
GDScript

extends Resource
class_name SectorData
var id = ""
var name = ""
var position = Vector2.ZERO
var owner = null
var texture = ""
var planets: Array = []
# Stałe definiujące ograniczenia generacji
const MAX_ATTEMPTS = 3 # Maksymalna liczba prób znalezienia pozycji dla pojedynczego sektora
const MARGIN = 50 # Margines od krawędzi powierzchni losowania
static func generate_sectors(sector_count: int) -> Array:
var sectors_list: Array = []
var min_distance = 100
# Zakładam, że Settings.x i Settings.y przechowują szerokość i wysokość mapy
var map_width = Settings.x
var map_height = Settings.y
# Określenie zakresu losowania, uwzględniającego margines
var min_x = MARGIN
var max_x = map_width - MARGIN
var min_y = MARGIN
var max_y = map_height - MARGIN
# Sprawdzenie minimalne, czy obszar losowania jest wystarczająco duży
if max_x <= min_x or max_y <= min_y:
push_error("BŁĄD GENERACJI: Margines jest zbyt duży dla wymiarów mapy.")
return []
for i in range(sector_count):
var s = SectorData.new()
s.id = "sector_" + str(i)
s.name = ObjectNames.sector_names[randi() % ObjectNames.sector_names.size()]
s.texture = random_star_texture()
# --- LOGIKA ZAPOBIEGANIA ZAPĘTLENIU I MARGINESÓW ---
var pos_ok = false
var attempts = 0
var new_pos = Vector2.ZERO
while not pos_ok and attempts < MAX_ATTEMPTS: # 1. Ograniczenie pętli
new_pos.x = randf_range(min_x, max_x)
new_pos.y = randf_range(min_y, max_y)
pos_ok = true
for existing in sectors_list:
if existing.position.distance_to(new_pos) < min_distance:
pos_ok = false
break
attempts += 1 # Zwiększamy licznik prób
if pos_ok:
s.position = new_pos
s.planets = PlanetData.generate_planets()
sectors_list.append(s)
else:
push_warning("Nie udało się znaleźć unikalnej pozycji dla sektora " + str(i) + " po " + str(MAX_ATTEMPTS) + " próbach.")
return sectors_list
static func random_star_texture() -> Texture2D:
var id = randi_range(1, 8)
return load("res://assets/stars/s%d.png" % id)