Skip to content
Draft
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
[gd_resource type="Resource" load_steps=12 format=2]
[gd_resource type="Resource" load_steps=17 format=2]

[ext_resource path="res://addons/event_system_plugin/resources/registered_events/_.gd" type="Script" id=1]
[ext_resource path="res://addons/event_system_plugin/events/comment.gd" type="Script" id=2]
Expand All @@ -10,8 +10,13 @@
[ext_resource path="res://addons/event_system_plugin/events/condition.gd" type="Script" id=8]
[ext_resource path="res://addons/event_system_plugin/events/show.gd" type="Script" id=9]
[ext_resource path="res://addons/event_system_plugin/events/hide.gd" type="Script" id=10]
[ext_resource path="res://addons/textalog/events/dialog/text.gd" type="Script" id=11]
[ext_resource path="res://addons/event_system_plugin/events/call_from.gd" type="Script" id=12]
[ext_resource path="res://addons/textalog/events/dialog/choice.gd" type="Script" id=13]
[ext_resource path="res://addons/textalog/events/character/change_expression.gd" type="Script" id=14]
[ext_resource path="res://addons/textalog/events/character/join.gd" type="Script" id=15]
[ext_resource path="res://addons/textalog/events/character/leave.gd" type="Script" id=16]

[resource]
script = ExtResource( 1 )
events = [ ExtResource( 3 ), ExtResource( 5 ), ExtResource( 4 ), ExtResource( 2 ), ExtResource( 6 ), ExtResource( 7 ), ExtResource( 8 ), ExtResource( 10 ), ExtResource( 9 ), ExtResource( 12 ) ]
events = [ ExtResource( 3 ), ExtResource( 5 ), ExtResource( 4 ), ExtResource( 2 ), ExtResource( 6 ), ExtResource( 7 ), ExtResource( 8 ), ExtResource( 10 ), ExtResource( 9 ), ExtResource( 12 ), ExtResource( 11 ), ExtResource( 13 ), ExtResource( 14 ), ExtResource( 15 ), ExtResource( 16 ) ]
4 changes: 2 additions & 2 deletions addons/textalog/assets/themes/default_theme/plain_black.tres
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

[ext_resource path="res://addons/textalog/assets/fonts/Poppins/godot_fonts/Poppins-Normal.tres" type="DynamicFont" id=2]

[sub_resource type="StyleBoxFlat" id=2]
[sub_resource type="StyleBoxFlat" id=7]
resource_name = "NameStyle"
content_margin_left = 16.0
content_margin_right = 16.0
Expand Down Expand Up @@ -39,5 +39,5 @@ corner_radius_bottom_left = 12
[resource]
default_font = ExtResource( 2 )
DialogNode/styles/bubble = null
DialogNode/styles/name = SubResource( 2 )
DialogNode/styles/name = SubResource( 7 )
DialogNode/styles/text = SubResource( 1 )
Empty file removed addons/textalog/events/.gdignore
Empty file.
43 changes: 43 additions & 0 deletions examples/VisualNovel/Character.gd
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
extends Control


export var main_node: NodePath
export var expression_player: NodePath
export var talk_player: NodePath

var texture

func _ready():
set_size(get_node(main_node).get_rect().size)
if is_connected("resized", self, "_on_resized"):
return
connect("resized", self, "_on_resized")


func _on_resized():
if not main_node:
push_warning("Main Node not defined on %" % self)
return
var node = get_node(main_node)
var size = node.get_rect().size
node.set_scale(Vector2(rect_size.y/size.y, rect_size.y/size.y))
node.position.x = (rect_size.x - size.x*node.scale.x)/2


func change_expression(expression: String):
if not expression_player:
push_warning("Expression Player not defined on %" % self)
return
var anim_player = get_node(expression_player)
anim_player.play(expression)


