extends Node2D @onready var StarScene = preload("res://scenes/star.tscn") @onready var PlanetScene = preload("res://scenes/planet.tscn") @onready var MenuScene = preload("res://scenes/menu.tscn") @onready var camera = $Camera2D #@onready var TimeDispaly = $CanvasLayer2 @onready var tech_button = $UI/TopPanel/HBoxContainer/Technologies @onready var tech_panel = $UI/TechPanel # to Twoja scena z technologiami var existing_star_positions: Array[Vector2] = [] const PLANET_HIDE_ZOOM = 0.6 # powyżej tego zoomu planety się chowają func _ready(): if GameData.game_lunched == false: _generate_galaxy(Settings.NUMBER_OF_SYSTEMS) GameData.game_lunched = true tech_button.connect("pressed", Callable(self, "_on_technologies_button_pressed")) tech_panel.hide() # domyślnie ukryty func _on_technologies_button_pressed(): # Przełącz widoczność panelu tech_panel.visible = not tech_panel.visible # (Opcjonalnie) odśwież listę technologii za każdym razem, gdy panel się pokazuje if tech_panel.visible and tech_panel.has_method("_create_technology_buttons"): tech_panel._create_technology_buttons() func _process(delta): var zoom_level = (camera.zoom.x + camera.zoom.y) / 2.0 for planet in get_tree().get_nodes_in_group("planets"): planet.visible = zoom_level > PLANET_HIDE_ZOOM func _generate_galaxy(count: int): for i in range(count): var star = StarScene.instantiate() var safe_position = get_safe_star_position() if safe_position != Vector2.ZERO: star.star_name = Names.sector_names[randi() % Names.sector_names.size()] star.planet_count = randi_range(Settings.min_planet, Settings.max_planet) star.global_position = safe_position add_child(star) else: # Przerwij pętlę, gdy nie można już znaleźć bezpiecznej pozycji print("Zatrzymano generowanie po znalezieniu %s systemów." % i) break star.get_node("Sprite2D").texture = load("res://assets/stars/s%d.png" % randi_range(1,8)) #add_child(star) # generowanie planet dla danej gwiazdy for j in range(star.planet_count): var planet = PlanetScene.instantiate() planet.pname = Names.planet_names[randi() % Names.planet_names.size()] planet.orbit_radius = 65 + j * 40 planet.orbit_speed = randf_range(0.004, 0.01) planet.since_potential = 0.1 + (2.0 - 0.1) * pow(randf(), 4.0) planet.size = randi_range(1, 3) #assign_max_population(planet) generate_planet_resources(planet) # <-- tu losujemy surowce var angle = randf() * TAU planet.position = Vector2(cos(angle), sin(angle)) * planet.orbit_radius planet.res_rich = randf() planet.biosfere = pow(randf_range(0.0, 1.0), 3) # float od 0 do 1 if planet.biosfere > 0.7: planet.get_node("Sprite2D").texture = load("res://assets/planets/p%d.png" % randi_range(1,9)) else: planet.get_node("Sprite2D").texture = load("res://assets/planets/p%d.png" % randi_range(10,18)) planet.get_node("Sprite2D").scale = Vector2(0.093*planet.size/2, 0.093*planet.size/2) star.add_child(planet) # Planeta należy do gwiaz7 star.planets.append(planet) print("--- Koniec listy ---") # Lista wszystkich możliwych surowców var RESOURCE_TYPES = Names.RESOURCE_TYPES func generate_planet_resources(planet): planet.resources = {} # resetujemy słownik for resource in RESOURCE_TYPES: var res_name = resource.name var chance = resource.chance var exists = randi() % 100 < chance var amount = 0 planet.resources[res_name] = {"exist": exists, "amount": amount} #func assign_max_population(planet): ## planet_size = 1 (mała), 2 (średnia), 3 (duża) #match planet.size: #1: #planet.max_pop = randi_range(1000, 5000) #2: #planet.max_pop = randi_range(10000, 20000) #3: #planet.max_pop = randi_range(40000, 80000) #_: #planet.max_pop = 0 # zabezpieczenie, gdyby coś poszło nie tak func _input(event): if event.is_action_pressed("ui_cancel"): # np. klawisz ESC show_menu() func show_menu(): var cam = $Camera2D if cam: cam.enabled = false var menu_instance = MenuScene.instantiate() #TimeDispaly.visible = false add_child(menu_instance) #menu_instance.z_index = 100 # na wierzchu wszystkiego get_tree().paused = true # pauzuje grę, jeśli chcesz ## Funkcja zwracająca bezpieczną pozycję lub Vector2.ZERO po niepowodzeniu func get_safe_star_position() -> Vector2: const SQ_MIN_DISTANCE = Settings.MIN_DISTANCE * Settings.MIN_DISTANCE var attempts = 0 while attempts < Settings.MAX_PLACEMENT_ATTEMPTS: # 1. Losowanie nowej, potencjalnej pozycji (float) var potential_pos = Vector2( randf_range(Settings.MARGIN, Settings.x - Settings.MARGIN), randf_range(Settings.MARGIN, Settings.y - Settings.MARGIN) ) # 2. Sprawdzenie, czy pozycja jest bezpieczna var is_safe = true for existing_pos in existing_star_positions: # Szybkie porównanie kwadratu odległości (wydajniejsze) if existing_pos.distance_squared_to(potential_pos) < SQ_MIN_DISTANCE: is_safe = false break # Znaleziono kolizję, przerwij pętlę i spróbuj ponownie if is_safe: # Pozycja bezpieczna. Zapisz ją i zwróć. existing_star_positions.append(potential_pos) return potential_pos attempts += 1 # 3. Limit prób osiągnięty return Vector2.ZERO # Wektor zerowy sygnalizuje, że nie znaleziono pozycji