extends Node enum Completion {ANY, FULL} enum ScoreType {SCORE, TIME} const COMPLETION_NAMES = ["Any%", "100%"] const SCORE_TYPE_NAMES = ["Scores", "Times"] var selected_level: int = 0 var selected_difficulty: int = Game.Difficulty.SPICY var selected_completion: int = Completion.ANY var selected_type: int = ScoreType.SCORE var _scoreboard_id: int = -1 var _scoreboard_tag: String = "spicy-any%" var _page: int = 0 onready var level_title: Button = $"%LevelTitle" onready var back_arrow: TextureRect = $"%BackArrow" onready var next_arrow: TextureRect = $"%NextArrow" onready var difficulty: Button = $"%Difficulty" onready var completion: Button = $"%Completion" onready var type: Button = $"%Type" onready var scores: VBoxContainer = $"%Scores" onready var scoreboard_tabs: TabContainer = $"%ScoreboardTabs" onready var prev_board: TextureRect = $"%PrevBoard" onready var next_board: TextureRect = $"%NextBoard" # Called when the node enters the scene tree for the first time. func _ready() -> void: Fade.fade_in(Options.transition_speed_secs) yield(get_tree(), "idle_frame") level_title.text = LevelData.levels[selected_level].title level_title.grab_focus() match selected_type: ScoreType.SCORE: _scoreboard_id = LevelData.levels[selected_level].scores_id ScoreType.TIME: _scoreboard_id = LevelData.levels[selected_level].times_id if Time.get_ticks_msec() > 5000: reload_scores() func _input(event: InputEvent) -> void: if event.is_action_pressed("ui_cancel"): Fade.fade_out(Options.transition_speed_secs) yield(Fade, "fade_finished") SceneManager.current_scene = preload("res://menus/main_menu.tscn").instance() # reload scores from newgrounds func reload_scores() -> void: _set_tag() scoreboard_tabs.current_tab = 1 # attempt the thing if _scoreboard_id >= 0 and Ngio.keys_loaded: var response = yield(Ngio.request_execute("ScoreBoard.getScores", { id = _scoreboard_id, limit = scores.get_child_count(), skip = _page * 8, period = "A", tag = _scoreboard_tag, }), "completed") if Ngio.has_result(response) and response.result.data.success: var retrieved_scores = response.result.data.scores for i in scores.get_child_count(): var score_entry = scores.get_child(i) score_entry.place = _page * 8 + i + 1 if i < retrieved_scores.size(): var score = retrieved_scores[i] score_entry.user = score.user.name if score_entry.user.length() > 16: score_entry.user = score_entry.substr(0, 16) + "..." match selected_type: ScoreType.SCORE: score_entry.score = "%05d" % score.value ScoreType.TIME: score_entry.score = Game.format_time(float(score.value) / 1000.0) else: score_entry.user = "--------" match selected_type: ScoreType.SCORE: score_entry.score = "-----" ScoreType.TIME: score_entry.score = "--:--.--" scoreboard_tabs.current_tab = 0 return scoreboard_tabs.current_tab = 2 # set tag from selected difficulty and completion func _set_tag() -> void: match selected_difficulty: Game.Difficulty.SWEET: _scoreboard_tag = "sweet" Game.Difficulty.SALTY: _scoreboard_tag = "salty" Game.Difficulty.SPICY: _scoreboard_tag = "spicy" Game.Difficulty.PUNGENT: _scoreboard_tag = "pungent" if selected_type == ScoreType.TIME: match selected_completion: Completion.ANY: _scoreboard_tag += "-any%" Completion.FULL: _scoreboard_tag += "-100%" # show arrows when level is focused func _on_LevelTitle_focus_entered() -> void: back_arrow.visible = true next_arrow.visible = true # hide arrows when level not focused func _on_LevelTitle_focus_exited() -> void: back_arrow.visible = false next_arrow.visible = false # detect left and right presses when level is focused func _on_LevelTitle_gui_input(event: InputEvent) -> void: if scoreboard_tabs.current_tab == 1: # do nothing if already loading return if event.is_action_pressed("ui_left"): selected_level = posmod(selected_level - 1, LevelData.levels.size()) while LevelData.levels[selected_level].boss: selected_level = posmod(selected_level - 1, LevelData.levels.size()) level_title.text = LevelData.levels[selected_level].title match selected_type: ScoreType.SCORE: _scoreboard_id = LevelData.levels[selected_level].scores_id ScoreType.TIME: _scoreboard_id = LevelData.levels[selected_level].times_id _page = 0 reload_scores() elif event.is_action_pressed("ui_right"): selected_level = posmod(selected_level + 1, LevelData.levels.size()) while LevelData.levels[selected_level].boss: selected_level = posmod(selected_level + 1, LevelData.levels.size()) level_title.text = LevelData.levels[selected_level].title match selected_type: ScoreType.SCORE: _scoreboard_id = LevelData.levels[selected_level].scores_id ScoreType.TIME: _scoreboard_id = LevelData.levels[selected_level].times_id _page = 0 reload_scores() # difficulty selector func _on_Difficulty_pressed() -> void: if scoreboard_tabs.current_tab == 1: # do nothing if already loading return selected_difficulty = posmod(selected_difficulty + 1, 4) difficulty.text = Game.DIFFICULTY_NAMES[selected_difficulty] _page = 0 reload_scores() # completion amount selector func _on_Completion_pressed() -> void: if scoreboard_tabs.current_tab == 1: # do nothing if already loading return selected_completion = posmod(selected_completion + 1, 2) completion.text = COMPLETION_NAMES[selected_completion] _page = 0 reload_scores() # score type selector func _on_Type_pressed() -> void: if scoreboard_tabs.current_tab == 1: # do nothing if already loading return selected_type = posmod(selected_type + 1, 2) match selected_type: ScoreType.SCORE: _scoreboard_id = LevelData.levels[selected_level].scores_id completion.visible = false ScoreType.TIME: _scoreboard_id = LevelData.levels[selected_level].times_id completion.visible = true type.text = SCORE_TYPE_NAMES[selected_type] _page = 0 reload_scores() func _on_Scoreboard_focus_entered() -> void: prev_board.visible = true next_board.visible = true func _on_Scoreboard_focus_exited() -> void: prev_board.visible = false next_board.visible = false func _on_Scoreboard_gui_input(event: InputEvent) -> void: if event.is_action_pressed("ui_left"): _page -= 1 if _page <= 0: _page = 0 reload_scores() elif event.is_action_pressed("ui_right"): _page += 1 reload_scores()