Skip to content
Draft
Show file tree
Hide file tree
Changes from 4 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
9 changes: 8 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -44,4 +44,11 @@ addons/*
!/docs/
!/docs/*
# No forget the gitbook configuration file
!.gitbook.yaml
!.gitbook.yaml

##########
# Examples
##########
# Do not forget the examples folder
!/examples/
!/examples/*
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
35 changes: 35 additions & 0 deletions examples/VisualNovel/Backgrounds/backgroundColorForest.png.import
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
[remap]

importer="texture"
type="StreamTexture"
path="res://.import/backgroundColorForest.png-381303fc1ed84ef726ff9947fb369f53.stex"
metadata={
"vram_texture": false
}

[deps]

source_file="res://examples/VisualNovel/Backgrounds/backgroundColorForest.png"
dest_files=[ "res://.import/backgroundColorForest.png-381303fc1ed84ef726ff9947fb369f53.stex" ]

[params]

compress/mode=0
compress/lossy_quality=0.7
compress/hdr_mode=0
compress/bptc_ldr=0
compress/normal_map=0
flags/repeat=0
flags/filter=true
flags/mipmaps=false
flags/anisotropic=false
flags/srgb=2
process/fix_alpha_border=true
process/premult_alpha=false
process/HDR_as_SRGB=false
process/invert_color=false
process/normal_map_invert_y=false
stream=false
size_limit=0
detect_3d=false
svg/scale=1.0
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
35 changes: 35 additions & 0 deletions examples/VisualNovel/Backgrounds/backgroundColorGrass.png.import
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
[remap]

importer="texture"
type="StreamTexture"
path="res://.import/backgroundColorGrass.png-593b0d7eb6130ce55ca13af8b367d76d.stex"
metadata={
"vram_texture": false
}

[deps]

source_file="res://examples/VisualNovel/Backgrounds/backgroundColorGrass.png"
dest_files=[ "res://.import/backgroundColorGrass.png-593b0d7eb6130ce55ca13af8b367d76d.stex" ]

[params]

compress/mode=0
compress/lossy_quality=0.7
compress/hdr_mode=0
compress/bptc_ldr=0
compress/normal_map=0
flags/repeat=0
flags/filter=true
flags/mipmaps=false
flags/anisotropic=false
flags/srgb=2
process/fix_alpha_border=true
process/premult_alpha=false
process/HDR_as_SRGB=false
process/invert_color=false
process/normal_map_invert_y=false
stream=false
size_limit=0
detect_3d=false
svg/scale=1.0
39 changes: 39 additions & 0 deletions examples/VisualNovel/DialogPiece.tscn
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
[gd_scene format=2]

[node name="DialogPiece" type="PanelContainer"]
margin_right = 1024.0
margin_bottom = 78.0
__meta__ = {
"_edit_use_anchors_": false
}

[node name="HBoxContainer" type="HBoxContainer" parent="."]
margin_left = 7.0
margin_top = 7.0
margin_right = 1017.0
margin_bottom = 71.0

[node name="Avatar" type="TextureRect" parent="HBoxContainer"]
margin_right = 64.0
margin_bottom = 64.0
rect_min_size = Vector2( 64, 64 )
expand = true

[node name="VBoxContainer" type="VBoxContainer" parent="HBoxContainer"]
margin_left = 68.0
margin_right = 1010.0
margin_bottom = 64.0
size_flags_horizontal = 3

[node name="Name" type="Label" parent="HBoxContainer/VBoxContainer"]
margin_right = 942.0
margin_bottom = 14.0
text = "Character Name"

[node name="Dialog" type="RichTextLabel" parent="HBoxContainer/VBoxContainer"]
margin_top = 18.0
margin_right = 942.0
margin_bottom = 64.0
size_flags_horizontal = 3
size_flags_vertical = 3
text = "Text text text Text text text Text text text Text text text Text text text Text text text Text text text Text text text Text text text Text text text Text text text Text text text Text text text Text text text Text text text Text text text Text text text Text text text Text text text Text text text Text text text Text text text Text text text Text text text "
54 changes: 54 additions & 0 deletions examples/VisualNovel/ICLogs.gd
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
extends Control


var piece_res = preload("res://examples/VisualNovel/DialogPiece.tscn")

onready var scroll_container = $LogLayout/ScrollContainer
onready var piece_container = $LogLayout/ScrollContainer/PieceContainer
onready var log_layout = $LogLayout

export var duplicate_logging: bool = true

func clear():
for piece in piece_container.get_children():
piece.queue_free()


func add_piece(icon: Texture, showname: String, text: String):
if not duplicate_logging:
for piece in piece_container.get_children():
var piece_name = piece.get_node("HBoxContainer/VBoxContainer/Name").text
var piece_dialog = piece.get_node("HBoxContainer/VBoxContainer/Dialog").text
if showname == piece_name and text == piece_dialog:
# This is a duplicate - don't bother logging it
return

var piece: Control = piece_res.instance()
piece.get_node("HBoxContainer/Avatar").texture = icon
piece.get_node("HBoxContainer/VBoxContainer/Name").text = showname
piece.get_node("HBoxContainer/VBoxContainer/Dialog").text = text
piece_container.add_child(piece)
yield(get_tree(), "idle_frame")
scroll_container.ensure_control_visible(piece)


func filter_pieces(search: String):
for piece in piece_container.get_children():
var piece_name = piece.get_node("HBoxContainer/VBoxContainer/Name").text
var piece_dialog = piece.get_node("HBoxContainer/VBoxContainer/Dialog").text

piece.set_visible(false)
if search == "" or piece_name.to_lower().find(search.to_lower()) != -1 \
or piece_dialog.to_lower().find(search.to_lower()) != -1:
piece.set_visible(true)


func _on_SearchString_text_changed(new_text: String):
filter_pieces(new_text)


func _on_Button_pressed():
log_layout.set_visible(not log_layout.visible)
if log_layout.visible:
yield(get_tree(), "idle_frame")
scroll_container.scroll_vertical = scroll_container.get_v_scrollbar().max_value
79 changes: 79 additions & 0 deletions examples/VisualNovel/ICLogs.tscn
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
[gd_scene load_steps=2 format=2]

[ext_resource path="res://examples/VisualNovel/ICLogs.gd" type="Script" id=2]

[node name="ICLogs" type="Control"]
anchor_right = 1.0
anchor_bottom = 1.0
mouse_filter = 2
script = ExtResource( 2 )
__meta__ = {
"_edit_lock_": true,
"_edit_use_anchors_": false
}

[node name="LogLayout" type="Control" parent="."]
visible = false
anchor_right = 1.0
anchor_bottom = 1.0
__meta__ = {
"_edit_use_anchors_": false
}

[node name="Fade" type="ColorRect" parent="LogLayout"]
anchor_right = 1.0
anchor_bottom = 1.0
size_flags_horizontal = 3
size_flags_vertical = 3
color = Color( 0, 0, 0, 0.294118 )
__meta__ = {
"_edit_use_anchors_": false
}

[node name="ScrollContainer" type="ScrollContainer" parent="LogLayout"]
anchor_left = 0.207031
anchor_top = 0.0716667
anchor_right = 0.792969
anchor_bottom = 1.0
follow_focus = true
scroll_horizontal_enabled = false
__meta__ = {
"_edit_use_anchors_": true
}

[node name="PieceContainer" type="VBoxContainer" parent="LogLayout/ScrollContainer"]
margin_right = 600.0
margin_bottom = 557.0
size_flags_horizontal = 3
size_flags_vertical = 3
__meta__ = {
"_edit_use_anchors_": true
}

[node name="SearchString" type="LineEdit" parent="LogLayout"]
anchor_left = 0.207
anchor_right = 0.793
margin_left = 0.0319824
margin_right = -0.0320435
margin_bottom = 27.0
focus_mode = 1
size_flags_horizontal = 3
__meta__ = {
"_edit_use_anchors_": false
}

[node name="Button" type="Button" parent="."]
anchor_left = 1.0
anchor_right = 1.0
margin_left = -95.0
margin_top = 10.0
margin_right = -14.0
margin_bottom = 43.0
focus_mode = 0
text = "Logs"
__meta__ = {
"_edit_use_anchors_": false
}

[connection signal="text_changed" from="LogLayout/SearchString" to="." method="_on_SearchString_text_changed"]
[connection signal="pressed" from="Button" to="." method="_on_Button_pressed"]
99 changes: 99 additions & 0 deletions examples/VisualNovel/Main.gd
Original file line number Diff line number Diff line change
@@ -0,0 +1,99 @@
extends Control

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 event_manager = $EventManager
onready var ic_logs = $ICLogs

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

var current_portrait: Portrait
var current_event: Event
var seen_events: Dictionary = {}

var skip_timer = 0.0

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:
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()

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


func set_background(bg_path: String, smooth: float = 0.5, speed: float = 1.0):
var img = load(bg_path)
if speed > 0:
screencap.material.set_shader_param("smooth_size", smooth)
var screen_img = get_tree().get_root().get_texture().get_data()
screen_img.flip_y()
var texture = ImageTexture.new()
texture.create_from_image(screen_img)
screencap.texture = texture
yield(get_tree(), "idle_frame")
background_transitions.play("transition", -1, speed)
background.set_texture(img)


func _on_EventManager_event_started(event: Event):
current_event = event


func _on_EventManager_event_finished(event: Event):
current_event = null
if event_manager.timeline in seen_events:
if not (event in seen_events[event_manager.timeline]):
seen_events[event_manager.timeline].append(event)
else:
seen_events[event_manager.timeline] = [event]
if event is EventDialogText:
var texture
if event.character and current_portrait and current_portrait.icon:
texture = ImageTexture.new()
texture.create_from_image(current_portrait.icon.get_data())
ic_logs.add_piece(texture, event.display_name, event.text)


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]
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


Loading