+16
-1
Atproto/AtProtoSaveFactory.cs
+16
-1
Atproto/AtProtoSaveFactory.cs
···
13
13
.Named("AtProtoSave")
14
14
.Patching("res://Scenes/Singletons/UserSave/usersave.gdc")
15
15
.AddRule(new TransformationRuleBuilder()
16
+
.Named("ready_slot_condition")
17
+
.Matching(TransformationPatternFactory.CreateGdSnippetPattern("_load_save(last_loaded_slot)", 2))
18
+
.Do(Operation.ReplaceAll)
19
+
.With("""
20
+
var Atproto = $"/root/Atproto"
21
+
if last_loaded_slot != Atproto.ATPROTO_SLOT or Atproto.config.Autoload:
22
+
_load_save(last_loaded_slot)
23
+
else:
24
+
last_loaded_slot = -1
25
+
""", 2)
26
+
)
27
+
.AddRule(new TransformationRuleBuilder()
16
28
.Named("save_file")
17
29
.Matching(TransformationPatternFactory.CreateGdSnippetPattern(
18
30
"\"locked_refs\": PlayerData.locked_refs, \n\t}\n", 2))
19
31
.Do(Operation.Append)
20
-
.With("var atproto = $\"/root/Atproto\"\nif atproto.AtProtoClient.connected() && atproto.save_loaded != null:\n\tatproto.AtProtoClient.save_file()\n", 1)).Build();
32
+
.With("var atproto = $\"/root/Atproto\"\nif atproto.can_save_to_atproto():\n\tatproto.AtProtoClient.save_file()\n", 1)
33
+
)
34
+
35
+
.Build();
21
36
}
22
37
}
+31
-9
gdscript/mods/Atproto/atproto_client.gd
+31
-9
gdscript/mods/Atproto/atproto_client.gd
···
2
2
3
3
# Signals
4
4
signal connection(suceeded)
5
+
signal savefile_loaded(uri)
6
+
7
+
# State
8
+
var can_save = true
5
9
6
10
# AtProto
7
11
var did
···
228
232
func get_saves(callback: FuncRef):
229
233
list_records(callback, "dev.regnault.webfishing.savefile")
230
234
231
-
func save_file(callback: FuncRef = null):
232
-
if !connected(): return
235
+
236
+
func get_save_data():
233
237
var save_data = {
234
238
"inventory": PlayerData.inventory,
235
239
"hotbar": PlayerData.hotbar,
···
317
321
for letter in save_data.inbound_mail:
318
322
for item in letter.items:
319
323
item.size = str(item.size)
324
+
325
+
return save_data
326
+
327
+
func save_file(callback: FuncRef = null, creation = false):
328
+
if UserSave.current_loaded_slot != Atproto.ATPROTO_SLOT:
329
+
return
330
+
if !connected(): return
331
+
332
+
var save_data = get_save_data()
320
333
save_data.at_type = "dev.regnault.webfishing.save"
321
334
322
-
if Atproto.save_loaded:
335
+
if Atproto.save_loaded != "":
323
336
put_record(Atproto.save_loaded, save_data)
324
-
else:
325
-
create_record(save_data, callback)
326
-
337
+
338
+
func create_save(callback: FuncRef = null):
339
+
if !connected(): return
340
+
var save_data = get_save_data()
341
+
save_data.at_type = "dev.regnault.webfishing.save"
342
+
create_record(save_data, callback)
343
+
327
344
func load_save(uri: String):
328
345
var splitted_uri = uri.split("/")
329
346
var did = splitted_uri[2]
···
334
351
335
352
func _after_get_save(save_record):
336
353
var save = save_record.value
354
+
355
+
UserSave._load_save(Atproto.ATPROTO_SLOT)
337
356
338
357
var modified_journal: Dictionary = {}
339
358
for area in save.journal:
···
415
434
PlayerData._missing_quest_check()
416
435
PlayerData._unlock_defaults()
417
436
418
-
Atproto.config.Save = save_record.uri
419
-
Atproto.save_loaded = save_record.uri
420
-
PopupMessage._show_popup("AtProto save file loaded")
437
+
can_save = false
438
+
UserSave._save_slot(Atproto.ATPROTO_SLOT)
439
+
can_save = true
440
+
441
+
emit_signal("savefile_loaded", save_record.uri)
442
+
421
443
+9
-13
gdscript/mods/Atproto/main.gd
+9
-13
gdscript/mods/Atproto/main.gd
···
1
1
extends Node
2
2
3
3
var config: Dictionary
4
+
5
+
const ATPROTO_SLOT = 99
4
6
var save_loaded: String
5
7
var default_config: Dictionary = {}
6
8
···
17
19
func _enter_tree():
18
20
AtProtoClient = AtProtoClient_t.new()
19
21
add_child(AtProtoClient)
22
+
AtProtoClient.connect("savefile_loaded", self, "set_save_file")
20
23
get_tree().connect("node_added", self, "_add_atproto_menu")
21
24
22
25
23
26
func _ready() -> void:
24
-
print("QUOTA:", Steam.getQuota())
25
-
TackleBox.connect("mod_config_updated", self, "_on_config_update")
26
-
27
27
_init_config()
28
28
29
29
func _init_config():
···
36
36
if config.Autoconnect == true:
37
37
AtProtoClient.login(config.Handle, config.Password)
38
38
39
-
40
39
func _save_config():
41
40
TackleBox.set_mod_config(name, config)
42
41
43
-
func _on_config_update(mod_id: String, new_config: Dictionary) -> void:
44
-
if mod_id != name:
45
-
return
46
-
if config.hash() == new_config.hash():
47
-
return
48
-
config = new_config
49
-
if config.Handle != "" and config.Password != "":
50
-
AtProtoClient.login(config.Handle, config.Password)
51
-
52
42
func _add_atproto_menu(node: Node):
53
43
if node.name == "main_menu":
54
44
var atproto_menu: Node = AtProtoMenu.instance()
···
70
60
71
61
if config.Save != "" and config.Autoload and AtProtoClient.connected():
72
62
AtProtoClient.load_save(config.Save)
63
+
64
+
func can_save_to_atproto():
65
+
return AtProtoClient.can_save && UserSave.current_loaded_slot == ATPROTO_SLOT && AtProtoClient.connected()
66
+
67
+
func set_save_file(save_uri):
68
+
save_loaded = save_uri