src / account / account.gd

Code

extends BoxContainer
class_name Account

signal ui_backed
signal selected
signal unselected
signal get_started

@export var resource : AccountResource : set = set_resource
const LABELS_IN_RESOURCE = [
	'player_name',
	'latest_chapter_name',
	'obtained_strawberry_count',
	'total_failure_count',
	'total_play_time',
	'obtained_cassettes',
	'obtained_blue_hearts',
]
enum State { UNFOCUSED, FOCUSED, SELECTED }
@export var state : State = State.UNFOCUSED
@export var focus_top : bool = false : set = set_focus_top
@export var focus_menu : bool = false : set = set_focus_menu


func _ready() -> void:
	FocusHelper.set_neighbors_v(
		[%GetStartedButton, %ChangeNameButton, %AssistModeButton])
	reset_summary_visiblity()
	if resource: load_resource()


func reset_summary_visiblity() -> void:
	if resource:
		%TicketSummaryPlaceholder.hide()
		%TicketSummary.show()
		%CoverSummary.show()
	else:
		%TicketSummaryPlaceholder.show()
		%TicketSummary.hide()
		%CoverSummary.hide()


func _input(event: InputEvent) -> void:
	if is_focused() && event.is_action_pressed("ui_accept"):
		selected.emit()
	elif event.is_action_pressed("ui_back"):
		if is_selected():  unselected.emit()
		elif is_focused(): ui_backed.emit()


func set_resource(_resource: AccountResource) -> void:
	resource = _resource


func load_resource() -> void:
	reset_summary_visiblity()
	if not resource: return
	for key in LABELS_IN_RESOURCE:
		var node = get_node("%" + key.to_pascal_case())
		if node:
			match key:
				'obtained_cassettes':
					set_icon_visibility_on(node,
						resource.obtained_cassettes())
				'obtained_blue_hearts':
					set_icon_visibility_on(node,
						resource.obtained_blue_hearts())
				_:
					node.text = str(resource.attr(key))


func set_icon_visibility_on(node: Node, flags: Array[bool]) -> void:
	for i in flags.size():
		var child = node.get_child(i)
		if child: child.visible = flags[i]


func set_focus_top(val) -> void:
	if val: grab_focus()


func set_focus_menu(val) -> void:
	if val: %GetStartedButton.grab_focus()


func is_focused() -> bool:
	return state == State.FOCUSED


func is_unfocused() -> bool:
	return state == State.UNFOCUSED


func is_selected() -> bool:
	return state == State.SELECTED


func _on_focus_entered() -> void:
	if is_unfocused():
		%AnimationPlayer.play("focused")


func _on_focus_exited() -> void:
	if is_focused():
		%AnimationPlayer.play("unfocused")


func _on_selected() -> void:
	%AnimationPlayer.play("selected")


func _on_unselected() -> void:
	%AnimationPlayer.play("unselected")


func _on_get_started_button_pressed() -> void:
	get_started.emit()