6 @export var next_scene: PackedScene
7 @export var starting_dialogue: DialogicTimeline = null
9 @onready var _player := %Player
10 @onready var _prompt := %prompt
14 func _ready() -> void:
15 # hook up Dialogic timeline signals to togger player control
16 Dialogic.timeline_started.connect(_dialogic_timeline_start)
17 Dialogic.timeline_ended.connect(_dialogic_timeline_end)
18 Dialogic.signal_event.connect(_on_dialogic_signal)
19 Dialogic.text_signal.connect(_on_dialogic_text_signal)
22 _start_dialogue(starting_dialogue)
25 func _input(event: InputEvent):
26 if event.is_action_pressed("capture_input"):
27 if Dialogic.current_timeline == null:
28 Input.mouse_mode = Input.MOUSE_MODE_CAPTURED
29 elif event.is_action_pressed("ui_cancel"):
30 if Input.mouse_mode == Input.MOUSE_MODE_CAPTURED:
31 Input.mouse_mode = Input.MOUSE_MODE_VISIBLE
34 elif event.is_action_pressed("player-action"):
35 if _player.actionable_node:
36 # TODO: player may have different actions than dialogue!
37 var timeline: DialogicTimeline = _player.actionable_node.get_next_dialogue()
38 var lookAt: Node3D = _player.actionable_node.get_tree().get_first_node_in_group("LookAt")
39 _start_dialogue(timeline, lookAt if lookAt else _player.actionable_node)
41 _player.toggle_phone_out()
43 ### dialogue functions
45 func _on_dialogic_signal(arg):
46 print("Got Dialogic signal: " + str(arg))
50 get_tree().change_scene_to_packed(next_scene)
51 elif arg is Dictionary:
52 if "player_position" in arg:
53 # move player to global position of node3D object
54 var pos_name: String = arg["player_position"]
55 var node: Node3D = get_tree().get_nodes_in_group("Location").filter(
56 func (loc): return loc.name == pos_name
59 print_debug("Couldn't find a node with the name: " + pos_name)
61 _player.global_position = node.global_position
63 if "player_rotation" in arg:
64 _player.global_rotation.y = arg["player_rotation"]
66 if "player_lookat" in arg:
67 # move player to global position of node3D object
68 var pos_name: String = arg["player_lookat"]
69 var node: Node3D = get_tree().get_nodes_in_group("LookAt").filter(
70 func (loc): return loc.name == pos_name
73 print_debug("Couldn't find a node with the name: " + pos_name)
75 _player.camera_look_at(node.global_position, arg.get("lookat_snap", false))
77 if "enable_trigger" in arg:
78 var trigger_name: String = arg["enable_trigger"]
79 var trigger: Trigger = get_tree().get_nodes_in_group("Trigger").filter(
80 func (t): return t.name == trigger_name
83 print_debug("Couldn't find a trigger with the name: " + trigger_name)
85 trigger.monitoring = true
88 func _on_dialogic_text_signal(_arg:String):
92 func _start_dialogue(timeline: DialogicTimeline, lookAt: Node3D = null) -> bool:
93 # if lookAt node is provided, player should look in that direction
95 _player.camera_look_at(lookAt.global_position)
97 # if dialogic timeline is not running, start a new one
98 if Dialogic.current_timeline == null:
99 Dialogic.start(timeline)
100 get_viewport().set_input_as_handled()
105 func _on_dialogue_trigger_body_entered(trigger: DialogueTrigger, _body: Node3D) -> void:
106 _start_dialogue(trigger.timeline, trigger)
109 func _dialogic_timeline_start() -> void:
110 print("Dialogue started")
111 _player.movement_enabled = false
112 _player.camera_movement_enabled = false
113 _player.phone_out(false)
114 _player.velocity = Vector3.ZERO
115 Input.mouse_mode = Input.MOUSE_MODE_VISIBLE
118 func _dialogic_timeline_end() -> void:
119 print("Dialogue ended")
120 Input.mouse_mode = Input.MOUSE_MODE_CAPTURED
121 _player.movement_enabled = true
122 _player.camera_movement_enabled = true
124 ### actionable functions
126 func _on_player_found_actionable_node(node: Node3D) -> void:
127 _prompt.text = "[center]" + node.get("prompt")
128 _prompt.visible = true
131 func _on_player_no_actionable_node() -> void:
132 _prompt.visible = false