Skip to content

Commit b7bf232

Browse files
committed
Aggiunta servizi online
1 parent 155cccc commit b7bf232

22 files changed

+1060
-39
lines changed

project.godot

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,8 @@ target_fps="60"
101101
[autoload]
102102

103103
MusicController="*res://src/Main/MusicController.tscn"
104+
Firebase="*res://src/OnlineServices/Firebase.gd"
105+
Stats="*res://src/Main/Stats.gd"
104106

105107
[debug]
106108

src/Actors/EnemySkeleton.tscn

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -156,15 +156,14 @@ collision_mask = 24
156156
scale = Vector2( 5, 5 )
157157
frames = SubResource( 1 )
158158
animation = "walk"
159-
frame = 1
160159
playing = true
161160

162161
[node name="AnimatedSprite2" type="AnimatedSprite" parent="AnimatedSprite"]
163162
visible = false
164163
position = Vector2( 1.40499, -0.249213 )
165164
scale = Vector2( 0.2, 0.2 )
166165
frames = SubResource( 2 )
167-
frame = 3
166+
frame = 2
168167
playing = true
169168

170169
[node name="CollisionShape2D" type="CollisionShape2D" parent="."]

src/Actors/Player.tscn

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -77,11 +77,6 @@ animations = [ {
7777
"name": "idle",
7878
"speed": 5.0
7979
}, {
80-
"frames": [ ExtResource( 15 ), ExtResource( 17 ), ExtResource( 14 ) ],
81-
"loop": false,
82-
"name": "idle_attack",
83-
"speed": 5.0
84-
}, {
8580
"frames": [ ExtResource( 25 ), ExtResource( 24 ), ExtResource( 26 ) ],
8681
"loop": false,
8782
"name": "running_attack",
@@ -106,6 +101,11 @@ animations = [ {
106101
"loop": true,
107102
"name": "idle_attack2",
108103
"speed": 5.0
104+
}, {
105+
"frames": [ ExtResource( 15 ), ExtResource( 17 ), ExtResource( 14 ) ],
106+
"loop": false,
107+
"name": "idle_attack",
108+
"speed": 5.0
109109
} ]
110110

111111
[sub_resource type="RectangleShape2D" id=4]

src/Level/Level.gd

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@ export var level_name = "level2"
1010
export var current_stats_path = "user://current_stats.json"
1111
export var stats_path = "user://stats.json"
1212

13+
onready var http = $HTTPRequest
14+
1315
var time_start = 0
1416

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

4547
func _ready():
4648

47-
_load_stats(stats_path)
49+
#_load_stats(stats_path)
50+
if Firebase.is_logged:
51+
Firebase.get_current_record_score("leaderboard-"+ level_name + "/%s" % Firebase.user_info.id, http)
52+
Stats.reset_current_stats()
53+
print("resetting")
54+
print(Stats.current_stats)
4855

49-
for level in stats:
56+
"""for level in Stats.current_stats:
5057
if level != level_name:
5158
current_stats[level] = stats[level]
5259
53-
current_stats[level_name] = default_stats
60+
current_stats[level_name] = default_stats"""
5461

5562
for child in get_children():
5663
if child is Player:
@@ -90,7 +97,8 @@ func _collect_skull():
9097
"""
9198

9299
var elapsed = OS.get_unix_time() - time_start
93-
current_stats[level_name]["completed"] = true
100+
Stats.complete_level(level_name, elapsed)
101+
"""current_stats[level_name]["completed"] = true
94102
current_stats[level_name]["time"] = elapsed
95103
var prev_time = stats[level_name]["time"]
96104
if prev_time == null:
@@ -99,10 +107,11 @@ func _collect_skull():
99107
_save_stats(stats_path, current_stats)
100108
elif current_stats[level_name]["collected_coins"] == stats[level_name]["collected_coins"]:
101109
if elapsed < int(prev_time) or not current_stats[level_name]["completed"]:
102-
_save_stats(stats_path, current_stats)
110+
_save_stats(stats_path, current_stats)"""
103111

104112

105-
_save_stats(current_stats_path, current_stats)
113+
#_save_stats(current_stats_path, current_stats)
114+
Stats.register_current_stats(level_name)
106115

107116
get_tree().paused = true
108117
_win_menu.open()
@@ -112,9 +121,10 @@ func _update_current_stats(entity):
112121
"""
113122
Aggiorna le statitistiche relative all'entita specificata
114123
"""
115-
if entity == "completed" or entity == "time":
124+
Stats.update_current_stats(level_name, entity)
125+
"""if entity == "completed" or entity == "time":
116126
pass
117-
current_stats[level_name][entity] = int(current_stats[level_name][entity]) + 1
127+
current_stats[level_name][entity] = int(current_stats[level_name][entity]) + 1"""
118128

119129
func _load_stats(path):
120130
"""

src/Level/Level1.tscn

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ position = Vector2( -1411.51, -684.366 )
5757
position = Vector2( -557.767, -683.871 )
5858

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

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

155155
[node name="WorldEnvironment" type="WorldEnvironment" parent="."]
156156
environment = SubResource( 2 )
157+
158+
[node name="HTTPRequest" type="HTTPRequest" parent="."]

src/Level/Level2.tscn

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,7 @@ position = Vector2( 138.21, 550.632 )
109109
position = Vector2( 137.515, 522.554 )
110110

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

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

224+
[node name="HTTPRequest" type="HTTPRequest" parent="."]
225+
224226
[connection signal="timeout" from="CircularSaw/DamageTimer" to="CircularSaw" method="_on_DamageTimer_timeout"]
225227
[connection signal="body_entered" from="CircularSaw/DamageArea" to="CircularSaw" method="_on_Area2D_body_entered"]

src/Main/Stats.gd

Lines changed: 125 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,125 @@
1+
extends Node
2+
3+
4+
onready var default_stats = {
5+
"level1":{
6+
"archers_killed":0,
7+
"collected_coins":0,
8+
"completed":false,
9+
"knights_killed":0,
10+
"red_archers_killed":0,
11+
"shield_knights_killed":0,
12+
"skeletons_killed":0,
13+
"time":null,
14+
"yellow_archers_killed":0
15+
},
16+
"level2":{
17+
"archers_killed":0,
18+
"collected_coins":0,
19+
"completed":false,
20+
"knights_killed":0,
21+
"red_archers_killed":0,
22+
"shield_knights_killed":0,
23+
"skeletons_killed":0,
24+
"time":null,
25+
"yellow_archers_killed":0
26+
}
27+
}
28+
29+
onready var record_stats = {}
30+
onready var current_stats = {}
31+
32+
func _ready():
33+
var dir = Directory.new()
34+
dir.make_dir("data/org.godot.samuraigame")
35+
if not check_files_path("user://stats.json"):
36+
_save_stats("user://stats.json", default_stats)
37+
if not check_files_path("user://current_stats.json"):
38+
_save_stats("user://current_stats.json", default_stats)
39+
40+
load_record_stats("user://stats.json")
41+
reset_current_stats()
42+
reset_record_stats()
43+
44+
print(current_stats)
45+
46+
47+
func check_files_path(path):
48+
var file2Check = File.new()
49+
return file2Check.file_exists(path)
50+
51+
func save_record_stats():
52+
_save_stats("user://stats.json", record_stats)
53+
54+
func save_current_stats():
55+
_save_stats("user://stats.json", current_stats)
56+
57+
func _save_stats(path, stats_to_save):
58+
"""
59+
Salva le statistiche su disco.
60+
"""
61+
var file = File.new()
62+
file.open(path, File.WRITE)
63+
file.store_line(to_json(stats_to_save))
64+
file.close()
65+
66+
func load_record_stats(path):
67+
"""
68+
Carica le statistiche da disco.
69+
"""
70+
71+
var file = File.new()
72+
file.open(path, File.READ)
73+
var text = file.get_as_text()
74+
record_stats = parse_json(text)
75+
file.close()
76+
77+
func reset_current_stats():
78+
current_stats = default_stats.duplicate(true)
79+
80+
func reset_record_stats():
81+
record_stats = default_stats.duplicate(true)
82+
83+
func update_current_stats(level, entity):
84+
"""
85+
Aggiorna le statitistiche relative all'entita specificata
86+
"""
87+
if entity == "completed" or entity == "time":
88+
pass
89+
current_stats[level][entity] = int(current_stats[level][entity]) + 1
90+
91+
func complete_level(level, elapsed):
92+
93+
current_stats[level]["completed"] = true
94+
current_stats[level]["time"] = elapsed
95+
96+
97+
func register_current_stats(level):
98+
99+
var record_score = get_score(level, record_stats)
100+
var current_score = get_score(level, current_stats)
101+
102+
if current_score > record_score:
103+
record_stats[level] = current_stats[level]
104+
105+
106+
107+
108+
func get_score(level, stats):
109+
110+
if stats[level]["completed"] == false:
111+
return 0
112+
113+
var total = 300 - int(stats[level]["time"])
114+
if total <= 0:
115+
total = 0
116+
117+
total = total + int(stats[level]["collected_coins"]) * 100
118+
total = total + int(stats[level]["skeletons_killed"]) * 20
119+
total = total + int(stats[level]["knights_killed"]) * 50
120+
total = total + int(stats[level]["shield_knights_killed"]) * 100
121+
total = total + int(stats[level]["archers_killed"]) * 50
122+
total = total + int(stats[level]["yellow_archers_killed"]) * 100
123+
total = total + int(stats[level]["red_archers_killed"]) * 150
124+
125+
return total

src/OnlineServices/Firebase.gd

Lines changed: 119 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,119 @@
1+
extends Node
2+
3+
const API_KEY := "AIzaSyDJV6lBsiOon84U5T49jboFSBxrPOdhT2k"
4+
const PROJECT_ID := "samurai-game-8a82f"
5+
6+
const REGISTER_URL := "https://www.googleapis.com/identitytoolkit/v3/relyingparty/signupNewUser?key=%s" % API_KEY
7+
const LOGIN_URL := "https://www.googleapis.com/identitytoolkit/v3/relyingparty/verifyPassword?key=%s" % API_KEY
8+
const FIRESTORE_URL := "https://firestore.googleapis.com/v1/projects/%s/databases/(default)/documents/" % PROJECT_ID
9+
10+
var leaderboard := []
11+
12+
var current_record_score := 0
13+
14+
var user_info := {}
15+
var username := ""
16+
17+
var is_logged = false
18+
19+
20+
func _get_user_info(result: Array) -> Dictionary:
21+
var result_body := JSON.parse(result[3].get_string_from_ascii()).result as Dictionary
22+
return {
23+
"token": result_body.idToken,
24+
"id": result_body.localId
25+
}
26+
27+
28+
func _get_request_headers() -> PoolStringArray:
29+
return PoolStringArray([
30+
"Content-Type: application/json",
31+
"Authorization: Bearer %s" % user_info.token
32+
])
33+
34+
35+
func register(email: String, password: String, http: HTTPRequest) -> void:
36+
var body := {
37+
"email": email,
38+
"password": password,
39+
}
40+
http.request(REGISTER_URL, [], false, HTTPClient.METHOD_POST, to_json(body))
41+
var result := yield(http, "request_completed") as Array
42+
if result[1] == 200:
43+
user_info = _get_user_info(result)
44+
45+
func logout():
46+
user_info = {}
47+
is_logged=false
48+
49+
func login(email: String, password: String, http: HTTPRequest) -> void:
50+
var body := {
51+
"email": email,
52+
"password": password,
53+
"returnSecureToken": true
54+
}
55+
http.request(LOGIN_URL, [], false, HTTPClient.METHOD_POST, to_json(body))
56+
var result := yield(http, "request_completed") as Array
57+
if result[1] == 200:
58+
username = email.split("@")[0]
59+
user_info = _get_user_info(result)
60+
is_logged = true
61+
62+
63+
func save_document(path: String, fields: Dictionary, http: HTTPRequest) -> void:
64+
var document := { "fields": fields }
65+
var body := to_json(document)
66+
var url := FIRESTORE_URL + path
67+
http.request(url, _get_request_headers(), false, HTTPClient.METHOD_POST, body)
68+
var result := yield(http, "request_completed") as Array
69+
var result_body := JSON.parse(result[3].get_string_from_ascii()).result as Dictionary
70+
71+
72+
73+
func get_leaderboard(path: String, http: HTTPRequest) -> void:
74+
var url := FIRESTORE_URL + path
75+
http.request(url, _get_request_headers(), false, HTTPClient.METHOD_GET)
76+
var result := yield(http, "request_completed") as Array
77+
if result[1] == 200:
78+
_get_leaderboard(result)
79+
80+
81+
func get_current_record_score(path: String, http: HTTPRequest) -> void:
82+
var url := FIRESTORE_URL + path
83+
http.request(url, _get_request_headers(), false, HTTPClient.METHOD_GET)
84+
var result := yield(http, "request_completed") as Array
85+
if result[1] == 200:
86+
var result_body := JSON.parse(result[3].get_string_from_ascii()).result as Dictionary
87+
current_record_score = int(result_body.fields.Score.stringValue)
88+
89+
90+
func customComparison(a, b):
91+
return int(a['score']) > int(b['score'])
92+
93+
func _get_leaderboard(result: Array):
94+
95+
leaderboard = []
96+
97+
var result_body := JSON.parse(result[3].get_string_from_ascii()).result as Dictionary
98+
99+
for element in result_body.documents:
100+
var user = element.fields.User.stringValue
101+
var score = element.fields.Score.stringValue
102+
leaderboard.append({'user': user, 'score': score})
103+
104+
leaderboard.sort_custom(self, 'customComparison')
105+
106+
107+
108+
func update_document(path: String, fields: Dictionary, http: HTTPRequest) -> void:
109+
var document := { "fields": fields }
110+
var body := to_json(document)
111+
var url := FIRESTORE_URL + path
112+
http.request(url, _get_request_headers(), false, HTTPClient.METHOD_PATCH, body)
113+
var result := yield(http, "request_completed") as Array
114+
var result_body := JSON.parse(result[3].get_string_from_ascii()).result as Dictionary
115+
116+
117+
func delete_document(path: String, http: HTTPRequest) -> void:
118+
var url := FIRESTORE_URL + path
119+
http.request(url, _get_request_headers(), false, HTTPClient.METHOD_DELETE)

0 commit comments

Comments
 (0)