Skip to content

Commit 933ba9e

Browse files
authored
Merge pull request #191 from theludovyc/fix#88_save_load_thread
Draft, Fix#88 save load thread
2 parents 960f4ef + 991e37b commit 933ba9e

File tree

7 files changed

+94
-26
lines changed

7 files changed

+94
-26
lines changed

Test/RakugoTest.gd

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ func assert_variable(var_name:String, var_type, value):
5757
func wait_character_variable_changed(char_tag:String, var_name:String, var_type, value):
5858
yield(wait_signal("character_variable_changed", [char_tag, var_name, value]), "completed")
5959

60-
assert_variable(var_name, var_type, value)
60+
assert_variable(char_tag+"."+var_name, var_type, value)
6161

6262
func wait_variable_changed(var_name:String, var_type, value):
6363
yield(wait_signal("variable_changed", [var_name, value]), "completed")

Test/TestRakugo/TestSaveLoad/TestSaveLoad.gd

Lines changed: 34 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,11 @@
1-
extends GutTest
1+
extends "res://Test/RakugoTest.gd"
2+
3+
const file_path = "res://Test/TestRakugo/TestSaveLoad/TestSaveLoad.rk"
4+
5+
var file_base_name = get_file_base_name(file_path)
26

37
func before_all():
4-
var save_folder = "user://saves/quick"
8+
var save_folder = ProjectSettings.get_setting("addons/rakugo/save_folder")
59

610
var directory = Directory.new()
711

@@ -14,15 +18,43 @@ func before_all():
1418
directory.remove(save_folder)
1519

1620
func test_save_load():
21+
watch_rakugo_signals()
22+
1723
Rakugo.set_variable("life", 5)
24+
25+
wait_variable_changed("life", TYPE_INT, 5)
1826

1927
Rakugo.define_character("Sy", "Sylvie")
2028

2129
Rakugo.set_variable("Sy.friendship", 3)
30+
31+
wait_character_variable_changed("Sy", "friendship", TYPE_INT, 3)
32+
33+
yield(wait_parse_and_execute_script(file_path), "completed")
34+
35+
yield(wait_say({}, "Hello, world !"), "completed")
36+
37+
assert_do_step()
38+
39+
yield(wait_say({}, "Save from here"), "completed")
2240

2341
Rakugo.save_game()
42+
43+
Rakugo.stop_last_script()
44+
45+
yield(wait_execute_script_finished(file_base_name), "completed")
2446

2547
Rakugo.load_game()
48+
49+
Rakugo.resume_loaded_script()
50+
51+
yield(wait_execute_script_start(file_base_name), "completed")
52+
53+
yield(wait_say({}, "Save from here"), "completed")
54+
55+
Rakugo.stop_last_script()
56+
57+
yield(wait_execute_script_finished(file_base_name), "completed")
2658

2759
assert_eq(Rakugo.get_variable("life"), 5)
2860

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
"Hello, world !"
2+
"Save from here"

addons/Rakugo/Rakugo.gd

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,9 @@ var waiting_ask_return := false setget , is_waiting_ask_return
3636

3737
var waiting_menu_return := false setget , is_waiting_menu_return
3838

39+
# when you load game to run last script
40+
var last_thread_datas:Dictionary
41+
3942
onready var store_manager := StoreManager.new()
4043
onready var parser := Parser.new(store_manager)
4144
onready var executer := Executer.new(store_manager)
@@ -178,12 +181,16 @@ func _ready():
178181

179182

180183
func save_game(save_name: String = "quick"):
181-
store_manager.save_game(save_name)
184+
store_manager.save_game(executer.get_current_thread_datas(), save_name)
182185

183186

184187
func load_game(save_name := "quick"):
185-
store_manager.load_game(save_name)
188+
last_thread_datas = store_manager.load_game(save_name)
189+
parse_script(last_thread_datas["path"])
186190

191+
func resume_loaded_script():
192+
if !last_thread_datas.empty():
193+
executer.execute_script(last_thread_datas["file_base_name"], "", last_thread_datas["last_index"])
187194

188195
# Parser
189196
func parse_script(file_name: String) -> int:

addons/Rakugo/lib/systems/Executer.gd

Lines changed: 32 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,14 @@ func _init(store_manager):
3434
else:
3535
push_error("execturer, VARIABLE_IN_STR compilation failed")
3636

37+
func get_current_thread_datas() -> Dictionary:
38+
if current_thread and current_thread.is_active():
39+
var dico = threads[current_thread.get_id()]
40+
41+
return {"file_base_name":dico["file_base_name"], "last_index":dico["last_index"]}
42+
43+
return {}
44+
3745
func stop_current_thread() -> int:
3846
if current_thread and current_thread.is_active():
3947
var dico = threads[current_thread.get_id()]
@@ -42,7 +50,7 @@ func stop_current_thread() -> int:
4250
dico["semaphore"].post()
4351
return OK
4452

45-
func execute_script(script_name:String, label_name:String) -> int:
53+
func execute_script(script_name:String, label_name:String = "", index:int = 0) -> int:
4654
stop_current_thread()
4755

