You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
91 lines
2.9 KiB
91 lines
2.9 KiB
6 months ago
|
extends DialogicSubsystem
|
||
|
|
||
|
## Subsystem that holds methods for jumping to specific labels, or return to the previous jump.
|
||
|
|
||
|
signal switched_timeline(info:Dictionary)
|
||
|
signal jumped_to_label(info:Dictionary)
|
||
|
signal returned_from_jump(info:Dictionary)
|
||
|
signal passed_label(info:Dictionary)
|
||
|
|
||
|
|
||
|
#region STATE
|
||
|
####################################################################################################
|
||
|
|
||
|
func clear_game_state(clear_flag:=DialogicGameHandler.ClearFlags.FULL_CLEAR) -> void:
|
||
|
dialogic.current_state_info['jump_stack'] = []
|
||
|
dialogic.current_state_info.erase("last_label")
|
||
|
|
||
|
|
||
|
func load_game_state(load_flag:=LoadFlags.FULL_LOAD) -> void:
|
||
|
if not 'jump_stack' in dialogic.current_state_info:
|
||
|
dialogic.current_state_info['jump_stack'] = []
|
||
|
|
||
|
#endregion
|
||
|
|
||
|
|
||
|
#region MAIN METHODS JUMP
|
||
|
####################################################################################################
|
||
|
|
||
|
func jump_to_label(label:String) -> void:
|
||
|
if label.is_empty():
|
||
|
dialogic.current_event_idx = 0
|
||
|
jumped_to_label.emit({'timeline':dialogic.current_timeline, 'label':"TOP"})
|
||
|
return
|
||
|
|
||
|
var idx: int = -1
|
||
|
while true:
|
||
|
idx += 1
|
||
|
var event: Variant = dialogic.current_timeline.get_event(idx)
|
||
|
if not event:
|
||
|
idx = dialogic.current_event_idx
|
||
|
break
|
||
|
if event is DialogicLabelEvent and event.name == label:
|
||
|
break
|
||
|
dialogic.current_event_idx = idx-1
|
||
|
jumped_to_label.emit({'timeline':dialogic.current_timeline, 'label':label})
|
||
|
|
||
|
|
||
|
func push_to_jump_stack() -> void:
|
||
|
dialogic.current_state_info['jump_stack'].push_back({'timeline':dialogic.current_timeline, 'index':dialogic.current_event_idx, 'label':dialogic.current_timeline_events[dialogic.current_event_idx].label_name})
|
||
|
|
||
|
|
||
|
func resume_from_last_jump() -> void:
|
||
|
var sub_timeline: DialogicTimeline = dialogic.current_timeline
|
||
|
var stack_info: Dictionary = dialogic.current_state_info['jump_stack'].pop_back()
|
||
|
dialogic.start_timeline(stack_info.timeline, stack_info.index+1)
|
||
|
returned_from_jump.emit({'sub_timeline':sub_timeline, 'label':stack_info.label})
|
||
|
|
||
|
|
||
|
func is_jump_stack_empty() -> bool:
|
||
|
return len(dialogic.current_state_info['jump_stack']) < 1
|
||
|
|
||
|
#endregion
|
||
|
|
||
|
|
||
|
#region MAIN MEHTODS LABELS
|
||
|
####################################################################################################
|
||
|
|
||
|
func _ready() -> void:
|
||
|
passed_label.connect(_on_passed_label)
|
||
|
|
||
|
|
||
|
func _on_passed_label(info:Dictionary) -> void:
|
||
|
dialogic.current_state_info["last_label"] = info
|
||
|
|
||
|
|
||
|
## Returns the identifier name of the last passed label
|
||
|
func get_last_label_identifier() -> String:
|
||
|
if not dialogic.current_state_info.has("last_label"):
|
||
|
return ""
|
||
|
|
||
|
return dialogic.current_state_info["last_label"].identifier
|
||
|
|
||
|
|
||
|
## Returns the display name of the last passed label (translated if translation are enabled)
|
||
|
func get_last_label_name() -> String:
|
||
|
if not dialogic.current_state_info.has("last_label"):
|
||
|
return ""
|
||
|
|
||
|
return dialogic.current_state_info["last_label"].display_name
|
||
|
#endregion
|