diff --git a/Manager.gd b/Manager.gd new file mode 100644 index 0000000..8b2df30 --- /dev/null +++ b/Manager.gd @@ -0,0 +1,59 @@ +# Manager.gd +extends Node + +# Globalna lista wszystkich planet (słowniki) +var planets_data: Array = [] + +# Czas do aktualizacji +var update_timer := 0.0 +const UPDATE_INTERVAL := 5.0 # co 5 sekund + +func _ready(): + print("[Manager] Initialized global manager") + +func _process(delta): + update_timer += delta + if update_timer >= UPDATE_INTERVAL: + update_timer = 0 + _update_planets() + +# --- Tworzenie planety globalnie --- +func register_planet(planet_name: String, size: int, mining_rate: float): + var planet = { + "name": planet_name, + "size": size, + "population": 0, + "max_population": get_max_population(size), + "resources": 0.0, + "mining_rate": mining_rate, + "is_colonized": false + } + planets_data.append(planet) + return planet + +# --- Symulacja wzrostu i wydobycia --- +func _update_planets(): + for planet in planets_data: + if planet["is_colonized"]: + var growth = int(planet["population"] / 10) # +10% + planet["population"] = min(planet["population"] + growth, planet["max_population"]) + planet["resources"] += get_mined_per_cycle(planet) + print("[Manager] Updated planets") + +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 + +# --- Funkcje pomocnicze --- +func get_planet_by_name(name: String) -> Dictionary: + for planet in planets_data: + if planet["name"] == name: + return planet + return {} diff --git a/Manager.gd.uid b/Manager.gd.uid new file mode 100644 index 0000000..83e4348 --- /dev/null +++ b/Manager.gd.uid @@ -0,0 +1 @@ +uid://c4udho6lk0dla diff --git a/project.godot b/project.godot index b1abd56..73892d0 100644 --- a/project.godot +++ b/project.godot @@ -15,6 +15,10 @@ run/main_scene="uid://b1a8a10jb4auf" config/features=PackedStringArray("4.5", "Forward Plus") config/icon="res://icon.svg" +[autoload] + +Manager="*res://Manager.gd" + [display] -window/size/mode=3 +window/size/mode=2 diff --git a/scripts/planet.gd b/scripts/planet.gd index fd3fc9f..cfb8d06 100644 --- a/scripts/planet.gd +++ b/scripts/planet.gd @@ -2,57 +2,35 @@ extends Node2D @onready var area = $Area2D -# Grafika -var sprite: Sprite2D = null -var colonized_icon: Sprite2D = null +var sprite: Sprite2D +var colonized_icon: Sprite2D -var base_scale: Vector2 = Vector2(0.3, 0.3) - -# Orbita var orbit_center: Vector2 var orbit_radius: float var rotation_speed: float = 0.02 var angle: float = 0.0 -# Statystyki planety -var population: int = 0 -var mining_rate: float = 0.0 -var resources: float = 0 -var planet_name: String = "Planet" +# Połączenie z globalnymi danymi +var data: Dictionary -# Rozmiar i potencjał -var planet_size: int = 1 -var max_population: int = 0 -var is_colonized: bool = false - -# Czas od ostatniego przyrostu -var pop_timer: float = 0.0 -var pop_interval: float = 30.0 - -# Sygnały signal show_stats(planet) signal hide_stats() func _ready(): _ensure_sprite() angle = randf() * TAU - - # Ikona kolonizacji + colonized_icon = Sprite2D.new() - colonized_icon.texture = load("res://assets/icons/col_icon.png") # <-- podaj własną ścieżkę + colonized_icon.texture = load("res://assets/icons/col_icon.png") colonized_icon.centered = true colonized_icon.visible = false colonized_icon.scale = Vector2(0.02, 0.02) add_child(colonized_icon) if area: - area.mouse_entered.connect(Callable(self, "_on_mouse_entered")) - area.mouse_exited.connect(Callable(self, "_on_mouse_exited")) - area.input_event.connect(Callable(self, "_on_area_input")) - -func _on_area_input(viewport, event, shape_idx): - if event is InputEventMouseButton and event.pressed and event.button_index == MOUSE_BUTTON_LEFT: - colonize() + area.mouse_entered.connect(_on_mouse_entered) + area.mouse_exited.connect(_on_mouse_exited) + area.input_event.connect(_on_area_input) func _ensure_sprite(): if sprite == null: @@ -60,91 +38,50 @@ func _ensure_sprite(): add_child(sprite) sprite.centered = true -func set_texture(tex: Texture2D): - _ensure_sprite() - sprite.texture = tex - _apply_scale_for_size() - -func set_size(new_size: int): - planet_size = clamp(new_size, 1, 4) - _apply_scale_for_size() - -func _apply_scale_for_size(): - match planet_size: - 1: - base_scale = Vector2(0.20, 0.20) - max_population = 1000 - 2: - base_scale = Vector2(0.30, 0.30) - max_population = 5000 - 3: - base_scale = Vector2(0.42, 0.42) - max_population = 15000 - 4: - base_scale = Vector2(0.60, 0.60) - max_population = 30000 - if sprite: - sprite.scale = base_scale - func _process(delta): - # Ruch planety po orbicie + # Ruch orbitalny angle += rotation_speed * delta if orbit_center and orbit_radius: position = orbit_center + Vector2(cos(angle), sin(angle)) * orbit_radius - # Przyrost populacji i surowców - if is_colonized: - pop_timer += delta - if pop_timer >= pop_interval: - pop_timer = 0.0 - _grow_population() - _mine_resources() - - # Pozycja ikonki kolonizacji + # Aktualizacja ikonki kolonizacji if colonized_icon: + colonized_icon.visible = data["is_colonized"] var y_offset = 0 if sprite and sprite.texture: y_offset = -sprite.texture.get_size().y * 0.13 colonized_icon.position = Vector2(0, y_offset) +func set_texture(tex: Texture2D): + _ensure_sprite() + sprite.texture = tex + sprite.scale = get_scale_for_size(data["size"]) + +func get_scale_for_size(size: int) -> Vector2: + match size: + 1: return Vector2(0.20, 0.20) + 2: return Vector2(0.30, 0.30) + 3: return Vector2(0.42, 0.42) + 4: return Vector2(0.60, 0.60) + return Vector2(0.3, 0.3) + +func _on_area_input(viewport, event, shape_idx): + if event is InputEventMouseButton and event.pressed and event.button_index == MOUSE_BUTTON_LEFT: + colonize() + +func colonize(): + if not data["is_colonized"]: + data["is_colonized"] = true + data["population"] = 10 + print(data["name"] + " has been colonized!") + emit_signal("show_stats", self) + func _on_mouse_entered(): - var hover_mul = 1.15 if sprite: - sprite.scale = base_scale * hover_mul + sprite.scale = get_scale_for_size(data["size"]) * 1.15 emit_signal("show_stats", self) func _on_mouse_exited(): if sprite: - sprite.scale = base_scale + sprite.scale = get_scale_for_size(data["size"]) emit_signal("hide_stats") - -func colonize(): - if not is_colonized: - is_colonized = true - population = 10 - print(planet_name + " has been colonized!") - emit_signal("show_stats", self) - if colonized_icon: - colonized_icon.visible = true - -func add_population(amount: int): - population = min(population + amount, max_population) - -func spend_resources(amount: int) -> bool: - if resources >= amount: - resources -= amount - return true - return false - -func _grow_population(): - var growth = int(population / 10) # +10% - add_population(growth) - -func _mine_resources(): - var mined = get_mined_per_cycle() - resources += mined - -# --- NOWA FUNKCJA --- -# Zwraca ile surowców planeta wydobywa na jeden cykl (np. co 30 sekund) -func get_mined_per_cycle() -> float: - return mining_rate * pow(population, 0.5) * 0.05 diff --git a/scripts/sector.gd b/scripts/sector.gd index 7affd5e..773476b 100644 --- a/scripts/sector.gd +++ b/scripts/sector.gd @@ -4,29 +4,17 @@ var StarScene = preload("res://scenes/Star.tscn") var PlanetScene = preload("res://scenes/Planet.tscn") @onready var PlanetStatPanel = $PlanetStatPanel -var PLANET_COUNT = randi_range(1,6) const ORBIT_STEP = 120 - -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", - "Alkaid","Baten","Caph","Diphda","Electra" -] - -# Planeta, której statystyki są aktualnie pokazywane var tracked_planet: Node = null func _ready(): randomize() - spawn_star() - spawn_planets(PLANET_COUNT) _init_background() + spawn_star() + spawn_planets() func _process(delta): - if tracked_planet != null: + if tracked_planet: _update_panel() func spawn_star(): @@ -35,22 +23,29 @@ func spawn_star(): star.position = get_viewport_rect().size / 2 star.set_texture(random_star_texture()) -func spawn_planets(count: int): +func spawn_planets(): var center = get_viewport_rect().size / 2 - for i in range(count): + + # jeśli Manager nie ma jeszcze planet — utwórz kilka losowych + if Manager.planets_data.size() == 0: + var names = ["Arcturus","Betelgeuse","Canopus","Deneb","Elnath"] + for name in names: + var planet = Manager.register_planet( + name, + randi_range(1, 3), + randf_range(0.1, 1.0) + ) + + # stwórz instancje wizualne + for i in range(Manager.planets_data.size()): + var planet_data = Manager.planets_data[i] var planet = PlanetScene.instantiate() add_child(planet) - var orbit_radius = (i + 1) * ORBIT_STEP - planet.orbit_radius = orbit_radius planet.orbit_center = center + planet.orbit_radius = (i + 1) * ORBIT_STEP planet.rotation_speed = randf_range(0.01, 0.04) - - planet.planet_size = randi_range(1, 3) - planet.set_size(planet.planet_size) - planet.resources = 0 - planet.mining_rate = randf_range(0.1, 1.0) - planet.planet_name = planet_names[randi() % planet_names.size()] + planet.data = planet_data planet.set_texture(random_planet_texture()) planet.connect("show_stats", Callable(self, "_on_show_stats")) @@ -69,12 +64,10 @@ func _init_background(): background.z_index = -10 func random_star_texture() -> Texture2D: - var id = randi_range(1, 16) - return load("res://assets/stars/s%d.png" % id) + return load("res://assets/stars/s%d.png" % randi_range(1, 16)) func random_planet_texture() -> Texture2D: - var id = randi_range(1, 18) - return load("res://assets/planets/p%d.png" % id) + return load("res://assets/planets/p%d.png" % randi_range(1, 18)) # --- GUI --- func _on_show_stats(planet): @@ -87,17 +80,14 @@ func _on_hide_stats(): tracked_planet = null func _update_panel(): + if tracked_planet == null: + return + var d = tracked_planet.data var colonized_text = "" - if tracked_planet.is_colonized: + if d["is_colonized"]: colonized_text = " (Skolonizowana)" - PlanetStatPanel.get_node("PlanetName").text = "Name: " + tracked_planet.planet_name + colonized_text - - PlanetStatPanel.get_node("PopulationPanel").text = ("Populacja: %d / %d" % [tracked_planet.population, tracked_planet.max_population]) - - PlanetStatPanel.get_node("MiningRate").text = ("Współczynnik wydobycia: %.2f" % tracked_planet.mining_rate) - - var mined_per_cycle = tracked_planet.get_mined_per_cycle() - - PlanetStatPanel.get_node("ResourcePlanet").text = ( - "Surowce: %.2f (+%.2f / cykl)" % [tracked_planet.resources, mined_per_cycle] - ) + + PlanetStatPanel.get_node("PlanetName").text = "Name: " + d["name"] + colonized_text + PlanetStatPanel.get_node("PopulationPanel").text = "Populacja: %d / %d" % [d["population"], d["max_population"]] + PlanetStatPanel.get_node("MiningRate").text = "Wydobycie: %.2f" % d["mining_rate"] + PlanetStatPanel.get_node("ResourcePlanet").text = "Surowce: %.2f" % d["resources"] diff --git a/scripts/star.gd b/scripts/star.gd index 04a365a..345f17d 100644 --- a/scripts/star.gd +++ b/scripts/star.gd @@ -8,4 +8,4 @@ func _ready(): func set_texture(tex: Texture2D): sprite.texture = tex sprite.centered = true - sprite.scale = Vector2(0.1, 0.1) # możesz zmienić rozmiar + sprite.scale = Vector2(0.1, 0.1)