diff --git a/.gut_editor_config.json b/.gut_editor_config.json index 2ed3928..1cade0d 100644 --- a/.gut_editor_config.json +++ b/.gut_editor_config.json @@ -33,7 +33,7 @@ "post_run_script": "", "pre_run_script": "", "prefix": "Test", - "selected": "TestFix273.gd", + "selected": "TestAwait.gd", "should_exit": false, "should_exit_on_success": false, "should_maximize": false, diff --git a/Test/TestExecuter/TestAwait/TestAwait.gd b/Test/TestExecuter/TestAwait/TestAwait.gd new file mode 100644 index 0000000..1aec786 --- /dev/null +++ b/Test/TestExecuter/TestAwait/TestAwait.gd @@ -0,0 +1,21 @@ +extends "res://Test/RakugoTest.gd" + +const file_path = "res://Test/TestExecuter/TestAwait/TestAwait.rk" + +var file_base_name = get_file_base_name(file_path) + +func test_await(): + watch_rakugo_signals() + + var timer := Timer.new() + add_child(timer) + timer.add_to_group("senders") + timer.wait_time = 3 + watch_signals(timer) + + await wait_parse_and_execute_script(file_path) + timer.start() + await wait_for_signal(timer.timeout, timer.wait_time) + await wait_say({}, "You should see this message after 3s.") + + await wait_execute_script_finished(file_base_name) diff --git a/Test/TestExecuter/TestAwait/TestAwait.rk b/Test/TestExecuter/TestAwait/TestAwait.rk new file mode 100644 index 0000000..d58fbeb --- /dev/null +++ b/Test/TestExecuter/TestAwait/TestAwait.rk @@ -0,0 +1,2 @@ +await Timer timeout +"You should see this message after 3s." \ No newline at end of file diff --git a/Test/TestExecuter/TestAwait/TestAwait.tscn b/Test/TestExecuter/TestAwait/TestAwait.tscn new file mode 100644 index 0000000..77014bb --- /dev/null +++ b/Test/TestExecuter/TestAwait/TestAwait.tscn @@ -0,0 +1,6 @@ +[gd_scene load_steps=2 format=3 uid="uid://b0x8rxs5r3lb5"] + +[ext_resource type="Script" path="res://Test/TestExecuter/TestAwait/TestAwait.gd" id="1_tyryf"] + +[node name="TestAwait" type="Node"] +script = ExtResource("1_tyryf") diff --git a/addons/Rakugo/Rakugo.gd b/addons/Rakugo/Rakugo.gd index d7f38c5..e0a597e 100644 --- a/addons/Rakugo/Rakugo.gd +++ b/addons/Rakugo/Rakugo.gd @@ -11,9 +11,9 @@ const game_title = "application/config/name" const version := "2.3" -const StoreManager = preload ("res://addons/Rakugo/lib/systems/StoreManager.gd") -const Parser = preload ("res://addons/Rakugo/lib/systems/Parser.gd") -const Executer = preload ("res://addons/Rakugo/lib/systems/Executer.gd") +const StoreManager = preload("res://addons/Rakugo/lib/systems/StoreManager.gd") +const Parser = preload("res://addons/Rakugo/lib/systems/Parser.gd") +const Executer = preload("res://addons/Rakugo/lib/systems/Executer.gd") var waiting_step := false: get = is_waiting_step @@ -22,6 +22,8 @@ var waiting_ask_return := false: get = is_waiting_ask_return var waiting_menu_return := false: get = is_waiting_menu_return +var player_step_locked := false: get = is_player_step_locked + # when you load game to run last script var last_thread_datas: Dictionary @@ -203,9 +205,9 @@ func get_character_variable(character_tag: String, var_name: String): ( "Rakugo character with tag " + character_tag - + " does not have this variable: " + +" does not have this variable: " + var_name - + ", returning null" + +", returning null" ) ) push_error("Available variables are: " + str(character.keys())) @@ -226,13 +228,13 @@ func _ready(): define_character("narrator", narrator_name) ## Save all variables, characters, script_name and last line readed on last executed script, in user://save/save_name/save.json file. -func save_game(save_name: String="quick"): +func save_game(save_name: String = "quick"): mutex.lock() store_manager.save_game(executer.get_current_thread_datas(), save_name) mutex.unlock() ## Load all variables, characters, script_name and last line readed on last executed script, from user://save/save_name/save.json file if existed. -func load_game(save_name:="quick"): +func load_game(save_name := "quick"): last_thread_datas = store_manager.load_game(save_name) parse_script(last_thread_datas["path"]) sg_game_loaded.emit() @@ -272,7 +274,7 @@ func parse_script(file_name: String) -> int: ## Executer ## Execute a script previously registered with parse_script. -func execute_script(script_name: String, label_name: String="", index: int=0) -> int: +func execute_script(script_name: String, label_name: String = "", index: int = 0) -> int: var error = FAILED mutex.lock() @@ -292,7 +294,7 @@ func stop_last_script(): mutex.unlock() ## Do parse_script, if return OK then do execute_script. -func parse_and_execute_script(file_name: String, label_name: String="") -> int: +func parse_and_execute_script(file_name: String, label_name: String = "") -> int: var error = FAILED mutex.lock() @@ -334,6 +336,7 @@ func emit_sg_step(): ## Call from Executer when is stop the reading process. func step(): + if player_step_locked: return mutex.lock() waiting_step = true mutex.unlock() @@ -436,3 +439,22 @@ func menu_return(index: int): executer.current_semaphore.post() mutex.unlock() + +func is_player_step_locked() -> bool: + var locked_value := false + + mutex.lock() + locked_value = player_step_locked + mutex.unlock() + + return locked_value + +func lock_player_step(): + mutex.lock() + player_step_locked = true + mutex.unlock() + +func unlock_player_step(): + mutex.lock() + player_step_locked = false + mutex.unlock() diff --git a/addons/Rakugo/lib/systems/Executer.gd b/addons/Rakugo/lib/systems/Executer.gd index b6f6336..b97b2ec 100644 --- a/addons/Rakugo/lib/systems/Executer.gd +++ b/addons/Rakugo/lib/systems/Executer.gd @@ -302,6 +302,40 @@ func do_execute_script(parameters:Dictionary): break Rakugo.set_variable(lvar_name, value) + + "AWAIT": + var node_name = result["node"] + var signal_name = result["signal"] + var sender: Node = null + var senders := Rakugo.get_tree().get_nodes_in_group("senders") + if senders.size() == 0: + parameters["error"] = "Executer::do_execute_script::AWAIT, can not get senders is empty" + parameters["stop"] = true + break + + if node_name not in senders: + parameters["error"] = "Executer::do_execute_script::AWAIT, there is no sender with name: " + node_name + " or in current scene" + parameters["stop"] = true + break + + for node in senders: + if node.name == node_name: + sender = node + break + + if sender == null: + parameters["error"] = "Executer::do_execute_script::AWAIT, can not get sender :" + result["node"] + parameters["stop"] = true + break + + sender.connect(signal_name, func (): + Rakugo.unlock_player_step() + Rakugo.call_thread_safe("step") + ) + + Rakugo.lock_player_step() + semephore.wait() + _: var foo = func(): Rakugo.sg_custom_regex.emit(line[0], result) diff --git a/addons/Rakugo/lib/systems/Parser.gd b/addons/Rakugo/lib/systems/Parser.gd index c0f72b4..1b2e2a2 100644 --- a/addons/Rakugo/lib/systems/Parser.gd +++ b/addons/Rakugo/lib/systems/Parser.gd @@ -41,6 +41,7 @@ var parser_regex :={ JUMP = "^jump (?