204 lines
6.2 KiB
GDScript
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
|
|
|