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