Wprowadzenie autoloader
This commit is contained in:
parent
456ae98e0f
commit
097efe3a52
59
Manager.gd
Normal file
59
Manager.gd
Normal file
@ -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 {}
|
||||||
1
Manager.gd.uid
Normal file
1
Manager.gd.uid
Normal file
@ -0,0 +1 @@
|
|||||||
|
uid://c4udho6lk0dla
|
||||||
@ -15,6 +15,10 @@ run/main_scene="uid://b1a8a10jb4auf"
|
|||||||
config/features=PackedStringArray("4.5", "Forward Plus")
|
config/features=PackedStringArray("4.5", "Forward Plus")
|
||||||
config/icon="res://icon.svg"
|
config/icon="res://icon.svg"
|
||||||
|
|
||||||
|
[autoload]
|
||||||
|
|
||||||
|
Manager="*res://Manager.gd"
|
||||||
|
|
||||||
[display]
|
[display]
|
||||||
|
|
||||||
window/size/mode=3
|
window/size/mode=2
|
||||||
|
|||||||
@ -2,57 +2,35 @@ extends Node2D
|
|||||||
|
|
||||||
@onready var area = $Area2D
|
@onready var area = $Area2D
|
||||||
|
|
||||||
# Grafika
|
var sprite: Sprite2D
|
||||||
var sprite: Sprite2D = null
|
var colonized_icon: Sprite2D
|
||||||
var colonized_icon: Sprite2D = null
|
|
||||||
|
|
||||||
var base_scale: Vector2 = Vector2(0.3, 0.3)
|
|
||||||
|
|
||||||
# Orbita
|
|
||||||
var orbit_center: Vector2
|
var orbit_center: Vector2
|
||||||
var orbit_radius: float
|
var orbit_radius: float
|
||||||
var rotation_speed: float = 0.02
|
var rotation_speed: float = 0.02
|
||||||
var angle: float = 0.0
|
var angle: float = 0.0
|
||||||
|
|
||||||
# Statystyki planety
|
# Połączenie z globalnymi danymi
|
||||||
var population: int = 0
|
var data: Dictionary
|
||||||
var mining_rate: float = 0.0
|
|
||||||
var resources: float = 0
|
|
||||||
var planet_name: String = "Planet"
|
|
||||||
|
|
||||||
# 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 show_stats(planet)
|
||||||
signal hide_stats()
|
signal hide_stats()
|
||||||
|
|
||||||
func _ready():
|
func _ready():
|
||||||
_ensure_sprite()
|
_ensure_sprite()
|
||||||
angle = randf() * TAU
|
angle = randf() * TAU
|
||||||
|
|
||||||
# Ikona kolonizacji
|
|
||||||
colonized_icon = Sprite2D.new()
|
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.centered = true
|
||||||
colonized_icon.visible = false
|
colonized_icon.visible = false
|
||||||
colonized_icon.scale = Vector2(0.02, 0.02)
|
colonized_icon.scale = Vector2(0.02, 0.02)
|
||||||
add_child(colonized_icon)
|
add_child(colonized_icon)
|
||||||
|
|
||||||
if area:
|
if area:
|
||||||
area.mouse_entered.connect(Callable(self, "_on_mouse_entered"))
|
area.mouse_entered.connect(_on_mouse_entered)
|
||||||
area.mouse_exited.connect(Callable(self, "_on_mouse_exited"))
|
area.mouse_exited.connect(_on_mouse_exited)
|
||||||
area.input_event.connect(Callable(self, "_on_area_input"))
|
area.input_event.connect(_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()
|
|
||||||
|
|
||||||
func _ensure_sprite():
|
func _ensure_sprite():
|
||||||
if sprite == null:
|
if sprite == null:
|
||||||
@ -60,91 +38,50 @@ func _ensure_sprite():
|
|||||||
add_child(sprite)
|
add_child(sprite)
|
||||||
sprite.centered = true
|
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):
|
func _process(delta):
|
||||||
# Ruch planety po orbicie
|
# Ruch orbitalny
|
||||||
angle += rotation_speed * delta
|
angle += rotation_speed * delta
|
||||||
if orbit_center and orbit_radius:
|
if orbit_center and orbit_radius:
|
||||||
position = orbit_center + Vector2(cos(angle), sin(angle)) * orbit_radius
|
position = orbit_center + Vector2(cos(angle), sin(angle)) * orbit_radius
|
||||||
|
|
||||||
# Przyrost populacji i surowców
|
# Aktualizacja ikonki kolonizacji
|
||||||
if is_colonized:
|
|
||||||
pop_timer += delta
|
|
||||||
if pop_timer >= pop_interval:
|
|
||||||
pop_timer = 0.0
|
|
||||||
_grow_population()
|
|
||||||
_mine_resources()
|
|
||||||
|
|
||||||
# Pozycja ikonki kolonizacji
|
|
||||||
if colonized_icon:
|
if colonized_icon:
|
||||||
|
colonized_icon.visible = data["is_colonized"]
|
||||||
var y_offset = 0
|
var y_offset = 0
|
||||||
if sprite and sprite.texture:
|
if sprite and sprite.texture:
|
||||||
y_offset = -sprite.texture.get_size().y * 0.13
|
y_offset = -sprite.texture.get_size().y * 0.13
|
||||||
colonized_icon.position = Vector2(0, y_offset)
|
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():
|
func _on_mouse_entered():
|
||||||
var hover_mul = 1.15
|
|
||||||
if sprite:
|
if sprite:
|
||||||
sprite.scale = base_scale * hover_mul
|
sprite.scale = get_scale_for_size(data["size"]) * 1.15
|
||||||
emit_signal("show_stats", self)
|
emit_signal("show_stats", self)
|
||||||
|
|
||||||
func _on_mouse_exited():
|
func _on_mouse_exited():
|
||||||
if sprite:
|
if sprite:
|
||||||
sprite.scale = base_scale
|
sprite.scale = get_scale_for_size(data["size"])
|
||||||
emit_signal("hide_stats")
|
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
|
|
||||||
|
|||||||
@ -4,29 +4,17 @@ var StarScene = preload("res://scenes/Star.tscn")
|
|||||||
var PlanetScene = preload("res://scenes/Planet.tscn")
|
var PlanetScene = preload("res://scenes/Planet.tscn")
|
||||||
@onready var PlanetStatPanel = $PlanetStatPanel
|
@onready var PlanetStatPanel = $PlanetStatPanel
|
||||||
|
|
||||||
var PLANET_COUNT = randi_range(1,6)
|
|
||||||
const ORBIT_STEP = 120
|
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
|
var tracked_planet: Node = null
|
||||||
|
|
||||||
func _ready():
|
func _ready():
|
||||||
randomize()
|
randomize()
|
||||||
spawn_star()
|
|
||||||
spawn_planets(PLANET_COUNT)
|
|
||||||
_init_background()
|
_init_background()
|
||||||
|
spawn_star()
|
||||||
|
spawn_planets()
|
||||||
|
|
||||||
func _process(delta):
|
func _process(delta):
|
||||||
if tracked_planet != null:
|
if tracked_planet:
|
||||||
_update_panel()
|
_update_panel()
|
||||||
|
|
||||||
func spawn_star():
|
func spawn_star():
|
||||||
@ -35,22 +23,29 @@ func spawn_star():
|
|||||||
star.position = get_viewport_rect().size / 2
|
star.position = get_viewport_rect().size / 2
|
||||||
star.set_texture(random_star_texture())
|
star.set_texture(random_star_texture())
|
||||||
|
|
||||||
func spawn_planets(count: int):
|
func spawn_planets():
|
||||||
var center = get_viewport_rect().size / 2
|
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()
|
var planet = PlanetScene.instantiate()
|
||||||
add_child(planet)
|
add_child(planet)
|
||||||
|
|
||||||
var orbit_radius = (i + 1) * ORBIT_STEP
|
|
||||||
planet.orbit_radius = orbit_radius
|
|
||||||
planet.orbit_center = center
|
planet.orbit_center = center
|
||||||
|
planet.orbit_radius = (i + 1) * ORBIT_STEP
|
||||||
planet.rotation_speed = randf_range(0.01, 0.04)
|
planet.rotation_speed = randf_range(0.01, 0.04)
|
||||||
|
planet.data = planet_data
|
||||||
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.set_texture(random_planet_texture())
|
planet.set_texture(random_planet_texture())
|
||||||
|
|
||||||
planet.connect("show_stats", Callable(self, "_on_show_stats"))
|
planet.connect("show_stats", Callable(self, "_on_show_stats"))
|
||||||
@ -69,12 +64,10 @@ func _init_background():
|
|||||||
background.z_index = -10
|
background.z_index = -10
|
||||||
|
|
||||||
func random_star_texture() -> Texture2D:
|
func random_star_texture() -> Texture2D:
|
||||||
var id = randi_range(1, 16)
|
return load("res://assets/stars/s%d.png" % randi_range(1, 16))
|
||||||
return load("res://assets/stars/s%d.png" % id)
|
|
||||||
|
|
||||||
func random_planet_texture() -> Texture2D:
|
func random_planet_texture() -> Texture2D:
|
||||||
var id = randi_range(1, 18)
|
return load("res://assets/planets/p%d.png" % randi_range(1, 18))
|
||||||
return load("res://assets/planets/p%d.png" % id)
|
|
||||||
|
|
||||||
# --- GUI ---
|
# --- GUI ---
|
||||||
func _on_show_stats(planet):
|
func _on_show_stats(planet):
|
||||||
@ -87,17 +80,14 @@ func _on_hide_stats():
|
|||||||
tracked_planet = null
|
tracked_planet = null
|
||||||
|
|
||||||
func _update_panel():
|
func _update_panel():
|
||||||
|
if tracked_planet == null:
|
||||||
|
return
|
||||||
|
var d = tracked_planet.data
|
||||||
var colonized_text = ""
|
var colonized_text = ""
|
||||||
if tracked_planet.is_colonized:
|
if d["is_colonized"]:
|
||||||
colonized_text = " (Skolonizowana)"
|
colonized_text = " (Skolonizowana)"
|
||||||
PlanetStatPanel.get_node("PlanetName").text = "Name: " + tracked_planet.planet_name + colonized_text
|
|
||||||
|
PlanetStatPanel.get_node("PlanetName").text = "Name: " + d["name"] + colonized_text
|
||||||
PlanetStatPanel.get_node("PopulationPanel").text = ("Populacja: %d / %d" % [tracked_planet.population, tracked_planet.max_population])
|
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("MiningRate").text = ("Współczynnik wydobycia: %.2f" % tracked_planet.mining_rate)
|
PlanetStatPanel.get_node("ResourcePlanet").text = "Surowce: %.2f" % d["resources"]
|
||||||
|
|
||||||
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]
|
|
||||||
)
|
|
||||||
|
|||||||
@ -8,4 +8,4 @@ func _ready():
|
|||||||
func set_texture(tex: Texture2D):
|
func set_texture(tex: Texture2D):
|
||||||
sprite.texture = tex
|
sprite.texture = tex
|
||||||
sprite.centered = true
|
sprite.centered = true
|
||||||
sprite.scale = Vector2(0.1, 0.1) # możesz zmienić rozmiar
|
sprite.scale = Vector2(0.1, 0.1)
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user