Files
Omens-Ascent/scenes/components/death_screen.gd

76 lines
2.6 KiB
GDScript

class_name DeathScreen
extends Control
const GAME_OVER_DELAY: float = 0.3
const VILLAGE_DESTROYED_DELAY: float = 0.7
const OPTIONS_DELAY: float = 1.5
@onready var _death_sprite: AnimatedSprite2D = $PlayerDeathSprite
@onready var _game_over_label: Label = $TextLayer/GameOverLabel
@onready var _village_destroyed_label: Label = $TextLayer/VillageDestroyedLabel
@onready var _options_container: HBoxContainer = $OptionsContainer
@onready var _continue_button: Button = $OptionsContainer/ContinueButton
@onready var _title_screen_button: Button = $OptionsContainer/TitleScreenButton
@onready var _exit_button: Button = $OptionsContainer/ExitButton
@onready var _background: ColorRect = $FadeOut
func _ready() -> void:
AudioManager.stop_ambiance()
_reset_sequence()
_continue_button.pressed.connect(_on_continue_pressed)
_title_screen_button.pressed.connect(_on_title_screen_pressed)
_exit_button.pressed.connect(_on_exit_pressed)
for button: Button in [_continue_button, _title_screen_button, _exit_button]:
button.focus_entered.connect(_on_button_focus_entered)
_play_sequence()
func _on_button_focus_entered() -> void:
AudioManager.play_sfx("options_move")
func _unhandled_input(event: InputEvent) -> void:
if not event.is_action_pressed("interact"):
return
var viewport: Viewport = get_viewport()
if viewport == null:
return
var focused: Control = viewport.gui_get_focus_owner()
if focused is Button:
(focused as Button).pressed.emit()
viewport.set_input_as_handled()
func _play_sequence() -> void:
_death_sprite.flip_h = EventBus.last_death_facing_direction < 0.0
_death_sprite.play("player_death")
await _death_sprite.animation_finished
await get_tree().create_timer(GAME_OVER_DELAY).timeout
_game_over_label.visible = true
AudioManager.play_sfx("game_over")
await get_tree().create_timer(VILLAGE_DESTROYED_DELAY).timeout
_village_destroyed_label.visible = true
await get_tree().create_timer(OPTIONS_DELAY).timeout
_options_container.visible = true
_continue_button.grab_focus()
func _reset_sequence() -> void:
_game_over_label.visible = false
_village_destroyed_label.visible = false
_options_container.visible = false
func _on_continue_pressed() -> void:
await _fade_out()
SceneManager.change_scene(EventBus.last_level_path)
func _on_title_screen_pressed() -> void:
await _fade_out()
SceneManager.change_scene("res://scenes/components/title_screen.tscn")
func _on_exit_pressed() -> void:
SceneManager.quit_game()
func _fade_out() -> void:
var tween: Tween = create_tween()
tween.tween_property(_background, "color:a", 1.0, 1.2)
await tween.finished
if OS.get_name() == "Web":
JavaScriptBridge.eval("document.querySelector('canvas').focus()")