summaryrefslogtreecommitdiffstats
path: root/scripts/PlayerCharacter.gd
diff options
context:
space:
mode:
authorJan Tuomi <jan.tuomi@valuemotive.com>2020-08-08 21:35:15 +0300
committerJan Tuomi <jan.tuomi@valuemotive.com>2020-08-08 21:35:15 +0300
commitbc72e9a407db4fcc830450c112de90f5d1c251a9 (patch)
tree6e9787e3e144243146687e8c39c8e6644946fbe3 /scripts/PlayerCharacter.gd
parentc438ce2976c4dda931918c019a25e00104d0cbc2 (diff)
Improve dialogue system
Diffstat (limited to 'scripts/PlayerCharacter.gd')
-rw-r--r--scripts/PlayerCharacter.gd34
1 files changed, 24 insertions, 10 deletions
diff --git a/scripts/PlayerCharacter.gd b/scripts/PlayerCharacter.gd
index a4c902d..15b3421 100644
--- a/scripts/PlayerCharacter.gd
+++ b/scripts/PlayerCharacter.gd
@@ -3,14 +3,26 @@ class_name PlayerCharacter
export (int) var speed = 8
export (float) var walk_wobble_coeff = 5
-export (NodePath) var gui_node
+onready var gui: GUI = get_tree().get_root().get_node("Game/CanvasLayer/GUI")
+onready var game: Game = get_tree().get_root().get_node("Game")
signal initiate_dialogue(other)
-signal end_dialogue()
var velocity = Vector2()
var look_dir = 1 # right = 1, left = -1
var in_dialogue: bool = false
+enum DialogueState {
+ ACTIVE, # when dialogue in progress with a target
+ ENDED, # when dialogue exhausted via GUI
+ WALKED_OFF # when character moves out from dialogue target
+}
+var dialogue_state = DialogueState.WALKED_OFF
+
+func _ready():
+ yield(get_tree(), "idle_frame")
+ var err = game.connect("dialogue_end", self, "_on_Game_dialogue_end")
+ if err:
+ push_error(err)
func update_input_and_movement():
velocity = Vector2()
@@ -45,19 +57,21 @@ func _process(_delta):
$Sprite.set_scale(Vector2(look_dir, 1))
func _physics_process(_delta):
- update_input_and_movement()
- var slide_count = get_slide_count()
+ if dialogue_state != DialogueState.ACTIVE:
+ update_input_and_movement()
- # If there are no collisions, player must have exited dialogue
- if slide_count == 0 and in_dialogue:
- in_dialogue = false
- emit_signal("end_dialogue")
+ var slide_count = get_slide_count()
+ if slide_count == 0 and dialogue_state == DialogueState.ENDED:
+ dialogue_state = DialogueState.WALKED_OFF
# If the player is colliding with a Dialogue group node and does not have an
# active dialogue, run dialogue with the node
for idx in slide_count:
var coll = get_slide_collision(idx)
- if coll.collider.is_in_group("Dialogue") and not in_dialogue:
- in_dialogue = true
+ if coll.collider.is_in_group("Dialogue") and dialogue_state == DialogueState.WALKED_OFF:
+ dialogue_state = DialogueState.ACTIVE
emit_signal("initiate_dialogue", coll.collider)
break
+
+func _on_Game_dialogue_end():
+ dialogue_state = DialogueState.ENDED