space_empire/Manager.gd
2025-10-24 16:50:09 +02:00

201 lines
5.8 KiB
GDScript

extends Node
# Autoload: Manager
# --- KONFIGURACJA ---
@export var SECTOR_COUNT: int = Settings.SECTOR_COUNT
@export var PLANETS_PER_SECTOR_RANGE = Settings.PLANET_PER_SECTOR
# --- DANE ---
var sectors_data: Array = [] # Każdy element: {"name", "position", "planets", "star"}
var placed_star_positions: Array[Vector2] = []
var current_sector: int = -1
# Timer aktualizacji
var update_timer := 0.0
# Nazwy sektorów i planet
var planet_names = [
"Arcturus","Betelgeuse","Canopus","Deneb","Elnath",
"Fomalhaut","Gacrux","Hadar","Izar","Jabbah",
"Kaus","Lesath","Menkent","Nunki","Okul",
"Pollux","Rigel","Sargas","Toliman","Unukalhai",
"Vega","Wezen","Xamidimura","Yildun","Zosma"
]
# --- START ---
func _ready():
randomize()
_initialize_sectors()
print("[Manager] Initialized with %d sectors" % SECTOR_COUNT)
TranslationServer.set_locale(Settings.LANGUAGE) # wersja jezykowa
Input.set_custom_mouse_cursor(load(Settings.CURSOR))
func _process(delta):
update_timer += delta
if update_timer >= Settings.UPDATE_INTERVAL:
update_timer = 0.0
_update_planets()
# --- LOSOWANIE UNIKALNEJ NAZWY SEKTORA ---
func get_unique_sector_name() -> String:
if Names.sector_names.size() == 0:
return "Unknown Sector"
var index = randi() % Names.sector_names.size()
var name = Names.sector_names[index]
Names.sector_names.remove_at(index)
return name
# --- INICJALIZACJA SEKTORÓW ---
func _initialize_sectors():
for i in range(SECTOR_COUNT):
if sectors_data.size() <= i:
sectors_data.resize(i + 1)
if sectors_data[i] == null:
# Pozycja sektora
var pos = find_safe_position()
if pos != Vector2.ZERO:
print("Udało się znaleźć miejsca dla gwiazdy.")
placed_star_positions.append(pos)
else:
print("Nie udało się znaleźć miejsca dla wszystkich gwiazd.")
# Nazwa sektora
var name = get_unique_sector_name()
# Losowa gwiazda
var star_texture = _random_star_texture()
var star_scale = randf_range(0.02, 0.04)
# Utworzenie sektora
sectors_data[i] = {
"name": name,
"position": pos,
"planets": [],
"star": {
"texture_path": star_texture,
"scale": star_scale
}
}
# Planety
var planet_count = randi_range(PLANETS_PER_SECTOR_RANGE.x, PLANETS_PER_SECTOR_RANGE.y)
for j in range(planet_count):
_add_random_planet(i)
# --- FUNKCJE PLANET ---
func _add_random_planet(sector_index: int):
var size = randi_range(1, 3)
var growth_rate = randf_range(0.1, 1.0)
var texture_planet: String
if growth_rate > 0.7:
texture_planet = "res://assets/planets/p%d.png" % randi_range(1,9)
else:
texture_planet = "res://assets/planets/p%d.png" % randi_range(10,18)
var planet = {
"name": planet_names[randi() % planet_names.size()],
"size": size,
"population": 0,
"max_population": get_max_population(size),
"resources": 0.0,
"mining_rate": randf_range(0.1, 1.0),
"growth_rate": growth_rate,
"is_colonized": false,
"angle": randf() * TAU,
"rotation_speed": randf_range(0.001, 0.02),
"texture_path": texture_planet
}
sectors_data[sector_index]["planets"].append(planet)
func _update_planets():
for sector in sectors_data:
if sector == null:
continue
for planet in sector["planets"]:
if planet["is_colonized"]:
var growth = int(max(1, planet["population"] * 0.05 * planet["growth_rate"]))
planet["population"] = min(planet["population"] + growth, planet["max_population"])
planet["resources"] += get_mined_per_cycle(planet)
func get_mined_per_cycle(planet: Dictionary) -> float:
return planet["mining_rate"] * pow(planet["population"], 0.5) * 0.05
func get_max_population(size: int) -> int:
match size:
1: return 1000
2: return 5000
3: return 15000
4: return 30000
return 1000
# --- DOSTĘP DO SEKTORÓW I PLANET ---
func get_sector(index: int) -> Dictionary:
if index >= 0 and index < sectors_data.size():
return sectors_data[index]
return {}
func get_planets(index: int) -> Array:
var sector = get_sector(index)
if sector.has("planets"):
return sector["planets"]
return []
func register_planet(sector_index: int, planet_name: String, size: int, mining_rate: float, growth_rate: float) -> Dictionary:
if sectors_data.size() <= sector_index:
sectors_data.resize(sector_index + 1)
if sectors_data[sector_index] == null:
sectors_data[sector_index] = {"planets": [], "name":"Unknown", "position": Vector2.ZERO, "star":{}}
var planet = {
"name": planet_name,
"size": size,
"population": 0,
"max_population": get_max_population(size),
"resources": 0.0,
"mining_rate": mining_rate,
"growth_rate": growth_rate,
"is_colonized": false,
"angle": randf() * TAU,
"rotation_speed": randf_range(0.01, 0.03),
"texture_path": "res://assets/planets/p%d.png" % randi_range(1,18)
}
sectors_data[sector_index]["planets"].append(planet)
return planet
# --- LOSOWANIE GWIAZD ---
func _random_star_texture() -> String:
var id = randi_range(1, 8)
return "res://assets/stars/s%d.png" % id
func find_safe_position() -> Vector2:
var screen_size = get_viewport().get_visible_rect().size
for attempt in range(Settings.MAX_ATTEMPTS):
# 1. Losowanie potencjalnej pozycji w obszarze (zgodnie z Twoimi marginesami)
var potential_pos = Vector2(
randf_range(50, screen_size.x - 50),
randf_range(50, screen_size.y - 50)
)
# 2. Sprawdzenie, czy pozycja jest bezpieczna
if is_position_safe(potential_pos):
return potential_pos # Znaleziono bezpieczną pozycję!
# 3. Jeśli po MAX_ATTEMPTS nie znaleziono miejsca
print("Osiągnięto limit prób, nie można znaleźć bezpiecznego miejsca.")
return Vector2.ZERO # Zwróć zero, aby zasygnalizować błąd
func is_position_safe(potential_pos: Vector2) -> bool:
for existing_pos in placed_star_positions:
var distance = potential_pos.distance_to(existing_pos)
if distance < Settings.MIN_DISTANCE:
return false # Kolizja znaleziona
return true # Brak kolizji z żadną istniejącą gwiazdą