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)