From 91186fa610ddde210710a99c63550b8c67926ed3 Mon Sep 17 00:00:00 2001 From: Dustin Date: Tue, 17 Jun 2025 16:25:52 -0700 Subject: [PATCH] More in game dialog work. --- assets/portraits/default.png | Bin 0 -> 3305 bytes .../default.png.import} | 6 +-- assets/text/dialog/WarriorGirl_Intro.tres | 9 +++++ {assets => assets_tmp}/MManPortrait.png | Bin assets_tmp/MManPortrait.png.import | 35 ++++++++++++++++ lib/singleton_autoloads/UIManager.gd | 38 ++++++++++++++++-- project.godot | 6 +++ src/Interactables/interactable_npc_dialog.gd | 27 +++++++++++-- src/actors/npcs/WarriorGirl/WarriorGirl.gd | 1 + src/actors/npcs/WarriorGirl/WarriorGirl.tscn | 4 +- src/actors/players/playerE/PlayerE.gd | 1 + src/classes/dialog_item.gd | 20 +++++++++ src/ui/HUD.gd | 6 +++ 13 files changed, 142 insertions(+), 11 deletions(-) create mode 100644 assets/portraits/default.png rename assets/{MManPortrait.png.import => portraits/default.png.import} (70%) create mode 100644 assets/text/dialog/WarriorGirl_Intro.tres rename {assets => assets_tmp}/MManPortrait.png (100%) create mode 100644 assets_tmp/MManPortrait.png.import create mode 100644 src/classes/dialog_item.gd diff --git a/assets/portraits/default.png b/assets/portraits/default.png new file mode 100644 index 0000000000000000000000000000000000000000..c98fbb601c83c81ec8c22b1dba7d1d57c62b323c GIT binary patch literal 3305 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 literal 0 HcmV?d00001 diff --git a/assets/MManPortrait.png.import b/assets/portraits/default.png.import similarity index 70% rename from assets/MManPortrait.png.import rename to assets/portraits/default.png.import index 53014f9..8e77c84 100644 --- a/assets/MManPortrait.png.import +++ b/assets/portraits/default.png.import @@ -2,15 +2,15 @@ importer="texture" type="StreamTexture" -path="res://.import/MManPortrait.png-4e2ec0d6412baee3672a65d68519d9e1.stex" +path="res://.import/default.png-88b8771544923be91ca280c327742454.stex" metadata={ "vram_texture": false } [deps] -source_file="res://assets/MManPortrait.png" -dest_files=[ "res://.import/MManPortrait.png-4e2ec0d6412baee3672a65d68519d9e1.stex" ] +source_file="res://assets/portraits/default.png" +dest_files=[ "res://.import/default.png-88b8771544923be91ca280c327742454.stex" ] [params] diff --git a/assets/text/dialog/WarriorGirl_Intro.tres b/assets/text/dialog/WarriorGirl_Intro.tres new file mode 100644 index 0000000..0ba90fd --- /dev/null +++ b/assets/text/dialog/WarriorGirl_Intro.tres @@ -0,0 +1,9 @@ +[gd_resource type="Resource" load_steps=3 format=2] + +[ext_resource path="res://src/classes/dialog_item.gd" type="Script" id=1] +[ext_resource path="res://assets_tmp/MManPortrait.png" type="Texture" id=2] + +[resource] +script = ExtResource( 1 ) +portrait = ExtResource( 2 ) +text_lines = PoolStringArray( "Hey there. I heard you\'re Gangsta.", "Well I\'m pretty gangsta myself!" ) diff --git a/assets/MManPortrait.png b/assets_tmp/MManPortrait.png similarity index 100% rename from assets/MManPortrait.png rename to assets_tmp/MManPortrait.png diff --git a/assets_tmp/MManPortrait.png.import b/assets_tmp/MManPortrait.png.import new file mode 100644 index 0000000..482c006 --- /dev/null +++ b/assets_tmp/MManPortrait.png.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/MManPortrait.png-c012ca0947bb1e1b73c5a27d8f73a91f.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets_tmp/MManPortrait.png" +dest_files=[ "res://.import/MManPortrait.png-c012ca0947bb1e1b73c5a27d8f73a91f.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +process/normal_map_invert_y=false +stream=false +size_limit=0 +detect_3d=true +svg/scale=1.0 diff --git a/lib/singleton_autoloads/UIManager.gd b/lib/singleton_autoloads/UIManager.gd index cefe39b..0f283be 100644 --- a/lib/singleton_autoloads/UIManager.gd +++ b/lib/singleton_autoloads/UIManager.gd @@ -11,6 +11,13 @@ var current_pane = UI_PANES.OFF var debug_text :String +var _dialog_item :DialogItem + +var playing_dialog :bool = false +var current_dialog_index :int + +signal ui_change() + # Declare member variables here. Examples: # var a = 2 # var b = "text" @@ -20,9 +27,32 @@ var debug_text :String func _ready(): pass # Replace with function body. +func play_dialog_item(dialog_item :DialogItem, dialog_index :int = 0): + _dialog_item = dialog_item + if _dialog_item.text_lines.size() > 0: + current_dialog_index = dialog_index + playing_dialog = true + dialog_text = _dialog_item.text_lines[current_dialog_index] + dialog_portrait = _dialog_item.portrait + current_pane = UI_PANES.DIALOG + emit_signal("ui_change") + + +func stop_dialog(): + dialog_text = 'foo' + current_pane = UI_PANES.HUD + emit_signal("ui_change") # Called every frame. 'delta' is the elapsed time since the previous frame. -#func _process(delta): -# debug_text = '' -# for _player_id in NetworkManager.get_player_ids(): -# debug_text += str(_player_id) + '\n' +func _process(delta): + if playing_dialog: + var foo = '' + ##TODO: Lockout input on player before dialog happens. + if Input.is_action_just_pressed("crouch_1"): + if _dialog_item.text_lines.size() > (current_dialog_index + 1): + current_dialog_index += 1 + dialog_text = _dialog_item.text_lines[current_dialog_index] + dialog_portrait = _dialog_item.portrait + emit_signal("ui_change") + else: + stop_dialog() diff --git a/project.godot b/project.godot index 647b941..7bb2dfe 100644 --- a/project.godot +++ b/project.godot @@ -35,6 +35,11 @@ _global_script_classes=[ { "path": "res://lib/classes/collision_shape2D_state_receiver.gd" }, { "base": "Resource", +"class": "DialogItem", +"language": "GDScript", +"path": "res://src/classes/dialog_item.gd" +}, { +"base": "Resource", "class": "GameSettings", "language": "GDScript", "path": "res://src/game_settings.gd" @@ -185,6 +190,7 @@ _global_script_class_icons={ "AudioStreamPlayer_StateReceiver": "", "CameraGuide": "", "CollisionShape2D_StateReceiver": "", +"DialogItem": "", "GameSettings": "", "HealthComponent": "", "HealthPickup": "", diff --git a/src/Interactables/interactable_npc_dialog.gd b/src/Interactables/interactable_npc_dialog.gd index 034070f..38298f9 100644 --- a/src/Interactables/interactable_npc_dialog.gd +++ b/src/Interactables/interactable_npc_dialog.gd @@ -8,10 +8,31 @@ extends Interactable export (String) var dialog_text export (bool) var auto_start = false -# Called when the node enters the scene tree for the first time. -#func _ready(): -# pass # Replace with function body. +export (Array, Resource) var dialog_items +# Called when the node enters the scene tree for the first time. +func _ready(): + assert(verify_resources(), "Dialog contains invalid resources") + +func verify_resources() -> bool: + for r in dialog_items: + if not r is DialogItem: + return false + return true + +func trigger_interaction(): + var dialog :DialogItem = dialog_items[0] +# UiManager.dialog_text = dialog.text_lines[0] +# UiManager.dialog_portrait = dialog.portrait +# UiManager.current_pane = UiManager.UI_PANES.DIALOG + UiManager.play_dialog_item(dialog) + +func disable_dialog(): + UiManager.current_pane = UiManager.UI_PANES.HUD + +func _on_Interactable_Component_body_exited(body): + ._on_Interactable_Component_body_exited(body) + disable_dialog() # Called every frame. 'delta' is the elapsed time since the previous frame. #func _process(delta): diff --git a/src/actors/npcs/WarriorGirl/WarriorGirl.gd b/src/actors/npcs/WarriorGirl/WarriorGirl.gd index 0a5c292..f3217b2 100644 --- a/src/actors/npcs/WarriorGirl/WarriorGirl.gd +++ b/src/actors/npcs/WarriorGirl/WarriorGirl.gd @@ -22,3 +22,4 @@ func _on_NPC_Dialog_body_entered(body): func _on_NPC_Dialog_body_exited(body): movement_state_machine.change_to_known_state("default") + diff --git a/src/actors/npcs/WarriorGirl/WarriorGirl.tscn b/src/actors/npcs/WarriorGirl/WarriorGirl.tscn index bbb2eb4..68556b3 100644 --- a/src/actors/npcs/WarriorGirl/WarriorGirl.tscn +++ b/src/actors/npcs/WarriorGirl/WarriorGirl.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=9 format=2] +[gd_scene load_steps=10 format=2] [ext_resource path="res://lib/parent_scenes/actor.tscn" type="PackedScene" id=1] [ext_resource path="res://assets/actors/npcs/WarriorGirl/WarriorGirl.tres" type="SpriteFrames" id=2] @@ -6,6 +6,7 @@ [ext_resource path="res://src/Interactables/interactable_npc_dialog.tscn" type="PackedScene" id=4] [ext_resource path="res://src/actors/npcs/WarriorGirl/WarriorGirl.gd" type="Script" id=5] [ext_resource path="res://src/actors/npcs/draw_sword.tres" type="Resource" id=6] +[ext_resource path="res://assets/text/dialog/WarriorGirl_Intro.tres" type="Resource" id=7] [sub_resource type="RectangleShape2D" id=1] extents = Vector2( 9, 14 ) @@ -34,6 +35,7 @@ shape = SubResource( 1 ) [node name="NPC_Dialog" parent="." index="5" instance=ExtResource( 4 )] collision_mask = 2 dialog_text = "Hello, I am a human." +dialog_items = [ ExtResource( 7 ) ] [node name="CollisionShape2D" type="CollisionShape2D" parent="NPC_Dialog" index="0"] modulate = Color( 0, 1, 0, 1 ) diff --git a/src/actors/players/playerE/PlayerE.gd b/src/actors/players/playerE/PlayerE.gd index 0a0aa01..b2f5741 100644 --- a/src/actors/players/playerE/PlayerE.gd +++ b/src/actors/players/playerE/PlayerE.gd @@ -147,6 +147,7 @@ func touch_the_thing(the_thing: Interactable) -> bool: if the_thing is Interactable_NPC_Dialog: ## Get this to the UI mananger print("NPC wants to say: ",the_thing.dialog_text) + the_thing.trigger_interaction() return true diff --git a/src/classes/dialog_item.gd b/src/classes/dialog_item.gd new file mode 100644 index 0000000..872f905 --- /dev/null +++ b/src/classes/dialog_item.gd @@ -0,0 +1,20 @@ +class_name DialogItem +extends Resource + +# Declare member variables here. Examples: +# var a = 2 +# var b = "text" + +export(Texture) var portrait +export(PoolStringArray) var text_lines + +# Called when the node enters the scene tree for the first time. +func _ready(): + ##TODO: I forgot the better way to determine a valid item is null or empty + if portrait == null: + push_warning("No protrait defined for dialog item.") + + +# Called every frame. 'delta' is the elapsed time since the previous frame. +#func _process(delta): +# pass diff --git a/src/ui/HUD.gd b/src/ui/HUD.gd index 4d29acd..a1d9e62 100644 --- a/src/ui/HUD.gd +++ b/src/ui/HUD.gd @@ -37,6 +37,8 @@ func _ready(): tween.tween_property(DialogIndicator, "modulate", Color.darkgray, 1) tween.tween_property(DialogIndicator, "modulate", Color.white , 1) ##tween.tween_property(DialogIndicator, "modulate", Color.RED, 1) + UiManager.connect("ui_change",self,"reset_current_pane_tracker") + # Called every frame. 'delta' is the elapsed time since the previous frame. func _process(delta): @@ -64,3 +66,7 @@ func _unhandled_input(event): if current_pane == UiManager.UI_PANES.DIALOG and Input.is_action_just_pressed("ui_accept"): UiManager.current_pane = UiManager.UI_PANES.HUD #get_tree().paused = false + +func reset_current_pane_tracker(): + current_pane = 0 +