diff --git a/Components/UI/MainMenu.gd b/Components/UI/MainMenu.gd index a80d5a8..9a9b040 100644 --- a/Components/UI/MainMenu.gd +++ b/Components/UI/MainMenu.gd @@ -1,10 +1,11 @@ extends Control +@onready var quit_button = %QuitButton func _ready(): var x = -1 if 1 < 0 else 1 if OS.get_name() == "Web": - $"VBoxContainer/QuitButton".visible = false + quit_button.visible = false func _process(_delta): if Input.is_key_pressed(KEY_BACKSLASH): diff --git a/Components/UI/MainMenu.tscn b/Components/UI/MainMenu.tscn index dc5fa4c..20a3be4 100644 --- a/Components/UI/MainMenu.tscn +++ b/Components/UI/MainMenu.tscn @@ -172,6 +172,7 @@ text = "[S] Settings" uppercase = true [node name="QuitButton" type="Button" parent="BorderPanel/MainMenuContainer/MarginContainer/VBoxContainer"] +unique_name_in_owner = true custom_minimum_size = Vector2(2.08165e-12, 50) layout_mode = 2 script = ExtResource("4_i7vk5") diff --git a/Components/UI/WinScreen.gd b/Components/UI/WinScreen.gd index cf2db92..d8dc266 100644 --- a/Components/UI/WinScreen.gd +++ b/Components/UI/WinScreen.gd @@ -43,22 +43,14 @@ func millis_to_minutes(millis: float) -> float: func _submit_new_score(): pass - # do the thing func fill_table(data: Dictionary): - #print("Player short id %s" % LootLocker.player_short_id) for entry : Dictionary in data.items: var row : TableRow = row_scene.instantiate() - if entry.has('steam_id'): - row.set_data(Steam.getFriendPersonaName(entry.steam_id), 0) - row.set_data(str(entry.score), 1) - row.set_data(str(entry.global_rank), 2) - else: - row.set_data(entry.player.name, 0) - row.set_data(str(entry.score), 1) - row.set_data(str(entry.rank), 2) - #row.set_highlight(true) - #if str(entry.player.id) == str(LootLocker.player_short_id): - #row.set_highlight(true) + var lb_entry : Dictionary = LeaderboardManager.board_api.parse_entry(entry) + row.set_data(lb_entry.name, 0) + row.set_data(lb_entry.score, 1) + row.set_data(lb_entry.rank, 2) + row.set_highlight(lb_entry.highlight) tree.add_child(row) loading_message.visible = false diff --git a/Components/UI/loading_screen.gd b/Components/UI/loading_screen.gd index 0677d44..8ad957d 100644 --- a/Components/UI/loading_screen.gd +++ b/Components/UI/loading_screen.gd @@ -2,22 +2,10 @@ extends Control func _ready(): - if OS.has_feature('web'): - init_lootlocker() - else: - if not init_steam(): - init_lootlocker() + if not LeaderboardManager.is_node_ready(): + await LeaderboardManager.ready LeaderboardManager.api_ready.connect(_go_to_main_menu) - -func init_lootlocker(): - LeaderboardManager.use_lootlocker() - #LootLocker.lootlocker_ready.connect(_go_to_main_menu) - #LootLocker.initialize() - -func init_steam(): - LeaderboardManager.use_steam() - #SteamInit.steam_ready.connect(_go_to_main_menu) - return SteamInit.initialize_steam() + LeaderboardManager.initialize() func _go_to_main_menu(): get_tree().change_scene_to_file("res://Components/UI/MainMenu.tscn") diff --git a/Components/UI/win_screen.tscn b/Components/UI/win_screen.tscn index 83e7453..c62acea 100644 --- a/Components/UI/win_screen.tscn +++ b/Components/UI/win_screen.tscn @@ -1,9 +1,10 @@ -[gd_scene load_steps=10 format=3 uid="uid://cvgr706cfuhue"] +[gd_scene load_steps=11 format=3 uid="uid://cvgr706cfuhue"] [ext_resource type="Script" path="res://Components/UI/WinScreen.gd" id="1_5p8od"] [ext_resource type="Theme" uid="uid://urlbj24trl7l" path="res://Resources/ui_theme.tres" id="2_7sqmg"] [ext_resource type="Texture2D" uid="uid://4qxd5qx3v0p8" path="res://Textures/main_menu.png" id="2_bcyp8"] [ext_resource type="Script" path="res://Components/UI/PlayButton.gd" id="3_7iniu"] +[ext_resource type="Script" path="res://loading_messge.gd" id="5_0fn1b"] [ext_resource type="Script" path="res://Components/UI/IMenu.gd" id="5_al4ln"] [sub_resource type="StyleBoxFlat" id="StyleBoxFlat_ka7m1"] @@ -158,9 +159,15 @@ uppercase = true unique_name_in_owner = true layout_mode = 2 size_flags_vertical = 3 -text = "Loading leaderboard..." +text = "Loading leaderboard" horizontal_alignment = 1 vertical_alignment = 1 +script = ExtResource("5_0fn1b") +base_message = "Loading leaderboard" + +[node name="Timer" type="Timer" parent="BorderPanel/VBoxContainer/data/PanelContainer/tree/loading_message"] +wait_time = 0.3 +autostart = true [node name="VBoxContainer" type="VBoxContainer" parent="BorderPanel/VBoxContainer/data"] layout_mode = 2 diff --git a/Scripts/Leaderboards/Leaderboard.gd b/Scripts/Leaderboards/Leaderboard.gd index 4d1c1aa..7c74d24 100644 --- a/Scripts/Leaderboards/Leaderboard.gd +++ b/Scripts/Leaderboards/Leaderboard.gd @@ -14,3 +14,6 @@ func upload_score(board_name: String, score: int): func get_leaderboard_entries(board_name: String): pass + +func parse_entry(entry: Dictionary): + pass diff --git a/Scripts/Leaderboards/LeaderboardManager.gd b/Scripts/Leaderboards/LeaderboardManager.gd index 19ae935..ffc1f30 100644 --- a/Scripts/Leaderboards/LeaderboardManager.gd +++ b/Scripts/Leaderboards/LeaderboardManager.gd @@ -3,23 +3,23 @@ extends Node signal api_ready var board_api : Leaderboard - -func use_steam(): - board_api = SteamLeaderboards.new() - board_api.api_ready.connect(_emit_api_ready) - board_api.initialize() -func use_lootlocker(): - board_api = LootLocker.new() +func _ready(): + if OS.has_feature('web'): + board_api = LootLocker.new() + print('create lootlocker object') + else: + board_api = SteamLeaderboards.new() + +func initialize(): + add_child(board_api) board_api.api_ready.connect(_emit_api_ready) board_api.initialize() func get_leaderboard_entries(board_name: String): - print('getting leaderboard entries') board_api.get_leaderboard_entries(board_name) func upload_score(board_name: String, score: int): - print('uploading score') board_api.upload_score(board_name, score) func _emit_api_ready(): diff --git a/Scripts/Leaderboards/LootLocker.gd b/Scripts/Leaderboards/LootLocker.gd index bbe92bb..88bf46d 100644 --- a/Scripts/Leaderboards/LootLocker.gd +++ b/Scripts/Leaderboards/LootLocker.gd @@ -21,7 +21,9 @@ var leader_http : HTTPRequest var submit_score_http : HTTPRequest var submit_name_http : HTTPRequest + func initialize(): + print('init lootlocker') _authentication_request() func _authentication_request(): @@ -114,6 +116,15 @@ func upload_score(board_id: String, score: int): request_completed.connect(_on_submit_score_completed) request(api_domain + "game/leaderboards/" + board_id + "/submit", headers, HTTPClient.METHOD_POST, JSON.stringify(data)) +func parse_entry(entry: Dictionary) -> Dictionary: + # todo: highlight row if it belongs to current user + return { + 'name': entry.player.name, + 'score': str(entry.score), + 'rank': str(entry.rank), + 'highlight': false + } + func _on_submit_score_completed(_result, _response_code, _headers, body): var response = JSON.parse_string(body.get_string_from_utf8()) print(response) diff --git a/Scripts/Leaderboards/SteamLeaderboards.gd b/Scripts/Leaderboards/SteamLeaderboards.gd index 6baa69e..56276b6 100644 --- a/Scripts/Leaderboards/SteamLeaderboards.gd +++ b/Scripts/Leaderboards/SteamLeaderboards.gd @@ -3,30 +3,48 @@ class_name SteamLeaderboards signal leaderboard_handle_found var leaderboard_handle: int +const STEAM_APP_ID = 3490830 +var steam_api: Object = null + +func _ready(): + initialize() + +func _process(float) -> void: + if Engine.has_singleton('Steam') and steam_api != null: + steam_api.run_callbacks() func initialize(): - Steam.leaderboard_score_uploaded.connect(_on_leaderboard_score_uploaded) - Steam.leaderboard_scores_downloaded.connect(_on_leaderboard_scores_downloaded) - if SteamInit.active: + if Engine.has_singleton('Steam'): + steam_api = Engine.get_singleton('Steam') + OS.set_environment("SteamAppId", str(STEAM_APP_ID)) + OS.set_environment("SteamGameId", str(STEAM_APP_ID)) + + steam_api.leaderboard_score_uploaded.connect(_on_leaderboard_score_uploaded) + steam_api.leaderboard_scores_downloaded.connect(_on_leaderboard_scores_downloaded) + steam_api.steamInitEx() api_ready.emit() - else: - SteamInit.steam_ready.connect(func(): - api_ready.emit()) - SteamInit.initialize_steam() func upload_score(board_name: String, score: int): _get_leaderboard_handle(board_name) await leaderboard_handle_found - Steam.uploadLeaderboardScore(score, true, [], leaderboard_handle) + steam_api.uploadLeaderboardScore(score, true, [], leaderboard_handle) + +func parse_entry(entry: Dictionary) -> Dictionary: + return { + 'name': steam_api.getFriendPersonaName(entry.steam_id), + 'score': str(entry.score), + 'rank': str(entry.global_rank), + 'highlight': steam_api.getSteamID() == entry.steam_id + } func get_leaderboard_entries(board_name: String): _get_leaderboard_handle(board_name) await leaderboard_handle_found - Steam.downloadLeaderboardEntries(1, 10, Steam.LEADERBOARD_DATA_REQUEST_GLOBAL_AROUND_USER, leaderboard_handle) + steam_api.downloadLeaderboardEntries(1, 10, steam_api.LEADERBOARD_DATA_REQUEST_GLOBAL_AROUND_USER, leaderboard_handle) func _get_leaderboard_handle(board_name: String): - Steam.leaderboard_find_result.connect(_on_leaderboard_find_result) - Steam.findOrCreateLeaderboard(board_name, Steam.LEADERBOARD_SORT_METHOD_DESCENDING, Steam.LEADERBOARD_DISPLAY_TYPE_NUMERIC) + steam_api.leaderboard_find_result.connect(_on_leaderboard_find_result) + steam_api.findOrCreateLeaderboard(board_name, steam_api.LEADERBOARD_SORT_METHOD_DESCENDING, steam_api.LEADERBOARD_DISPLAY_TYPE_NUMERIC) func _on_leaderboard_find_result(handle: int, found: int) -> void: if found == 1: @@ -34,10 +52,7 @@ func _on_leaderboard_find_result(handle: int, found: int) -> void: leaderboard_handle_found.emit() func _on_leaderboard_scores_downloaded(message: String, leaderboard_handle: int, leaderboard_entries: Array): - print(message) - print(leaderboard_entries) leaderboard_entries_retrieved.emit({'items': leaderboard_entries}) func _on_leaderboard_score_uploaded(success: int, this_handle: int, this_score: Dictionary) -> void: - print(this_score) upload_score_completed.emit() diff --git a/Scripts/SteamInit.gd b/Scripts/SteamInit.gd deleted file mode 100644 index 7d45ff7..0000000 --- a/Scripts/SteamInit.gd +++ /dev/null @@ -1,30 +0,0 @@ -extends Node - -signal steam_ready - -const STEAM_APP_ID = 3490830 -var leaderboard_handle: int - -var active := false - -func _process(delta): - if active: - Steam.run_callbacks() - -func initialize_steam() -> bool: - OS.set_environment("SteamAppId", str(STEAM_APP_ID)) - OS.set_environment("SteamGameId", str(STEAM_APP_ID)) - active = true - var init_response : Dictionary = Steam.steamInitEx() - if init_response.status == 0: - Steam.leaderboard_find_result.connect(_on_leaderboard_find_result) - Steam.findOrCreateLeaderboard("typestrike_leader", Steam.LEADERBOARD_SORT_METHOD_DESCENDING, Steam.LEADERBOARD_DISPLAY_TYPE_NUMERIC) - else: - printerr("Steam failed to initialize") - print_debug(init_response) - active = false - return active - -func _on_leaderboard_find_result(handle: int, found: int) -> void: - leaderboard_handle = handle - steam_ready.emit()