GAE_CA1/Assets/Kessel/kessel_controller.gd

137 lines
3.5 KiB
GDScript

class_name Kessel extends StaticBody2D
@export var ui_elemnte: Kessel_UI
var potion_ingerdiants:Array[String]
var fuel_level:float = 60
var brew_progress:float = 0.0
var overheat_timer: float = 0.0
@export var item_input_sound: AudioStreamPlayer
# Einstellungen
@export_subgroup("Einstellungen Kessel")
@export var fuel_burn_rate: float = 1.0 # Wie schnell das Feuer ausgeht (pro Sekunde)
@export var brew_speed: float = 10.0 # Wie schnell die Potion fertig wird
@export var max_overheat_time: float = 5.0 # 5 Sekunden Zeit zu reagieren
@export var max_fuel_level:int = 100
#Flags
var has_fuel:bool = false
var is_brewing:bool = false
signal potion_done(list:Array[String])
func _process(delta: float) -> void:
if has_fuel:
handle_fuel(delta)
if is_brewing:
handle_brewing(delta)
## Funktion passiert wenn der spieler etwas in den topf wierft
# muss den brew progress zurückstezten , neu starten wenn was neues dazu kommt
func add_item(item:Item)->void:
# is es das erste , ingredient dann zeige icon und starte timer / wenn was drin ist starte timer neu
if item.item_type == Item.TYPE.INGREDIENT:
potion_ingerdiants.append(item.name)
new_ingrediant()
item_input_sound.play()
elif item.name == "Wood":
add_fuell()
ui_elemnte.hitze_bar.show()
# wenn die bar noch net aktiviert ist aktiviere sie
else:
print("Spiler hat nichts in der Hand was wichtig ist ")
return
## wenn ein Ingredient hinzugefügt wird
func new_ingrediant()->void:
# erstes ingrediant für die portion
if potion_ingerdiants.size() == 1:
ui_elemnte.brew_container.show()
# starte brew timer
is_brewing = true
# hier vl speilen das je mehr zutaen drin sindd er brew timer etwas rurück geht je mehr desto mehr
brew_progress -= 10.0
fuel_level -= 5.0
func handle_brewing(delta:float)->void:
# 1. Berechne wie effizient die Hitze gerade ist
if !ui_elemnte.brew_progess.is_visible_in_tree():
ui_elemnte.brew_progess.show()
var heat_efficiency: float = 0.0
if fuel_level < 25:
heat_efficiency = 0.0 # Zu kalt
elif fuel_level <= 80:
heat_efficiency = 1.0 # Perfekt
else:
heat_efficiency = 1.8 # Turbo-Brauen, aber gefährlich!
# 2. Wende die Effizienz auf den Fortschritt an
# Wenn heat_efficiency 0 ist, bleibt der Balken einfach stehen
brew_progress += brew_speed * heat_efficiency * delta
# UI Update
ui_elemnte.set_brew_bar(brew_progress)
# Check ob fertig
if brew_progress >= 100:
finish_potion()
func finish_potion()->void:
is_brewing = false
ui_elemnte.brew_progess.hide()
potion_done.emit(potion_ingerdiants)
brew_progress = 0.0
$potion_done_sound.play()
# vl noch coole animation abspeilen das die potion fertig ist zb idk
## Kessel Fuel Logik
func handle_fuel(time:float)->void:
# Passiver Brennstoffverbrauch
fuel_level = clamp(fuel_level, 0, 100)
fuel_level -= fuel_burn_rate*time
# UI Update
ui_elemnte.set_fuel_bar(fuel_level)
# Überhitzung prüfen
if fuel_level >= 95.0:
overheat_timer += time
# Hier könnte man den Kessel rot blinken lassen
if overheat_timer >= max_overheat_time:
explode_kessel()
else:
overheat_timer = 0.0
func explode_kessel()->void:
pass
## funktion die Getriggert wurd wenn Holz rin kommt - verbindung mit Hitze
func add_fuell()->void:
if fuel_level < max_fuel_level:
fuel_level += 15
has_fuel = true
func has_potion()->bool:
if not is_brewing and potion_ingerdiants.size() >= 1:
potion_ingerdiants = []
return true
return false
func hide_kessel_ui()->void:
ui_elemnte.brew_container.hide()