]> Untitled Git - wolf-seeking-sheep.git/blob - addons/dialogic/Modules/DefaultLayoutParts/Layer_Textbubble/text_bubble_layer.gd
Adding import files
[wolf-seeking-sheep.git] / addons / dialogic / Modules / DefaultLayoutParts / Layer_Textbubble / text_bubble_layer.gd
1 @tool
2 extends DialogicLayoutLayer
3
4 ## This layout won't do anything on its own
5
6 @export_group("Main")
7 @export_subgroup("Text")
8 @export var text_size: int = 15
9 @export var text_color: Color = Color.BLACK
10 @export_file('*.ttf') var normal_font: String = ""
11 @export_file('*.ttf') var bold_font: String = ""
12 @export_file('*.ttf') var italic_font: String = ""
13 @export_file('*.ttf') var bold_italic_font: String = ""
14 @export var text_max_width: int = 300
15
16 @export_subgroup('Box')
17 @export var box_modulate: Color = Color.WHITE
18 @export var box_modulate_by_character_color: bool = false
19 @export var box_padding: Vector2 = Vector2(10,10)
20 @export_range(1, 999) var box_corner_radius: int = 25
21 @export_range(0.1, 5) var box_wobble_speed: float = 1
22 @export_range(0, 1) var box_wobble_amount: float = 0.5
23 @export_range(0, 1) var box_wobble_detail: float = 0.2
24
25 @export_subgroup('Behaviour')
26 @export var behaviour_distance: int = 50
27 @export var behaviour_direction: Vector2 = Vector2(1, -1)
28
29 @export_group('Name Label')
30 @export_subgroup("Name Label")
31 @export var name_label_enabled: bool = true
32 @export var name_label_font_size: int = 15
33 @export_file('*.ttf') var name_label_font: String = ""
34 @export var name_label_use_character_color: bool = true
35 @export var name_label_color: Color = Color.BLACK
36 @export_subgroup("Name Label Box")
37 @export var name_label_box_modulate: Color = Color.WHITE
38 @export var name_label_box_modulate_use_character_color: bool = false
39 @export var name_label_padding: Vector2 = Vector2(5,0)
40 @export var name_label_offset: Vector2 = Vector2(0,0)
41 @export var name_label_alignment := HBoxContainer.ALIGNMENT_BEGIN
42
43
44 @export_group('Choices')
45 @export_subgroup('Choices Text')
46 @export var choices_text_size: int = 15
47 @export_file('*.ttf') var choices_text_font: String = ""
48 @export var choices_text_color: Color = Color.DARK_SLATE_GRAY
49 @export var choices_text_color_hover: Color = Color.DARK_MAGENTA
50 @export var choices_text_color_focus: Color = Color.DARK_MAGENTA
51 @export var choices_text_color_disabled: Color = Color.DARK_GRAY
52
53 @export_subgroup('Choices Layout')
54 @export var choices_layout_alignment := FlowContainer.ALIGNMENT_END
55 @export var choices_layout_force_lines: bool = false
56 @export_file('*.tres', "*.res") var choices_base_theme: String = ""
57
58 const TextBubble := preload("res://addons/dialogic/Modules/DefaultLayoutParts/Layer_Textbubble/text_bubble.gd")
59
60 var bubbles: Array[TextBubble] = []
61 var fallback_bubble: TextBubble = null
62
63 const textbubble_scene: PackedScene = preload("res://addons/dialogic/Modules/DefaultLayoutParts/Layer_Textbubble/text_bubble.tscn")
64
65
66 func add_bubble() -> TextBubble:
67         var new_bubble: TextBubble = textbubble_scene.instantiate()
68         add_child(new_bubble)
69         bubbles.append(new_bubble)
70         return new_bubble
71
72
73 ## Called by dialogic whenever export overrides might change
74 func _apply_export_overrides() -> void:
75         pass
76
77
78
79 ## Called by the base layer before opening the bubble
80 func bubble_apply_overrides(bubble:TextBubble) -> void:
81         ## TEXT FONT AND COLOR
82         var rtl: RichTextLabel = bubble.text
83         rtl.add_theme_font_size_override(&'normal_font', text_size)
84         rtl.add_theme_font_size_override(&"normal_font_size", text_size)
85         rtl.add_theme_font_size_override(&"bold_font_size", text_size)
86         rtl.add_theme_font_size_override(&"italics_font_size", text_size)
87         rtl.add_theme_font_size_override(&"bold_italics_font_size", text_size)
88
89         rtl.add_theme_color_override(&"default_color", text_color)
90
91         if !normal_font.is_empty():
92                 rtl.add_theme_font_override(&"normal_font", load(normal_font) as Font)
93         if !bold_font.is_empty():
94                 rtl.add_theme_font_override(&"bold_font", load(bold_font) as Font)
95         if !italic_font.is_empty():
96                 rtl.add_theme_font_override(&"italitc_font", load(italic_font) as Font)
97         if !bold_italic_font.is_empty():
98                 rtl.add_theme_font_override(&"bold_italics_font", load(bold_italic_font) as Font)
99         bubble.set(&'max_width', text_max_width)
100
101
102         ## BOX & TAIL COLOR
103         var tail_and_bg_group := (bubble.get_node("Group") as CanvasGroup)
104         tail_and_bg_group.self_modulate = box_modulate
105         if box_modulate_by_character_color and bubble.current_character != null:
106                 tail_and_bg_group.self_modulate = bubble.current_character.color
107
108         var background := (bubble.get_node('%Background') as ColorRect)
109         var bg_material: ShaderMaterial = (background.material as ShaderMaterial)
110         bg_material.set_shader_parameter(&'radius', box_corner_radius)
111         bg_material.set_shader_parameter(&'wobble_amount', box_wobble_amount)
112         bg_material.set_shader_parameter(&'wobble_speed', box_wobble_speed)
113         bg_material.set_shader_parameter(&'wobble_detail', box_wobble_detail)
114
115         bubble.padding = box_padding
116
117
118         ## BEHAVIOUR
119         bubble.safe_zone = behaviour_distance
120         bubble.base_direction = behaviour_direction
121
122
123         ## NAME LABEL SETTINGS
124         var nl: DialogicNode_NameLabel = bubble.name_label
125         nl.add_theme_font_size_override(&"font_size", name_label_font_size)
126
127         if !name_label_font.is_empty():
128                 nl.add_theme_font_override(&'font', load(name_label_font) as Font)
129
130
131         if name_label_use_character_color and bubble.current_character:
132                 nl.add_theme_color_override(&"font_color", bubble.current_character.color)
133         else:
134                 nl.add_theme_color_override(&"font_color", name_label_color)
135
136         var nlp: PanelContainer = bubble.name_label_box
137         nlp.self_modulate = name_label_box_modulate
138         if name_label_box_modulate_use_character_color and bubble.current_character:
139                 nlp.self_modulate = bubble.current_character.color
140         nlp.get_theme_stylebox(&'panel').content_margin_left = name_label_padding.x
141         nlp.get_theme_stylebox(&'panel').content_margin_right = name_label_padding.x
142         nlp.get_theme_stylebox(&'panel').content_margin_top = name_label_padding.y
143         nlp.get_theme_stylebox(&'panel').content_margin_bottom = name_label_padding.y
144         bubble.name_label_offset = name_label_offset
145         bubble.name_label_alignment = name_label_alignment
146
147         nlp.get_parent().visible = name_label_enabled
148
149         ## CHOICE SETTINGS
150         if choices_layout_force_lines:
151                 bubble.add_choice_container(VBoxContainer.new(), choices_layout_alignment)
152         else:
153                 bubble.add_choice_container(HFlowContainer.new(), choices_layout_alignment)
154
155         var choice_theme: Theme = null
156         if choices_base_theme.is_empty() or not ResourceLoader.exists(choices_base_theme):
157                 choice_theme = Theme.new()
158                 var base_style := StyleBoxFlat.new()
159                 base_style.draw_center = false
160                 base_style.border_width_bottom = 2
161                 base_style.border_color = choices_text_color
162                 choice_theme.set_stylebox(&'normal', &'Button', base_style)
163                 var focus_style := (base_style.duplicate() as StyleBoxFlat)
164                 focus_style.border_color = choices_text_color_focus
165                 choice_theme.set_stylebox(&'focus', &'Button', focus_style)
166                 var hover_style := (base_style.duplicate() as StyleBoxFlat)
167                 hover_style.border_color = choices_text_color_hover
168                 choice_theme.set_stylebox(&'hover', &'Button', hover_style)
169                 var disabled_style := (base_style.duplicate() as StyleBoxFlat)
170                 disabled_style.border_color = choices_text_color_disabled
171                 choice_theme.set_stylebox(&'disabled', &'Button', disabled_style)
172                 choice_theme.set_stylebox(&'pressed', &'Button', base_style)
173         else:
174                 choice_theme = (load(choices_base_theme) as Theme)
175
176         if !choices_text_font.is_empty():
177                 choice_theme.default_font = (load(choices_text_font) as Font)
178
179         choice_theme.set_font_size(&'font_size', &'Button', choices_text_size)
180         choice_theme.set_color(&'font_color', &'Button', choices_text_color)
181         choice_theme.set_color(&'font_pressed_color', &'Button', choices_text_color)
182         choice_theme.set_color(&'font_hover_color', &'Button', choices_text_color_hover)
183         choice_theme.set_color(&'font_focus_color', &'Button', choices_text_color_focus)
184         choice_theme.set_color(&'font_disabled_color', &'Button', choices_text_color_disabled)
185         bubble.choice_container.theme = choice_theme