From b6681f3fc6ecdbd11bfadfd76706ea8c9eeeb990 Mon Sep 17 00:00:00 2001 From: Jeremi Biernacki Date: Fri, 25 Apr 2025 07:30:27 +0200 Subject: [PATCH 1/3] add Rakugo.player_step_locked to make possible to lock step until we get singal --- addons/Rakugo/Rakugo.gd | 40 +++++++++++++++++++++++++++++++--------- 1 file changed, 31 insertions(+), 9 deletions(-) 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() From a0d06f01cf9ccf6d0c2d8e046a480741f151fb46 Mon Sep 17 00:00:00 2001 From: Jeremi Biernacki Date: Fri, 25 Apr 2025 07:30:58 +0200 Subject: [PATCH 2/3] add await node signal --- addons/Rakugo/lib/systems/Executer.gd | 34 +++++++++++++++++++++++++++ addons/Rakugo/lib/systems/Parser.gd | 9 +++++++ 2 files changed, 43 insertions(+) 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 (?