Skip to content

Commit

Permalink
Aggiunta servizi online
Browse files Browse the repository at this point in the history
  • Loading branch information
Lucass97 committed Jul 27, 2022
1 parent 155cccc commit b7bf232
Show file tree
Hide file tree
Showing 22 changed files with 1,060 additions and 39 deletions.
2 changes: 2 additions & 0 deletions project.godot
Original file line number Diff line number Diff line change
Expand Up @@ -101,6 +101,8 @@ target_fps="60"
[autoload]

MusicController="*res://src/Main/MusicController.tscn"
Firebase="*res://src/OnlineServices/Firebase.gd"
Stats="*res://src/Main/Stats.gd"

[debug]

Expand Down
3 changes: 1 addition & 2 deletions src/Actors/EnemySkeleton.tscn
Original file line number Diff line number Diff line change
Expand Up @@ -156,15 +156,14 @@ collision_mask = 24
scale = Vector2( 5, 5 )
frames = SubResource( 1 )
animation = "walk"
frame = 1
playing = true

[node name="AnimatedSprite2" type="AnimatedSprite" parent="AnimatedSprite"]
visible = false
position = Vector2( 1.40499, -0.249213 )
scale = Vector2( 0.2, 0.2 )
frames = SubResource( 2 )
frame = 3
frame = 2
playing = true