func set_talk(toggle: bool):
if not talk_player:
push_warning("Talk Player not defined on %" % self)
return
var anim_player = get_node(talk_player)
if toggle:
anim_player.play("talk")
else:
anim_player.play("RESET")
50 changes: 42 additions & 8 deletions examples/VisualNovel/Main.gd
Original file line number Diff line number Diff line change
Expand Up @@ -5,18 +5,20 @@ var transition_shader = preload("res://examples/VisualNovel/transition.gdshader"
onready var background = $Background
onready var background_transitions = $BackgroundTransitions
onready var screencap = $Screencap
onready var dialog_manager = $DialogNode.dialog_manager
onready var portrait_manager = $DialogNode.portrait_manager
onready var dialog_node = $DialogNode
onready var event_manager = $EventManager
onready var ic_logs = $ICLogs
onready var music_player = $MusicPlayer

var bgs = [
"res://examples/VisualNovel/Backgrounds/backgroundColorForest.png",
"res://examples/VisualNovel/Backgrounds/backgroundColorGrass.png",
]
var bg_index = 0

var current_character: Character
var current_portrait: Portrait
var current_timeline: Timeline
var current_event: Event
var seen_events: Dictionary = {}

Expand All @@ -27,19 +29,24 @@ export var skip_delay: float = 0.02
func _process(delta):
skip_timer += delta
var go = Input.is_action_just_pressed("ui_accept") or Input.is_action_pressed("ui_right")
if go and skip_timer > skip_delay:
if current_timeline and go and skip_timer > skip_delay:
skip_timer = 0.0
if not current_event:
event_manager.go_to_next_event()
elif event_manager.timeline in seen_events and \
current_event in seen_events[event_manager.timeline]:
dialog_manager.display_all_text()
dialog_node.dialog_manager.display_all_text()

if Input.is_action_just_pressed("ui_down"):
bg_index = (bg_index + 1) % bgs.size()
set_background(bgs[bg_index], 0, 0)


func set_music(mus_path: String):
music_player.stream = load(mus_path)
music_player.play()


func set_background(bg_path: String, smooth: float = 0.5, speed: float = 1.0):
var img = load(bg_path)
if speed > 0:
Expand All @@ -56,16 +63,26 @@ func set_background(bg_path: String, smooth: float = 0.5, speed: float = 1.0):

func _on_EventManager_event_started(event: Event):
current_event = event
if event is EventDialogText:
current_character = event.character
if current_character:
var node = dialog_node.portrait_manager.portraits[current_character]
if node.has_method("set_talk"):
node.set_talk(true)


func _on_EventManager_event_finished(event: Event):
current_event = null
var seen = false
if event_manager.timeline in seen_events:
if not (event in seen_events[event_manager.timeline]):
if event in seen_events[event_manager.timeline]:
seen = true
else:
seen_events[event_manager.timeline].append(event)
else:
seen_events[event_manager.timeline] = [event]
if event is EventDialogText:

if not seen and event is EventDialogText:
var texture
if event.character and current_portrait and current_portrait.icon:
texture = ImageTexture.new()
Expand All @@ -75,25 +92,42 @@ func _on_EventManager_event_finished(event: Event):

func _on_DialogNode_portrait_added(character, portrait):
current_portrait = portrait

# TODO: move this to its own function for easy access + more customizability
var shader_material = ShaderMaterial.new()
shader_material.shader = transition_shader
shader_material.set_shader_param("mask", load("res://examples/VisualNovel/transition3.png"))
shader_material.set_shader_param("cutoff", 1.0)
shader_material.set_shader_param("smooth_size", 0.5)
var texture_rect = portrait_manager.portraits[character]
var texture_rect = dialog_node.portrait_manager.portraits[character]
texture_rect.material = shader_material
var anim_player = $PortraitTemplate/AnimationPlayer.duplicate()
anim_player.root_node = texture_rect.get_path()
texture_rect.add_child(anim_player)
anim_player.play("transition")


func _on_DialogNode_portrait_changed(character, portrait):
current_portrait = portrait


func _on_DialogNode_portrait_removed(_character):
current_portrait = null

func _on_Investigation_investigate(obj_name, timeline):
event_manager.start_timeline(timeline)


func _on_EventManager_timeline_started(timeline_resource):
current_timeline = timeline_resource


func _on_EventManager_timeline_finished(timeline_resource):
current_timeline = null


func _on_DialogNode_text_displayed():
if current_character:
var node = dialog_node.portrait_manager.portraits[current_character]
if node.has_method("set_talk"):
node.set_talk(false)
84 changes: 78 additions & 6 deletions examples/VisualNovel/Main.tscn
Original file line number Diff line number Diff line change
@@ -1,14 +1,18 @@
[gd_scene load_steps=17 format=2]
[gd_scene load_steps=21 format=2]

[ext_resource path="res://addons/event_system_plugin/nodes/event_manager/event_manager.gd" type="Script" id=1]
[ext_resource path="res://examples/VisualNovel/transition.gdshader" type="Shader" id=2]
[ext_resource path="res://addons/textalog/nodes/dialogue_base_node/dialogue_base_node.tscn" type="PackedScene" id=3]
[ext_resource path="res://addons/textalog/nodes/dialogue_base_node/dialog_node/dialog_node.gd" type="Script" id=3]
[ext_resource path="res://examples/VisualNovel/transition3.png" type="Texture" id=4]
[ext_resource path="res://examples/VisualNovel/Main.gd" type="Script" id=5]
[ext_resource path="res://examples/VisualNovel/timelines/main.tres" type="Resource" id=6]
[ext_resource path="res://examples/VisualNovel/ICLogs.tscn" type="PackedScene" id=7]
[ext_resource path="res://icon.png" type="Texture" id=8]
[ext_resource path="res://examples/VisualNovel/transition1.png" type="Texture" id=9]
[ext_resource path="res://addons/textalog/nodes/dialogue_base_node/dialogue_base_node.gd" type="Script" id=10]
[ext_resource path="res://addons/textalog/nodes/dialogue_base_node/options_node/options_node.tscn" type="PackedScene" id=11]
[ext_resource path="res://addons/textalog/assets/themes/default_theme/plain_black.tres" type="Theme" id=12]
[ext_resource path="res://examples/VisualNovel/portrait_manager_ex.gd" type="Script" id=13]

[sub_resource type="Animation" id=2]
length = 0.001
Expand Down Expand Up @@ -126,10 +130,75 @@ __meta__ = {
anims/RESET = SubResource( 2 )
anims/transition = SubResource( 3 )

[node name="DialogNode" parent="." instance=ExtResource( 3 )]
[node name="DialogNode" type="Control" parent="."]
anchor_right = 1.0
anchor_bottom = 1.0
theme = ExtResource( 12 )
script = ExtResource( 10 )
__meta__ = {
"_edit_group_": true,
"_edit_use_anchors_": false
}
DialogNode_Path = NodePath("DialogBox/DialogManager")
PortraitNode_Path = NodePath("PortraitManager")
OptionsNode_Path = NodePath("Options")
NameNode_path = NodePath("DialogBox/CharacterName")

[node name="PortraitManager" type="Control" parent="DialogNode"]
anchor_right = 1.0
anchor_bottom = 1.0
script = ExtResource( 13 )
__meta__ = {
"_edit_use_anchors_": false
}
character_folder = "res://examples/VisualNovel/characters/"

[node name="CharacterName" parent="DialogNode/DialogBox" index="0"]
[node name="Options" parent="DialogNode" instance=ExtResource( 11 )]
margin_left = 27.0
margin_top = 94.0
margin_right = -25.0
margin_bottom = -387.0

[node name="DialogBox" type="Control" parent="DialogNode"]
anchor_right = 1.0
anchor_bottom = 1.0
__meta__ = {
"_edit_use_anchors_": false
}

[node name="CharacterName" type="Label" parent="DialogNode/DialogBox"]
anchor_left = 0.023
anchor_top = 0.643
anchor_right = 0.181
anchor_bottom = 0.72
margin_left = 0.447996
margin_top = -4.30005
margin_right = -0.344009
margin_bottom = 4.49994
grow_horizontal = 2
grow_vertical = 2
custom_styles/normal = SubResource( 7 )
text = "Sample Name"
align = 1
valign = 1
__meta__ = {
"_edit_use_anchors_": false
}

[node name="DialogManager" type="Container" parent="DialogNode/DialogBox"]
anchor_left = 0.028
anchor_top = 0.733
anchor_right = 0.977
anchor_bottom = 0.963
margin_left = 0.327999
margin_top = 0.199982
margin_right = -0.448059
margin_bottom = 0.199951
script = ExtResource( 3 )
__meta__ = {
"_edit_use_anchors_": false
}
text_show_scroll_at_end = false

[node name="Screencap" type="TextureRect" parent="."]
material = SubResource( 1 )
Expand Down Expand Up @@ -161,10 +230,13 @@ __meta__ = {
anims/RESET = SubResource( 8 )
anims/transition = SubResource( 6 )

[node name="MusicPlayer" type="AudioStreamPlayer" parent="."]

[connection signal="event_finished" from="EventManager" to="." method="_on_EventManager_event_finished"]
[connection signal="event_started" from="EventManager" to="." method="_on_EventManager_event_started"]
[connection signal="timeline_finished" from="EventManager" to="." method="_on_EventManager_timeline_finished"]
[connection signal="timeline_started" from="EventManager" to="." method="_on_EventManager_timeline_started"]
[connection signal="portrait_added" from="DialogNode" to="." method="_on_DialogNode_portrait_added"]
[connection signal="portrait_changed" from="DialogNode" to="." method="_on_DialogNode_portrait_changed"]
[connection signal="portrait_removed" from="DialogNode" to="." method="_on_DialogNode_portrait_removed"]

[editable path="DialogNode"]
[connection signal="text_displayed" from="DialogNode" to="." method="_on_DialogNode_text_displayed"]
Loading