hero-mark-2/menus/scoreboards.gd

205 lines
6.3 KiB
GDScript

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()