[node name="CollisionShape2D" type="CollisionShape2D" parent="."]
Expand Down
10 changes: 5 additions & 5 deletions src/Actors/Player.tscn
Original file line number Diff line number Diff line change
Expand Up @@ -77,11 +77,6 @@ animations = [ {
"name": "idle",
"speed": 5.0
}, {
"frames": [ ExtResource( 15 ), ExtResource( 17 ), ExtResource( 14 ) ],
"loop": false,
"name": "idle_attack",
"speed": 5.0
}, {
"frames": [ ExtResource( 25 ), ExtResource( 24 ), ExtResource( 26 ) ],
"loop": false,
"name": "running_attack",
Expand All @@ -106,6 +101,11 @@ animations = [ {
"loop": true,
"name": "idle_attack2",
"speed": 5.0
}, {
"frames": [ ExtResource( 15 ), ExtResource( 17 ), ExtResource( 14 ) ],
"loop": false,
"name": "idle_attack",
"speed": 5.0
} ]

[sub_resource type="RectangleShape2D" id=4]
Expand Down
26 changes: 18 additions & 8 deletions src/Level/Level.gd
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@ export var level_name = "level2"
export var current_stats_path = "user://current_stats.json"
export var stats_path = "user://stats.json"

onready var http = $HTTPRequest

var time_start = 0

var current_stats = {
Expand Down Expand Up @@ -44,13 +46,18 @@ onready var _win_menu = $"../InterfaceLayer/WinMenu"

func _ready():

_load_stats(stats_path)
#_load_stats(stats_path)
if Firebase.is_logged:
Firebase.get_current_record_score("leaderboard-"+ level_name + "/%s" % Firebase.user_info.id, http)
Stats.reset_current_stats()
print("resetting")
print(Stats.current_stats)

for level in stats:
"""for level in Stats.current_stats:
if level != level_name:
current_stats[level] = stats[level]
current_stats[level_name] = default_stats
current_stats[level_name] = default_stats"""

for child in get_children():
if child is Player:
Expand Down Expand Up @@ -90,7 +97,8 @@ func _collect_skull():
"""

var elapsed = OS.get_unix_time() - time_start
current_stats[level_name]["completed"] = true
Stats.complete_level(level_name, elapsed)
"""current_stats[level_name]["completed"] = true
current_stats[level_name]["time"] = elapsed
var prev_time = stats[level_name]["time"]
if prev_time == null:
Expand All @@ -99,10 +107,11 @@ func _collect_skull():
_save_stats(stats_path, current_stats)
elif current_stats[level_name]["collected_coins"] == stats[level_name]["collected_coins"]:
if elapsed < int(prev_time) or not current_stats[level_name]["completed"]:
_save_stats(stats_path, current_stats)
_save_stats(stats_path, current_stats)"""


_save_stats(current_stats_path, current_stats)
#_save_stats(current_stats_path, current_stats)
Stats.register_current_stats(level_name)

get_tree().paused = true
_win_menu.open()
Expand All @@ -112,9 +121,10 @@ func _update_current_stats(entity):
"""
Aggiorna le statitistiche relative all'entita specificata
"""
if entity == "completed" or entity == "time":
Stats.update_current_stats(level_name, entity)
"""if entity == "completed" or entity == "time":
pass
current_stats[level_name][entity] = int(current_stats[level_name][entity]) + 1
current_stats[level_name][entity] = int(current_stats[level_name][entity]) + 1"""

func _load_stats(path):
"""
Expand Down
4 changes: 3 additions & 1 deletion src/Level/Level1.tscn
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@ position = Vector2( -1411.51, -684.366 )
position = Vector2( -557.767, -683.871 )

[node name="Skull" parent="." instance=ExtResource( 13 )]
position = Vector2( 807.775, -758.372 )
position = Vector2( 793.521, -740.555 )

[node name="EnemyKnight1" parent="." instance=ExtResource( 3 )]
position = Vector2( -353.415, -723.649 )
Expand Down Expand Up @@ -154,3 +154,5 @@ position = Vector2( 0, -60 )

[node name="WorldEnvironment" type="WorldEnvironment" parent="."]
environment = SubResource( 2 )

[node name="HTTPRequest" type="HTTPRequest" parent="."]
4 changes: 3 additions & 1 deletion src/Level/Level2.tscn
Original file line number Diff line number Diff line change
Expand Up @@ -109,7 +109,7 @@ position = Vector2( 138.21, 550.632 )
position = Vector2( 137.515, 522.554 )

[node name="Skull" parent="." instance=ExtResource( 10 )]
position = Vector2( 900.696, -182.827 )
position = Vector2( 40.6679, 620.266 )

[node name="EnemyKnight1" parent="." instance=ExtResource( 12 )]
position = Vector2( 154.552, -118.26 )
Expand Down Expand Up @@ -221,5 +221,7 @@ position = Vector2( 0, -60 )
[node name="WorldEnvironment" type="WorldEnvironment" parent="."]
environment = SubResource( 6 )

[node name="HTTPRequest" type="HTTPRequest" parent="."]

[connection signal="timeout" from="CircularSaw/DamageTimer" to="CircularSaw" method="_on_DamageTimer_timeout"]
[connection signal="body_entered" from="CircularSaw/DamageArea" to="CircularSaw" method="_on_Area2D_body_entered"]
125 changes: 125 additions & 0 deletions src/Main/Stats.gd
Original file line number Diff line number Diff line change
@@ -0,0 +1,125 @@
extends Node


onready var default_stats = {
"level1":{
"archers_killed":0,
"collected_coins":0,
"completed":false,
"knights_killed":0,
"red_archers_killed":0,
"shield_knights_killed":0,
"skeletons_killed":0,
"time":null,
"yellow_archers_killed":0
},
"level2":{
"archers_killed":0,
"collected_coins":0,
"completed":false,
"knights_killed":0,
"red_archers_killed":0,
"shield_knights_killed":0,
"skeletons_killed":0,
"time":null,
"yellow_archers_killed":0
}
}

onready var record_stats = {}
onready var current_stats = {}

func _ready():
var dir = Directory.new()
dir.make_dir("data/org.godot.samuraigame")
if not check_files_path("user://stats.json"):
_save_stats("user://stats.json", default_stats)
if not check_files_path("user://current_stats.json"):
_save_stats("user://current_stats.json", default_stats)

load_record_stats("user://stats.json")
reset_current_stats()
reset_record_stats()

print(current_stats)


func check_files_path(path):
var file2Check = File.new()
return file2Check.file_exists(path)

func save_record_stats():
_save_stats("user://stats.json", record_stats)

func save_current_stats():
_save_stats("user://stats.json", current_stats)

func _save_stats(path, stats_to_save):
"""
Salva le statistiche su disco.
"""
var file = File.new()
file.open(path, File.WRITE)
file.store_line(to_json(stats_to_save))
file.close()

func load_record_stats(path):
"""
Carica le statistiche da disco.
"""

var file = File.new()
file.open(path, File.READ)
var text = file.get_as_text()
record_stats = parse_json(text)
file.close()

func reset_current_stats():
current_stats = default_stats.duplicate(true)

func reset_record_stats():
record_stats = default_stats.duplicate(true)

func update_current_stats(level, entity):
"""
Aggiorna le statitistiche relative all'entita specificata
"""
if entity == "completed" or entity == "time":
pass
current_stats[level][entity] = int(current_stats[level][entity]) + 1

func complete_level(level, elapsed):

current_stats[level]["completed"] = true
current_stats[level]["time"] = elapsed


func register_current_stats(level):

var record_score = get_score(level, record_stats)
var current_score = get_score(level, current_stats)

if current_score > record_score:
record_stats[level] = current_stats[level]




func get_score(level, stats):

if stats[level]["completed"] == false:
return 0

var total = 300 - int(stats[level]["time"])
if total <= 0:
total = 0

total = total + int(stats[level]["collected_coins"]) * 100
total = total + int(stats[level]["skeletons_killed"]) * 20
total = total + int(stats[level]["knights_killed"]) * 50
total = total + int(stats[level]["shield_knights_killed"]) * 100
total = total + int(stats[level]["archers_killed"]) * 50
total = total + int(stats[level]["yellow_archers_killed"]) * 100
total = total + int(stats[level]["red_archers_killed"]) * 150

return total
119 changes: 119 additions & 0 deletions src/OnlineServices/Firebase.gd
Original file line number Diff line number Diff line change
@@ -0,0 +1,119 @@
extends Node

const API_KEY := "AIzaSyDJV6lBsiOon84U5T49jboFSBxrPOdhT2k"
const PROJECT_ID := "samurai-game-8a82f"

const REGISTER_URL := "https://www.googleapis.com/identitytoolkit/v3/relyingparty/signupNewUser?key=%s" % API_KEY
const LOGIN_URL := "https://www.googleapis.com/identitytoolkit/v3/relyingparty/verifyPassword?key=%s" % API_KEY
const FIRESTORE_URL := "https://firestore.googleapis.com/v1/projects/%s/databases/(default)/documents/" % PROJECT_ID

var leaderboard := []

var current_record_score := 0

var user_info := {}
var username := ""

var is_logged = false


func _get_user_info(result: Array) -> Dictionary:
var result_body := JSON.parse(result[3].get_string_from_ascii()).result as Dictionary
return {
"token": result_body.idToken,
"id": result_body.localId
}


func _get_request_headers() -> PoolStringArray:
return PoolStringArray([
"Content-Type: application/json",
"Authorization: Bearer %s" % user_info.token
])


func register(email: String, password: String, http: HTTPRequest) -> void:
var body := {
"email": email,
"password": password,
}
http.request(REGISTER_URL, [], false, HTTPClient.METHOD_POST, to_json(body))
var result := yield(http, "request_completed") as Array
if result[1] == 200:
user_info = _get_user_info(result)

func logout():
user_info = {}
is_logged=false

func login(email: String, password: String, http: HTTPRequest) -> void:
var body := {
"email": email,
"password": password,
"returnSecureToken": true
}
http.request(LOGIN_URL, [], false, HTTPClient.METHOD_POST, to_json(body))
var result := yield(http, "request_completed") as Array
if result[1] == 200:
username = email.split("@")[0]
user_info = _get_user_info(result)
is_logged = true


func save_document(path: String, fields: Dictionary, http: HTTPRequest) -> void:
var document := { "fields": fields }
var body := to_json(document)
var url := FIRESTORE_URL + path
http.request(url, _get_request_headers(), false, HTTPClient.METHOD_POST, body)
var result := yield(http, "request_completed") as Array
var result_body := JSON.parse(result[3].get_string_from_ascii()).result as Dictionary



func get_leaderboard(path: String, http: HTTPRequest) -> void:
var url := FIRESTORE_URL + path
http.request(url, _get_request_headers(), false, HTTPClient.METHOD_GET)
var result := yield(http, "request_completed") as Array
if result[1] == 200:
_get_leaderboard(result)


func get_current_record_score(path: String, http: HTTPRequest) -> void:
var url := FIRESTORE_URL + path
http.request(url, _get_request_headers(), false, HTTPClient.METHOD_GET)
var result := yield(http, "request_completed") as Array
if result[1] == 200:
var result_body := JSON.parse(result[3].get_string_from_ascii()).result as Dictionary
current_record_score = int(result_body.fields.Score.stringValue)


func customComparison(a, b):
return int(a['score']) > int(b['score'])

func _get_leaderboard(result: Array):

leaderboard = []

var result_body := JSON.parse(result[3].get_string_from_ascii()).result as Dictionary

for element in result_body.documents:
var user = element.fields.User.stringValue
var score = element.fields.Score.stringValue
leaderboard.append({'user': user, 'score': score})

leaderboard.sort_custom(self, 'customComparison')



func update_document(path: String, fields: Dictionary, http: HTTPRequest) -> void:
var document := { "fields": fields }
var body := to_json(document)
var url := FIRESTORE_URL + path
http.request(url, _get_request_headers(), false, HTTPClient.METHOD_PATCH, body)
var result := yield(http, "request_completed") as Array
var result_body := JSON.parse(result[3].get_string_from_ascii()).result as Dictionary


func delete_document(path: String, http: HTTPRequest) -> void:
var url := FIRESTORE_URL + path
http.request(url, _get_request_headers(), false, HTTPClient.METHOD_DELETE)
Loading

0 comments on commit b7bf232

Please sign in to comment.