extends Panel @onready var tech_container = $Technologies # Ścieżka do tekstur technologii (tu możesz dać swoje grafiki) const DEFAULT_ICON = preload("res://assets/tech/Mining_Drill.png") var dragging := false var drag_offset := Vector2.ZERO signal building_buttons_update func _gui_input(event): if event is InputEventMouseButton: if event.button_index == MOUSE_BUTTON_LEFT: if event.pressed: # Kliknięto na panel → zaczynamy drag dragging = true drag_offset = get_local_mouse_position() else: # Zwolniono przycisk → kończymy drag dragging = false elif event is InputEventMouseMotion and dragging: # Przesuwamy panel względem pozycji myszy position += event.relative func _ready(): _create_technology_buttons() func _create_technology_buttons(): # Wyczyść stare przyciski for c in tech_container.get_children(): c.queue_free() for tech_id in Technologies.TECHNOLOGIES.keys(): var tech = Technologies.TECHNOLOGIES[tech_id] var btn = TextureButton.new() # 🔹 Ustaw ikonę technologii z pola "texture" if tech.has("texture") and tech.texture != "": btn.texture_normal = load(tech.texture) else: # Fallback na domyślną ikonę, jeśli brak tekstury w danych btn.texture_normal = DEFAULT_ICON btn.custom_minimum_size = Vector2(96, 96) btn.stretch_mode = TextureButton.STRETCH_KEEP_ASPECT_CENTERED # 🔹 Tooltip z opisem i kosztami var cost_text = "" for cost_name in tech.cost.keys(): cost_text += "%s: %d " % [tr(cost_name), tech.cost[cost_name]] btn.tooltip_text = "%s\n%s\n%s %s" % [ tr(tech.name), tr(tech.description), tr("Koszt:"), cost_text.strip_edges() ] # 🔹 Jeśli gracz już ma tę technologię if tech_id in PlayerData.unlocked_techs: btn.modulate = Color(0.6, 0.6, 0.6) # wyszarz btn.disabled = true btn.tooltip_text += "\n[✓] " + tr("Odkryta") # 🔹 Jeśli brakuje wymaganych technologii elif not _check_requirements(tech.requires): btn.modulate = Color(0.5, 0.5, 0.5) btn.disabled = true btn.tooltip_text += "\n[!] " + tr("Wymagania niespełnione") else: # 🔹 Po kliknięciu rozpocznij badanie technologii btn.connect("pressed", Callable(self, "_on_technology_pressed").bind(tech_id)) tech_container.add_child(btn) func _check_requirements(requirements: Array) -> bool: if requirements.is_empty(): return true for req in requirements: if req not in PlayerData.unlocked_techs: return false return true func _on_technology_pressed(tech_id): var tech = Technologies.TECHNOLOGIES[tech_id] # Jeśli gracz już ma tę technologię — nic nie rób if tech_id in PlayerData.unlocked_techs: print("Gracz już ma technologię:", tech_id) return # Sprawdź wymagania for req in tech.requires: if req not in PlayerData.unlocked_techs: print("Brak wymaganej technologii:", req) return # Sprawdź, czy gracz ma wystarczające zasoby i naukę for cost_name in tech.cost.keys(): var required_amount = tech.cost[cost_name] var has_enough = false if cost_name == "science": has_enough = PlayerData.since_doc >= required_amount else: if PlayerData.resources.has(cost_name): has_enough = PlayerData.resources[cost_name] >= required_amount if not has_enough: print("Brak zasobu:", cost_name) return # Odejmij koszty for cost_name in tech.cost.keys(): if cost_name == "science": PlayerData.since_doc -= tech.cost[cost_name] else: PlayerData.resources[cost_name] -= tech.cost[cost_name] # Dodaj technologię do odblokowanych PlayerData.unlocked_techs.append(tech_id) print("Odblokowano technologię:", tech.name) emit_signal("building_buttons_update") # Opcjonalnie: powiadom o zmianach PlayerData.emit_signal("stats_changed") _create_technology_buttons() func _on_button_pressed() -> void: hide()