ape-ame/Leaderboard.gd

77 lines
2.9 KiB
GDScript3
Raw Permalink Normal View History

2024-04-19 17:59:19 -04:00
extends RichTextLabel
2024-04-16 20:29:45 -04:00
@export var stopwatch: Stopwatch
2024-04-26 16:32:56 -04:00
@export var spawner: Node2D
2024-04-17 17:22:29 -04:00
var config = ConfigFile.new()
2024-04-16 20:29:45 -04:00
2025-01-22 16:43:51 -05:00
const API_BASE = "https://ape-ame.ultrablob.me/api"
2024-04-26 16:32:56 -04:00
#const API_BASE = "http://localhost:5001"
2024-04-17 17:22:29 -04:00
func make_urlsafe(data: String):
return data.replace("+", "-").replace("/", "_")
2024-04-17 15:00:20 -04:00
2024-04-16 20:29:45 -04:00
func get_scores():
2024-04-17 15:00:20 -04:00
$HTTPRequest.request(API_BASE + "/leaderboard")
2024-04-16 20:29:45 -04:00
func submit_score():
2025-02-05 14:05:36 -05:00
if OS.is_debug_build():
text = "Debug Build\nLeaderboard Disabled"
return
2024-04-17 17:22:29 -04:00
var err = config.load("user://settings.cfg")
if not (err == OK and config.has_section_key("config", "username")):
text = "Error: No Username!\nSet a username in settings to submit scores"
2024-04-30 22:07:02 -04:00
var encrypted_score = "EGH" + make_urlsafe(Marshalls.utf8_to_base64(str(stopwatch.time_since_wave if stopwatch.time_since_wave != 0 else stopwatch.time_elapsed))) + "eHa" + make_urlsafe(Marshalls.utf8_to_base64(config.get_value("config", "username")) + "lAx" + make_urlsafe(Marshalls.utf8_to_base64(str(spawner.wave_count-1))))
2024-04-16 20:29:45 -04:00
$HTTPRequest.request_completed.connect(_on_request_completed)
2024-04-17 17:22:29 -04:00
$HTTPRequest.request(API_BASE + "/leaderboard?score=%s" % encrypted_score, [], HTTPClient.METHOD_POST)
2024-04-16 20:29:45 -04:00
func _on_request_completed(result, response_code, headers, body):
var json = JSON.parse_string(body.get_string_from_utf8())
#print(json)
2024-04-22 10:03:24 -04:00
if json and "scores" in json and "position" in json:
2024-04-17 17:22:29 -04:00
var scoredata = json["scores"]
var scores = []
for score in scoredata:
scores.append(float(score[1]))
2024-04-19 17:59:19 -04:00
#print(scores)
2024-04-26 16:32:56 -04:00
#print(scoredata)
2024-04-22 10:03:24 -04:00
var placement = float(json["position"])
2024-04-26 16:32:56 -04:00
print(placement)
2024-04-16 20:29:45 -04:00
2024-05-06 10:05:42 -04:00
$"../Summary".text = "You reached wave %d in %s" % [spawner.wave_count-1, seconds2mmss(stopwatch.time_since_wave if stopwatch.time_since_wave != 0 else stopwatch.time_elapsed)]
2024-04-22 10:03:24 -04:00
if placement >= 1:
2024-04-19 17:59:19 -04:00
text = "[center]You placed #%d\n[/center]" % [placement]
2024-04-16 20:29:45 -04:00
else:
2024-04-22 10:03:24 -04:00
text = "[center]You placed top %d%%\n[/center]" % [placement * 100]
2024-04-16 20:29:45 -04:00
var n = 1
2024-04-19 17:59:19 -04:00
while n <= 50 and n <= len(scores):
2024-04-26 16:32:56 -04:00
#print(n)
#print(scoredata[n-1])
text += "[fill]%s #%d Wave %s %s[/fill]" % [ scoredata[n-1][0], n, scoredata[n-1][2], seconds2mmss(scores[n-1]) ]
#print([ scoredata[n-1][0], n, scoredata[n-1][2], seconds2mmss(scores[n-1]) ])
2024-04-16 20:29:45 -04:00
n += 1
func closest(my_number:int, my_array:Array)->int:
# Initialize
var closest_num:int
var closest_delta:int = 0
var closest_idx = -1
var temp_delta:int = 0
# Loop through entire array
for i in range(my_array.size()):
2024-04-17 17:22:29 -04:00
if my_array[i] == my_number:
print("Exact Match!")
return my_array[i] # exact match found!
2024-04-16 20:29:45 -04:00
temp_delta = int(abs(my_array[i]-my_number))
if closest_delta == 0 or temp_delta < closest_delta:
closest_num = my_array[i]
closest_idx = i
closest_delta = temp_delta
# Return closest number found
return closest_idx
func seconds2mmss(total_seconds: float) -> String:
var seconds: float = fmod(total_seconds , 60.0)
var minutes: int = int(total_seconds / 60.0) % 60
var hhmmss_string: String = "%02d:%05.2f" % [minutes, seconds]
return hhmmss_string