]> Untitled Git - wolf-seeking-sheep.git/blob - classes/gameplay/Scene.gd
Updated export config options
[wolf-seeking-sheep.git] / classes / gameplay / Scene.gd
1 class_name Scene
2 extends Node3D
3
4 ### globals
5
6 @export var next_scene: PackedScene
7 @export var starting_dialogue: DialogicTimeline = null
8
9 @onready var _player := %Player
10 @onready var _prompt := %prompt
11
12 ### overrides
13
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)
20         
21         if starting_dialogue:
22                 _start_dialogue(starting_dialogue)
23
24
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
32                 else:
33                         get_tree().quit()
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)
40                 else:
41                         _player.toggle_phone_out()
42
43 ### dialogue functions
44
45 func _on_dialogic_signal(arg):
46         print("Got Dialogic signal: " + str(arg))
47         if arg is String:
48                 match arg:
49                         "next_scene":
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
57                         ).front()
58                         if node == null:
59                                 print_debug("Couldn't find a node with the name: " + pos_name)
60                         else:
61                                 _player.global_position = node.global_position
62
63                 if "player_rotation" in arg:
64                         _player.global_rotation.y = arg["player_rotation"]
65
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
71                         ).front()
72                         if node == null:
73                                 print_debug("Couldn't find a node with the name: " + pos_name)
74                         else:
75                                 _player.camera_look_at(node.global_position, arg.get("lookat_snap", false))
76                 
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
81                         ).front()
82                         if trigger == null:
83                                 print_debug("Couldn't find a trigger with the name: " + trigger_name)
84                         else:
85                                 trigger.monitoring = true
86
87
88 func _on_dialogic_text_signal(_arg:String):
89         pass
90
91
92 func _start_dialogue(timeline: DialogicTimeline, lookAt: Node3D = null) -> bool:
93         # if lookAt node is provided, player should look in that direction
94         if lookAt != null:
95                 _player.camera_look_at(lookAt.global_position)
96
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()
101                 return true
102         return false
103
104
105 func _on_dialogue_trigger_body_entered(trigger: DialogueTrigger, _body: Node3D) -> void:
106         _start_dialogue(trigger.timeline, trigger)
107
108
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
116
117
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
123
124 ### actionable functions
125
126 func _on_player_found_actionable_node(node: Node3D) -> void:
127         _prompt.text = "[center]" + node.get("prompt")
128         _prompt.visible = true
129
130
131 func _on_player_no_actionable_node() -> void:
132         _prompt.visible = false