100 lines
2.6 KiB
GDScript
100 lines
2.6 KiB
GDScript
extends Node2D
|
|
class_name Planet
|
|
|
|
@onready var area = $Area2D
|
|
|
|
var sprite: Sprite2D
|
|
var colonized_icon: Sprite2D
|
|
|
|
# Dane orbitalne
|
|
var orbit_center: Vector2 = Vector2.ZERO
|
|
var orbit_radius: float = 0.0
|
|
var rotation_speed: float = 0.02
|
|
var angle: float = 0.0
|
|
|
|
# Dane planety (przypisywane z Managera)
|
|
var data: Dictionary = {}
|
|
|
|
signal show_stats(planet)
|
|
signal hide_stats()
|
|
|
|
func _ready():
|
|
_ensure_sprite()
|
|
|
|
# Jeśli zapisano pozycję i kąt w danych, użyj ich
|
|
if data.has("angle"):
|
|
angle = data["angle"]
|
|
else:
|
|
angle = randf() * TAU
|
|
|
|
# Ikona kolonizacji
|
|
colonized_icon = Sprite2D.new()
|
|
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(_on_mouse_entered)
|
|
area.mouse_exited.connect(_on_mouse_exited)
|
|
area.input_event.connect(_on_area_input)
|
|
|
|
func _ensure_sprite():
|
|
if sprite == null:
|
|
sprite = Sprite2D.new()
|
|
add_child(sprite)
|
|
sprite.centered = true
|
|
|
|
func _process(delta):
|
|
# Ruch orbitalny
|
|
angle += rotation_speed * delta
|
|
if orbit_center != Vector2.ZERO and orbit_radius > 0.0:
|
|
position = orbit_center + Vector2(cos(angle), sin(angle)) * orbit_radius
|
|
# zapisujemy kąt do danych, żeby pamiętać pozycję
|
|
if data != null:
|
|
data["angle"] = angle
|
|
|
|
# Aktualizacja ikonki kolonizacji
|
|
if colonized_icon != null and data != null:
|
|
colonized_icon.visible = data["is_colonized"]
|
|
var y_offset = 0.0
|
|
if sprite != null and sprite.texture != null:
|
|
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
|
|
if data != null and data.has("size"):
|
|
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 data != null and 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():
|
|
if sprite != null and data != null:
|
|
sprite.scale = get_scale_for_size(data["size"]) * 1.15
|
|
emit_signal("show_stats", self)
|
|
|
|
func _on_mouse_exited():
|
|
if sprite != null and data != null:
|
|
sprite.scale = get_scale_for_size(data["size"])
|
|
emit_signal("hide_stats")
|