ArkSol/scripts/planet.gd

191 lines
5.0 KiB
GDScript

extends Node2D
class_name Planet
@onready var label = $Label
@onready var info_label = $CanvasLayer/Info
@onready var area = $Area2D
# --- Timery ---
var pop_timer: float = 0.0
var res_timer: float = 0.0
var cons_timer: float = 0.0
var pname: String = ""
var orbit_radius: float = 30.0
var orbit_speed: float = 0.01
var biosfere: float = 0.1
var is_colonized = false
var size = 1
var max_pop = 1
var population: int = 0
var res_rich: float = 0.0
var resources := {}
var buildings := []
# słownik z ID -> stan budynku
var texture: Texture2D
var angle = randf() * TAU
func _ready():
add_to_group("planets")
# Podłącz sygnały
area.mouse_entered.connect(_on_mouse_entered)
area.mouse_exited.connect(_on_mouse_exited)
area.connect("input_event", Callable(self, "_on_area_input"))
#str(round(biosfere * 100) / 100.0)
_update_position()
# Testowanie funkcji
add_building("iron_mine")
add_building("water_purifier")
add_building("iron_mine") # próba dodania ponownie
print("Lista budynków na planecie:", buildings)
var data = BuildingsList.BUILDINGS["iron_mine"]
print(data.name, data.cost)
func _process(delta):
angle += orbit_speed * delta # obrót w czasie
angle = fmod(angle, TAU) # utrzymanie kąta w 0..2π
_update_position()
if is_colonized:
_pop_growth(delta)
_res_growth(delta)
_res_consumption(delta)
print_data()
label.text = str(pname)
update_buildings(delta)
func _update_position():
# pozycja lokalna względem gwiazdy
position = Vector2(cos(angle), sin(angle)) * orbit_radius
func _on_mouse_entered():
info_label.visible = true
print_data()
func _on_area_input(viewport, event, shape_idx):
if event is InputEventMouseButton and event.pressed and event.button_index == MOUSE_BUTTON_LEFT:
_on_mouse_click()
func _on_mouse_exited():
info_label.visible = false
func _on_mouse_click():
colonize()
func colonize():
if is_colonized == false:
is_colonized = true
label.add_theme_color_override("font_color", Color(0.0, 0.454, 0.0, 1.0))
population = 100
print_data()
func print_data():
var text = "🌍 %s\n" % pname
text += "Biosfera: %.2f\n" % biosfere
text += "Zasobność surowców: %.2f\n" % res_rich
text += "Limit populacji: " + str(int(max_pop)).pad_decimals(0) + "\n"
text += "Populacja: " + str(int(population)).pad_decimals(0) + "\n"
text += "Status: " + ("Skolonizowana" if is_colonized else "Nieskolonizowana") + "\n"
var has_any_resource = false
for key in resources.keys():
var res = resources[key]
if res.has("exist") and res["exist"]:
if not has_any_resource:
text += "Zasoby:\n"
has_any_resource = true
var display_name = tr(key)
text += "%s: %.2f +(%s)\n" % [display_name, round(res.get("amount", 0) * 100) / 100.0, check_growth()]
info_label.text = text
func _pop_growth(delta):
pop_timer += delta
if pop_timer >= Settings.UPDATE_INTERVAL:
if resources["water"]["amount"] > 0:
var growth = int(max(1, population * 0.05 * biosfere))
population = min(population + growth, max_pop)
pop_timer = 0.0
else:
population = max(population - 10, 100)
pop_timer = 0.0
func _res_growth(delta):
res_timer += delta
if res_timer < Settings.UPDATE_INTERVAL:
return
res_timer = 0.0
for res_name in resources.keys():
var res = resources[res_name]
if res.exist:
# Sprawdź, czy planeta ma budynek wydobywający ten surowiec
var can_produce = false
for b in buildings:
if not b.is_building: # tylko ukończone budynki
var building_data = BuildingsList.BUILDINGS[b.id]
if building_data.resource == res_name:
can_produce = true
break
if can_produce:
var growth = check_growth() # np. funkcja zwraca ile przyrasta
res.amount += growth
resources[res_name] = res
func check_growth() -> float:
# Zwraca przyrost zaokrąglony do 2 miejsc po przecinku
var growth = res_rich * (population / 1000.0)
return round(growth * 100) / 100.0
func _res_consumption(delta):
var water_usage = population * 0.0002 # np. 0.002 jednostki wody na osobę
cons_timer += delta
if cons_timer >= Settings.UPDATE_INTERVAL:
if "water" in resources:
resources["water"].amount -= water_usage
if resources["water"].amount < 0:
resources["water"].amount = 0
cons_timer = 0.0
func add_building(building_id: String):
# Sprawdzenie czy istnieje w definicjach
if not BuildingsList.BUILDINGS.has(building_id):
print("Nie ma takiego budynku:", building_id)
return
# Sprawdzenie czy planeta już ma ten budynek
for b in buildings:
if b.id == building_id:
print("Planeta już ma budynek:", building_id)
return
# Dodajemy budynek w budowie
buildings.append({
"id": building_id,
"level": 1,
"is_building": true,
"built_time": 0.0
})
print("Rozpoczęto budowę budynku:", BuildingsList.BUILDINGS[building_id].name)
func update_buildings(delta: float):
for b in buildings:
if b.is_building:
var build_time = BuildingsList.BUILDINGS[b.id].build_time
b.built_time += delta
if b.built_time >= build_time:
b.is_building = false
print("Budowa ukończona:", BuildingsList.BUILDINGS[b.id].name)