Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We鈥檒l occasionally send you account related emails.

Already on GitHub? Sign in to your account

8 server is dead #18

Merged
merged 5 commits into from
May 3, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,8 @@ tests/data/*.translation
### General build output ###
############################

Exports/
exports/ios/*
!exports/ios/.gitkeep

# C/C++ generated
*.a
Expand Down
4 changes: 0 additions & 4 deletions AutoLoad/Constants/constants.gd
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,3 @@ const State = {
var score: int = 0
var combos_strike: int = 0
var lives: int = start_lives

var pause: bool = false
var sound: bool = true
var music: bool = true
111 changes: 73 additions & 38 deletions AutoLoad/NetworkManager/NetworkManager.gd
Original file line number Diff line number Diff line change
@@ -1,50 +1,85 @@
extends Node

signal scan(result)
signal insert(result)
signal leaderboard(leaders, position)
signal error()

var is_scanning = false
var is_inserting = false
var wait_get: bool = false
var wait_post: bool = false

const apiEndpoint = "https://infinite-mesa-72950.herokuapp.com/"
const endpoint: String = "https://2a3q9k996b.execute-api.eu-west-3.amazonaws.com/Prod/"

func start_scan():
if is_scanning:
print("Already scanning")
var last_submitted_uuid: String
var last_submitted_name: String
var last_submitted_score: int

func _ready():
# read from config if any
var config = ConfigFile.new()
var err = config.load("user:https://submission.cfg")
if err != OK:
last_submitted_uuid = "none"
else:
last_submitted_uuid = config.get_value('submission', 'uuid', "none")
last_submitted_name = config.get_value('submission', 'name')
last_submitted_score = config.get_value('submission', 'score')

func save_submission():
var config = ConfigFile.new()
config.set_value('submission', 'uuid', last_submitted_uuid)
config.set_value('submission', 'name', last_submitted_name)
config.set_value('submission', 'score', last_submitted_score)
config.save("user:https://submission.cfg")
print('Last Submission Saved (', last_submitted_uuid, ', ', last_submitted_name, ', ', last_submitted_score, ')')

func get_leaderboard():
if wait_get:
# TODO make sure we don't wait for too long if error serverside
return
print("Scan")
var error = $HTTPRequestScan.request(apiEndpoint + "scan")
var error = $HTTPRequestGet.request(endpoint + last_submitted_uuid)
if error != OK:
push_error("An error occurred in the HTTP request [scan].")
push_error("An error occurred in the HTTP request.")
emit_signal("error")
else:
is_scanning = true
wait_get = true

func start_insert(score, player_name):
if is_inserting or is_scanning:
print("Already inserting")
func post_leaderboard(player_name: String, score: int):
if wait_post:
return
print("Insert: ", score, ", ", player_name)
var body = {"score": score, "name": player_name}
var error = $HTTPRequestInsert.request(apiEndpoint + "insert", ["Content-Type: application/json"], HTTPClient.METHOD_POST, JSON.stringify(body))
var body = JSON.stringify({
"name": player_name,
"score": score
})

var error = $HTTPRequestPost.request(endpoint, [], HTTPClient.METHOD_POST, body)
print('Post to leaderboard - ', error)
print(body)
if error != OK:
push_error("An error occurred in the HTTP request [insert, %d, %s]." % [score, player_name])
push_error("An error occurred in the HTTP request.")
emit_signal("error")
else:
is_inserting = true


func _on_HTTPRequestInsert_request_completed(_result, _response_code, _headers, body):
var test_json_conv = JSON.new()
test_json_conv.parse(body.get_string_from_utf8())
var response = test_json_conv.get_data()
if response and response.has("result"):
emit_signal("insert", response["result"])
is_inserting = false

func _on_HTTPRequestScan_request_completed(_result, _response_code, _headers, body):
var test_json_conv = JSON.new()
test_json_conv.parse(body.get_string_from_utf8())
var response = test_json_conv.get_data()
if response and response.has("result"):
emit_signal("scan", response["result"])
is_scanning = false

wait_post = true
last_submitted_name = player_name
last_submitted_score = score

func process_response(body, method: String):
var json = JSON.new()
json.parse(body.get_string_from_utf8())
var response = json.get_data()
print(response)
if response == null:
emit_signal("error")
return
var leaders = response.get('leaders', [])
var position = response.get('position', 0)
if method == "POST":
last_submitted_uuid = response.get('uuid', 'none')
save_submission()
emit_signal("leaderboard", leaders, position)

func _on_http_request_get_request_completed(_result, _response_code, _headers, body):
wait_get = false
process_response(body, "GET")

func _on_http_request_post_request_completed(_result, _response_code, _headers, body):
wait_post = false
process_response(body, "POST")
10 changes: 6 additions & 4 deletions AutoLoad/NetworkManager/NetworkManager.tscn
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,11 @@
[node name="NetworkManager" type="Node"]
script = ExtResource("1")

[node name="HTTPRequestScan" type="HTTPRequest" parent="."]
[node name="HTTPRequestGet" type="HTTPRequest" parent="."]
timeout = 10.0

[node name="HTTPRequestInsert" type="HTTPRequest" parent="."]
[node name="HTTPRequestPost" type="HTTPRequest" parent="."]
timeout = 10.0

[connection signal="request_completed" from="HTTPRequestScan" to="." method="_on_HTTPRequestScan_request_completed"]
[connection signal="request_completed" from="HTTPRequestInsert" to="." method="_on_HTTPRequestInsert_request_completed"]
[connection signal="request_completed" from="HTTPRequestGet" to="." method="_on_http_request_get_request_completed"]
[connection signal="request_completed" from="HTTPRequestPost" to="." method="_on_http_request_post_request_completed"]
29 changes: 10 additions & 19 deletions AutoLoad/Session/session.gd
Original file line number Diff line number Diff line change
Expand Up @@ -5,50 +5,41 @@ extends Node
@export_file("*.tscn") var leaderboard_path = "res:https://UI/Leaderboard/Leaderboard.tscn"
@export_file("*.tscn") var settings_path = "res:https://Scenes/Menus/Settings/Settings.tscn"

var read_leaderboard_from_memory: bool = false
var in_memory_leaderboard: Dictionary

func _ready():
randomize()
NetworkManager.connect("insert", Callable(self, "_on_NetworkManager_insert"))

func pause_with_opacity():
get_tree().paused = true
func pause_menu():
$PauseMenu.set_visible_to(true)
$LoseMenu.set_visible_to(false)

func unpause():
func remove_menus():
$LoseMenu.set_visible_to(false)
$PauseMenu.set_visible_to(false)
get_tree().paused = false

func start_game():
Constants.lives = Constants.start_lives
Constants.score = 0
unpause()
remove_menus()
get_tree().change_scene_to_file(game_path)

func leaderboard():
unpause()
remove_menus()
get_tree().change_scene_to_file(leaderboard_path)

func settings():
get_tree().change_scene_to_file(settings_path)

func main_menu():
unpause()
remove_menus()
get_tree().change_scene_to_file(main_menu_path)

func lose():
get_tree().paused = true
func lose_menu():
$PauseMenu.set_visible_to(false)
$LoseMenu.set_visible_to(true)


func submit_score(score, player_name):
NetworkManager.start_insert(score, player_name)


func _on_NetworkManager_insert(_result):
unpause()
get_tree().change_scene_to_file(leaderboard_path)

var vibration_on: bool = true
const LIGHT_HAPTIC_FEEDBACK: int = 4
const MEDIUM_HAPTIC_FEEDBACK: int = 8
Expand Down
15 changes: 7 additions & 8 deletions AutoLoad/Session/session.tscn
Original file line number Diff line number Diff line change
@@ -1,13 +1,12 @@
[gd_scene load_steps=4 format=2]
[gd_scene load_steps=4 format=3 uid="uid:https://cfd6dmlet54xg"]

[ext_resource path="res:https://AutoLoad/Session/session.gd" type="Script" id=1]
[ext_resource path="res:https://UI/PauseMenu/PauseMenu.tscn" type="PackedScene" id=2]
[ext_resource path="res:https://UI/LoseMenu/LoseMenu.tscn" type="PackedScene" id=3]
[ext_resource type="Script" path="res:https://AutoLoad/Session/session.gd" id="1"]
[ext_resource type="PackedScene" uid="uid:https://cwcepou6wxegl" path="res:https://UI/PauseMenu/PauseMenu.tscn" id="2"]
[ext_resource type="PackedScene" uid="uid:https://ilei4y43xwl3" path="res:https://UI/LoseMenu/LoseMenu.tscn" id="3"]

[node name="Session" type="Node"]
process_mode = 2
script = ExtResource( 1 )
script = ExtResource("1")

[node name="PauseMenu" parent="." instance=ExtResource( 2 )]
[node name="PauseMenu" parent="." instance=ExtResource("2")]

[node name="LoseMenu" parent="." instance=ExtResource( 3 )]
[node name="LoseMenu" parent="." instance=ExtResource("3")]
2 changes: 1 addition & 1 deletion Game/GameMaster.gd
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ func lose_life():
if Constants.lives == 0:
$GameUI.visible = false
# TODO: lose is a bit straighforward, a little animation won't hurt
Session.lose()
Session.lose_menu()

func wrong():
reset_combos_strike()
Expand Down
3 changes: 1 addition & 2 deletions Scenes/GameUI/GameUI.gd
Original file line number Diff line number Diff line change
Expand Up @@ -27,8 +27,7 @@ func lose_heart():

func _on_pause_button_pressed():
Session.click()
Constants.pause = true
Session.pause_with_opacity()
Session.pause_menu()

func update_score(score):
$ScoreText.text = str(score)
Expand Down
89 changes: 68 additions & 21 deletions UI/Leaderboard/Leaderboard.gd
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
extends Control

@export var ScoreEntry: PackedScene
@export var OwnScoreEntry: PackedScene

class MyCustomSorter:
static func sort_ascending(a, b):
Expand All @@ -9,30 +10,76 @@ class MyCustomSorter:
return false

# Called when the node enters the scene tree for the first time.
func _ready():
await get_tree().process_frame # wait to have size working
# Place spinner in the middle
print(size, $MarginContainer/VBoxContainer/Panel/Control.size)
$MarginContainer/VBoxContainer/Panel/Control/LoadingPath.position = $MarginContainer/VBoxContainer/Panel/Control.size / 2
# Get the leaderboard from ddb
NetworkManager.connect("scan", Callable(self, "_on_NetworkManager_scan"))
NetworkManager.start_scan()
$MarginContainer/VBoxContainer/Panel/Control/LoadingPath/AnimationPlayer.play("spinner")

func _on_NetworkManager_scan(scores):
$MarginContainer/VBoxContainer/Panel/Control/LoadingPath.visible = false
func _ready():
if validate_memory_leaderboard():
# get leaderboard from memory
var leaders = Session.in_memory_leaderboard.get("leaders")
var player_position = Session.in_memory_leaderboard.get("position")
display_leaderboard(leaders, player_position)
else:
# get leaderboard from network
NetworkManager.connect("leaderboard", Callable(self, "_on_network_manager_leaderboard"))
NetworkManager.get_leaderboard()
$MarginContainer/VBoxContainer/CenterContainer/Loader.spin()

func validate_memory_leaderboard() -> bool:
if not Session.read_leaderboard_from_memory:
return false
Session.read_leaderboard_from_memory = false
if Session.in_memory_leaderboard == null:
return false
if Session.in_memory_leaderboard.get("leaders") == null:
return false
if Session.in_memory_leaderboard.get("position") == null:
return false
return true

scores.sort_custom(Callable(MyCustomSorter, "sort_ascending"))
var i = 1
for elt in scores:
var entry = ScoreEntry.instantiate()
entry.rank = str(i)
entry.player = elt["name"]
entry.score = str(elt["score"])
$MarginContainer/VBoxContainer/Panel/VBox/ScrollContainer/VBoxContainer.add_child(entry)
i += 1
func add_entry(Entry: PackedScene, player_position: Variant, player_name, score):
var entry = Entry.instantiate()
entry.rank_string = str(player_position)
entry.player = player_name
entry.score = score
$MarginContainer/VBoxContainer/VBoxContainer.add_child(entry)

func display_leaderboard(leaders, player_position):
for i in leaders.size():
var leader = leaders[i]
var rank = i + 1
var player_name = leaders[i]["name"]
var score = leaders[i]["score"]
if i + 1 == player_position:
add_entry(OwnScoreEntry, rank, player_name, score)
else:
add_entry(ScoreEntry, rank, player_name, score)

if validate_last_submission():
if player_position == 0:
add_entry(
OwnScoreEntry,
"Infinity",
NetworkManager.last_submitted_name,
NetworkManager.last_submitted_score)
elif player_position > leaders.size():
add_entry(
OwnScoreEntry,
player_position,
NetworkManager.last_submitted_name,
NetworkManager.last_submitted_score)

$MarginContainer/VBoxContainer/CenterContainer/Loader.stop()
$MarginContainer/VBoxContainer/CenterContainer.visible = false
$MarginContainer/VBoxContainer/VBoxContainer.visible = true

func validate_last_submission() -> bool:
if NetworkManager.last_submitted_name == null:
return false
if NetworkManager.last_submitted_score == null:
return false
return true

func _on_network_manager_leaderboard(leaders, player_position):
display_leaderboard(leaders, player_position)

func _on_MainMenu_pressed():
Session.click()
Session.main_menu()
Expand Down
Loading