diff options
| author | Jan Tuomi <jan.tuomi@valuemotive.com> | 2020-08-08 21:35:15 +0300 |
|---|---|---|
| committer | Jan Tuomi <jan.tuomi@valuemotive.com> | 2020-08-08 21:35:15 +0300 |
| commit | bc72e9a407db4fcc830450c112de90f5d1c251a9 (patch) | |
| tree | 6e9787e3e144243146687e8c39c8e6644946fbe3 /scripts/PlayerCharacter.gd | |
| parent | c438ce2976c4dda931918c019a25e00104d0cbc2 (diff) | |
Improve dialogue system
Diffstat (limited to 'scripts/PlayerCharacter.gd')
| -rw-r--r-- | scripts/PlayerCharacter.gd | 34 |
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 |
