class_name DisarmTrapModal extends Control const action_value : Dictionary[String, int] = { "detonate" : 0, "lay trap" : 1, "detect" : 2, "attack" : 3 } const icon_textures : Array = [ { "normal" : preload("res://visuals/images/icons/switch button.png"), "pressed" : preload("res://visuals/images/icons/lit switch button.png") }, { "normal" : preload("res://visuals/images/icons/trap button.png"), "pressed" : preload("res://visuals/images/icons/lit trap button.png") }, { "normal" : preload("res://visuals/images/icons/detect button.png"), "pressed" : preload("res://visuals/images/icons/lit detect button.png") }, { "normal" : preload("res://visuals/images/icons/ranged attack button.png"), "pressed" : preload("res://visuals/images/icons/lit ranged attack button.png") }, ] const disarm_icon_template = preload("res://templates/disarm_icon.tscn") const success_sound = preload("res://audio/sounds/menu select.wav") const fail_sound = preload("res://audio/sounds/134688__otbtechno__bike-bell.wav") const progress_sound = preload("res://audio/sounds/BUTTON Generic Metal Medium High Mechanics 02.wav") @onready var confirmation_dialog : ConfirmationDialog = %ConfirmationDialog @onready var disarm_window : PanelContainer = %DisarmWindow @onready var disarm_button_container : HBoxContainer = %DisarmContainer @onready var timer : Timer = %Timer @onready var timer_label : Label = %TimerLabel var square : Vector3i var disarm_icons : Array[TextureButton] var disarm_buttons : Array[int] var progress : int var disarming : bool var difficulty : int = 1 func _process(delta: float) -> void: timer_label.text = "%02d.3" % timer.time_left func start_disarming() -> void: disarming = true progress = 0 disarm_icons = [] disarm_buttons = [] for i in range(difficulty): var btn = randi_range(0,3) var icon : TextureButton = disarm_icon_template.instantiate() icon.texture_normal = icon_textures[btn].normal icon.texture_pressed = icon_textures[btn].pressed disarm_buttons.append(btn) disarm_icons.append(icon) disarm_button_container.add_child(icon) confirmation_dialog.visible = false disarm_window.visible = true timer.start(3 + (2 * len(disarm_buttons) * randf_range(.75, 1.25) )) func try_advance(btn : int) -> void: if btn == disarm_buttons[progress]: disarm_icons[progress].set_pressed_no_signal(true) progress += 1 if progress >= len(disarm_buttons): Game.player.close_modal() Game.oneshot(success_sound) Game.level.disarm_trap(square) else: Game.oneshot(progress_sound) else: Game.player.close_modal() Game.oneshot(fail_sound) Game.level.activate_trap(square) func button_pressed(event : InputEventAction) -> void: if disarming: try_advance(action_value[event.action]) else: match(event.action): "detonate": start_disarming() "attack": Game.player.close_modal() _: return func _on_timer_timeout() -> void: Game.player.close_modal() Game.oneshot(fail_sound) Game.level.activate_trap(square)