2025-03-23 13:20:50 +00:00
|
|
|
class_name CollectableUi extends CenterContainer
|
|
|
|
|
|
|
|
|
|
@export var has_stage: bool = false:
|
|
|
|
|
set(focused):
|
2025-12-08 17:30:02 +00:00
|
|
|
if has_stage == focused: return
|
|
|
|
|
|
2025-03-23 13:20:50 +00:00
|
|
|
if focused:
|
|
|
|
|
has_stage = true
|
|
|
|
|
is_collapsed = false
|
|
|
|
|
if not visible: show()
|
|
|
|
|
else:
|
|
|
|
|
has_stage = false
|
|
|
|
|
get_viewport().gui_release_focus()
|
|
|
|
|
is_collapsed = true
|
|
|
|
|
|
|
|
|
|
#@export var collapsed = true:
|
|
|
|
|
# set(collapse):
|
|
|
|
|
# if is_inside_tree() and not Engine.is_editor_hint():
|
|
|
|
|
# if State.reduce_motion:
|
|
|
|
|
# collapsed = false
|
|
|
|
|
# return
|
|
|
|
|
# if collapse and not collapsed:
|
|
|
|
|
# if is_inside_tree():
|
|
|
|
|
# _hide_buttons()
|
|
|
|
|
# collapsed = collapse
|
|
|
|
|
# elif not collapse and collapsed:
|
|
|
|
|
# if is_inside_tree():
|
|
|
|
|
# _show_buttons()
|
|
|
|
|
# collapsed = collapse
|
2025-12-08 17:30:02 +00:00
|
|
|
#
|
2025-03-23 13:20:50 +00:00
|
|
|
# if collapse and has_stage: State.leave_stage(self)
|
|
|
|
|
|
2025-03-23 14:43:04 +00:00
|
|
|
@export var scene: Scenes.id = Scenes.id.YOUTH_DRAEVEN:
|
2025-03-23 13:20:50 +00:00
|
|
|
set(id):
|
|
|
|
|
scene = id
|
|
|
|
|
if is_inside_tree() and not is_board:
|
|
|
|
|
match id:
|
|
|
|
|
Scenes.id.YOUTH_DRAEVEN:
|
2025-05-21 09:23:13 +00:00
|
|
|
# FIXME: this explicit translation should not be nessecary
|
|
|
|
|
if title_override == "": title_label.text = TranslationServer.translate("Starlight")
|
2025-08-16 14:27:05 +00:00
|
|
|
if subtitle_override == "": cn_label.text = "[b]%s[/b]: %s" % [TranslationServer.translate("MementoLabel_CN"), TranslationServer.translate("MementoLabel_DraevenCN")]
|
2025-03-23 13:20:50 +00:00
|
|
|
Scenes.id.YOUTH_CHILDHOOD:
|
2025-05-21 09:23:13 +00:00
|
|
|
if title_override == "": title_label.text = TranslationServer.translate("crafted Mask")
|
2025-08-16 14:27:05 +00:00
|
|
|
if subtitle_override == "": cn_label.text = "[b]%s[/b]: %s" % [TranslationServer.translate("MementoLabel_CN"), TranslationServer.translate("MementoLabel_ChildhoodCN")]
|
2025-03-23 13:20:50 +00:00
|
|
|
Scenes.id.YOUTH_VOICE_TRAINING:
|
2025-05-21 09:23:13 +00:00
|
|
|
if title_override == "": title_label.text = TranslationServer.translate("Comic Stash")
|
2025-08-16 14:27:05 +00:00
|
|
|
if subtitle_override == "": cn_label.text = "[b]%s[/b]: %s" % [TranslationServer.translate("MementoLabel_CN"), TranslationServer.translate("MementoLabel_VoiceCN")]
|
2025-03-23 13:20:50 +00:00
|
|
|
Scenes.id.YOUTH_JUI_JUTSU:
|
2025-05-21 09:23:13 +00:00
|
|
|
if title_override == "": title_label.text = TranslationServer.translate("Sports Clothes")
|
2025-08-16 14:27:05 +00:00
|
|
|
if subtitle_override == "": cn_label.text = "[b]%s[/b]: %s" % [TranslationServer.translate("MementoLabel_CN"), TranslationServer.translate("MementoLabel_Jui_JutsuCN")]
|
2025-03-23 13:20:50 +00:00
|
|
|
Scenes.id.TRANSITION:
|
2025-07-21 17:28:20 +00:00
|
|
|
if title_override == "": title_label.text = TranslationServer.translate("Move on")
|
2025-03-23 13:20:50 +00:00
|
|
|
if subtitle_override == "": cn_label.text = ""
|
2025-07-21 17:28:20 +00:00
|
|
|
Scenes.id.ADULT_DND:
|
|
|
|
|
if title_override == "": title_label.text = TranslationServer.translate("colorful Dice")
|
2025-03-23 13:20:50 +00:00
|
|
|
if subtitle_override == "": cn_label.text = ""
|
2025-11-01 13:54:25 +00:00
|
|
|
Scenes.id.ADULT_VOLUNTARY:
|
2025-07-28 22:03:46 +00:00
|
|
|
if title_override == "": title_label.text = TranslationServer.translate("Gemstone Art")
|
2025-03-23 13:20:50 +00:00
|
|
|
if subtitle_override == "": cn_label.text = ""
|
2025-11-01 13:54:25 +00:00
|
|
|
Scenes.id.ADULT_CHRISTMAS:
|
2025-07-21 17:28:20 +00:00
|
|
|
if title_override == "": title_label.text = TranslationServer.translate("Chat Messages")
|
|
|
|
|
if subtitle_override == "": cn_label.text = ""
|
|
|
|
|
Scenes.id.ADULT_EATING:
|
|
|
|
|
if title_override == "": title_label.text = TranslationServer.translate("Dishes")
|
|
|
|
|
if subtitle_override == "": cn_label.text = ""
|
|
|
|
|
Scenes.id.ADULT_UNI:
|
|
|
|
|
if title_override == "": title_label.text = TranslationServer.translate("Science Poster")
|
|
|
|
|
if subtitle_override == "": cn_label.text = ""
|
2025-08-16 14:27:05 +00:00
|
|
|
Scenes.id.ADULT_THERAPY:
|
2025-07-21 17:28:20 +00:00
|
|
|
if title_override == "": title_label.text = TranslationServer.translate("Doctors Note")
|
|
|
|
|
if subtitle_override == "": cn_label.text = ""
|
|
|
|
|
Scenes.id.ADULT_BURNOUT:
|
|
|
|
|
if title_override == "": title_label.text = TranslationServer.translate("Paperwork")
|
2025-03-23 13:20:50 +00:00
|
|
|
if subtitle_override == "": cn_label.text = ""
|
2025-12-08 17:30:02 +00:00
|
|
|
|
2025-03-23 13:20:50 +00:00
|
|
|
if not Engine.is_editor_hint():
|
|
|
|
|
is_collected = Scenes.is_sequence_repeating(scene)
|
|
|
|
|
@export var is_collected: bool = false:
|
|
|
|
|
set(value):
|
|
|
|
|
is_collected = value
|
|
|
|
|
if is_inside_tree():
|
|
|
|
|
collected_box.button_pressed = value
|
2025-05-10 13:46:22 +00:00
|
|
|
if is_collected and not is_board:
|
2025-03-23 13:20:50 +00:00
|
|
|
%CollectLabel.text = "listen again"
|
|
|
|
|
else:
|
2025-05-10 13:23:58 +00:00
|
|
|
if not is_board:
|
2025-08-17 16:34:27 +00:00
|
|
|
%CollectLabel.text = "MementoLabel_collect"
|
2025-05-10 13:23:58 +00:00
|
|
|
else:
|
|
|
|
|
%CollectLabel.text = "find connections"
|
2025-03-23 13:20:50 +00:00
|
|
|
@onready var collected_box: CheckBox = %CheckBox
|
|
|
|
|
@export var title_override: String = "":
|
|
|
|
|
set(value):
|
|
|
|
|
title_override = value
|
|
|
|
|
if is_inside_tree() and not is_board:
|
|
|
|
|
title_label.text = value
|
|
|
|
|
@onready var title_label: Label = %TitleLabel
|
|
|
|
|
@export var subtitle_override: String = "":
|
|
|
|
|
set(value):
|
|
|
|
|
subtitle_override = value
|
|
|
|
|
if is_inside_tree() and not is_board:
|
|
|
|
|
cn_label.text = value
|
|
|
|
|
@onready var cn_label: RichTextLabel = %ContentNoteLabel
|
|
|
|
|
@onready var animation_player: AnimationPlayer = %AnimationPlayer
|
|
|
|
|
|
|
|
|
|
@export var is_collapsed: bool = true
|
|
|
|
|
@export var is_expanded: bool = false:
|
|
|
|
|
set(expanded):
|
|
|
|
|
if expanded != is_expanded:
|
|
|
|
|
is_expanded = expanded
|
|
|
|
|
if is_inside_tree():
|
|
|
|
|
animation_player.play("expand")
|
|
|
|
|
await animation_player.animation_finished
|
|
|
|
|
for button:Button in [%ReadStory, %CollectButton, %SummaryButton, %SkipButton]:
|
|
|
|
|
if button.visible:
|
|
|
|
|
button.grab_focus()
|
|
|
|
|
return
|
|
|
|
|
@export var was_skipped: bool = false
|
|
|
|
|
|
|
|
|
|
@export var is_board:bool = false:
|
|
|
|
|
set(board):
|
|
|
|
|
is_board = board
|
|
|
|
|
if is_inside_tree():
|
|
|
|
|
if board:
|
2025-05-10 13:23:58 +00:00
|
|
|
if title_override == "": title_label.text = "Mind Board"
|
2025-03-23 13:20:50 +00:00
|
|
|
collected_box.hide()
|
|
|
|
|
# Not room agnostic yet!
|
|
|
|
|
if not Engine.is_editor_hint():
|
|
|
|
|
match Scenes.get_completed_total():
|
|
|
|
|
1:
|
|
|
|
|
if subtitle_override == "": cn_label.text = "Find all three Mementos to collect all thoughts."
|
|
|
|
|
2:
|
|
|
|
|
if subtitle_override == "": cn_label.text = "Find two more Mementos to get all cards."
|
|
|
|
|
3:
|
|
|
|
|
if subtitle_override == "": cn_label.text = "Find the last remaining Memento."
|
|
|
|
|
4:
|
|
|
|
|
if subtitle_override == "": cn_label.text = "Use this to find a Frame of Mind."
|
|
|
|
|
else:
|
|
|
|
|
scene = scene
|
|
|
|
|
collected_box.show()
|
2025-05-30 14:10:44 +00:00
|
|
|
@export var is_exit:bool = false:
|
|
|
|
|
set(exit):
|
|
|
|
|
is_exit = exit
|
|
|
|
|
if is_inside_tree():
|
|
|
|
|
if exit:
|
|
|
|
|
if title_override == "": title_label.text = "Move on"
|
2025-06-05 22:06:50 +00:00
|
|
|
if subtitle_override == "": %CollectLabel.text = "Leave room"
|
2025-05-30 14:10:44 +00:00
|
|
|
collected_box.hide()
|
|
|
|
|
else:
|
|
|
|
|
scene = scene
|
|
|
|
|
collected_box.show()
|
|
|
|
|
|
2025-03-23 13:20:50 +00:00
|
|
|
|
|
|
|
|
signal open_board
|
2025-05-30 14:10:44 +00:00
|
|
|
signal exit_room
|
2025-03-23 13:20:50 +00:00
|
|
|
|
|
|
|
|
#TODO implement proper scene skipping
|
|
|
|
|
signal scene_skipped(i: int)
|
|
|
|
|
|
|
|
|
|
func _ready() -> void:
|
|
|
|
|
State.settings_changed.connect(_on_context_updated)
|
|
|
|
|
%CollectButton.pressed.connect(collect_memento)
|
|
|
|
|
##TODO: add functions for remaining buttons
|
2025-12-08 17:30:02 +00:00
|
|
|
|
2025-03-23 13:20:50 +00:00
|
|
|
update_state()
|
|
|
|
|
|
|
|
|
|
func _on_context_updated():
|
|
|
|
|
%SkipButton.visible = State.allow_skipping
|
|
|
|
|
%SummaryButton.visible = State.provide_summaries
|
|
|
|
|
%ReadStory.visible = is_collected
|
|
|
|
|
%OptionPrompt.visible = State.allow_skipping or State.provide_summaries or is_collected and not is_board
|
|
|
|
|
%OptionsLabel.visible = State.allow_skipping or State.provide_summaries or is_collected and not is_board
|
2025-05-16 23:52:47 +00:00
|
|
|
cn_label.visible = true if State.show_content_notes else false
|
2025-03-23 13:20:50 +00:00
|
|
|
|
|
|
|
|
func update_state():
|
|
|
|
|
scene = scene
|
|
|
|
|
is_board = is_board
|
2025-05-30 14:10:44 +00:00
|
|
|
is_exit = is_exit
|
2025-03-23 13:20:50 +00:00
|
|
|
_on_context_updated()
|
|
|
|
|
|
2025-06-10 19:09:47 +00:00
|
|
|
func try_reveal() -> bool:
|
2025-12-02 20:36:05 +00:00
|
|
|
#if is_exit and not State.active_save_game.is_childhood_board_complete: return false
|
|
|
|
|
#if not is_board:
|
|
|
|
|
# if (not Scenes.is_sequence_unlocked( self.scene )) or false: #FIXME only for testing!!!
|
|
|
|
|
# return false
|
2025-09-04 23:59:58 +00:00
|
|
|
if not visible or animation_player.get_animation("vanish") or animation_player.get_animation("vanish_all"):
|
2025-03-23 13:20:50 +00:00
|
|
|
update_state()
|
|
|
|
|
visible = true
|
|
|
|
|
animation_player.play("reveal")
|
2025-06-10 19:09:47 +00:00
|
|
|
return true
|
|
|
|
|
return false
|
2025-12-08 17:30:02 +00:00
|
|
|
|
2025-03-23 13:20:50 +00:00
|
|
|
#func _process(_delta: float) -> void:
|
|
|
|
|
# if not visible or Engine.is_editor_hint(): return
|
|
|
|
|
# if Input.is_action_just_pressed("collect_memento_ui"):
|
|
|
|
|
# if not is_board:
|
|
|
|
|
# collect_memento()
|
|
|
|
|
# else:
|
|
|
|
|
# open_board.emit()
|
|
|
|
|
# elif Input.is_action_just_pressed("option_memento_ui"):
|
|
|
|
|
# is_expanded = true
|
|
|
|
|
|
|
|
|
|
#FIXME something was eating all my inputs, maybe I can use the more pretty pattern when I figure out the culprit
|
|
|
|
|
func _input(event: InputEvent) -> void:
|
|
|
|
|
if not visible: return
|
|
|
|
|
if event.is_action_pressed("collect_memento_ui"):
|
2025-06-03 21:11:26 +00:00
|
|
|
if not is_board:
|
2025-03-23 13:20:50 +00:00
|
|
|
collect_memento()
|
|
|
|
|
get_viewport().set_input_as_handled()
|
|
|
|
|
else:
|
2025-05-30 14:10:44 +00:00
|
|
|
if is_board:
|
|
|
|
|
open_board.emit()
|
|
|
|
|
if is_exit:
|
|
|
|
|
exit_room.emit()
|
2025-03-23 13:20:50 +00:00
|
|
|
elif event.is_action_pressed("option_memento_ui"):
|
|
|
|
|
is_expanded = true
|
|
|
|
|
get_viewport().set_input_as_handled()
|
|
|
|
|
|
|
|
|
|
func vanish():
|
|
|
|
|
if not visible: return
|
2025-12-08 17:30:02 +00:00
|
|
|
|
2025-03-23 13:20:50 +00:00
|
|
|
if is_expanded:
|
|
|
|
|
animation_player.play("vanish_all")
|
|
|
|
|
else:
|
|
|
|
|
animation_player.play("vanish")
|
|
|
|
|
|
|
|
|
|
func collect_memento():
|
|
|
|
|
Scenes.start_sequence(scene)
|
|
|
|
|
State.leave_stage(self)
|
2025-06-03 21:11:26 +00:00
|
|
|
if scene == Scenes.id.TRANSITION: vanish()
|
2025-03-23 13:20:50 +00:00
|
|
|
#get_tree().call_group("scene_actors", "play_scene", scene, collected)
|
|
|
|
|
if was_skipped: scene_skipped.emit(-1)
|
|
|
|
|
is_collected = true
|
|
|
|
|
|
|
|
|
|
func _on_skip_pressed():
|
2025-12-13 10:06:15 +00:00
|
|
|
print_debug("Scene skipped!")
|
2025-03-23 13:20:50 +00:00
|
|
|
if scene != null:
|
|
|
|
|
scene_skipped.emit(1)
|
|
|
|
|
was_skipped = true
|
|
|
|
|
$Panel/Content/Buttons/VBoxContainer/collect_or_listen.text = "collect (un-skip)"
|
2025-12-08 17:30:02 +00:00
|
|
|
|
2025-03-23 13:20:50 +00:00
|
|
|
State.leave_stage(self)
|