Skip to content
Open
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
40 changes: 31 additions & 9 deletions addons/Rakugo/Rakugo.gd
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand All @@ -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

Expand Down Expand Up @@ -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()))
Expand All @@ -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()
Expand Down Expand Up @@ -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()
Expand All @@ -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()
Expand Down Expand Up @@ -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()
Expand Down Expand Up @@ -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()
34 changes: 34 additions & 0 deletions addons/Rakugo/lib/systems/Executer.gd
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
9 changes: 9 additions & 0 deletions addons/Rakugo/lib/systems/Parser.gd
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@ var parser_regex :={
JUMP = "^jump (?<label>{NAME})( if (?<expression>.+))?$",
# for setting Rakugo variables
SET_VARIABLE = "^(?<lvar_name>{VARIABLE})\\s*{ASSIGNMENT}\\s*((?<text>{STRING})|(?<number>{NUMERIC})|(?<rvar_name>{VARIABLE}))$",
AWAIT = "^await (?<node>{NAME}) (?<signal>{NAME})$",
# $ some_gd_script_code
# IN_LINE_GDSCRIPT = "^\\$.*",
# gdscript:
Expand Down Expand Up @@ -248,6 +249,14 @@ func parse_script(lines:PackedStringArray) -> Dictionary:
"text":treat_string(result.get_string("text"))
}

parse_array.push_back([key, dic_result])

"AWAIT":
var dic_result := {
"node":result.get_string("node"),
"signal":result.get_string("signal")
}

parse_array.push_back([key, dic_result])
_:
parse_array.push_back([key, result])
Expand Down