96 lines
3.7 KiB
GDScript
96 lines
3.7 KiB
GDScript
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 = question + "\na) "+answer_0+ "\nb) "+answer_1+ "\nc) "+answer_2+ "\nd) "+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
|