update dialogic
This commit is contained in:
parent
e14eb9eb1d
commit
91fa0160d2
68 changed files with 851 additions and 976 deletions
|
@ -1,60 +1,18 @@
|
|||
[gd_scene load_steps=14 format=2]
|
||||
[gd_scene load_steps=8 format=2]
|
||||
|
||||
[ext_resource path="res://addons/dialogic/Example Assets/next-indicator/next-indicator.png" type="Texture" id=1]
|
||||
[ext_resource path="res://addons/dialogic/Example Assets/backgrounds/background-2.png" type="Texture" id=2]
|
||||
[ext_resource path="res://addons/dialogic/Example Assets/Fonts/DefaultFont.tres" type="DynamicFont" id=3]
|
||||
[ext_resource path="res://addons/dialogic/Nodes/TextBubble.tscn" type="PackedScene" id=1]
|
||||
[ext_resource path="res://addons/dialogic/Example Assets/Fonts/GlossaryFont.tres" type="DynamicFont" id=4]
|
||||
[ext_resource path="res://addons/dialogic/Nodes/glossary_info.gd" type="Script" id=5]
|
||||
[ext_resource path="res://addons/dialogic/Nodes/dialog_node.gd" type="Script" id=6]
|
||||
[ext_resource path="res://addons/dialogic/Nodes/BackgroundMusic.tscn" type="PackedScene" id=7]
|
||||
|
||||
[sub_resource type="StyleBoxFlat" id=2]
|
||||
bg_color = Color( 0.196078, 0.196078, 0.196078, 0 )
|
||||
|
||||
[sub_resource type="StyleBoxFlat" id=1]
|
||||
bg_color = Color( 1, 1, 1, 0 )
|
||||
expand_margin_left = 10.0
|
||||
|
||||
[sub_resource type="Animation" id=2]
|
||||
resource_name = "Pulse"
|
||||
loop = true
|
||||
tracks/0/type = "value"
|
||||
tracks/0/path = NodePath(".:self_modulate")
|
||||
tracks/0/interp = 2
|
||||
tracks/0/loop_wrap = true
|
||||
tracks/0/imported = false
|
||||
tracks/0/enabled = true
|
||||
tracks/0/keys = {
|
||||
"times": PoolRealArray( 0, 0.5 ),
|
||||
"transitions": PoolRealArray( 1, 1 ),
|
||||
"update": 0,
|
||||
"values": [ Color( 1, 1, 1, 1 ), Color( 1, 1, 1, 0 ) ]
|
||||
}
|
||||
|
||||
[sub_resource type="Animation" id=3]
|
||||
resource_name = "Static"
|
||||
|
||||
[sub_resource type="Animation" id=4]
|
||||
loop = true
|
||||
tracks/0/type = "value"
|
||||
tracks/0/path = NodePath(".:margin_bottom")
|
||||
tracks/0/interp = 2
|
||||
tracks/0/loop_wrap = true
|
||||
tracks/0/imported = false
|
||||
tracks/0/enabled = true
|
||||
tracks/0/keys = {
|
||||
"times": PoolRealArray( 0, 0.5 ),
|
||||
"transitions": PoolRealArray( 1, 1 ),
|
||||
"update": 0,
|
||||
"values": [ 12.0, 55.0 ]
|
||||
}
|
||||
|
||||
[sub_resource type="StyleBoxFlat" id=5]
|
||||
content_margin_left = 10.0
|
||||
content_margin_right = 10.0
|
||||
bg_color = Color( 1, 1, 1, 0 )
|
||||
expand_margin_left = 10.0
|
||||
|
||||
[sub_resource type="StyleBoxFlat" id=6]
|
||||
bg_color = Color( 0.196078, 0.196078, 0.196078, 0 )
|
||||
|
||||
[node name="DialogNode" type="Control"]
|
||||
anchor_right = 1.0
|
||||
anchor_bottom = 1.0
|
||||
|
@ -63,16 +21,6 @@ __meta__ = {
|
|||
"_edit_use_anchors_": false
|
||||
}
|
||||
|
||||
[node name="Background" type="TextureRect" parent="."]
|
||||
visible = false
|
||||
anchor_right = 1.0
|
||||
anchor_bottom = 1.0
|
||||
expand = true
|
||||
stretch_mode = 1
|
||||
__meta__ = {
|
||||
"_edit_use_anchors_": false
|
||||
}
|
||||
|
||||
[node name="Portraits" type="Control" parent="."]
|
||||
anchor_left = 0.5
|
||||
anchor_top = 1.0
|
||||
|
@ -82,174 +30,20 @@ __meta__ = {
|
|||
"_edit_use_anchors_": false
|
||||
}
|
||||
|
||||
[node name="TextBubble" type="Control" parent="."]
|
||||
anchor_left = 0.5
|
||||
anchor_top = 1.0
|
||||
anchor_right = 0.5
|
||||
anchor_bottom = 1.0
|
||||
margin_left = -455.0
|
||||
margin_top = -207.0
|
||||
margin_right = 455.0
|
||||
margin_bottom = -40.0
|
||||
__meta__ = {
|
||||
"_edit_use_anchors_": false
|
||||
}
|
||||
|
||||
[node name="ColorRect" type="ColorRect" parent="TextBubble"]
|
||||
visible = false
|
||||
anchor_right = 1.0
|
||||
anchor_bottom = 1.0
|
||||
color = Color( 0, 0, 0, 1 )
|
||||
__meta__ = {
|
||||
"_edit_use_anchors_": false
|
||||
}
|
||||
|
||||
[node name="TextureRect" type="TextureRect" parent="TextBubble"]
|
||||
anchor_right = 1.0
|
||||
anchor_bottom = 1.0
|
||||
texture = ExtResource( 2 )
|
||||
expand = true
|
||||
stretch_mode = 1
|
||||
__meta__ = {
|
||||
"_edit_use_anchors_": false
|
||||
}
|
||||
|
||||
[node name="RichTextLabel" type="RichTextLabel" parent="TextBubble"]
|
||||
anchor_right = 1.0
|
||||
anchor_bottom = 1.0
|
||||
margin_left = 20.0
|
||||
margin_top = 10.0
|
||||
margin_right = -20.0
|
||||
margin_bottom = -10.0
|
||||
rect_clip_content = false
|
||||
custom_styles/normal = SubResource( 1 )
|
||||
custom_fonts/normal_font = ExtResource( 3 )
|
||||
custom_colors/default_color = Color( 1, 1, 1, 1 )
|
||||
custom_colors/font_color_shadow = Color( 1, 1, 1, 0 )
|
||||
custom_constants/shadow_offset_x = 2
|
||||
custom_constants/shadow_offset_y = 2
|
||||
bbcode_enabled = true
|
||||
bbcode_text = "Placeholder text for testing and formatting."
|
||||
meta_underlined = false
|
||||
text = "Placeholder text for testing and formatting."
|
||||
__meta__ = {
|
||||
"_edit_use_anchors_": false
|
||||
}
|
||||
|
||||
[node name="NextIndicator" type="TextureRect" parent="TextBubble"]
|
||||
visible = false
|
||||
anchor_left = 1.0
|
||||
anchor_top = 1.0
|
||||
anchor_right = 1.0
|
||||
anchor_bottom = 1.0
|
||||
margin_left = -36.4279
|
||||
margin_top = -35.9016
|
||||
margin_right = 14.5721
|
||||
margin_bottom = 25.4599
|
||||
rect_scale = Vector2( 0.4, 0.4 )
|
||||
texture = ExtResource( 1 )
|
||||
stretch_mode = 4
|
||||
__meta__ = {
|
||||
"_edit_use_anchors_": false
|
||||
}
|
||||
|
||||
[node name="AnimationPlayer" type="AnimationPlayer" parent="TextBubble/NextIndicator"]
|
||||
autoplay = "Up and down"
|
||||
anims/Pulse = SubResource( 2 )
|
||||
anims/Static = SubResource( 3 )
|
||||
"anims/Up and down" = SubResource( 4 )
|
||||
|
||||
[node name="NameLabel" type="Label" parent="TextBubble"]
|
||||
margin_top = -48.0
|
||||
margin_right = 58.0
|
||||
margin_bottom = -8.0
|
||||
size_flags_vertical = 1
|
||||
custom_styles/normal = SubResource( 5 )
|
||||
custom_fonts/font = ExtResource( 3 )
|
||||
custom_colors/font_color = Color( 1, 1, 1, 1 )
|
||||
custom_colors/font_color_shadow = Color( 0, 0, 0, 0.619608 )
|
||||
custom_constants/shadow_offset_x = 2
|
||||
custom_constants/shadow_offset_y = 2
|
||||
align = 1
|
||||
valign = 1
|
||||
__meta__ = {
|
||||
"_edit_use_anchors_": false
|
||||
}
|
||||
|
||||
[node name="ColorRect" type="ColorRect" parent="TextBubble/NameLabel"]
|
||||
visible = false
|
||||
show_behind_parent = true
|
||||
anchor_right = 1.0
|
||||
anchor_bottom = 1.0
|
||||
size_flags_horizontal = 15
|
||||
size_flags_vertical = 15
|
||||
color = Color( 0.156863, 0.156863, 0.156863, 1 )
|
||||
__meta__ = {
|
||||
"_edit_use_anchors_": false
|
||||
}
|
||||
|
||||
[node name="TextureRect" type="TextureRect" parent="TextBubble/NameLabel"]
|
||||
show_behind_parent = true
|
||||
anchor_right = 1.0
|
||||
anchor_bottom = 1.0
|
||||
size_flags_horizontal = 3
|
||||
size_flags_vertical = 3
|
||||
texture = ExtResource( 2 )
|
||||
expand = true
|
||||
stretch_mode = 1
|
||||
__meta__ = {
|
||||
"_edit_use_anchors_": false
|
||||
}
|
||||
|
||||
[node name="Tween" type="Tween" parent="TextBubble"]
|
||||
|
||||
[node name="CloseDialog" type="Control" parent="TextBubble"]
|
||||
margin_right = 40.0
|
||||
margin_bottom = 40.0
|
||||
__meta__ = {
|
||||
"_edit_use_anchors_": false
|
||||
}
|
||||
|
||||
[node name="Tween" type="Tween" parent="TextBubble/CloseDialog"]
|
||||
|
||||
[node name="Timer" type="Timer" parent="TextBubble/CloseDialog"]
|
||||
[node name="TextBubble" parent="." instance=ExtResource( 1 )]
|
||||
|
||||
[node name="Options" type="VBoxContainer" parent="."]
|
||||
anchor_left = 0.5
|
||||
anchor_top = 0.5
|
||||
anchor_right = 0.5
|
||||
anchor_bottom = 0.5
|
||||
margin_left = -20.0
|
||||
margin_top = -19.9999
|
||||
margin_right = 20.0
|
||||
margin_bottom = 19.9999
|
||||
grow_horizontal = 2
|
||||
grow_vertical = 2
|
||||
alignment = 1
|
||||
__meta__ = {
|
||||
"_edit_use_anchors_": false
|
||||
}
|
||||
|
||||
[node name="TextInputDialog" type="AcceptDialog" parent="."]
|
||||
anchor_left = 0.5
|
||||
anchor_top = 0.5
|
||||
anchor_right = 0.5
|
||||
anchor_bottom = 0.5
|
||||
margin_left = -192.0
|
||||
margin_top = -57.0
|
||||
margin_right = 192.0
|
||||
margin_bottom = 57.0
|
||||
popup_exclusive = true
|
||||
dialog_hide_on_ok = false
|
||||
__meta__ = {
|
||||
"_edit_use_anchors_": false
|
||||
}
|
||||
|
||||
[node name="LineEdit" type="LineEdit" parent="TextInputDialog"]
|
||||
margin_left = 8.0
|
||||
margin_top = 8.0
|
||||
margin_right = 376.0
|
||||
margin_bottom = 78.0
|
||||
|
||||
[node name="FX" type="Control" parent="."]
|
||||
anchor_right = 1.0
|
||||
anchor_bottom = 1.0
|
||||
|
@ -260,20 +54,6 @@ __meta__ = {
|
|||
"_edit_use_anchors_": false
|
||||
}
|
||||
|
||||
[node name="FadeInNode" type="ColorRect" parent="FX"]
|
||||
modulate = Color( 1, 1, 1, 0 )
|
||||
anchor_right = 1.0
|
||||
anchor_bottom = 1.0
|
||||
mouse_filter = 2
|
||||
color = Color( 0, 0, 0, 1 )
|
||||
__meta__ = {
|
||||
"_edit_use_anchors_": false
|
||||
}
|
||||
|
||||
[node name="Tween" type="Tween" parent="FX/FadeInNode"]
|
||||
|
||||
[node name="AudioStreamPlayer" type="AudioStreamPlayer" parent="FX"]
|
||||
|
||||
[node name="BackgroundMusic" parent="FX" instance=ExtResource( 7 )]
|
||||
|
||||
[node name="DefinitionInfo" type="PanelContainer" parent="."]
|
||||
|
@ -282,7 +62,7 @@ margin_right = 208.0
|
|||
mouse_filter = 1
|
||||
size_flags_horizontal = 3
|
||||
size_flags_vertical = 3
|
||||
custom_styles/panel = SubResource( 6 )
|
||||
custom_styles/panel = SubResource( 2 )
|
||||
script = ExtResource( 5 )
|
||||
__meta__ = {
|
||||
"_edit_group_": true,
|
||||
|
@ -349,9 +129,4 @@ __meta__ = {
|
|||
}
|
||||
|
||||
[node name="Timer" type="Timer" parent="DefinitionInfo"]
|
||||
|
||||
[node name="WaitSeconds" type="Timer" parent="."]
|
||||
[connection signal="meta_hover_ended" from="TextBubble/RichTextLabel" to="." method="_on_RichTextLabel_meta_hover_ended"]
|
||||
[connection signal="meta_hover_started" from="TextBubble/RichTextLabel" to="." method="_on_RichTextLabel_meta_hover_started"]
|
||||
[connection signal="timeout" from="DefinitionInfo/Timer" to="." method="_on_Definition_Timer_timeout"]
|
||||
[connection signal="timeout" from="WaitSeconds" to="." method="_on_WaitSeconds_timeout"]
|
||||
|
|
|
@ -15,7 +15,7 @@ onready var settings_editor = $MainPanel/SettingsEditor
|
|||
|
||||
|
||||
func _ready():
|
||||
# Adding file dialog to get used by pieces
|
||||
# Adding file dialog to get used by Events
|
||||
editor_file_dialog = EditorFileDialog.new()
|
||||
add_child(editor_file_dialog)
|
||||
|
||||
|
|
|
@ -1,9 +1,10 @@
|
|||
[gd_scene load_steps=6 format=2]
|
||||
|
||||
[ext_resource path="res://addons/dialogic/Editor/Pieces/AudioBlock.gd" type="Script" id=1]
|
||||
[ext_resource path="res://addons/dialogic/Editor/Pieces/Common/Spacer.tscn" type="PackedScene" id=2]
|
||||
[ext_resource path="res://addons/dialogic/Editor/Events/AudioBlock.gd" type="Script" id=1]
|
||||
[ext_resource path="res://addons/dialogic/Editor/Events/Common/Spacer.tscn" type="PackedScene" id=2]
|
||||
[ext_resource path="res://addons/dialogic/Images/Event Icons/Main Icons/audio-event.svg" type="Texture" id=3]
|
||||
[ext_resource path="res://addons/dialogic/Editor/Pieces/Common/PieceExtraSettings.tscn" type="PackedScene" id=4]
|
||||
[ext_resource path="res://addons/dialogic/Editor/Events/Common/PieceExtraSettings.tscn" type="PackedScene" id=4]
|
||||
|
||||
|
||||
[sub_resource type="StyleBoxFlat" id=1]
|
||||
content_margin_left = 16.0
|
|
@ -1,9 +1,10 @@
|
|||
[gd_scene load_steps=6 format=2]
|
||||
|
||||
[ext_resource path="res://addons/dialogic/Editor/Pieces/BackgroundMusic.gd" type="Script" id=1]
|
||||
[ext_resource path="res://addons/dialogic/Editor/Pieces/Common/Spacer.tscn" type="PackedScene" id=2]
|
||||
[ext_resource path="res://addons/dialogic/Editor/Events/BackgroundMusic.gd" type="Script" id=1]
|
||||
[ext_resource path="res://addons/dialogic/Editor/Events/Common/Spacer.tscn" type="PackedScene" id=2]
|
||||
[ext_resource path="res://addons/dialogic/Images/Event Icons/Main Icons/background-music.svg" type="Texture" id=3]
|
||||
[ext_resource path="res://addons/dialogic/Editor/Pieces/Common/PieceExtraSettings.tscn" type="PackedScene" id=4]
|
||||
[ext_resource path="res://addons/dialogic/Editor/Events/Common/PieceExtraSettings.tscn" type="PackedScene" id=4]
|
||||
|
||||
|
||||
[sub_resource type="StyleBoxFlat" id=1]
|
||||
content_margin_left = 16.0
|
|
@ -1,9 +1,10 @@
|
|||
[gd_scene load_steps=6 format=2]
|
||||
|
||||
[ext_resource path="res://addons/dialogic/Images/Event Icons/Main Icons/call-node.svg" type="Texture" id=1]
|
||||
[ext_resource path="res://addons/dialogic/Editor/Pieces/CallNode.gd" type="Script" id=2]
|
||||
[ext_resource path="res://addons/dialogic/Editor/Pieces/Common/Spacer.tscn" type="PackedScene" id=3]
|
||||
[ext_resource path="res://addons/dialogic/Editor/Pieces/Common/PieceExtraSettings.tscn" type="PackedScene" id=4]
|
||||
[ext_resource path="res://addons/dialogic/Editor/Events/CallNode.gd" type="Script" id=2]
|
||||
[ext_resource path="res://addons/dialogic/Editor/Events/Common/Spacer.tscn" type="PackedScene" id=3]
|
||||
[ext_resource path="res://addons/dialogic/Editor/Events/Common/PieceExtraSettings.tscn" type="PackedScene" id=4]
|
||||
|
||||
|
||||
|
||||
|
|
@ -1,9 +1,10 @@
|
|||
[gd_scene load_steps=6 format=2]
|
||||
|
||||
[ext_resource path="res://addons/dialogic/Editor/Pieces/ChangeScene.gd" type="Script" id=1]
|
||||
[ext_resource path="res://addons/dialogic/Editor/Pieces/Common/Spacer.tscn" type="PackedScene" id=2]
|
||||
[ext_resource path="res://addons/dialogic/Editor/Events/ChangeScene.gd" type="Script" id=1]
|
||||
[ext_resource path="res://addons/dialogic/Editor/Events/Common/Spacer.tscn" type="PackedScene" id=2]
|
||||
[ext_resource path="res://addons/dialogic/Images/Event Icons/Main Icons/change-scene.svg" type="Texture" id=3]
|
||||
[ext_resource path="res://addons/dialogic/Editor/Pieces/Common/PieceExtraSettings.tscn" type="PackedScene" id=4]
|
||||
[ext_resource path="res://addons/dialogic/Editor/Events/Common/PieceExtraSettings.tscn" type="PackedScene" id=4]
|
||||
|
||||
|
||||
|
||||
|
|
@ -1,9 +1,10 @@
|
|||
[gd_scene load_steps=6 format=2]
|
||||
|
||||
[ext_resource path="res://addons/dialogic/Editor/Pieces/ChangeTimeline.gd" type="Script" id=1]
|
||||
[ext_resource path="res://addons/dialogic/Editor/Pieces/Common/Spacer.tscn" type="PackedScene" id=2]
|
||||
[ext_resource path="res://addons/dialogic/Editor/Events/ChangeTimeline.gd" type="Script" id=1]
|
||||
[ext_resource path="res://addons/dialogic/Editor/Events/Common/Spacer.tscn" type="PackedScene" id=2]
|
||||
[ext_resource path="res://addons/dialogic/Images/Event Icons/Main Icons/change-timeline.svg" type="Texture" id=3]
|
||||
[ext_resource path="res://addons/dialogic/Editor/Pieces/Common/PieceExtraSettings.tscn" type="PackedScene" id=4]
|
||||
[ext_resource path="res://addons/dialogic/Editor/Events/Common/PieceExtraSettings.tscn" type="PackedScene" id=4]
|
||||
|
||||
|
||||
|
||||
|
|
@ -1,12 +1,13 @@
|
|||
[gd_scene load_steps=9 format=2]
|
||||
|
||||
[ext_resource path="res://addons/dialogic/Editor/Pieces/Common/Spacer.tscn" type="PackedScene" id=1]
|
||||
[ext_resource path="res://addons/dialogic/Editor/Pieces/Common/PieceExtraSettings.tscn" type="PackedScene" id=2]
|
||||
[ext_resource path="res://addons/dialogic/Editor/Pieces/CharacterJoinBlock.gd" type="Script" id=3]
|
||||
[ext_resource path="res://addons/dialogic/Editor/Events/Common/Spacer.tscn" type="PackedScene" id=1]
|
||||
[ext_resource path="res://addons/dialogic/Editor/Events/Common/PieceExtraSettings.tscn" type="PackedScene" id=2]
|
||||
[ext_resource path="res://addons/dialogic/Editor/Events/CharacterJoinBlock.gd" type="Script" id=3]
|
||||
[ext_resource path="res://addons/dialogic/Images/Event Icons/Main Icons/character-join.svg" type="Texture" id=4]
|
||||
[ext_resource path="res://addons/dialogic/Images/Event Icons/character.svg" type="Texture" id=5]
|
||||
[ext_resource path="res://addons/dialogic/Editor/Pieces/Common/PortraitPicker.tscn" type="PackedScene" id=7]
|
||||
[ext_resource path="res://addons/dialogic/Editor/Pieces/Common/CharacterPicker.tscn" type="PackedScene" id=8]
|
||||
[ext_resource path="res://addons/dialogic/Editor/Events/Common/PortraitPicker.tscn" type="PackedScene" id=7]
|
||||
[ext_resource path="res://addons/dialogic/Editor/Events/Common/CharacterPicker.tscn" type="PackedScene" id=8]
|
||||
|
||||
|
||||
|
||||
|
|
@ -1,9 +1,10 @@
|
|||
[gd_scene load_steps=6 format=2]
|
||||
|
||||
[ext_resource path="res://addons/dialogic/Editor/Pieces/CharacterLeaveBlock.gd" type="Script" id=1]
|
||||
[ext_resource path="res://addons/dialogic/Editor/Pieces/Common/Spacer.tscn" type="PackedScene" id=2]
|
||||
[ext_resource path="res://addons/dialogic/Editor/Events/CharacterLeaveBlock.gd" type="Script" id=1]
|
||||
[ext_resource path="res://addons/dialogic/Editor/Events/Common/Spacer.tscn" type="PackedScene" id=2]
|
||||
[ext_resource path="res://addons/dialogic/Images/Event Icons/Main Icons/character-leave.svg" type="Texture" id=3]
|
||||
[ext_resource path="res://addons/dialogic/Editor/Pieces/Common/PieceExtraSettings.tscn" type="PackedScene" id=4]
|
||||
[ext_resource path="res://addons/dialogic/Editor/Events/Common/PieceExtraSettings.tscn" type="PackedScene" id=4]
|
||||
|
||||
|
||||
|
||||
|
|
@ -1,11 +1,12 @@
|
|||
[gd_scene load_steps=8 format=2]
|
||||
|
||||
[ext_resource path="res://addons/dialogic/Images/Event Icons/Main Icons/choice.svg" type="Texture" id=1]
|
||||
[ext_resource path="res://addons/dialogic/Editor/Pieces/Choice.gd" type="Script" id=2]
|
||||
[ext_resource path="res://addons/dialogic/Editor/Pieces/Common/Spacer.tscn" type="PackedScene" id=3]
|
||||
[ext_resource path="res://addons/dialogic/Editor/Pieces/Common/PieceExtraSettings.tscn" type="PackedScene" id=4]
|
||||
[ext_resource path="res://addons/dialogic/Editor/Events/Choice.gd" type="Script" id=2]
|
||||
[ext_resource path="res://addons/dialogic/Editor/Events/Common/Spacer.tscn" type="PackedScene" id=3]
|
||||
[ext_resource path="res://addons/dialogic/Editor/Events/Common/PieceExtraSettings.tscn" type="PackedScene" id=4]
|
||||
[ext_resource path="res://addons/dialogic/Images/Event Icons/warning.svg" type="Texture" id=6]
|
||||
[ext_resource path="res://addons/dialogic/Editor/Pieces/Common/CustomLineEdit.tscn" type="PackedScene" id=7]
|
||||
[ext_resource path="res://addons/dialogic/Editor/Events/Common/CustomLineEdit.tscn" type="PackedScene" id=7]
|
||||
|
||||
|
||||
|
||||
|
|
@ -1,9 +1,10 @@
|
|||
[gd_scene load_steps=6 format=2]
|
||||
|
||||
[ext_resource path="res://addons/dialogic/Images/Event Icons/Main Icons/close-dialog.svg" type="Texture" id=2]
|
||||
[ext_resource path="res://addons/dialogic/Editor/Pieces/Common/PieceExtraSettings.tscn" type="PackedScene" id=3]
|
||||
[ext_resource path="res://addons/dialogic/Editor/Pieces/CloseDialog.gd" type="Script" id=4]
|
||||
[ext_resource path="res://addons/dialogic/Editor/Pieces/Common/Spacer.tscn" type="PackedScene" id=5]
|
||||
[ext_resource path="res://addons/dialogic/Editor/Events/Common/PieceExtraSettings.tscn" type="PackedScene" id=3]
|
||||
[ext_resource path="res://addons/dialogic/Editor/Events/CloseDialog.gd" type="Script" id=4]
|
||||
[ext_resource path="res://addons/dialogic/Editor/Events/Common/Spacer.tscn" type="PackedScene" id=5]
|
||||
|
||||
|
||||
|
||||
|
|
@ -1,7 +1,8 @@
|
|||
[gd_scene load_steps=3 format=2]
|
||||
|
||||
[ext_resource path="res://addons/dialogic/Images/Event Icons/character.svg" type="Texture" id=1]
|
||||
[ext_resource path="res://addons/dialogic/Editor/Pieces/Common/CharacterPicker.gd" type="Script" id=2]
|
||||
[ext_resource path="res://addons/dialogic/Editor/Events/Common/CharacterPicker.gd" type="Script" id=2]
|
||||
|
||||
|
||||
|
||||
|
|
@ -1,6 +1,7 @@
|
|||
[gd_scene load_steps=2 format=2]
|
||||
|
||||
[ext_resource path="res://addons/dialogic/Editor/Pieces/Common/ConditionPicker.gd" type="Script" id=1]
|
||||
[ext_resource path="res://addons/dialogic/Editor/Events/Common/ConditionPicker.gd" type="Script" id=1]
|
||||
|
||||
|
||||
[node name="ConditionPicker" type="MenuButton"]
|
||||
margin_left = 173.0
|
|
@ -1,6 +1,7 @@
|
|||
[gd_scene load_steps=2 format=2]
|
||||
|
||||
[ext_resource path="res://addons/dialogic/Editor/Pieces/Common/DefinitionPicker.gd" type="Script" id=1]
|
||||
[ext_resource path="res://addons/dialogic/Editor/Events/Common/DefinitionPicker.gd" type="Script" id=1]
|
||||
|
||||
|
||||
[node name="DefinitionPicker" type="MenuButton"]
|
||||
margin_right = 157.0
|
|
@ -1,6 +1,7 @@
|
|||
[gd_scene load_steps=2 format=2]
|
||||
|
||||
[ext_resource path="res://addons/dialogic/Editor/Pieces/Common/OperationPicker.gd" type="Script" id=1]
|
||||
[ext_resource path="res://addons/dialogic/Editor/Events/Common/OperationPicker.gd" type="Script" id=1]
|
||||
|
||||
|
||||
[node name="OperationPicker" type="MenuButton"]
|
||||
margin_left = 284.0
|
|
@ -1,7 +1,8 @@
|
|||
[gd_scene load_steps=3 format=2]
|
||||
|
||||
[ext_resource path="res://addons/dialogic/Images/Pieces/expand-icon.svg" type="Texture" id=1]
|
||||
[ext_resource path="res://addons/dialogic/Editor/Pieces/Common/PieceExtraSettings.gd" type="Script" id=2]
|
||||
[ext_resource path="res://addons/dialogic/Editor/Events/Common/PieceExtraSettings.gd" type="Script" id=2]
|
||||
|
||||
|
||||
|
||||
[node name="OptionButton" type="MenuButton"]
|
|
@ -1,7 +1,8 @@
|
|||
[gd_scene load_steps=3 format=2]
|
||||
|
||||
[ext_resource path="res://addons/dialogic/Images/Event Icons/Portrait.svg" type="Texture" id=1]
|
||||
[ext_resource path="res://addons/dialogic/Editor/Pieces/Common/PortraitPicker.gd" type="Script" id=2]
|
||||
[ext_resource path="res://addons/dialogic/Editor/Events/Common/PortraitPicker.gd" type="Script" id=2]
|
||||
|
||||
|
||||
|
||||
|
|
@ -17,11 +17,10 @@ func disabled():
|
|||
is_disabled = true
|
||||
|
||||
|
||||
func _on_VisibleToggle_toggled(button_pressed):
|
||||
if is_disabled:
|
||||
return
|
||||
func set_visible(visible: bool):
|
||||
pressed = visible
|
||||
var current_rect_size = current_piece.get("rect_size")
|
||||
if button_pressed:
|
||||
if visible:
|
||||
current_piece.get_node("PanelContainer/VBoxContainer/Header/Preview").hide()
|
||||
|
||||
var index = 0
|
||||
|
@ -42,3 +41,9 @@ func _on_VisibleToggle_toggled(button_pressed):
|
|||
current_piece.get_node("PanelContainer/VBoxContainer/Header/Preview").text = current_piece.preview
|
||||
current_piece.set("rect_size", Vector2(current_rect_size.x,0))
|
||||
release_focus()
|
||||
|
||||
|
||||
func _on_VisibleToggle_toggled(button_pressed):
|
||||
if is_disabled:
|
||||
return
|
||||
set_visible(button_pressed)
|
|
@ -2,7 +2,8 @@
|
|||
|
||||
[ext_resource path="res://addons/dialogic/Images/Pieces/open-icon.svg" type="Texture" id=1]
|
||||
[ext_resource path="res://addons/dialogic/Images/Pieces/closed-icon.svg" type="Texture" id=2]
|
||||
[ext_resource path="res://addons/dialogic/Editor/Pieces/Common/VisibleToggle.gd" type="Script" id=3]
|
||||
[ext_resource path="res://addons/dialogic/Editor/Events/Common/VisibleToggle.gd" type="Script" id=3]
|
||||
|
||||
|
||||
|
||||
[node name="VisibleToggle" type="CheckBox"]
|
|
@ -1,9 +1,10 @@
|
|||
[gd_scene load_steps=7 format=2]
|
||||
|
||||
[ext_resource path="res://addons/dialogic/Images/Event Icons/Main Icons/emit-signal.svg" type="Texture" id=1]
|
||||
[ext_resource path="res://addons/dialogic/Editor/Pieces/EmitSignal.gd" type="Script" id=2]
|
||||
[ext_resource path="res://addons/dialogic/Editor/Pieces/Common/Spacer.tscn" type="PackedScene" id=3]
|
||||
[ext_resource path="res://addons/dialogic/Editor/Pieces/Common/PieceExtraSettings.tscn" type="PackedScene" id=4]
|
||||
[ext_resource path="res://addons/dialogic/Editor/Events/EmitSignal.gd" type="Script" id=2]
|
||||
[ext_resource path="res://addons/dialogic/Editor/Events/Common/Spacer.tscn" type="PackedScene" id=3]
|
||||
[ext_resource path="res://addons/dialogic/Editor/Events/Common/PieceExtraSettings.tscn" type="PackedScene" id=4]
|
||||
|
||||
|
||||
|
||||
|
|
@ -1,12 +1,13 @@
|
|||
[gd_scene load_steps=6 format=2]
|
||||
|
||||
[ext_resource path="res://addons/dialogic/Editor/Pieces/Common/PieceExtraSettings.tscn" type="PackedScene" id=1]
|
||||
[ext_resource path="res://addons/dialogic/Editor/Pieces/Common/Spacer.tscn" type="PackedScene" id=2]
|
||||
[ext_resource path="res://addons/dialogic/Editor/Pieces/EndBranch.gd" type="Script" id=4]
|
||||
[ext_resource path="res://addons/dialogic/Editor/Events/Common/PieceExtraSettings.tscn" type="PackedScene" id=1]
|
||||
[ext_resource path="res://addons/dialogic/Editor/Events/Common/Spacer.tscn" type="PackedScene" id=2]
|
||||
[ext_resource path="res://addons/dialogic/Editor/Events/EndBranch.gd" type="Script" id=4]
|
||||
[ext_resource path="res://addons/dialogic/Images/Event Icons/Main Icons/end-branch.svg" type="Texture" id=5]
|
||||
|
||||
|
||||
|
||||
|
||||
[sub_resource type="StyleBoxFlat" id=1]
|
||||
content_margin_left = 16.0
|
||||
content_margin_right = 6.0
|
|
@ -1,12 +1,13 @@
|
|||
[gd_scene load_steps=9 format=2]
|
||||
|
||||
[ext_resource path="res://addons/dialogic/Images/Event Icons/Main Icons/condition.svg" type="Texture" id=1]
|
||||
[ext_resource path="res://addons/dialogic/Editor/Pieces/IfCondition.gd" type="Script" id=2]
|
||||
[ext_resource path="res://addons/dialogic/Editor/Pieces/Common/ConditionPicker.tscn" type="PackedScene" id=3]
|
||||
[ext_resource path="res://addons/dialogic/Editor/Pieces/Common/PieceExtraSettings.tscn" type="PackedScene" id=4]
|
||||
[ext_resource path="res://addons/dialogic/Editor/Pieces/Common/CustomLineEdit.tscn" type="PackedScene" id=6]
|
||||
[ext_resource path="res://addons/dialogic/Editor/Pieces/Common/DefinitionPicker.tscn" type="PackedScene" id=7]
|
||||
[ext_resource path="res://addons/dialogic/Editor/Pieces/Common/Spacer.tscn" type="PackedScene" id=8]
|
||||
[ext_resource path="res://addons/dialogic/Editor/Events/IfCondition.gd" type="Script" id=2]
|
||||
[ext_resource path="res://addons/dialogic/Editor/Events/Common/ConditionPicker.tscn" type="PackedScene" id=3]
|
||||
[ext_resource path="res://addons/dialogic/Editor/Events/Common/PieceExtraSettings.tscn" type="PackedScene" id=4]
|
||||
[ext_resource path="res://addons/dialogic/Editor/Events/Common/CustomLineEdit.tscn" type="PackedScene" id=6]
|
||||
[ext_resource path="res://addons/dialogic/Editor/Events/Common/DefinitionPicker.tscn" type="PackedScene" id=7]
|
||||
[ext_resource path="res://addons/dialogic/Editor/Events/Common/Spacer.tscn" type="PackedScene" id=8]
|
||||
|
||||
|
||||
|
||||
|
|
@ -1,9 +1,10 @@
|
|||
[gd_scene load_steps=6 format=2]
|
||||
|
||||
[ext_resource path="res://addons/dialogic/Images/Event Icons/Main Icons/question.svg" type="Texture" id=1]
|
||||
[ext_resource path="res://addons/dialogic/Editor/Pieces/Question.gd" type="Script" id=2]
|
||||
[ext_resource path="res://addons/dialogic/Editor/Pieces/Common/Spacer.tscn" type="PackedScene" id=3]
|
||||
[ext_resource path="res://addons/dialogic/Editor/Pieces/Common/PieceExtraSettings.tscn" type="PackedScene" id=4]
|
||||
[ext_resource path="res://addons/dialogic/Editor/Events/Question.gd" type="Script" id=2]
|
||||
[ext_resource path="res://addons/dialogic/Editor/Events/Common/Spacer.tscn" type="PackedScene" id=3]
|
||||
[ext_resource path="res://addons/dialogic/Editor/Events/Common/PieceExtraSettings.tscn" type="PackedScene" id=4]
|
||||
|
||||
|
||||
|
||||
|
|
@ -14,9 +14,39 @@ var event_data = {
|
|||
|
||||
func _ready():
|
||||
connect("gui_input", self, '_on_gui_input')
|
||||
|
||||
|
||||
func load_data(data):
|
||||
event_data = data
|
||||
print("loading")
|
||||
print(data)
|
||||
load_image(event_data['background'])
|
||||
|
||||
|
||||
func load_image(img_src: String):
|
||||
event_data['background'] = img_src
|
||||
if not img_src.empty() and not img_src.ends_with('.tscn'):
|
||||
$PanelContainer/VBoxContainer/Header/Name.text = img_src
|
||||
$PanelContainer/VBoxContainer/TextureRect.texture = load(img_src)
|
||||
$PanelContainer/VBoxContainer/TextureRect.rect_min_size = Vector2(200,200)
|
||||
$PanelContainer/VBoxContainer/Header/ClearButton.disabled = false
|
||||
preview = "..."
|
||||
toggler.show()
|
||||
toggler.set_visible(true)
|
||||
else:
|
||||
$PanelContainer/VBoxContainer/Header/Name.text = 'No image (will clear previous scene event)'
|
||||
$PanelContainer/VBoxContainer/TextureRect.rect_min_size = Vector2(0,0)
|
||||
$PanelContainer/VBoxContainer/Header/ClearButton.disabled = true
|
||||
preview = ""
|
||||
toggler.hide()
|
||||
toggler.set_visible(false)
|
||||
|
||||
|
||||
func _on_gui_input(event):
|
||||
if event is InputEventMouseButton and event.is_pressed() and event.doubleclick and event.button_index == 1 and toggler.visible:
|
||||
toggler.set_visible(not toggler.pressed)
|
||||
|
||||
|
||||
func _on_ImageButton_pressed():
|
||||
editor_reference.godot_dialog("*.png, *.jpg, *.jpeg, *.tga, *.svg, *.svgz, *.bmp, *.webp, *.tscn")
|
||||
editor_reference.godot_dialog_connect(self, "_on_file_selected")
|
||||
|
@ -26,26 +56,5 @@ func _on_file_selected(path, target):
|
|||
target.load_image(path)
|
||||
|
||||
|
||||
func load_data(data):
|
||||
event_data = data
|
||||
load_image(event_data['background'])
|
||||
|
||||
|
||||
func load_image(img_src):
|
||||
event_data['background'] = img_src
|
||||
$PanelContainer/VBoxContainer/HBoxContainer/LineEdit.text = event_data['background']
|
||||
if event_data['background'] != '' and not event_data['background'].ends_with('.tscn'):
|
||||
$PanelContainer/VBoxContainer/TextureRect.texture = load(event_data['background'])
|
||||
$PanelContainer/VBoxContainer/TextureRect.rect_min_size = Vector2(200,200)
|
||||
preview = event_data['background']
|
||||
else:
|
||||
$PanelContainer/VBoxContainer/TextureRect.rect_min_size = Vector2(0,0)
|
||||
|
||||
|
||||
func _on_gui_input(event):
|
||||
if event is InputEventMouseButton and event.is_pressed() and event.doubleclick:
|
||||
if event.button_index == 1:
|
||||
if toggler.pressed:
|
||||
toggler.pressed = false
|
||||
else:
|
||||
toggler.pressed = true
|
||||
func _on_ClearButton_pressed():
|
||||
load_image('')
|
|
@ -1,11 +1,11 @@
|
|||
[gd_scene load_steps=7 format=2]
|
||||
[gd_scene load_steps=8 format=2]
|
||||
|
||||
[ext_resource path="res://addons/dialogic/Images/Event Icons/Main Icons/scene event.svg" type="Texture" id=1]
|
||||
[ext_resource path="res://addons/dialogic/Editor/Pieces/Common/PieceExtraSettings.tscn" type="PackedScene" id=2]
|
||||
[ext_resource path="res://addons/dialogic/Editor/Pieces/Common/VisibleToggle.tscn" type="PackedScene" id=4]
|
||||
[ext_resource path="res://addons/dialogic/Editor/Pieces/SceneEvent.gd" type="Script" id=5]
|
||||
[ext_resource path="res://addons/dialogic/Editor/Pieces/Common/Spacer.tscn" type="PackedScene" id=6]
|
||||
|
||||
[ext_resource path="res://addons/dialogic/Editor/Events/Common/PieceExtraSettings.tscn" type="PackedScene" id=2]
|
||||
[ext_resource path="res://addons/dialogic/Images/Context Menus/Remove.svg" type="Texture" id=3]
|
||||
[ext_resource path="res://addons/dialogic/Editor/Events/Common/VisibleToggle.tscn" type="PackedScene" id=4]
|
||||
[ext_resource path="res://addons/dialogic/Editor/Events/SceneEvent.gd" type="Script" id=5]
|
||||
[ext_resource path="res://addons/dialogic/Editor/Events/Common/Spacer.tscn" type="PackedScene" id=6]
|
||||
|
||||
|
||||
[sub_resource type="StyleBoxFlat" id=1]
|
||||
|
@ -26,6 +26,7 @@ corner_radius_bottom_left = 6
|
|||
|
||||
[node name="SceneBlock" type="HBoxContainer"]
|
||||
anchor_right = 1.0
|
||||
margin_bottom = 44.0
|
||||
size_flags_horizontal = 3
|
||||
size_flags_vertical = 9
|
||||
script = ExtResource( 5 )
|
||||
|
@ -35,11 +36,11 @@ __meta__ = {
|
|||
|
||||
[node name="Indent" type="Control" parent="."]
|
||||
visible = false
|
||||
margin_bottom = 74.0
|
||||
margin_bottom = 46.0
|
||||
|
||||
[node name="PanelContainer" type="PanelContainer" parent="."]
|
||||
margin_right = 1024.0
|
||||
margin_bottom = 74.0
|
||||
margin_bottom = 44.0
|
||||
mouse_filter = 1
|
||||
size_flags_horizontal = 3
|
||||
size_flags_vertical = 3
|
||||
|
@ -49,86 +50,78 @@ custom_styles/panel = SubResource( 1 )
|
|||
margin_left = 16.0
|
||||
margin_top = 6.0
|
||||
margin_right = 1018.0
|
||||
margin_bottom = 68.0
|
||||
margin_bottom = 38.0
|
||||
size_flags_horizontal = 3
|
||||
|
||||
[node name="Header" type="HBoxContainer" parent="PanelContainer/VBoxContainer"]
|
||||
margin_right = 1002.0
|
||||
margin_bottom = 30.0
|
||||
margin_bottom = 28.0
|
||||
|
||||
[node name="TextureRect" type="TextureRect" parent="PanelContainer/VBoxContainer/Header"]
|
||||
margin_right = 22.0
|
||||
margin_bottom = 30.0
|
||||
margin_bottom = 28.0
|
||||
texture = ExtResource( 1 )
|
||||
stretch_mode = 6
|
||||
|
||||
[node name="Title" type="Label" parent="PanelContainer/VBoxContainer/Header"]
|
||||
margin_left = 26.0
|
||||
margin_top = 8.0
|
||||
margin_right = 131.0
|
||||
margin_bottom = 22.0
|
||||
text = " Scene settings "
|
||||
margin_top = 7.0
|
||||
margin_right = 139.0
|
||||
margin_bottom = 21.0
|
||||
text = " Scene settings "
|
||||
|
||||
[node name="Name" type="Label" parent="PanelContainer/VBoxContainer/Header"]
|
||||
margin_left = 143.0
|
||||
margin_top = 7.0
|
||||
margin_right = 414.0
|
||||
margin_bottom = 21.0
|
||||
text = "No image (will clear previous scene event)"
|
||||
|
||||
[node name="ImageButton" type="Button" parent="PanelContainer/VBoxContainer/Header"]
|
||||
margin_left = 418.0
|
||||
margin_right = 442.0
|
||||
margin_bottom = 28.0
|
||||
text = "..."
|
||||
|
||||
[node name="ClearButton" type="Button" parent="PanelContainer/VBoxContainer/Header"]
|
||||
margin_left = 446.0
|
||||
margin_right = 474.0
|
||||
margin_bottom = 28.0
|
||||
disabled = true
|
||||
icon = ExtResource( 3 )
|
||||
|
||||
[node name="VisibleToggle" parent="PanelContainer/VBoxContainer/Header" instance=ExtResource( 4 )]
|
||||
margin_left = 135.0
|
||||
margin_right = 165.0
|
||||
visible = false
|
||||
margin_left = 478.0
|
||||
margin_right = 508.0
|
||||
|
||||
[node name="Preview" type="Label" parent="PanelContainer/VBoxContainer/Header"]
|
||||
visible = false
|
||||
margin_left = 103.0
|
||||
margin_left = 512.0
|
||||
margin_top = 8.0
|
||||
margin_right = 131.0
|
||||
margin_right = 540.0
|
||||
margin_bottom = 22.0
|
||||
custom_colors/font_color = Color( 1, 1, 1, 0.513726 )
|
||||
text = " ..."
|
||||
|
||||
[node name="Spacer" parent="PanelContainer/VBoxContainer/Header" instance=ExtResource( 6 )]
|
||||
margin_left = 169.0
|
||||
margin_left = 478.0
|
||||
margin_right = 961.0
|
||||
margin_bottom = 30.0
|
||||
margin_bottom = 28.0
|
||||
|
||||
[node name="OptionButton" parent="PanelContainer/VBoxContainer/Header" instance=ExtResource( 2 )]
|
||||
margin_left = 965.0
|
||||
margin_right = 1002.0
|
||||
margin_bottom = 28.0
|
||||
items = [ "Move Up", null, 0, false, false, 0, 0, null, "", false, "Move Down", null, 0, false, false, 1, 0, null, "", false, "", null, 0, false, false, 2, 0, null, "", true, "Remove", null, 0, false, false, 3, 0, null, "", false ]
|
||||
|
||||
[node name="HBoxContainer" type="HBoxContainer" parent="PanelContainer/VBoxContainer"]
|
||||
margin_top = 34.0
|
||||
margin_right = 1002.0
|
||||
margin_bottom = 58.0
|
||||
|
||||
[node name="Label" type="Label" parent="PanelContainer/VBoxContainer/HBoxContainer"]
|
||||
margin_top = 5.0
|
||||
margin_right = 131.0
|
||||
margin_bottom = 19.0
|
||||
text = "Change background: "
|
||||
|
||||
[node name="LineEdit" type="LineEdit" parent="PanelContainer/VBoxContainer/HBoxContainer"]
|
||||
margin_left = 135.0
|
||||
margin_right = 435.0
|
||||
margin_bottom = 24.0
|
||||
rect_min_size = Vector2( 300, 0 )
|
||||
caret_blink = true
|
||||
caret_blink_speed = 0.5
|
||||
|
||||
[node name="ImageButton" type="Button" parent="PanelContainer/VBoxContainer/HBoxContainer"]
|
||||
margin_left = 439.0
|
||||
margin_right = 463.0
|
||||
margin_bottom = 24.0
|
||||
text = "..."
|
||||
|
||||
[node name="Control" type="Control" parent="PanelContainer/VBoxContainer/HBoxContainer"]
|
||||
margin_left = 467.0
|
||||
margin_right = 1002.0
|
||||
margin_bottom = 24.0
|
||||
size_flags_horizontal = 3
|
||||
|
||||
[node name="TextureRect" type="TextureRect" parent="PanelContainer/VBoxContainer"]
|
||||
margin_top = 62.0
|
||||
margin_top = 32.0
|
||||
margin_right = 1002.0
|
||||
margin_bottom = 62.0
|
||||
margin_bottom = 32.0
|
||||
size_flags_horizontal = 3
|
||||
size_flags_vertical = 3
|
||||
expand = true
|
||||
stretch_mode = 5
|
||||
[connection signal="pressed" from="PanelContainer/VBoxContainer/HBoxContainer/ImageButton" to="." method="_on_ImageButton_pressed"]
|
||||
[connection signal="pressed" from="PanelContainer/VBoxContainer/Header/ImageButton" to="." method="_on_ImageButton_pressed"]
|
||||
[connection signal="pressed" from="PanelContainer/VBoxContainer/Header/ClearButton" to="." method="_on_ClearButton_pressed"]
|
|
@ -1,9 +1,10 @@
|
|||
[gd_scene load_steps=6 format=2]
|
||||
|
||||
[ext_resource path="res://addons/dialogic/Editor/Pieces/SetTheme.gd" type="Script" id=1]
|
||||
[ext_resource path="res://addons/dialogic/Editor/Pieces/Common/Spacer.tscn" type="PackedScene" id=2]
|
||||
[ext_resource path="res://addons/dialogic/Editor/Events/SetTheme.gd" type="Script" id=1]
|
||||
[ext_resource path="res://addons/dialogic/Editor/Events/Common/Spacer.tscn" type="PackedScene" id=2]
|
||||
[ext_resource path="res://addons/dialogic/Images/Event Icons/Main Icons/set-theme.svg" type="Texture" id=3]
|
||||
[ext_resource path="res://addons/dialogic/Editor/Pieces/Common/PieceExtraSettings.tscn" type="PackedScene" id=4]
|
||||
[ext_resource path="res://addons/dialogic/Editor/Events/Common/PieceExtraSettings.tscn" type="PackedScene" id=4]
|
||||
|
||||
|
||||
|
||||
|
|
@ -1,11 +1,12 @@
|
|||
[gd_scene load_steps=9 format=2]
|
||||
|
||||
[ext_resource path="res://addons/dialogic/Editor/Pieces/SetValue.gd" type="Script" id=1]
|
||||
[ext_resource path="res://addons/dialogic/Editor/Events/SetValue.gd" type="Script" id=1]
|
||||
[ext_resource path="res://addons/dialogic/Images/Event Icons/Main Icons/set-value.svg" type="Texture" id=2]
|
||||
[ext_resource path="res://addons/dialogic/Editor/Pieces/Common/Spacer.tscn" type="PackedScene" id=3]
|
||||
[ext_resource path="res://addons/dialogic/Editor/Pieces/Common/PieceExtraSettings.tscn" type="PackedScene" id=4]
|
||||
[ext_resource path="res://addons/dialogic/Editor/Pieces/Common/DefinitionPicker.tscn" type="PackedScene" id=6]
|
||||
[ext_resource path="res://addons/dialogic/Editor/Pieces/Common/OperationPicker.tscn" type="PackedScene" id=7]
|
||||
[ext_resource path="res://addons/dialogic/Editor/Events/Common/Spacer.tscn" type="PackedScene" id=3]
|
||||
[ext_resource path="res://addons/dialogic/Editor/Events/Common/PieceExtraSettings.tscn" type="PackedScene" id=4]
|
||||
[ext_resource path="res://addons/dialogic/Editor/Events/Common/DefinitionPicker.tscn" type="PackedScene" id=6]
|
||||
[ext_resource path="res://addons/dialogic/Editor/Events/Common/OperationPicker.tscn" type="PackedScene" id=7]
|
||||
|
||||
|
||||
|
||||
[sub_resource type="StyleBoxFlat" id=1]
|
|
@ -3,7 +3,7 @@ extends Control
|
|||
|
||||
var text_height = 21
|
||||
var editor_reference
|
||||
var preview = ''
|
||||
var preview: String = ''
|
||||
onready var toggler = get_node("PanelContainer/VBoxContainer/Header/VisibleToggle")
|
||||
|
||||
# This is the information of this event and it will get parsed and saved to the JSON file.
|
||||
|
@ -14,14 +14,17 @@ var event_data = {
|
|||
}
|
||||
|
||||
onready var portrait_picker = $PanelContainer/VBoxContainer/Header/PortraitPicker
|
||||
onready var text_editor = $PanelContainer/VBoxContainer/TextEdit
|
||||
|
||||
func _ready():
|
||||
text_editor.syntax_highlighting = true
|
||||
text_editor.add_color_region('[', ']', get_color("axis_z_color", "Editor"))
|
||||
var _scale = get_constant("inspector_margin", "Editor")
|
||||
_scale = _scale * 0.125
|
||||
text_height = text_height * _scale
|
||||
connect("gui_input", self, '_on_gui_input')
|
||||
$PanelContainer/VBoxContainer/TextEdit.connect("focus_entered", self, "_on_TextEdit_focus_entered")
|
||||
$PanelContainer/VBoxContainer/TextEdit.set("rect_min_size", Vector2(0, 80))
|
||||
text_editor.connect("focus_entered", self, "_on_TextEdit_focus_entered")
|
||||
text_editor.set("rect_min_size", Vector2(0, 80))
|
||||
$PanelContainer/VBoxContainer/Header/CharacterPicker.connect('character_selected', self , '_on_character_selected')
|
||||
portrait_picker.get_popup().connect("index_pressed", self, '_on_portrait_selected')
|
||||
|
||||
|
@ -35,12 +38,12 @@ func _ready():
|
|||
event_data['character'] = c['file']
|
||||
|
||||
|
||||
func _on_character_selected(data):
|
||||
func _on_character_selected(data) -> void:
|
||||
event_data['character'] = data['file']
|
||||
update_preview()
|
||||
|
||||
|
||||
func _on_portrait_selected(index):
|
||||
func _on_portrait_selected(index) -> void:
|
||||
var text = portrait_picker.get_popup().get_item_text(index)
|
||||
if text == "[Don't change]":
|
||||
text = ''
|
||||
|
@ -49,28 +52,28 @@ func _on_portrait_selected(index):
|
|||
update_preview()
|
||||
|
||||
|
||||
func _on_TextEdit_text_changed():
|
||||
var text = $PanelContainer/VBoxContainer/TextEdit.text
|
||||
func _on_TextEdit_text_changed() -> void:
|
||||
var text = text_editor.text
|
||||
event_data['text'] = text
|
||||
update_preview()
|
||||
|
||||
|
||||
func load_text(text):
|
||||
func load_text(text) -> void:
|
||||
get_node("VBoxContainer/TextEdit").text = text
|
||||
event_data['text'] = text
|
||||
update_preview()
|
||||
|
||||
|
||||
func load_data(data):
|
||||
func load_data(data) -> void:
|
||||
event_data = data
|
||||
$PanelContainer/VBoxContainer/TextEdit.text = event_data['text']
|
||||
text_editor.text = event_data['text']
|
||||
update_preview()
|
||||
|
||||
|
||||
func update_preview() -> String:
|
||||
portrait_picker.set_character(event_data['character'], event_data['portrait'])
|
||||
var t = $PanelContainer/VBoxContainer/TextEdit.text
|
||||
$PanelContainer/VBoxContainer/TextEdit.rect_min_size.y = text_height * (2 + t.count('\n'))
|
||||
var t = text_editor.text
|
||||
text_editor.rect_min_size.y = text_height * (2 + t.count('\n'))
|
||||
|
||||
for c in DialogicUtil.get_character_list():
|
||||
if c['file'] == event_data['character']:
|
||||
|
@ -91,7 +94,7 @@ func update_preview() -> String:
|
|||
return preview
|
||||
|
||||
|
||||
func _on_gui_input(event):
|
||||
func _on_gui_input(event) -> void:
|
||||
if event is InputEventMouseButton and event.is_pressed() and event.doubleclick:
|
||||
if event.button_index == 1:
|
||||
if toggler.pressed:
|
||||
|
@ -100,7 +103,7 @@ func _on_gui_input(event):
|
|||
toggler.pressed = true
|
||||
|
||||
|
||||
func _on_TextEdit_focus_entered():
|
||||
func _on_TextEdit_focus_entered() -> void:
|
||||
# propagate to timeline to make this text event as active selected
|
||||
# to help improve keyboard shortcut workflows
|
||||
# only maybe only do this on left click since mouse wheel and
|
||||
|
@ -112,14 +115,12 @@ func _on_TextEdit_focus_entered():
|
|||
# consider to make it "public" or add a public helper function
|
||||
timeline_editor._clear_selection()
|
||||
timeline_editor._select_item(self)
|
||||
pass
|
||||
|
||||
|
||||
func _on_saver_timer_timeout():
|
||||
func _on_saver_timer_timeout() -> void:
|
||||
update_preview()
|
||||
|
||||
|
||||
# gets called when the user selects this node in the timeline
|
||||
func on_timeline_selected():
|
||||
$PanelContainer/VBoxContainer/TextEdit.grab_focus()
|
||||
pass
|
||||
func on_timeline_selected() -> void:
|
||||
text_editor.grab_focus()
|
|
@ -1,12 +1,13 @@
|
|||
[gd_scene load_steps=9 format=2]
|
||||
|
||||
[ext_resource path="res://addons/dialogic/Editor/Pieces/TextBlock.gd" type="Script" id=1]
|
||||
[ext_resource path="res://addons/dialogic/Editor/Pieces/Common/VisibleToggle.tscn" type="PackedScene" id=2]
|
||||
[ext_resource path="res://addons/dialogic/Editor/Events/TextBlock.gd" type="Script" id=1]
|
||||
[ext_resource path="res://addons/dialogic/Editor/Events/Common/VisibleToggle.tscn" type="PackedScene" id=2]
|
||||
[ext_resource path="res://addons/dialogic/Images/Event Icons/Main Icons/text-event.svg" type="Texture" id=3]
|
||||
[ext_resource path="res://addons/dialogic/Editor/Pieces/Common/PieceExtraSettings.tscn" type="PackedScene" id=4]
|
||||
[ext_resource path="res://addons/dialogic/Editor/Pieces/Common/CharacterPicker.tscn" type="PackedScene" id=6]
|
||||
[ext_resource path="res://addons/dialogic/Editor/Pieces/Common/PortraitPicker.tscn" type="PackedScene" id=7]
|
||||
[ext_resource path="res://addons/dialogic/Editor/Pieces/Common/Spacer.tscn" type="PackedScene" id=8]
|
||||
[ext_resource path="res://addons/dialogic/Editor/Events/Common/PieceExtraSettings.tscn" type="PackedScene" id=4]
|
||||
[ext_resource path="res://addons/dialogic/Editor/Events/Common/CharacterPicker.tscn" type="PackedScene" id=6]
|
||||
[ext_resource path="res://addons/dialogic/Editor/Events/Common/PortraitPicker.tscn" type="PackedScene" id=7]
|
||||
[ext_resource path="res://addons/dialogic/Editor/Events/Common/Spacer.tscn" type="PackedScene" id=8]
|
||||
|
||||
|
||||
|
||||
|
|
@ -1,10 +1,11 @@
|
|||
[gd_scene load_steps=8 format=2]
|
||||
|
||||
[ext_resource path="res://addons/dialogic/Images/Event Icons/Main Icons/wait-seconds.svg" type="Texture" id=1]
|
||||
[ext_resource path="res://addons/dialogic/Editor/Pieces/WaitSeconds.gd" type="Script" id=2]
|
||||
[ext_resource path="res://addons/dialogic/Editor/Pieces/Common/Spacer.tscn" type="PackedScene" id=3]
|
||||
[ext_resource path="res://addons/dialogic/Editor/Pieces/Common/PieceExtraSettings.tscn" type="PackedScene" id=4]
|
||||
[ext_resource path="res://addons/dialogic/Editor/Pieces/Common/SpinBoxPreventDnD.gd" type="Script" id=6]
|
||||
[ext_resource path="res://addons/dialogic/Editor/Events/WaitSeconds.gd" type="Script" id=2]
|
||||
[ext_resource path="res://addons/dialogic/Editor/Events/Common/Spacer.tscn" type="PackedScene" id=3]
|
||||
[ext_resource path="res://addons/dialogic/Editor/Events/Common/PieceExtraSettings.tscn" type="PackedScene" id=4]
|
||||
[ext_resource path="res://addons/dialogic/Editor/Events/Common/SpinBoxPreventDnD.gd" type="Script" id=6]
|
||||
|
||||
|
||||
|
||||
|
|
@ -284,47 +284,22 @@ func _on_ShadowOffset_value_changed(_value) -> void:
|
|||
func _on_PreviewButton_pressed() -> void:
|
||||
for i in $VBoxContainer/Panel.get_children():
|
||||
i.free()
|
||||
var dialogic_node = load("res://addons/dialogic/Dialog.tscn")
|
||||
var preview_dialog: DialogicNode = dialogic_node.instance()
|
||||
preview_dialog.timeline = ''
|
||||
var characters : Array = DialogicUtil.get_character_list()
|
||||
var character_file : String = ''
|
||||
var preview_dialog = Dialogic.start('')
|
||||
preview_dialog.preview = true
|
||||
preview_dialog.debug_mode = false
|
||||
preview_dialog.get_node('DefinitionInfo').in_theme_editor = true
|
||||
|
||||
# Random character preview if there are any
|
||||
var characters = DialogicUtil.get_character_list()
|
||||
var character_file = ''
|
||||
if characters.size():
|
||||
characters.shuffle()
|
||||
character_file = characters[0]['file']
|
||||
|
||||
# Loading the theme here because I need it for the parse_alignment
|
||||
preview_dialog.current_theme = preview_dialog._load_theme(current_theme)
|
||||
|
||||
# Creating the one event timeline for the dialog
|
||||
var text = preview_dialog._parse_definitions(n['text_preview'].text)
|
||||
preview_dialog.dialog_script['events'] = [{
|
||||
"character": character_file,
|
||||
"portrait":'',
|
||||
"text": text
|
||||
}]
|
||||
preview_dialog._parse_characters(preview_dialog.dialog_script)
|
||||
preview_dialog.settings = DialogicResources.get_settings_config()
|
||||
|
||||
# Alignment
|
||||
preview_dialog.dialog_script = {
|
||||
"events":[
|
||||
{ "set_theme": current_theme },
|
||||
{ "character": character_file, "portrait":"", "text":n['text_preview'].text }
|
||||
]
|
||||
}
|
||||
preview_dialog.parse_characters(preview_dialog.dialog_script)
|
||||
$VBoxContainer/Panel.add_child(preview_dialog)
|
||||
|
||||
preview_dialog._init_dialog()
|
||||
# Reloading the theme
|
||||
preview_dialog.current_theme = preview_dialog._load_theme(current_theme)
|
||||
|
||||
|
||||
# When not performing this step, the dialog name doesn't update the color for some reason
|
||||
# I should probably refactor the preview dialog to stop making everything manually.
|
||||
if n['name_auto_color'].pressed:
|
||||
if characters.size():
|
||||
preview_dialog.get_node('TextBubble/NameLabel').set('custom_colors/font_color', characters[0]['color'])
|
||||
|
||||
# maintaining the preview panel big enough for the dialog box
|
||||
$VBoxContainer/Panel.rect_min_size.y = preview_dialog.current_theme.get_value('box', 'size', Vector2(910, 167)).y + 90 + preview_dialog.current_theme.get_value('box', 'bottom_gap', 40)
|
||||
$VBoxContainer/Panel.rect_size.y = 0
|
||||
|
|
|
@ -11,8 +11,8 @@ onready var timeline = $TimelineArea/TimeLine
|
|||
onready var events_warning = $ScrollContainer/EventContainer/EventsWarning
|
||||
|
||||
var hovered_item = null
|
||||
var selected_style : StyleBoxFlat = load("res://addons/dialogic/Editor/Pieces/selected_styleboxflat.tres")
|
||||
var selected_style_text : StyleBoxFlat = load("res://addons/dialogic/Editor/Pieces/selected_styleboxflat_text_event.tres")
|
||||
var selected_style : StyleBoxFlat = load("res://addons/dialogic/Editor/Events/selected_styleboxflat.tres")
|
||||
var selected_style_text : StyleBoxFlat = load("res://addons/dialogic/Editor/Events/selected_styleboxflat_text_event.tres")
|
||||
var saved_style : StyleBoxFlat
|
||||
var selected_item : Node
|
||||
|
||||
|
@ -285,7 +285,7 @@ func _on_ButtonCondition_pressed() -> void:
|
|||
# Adding an event to the timeline
|
||||
func create_event(scene: String, data: Dictionary = {'no-data': true} , indent: bool = false):
|
||||
# This function will create an event in the timeline.
|
||||
var piece = load("res://addons/dialogic/Editor/Pieces/" + scene + ".tscn").instance()
|
||||
var piece = load("res://addons/dialogic/Editor/Events/" + scene + ".tscn").instance()
|
||||
piece.editor_reference = editor_reference
|
||||
if selected_item != null:
|
||||
timeline.add_child_below_node(selected_item, piece)
|
||||
|
|
|
@ -88,10 +88,18 @@ func fade_out(node = self, time = 0.5):
|
|||
|
||||
func focus():
|
||||
tween_modulate(modulate, Color(1,1,1,1))
|
||||
var _parent = get_parent()
|
||||
if _parent:
|
||||
# Make sure that this portrait is the last to be _draw -ed
|
||||
_parent.move_child(self, _parent.get_child_count())
|
||||
|
||||
|
||||
func focusout():
|
||||
tween_modulate(modulate, Color(0.5,0.5,0.5,1))
|
||||
var _parent = get_parent()
|
||||
if _parent:
|
||||
# Render this portrait first
|
||||
_parent.move_child(self, 0)
|
||||
|
||||
|
||||
func tween_modulate(from_value, to_value, time = 0.5):
|
||||
|
|
|
@ -1,10 +1,7 @@
|
|||
[gd_scene load_steps=3 format=2]
|
||||
[gd_scene load_steps=2 format=2]
|
||||
|
||||
[ext_resource path="res://addons/dialogic/Example Assets/portraits/df-1.png" type="Texture" id=1]
|
||||
[ext_resource path="res://addons/dialogic/Nodes/Portrait.gd" type="Script" id=2]
|
||||
|
||||
|
||||
|
||||
[node name="Portrait" type="Control"]
|
||||
script = ExtResource( 2 )
|
||||
__meta__ = {
|
||||
|
@ -12,9 +9,6 @@ __meta__ = {
|
|||
}
|
||||
|
||||
[node name="TextureRect" type="TextureRect" parent="."]
|
||||
margin_right = 357.0
|
||||
margin_bottom = 686.0
|
||||
texture = ExtResource( 1 )
|
||||
stretch_mode = 6
|
||||
__meta__ = {
|
||||
"_edit_use_anchors_": false
|
||||
|
|
157
addons/dialogic/Nodes/TextBubble.gd
Normal file
157
addons/dialogic/Nodes/TextBubble.gd
Normal file
|
@ -0,0 +1,157 @@
|
|||
tool
|
||||
extends Control
|
||||
|
||||
var text_speed := 0.02 # Higher = lower speed
|
||||
|
||||
onready var text_label = $RichTextLabel
|
||||
onready var name_label = $NameLabel
|
||||
onready var tween = $Tween
|
||||
|
||||
var _finished := false
|
||||
|
||||
signal text_completed()
|
||||
|
||||
|
||||
## *****************************************************************************
|
||||
## PUBLIC METHODS
|
||||
## *****************************************************************************
|
||||
|
||||
|
||||
func update_name(name: String, color: Color = Color.white, autocolor: bool=false) -> void:
|
||||
if not name.empty():
|
||||
name_label.visible = true
|
||||
# Hack to reset the size
|
||||
name_label.rect_min_size = Vector2(0, 0)
|
||||
name_label.rect_size = Vector2(-1, 40)
|
||||
# Setting the color and text
|
||||
name_label.text = name
|
||||
if autocolor:
|
||||
name_label.set('custom_colors/font_color', color)
|
||||
else:
|
||||
name_label.visible = false
|
||||
|
||||
|
||||
func update_text(text):
|
||||
# Updating the text and starting the animation from 0
|
||||
text_label.bbcode_text = text
|
||||
text_label.percent_visible = 0
|
||||
|
||||
# The call to this function needs to be deferred.
|
||||
# More info: https://github.com/godotengine/godot/issues/36381
|
||||
call_deferred("_start_text_tween")
|
||||
return true
|
||||
|
||||
|
||||
func is_finished():
|
||||
return _finished
|
||||
|
||||
|
||||
func skip():
|
||||
tween.seek(999)
|
||||
_on_Tween_tween_completed(null, null)
|
||||
|
||||
|
||||
func reset():
|
||||
name_label.text = ''
|
||||
name_label.visible = false
|
||||
|
||||
|
||||
func load_theme(theme: ConfigFile):
|
||||
# Text
|
||||
var theme_font = DialogicUtil.path_fixer_load(theme.get_value('text', 'font', 'res://addons/dialogic/Example Assets/Fonts/DefaultFont.tres'))
|
||||
text_label.set('custom_fonts/normal_font', theme_font)
|
||||
name_label.set('custom_fonts/font', theme_font)
|
||||
|
||||
var text_color = Color(theme.get_value('text', 'color', '#ffffffff'))
|
||||
text_label.set('custom_colors/default_color', text_color)
|
||||
name_label.set('custom_colors/font_color', text_color)
|
||||
|
||||
text_label.set('custom_colors/font_color_shadow', Color('#00ffffff'))
|
||||
name_label.set('custom_colors/font_color_shadow', Color('#00ffffff'))
|
||||
|
||||
if theme.get_value('text', 'shadow', false):
|
||||
var text_shadow_color = Color(theme.get_value('text', 'shadow_color', '#9e000000'))
|
||||
text_label.set('custom_colors/font_color_shadow', text_shadow_color)
|
||||
|
||||
var shadow_offset = theme.get_value('text', 'shadow_offset', Vector2(2,2))
|
||||
text_label.set('custom_constants/shadow_offset_x', shadow_offset.x)
|
||||
text_label.set('custom_constants/shadow_offset_y', shadow_offset.y)
|
||||
|
||||
|
||||
# Text speed
|
||||
text_speed = theme.get_value('text','speed', 2) * 0.01
|
||||
|
||||
# Margin
|
||||
var text_margin = theme.get_value('text', 'margin', Vector2(20, 10))
|
||||
text_label.set('margin_left', text_margin.x)
|
||||
text_label.set('margin_right', text_margin.x * -1)
|
||||
text_label.set('margin_top', text_margin.y)
|
||||
text_label.set('margin_bottom', text_margin.y * -1)
|
||||
|
||||
# Backgrounds
|
||||
$TextureRect.texture = DialogicUtil.path_fixer_load(theme.get_value('background','image', "res://addons/dialogic/Example Assets/backgrounds/background-2.png"))
|
||||
$ColorRect.color = Color(theme.get_value('background','color', "#ff000000"))
|
||||
|
||||
if theme.get_value('background', 'modulation', false) == true:
|
||||
$TextureRect.modulate = Color(theme.get_value('background', 'modulation_color', '#ffffffff'))
|
||||
else:
|
||||
$TextureRect.modulate = Color('#ffffffff')
|
||||
|
||||
$ColorRect.visible = theme.get_value('background', 'use_color', false)
|
||||
$TextureRect.visible = theme.get_value('background', 'use_image', true)
|
||||
|
||||
# Next image
|
||||
$NextIndicator.texture = DialogicUtil.path_fixer_load(theme.get_value('next_indicator', 'image', 'res://addons/dialogic/Example Assets/next-indicator/next-indicator.png'))
|
||||
|
||||
# Character Name
|
||||
$NameLabel/ColorRect.visible = theme.get_value('name', 'background_visible', false)
|
||||
$NameLabel/ColorRect.color = Color(theme.get_value('name', 'background', '#282828'))
|
||||
$NameLabel/TextureRect.visible = theme.get_value('name', 'image_visible', false)
|
||||
$NameLabel/TextureRect.texture = DialogicUtil.path_fixer_load(theme.get_value('name','image', "res://addons/dialogic/Example Assets/backgrounds/background-2.png"))
|
||||
var name_shadow_offset = theme.get_value('name', 'shadow_offset', Vector2(2,2))
|
||||
if theme.get_value('name', 'shadow_visible', true):
|
||||
name_label.set('custom_colors/font_color_shadow', Color(theme.get_value('name', 'shadow', '#9e000000')))
|
||||
name_label.set('custom_constants/shadow_offset_x', name_shadow_offset.x)
|
||||
name_label.set('custom_constants/shadow_offset_y', name_shadow_offset.y)
|
||||
name_label.rect_position.y = theme.get_value('name', 'bottom_gap', 48) * -1
|
||||
if theme.get_value('name', 'modulation', false) == true:
|
||||
$NameLabel/TextureRect.modulate = Color(theme.get_value('name', 'modulation_color', '#ffffffff'))
|
||||
else:
|
||||
$NameLabel/TextureRect.modulate = Color('#ffffffff')
|
||||
|
||||
# Setting next indicator animation
|
||||
$NextIndicator.self_modulate = Color('#ffffff')
|
||||
$NextIndicator/AnimationPlayer.play(
|
||||
theme.get_value('next_indicator', 'animation', 'Up and down')
|
||||
)
|
||||
|
||||
## *****************************************************************************
|
||||
## PRIVATE METHODS
|
||||
## *****************************************************************************
|
||||
|
||||
|
||||
func _on_Tween_tween_completed(object, key):
|
||||
_finished = true
|
||||
emit_signal("text_completed")
|
||||
|
||||
|
||||
func _start_text_tween():
|
||||
# This will start the animation that makes the text appear letter by letter
|
||||
var tween_duration = text_speed * text_label.get_total_character_count()
|
||||
tween.interpolate_property(
|
||||
text_label, "percent_visible", 0, 1, tween_duration,
|
||||
Tween.TRANS_LINEAR, Tween.EASE_IN_OUT
|
||||
)
|
||||
_finished = false
|
||||
tween.start()
|
||||
|
||||
|
||||
## *****************************************************************************
|
||||
## OVERRIDES
|
||||
## *****************************************************************************
|
||||
|
||||
|
||||
func _ready():
|
||||
reset()
|
||||
tween.connect("tween_completed", self, '_on_Tween_tween_completed')
|
||||
text_label.meta_underlined = false
|
173
addons/dialogic/Nodes/TextBubble.tscn
Normal file
173
addons/dialogic/Nodes/TextBubble.tscn
Normal file
|
@ -0,0 +1,173 @@
|
|||
[gd_scene load_steps=10 format=2]
|
||||
|
||||
[ext_resource path="res://addons/dialogic/Example Assets/Fonts/DefaultFont.tres" type="DynamicFont" id=1]
|
||||
[ext_resource path="res://addons/dialogic/Example Assets/backgrounds/background-2.png" type="Texture" id=2]
|
||||
[ext_resource path="res://addons/dialogic/Example Assets/next-indicator/next-indicator.png" type="Texture" id=3]
|
||||
[ext_resource path="res://addons/dialogic/Nodes/TextBubble.gd" type="Script" id=4]
|
||||
|
||||
[sub_resource type="StyleBoxFlat" id=1]
|
||||
bg_color = Color( 1, 1, 1, 0 )
|
||||
expand_margin_left = 10.0
|
||||
|
||||
[sub_resource type="Animation" id=2]
|
||||
resource_name = "Pulse"
|
||||
loop = true
|
||||
tracks/0/type = "value"
|
||||
tracks/0/path = NodePath(".:self_modulate")
|
||||
tracks/0/interp = 2
|
||||
tracks/0/loop_wrap = true
|
||||
tracks/0/imported = false
|
||||
tracks/0/enabled = true
|
||||
tracks/0/keys = {
|
||||
"times": PoolRealArray( 0, 0.5 ),
|
||||
"transitions": PoolRealArray( 1, 1 ),
|
||||
"update": 0,
|
||||
"values": [ Color( 1, 1, 1, 1 ), Color( 1, 1, 1, 0 ) ]
|
||||
}
|
||||
|
||||
[sub_resource type="Animation" id=3]
|
||||
resource_name = "Static"
|
||||
|
||||
[sub_resource type="Animation" id=4]
|
||||
loop = true
|
||||
tracks/0/type = "value"
|
||||
tracks/0/path = NodePath(".:margin_bottom")
|
||||
tracks/0/interp = 2
|
||||
tracks/0/loop_wrap = true
|
||||
tracks/0/imported = false
|
||||
tracks/0/enabled = true
|
||||
tracks/0/keys = {
|
||||
"times": PoolRealArray( 0, 0.5 ),
|
||||
"transitions": PoolRealArray( 1, 1 ),
|
||||
"update": 0,
|
||||
"values": [ 12.0, 55.0 ]
|
||||
}
|
||||
|
||||
[sub_resource type="StyleBoxFlat" id=5]
|
||||
content_margin_left = 10.0
|
||||
content_margin_right = 10.0
|
||||
bg_color = Color( 1, 1, 1, 0 )
|
||||
expand_margin_left = 10.0
|
||||
|
||||
[node name="TextBubble" type="Control"]
|
||||
anchor_left = 0.5
|
||||
anchor_top = 1.0
|
||||
anchor_right = 0.5
|
||||
anchor_bottom = 1.0
|
||||
margin_left = -455.0
|
||||
margin_top = 393.0
|
||||
margin_right = 455.0
|
||||
margin_bottom = 560.0
|
||||
script = ExtResource( 4 )
|
||||
__meta__ = {
|
||||
"_edit_use_anchors_": false
|
||||
}
|
||||
|
||||
[node name="ColorRect" type="ColorRect" parent="."]
|
||||
visible = false
|
||||
anchor_right = 1.0
|
||||
anchor_bottom = 1.0
|
||||
color = Color( 0, 0, 0, 1 )
|
||||
__meta__ = {
|
||||
"_edit_use_anchors_": false
|
||||
}
|
||||
|
||||
[node name="TextureRect" type="TextureRect" parent="."]
|
||||
anchor_right = 1.0
|
||||
anchor_bottom = 1.0
|
||||
texture = ExtResource( 2 )
|
||||
expand = true
|
||||
stretch_mode = 1
|
||||
__meta__ = {
|
||||
"_edit_use_anchors_": false
|
||||
}
|
||||
|
||||
[node name="RichTextLabel" type="RichTextLabel" parent="."]
|
||||
anchor_right = 1.0
|
||||
anchor_bottom = 1.0
|
||||
margin_left = 20.0
|
||||
margin_top = 10.0
|
||||
margin_right = -20.0
|
||||
margin_bottom = -10.0
|
||||
rect_clip_content = false
|
||||
custom_styles/normal = SubResource( 1 )
|
||||
custom_fonts/normal_font = ExtResource( 1 )
|
||||
custom_colors/default_color = Color( 0.423529, 0.580392, 0.74902, 1 )
|
||||
custom_colors/font_color_shadow = Color( 1, 1, 1, 0 )
|
||||
custom_constants/shadow_offset_x = 2
|
||||
custom_constants/shadow_offset_y = 2
|
||||
bbcode_enabled = true
|
||||
bbcode_text = "Placeholder text for testing and formatting."
|
||||
meta_underlined = false
|
||||
text = "Placeholder text for testing and formatting."
|
||||
__meta__ = {
|
||||
"_edit_use_anchors_": false
|
||||
}
|
||||
|
||||
[node name="NextIndicator" type="TextureRect" parent="."]
|
||||
visible = false
|
||||
anchor_left = 1.0
|
||||
anchor_top = 1.0
|
||||
anchor_right = 1.0
|
||||
anchor_bottom = 1.0
|
||||
margin_left = -36.4279
|
||||
margin_top = -35.9016
|
||||
margin_right = 14.5721
|
||||
margin_bottom = 44.8652
|
||||
rect_scale = Vector2( 0.4, 0.4 )
|
||||
texture = ExtResource( 3 )
|
||||
stretch_mode = 4
|
||||
__meta__ = {
|
||||
"_edit_use_anchors_": false
|
||||
}
|
||||
|
||||
[node name="AnimationPlayer" type="AnimationPlayer" parent="NextIndicator"]
|
||||
autoplay = "Up and down"
|
||||
anims/Pulse = SubResource( 2 )
|
||||
anims/Static = SubResource( 3 )
|
||||
"anims/Up and down" = SubResource( 4 )
|
||||
|
||||
[node name="NameLabel" type="Label" parent="."]
|
||||
margin_top = -48.0
|
||||
margin_right = 58.0
|
||||
margin_bottom = -8.0
|
||||
size_flags_vertical = 1
|
||||
custom_styles/normal = SubResource( 5 )
|
||||
custom_fonts/font = ExtResource( 1 )
|
||||
custom_colors/font_color = Color( 0.423529, 0.580392, 0.74902, 1 )
|
||||
custom_colors/font_color_shadow = Color( 0, 0, 0, 0.619608 )
|
||||
custom_constants/shadow_offset_x = 2
|
||||
custom_constants/shadow_offset_y = 2
|
||||
align = 1
|
||||
valign = 1
|
||||
__meta__ = {
|
||||
"_edit_use_anchors_": false
|
||||
}
|
||||
|
||||
[node name="ColorRect" type="ColorRect" parent="NameLabel"]
|
||||
visible = false
|
||||
show_behind_parent = true
|
||||
anchor_right = 1.0
|
||||
anchor_bottom = 1.0
|
||||
size_flags_horizontal = 15
|
||||
size_flags_vertical = 15
|
||||
color = Color( 0.156863, 0.156863, 0.156863, 1 )
|
||||
__meta__ = {
|
||||
"_edit_use_anchors_": false
|
||||
}
|
||||
|
||||
[node name="TextureRect" type="TextureRect" parent="NameLabel"]
|
||||
visible = false
|
||||
show_behind_parent = true
|
||||
anchor_right = 1.0
|
||||
anchor_bottom = 1.0
|
||||
size_flags_horizontal = 3
|
||||
size_flags_vertical = 3
|
||||
texture = ExtResource( 2 )
|
||||
expand = true
|
||||
stretch_mode = 1
|
||||
__meta__ = {
|
||||
"_edit_use_anchors_": false
|
||||
}
|
||||
|
||||
[node name="Tween" type="Tween" parent="."]
|
|
@ -1,22 +1,20 @@
|
|||
tool
|
||||
extends Control
|
||||
class_name DialogicNode
|
||||
|
||||
var last_mouse_mode = null
|
||||
var input_next: String = 'ui_accept'
|
||||
var dialog_index: int = 0
|
||||
var finished: bool = false
|
||||
var text_speed = 0.02 # Higher = lower speed
|
||||
var waiting_for_answer: bool = false
|
||||
var waiting_for_input: bool = false
|
||||
var waiting = false
|
||||
var preview = false
|
||||
var definitions = {}
|
||||
var definition_visible = false
|
||||
var waiting: bool = false
|
||||
var preview: bool = false
|
||||
var definitions: Dictionary = {}
|
||||
var definition_visible: bool = false
|
||||
|
||||
var settings
|
||||
var current_theme
|
||||
var current_timeline := ''
|
||||
var settings: ConfigFile
|
||||
var current_theme: ConfigFile
|
||||
var current_timeline: String = ''
|
||||
|
||||
## The timeline to load when starting the scene
|
||||
export(String, "TimelineDropdown") var timeline: String
|
||||
|
@ -34,110 +32,69 @@ var characters
|
|||
|
||||
onready var ChoiceButton = load("res://addons/dialogic/Nodes/ChoiceButton.tscn")
|
||||
onready var Portrait = load("res://addons/dialogic/Nodes/Portrait.tscn")
|
||||
var dialog_script = {}
|
||||
var dialog_script: Dictionary = {}
|
||||
var questions #for keeping track of the questions answered
|
||||
|
||||
onready var tween_node = $TextBubble/Tween
|
||||
|
||||
# Used to detect timeline change
|
||||
var runtime_id
|
||||
|
||||
|
||||
## *****************************************************************************
|
||||
## PUBLIC METHODS
|
||||
## *****************************************************************************
|
||||
|
||||
## Starts the dialog for the given timeline.
|
||||
##
|
||||
## This is exactly the same as using the editor:
|
||||
## you can drag and drop the scene located at /addons/dialogic/Dialog.tscn
|
||||
## and set the current timeline via the inspector.
|
||||
##
|
||||
## @param given_timeline The timeline to load. You can provide the timeline name or the filename.
|
||||
## @param reset True to reset dialogic saved data such as definitions.
|
||||
## @param debug Debug is disabled by default but can be enabled if needed.
|
||||
func start(given_timeline: String, reset: bool=true, debug: bool=false):
|
||||
show()
|
||||
reset_saves = reset
|
||||
debug_mode = debug
|
||||
runtime_id = DialogicUtil.generate_random_id()
|
||||
_load_definitions()
|
||||
_stop_close_dialog()
|
||||
if not given_timeline.empty():
|
||||
dialog_script = null
|
||||
for t in DialogicUtil.get_timeline_list():
|
||||
if t['name'] == given_timeline or t['file'] == given_timeline:
|
||||
dialog_script = _set_current_dialog(t['file'])
|
||||
if dialog_script == null:
|
||||
dialog_script = {
|
||||
"events":[{
|
||||
"character":"",
|
||||
"portrait":"",
|
||||
"text":"[color=red][Dialogic Error][/color] Could not load dialog '[color=red]" + given_timeline + "[/color]'. It seems like the timeline doesn't exists. Maybe the name is wrong?"
|
||||
}]
|
||||
}
|
||||
func _ready():
|
||||
# Loading the config files
|
||||
load_config_files()
|
||||
|
||||
# Checking if the dialog should read the code from a external file
|
||||
if not timeline.empty():
|
||||
dialog_script = set_current_dialog(timeline)
|
||||
elif dialog_script.keys().size() == 0:
|
||||
dialog_script = {
|
||||
"events":[{
|
||||
"character":"",
|
||||
"portrait":"",
|
||||
"text":"[color=red][Dialogic Error][/color] No timeline specified."
|
||||
}]
|
||||
"events":[{"character":"","portrait":"",
|
||||
"text":"[Dialogic Error] No timeline specified."}]
|
||||
}
|
||||
if not Engine.is_editor_hint():
|
||||
_init_dialog()
|
||||
|
||||
# Connecting resize signal
|
||||
get_viewport().connect("size_changed", self, "resize_main")
|
||||
resize_main()
|
||||
|
||||
# Setting everything up for the node to be default
|
||||
$DefinitionInfo.visible = false
|
||||
$TextBubble.connect("text_completed", self, "_on_text_completed")
|
||||
|
||||
# Getting the character information
|
||||
characters = DialogicUtil.get_character_list()
|
||||
|
||||
if Engine.is_editor_hint():
|
||||
if preview:
|
||||
load_dialog()
|
||||
else:
|
||||
load_dialog()
|
||||
|
||||
|
||||
## Same as the start method, but using the last timeline saved.
|
||||
##
|
||||
## @param fallback The timeline to load in case no save is found.
|
||||
## @param debug Debug is disabled by default but can be enabled if needed.
|
||||
func start_from_save(fallback: String, debug: bool=false):
|
||||
var last = DialogicSingleton.get_current_timeline()
|
||||
if last.empty():
|
||||
last = fallback
|
||||
start(last, false, debug)
|
||||
|
||||
|
||||
func load_preview(theme: String):
|
||||
pass
|
||||
|
||||
|
||||
## *****************************************************************************
|
||||
## PRIVATE METHODS
|
||||
## *****************************************************************************
|
||||
|
||||
func _load_definitions():
|
||||
func load_config_files():
|
||||
if not Engine.is_editor_hint():
|
||||
if reset_saves:
|
||||
DialogicSingleton.init(reset_saves)
|
||||
definitions = DialogicSingleton.get_definitions()
|
||||
else:
|
||||
definitions = DialogicResources.get_default_definitions()
|
||||
|
||||
|
||||
func _load_config_files():
|
||||
settings = DialogicResources.get_settings_config()
|
||||
var theme_file = 'res://addons/dialogic/Editor/ThemeEditor/default-theme.cfg'
|
||||
if settings.has_section('theme'):
|
||||
theme_file = settings.get_value('theme', 'default')
|
||||
current_theme = _load_theme(theme_file)
|
||||
current_theme = load_theme(theme_file)
|
||||
|
||||
|
||||
func _resize_main():
|
||||
func resize_main():
|
||||
# This function makes sure that the dialog is displayed at the correct
|
||||
# size and position in the screen.
|
||||
if Engine.is_editor_hint() == false:
|
||||
set_global_position(Vector2(0,0))
|
||||
if ProjectSettings.get_setting("display/window/stretch/mode") != '2d':
|
||||
set_deferred('rect_size', get_viewport().size)
|
||||
_dprint("Viewport", get_viewport().size)
|
||||
dprint("Viewport", get_viewport().size)
|
||||
$TextBubble.rect_position.x = (rect_size.x / 2) - ($TextBubble.rect_size.x / 2)
|
||||
if current_theme != null:
|
||||
$TextBubble.rect_position.y = (rect_size.y) - ($TextBubble.rect_size.y) - current_theme.get_value('box', 'bottom_gap', 40)
|
||||
|
||||
|
||||
func _set_current_dialog(dialog_path: String):
|
||||
func set_current_dialog(dialog_path: String):
|
||||
current_timeline = dialog_path
|
||||
var dialog_script = DialogicResources.get_timeline_json(dialog_path)
|
||||
# All this parse events should be happening in the same loop ideally
|
||||
|
@ -145,16 +102,16 @@ func _set_current_dialog(dialog_path: String):
|
|||
# And keep adding different functions for each parsing operation.
|
||||
if settings.has_section_key('dialog', 'auto_color_names'):
|
||||
if settings.get_value('dialog', 'auto_color_names'):
|
||||
dialog_script = _parse_characters(dialog_script)
|
||||
dialog_script = parse_characters(dialog_script)
|
||||
else:
|
||||
dialog_script = _parse_characters(dialog_script)
|
||||
dialog_script = parse_characters(dialog_script)
|
||||
|
||||
dialog_script = _parse_text_lines(dialog_script)
|
||||
dialog_script = _parse_branches(dialog_script)
|
||||
dialog_script = parse_text_lines(dialog_script)
|
||||
dialog_script = parse_branches(dialog_script)
|
||||
return dialog_script
|
||||
|
||||
|
||||
func _parse_characters(dialog_script):
|
||||
func parse_characters(dialog_script):
|
||||
var names = DialogicUtil.get_character_list()
|
||||
# I should use regex here, but this is way easier :)
|
||||
if names.size() > 0:
|
||||
|
@ -170,7 +127,7 @@ func _parse_characters(dialog_script):
|
|||
return dialog_script
|
||||
|
||||
|
||||
func _parse_text_lines(unparsed_dialog_script: Dictionary) -> Dictionary:
|
||||
func parse_text_lines(unparsed_dialog_script: Dictionary) -> Dictionary:
|
||||
var parsed_dialog: Dictionary = unparsed_dialog_script
|
||||
var new_events: Array = []
|
||||
var split_new_lines = true
|
||||
|
@ -212,7 +169,7 @@ func _parse_text_lines(unparsed_dialog_script: Dictionary) -> Dictionary:
|
|||
return parsed_dialog
|
||||
|
||||
|
||||
func _parse_alignment(text):
|
||||
func parse_alignment(text):
|
||||
var alignment = current_theme.get_value('text', 'alignment', 'Left')
|
||||
var fname = current_theme.get_value('settings', 'name', 'none')
|
||||
if alignment == 'Center':
|
||||
|
@ -222,7 +179,7 @@ func _parse_alignment(text):
|
|||
return text
|
||||
|
||||
|
||||
func _parse_branches(dialog_script: Dictionary) -> Dictionary:
|
||||
func parse_branches(dialog_script: Dictionary) -> Dictionary:
|
||||
questions = [] # Resetting the questions
|
||||
|
||||
# Return the same thing if it doesn't have events
|
||||
|
@ -268,12 +225,7 @@ func _parse_branches(dialog_script: Dictionary) -> Dictionary:
|
|||
return dialog_script
|
||||
|
||||
|
||||
func _parse_definitions(text: String, variables: bool = true, glossary: bool = true):
|
||||
if Engine.is_editor_hint():
|
||||
# Loading variables again to avoid issues in the preview dialog
|
||||
_load_definitions()
|
||||
_load_config_files()
|
||||
|
||||
func parse_definitions(text: String, variables: bool = true, glossary: bool = true):
|
||||
var final_text: String = text
|
||||
if variables:
|
||||
final_text = _insert_variable_definitions(text)
|
||||
|
@ -302,240 +254,248 @@ func _insert_glossary_definitions(text: String):
|
|||
)
|
||||
return final_text;
|
||||
|
||||
func _show_dialog():
|
||||
|
||||
func _process(delta):
|
||||
$TextBubble/NextIndicator.visible = finished
|
||||
if waiting_for_answer and Input.is_action_just_released(input_next):
|
||||
if $Options.get_child_count() > 0:
|
||||
$Options.get_child(0).grab_focus()
|
||||
|
||||
|
||||
func _input(event: InputEvent) -> void:
|
||||
if not Engine.is_editor_hint() and event.is_action_pressed(input_next) and not waiting:
|
||||
if not $TextBubble.is_finished():
|
||||
# Skip to end if key is pressed during the text animation
|
||||
$TextBubble.skip()
|
||||
else:
|
||||
if waiting_for_answer == false and waiting_for_input == false:
|
||||
load_dialog()
|
||||
if settings.has_section_key('dialog', 'propagate_input'):
|
||||
var propagate_input: bool = settings.get_value('dialog', 'propagate_input')
|
||||
if not propagate_input:
|
||||
get_tree().set_input_as_handled()
|
||||
|
||||
|
||||
func show_dialog():
|
||||
visible = true
|
||||
|
||||
|
||||
func _on_Tween_tween_completed(object, key):
|
||||
finished = true
|
||||
|
||||
|
||||
func _update_name(character, color: Color = Color.white) -> void:
|
||||
func update_name(character) -> void:
|
||||
if character.has('name'):
|
||||
var parsed_name = character['name']
|
||||
var color = Color.white
|
||||
if character.has('display_name'):
|
||||
if character['display_name'] != '':
|
||||
parsed_name = character['display_name']
|
||||
if character.has('color'):
|
||||
color = character['color']
|
||||
parsed_name = _parse_definitions(parsed_name, true, false)
|
||||
$TextBubble/NameLabel.visible = true
|
||||
# Hack to reset the size
|
||||
$TextBubble/NameLabel.rect_min_size = Vector2(0, 0)
|
||||
$TextBubble/NameLabel.rect_size = Vector2(-1, 40)
|
||||
# Setting the color and text
|
||||
$TextBubble/NameLabel.text = parsed_name
|
||||
if current_theme.get_value('name', 'auto_color', true):
|
||||
$TextBubble/NameLabel.set('custom_colors/font_color', color)
|
||||
parsed_name = parse_definitions(parsed_name, true, false)
|
||||
$TextBubble.update_name(parsed_name, color, current_theme.get_value('name', 'auto_color', true))
|
||||
else:
|
||||
$TextBubble/NameLabel.visible = false
|
||||
$TextBubble.update_name('')
|
||||
|
||||
|
||||
func _update_text(text):
|
||||
# Updating the text and starting the animation from 0
|
||||
text = _parse_alignment(text)
|
||||
$TextBubble/RichTextLabel.bbcode_text = _parse_definitions(text)
|
||||
$TextBubble/RichTextLabel.percent_visible = 0
|
||||
|
||||
# The call to this function needs to be deferred.
|
||||
# More info: https://github.com/godotengine/godot/issues/36381
|
||||
call_deferred("_start_text_tween")
|
||||
return true
|
||||
func update_text(text: String) -> String:
|
||||
var final_text = parse_definitions(parse_alignment(text))
|
||||
final_text = final_text.replace('[br]', '\n')
|
||||
$TextBubble.update_text(final_text)
|
||||
return final_text
|
||||
|
||||
|
||||
func _start_text_tween():
|
||||
# This will start the animation that makes the text appear letter by letter
|
||||
var tween_duration = text_speed * $TextBubble/RichTextLabel.get_total_character_count()
|
||||
tween_node.interpolate_property(
|
||||
$TextBubble/RichTextLabel, "percent_visible", 0, 1, tween_duration,
|
||||
Tween.TRANS_LINEAR, Tween.EASE_IN_OUT
|
||||
)
|
||||
tween_node.start()
|
||||
func _on_text_completed():
|
||||
finished = true
|
||||
|
||||
|
||||
func _on_timeline_start():
|
||||
func on_timeline_start():
|
||||
if not Engine.is_editor_hint():
|
||||
DialogicSingleton.save_definitions()
|
||||
DialogicSingleton.set_current_timeline(current_timeline)
|
||||
emit_signal("event_start", "timeline", current_timeline)
|
||||
|
||||
|
||||
func _on_timeline_end():
|
||||
func on_timeline_end():
|
||||
if not Engine.is_editor_hint():
|
||||
DialogicSingleton.save_definitions()
|
||||
DialogicSingleton.set_current_timeline('')
|
||||
emit_signal("event_end", "timeline")
|
||||
|
||||
|
||||
func _init_dialog():
|
||||
dialog_index = 0
|
||||
_load_event()
|
||||
|
||||
|
||||
func _load_event_at_index(index: int, current_runtime_id: String):
|
||||
if current_runtime_id == runtime_id:
|
||||
dialog_index = index
|
||||
_load_event()
|
||||
|
||||
|
||||
func _load_next_event(current_runtime_id: String):
|
||||
# The entire event reading system should be refactored... but not today!
|
||||
if current_runtime_id == runtime_id:
|
||||
dialog_index += 1
|
||||
_load_event()
|
||||
|
||||
|
||||
func _load_event():
|
||||
func load_dialog(skip_add = false):
|
||||
# Emitting signals
|
||||
if dialog_script.has('events'):
|
||||
if dialog_index == 0:
|
||||
_on_timeline_start()
|
||||
on_timeline_start()
|
||||
elif dialog_index == dialog_script['events'].size():
|
||||
_on_timeline_end()
|
||||
on_timeline_end()
|
||||
|
||||
# Hiding definitions popup
|
||||
definition_visible = false
|
||||
$DefinitionInfo.visible = definition_visible
|
||||
|
||||
# This will load the next entry in the dialog_script array.
|
||||
if dialog_script.has('events') and dialog_index < dialog_script['events'].size():
|
||||
var func_state = _event_handler(dialog_script['events'][dialog_index])
|
||||
if (func_state is GDScriptFunctionState):
|
||||
yield(func_state, "completed")
|
||||
else:
|
||||
_close_dialog_event()
|
||||
if dialog_script.has('events'):
|
||||
if dialog_index < dialog_script['events'].size():
|
||||
var func_state = event_handler(dialog_script['events'][dialog_index])
|
||||
if (func_state is GDScriptFunctionState):
|
||||
yield(func_state, "completed")
|
||||
else:
|
||||
if Engine.is_editor_hint() == false:
|
||||
queue_free()
|
||||
if skip_add == false:
|
||||
dialog_index += 1
|
||||
|
||||
|
||||
func _event_handler(event: Dictionary):
|
||||
func reset_dialog_extras():
|
||||
$TextBubble/NameLabel.text = ''
|
||||
$TextBubble/NameLabel.visible = false
|
||||
|
||||
|
||||
func get_character(character_id):
|
||||
for c in characters:
|
||||
if c['file'] == character_id:
|
||||
return c
|
||||
return {}
|
||||
|
||||
|
||||
func event_handler(event: Dictionary):
|
||||
# Handling an event and updating the available nodes accordingly.
|
||||
_reset_dialog_extras()
|
||||
_reset_options()
|
||||
$TextBubble.reset()
|
||||
reset_options()
|
||||
|
||||
var current_runtime_id = runtime_id
|
||||
|
||||
_dprint('[D] Current Event: ', event)
|
||||
dprint('[D] Current Event: ', event)
|
||||
match event:
|
||||
{'text', 'character', 'portrait'}:
|
||||
emit_signal("event_start", "text", event)
|
||||
_show_dialog()
|
||||
show_dialog()
|
||||
finished = false
|
||||
var character_data = _get_character(event['character'])
|
||||
_update_name(character_data)
|
||||
_grab_portrait_focus(character_data, event)
|
||||
_update_text(event['text'])
|
||||
var character_data = get_character(event['character'])
|
||||
update_name(character_data)
|
||||
grab_portrait_focus(character_data, event)
|
||||
update_text(event['text'])
|
||||
{'question', 'question_id', 'options', ..}:
|
||||
emit_signal("event_start", "question", event)
|
||||
_show_dialog()
|
||||
show_dialog()
|
||||
finished = false
|
||||
waiting_for_answer = true
|
||||
if event.has('name'):
|
||||
_update_name(event['name'])
|
||||
_update_text(event['question'])
|
||||
update_name(event['name'])
|
||||
update_text(event['question'])
|
||||
if event.has('options'):
|
||||
for o in event['options']:
|
||||
_add_choice_button(o)
|
||||
add_choice_button(o)
|
||||
{'choice', 'question_id'}:
|
||||
emit_signal("event_start", "choice", event)
|
||||
for q in questions:
|
||||
if q['question_id'] == event['question_id']:
|
||||
if q['answered']:
|
||||
# If the option is for an answered question, skip to the end of it.
|
||||
_load_event_at_index(q['end_id'], current_runtime_id)
|
||||
{'input', ..}:
|
||||
emit_signal("event_start", "input", event)
|
||||
_show_dialog()
|
||||
finished = false
|
||||
waiting_for_input = true
|
||||
_update_text(event['input'])
|
||||
$TextInputDialog.window_title = event['window_title']
|
||||
$TextInputDialog.popup_centered()
|
||||
$TextInputDialog.connect("confirmed", self, "_on_input_set", [event['variable']])
|
||||
dialog_index = q['end_id']
|
||||
load_dialog(true)
|
||||
{'action', ..}:
|
||||
emit_signal("event_start", "action", event)
|
||||
if event['action'] == 'leaveall':
|
||||
if event['character'] == '[All]':
|
||||
_characters_leave_all()
|
||||
characters_leave_all()
|
||||
else:
|
||||
for p in $Portraits.get_children():
|
||||
if p.character_data['file'] == event['character']:
|
||||
p.fade_out()
|
||||
|
||||
_load_next_event(current_runtime_id)
|
||||
go_to_next_event()
|
||||
elif event['action'] == 'join':
|
||||
if event['character'] == '':
|
||||
_load_next_event(current_runtime_id)
|
||||
go_to_next_event()
|
||||
else:
|
||||
var character_data = _get_character(event['character'])
|
||||
var exists = _grab_portrait_focus(character_data)
|
||||
var character_data = get_character(event['character'])
|
||||
var exists = grab_portrait_focus(character_data)
|
||||
if exists == false:
|
||||
var p = Portrait.instance()
|
||||
var char_portrait = event['portrait']
|
||||
if char_portrait == '':
|
||||
char_portrait = 'Default'
|
||||
p.character_data = character_data
|
||||
p.init(char_portrait, _get_character_position(event['position']))
|
||||
p.init(char_portrait, get_character_position(event['position']))
|
||||
$Portraits.add_child(p)
|
||||
p.fade_in()
|
||||
_load_next_event(current_runtime_id)
|
||||
go_to_next_event()
|
||||
{'scene'}:
|
||||
get_tree().change_scene(event['scene'])
|
||||
_load_next_event(current_runtime_id)
|
||||
{'background'}:
|
||||
emit_signal("event_start", "background", event)
|
||||
$Background.visible = true
|
||||
$Background.texture = null
|
||||
if ($Background.get_child_count() > 0):
|
||||
for c in $Background.get_children():
|
||||
c.get_parent().remove_child(c)
|
||||
c.queue_free()
|
||||
if (event['background'].ends_with('.tscn')):
|
||||
var bg_scene = load(event['background'])
|
||||
if (bg_scene):
|
||||
bg_scene = bg_scene.instance()
|
||||
$Background.add_child(bg_scene)
|
||||
elif (event['background'] != ''):
|
||||
$Background.texture = load(event['background'])
|
||||
_load_next_event(current_runtime_id)
|
||||
var background = get_node_or_null('Background')
|
||||
if event['background'] == '' and background != null:
|
||||
background.queue_free()
|
||||
else:
|
||||
if background == null:
|
||||
background = TextureRect.new()
|
||||
background.expand = true
|
||||
background.name = 'Background'
|
||||
background.anchor_right = 1
|
||||
background.anchor_bottom = 1
|
||||
background.stretch_mode = TextureRect.STRETCH_SCALE
|
||||
background.show_behind_parent = true
|
||||
add_child(background)
|
||||
background.texture = null
|
||||
if (background.get_child_count() > 0):
|
||||
for c in background.get_children():
|
||||
c.get_parent().remove_child(c)
|
||||
c.queue_free()
|
||||
if (event['background'].ends_with('.tscn')):
|
||||
var bg_scene = load(event['background'])
|
||||
if (bg_scene):
|
||||
bg_scene = bg_scene.instance()
|
||||
background.add_child(bg_scene)
|
||||
elif (event['background'] != ''):
|
||||
background.texture = load(event['background'])
|
||||
go_to_next_event()
|
||||
{'audio'}, {'audio', 'file'}:
|
||||
emit_signal("event_start", "audio", event)
|
||||
if event['audio'] == 'play' and 'file' in event.keys() and not event['file'].empty():
|
||||
$FX/AudioStreamPlayer.stream = load(event['file'])
|
||||
$FX/AudioStreamPlayer.play()
|
||||
var audio = get_node_or_null('AudioEvent')
|
||||
if audio == null:
|
||||
audio = AudioStreamPlayer.new()
|
||||
audio.name = 'AudioEvent'
|
||||
add_child(audio)
|
||||
audio.stream = load(event['file'])
|
||||
audio.play()
|
||||
print('play')
|
||||
else:
|
||||
$FX/AudioStreamPlayer.stop()
|
||||
_load_next_event(current_runtime_id)
|
||||
var audio = get_node_or_null('AudioEvent')
|
||||
if audio != null:
|
||||
audio.stop()
|
||||
audio.queue_free()
|
||||
go_to_next_event()
|
||||
{'background-music'}, {'background-music', 'file'}:
|
||||
emit_signal("event_start", "background-music", event)
|
||||
if event['background-music'] == 'play' and 'file' in event.keys() and not event['file'].empty():
|
||||
$FX/BackgroundMusic.crossfade_to(event['file'])
|
||||
else:
|
||||
$FX/BackgroundMusic.fade_out()
|
||||
_load_next_event(current_runtime_id)
|
||||
go_to_next_event()
|
||||
{'endbranch', ..}:
|
||||
emit_signal("event_start", "endbranch", event)
|
||||
_load_next_event(current_runtime_id)
|
||||
go_to_next_event()
|
||||
{'change_scene'}:
|
||||
get_tree().change_scene(event['change_scene'])
|
||||
_load_next_event(current_runtime_id)
|
||||
{'emit_signal', ..}:
|
||||
_dprint('[!] Emitting signal: dialogic_signal(', event['emit_signal'], ')')
|
||||
dprint('[!] Emitting signal: dialogic_signal(', event['emit_signal'], ')')
|
||||
emit_signal("dialogic_signal", event['emit_signal'])
|
||||
_load_next_event(current_runtime_id)
|
||||
go_to_next_event()
|
||||
{'close_dialog'}:
|
||||
emit_signal("event_start", "close_dialog", event)
|
||||
_close_dialog_event()
|
||||
close_dialog_event()
|
||||
{'set_theme'}:
|
||||
emit_signal("event_start", "set_theme", event)
|
||||
if event['set_theme'] != '':
|
||||
current_theme = _load_theme(event['set_theme'])
|
||||
_load_next_event(current_runtime_id)
|
||||
current_theme = load_theme(event['set_theme'])
|
||||
go_to_next_event()
|
||||
{'wait_seconds'}:
|
||||
emit_signal("event_start", "wait", event)
|
||||
_wait_seconds(event['wait_seconds'])
|
||||
wait_seconds(event['wait_seconds'])
|
||||
waiting = true
|
||||
{'change_timeline'}:
|
||||
dialog_script = _set_current_dialog(event['change_timeline'])
|
||||
_init_dialog()
|
||||
dialog_script = set_current_dialog(event['change_timeline'])
|
||||
dialog_index = -1
|
||||
go_to_next_event()
|
||||
{'condition', 'definition', 'value', 'question_id', ..}:
|
||||
# Treating this conditional as an option on a regular question event
|
||||
var def_value = null
|
||||
|
@ -550,19 +510,20 @@ func _event_handler(event: Dictionary):
|
|||
current_question['answered'] = !condition_met
|
||||
if !condition_met:
|
||||
# condition not met, skipping branch
|
||||
_load_event_at_index(current_question['end_id'], current_runtime_id)
|
||||
dialog_index = current_question['end_id']
|
||||
load_dialog(true)
|
||||
else:
|
||||
# condition met, entering branch
|
||||
_load_next_event(current_runtime_id)
|
||||
go_to_next_event()
|
||||
{'set_value', 'definition', ..}:
|
||||
emit_signal("event_start", "set_value", event)
|
||||
var operation = '='
|
||||
if 'operation' in event and not event['operation'].empty():
|
||||
operation = event["operation"]
|
||||
DialogicSingleton.set_variable_from_id(event['definition'], event['set_value'], operation)
|
||||
_load_next_event(current_runtime_id)
|
||||
go_to_next_event()
|
||||
{'call_node', ..}:
|
||||
_dprint('[!] Call Node signal: dialogic_signal(call_node) ', var2str(event['call_node']))
|
||||
dprint('[!] Call Node signal: dialogic_signal(call_node) ', var2str(event['call_node']))
|
||||
emit_signal("event_start", "call_node", event)
|
||||
$TextBubble.visible = false
|
||||
waiting = true
|
||||
|
@ -585,46 +546,21 @@ func _event_handler(event: Dictionary):
|
|||
|
||||
waiting = false
|
||||
$TextBubble.visible = true
|
||||
_load_next_event(current_runtime_id)
|
||||
go_to_next_event()
|
||||
_:
|
||||
visible = false
|
||||
_dprint('Other event. ', event)
|
||||
dprint('Other event. ', event)
|
||||
|
||||
$Options.visible = waiting_for_answer
|
||||
|
||||
func _reset_dialog_extras():
|
||||
$TextBubble/NameLabel.text = ''
|
||||
$TextBubble/NameLabel.visible = false
|
||||
|
||||
|
||||
func _get_character(character_id):
|
||||
for c in characters:
|
||||
if c['file'] == character_id:
|
||||
return c
|
||||
return {}
|
||||
|
||||
|
||||
func _on_input_set(variable):
|
||||
var input_value = $TextInputDialog/LineEdit.text
|
||||
if input_value == '':
|
||||
$TextInputDialog.popup_centered()
|
||||
else:
|
||||
dialog_resource.custom_variables[variable] = input_value
|
||||
waiting_for_input = false
|
||||
$TextInputDialog/LineEdit.text = ''
|
||||
$TextInputDialog.disconnect("confirmed", self, '_on_input_set')
|
||||
$TextInputDialog.visible = false
|
||||
_load_next_event(runtime_id)
|
||||
_dprint('[!] Input selected: ', input_value)
|
||||
_dprint('[!] dialog variables: ', dialog_resource.custom_variables)
|
||||
|
||||
|
||||
func _reset_options():
|
||||
func reset_options():
|
||||
# Clearing out the options after one was selected.
|
||||
for option in $Options.get_children():
|
||||
option.queue_free()
|
||||
|
||||
|
||||
func _add_choice_button(option):
|
||||
func add_choice_button(option):
|
||||
var theme = current_theme
|
||||
|
||||
var button = ChoiceButton.instance()
|
||||
|
@ -673,7 +609,7 @@ func _add_choice_button(option):
|
|||
|
||||
$Options.set('custom_constants/separation', theme.get_value('buttons', 'gap', 20))
|
||||
|
||||
button.connect("pressed", self, "_answer_question", [button, option['event_id'], option['question_id']])
|
||||
button.connect("pressed", self, "answer_question", [button, option['event_id'], option['question_id']])
|
||||
|
||||
$Options.add_child(button)
|
||||
|
||||
|
@ -682,15 +618,15 @@ func _add_choice_button(option):
|
|||
Input.set_mouse_mode(Input.MOUSE_MODE_VISIBLE) # Make sure the cursor is visible for the options selection
|
||||
|
||||
|
||||
func _answer_question(i, event_id, question_id):
|
||||
_dprint('[!] Going to ', event_id + 1, i, 'question_id:', question_id)
|
||||
_dprint('')
|
||||
func answer_question(i, event_id, question_id):
|
||||
dprint('[!] Going to ', event_id + 1, i, 'question_id:', question_id)
|
||||
dprint('')
|
||||
waiting_for_answer = false
|
||||
dialog_index = event_id
|
||||
dialog_index = event_id + 1
|
||||
questions[question_id]['answered'] = true
|
||||
_dprint(' dialog_index = ', dialog_index)
|
||||
_reset_options()
|
||||
_load_next_event(runtime_id)
|
||||
dprint(' dialog_index = ', dialog_index)
|
||||
reset_options()
|
||||
load_dialog()
|
||||
if last_mouse_mode != null:
|
||||
Input.set_mouse_mode(last_mouse_mode) # Revert to last mouse mode when selection is done
|
||||
last_mouse_mode = null
|
||||
|
@ -699,16 +635,18 @@ func _answer_question(i, event_id, question_id):
|
|||
func _on_option_selected(option, variable, value):
|
||||
dialog_resource.custom_variables[variable] = value
|
||||
waiting_for_answer = false
|
||||
_reset_options()
|
||||
_load_next_event(runtime_id)
|
||||
_dprint('[!] Option selected: ', option.text, ' value= ' , value)
|
||||
reset_options()
|
||||
load_dialog()
|
||||
dprint('[!] Option selected: ', option.text, ' value= ' , value)
|
||||
|
||||
|
||||
func _on_TextInputDialog_confirmed():
|
||||
pass # Replace with function body.
|
||||
func go_to_next_event():
|
||||
# The entire event reading system should be refactored... but not today!
|
||||
dialog_index += 1
|
||||
load_dialog(true)
|
||||
|
||||
|
||||
func _grab_portrait_focus(character_data, event: Dictionary = {}) -> bool:
|
||||
func grab_portrait_focus(character_data, event: Dictionary = {}) -> bool:
|
||||
var exists = false
|
||||
var visually_focus = true
|
||||
if settings.has_section_key('dialog', 'dim_characters'):
|
||||
|
@ -729,7 +667,7 @@ func _grab_portrait_focus(character_data, event: Dictionary = {}) -> bool:
|
|||
return exists
|
||||
|
||||
|
||||
func _get_character_position(positions) -> String:
|
||||
func get_character_position(positions) -> String:
|
||||
if positions['0']:
|
||||
return 'left'
|
||||
if positions['1']:
|
||||
|
@ -743,64 +681,19 @@ func _get_character_position(positions) -> String:
|
|||
return 'left'
|
||||
|
||||
|
||||
func _deferred_resize(current_size, result):
|
||||
func deferred_resize(current_size, result):
|
||||
#var result = theme.get_value('box', 'size', Vector2(910, 167))
|
||||
$TextBubble.rect_size = result
|
||||
if current_size != $TextBubble.rect_size:
|
||||
_resize_main()
|
||||
resize_main()
|
||||
|
||||
|
||||
func _load_theme(filename):
|
||||
func load_theme(filename):
|
||||
var theme = DialogicResources.get_theme_config(filename)
|
||||
|
||||
# Box size
|
||||
call_deferred('_deferred_resize', $TextBubble.rect_size, theme.get_value('box', 'size', Vector2(910, 167)))
|
||||
call_deferred('deferred_resize', $TextBubble.rect_size, theme.get_value('box', 'size', Vector2(910, 167)))
|
||||
|
||||
# Text
|
||||
var theme_font = DialogicUtil.path_fixer_load(theme.get_value('text', 'font', 'res://addons/dialogic/Example Assets/Fonts/DefaultFont.tres'))
|
||||
$TextBubble/RichTextLabel.set('custom_fonts/normal_font', theme_font)
|
||||
$TextBubble/NameLabel.set('custom_fonts/font', theme_font)
|
||||
|
||||
var text_color = Color(theme.get_value('text', 'color', '#ffffffff'))
|
||||
$TextBubble/RichTextLabel.set('custom_colors/default_color', text_color)
|
||||
$TextBubble/NameLabel.set('custom_colors/font_color', text_color)
|
||||
|
||||
$TextBubble/RichTextLabel.set('custom_colors/font_color_shadow', Color('#00ffffff'))
|
||||
$TextBubble/NameLabel.set('custom_colors/font_color_shadow', Color('#00ffffff'))
|
||||
|
||||
if theme.get_value('text', 'shadow', false):
|
||||
var text_shadow_color = Color(theme.get_value('text', 'shadow_color', '#9e000000'))
|
||||
$TextBubble/RichTextLabel.set('custom_colors/font_color_shadow', text_shadow_color)
|
||||
|
||||
var shadow_offset = theme.get_value('text', 'shadow_offset', Vector2(2,2))
|
||||
$TextBubble/RichTextLabel.set('custom_constants/shadow_offset_x', shadow_offset.x)
|
||||
$TextBubble/RichTextLabel.set('custom_constants/shadow_offset_y', shadow_offset.y)
|
||||
|
||||
|
||||
# Text speed
|
||||
text_speed = theme.get_value('text','speed', 2) * 0.01
|
||||
|
||||
# Margin
|
||||
var text_margin = theme.get_value('text', 'margin', Vector2(20, 10))
|
||||
$TextBubble/RichTextLabel.set('margin_left', text_margin.x)
|
||||
$TextBubble/RichTextLabel.set('margin_right', text_margin.x * -1)
|
||||
$TextBubble/RichTextLabel.set('margin_top', text_margin.y)
|
||||
$TextBubble/RichTextLabel.set('margin_bottom', text_margin.y * -1)
|
||||
|
||||
# Backgrounds
|
||||
$TextBubble/TextureRect.texture = DialogicUtil.path_fixer_load(theme.get_value('background','image', "res://addons/dialogic/Example Assets/backgrounds/background-2.png"))
|
||||
$TextBubble/ColorRect.color = Color(theme.get_value('background','color', "#ff000000"))
|
||||
|
||||
if theme.get_value('background', 'modulation', false) == true:
|
||||
$TextBubble/TextureRect.modulate = Color(theme.get_value('background', 'modulation_color', '#ffffffff'))
|
||||
else:
|
||||
$TextBubble/TextureRect.modulate = Color('#ffffffff')
|
||||
|
||||
$TextBubble/ColorRect.visible = theme.get_value('background', 'use_color', false)
|
||||
$TextBubble/TextureRect.visible = theme.get_value('background', 'use_image', true)
|
||||
|
||||
# Next image
|
||||
$TextBubble/NextIndicator.texture = DialogicUtil.path_fixer_load(theme.get_value('next_indicator', 'image', 'res://addons/dialogic/Example Assets/next-indicator/next-indicator.png'))
|
||||
input_next = theme.get_value('settings', 'action_key', 'ui_accept')
|
||||
|
||||
# Definitions
|
||||
|
@ -809,27 +702,7 @@ func _load_theme(filename):
|
|||
$DefinitionInfo/VBoxContainer/Content.set('custom_fonts/normal_font', definitions_font)
|
||||
$DefinitionInfo/VBoxContainer/Extra.set('custom_fonts/normal_font', definitions_font)
|
||||
|
||||
# Character Name
|
||||
$TextBubble/NameLabel/ColorRect.visible = theme.get_value('name', 'background_visible', false)
|
||||
$TextBubble/NameLabel/ColorRect.color = Color(theme.get_value('name', 'background', '#282828'))
|
||||
$TextBubble/NameLabel/TextureRect.visible = theme.get_value('name', 'image_visible', false)
|
||||
$TextBubble/NameLabel/TextureRect.texture = DialogicUtil.path_fixer_load(theme.get_value('name','image', "res://addons/dialogic/Example Assets/backgrounds/background-2.png"))
|
||||
var name_shadow_offset = theme.get_value('name', 'shadow_offset', Vector2(2,2))
|
||||
if theme.get_value('name', 'shadow_visible', true):
|
||||
$TextBubble/NameLabel.set('custom_colors/font_color_shadow', Color(theme.get_value('name', 'shadow', '#9e000000')))
|
||||
$TextBubble/NameLabel.set('custom_constants/shadow_offset_x', name_shadow_offset.x)
|
||||
$TextBubble/NameLabel.set('custom_constants/shadow_offset_y', name_shadow_offset.y)
|
||||
$TextBubble/NameLabel.rect_position.y = theme.get_value('name', 'bottom_gap', 48) * -1
|
||||
if theme.get_value('name', 'modulation', false) == true:
|
||||
$TextBubble/NameLabel/TextureRect.modulate = Color(theme.get_value('name', 'modulation_color', '#ffffffff'))
|
||||
else:
|
||||
$TextBubble/NameLabel/TextureRect.modulate = Color('#ffffffff')
|
||||
|
||||
# Setting next indicator animation
|
||||
$TextBubble/NextIndicator.self_modulate = Color('#ffffff')
|
||||
$TextBubble/NextIndicator/AnimationPlayer.play(
|
||||
theme.get_value('next_indicator', 'animation', 'Up and down')
|
||||
)
|
||||
$TextBubble.load_theme(theme)
|
||||
|
||||
return theme
|
||||
|
||||
|
@ -845,7 +718,7 @@ func _on_RichTextLabel_meta_hover_started(meta):
|
|||
'color': current_theme.get_value('definitions', 'color', '#ffbebebe'),
|
||||
})
|
||||
correct_type = true
|
||||
_dprint(d)
|
||||
dprint(d)
|
||||
|
||||
if correct_type:
|
||||
definition_visible = true
|
||||
|
@ -866,8 +739,12 @@ func _on_Definition_Timer_timeout():
|
|||
$DefinitionInfo.visible = definition_visible
|
||||
|
||||
|
||||
func _wait_seconds(seconds):
|
||||
$WaitSeconds.start(seconds)
|
||||
func wait_seconds(seconds):
|
||||
var timer = Timer.new()
|
||||
timer.name = 'WaitSeconds'
|
||||
add_child(timer)
|
||||
timer.connect("timeout", self, '_on_WaitSeconds_timeout')
|
||||
timer.start(seconds)
|
||||
$TextBubble.visible = false
|
||||
|
||||
|
||||
|
@ -875,11 +752,12 @@ func _on_WaitSeconds_timeout():
|
|||
emit_signal("event_end", "wait")
|
||||
waiting = false
|
||||
$WaitSeconds.stop()
|
||||
$WaitSeconds.queue_free()
|
||||
$TextBubble.visible = true
|
||||
_load_next_event(runtime_id)
|
||||
load_dialog()
|
||||
|
||||
|
||||
func _dprint(string, arg1='', arg2='', arg3='', arg4='' ):
|
||||
func dprint(string, arg1='', arg2='', arg3='', arg4='' ):
|
||||
# HAHAHA if you are here wondering what this is...
|
||||
# I ask myself the same question :')
|
||||
if debug_mode:
|
||||
|
@ -915,79 +793,27 @@ func _compare_definitions(def_value: String, event_value: String, condition: Str
|
|||
return condition_met
|
||||
|
||||
|
||||
func _characters_leave_all():
|
||||
for p in $Portraits.get_children():
|
||||
p.fade_out()
|
||||
func characters_leave_all():
|
||||
var portraits = get_node_or_null('Portraits')
|
||||
if portraits != null:
|
||||
for p in portraits.get_children():
|
||||
p.fade_out()
|
||||
|
||||
|
||||
func _close_dialog_event():
|
||||
var tween = $TextBubble/CloseDialog/Tween
|
||||
func close_dialog_event():
|
||||
var tween = Tween.new()
|
||||
add_child(tween)
|
||||
tween.interpolate_property($TextBubble, "modulate",
|
||||
$TextBubble.modulate, Color('#00ffffff'), 1,
|
||||
Tween.TRANS_LINEAR, Tween.EASE_IN_OUT)
|
||||
tween.start()
|
||||
$TextBubble/CloseDialog/Timer.start(2)
|
||||
_characters_leave_all()
|
||||
var close_dialog_timer = Timer.new()
|
||||
close_dialog_timer.connect("timeout", self, '_on_close_dialog_timeout')
|
||||
add_child(close_dialog_timer)
|
||||
close_dialog_timer.start(2)
|
||||
characters_leave_all()
|
||||
|
||||
|
||||
func _stop_close_dialog():
|
||||
$TextBubble.modulate = Color('#ffffffff')
|
||||
$TextBubble/CloseDialog/Tween.stop_all()
|
||||
$TextBubble/CloseDialog/Timer.stop()
|
||||
|
||||
|
||||
func _on_close_dialog_timeout(tween, close_dialog_timer):
|
||||
hide()
|
||||
_on_timeline_end()
|
||||
|
||||
|
||||
## *****************************************************************************
|
||||
## OVERRIDES
|
||||
## *****************************************************************************
|
||||
|
||||
|
||||
func _ready():
|
||||
# Loading the config files
|
||||
_load_config_files()
|
||||
|
||||
# Connecting resize signal
|
||||
get_viewport().connect("size_changed", self, "_resize_main")
|
||||
_resize_main()
|
||||
|
||||
# Setting everything up for the node to be default
|
||||
$TextBubble/NameLabel.text = ''
|
||||
$Background.visible = false
|
||||
$TextBubble/RichTextLabel.meta_underlined = false
|
||||
$DefinitionInfo.visible = false
|
||||
|
||||
$TextBubble/CloseDialog/Timer.connect("timeout", self, '_on_close_dialog_timeout')
|
||||
tween_node.connect("tween_completed", self, '_on_Tween_tween_completed')
|
||||
|
||||
# Getting the character information
|
||||
characters = DialogicUtil.get_character_list()
|
||||
|
||||
# Try to start the timeline only if specified
|
||||
if not timeline.empty():
|
||||
start(timeline)
|
||||
|
||||
|
||||
func _process(delta):
|
||||
$TextBubble/NextIndicator.visible = finished
|
||||
if waiting_for_answer and Input.is_action_just_released(input_next):
|
||||
if $Options.get_child_count() > 0:
|
||||
$Options.get_child(0).grab_focus()
|
||||
|
||||
|
||||
func _input(event: InputEvent) -> void:
|
||||
if not Engine.is_editor_hint() and event.is_action_pressed(input_next) and not waiting:
|
||||
if tween_node.is_active():
|
||||
# Skip to end if key is pressed during the text animation
|
||||
tween_node.seek(999)
|
||||
finished = true
|
||||
else:
|
||||
if waiting_for_answer == false and waiting_for_input == false:
|
||||
_load_next_event(runtime_id)
|
||||
if settings.has_section_key('dialog', 'propagate_input'):
|
||||
var propagate_input: bool = settings.get_value('dialog', 'propagate_input')
|
||||
if not propagate_input:
|
||||
get_tree().set_input_as_handled()
|
||||
func _on_close_dialog_timeout():
|
||||
on_timeline_end()
|
||||
queue_free()
|
||||
|
|
|
@ -12,50 +12,51 @@ extends Node
|
|||
class_name Dialogic
|
||||
|
||||
|
||||
## Adds the dialogic node as a child of the given node
|
||||
## The parent node must be of type control
|
||||
## To start the timeline, use the start method from the returned node
|
||||
## Starts the dialog for the given timeline and returns a Dialog node.
|
||||
## You must then add it manually to the scene to display the dialog.
|
||||
##
|
||||
## @param parent The parent to add the dialogic node to.
|
||||
## @param dialog_scene_path If you made a custom Dialog scene or moved it from its default path, you can specify its new path here.
|
||||
## @returns The Dialog node or null if the parent was invalid.
|
||||
static func add_as_child_of(parent: Node, dialog_scene_path: String="res://addons/dialogic/Dialog.tscn") -> DialogicNode:
|
||||
if parent is Control:
|
||||
var dialog_node = get_instance(dialog_scene_path)
|
||||
parent.add_child(dialog_node)
|
||||
return dialog_node
|
||||
else:
|
||||
printerr("[Dialogic] Node's parent should be a Control")
|
||||
return null
|
||||
|
||||
## Adds the dialogic node as a child of the given node, and below the given node
|
||||
## The parent node must be of type control
|
||||
## To start the timeline, use the start method from the returned node
|
||||
## Example:
|
||||
## var new_dialog = Dialogic.start('Your Timeline Name Here')
|
||||
## add_child(new_dialog)
|
||||
##
|
||||
## @param parent The parent to add the dialogic node to.
|
||||
## @param node The node to add dialogic below.
|
||||
## @param dialog_scene_path If you made a custom Dialog scene or moved it from its default path, you can specify its new path here.
|
||||
## @returns The Dialog node or null if the parent was invalid.
|
||||
static func add_as_child_of_below_node(parent: Node, node: Node, dialog_scene_path: String="res://addons/dialogic/Dialog.tscn") -> DialogicNode:
|
||||
if parent is Control:
|
||||
var dialog_node = get_instance(dialog_scene_path)
|
||||
parent.add_child_below_node(node, dialog_node)
|
||||
return dialog_node
|
||||
else:
|
||||
printerr("[Dialogic] Node's parent should be a Control")
|
||||
return null
|
||||
|
||||
|
||||
## Gets a DialogicNode instance to be added to the tree
|
||||
## This instance can then be added to the tree using add_child()
|
||||
## To start the timeline, use the start method from the returned node
|
||||
## This is exactly the same as using the editor:
|
||||
## you can drag and drop the scene located at /addons/dialogic/Dialog.tscn
|
||||
## and set the current timeline via the inspector.
|
||||
##
|
||||
## @param timeline The timeline to load. You can provide the timeline name or the filename.
|
||||
## @param reset_saves True to reset dialogic saved data such as definitions.
|
||||
## @param dialog_scene_path If you made a custom Dialog scene or moved it from its default path, you can specify its new path here.
|
||||
## @param debug_mode Debug is disabled by default but can be enabled if needed.
|
||||
## @returns A Dialog node to be added into the scene tree.
|
||||
static func get_instance(dialog_scene_path: String="res://addons/dialogic/Dialog.tscn") -> DialogicNode:
|
||||
var dialog : = load(dialog_scene_path)
|
||||
return dialog.instance()
|
||||
static func start(timeline: String, reset_saves: bool=true, dialog_scene_path: String="res://addons/dialogic/Dialog.tscn", debug_mode: bool=false):
|
||||
|
||||
var dialog: = load(dialog_scene_path)
|
||||
var d = dialog.instance()
|
||||
d.reset_saves = reset_saves
|
||||
d.debug_mode = debug_mode
|
||||
if not timeline.empty():
|
||||
for t in DialogicUtil.get_timeline_list():
|
||||
if t['name'] == timeline or t['file'] == timeline:
|
||||
d.timeline = t['file']
|
||||
return d
|
||||
d.dialog_script = {
|
||||
"events":[{"character":"","portrait":"",
|
||||
"text":"[Dialogic Error] Loading dialog [color=red]" + timeline + "[/color]. It seems like the timeline doesn't exists. Maybe the name is wrong?"}]
|
||||
}
|
||||
return d
|
||||
|
||||
|
||||
## Same as the start method above, but using the last timeline saved.
|
||||
##
|
||||
## @param initial_timeline The timeline to load in case no save is found.
|
||||
## @param dialog_scene_path If you made a custom Dialog scene or moved it from its default path, you can specify its new path here.
|
||||
## @param debug_mode Debug is disabled by default but can be enabled if needed.
|
||||
## @returns A Dialog node to be added into the scene tree.
|
||||
static func start_from_save(initial_timeline: String, dialog_scene_path: String="res://addons/dialogic/Dialog.tscn", debug_mode: bool=false):
|
||||
var current := get_current_timeline()
|
||||
if current.empty():
|
||||
current = initial_timeline
|
||||
return start(current, false, dialog_scene_path, debug_mode)
|
||||
|
||||
## Gets default values for definitions.
|
||||
##
|
||||
|
@ -75,12 +76,12 @@ static func get_definitions() -> Dictionary:
|
|||
## Definitions are automatically saved on timeline start/end
|
||||
##
|
||||
## @returns Error status, OK if all went well
|
||||
static func save_definitions():
|
||||
func save_definitions():
|
||||
return DialogicSingleton.save_definitions()
|
||||
|
||||
|
||||
## Resets data to default values. This is the same as calling start with reset_saves to true
|
||||
static func reset_saves():
|
||||
func reset_saves():
|
||||
DialogicSingleton.init(true)
|
||||
|
||||
|
||||
|
@ -134,63 +135,3 @@ static func set_glossary(name: String, title: String, text: String, extra: Strin
|
|||
## @returns The current timeline filename, or an empty string if none was saved.
|
||||
static func get_current_timeline() -> String:
|
||||
return DialogicSingleton.get_current_timeline()
|
||||
|
||||
|
||||
## ************************************************************
|
||||
## DEPRECATED FUNCTIONS
|
||||
## These functions will be removed in future versions
|
||||
## Use at your own risk
|
||||
## ************************************************************
|
||||
|
||||
|
||||
## /!\ DEPRECATED /!\
|
||||
## Use get_instance() instead
|
||||
##
|
||||
## Starts the dialog for the given timeline and returns a Dialog node.
|
||||
## You must then add it manually to the scene to display the dialog.
|
||||
##
|
||||
## Example:
|
||||
## var new_dialog = Dialogic.start('Your Timeline Name Here')
|
||||
## add_child(new_dialog)
|
||||
##
|
||||
## This is exactly the same as using the editor:
|
||||
## you can drag and drop the scene located at /addons/dialogic/Dialog.tscn
|
||||
## and set the current timeline via the inspector.
|
||||
##
|
||||
## @param timeline The timeline to load. You can provide the timeline name or the filename.
|
||||
## @param reset_saves True to reset dialogic saved data such as definitions.
|
||||
## @param dialog_scene_path If you made a custom Dialog scene or moved it from its default path, you can specify its new path here.
|
||||
## @param debug_mode Debug is disabled by default but can be enabled if needed.
|
||||
## @returns A Dialog node to be added into the scene tree.
|
||||
static func start(timeline: String, reset_saves: bool=true, dialog_scene_path: String="res://addons/dialogic/Dialog.tscn", debug_mode: bool=false) -> DialogicNode:
|
||||
|
||||
var dialog: = load(dialog_scene_path)
|
||||
var d = dialog.instance()
|
||||
d.reset_saves = reset_saves
|
||||
d.debug_mode = debug_mode
|
||||
if not timeline.empty():
|
||||
for t in DialogicUtil.get_timeline_list():
|
||||
if t['name'] == timeline or t['file'] == timeline:
|
||||
d.timeline = t['file']
|
||||
return d
|
||||
d.dialog_script = {
|
||||
"events":[{"character":"","portrait":"",
|
||||
"text":"[Dialogic Error] Loading dialog [color=red]" + timeline + "[/color]. It seems like the timeline doesn't exists. Maybe the name is wrong?"}]
|
||||
}
|
||||
return d
|
||||
|
||||
|
||||
## /!\ DEPRECATED /!\
|
||||
## Use get_instance() instead
|
||||
##
|
||||
## Same as the start method above, but using the last timeline saved.
|
||||
##
|
||||
## @param initial_timeline The timeline to load in case no save is found.
|
||||
## @param dialog_scene_path If you made a custom Dialog scene or moved it from its default path, you can specify its new path here.
|
||||
## @param debug_mode Debug is disabled by default but can be enabled if needed.
|
||||
## @returns A Dialog node to be added into the scene tree.
|
||||
static func start_from_save(initial_timeline: String, dialog_scene_path: String="res://addons/dialogic/Dialog.tscn", debug_mode: bool=false) -> DialogicNode:
|
||||
var current := get_current_timeline()
|
||||
if current.empty():
|
||||
current = initial_timeline
|
||||
return start(current, false, dialog_scene_path, debug_mode)
|
||||
|
|
|
@ -24,11 +24,6 @@ _global_script_classes=[ {
|
|||
"language": "GDScript",
|
||||
"path": "res://addons/dialogic/Other/DialogicDefinitionsUtil.gd"
|
||||
}, {
|
||||
"base": "Control",
|
||||
"class": "DialogicNode",
|
||||
"language": "GDScript",
|
||||
"path": "res://addons/dialogic/Nodes/dialog_node.gd"
|
||||
}, {
|
||||
"base": "Reference",
|
||||
"class": "DialogicResources",
|
||||
"language": "GDScript",
|
||||
|
@ -43,7 +38,6 @@ _global_script_class_icons={
|
|||
"Dialogic": "",
|
||||
"DialogicBackgroundMusic": "",
|
||||
"DialogicDefinitionsUtil": "",
|
||||
"DialogicNode": "",
|
||||
"DialogicResources": "",
|
||||
"DialogicUtil": ""
|
||||
}
|
||||
|
|
|
@ -2,13 +2,12 @@ extends Node
|
|||
|
||||
onready var mini_game = $MiniGame;
|
||||
|
||||
onready var dialogic_node: DialogicNode;
|
||||
var dialogic_node;
|
||||
|
||||
func _ready():
|
||||
dialogic_node = Dialogic.add_as_child_of($Control)
|
||||
$Control.move_child(dialogic_node, 0)
|
||||
dialogic_node = Dialogic.start('_start')
|
||||
add_child(dialogic_node)
|
||||
dialogic_node.connect('dialogic_signal', self, "_on_Dialogic_signal_received")
|
||||
dialogic_node.start_from_save("_start")
|
||||
|
||||
|
||||
func _on_Dialogic_signal_received(value: String):
|
||||
|
@ -39,4 +38,5 @@ func start_minigame():
|
|||
func _on_MiniGame_game_over(next_timeline: String):
|
||||
print("Game over received")
|
||||
print("next timeline: " + next_timeline)
|
||||
dialogic_node.start(next_timeline)
|
||||
dialogic_node = Dialogic.start(next_timeline)
|
||||
add_child(dialogic_node)
|
||||
|
|
|
@ -6,7 +6,7 @@ func load_main_game():
|
|||
|
||||
|
||||
func _on_NewGameButton_pressed():
|
||||
Dialogic.reset_saves()
|
||||
# Dialogic.reset_saves()
|
||||
load_main_game()
|
||||
|
||||
|
||||
|
|
Loading…
Reference in a new issue