137 lines
3.5 KiB
GDScript
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()
|