4856
if store_manager.parsed_scripts.has(script_name):
@@ -52,7 +60,9 @@ func execute_script(script_name:String, label_name:String) -> int:
5260

5361
var dico = {"thread":current_thread, "semaphore":current_semaphore, "file_base_name":script_name, "stop":false}
5462

55-
if !label_name.empty():
63+
if index > 0:
64+
dico["last_index"] = index
65+
elif !label_name.empty():
5666
dico["label_name"] = label_name
5767

5868
if current_thread.start(self, "do_execute_script", dico) != OK:
@@ -101,8 +111,6 @@ func do_execute_script(parameters:Dictionary):
101111
var file_base_name = parameters["file_base_name"]
102112

103113
Rakugo.send_execute_script_start(file_base_name)
104-
105-
var index := 0
106114

107115
var script = store_manager.parsed_scripts[file_base_name]
108116

@@ -111,17 +119,26 @@ func do_execute_script(parameters:Dictionary):
111119
var labels = script["labels"]
112120

113121
var error = OK
122+
123+
var index := 0
124+
125+
if parameters.has("last_index"):
126+
index = parameters["last_index"]
127+
else:
128+
parameters["last_index"] = 0
114129

115-
if parameters.has("label_name"):
116-
var label = parameters["label_name"]
130+
if parameters.has("label_name"):
131+
var label = parameters["label_name"]
117132

118-
index = do_execute_jump(label, labels)
133+
index = do_execute_jump(label, labels)
119134

120-
if index == -1:
121-
parameters["error"] = jump_error + label
122-
parameters["stop"] = true
135+
if index == -1:
136+
parameters["error"] = jump_error + label
137+
parameters["stop"] = true
123138

124139
while !parameters["stop"] and index < parse_array.size():
140+
parameters["last_index"] = index
141+
125142
var line:Array = parse_array[index]
126143

127144
var result = line[1]
@@ -212,12 +229,15 @@ func do_execute_script(parameters:Dictionary):
212229
if menu_jumps.has(menu_jump_index):
213230
var jump_label = menu_jumps[menu_jump_index]
214231

215-
index = do_execute_jump(jump_label, labels) - 1
232+
index = do_execute_jump(jump_label, labels)
216233

217-
if index == -2:
234+
if index == -1:
218235
parameters["error"] = jump_error + jump_label
219236
parameters["stop"] = true
220237
break
238+
239+
# remove 1 because we add 1 at the end of the loop
240+
index -= 1
221241
elif !(menu_jump_index in [0, menu_choices.size() - 1]):
222242
parameters["error"] = "Executer::do_execute_script::MENU, menu_jump_index out of range: " + str(menu_jump_index) + " >= " + str(menu_choices.size())
223243
parameters["stop"] = true

addons/Rakugo/lib/systems/Parser.gd

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -258,6 +258,6 @@ func parse_script(path:String) -> int:
258258
if state == State.Menu and i == lines.size() - 1 and !menu_choices.empty():
259259
parse_array.push_back(["MENU", current_menu_result, menu_choices])
260260

261-
store_manager.parsed_scripts[path.get_file().get_basename()] = {"parse_array":parse_array, "labels":labels}
261+
store_manager.parsed_scripts[path.get_file().get_basename()] = {"path": path, "parse_array":parse_array, "labels":labels}
262262

263263
return OK

addons/Rakugo/lib/systems/StoreManager.gd

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -70,8 +70,7 @@ func save_json(path: String, data: Dictionary) -> int:
7070
push_error("can't open file: " + path)
7171
return ERR_FILE_CANT_OPEN
7272

73-
74-
func save_game(save_name: String = "quick") -> int:
73+
func save_game(thread_datas:Dictionary, save_name: String = "quick") -> int:
7574
var save_folder = save_folder_path + "/" + save_name
7675

7776
var directory = Directory.new()
@@ -81,21 +80,29 @@ func save_game(save_name: String = "quick") -> int:
8180
push_error("can't create dir: " + save_folder)
8281
return FAILED
8382

84-
return save_json(save_folder + "/save.json", {"variables": variables, "characters": characters})
83+
var sava_datas = {"variables": variables, "characters": characters}
84+
85+
if !thread_datas.empty():
86+
thread_datas["path"] = parsed_scripts[thread_datas["file_base_name"]]["path"]
87+
88+
sava_datas["thread_datas"] = thread_datas
8589

90+
return save_json(save_folder + "/save.json", sava_datas)
8691

87-
func load_game(save_name: String = "quick") -> int:
92+
93+
func load_game(save_name: String = "quick") -> Dictionary:
8894
var save_folder = save_folder_path + "/" + save_name
8995

9096
var directory = Directory.new()
9197

9298
if directory.dir_exists(save_folder):
9399
var dico = load_json(save_folder + "/save.json")
94100

95-
variables = dico["variables"]
96-
characters = dico["characters"]
101+
if !dico.empty():
102+
variables = dico["variables"]
103+
characters = dico["characters"]
97104

98-
return OK
105+
return dico.get("thread_datas", {})
99106

100107
push_error("save folder does not exist at path: " + save_folder)
101-
return FAILED
108+
return {}

0 commit comments

Comments
 (0)