From b433c3126115fabab914d0e0adb5028d82ab1053 Mon Sep 17 00:00:00 2001 From: Kayne Ruse Date: Mon, 16 Mar 2026 08:57:53 +1100 Subject: [PATCH] Basic dialog system working --- ArrowGirl/ArrowGirl.gd | 10 ++-------- ArrowGirl/ArrowGirl.tscn | 5 ++--- BoxBoy/BoxBoy.gd | 6 +++--- Controllers/DialogController.gd | 25 +++++++++++++++++++++++-- Controllers/GameplayController.gd | 8 +++++++- DialogText.gd | 3 +-- project.godot | 14 +++++++------- 7 files changed, 45 insertions(+), 26 deletions(-) diff --git a/ArrowGirl/ArrowGirl.gd b/ArrowGirl/ArrowGirl.gd index d33cac2..acfae68 100644 --- a/ArrowGirl/ArrowGirl.gd +++ b/ArrowGirl/ArrowGirl.gd @@ -1,8 +1,7 @@ class_name ArrowGirl extends Area2D @onready var _sprite = $AnimatedSprite2D -var dialog_text = preload("res://DialogDebug_1.tres") -var dialog_counter: int = 0 +var dialog_text: DialogText = preload("res://DialogDebug_1.tres") #boilerplate func _ready(): @@ -17,9 +16,4 @@ func _on_animation_finished() -> void: func _on_body_entered(body) -> void: if body is BoxBoy: - %DialogController.set_dialog(dialog_text.get_line_raw(dialog_counter), 0.2) - dialog_counter += 1 - -func _on_body_exited(body) -> void: - if body is BoxBoy: - %DialogController.set_dialog("") + %DialogController.set_dialog_text(dialog_text, 0.2) diff --git a/ArrowGirl/ArrowGirl.tscn b/ArrowGirl/ArrowGirl.tscn index 95bc1f3..bbddd04 100644 --- a/ArrowGirl/ArrowGirl.tscn +++ b/ArrowGirl/ArrowGirl.tscn @@ -38,7 +38,7 @@ animations = [{ }] [sub_resource type="RectangleShape2D" id="RectangleShape2D_53v1e"] -size = Vector2(32, 32) +size = Vector2(32, 96) [node name="ArrowGirl" type="Area2D" unique_id=869288979] script = ExtResource("1_53v1e") @@ -49,10 +49,9 @@ animation = &"idle_glance" metadata/_edit_lock_ = true [node name="CollisionShape2D" type="CollisionShape2D" parent="." unique_id=1190138841] -visible = false +position = Vector2(0, -32) shape = SubResource("RectangleShape2D_53v1e") metadata/_edit_lock_ = true [connection signal="body_entered" from="." to="." method="_on_body_entered"] -[connection signal="body_exited" from="." to="." method="_on_body_exited"] [connection signal="animation_finished" from="AnimatedSprite2D" to="." method="_on_animation_finished"] diff --git a/BoxBoy/BoxBoy.gd b/BoxBoy/BoxBoy.gd index aa0e23f..a702252 100644 --- a/BoxBoy/BoxBoy.gd +++ b/BoxBoy/BoxBoy.gd @@ -33,7 +33,7 @@ func _physics_process(_delta) -> void: buffer_grounded -= 1 #jump buffering - if Input.is_action_just_pressed("input_jump"): + if %GameplayController.input_enabled and Input.is_action_just_pressed("input_jump"): buffer_jumping = 6 else: buffer_jumping -= 1 @@ -45,7 +45,7 @@ func _physics_process(_delta) -> void: buffer_jumping = 0 #normally, fall faster than you rise - elif velocity.y < 0 and (Input.is_action_pressed("input_jump") or just_bounced): + elif ((%GameplayController.input_enabled and Input.is_action_pressed("input_jump")) or just_bounced) and velocity.y < 0: velocity.y += GRAVITY_RISING else: velocity.y += GRAVITY_FALLING @@ -54,7 +54,7 @@ func _physics_process(_delta) -> void: #sideways movement var move_dir = Input.get_axis("input_left", "input_right") - if move_dir: + if %GameplayController.input_enabled and move_dir: _sprite.flip_h = move_dir < 0 #fancy HD 4K graphics velocity.x += MOVE_FORCE * move_dir diff --git a/Controllers/DialogController.gd b/Controllers/DialogController.gd index fb8f675..7df8031 100644 --- a/Controllers/DialogController.gd +++ b/Controllers/DialogController.gd @@ -3,16 +3,37 @@ extends Node @export var dialogContainer: MarginContainer @export var dialogTextLabel: RichTextLabel -func set_dialog(text: String, seconds: float = 1) -> void: +var _current_dialog_counter: int = 0 +var _current_dialog_text: DialogText = null +var _current_dialog_seconds: float = 1 + +func set_dialog_text(dialog_text: DialogText, seconds: float = 1) -> void: + _current_dialog_counter = -1 + _current_dialog_text = dialog_text + _current_dialog_seconds = seconds + _next_dialog_line() + +func _next_dialog_line() -> void: + _current_dialog_counter += 1 + set_dialog_line(_current_dialog_text.get_line_raw(_current_dialog_counter), _current_dialog_seconds) + +func _process(_delta: float) -> void: + if Input.is_action_just_pressed("ui_accept") and _current_dialog_text: + _next_dialog_line() + +func set_dialog_line(text: String, seconds: float = 1) -> void: dialogTextLabel.text = text dialogTextLabel.visible_ratio = 0 var ratio: float = 0 if text.length() == 0: dialogContainer.visible = false - return + %GameplayController.input_enabled = true + _current_dialog_text = null + return #a hacky way to clear the dialog box else: dialogContainer.visible = true + %GameplayController.input_enabled = false var increment: float = (1 / seconds)/ 60.0 diff --git a/Controllers/GameplayController.gd b/Controllers/GameplayController.gd index e19c1b3..caa6c6b 100644 --- a/Controllers/GameplayController.gd +++ b/Controllers/GameplayController.gd @@ -9,8 +9,14 @@ const LOREM_IPSUM = [ "", ] +static var input_enabled: bool = true: + get(): + return input_enabled + set(value): + input_enabled = value + static var godmode: bool = false: - get: + get(): return godmode func _process(_delta: float) -> void: diff --git a/DialogText.gd b/DialogText.gd index e956260..a976926 100644 --- a/DialogText.gd +++ b/DialogText.gd @@ -1,7 +1,6 @@ class_name DialogText extends Resource -#contains the raw text info, allows you to iterate through it line-by-line -#only parse text once +##Contains raw text for dialog boxes, and allows you to iterate through it line-by-line. @export_multiline() var text: String var _content: Array = [] diff --git a/project.godot b/project.godot index b6255b3..4f0a69e 100644 --- a/project.godot +++ b/project.godot @@ -29,29 +29,29 @@ window/subwindows/embed_subwindows=false input_right={ "deadzone": 0.2, -"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":4194321,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null) -, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":68,"key_label":0,"unicode":100,"location":0,"echo":false,"script":null) +"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":4194321,"physical_keycode":0,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null) +, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":68,"physical_keycode":0,"key_label":0,"unicode":100,"location":0,"echo":false,"script":null) ] } input_left={ "deadzone": 0.2, -"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":4194319,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null) -, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":65,"key_label":0,"unicode":97,"location":0,"echo":false,"script":null) +"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":4194319,"physical_keycode":0,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null) +, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":65,"physical_keycode":0,"key_label":0,"unicode":97,"location":0,"echo":false,"script":null) ] } input_jump={ "deadzone": 0.2, -"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":32,"key_label":0,"unicode":32,"location":0,"echo":false,"script":null) +"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":32,"physical_keycode":0,"key_label":0,"unicode":32,"location":0,"echo":false,"script":null) ] } controller_godmode={ "deadzone": 0.2, -"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":true,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":71,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null) +"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"command_or_control_autoremap":true,"alt_pressed":false,"shift_pressed":false,"pressed":false,"keycode":71,"physical_keycode":0,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null) ] } controller_dialog={ "deadzone": 0.2, -"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":true,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":68,"key_label":0,"unicode":100,"location":0,"echo":false,"script":null) +"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"command_or_control_autoremap":true,"alt_pressed":false,"shift_pressed":false,"pressed":false,"keycode":68,"physical_keycode":0,"key_label":0,"unicode":100,"location":0,"echo":false,"script":null) ] }