vrp-gruppe-sechs/escape-room/objekte/riddel_node_board.gd

204 lines
6.2 KiB
GDScript

extends Node3D
# Die richtige Lösung als String (z.B. "12345678")
@export var correct_solution: String = "NINETOZERO"
# Referenzen zu den 8 SnapZones
var snap_zones: Array[Node] = []
# Dictionary: Key = SnapZone Position (1-10), Value = Node String
var node_positions: Dictionary = {}
# Signal wenn alle Node platziert sind
signal all_node_placed
signal solution_correct
signal solution_incorrect
func _ready():
# Sammle alle SnapZones (paper_1 bis paper_10)
for i in range(1, 11):
var snap_zone = get_node_or_null("paper_" + str(i))
if snap_zone:
snap_zones.append(snap_zone)
# Verbinde nur das has_picked_up Signal (wird für beides verwendet)
if snap_zone.has_signal("has_picked_up"):
snap_zone.has_picked_up.connect(_on_node_picked_up)
else:
push_error("SnapZone paper_" + str(i) + " nicht gefunden!")
print("RiddelNodeBoard bereit mit ", snap_zones.size(), " SnapZones")
print("Warte auf setzen der Node...")
func _on_node_dropped(what = null):
print("_on_node_dropped aufgerufen - Parameter: ", what, " (Typ: ", typeof(what), ")")
# Kurze Verzögerung, damit der Node richtig platziert ist
await get_tree().create_timer(0.1).timeout
update_node_positions()
check_if_complete()
func _on_node_picked_up(what = null):
print("_on_node_picked_up aufgerufen - Parameter: ", what, " (Typ: ", typeof(what), ")")
if what is Node:
print(" -> Objekt-Interaktion: ", what.name)
# Kurze Verzögerung, damit der Status aktualisiert ist
await get_tree().create_timer(0.1).timeout
update_node_positions()
check_if_complete()
func check_if_complete():
"""Prüft ob alle 10 Positionen belegt sind"""
if is_complete():
print("Alle Node sind platziert!")
print("Aktuelle Positionen: ", node_positions)
all_node_placed.emit()
check_solution()
func update_node_positions():
"""Aktualisiert das Dictionary mit den aktuellen Node-Positionen"""
node_positions.clear()
for i in range(1, 11):
var node = get_node_at_position(i)
if node != null:
print("DEBUG: Node an Position ", i, " gefunden: ", node.name)
var node_string = ""
# Versuche direkt auf label zuzugreifen
if "labelNode" in node:
node_string = str(node.labelNode)
print(" -> labelNode direkt gefunden: '", node_string, "'")
else:
# Suche in den Kindern (MeshInstance3D)
print(" -> Suche labelNode in Kindern...")
for child in node.get_children():
if "labelNode" in child:
node_string = str(child.labelNode)
print(" -> labelNode in Kind gefunden: '", node_string, "' (", child.name, ")")
break
if node_string != "" and node_string != "0":
node_positions[i] = node_string
print(" ✓ Position ", i, ": Node mit String ", node_string)
else:
print(" ✗ Node hat keinen gültigen String (leer)")
print("Node Positionen aktualisiert: ", node_positions)
func is_complete() -> bool:
"""Prüft ob alle 10 SnapZones einen Node haben"""
for snap_zone in snap_zones:
if snap_zone.has_method("has_snapped_object"):
if not snap_zone.has_snapped_object():
return false
else:
return false
return true
func get_node_at_position(position_index: int) -> Node3D:
"""
Gibt den Node an einer bestimmten Position zurück (1-10)
"""
if position_index < 1 or position_index > 10:
push_error("Position muss zwischen 1 und 10 sein!")
return null
var snap_zone = snap_zones[position_index - 1]
if snap_zone == null:
print("SnapZone an Position ", position_index, " ist null!")
return null
# Debug: Prüfe den Status der SnapZone
var has_object = snap_zone.has_snapped_object() if snap_zone.has_method("has_snapped_object") else false
print("Position ", position_index, ": has_snapped_object = ", has_object)
# XRToolsSnapZone spezifische Methode
if snap_zone.has_method("has_snapped_object") and snap_zone.has_snapped_object():
# Versuche verschiedene Properties
if "picked_up_object" in snap_zone:
print(" -> Gefunden über picked_up_object: ", snap_zone.picked_up_object)
return snap_zone.picked_up_object
elif "snapped_object" in snap_zone:
print(" -> Gefunden über snapped_object: ", snap_zone.snapped_object)
return snap_zone.snapped_object
# Durchsuche die Kinder der SnapZone
print(" -> Durchsuche Kinder...")
for child in snap_zone.get_children():
print(" Child: ", child.name, " Gruppen: ", child.get_groups())
if child.is_in_group("RiddelNode"):
print(" -> Gefunden über Kinder: ", child.name)
return child
return null
func get_string_at_position(position_index: int) -> String:
"""Gibt die den String vom Node an einer Position zurück"""
var node = get_node_at_position(position_index)
if node != null and "labelNode" in node:
return str(node.labelNode)
return ""
func get_string_sequence() -> String:
"""
Liest alle 10 Strings in der richtigen Reihenfolge aus
und gibt sie als String zurück (z.B. "NINETOZERO")
"""
var sequence = ""
for i in range(1, 11):
var node = get_string_at_position(i)
if node == "":
# Falls eine Position leer ist, gib leeren String zurück
return ""
sequence += node
return sequence
func check_solution() -> bool:
"""
Vergleicht die aktuelle Zahlenreihe mit der Lösung.
Gibt true zurück wenn korrekt, sonst false.
"""
var current_sequence = ""
# Prüfe ob alle Positionen belegt sind
for value in node_positions.values():
current_sequence += value
print("Aktuelle Sequenz: ", current_sequence)
print("Richtige Lösung: ", correct_solution)
if current_sequence == correct_solution:
print("✓ RICHTIG! Lösung ist korrekt!")
solution_correct.emit()
on_correct_solution()
return true
else:
print("✗ FALSCH! Versuche es nochmal.")
solution_incorrect.emit()
on_incorrect_solution()
return false
func on_correct_solution():
var box = get_node_or_null("Box")
if box and box is CSGBox3D:
var material = StandardMaterial3D.new()
material.albedo_color = Color.WEB_GREEN
box.material = material
await get_tree().create_timer(2).timeout
if has_node("AnimationGeheimgang"):
$AnimationGeheimgang.play("open_wall")
func on_incorrect_solution():
var box = get_node_or_null("Box")
if box and box is CSGBox3D:
var material = StandardMaterial3D.new()
material.albedo_color = Color.DARK_RED
box.material = material