extends Node3D class_name QuizModule @export var question: String @export var correct: int @export var answer_0: String @export var answer_1: String @export var answer_2: String @export var answer_3: String @onready var animation_player: AnimationPlayer = $AnimationPlayer @onready var quiz_light = $quiz_light @onready var answer_pad_0: Area3D = $answers/answer_pad_0/Area3D @onready var answer_pad_1: Area3D = $answers/answer_pad_1/Area3D @onready var answer_pad_2: Area3D = $answers/answer_pad_2/Area3D @onready var answer_pad_3: Area3D = $answers/answer_pad_3/Area3D @onready var answer_plates = [$answers/answer_pad_0/Cube, $answers/answer_pad_1/Cube, $answers/answer_pad_2/Cube, $answers/answer_pad_3/Cube] @onready var answer_0_label: Label3D = $answers/answer_pad_0/answer_0_label @onready var answer_1_label: Label3D = $answers/answer_pad_1/answer_1_label @onready var answer_2_label: Label3D = $answers/answer_pad_2/answer_2_label @onready var answer_3_label: Label3D = $answers/answer_pad_3/answer_3_label @onready var question_label: Label = $CanvasLayer/PanelContainer/question_label @onready var question_panel: CanvasLayer = $CanvasLayer var answered_correctly := false signal question_answered func _ready() -> void: # Connect signals answer_pad_0.body_entered.connect(_on_answer_entered.bind(0)) answer_pad_1.body_entered.connect(_on_answer_entered.bind(1)) answer_pad_2.body_entered.connect(_on_answer_entered.bind(2)) answer_pad_3.body_entered.connect(_on_answer_entered.bind(3)) # IMPORTANT: cuplicate material, so that it is not shared with other instances var unique_mat = quiz_light.mesh.surface_get_material(0).duplicate() quiz_light.set_surface_override_material(0, unique_mat) for answer_plate in answer_plates: var unique_answer_mat = answer_plate.mesh.surface_get_material(0).duplicate() answer_plate.set_surface_override_material(0,unique_answer_mat) func set_question() -> void: # Set texts var full_question_text = tr(question) + "\na) "+tr(answer_0)+ "\nb) "+tr(answer_1)+ "\nc) "+tr(answer_2)+ "\nd) "+tr(answer_3) + "\n" question_label.text = full_question_text question_panel.visible = true func _on_answer_entered(body: Node3D, answer_index: int) -> void: if not body.is_in_group("player"): return # Only player should trigger # If already answered correctly, do nothing if answered_correctly: return # Check and set only THIS instance of the lamp if answer_index == correct: _set_light_color(Color.GREEN) _set_plate_color(answer_index, Color.GREEN) question_label.visible = false animation_player.play("open_door") answered_correctly = true question_answered.emit() $"../Player".reset_speed() else: $"../Player".slow_down() _set_light_color(Color.RED) _set_plate_color(answer_index, Color.RED) await get_tree().create_timer(1.0).timeout _set_plate_color(answer_index, Color.BLACK) func _set_light_color(color: Color) -> void: # Set only the material of this instance quiz_light.get_surface_override_material(0).albedo_color = color quiz_light.get_surface_override_material(0).emission = color # Increase emission for visibility for colors which are not white for a short time quiz_light.get_surface_override_material(0).emission_energy = 1.5 if color != Color.WHITE else 0.5 func _set_plate_color(answer_index: int, color: Color) -> void: # Set only the material of this instance var answer_plate = answer_plates[answer_index] answer_plate.get_surface_override_material(0).albedo_color = color answer_plate.get_surface_override_material(0).emission = color # Increase emission for visibility for colors which are not white for a short time answer_plate.get_surface_override_material(0).emission_energy = 1.5 if color != Color.BLACK else 0.5