66 lines
2.0 KiB
GDScript
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)
|