Initial commit

This commit is contained in:
Bad Manners 2024-03-14 00:53:46 -03:00
commit 7becdd23b6
989 changed files with 28526 additions and 0 deletions

View file

@ -0,0 +1,47 @@
extends RigidBody2D
var index = -1
var difficulty = 0.0
var catched_by = null
var current_direction = Vector2.ZERO
var minimum_speed = 0.0
func init_target(target_index, target_sprite, fishing_difficulty):
index = target_index
difficulty = fishing_difficulty
global_position = Vector2(randf_range(100, 700), randf_range(100, 340))
$Sprite2D.texture = target_sprite
minimum_speed = lerp(5.0, 150.0, difficulty)
linear_velocity = Vector2(0.5 - randf(), 0.5 - randf()).normalized() * 2 * minimum_speed
change_direction(true)
func _process(delta):
if catched_by:
global_position = catched_by.global_position
else:
if linear_velocity.length() < minimum_speed:
linear_velocity *= 1.25
if constant_force.length() > 5 * minimum_speed:
constant_force *= 0.5
else:
add_constant_central_force(current_direction * delta)
func change_direction(init: bool = false):
current_direction = (Vector2(400, 220) - global_position) \
.rotated(deg_to_rad(randf_range(-30, 30))) \
.normalized() * lerp(0.0, 40.0, difficulty)
apply_torque_impulse(randf_range(-1.0, 1.0) * difficulty)
# This conditional only exists because Godot is weird with Timers
if init:
$MovementTimer.wait_time = randf_range(2.0, 4.0)
$MovementTimer.autostart = true
else:
$MovementTimer.start(randf_range(2.0, 4.0))
func _on_movement_timer_timeout():
change_direction()
func grab_with(net_sprite_2d: AnimatedSprite2D):
catched_by = net_sprite_2d
$MovementTimer.paused = true
global_position = catched_by.global_position

View file

@ -0,0 +1,31 @@
[gd_scene load_steps=5 format=3 uid="uid://d4nyfv6r6d1an"]
[ext_resource type="Texture2D" uid="uid://d27pxmt2fxvy5" path="res://images/sprites/fishing_targets/default.png" id="1_0nylm"]
[ext_resource type="Script" path="res://scenes/logic/fishing_target.gd" id="1_1eq3o"]
[sub_resource type="PhysicsMaterial" id="PhysicsMaterial_0eaqh"]
friction = 0.0
bounce = 1.5
[sub_resource type="RectangleShape2D" id="RectangleShape2D_weeyi"]
size = Vector2(44, 30)
[node name="FishingTarget" type="RigidBody2D"]
position = Vector2(588, 142)
collision_layer = 3
collision_mask = 3
physics_material_override = SubResource("PhysicsMaterial_0eaqh")
inertia = 50.0
script = ExtResource("1_1eq3o")
[node name="CollisionShape2D" type="CollisionShape2D" parent="."]
position = Vector2(-6, 2)
shape = SubResource("RectangleShape2D_weeyi")
[node name="Sprite2D" type="Sprite2D" parent="."]
texture = ExtResource("1_0nylm")
[node name="MovementTimer" type="Timer" parent="."]
one_shot = true
[connection signal="timeout" from="MovementTimer" to="." method="_on_movement_timer_timeout"]

64
scenes/logic/net.gd Normal file
View file

@ -0,0 +1,64 @@
extends Sprite2D
signal net_dropped(dropped_position: Vector2)
var sprite_rest = preload("res://images/sprites/fishing_net/ground.png")
var sprite_grabbed = preload("res://images/sprites/fishing_net/grabbed.png")
var can_move = false
var dragging = false
var using_mouse = false
var offs = Vector2.ZERO
var starting_position = Vector2.ZERO
func _ready():
starting_position = position
func _process(delta):
if not visible:
return
if can_move and Input.is_action_just_pressed("ui_accept"):
dragging = true
using_mouse = false
begin_dragging()
elif dragging and not using_mouse and Input.is_action_just_released("ui_accept"):
stop_dragging()
if dragging:
if using_mouse:
position = get_global_mouse_position() - offs
else:
position += Input.get_vector("ui_left", "ui_right", "ui_up", "ui_down") * delta * 400
func begin_dragging():
texture = sprite_grabbed
$Shadow.visible = true
$"..".play_sfx("net_picked_up")
if using_mouse:
offs = get_global_mouse_position() - global_position
else:
offs = Vector2.ZERO
func stop_dragging():
dragging = false
visible = false
$Shadow.visible = false
texture = sprite_rest
$Button.disabled = true
$ResetTimer.start()
net_dropped.emit(position)
position = starting_position
func _on_button_down():
dragging = true
using_mouse = true
begin_dragging()
func _on_button_up():
stop_dragging()
func _on_reset_timer_timeout():
texture = sprite_rest
$Button.disabled = false
visible = true
if can_move:
$"..".play_sfx("net_returns")

View file

@ -0,0 +1,7 @@
extends CanvasLayer
func _on_autosave():
$AnimationPlayer.queue("autosave_successful")
func _on_quick_save():
$AnimationPlayer.queue("quick_save_successful")

55
scenes/logic/tes1499.tmp Normal file
View file

@ -0,0 +1,55 @@
$start_music loose_thoughts
$prompt
$option start Do the whole test
$option take_me_here Jump to prompt
$option opt2 Jump to [color=#b2b7d2]very end[/color]
$label start
$clear_sprites
$stop
$show_textbox
$expand_textbox
$set_sprite layer1 res://images/sprites/test2.png
Bard: What the [color=#0f0]fuck?![/color]
$set_sprite layer1 res://images/sprites/test2.png bounce
: I don't know, I am just writing a lot of text to make sure that it will take a long time to write all of this out.
$collapse_textbox
$stop
$expand_textbox
$stop
$set_sprite two res://images/sprites/test3.png bounce
Marco: l
m
f
a
o
$clear_sprites
$collapse_textbox
$hide_textbox
$show_textbox
$hide_textbox
$stop
# Some comment about the dialogue, maybe??
$label take_me_here
$set_sprite two res://images/sprites/test3.png
Marco: What if I just print stuff without the usual animations?
$set some_variable 9
$label redo_prompt
: Will you wait?
$prompt
$option opt1 Yes?
$option opt2 No, I think I can skip...
$label opt1
$increment some_variable
$remove_sprite layer1
:...
$wait 2000
$set_sprite layer1 res://images/sprites/test2.png bounce true
Bard: I say this as long as you pick yes! But only a few times.
$if some_variable <= 10 redo_prompt
Bard: [color=#b2b7d2](Okay, that's enough...)[/color]
$label opt2
$clear_sprites
Hehe... I'm actually a different textbox
$collapse_textbox
$hide_textbox
$goto start

View file

@ -0,0 +1,564 @@
extends Node2D
# Instructions data
var vn_labels = {}
var vn_lines = []
# Runtime
var vn_can_save = false
var vn_play_advance_noise = false
var vn_hash = ""
var vn_title = ""
var vn_music = ""
var vn_pos: int = 0
var vn_pos_savestate: int = 0
var vn_pos_offset: int = 0
var vn_sprite_map = {}
var vn_bg_animation = "RESET"
var vn_overlay_color = "00000000"
var vn_vars = {}
var vn_initial_state = {}
# Instantiable scenes
@onready var vn_sprite: PackedScene = preload("res://scenes/ui_elements/vn_sprite.tscn")
enum VNInstruction {
VN_NOOP = 100,
VN_QUIT = 101,
VN_ESCAPE = 102,
VN_LOAD = 103,
VN_COMMENT = 104,
VN_SHOW_TEXTBOX = 105,
VN_HIDE_TEXTBOX = 106,
VN_EXPAND_TEXTBOX = 107,
VN_COLLAPSE_TEXTBOX = 108,
VN_TEXT = 109,
VN_CONTINUE_AFTER_TEXT = 110,
VN_STOP = 111,
VN_GOTO = 112,
VN_LABEL = 113,
VN_SET = 114,
VN_INCREMENT = 115,
VN_DECREMENT = 116,
VN_IF = 117,
VN_PROMPT = 118,
VN_WAIT = 119,
VN_CLEAR_SPRITES = 120,
VN_SET_SPRITE = 121,
VN_REMOVE_SPRITE = 122,
VN_START_MUSIC = 123,
VN_STOP_MUSIC = 124,
VN_TITLE = 125,
VN_SET_BACKGROUND = 126,
VN_OVERLAY_COLOR = 127,
VN_PLAY_VIDEO = 128,
VN_SOUND_EFFECT = 129,
}
func parse_vn_file(input_file: String):
var file = FileAccess.open(input_file, FileAccess.READ)
var parsed_labels = {}
var parsed_lines = []
var parsed_vars = []
var is_multiline_text: bool = false
var line_count = 0
while file.get_position() < file.get_length():
var line = file.get_line().lstrip(" ").rstrip(" ")
line_count += 1
if not line:
is_multiline_text = false
elif line[0] == "#":
is_multiline_text = false
parsed_lines.append([VNInstruction.VN_COMMENT, line.right(-1).lstrip(" ")])
elif line[0] == "$":
var data = line.split(" ", false)
match data[0]:
# No parameters
"$quit":
parsed_lines.append([VNInstruction.VN_QUIT])
"$end": # Alias of $quit
parsed_lines.append([VNInstruction.VN_QUIT])
"$show_textbox":
parsed_lines.append([VNInstruction.VN_SHOW_TEXTBOX])
"$hide_textbox":
parsed_lines.append([VNInstruction.VN_HIDE_TEXTBOX])
"$expand_textbox":
parsed_lines.append([VNInstruction.VN_EXPAND_TEXTBOX])
"$collapse_textbox":
parsed_lines.append([VNInstruction.VN_COLLAPSE_TEXTBOX])
"$continue_after_text":
parsed_lines.append([VNInstruction.VN_CONTINUE_AFTER_TEXT])
"$stop":
parsed_lines.append([VNInstruction.VN_STOP])
"$prompt":
parsed_lines.append([VNInstruction.VN_PROMPT])
"$clear_sprites":
parsed_lines.append([VNInstruction.VN_CLEAR_SPRITES])
"$reset_background": # Alias of $set_background RESET
parsed_lines.append([VNInstruction.VN_SET_BACKGROUND, "RESET", false])
# One parameter
"$text_new_line": # remainder_of_the_text
if is_multiline_text:
parsed_lines[-1][2] += "\n%s" % line.split(" ", false, 1)[1].lstrip(" ").rstrip(" ")
else:
assert(false, "Cannot add new line to text without a preceding text!")
continue
"$title": # some text
parsed_lines.append([VNInstruction.VN_TITLE, line.split(" ", false, 1)[1]])
"$load": # next_vn
parsed_lines.append([VNInstruction.VN_LOAD, data[1]])
"$goto": # label_name
parsed_lines.append([VNInstruction.VN_GOTO, data[1]])
"$label": # label_name
parsed_labels[data[1]] = parsed_lines.size()
parsed_lines.append([VNInstruction.VN_LABEL, data[1]])
"$increment": # var_name
# Initialize var
if not parsed_vars.has(data[1]):
parsed_vars.append(data[1])
parsed_lines.append([VNInstruction.VN_INCREMENT, data[1]])
"$decrement": # var_name
# Initialize var
if not parsed_vars.has(data[1]):
parsed_vars.append(data[1])
parsed_lines.append([VNInstruction.VN_DECREMENT, data[1]])
"$wait": # [time_secs]
parsed_lines.append([VNInstruction.VN_WAIT, float(data[1])])
"$remove_sprite": # layer_name
parsed_lines.append([VNInstruction.VN_REMOVE_SPRITE, data[1]])
"$stop_music": # [crossfade_secs]
parsed_lines.append([VNInstruction.VN_STOP_MUSIC, 5.0])
if data.size() >= 2:
parsed_lines[-1].insert(1, float(data[1]))
"$play_video": # video_name
parsed_lines.append([VNInstruction.VN_PLAY_VIDEO, data[1]])
"$sound_effect": # sfx_name
parsed_lines.append([VNInstruction.VN_SOUND_EFFECT, data[1]])
# Two parameters
"$set_background": # bg_animation_name [await_bg_animation]
if $"../Background/AnimationPlayer".has_animation(data[1]):
parsed_lines.append([VNInstruction.VN_SET_BACKGROUND, data[1], false])
if data.size() >= 3:
if data[2] == "true":
parsed_lines[-1][2] = true
elif data[2] == "false":
parsed_lines[-1][2] = false
else:
assert(false, "Invalid set_background boolean option '%s'" % data[2])
else:
assert(false, "Unknown background animation '%s'" % data[1])
"$set": # var_name var_value
# Initialize var
if not parsed_vars.has(data[1]):
parsed_vars.append(data[1])
parsed_lines.append([VNInstruction.VN_SET, data[1], int(data[2])])
"$option": # branch_label_name text
var last_line = parsed_lines[-1]
if last_line[0] == VNInstruction.VN_PROMPT:
last_line.append([data[1], line.split(" ", false, 2)[2]])
else:
assert(false, "Error on file '%s', line %d: $option command must only come after a $prompt command" % [input_file, line_count])
"$start_music": # track_name [crossfade_secs]
parsed_lines.append([VNInstruction.VN_START_MUSIC, data[1], 0.0])
if data.size() >= 3:
parsed_lines[-1].insert(2, float(data[2]))
"$overlay_color": # color [fade_secs]
parsed_lines.append([VNInstruction.VN_OVERLAY_COLOR, Color(data[1]).to_html(), 1.0])
if data.size() >= 3:
parsed_lines[-1].insert(2, float(data[2]))
# Four parameters
"$if": # var_name comparison_operator var_value branch_label_name
# Initialize var
if not parsed_vars.has(data[1]):
parsed_vars.append(data[1])
if data[2] not in [">", "<", ">=", "<=", "==", "!="]:
assert(false, "Error on file '%s', line %d: Invalid operator for $if statement: '%s'" % [input_file, line_count, data[2]])
parsed_lines.append([VNInstruction.VN_IF, data[1], data[2], int(data[3]), data[4]])
"$set_sprite": # layer_name sprite_path [animation_name [{"flip_h":true,...}]]
parsed_lines.append([VNInstruction.VN_SET_SPRITE, data[1], data[2], "RESET", {}])
if data.size() >= 4:
parsed_lines[-1][3] = data[3]
if data.size() >= 5:
parsed_lines[-1][4] = JSON.parse_string(line.split(" ", false, 4)[4])
# Variable parameters
"$escape": # [arg [...]]
parsed_lines.append([VNInstruction.VN_ESCAPE])
parsed_lines[-1].append_array(data.slice(1))
_:
assert(false, "Error on file '%s', line %d: Unknown command '%s'" % [input_file, line_count, data])
is_multiline_text = false
else:
var data = line.split(":", true, 1)
if data.size() < 1:
# Empty dialogue (i.e. line with only ":" and spaces) is ignored
continue
elif data.size() == 1:
if is_multiline_text:
parsed_lines[-1][2] += "\n%s" % data[0].lstrip(" ").rstrip(" ")
else:
parsed_lines.append([VNInstruction.VN_TEXT, "", data[0].lstrip(" ").rstrip(" ")])
is_multiline_text = true
else:
parsed_lines.append([VNInstruction.VN_TEXT, data[0].rstrip(" "), data[1].lstrip(" ")])
is_multiline_text = true
file.close()
var vn_data = {
"labels": parsed_labels,
"vars": parsed_vars,
"lines": parsed_lines,
}
# Hash data to snapshot for save states
var hash_ctx = HashingContext.new()
hash_ctx.start(HashingContext.HASH_SHA256)
# hash_ctx.update(var_to_bytes_with_objects(vn_data))
hash_ctx.update(var_to_bytes(vn_data))
vn_data["hash"] = hash_ctx.finish().hex_encode()
return vn_data
func sprite_map_to_array():
var sprite_values = vn_sprite_map.values()
sprite_values.sort_custom(func (a, b): return a["idx"] < b["idx"])
return sprite_values.map(func (sprite): return {
"layer": vn_sprite_map.find_key(sprite),
"texture": sprite["texture"],
"properties": sprite["properties"],
})
func save_vn():
return {
"hash": vn_hash,
"title": vn_title,
"pos": vn_pos_savestate - vn_pos_offset,
"sprite_list": sprite_map_to_array(),
"bg_animation": vn_bg_animation,
"overlay_color": vn_overlay_color,
"music": vn_music,
"vars": vn_vars,
"initial_state": vn_initial_state,
}
func load_vn_data(vn_data, save_state = {}):
# Next line might not be necessary...?
vn_initial_state = save_state.get("initial_state", vn_initial_state)
vn_hash = vn_data["hash"]
# Restore original VN state if hash changed (i.e. VN was modified)
if save_state.get("hash", vn_hash) != vn_hash:
save_state = save_state.get("initial_state", {})
vn_pos = save_state.get("pos", 0)
vn_vars.merge(save_state.get("vars", {}), true)
vn_title = save_state.get("title", vn_title)
vn_music = save_state.get("music", vn_music)
var sprite_list = save_state.get("sprite_list", [])
vn_bg_animation = save_state.get("bg_animation", vn_bg_animation)
vn_overlay_color = save_state.get("overlay_color", vn_overlay_color)
vn_pos_savestate = vn_pos
# Grab VN data
vn_labels = vn_data.labels
for preloaded_var in vn_data.vars:
if preloaded_var not in vn_vars:
vn_vars[preloaded_var] = 0
# vn_initial_state["vars"].merge(vn_vars, false)
vn_lines = vn_data.lines
if vn_lines.size() > 0 and vn_lines[0][0] == VNInstruction.VN_TITLE:
vn_title = vn_lines[0][1]
$"../OverlayColor/ColorRect".color = vn_overlay_color
if sprite_list:
vn_sprite_map = {}
for i in sprite_list.size():
var sprite_data = sprite_list[i]
var curr_sprite = vn_sprite.instantiate()
curr_sprite.name = sprite_data["layer"]
$"../Sprites".add_child(curr_sprite)
populate_sprite_data(curr_sprite.get_node("Sprite"), sprite_data["texture"], sprite_data["properties"])
curr_sprite.get_node("AnimationPlayer").play("RESET")
vn_sprite_map[sprite_data["layer"]] = {
"idx": i,
"texture": sprite_data["texture"],
"properties": sprite_data["properties"],
}
$"../Background/AnimationPlayer".play(vn_bg_animation)
update_window_title()
if vn_music:
if not MusicManager.is_playing("vn_music", vn_music):
MusicManager.play("vn_music", vn_music, 0.0)
# Special case: Continue main menu music only with new game
elif vn_vars.get("autostop_music", 1) == 1 and MusicManager.is_playing():
MusicManager.stop(0.0)
# Save initial state of VN (this state is restored when VN hash changes)
if save_state.is_empty() and vn_pos == 0:
vn_initial_state = {
"title": vn_title,
"pos": 0,
"sprite_list": sprite_map_to_array(),
"bg_animation": vn_bg_animation,
"overlay_color": vn_overlay_color,
"music": vn_music,
"vars": vn_vars,
}
vn_can_save = true
func populate_sprite_data(sprite_node: Sprite2D, texture: String, properties: Dictionary):
sprite_node.texture = load("res://images/sprites/%s.png" % texture)
for prop in properties:
sprite_node[prop] = properties[prop]
func update_window_title():
if vn_title:
get_window().title = "Crossing Over - %s" % vn_title
else:
get_window().title = "Crossing Over"
func can_save() -> bool:
return vn_can_save
func can_play_sfx() -> bool:
return not FileGlobals.get_global_data("muted") and not vn_vars.get("disable_sfx", 0)
func can_play_music() -> bool:
return not FileGlobals.get_global_data("muted")
func advance_sfx():
if can_play_sfx():
#SoundManager.play("vn_sfx", "advance")
SoundManager.play_varied("vn_sfx", "advance", 1.0, FileGlobals.get_global_data("volume", 0.0))
func advance_vn(label = null) -> Array:
var continue_after_text = false
if vn_play_advance_noise:
advance_sfx()
vn_play_advance_noise = false
if label:
vn_pos = vn_labels[label]
while true:
vn_can_save = false
if vn_pos >= vn_lines.size():
return ["@eof"]
var curr_line = vn_lines[vn_pos]
vn_pos_savestate = vn_pos
vn_pos_offset = 0
vn_pos += 1
match curr_line[0]:
# Textbox handling commands
VNInstruction.VN_SHOW_TEXTBOX:
await $"../Textbox".show_textbox()
VNInstruction.VN_HIDE_TEXTBOX:
await $"../Textbox".hide_textbox()
VNInstruction.VN_EXPAND_TEXTBOX:
await $"../Textbox".expand_textbox()
VNInstruction.VN_COLLAPSE_TEXTBOX:
await $"../Textbox".collapse_textbox()
VNInstruction.VN_TEXT:
vn_can_save = true
await $"../Textbox".write_text(curr_line[2], curr_line[1])
$"../ChatLog".add_line(curr_line[2], curr_line[1])
if continue_after_text:
continue_after_text = false
else:
vn_play_advance_noise = true
break
VNInstruction.VN_CONTINUE_AFTER_TEXT:
continue_after_text = true
# Control flow commands
VNInstruction.VN_NOOP:
continue
VNInstruction.VN_TITLE:
vn_title = curr_line[1]
VNInstruction.VN_QUIT:
return ["@quit"]
VNInstruction.VN_LOAD:
# return ["@load", curr_line[1], save_vn()]
return ["@load", curr_line[1]]
VNInstruction.VN_ESCAPE:
var escape_args = ["@escape"]
for arg in curr_line.slice(1):
if arg[0] == "$":
escape_args.append(vn_vars.get(arg.right(-1), arg))
else:
escape_args.append(arg)
return escape_args
VNInstruction.VN_STOP:
vn_pos_offset = 1
vn_can_save = true
vn_play_advance_noise = true
break
VNInstruction.VN_GOTO:
vn_pos = vn_labels[curr_line[1]]
VNInstruction.VN_WAIT:
$"../Textbox".disable_textbox()
$"../Timer".start(curr_line[1])
await $"../Timer".timeout
VNInstruction.VN_LABEL:
continue
VNInstruction.VN_COMMENT:
continue
VNInstruction.VN_PROMPT:
var options_array = curr_line.slice(1)
if options_array.size() <= 0:
push_warning("Skipping prompt with no complete options.")
continue
$"../Textbox".disable_textbox()
$"../Prompt".clear_options()
# Pass new options to prompt
while options_array.size() > 0:
match options_array.pop_front():
[var option_label, var option_text]:
$"../Prompt".create_option(option_label, option_text)
var invalid_option:
push_warning("Ignoring invalid option '%s'." % invalid_option)
$"../Prompt".show_prompt()
# Save any text present in the textbox
if vn_pos_savestate > 0:
if vn_lines[vn_pos_savestate - 1][0] == VNInstruction.VN_TEXT:
vn_pos_offset = 1
vn_can_save = true
#var prompt_signal = await $"../Prompt".prompt_option_selected
#var option_label = prompt_signal[0]
#var option_text = prompt_signal[1]
match await $"../Prompt".prompt_option_selected:
[var option_label, var option_text]:
advance_sfx()
await $"../Prompt".hide_prompt()
vn_pos = vn_labels[option_label]
$"../Textbox".enable_textbox()
$"../ChatLog".add_selected_option_text(option_text)
continue
VNInstruction.VN_IF:
var condition = false
match curr_line[2]:
">":
condition = vn_vars[curr_line[1]] > curr_line[3]
"<":
condition = vn_vars[curr_line[1]] < curr_line[3]
">=":
condition = vn_vars[curr_line[1]] >= curr_line[3]
"<=":
condition = vn_vars[curr_line[1]] <= curr_line[3]
"==":
condition = vn_vars[curr_line[1]] == curr_line[3]
"!=":
condition = vn_vars[curr_line[1]] != curr_line[3]
_:
push_warning("Unknown conditional operator '%s'. Not branching." % curr_line[2])
if condition:
vn_pos = vn_labels[curr_line[4]]
# Variable mangling commands
VNInstruction.VN_SET:
vn_vars[curr_line[1]] = curr_line[2]
VNInstruction.VN_INCREMENT:
vn_vars[curr_line[1]] += 1
VNInstruction.VN_DECREMENT:
vn_vars[curr_line[1]] -= 1
# Extra media
VNInstruction.VN_CLEAR_SPRITES:
vn_sprite_map = {}
for node in $"../Sprites".get_children():
node.visible = false
$"../Sprites".remove_child(node)
node.queue_free()
VNInstruction.VN_REMOVE_SPRITE:
var curr_sprite = $"../Sprites".get_node_or_null(curr_line[1])
if curr_sprite == null:
push_warning("Can't remove unknown sprite '%s'. Ignoring." % curr_line[1])
continue
#var curr_idx = vn_sprite_map.get(curr_line[1], {"idx": -1})["idx"]
var curr_idx = curr_sprite.get_index()
#if curr_idx == -1:
# push_warning("Can't remove unknown sprite '%s'. Ignoring." % curr_line[1])
# continue
vn_sprite_map.erase(curr_line[1])
for k in vn_sprite_map.keys():
if vn_sprite_map[k]["idx"] > curr_idx:
vn_sprite_map[k]["idx"] -= 1
curr_sprite.visible = false
$"../Sprites".remove_child(curr_sprite)
curr_sprite.queue_free()
VNInstruction.VN_SET_SPRITE:
var curr_sprite = $"../Sprites".get_node_or_null(curr_line[1])
# var already_exists = curr_sprite != null
if not curr_sprite:
# Create new sprite
vn_sprite_map[curr_line[1]] = {
"idx": $"../Sprites".get_children().size(),
"texture": curr_line[2],
"properties": curr_line[4],
}
curr_sprite = vn_sprite.instantiate()
curr_sprite.name = curr_line[1]
# Make sure reveal_fishing_item doesn't flash
if curr_line[3] == "reveal_fishing_item":
curr_sprite.get_node("Sprite").self_modulate = "#000"
curr_line[4].erase("self_modulate")
else:
curr_sprite.get_node("Sprite").self_modulate = "#fff"
$"../Sprites".add_child(curr_sprite)
var sprite_node = curr_sprite.get_node("Sprite") as Sprite2D
var animation_player = curr_sprite.get_node("AnimationPlayer") as AnimationPlayer
# TODO: Figure out weird bugs with sprite props
#if not already_exists:
# animation_player.queue("RESET")
populate_sprite_data(sprite_node, curr_line[2], curr_line[4])
if curr_line[3] == "RESET":
sprite_node.visible = true
sprite_node.self_modulate = "#fff"
else:
if animation_player.get_animation_library("").has_animation(curr_line[3]):
animation_player.queue(curr_line[3])
else:
push_warning("Unknown sprite animation '%s'. Skipping animation." % curr_line[3])
VNInstruction.VN_START_MUSIC:
vn_music = curr_line[1]
if MusicManager.is_playing("vn_music", vn_music):
print_debug("Already playing track '%s'" % vn_music)
else:
MusicManager.play("vn_music", vn_music, curr_line[2])
VNInstruction.VN_STOP_MUSIC:
vn_music = ""
if MusicManager.is_playing():
MusicManager.stop(curr_line[1])
VNInstruction.VN_SOUND_EFFECT:
if can_play_sfx():
#SoundManager.play("vn_sfx", curr_line[1])
SoundManager.play_varied("vn_sfx", curr_line[1], 1.0, FileGlobals.get_global_data("volume", 0.0))
VNInstruction.VN_SET_BACKGROUND:
if $"../Background/AnimationPlayer".has_animation(curr_line[1]):
vn_bg_animation = curr_line[1]
$"../Background/AnimationPlayer".play(vn_bg_animation)
if curr_line[2]:
$"../Textbox".disable_textbox()
await $"../Background/AnimationPlayer".animation_finished
else:
push_warning("Unknown background animation '%s'. Ignoring." % curr_line[1])
VNInstruction.VN_OVERLAY_COLOR:
$"../Textbox".disable_textbox()
vn_overlay_color = curr_line[1]
var color = Color.html(vn_overlay_color)
if curr_line[2] >= 0.09:
var tween = get_tree().create_tween()
tween.tween_property($"../OverlayColor/ColorRect", "color", color, curr_line[2])
await tween.finished
else:
$"../OverlayColor/ColorRect".color = color
VNInstruction.VN_PLAY_VIDEO:
var video_file = "res://media/%s.ogv" % curr_line[1]
if not FileAccess.file_exists(video_file):
assert(false, "Video '%s.ogv' not found in res://media" % curr_line[1])
continue
$"../Textbox".disable_textbox()
var video_stream = VideoStreamTheora.new()
video_stream.file = video_file
var player: VideoStreamPlayer = $"../Video/VideoStreamPlayer"
player.stream = video_stream
#if can_play_music():
# player.volume_db = -12.0 + FileGlobals.get_global_data("volume", 0.0)
#else:
# player.volume = 0
player.volume = 0
player.visible = true
player.play()
await player.finished
player.visible = false
player.stream = null
_:
push_warning("Skipping unknown command. (%s)" % curr_line)
$"../Textbox".ready_textbox()
return []

View file

@ -0,0 +1,6 @@
[gd_scene load_steps=2 format=3 uid="uid://jfv4ss4g55mw"]
[ext_resource type="Script" path="res://scenes/logic/vn_interpreter.gd" id="1_q6fhh"]
[node name="VNInterpreter" type="Node2D"]
script = ExtResource("1_q6fhh")

View file

@ -0,0 +1,11 @@
[center]A game by Bad Manners
[url]https://badmanners.xyz[/url]
© 2024 - All rights reserved
Special thanks to:
[ul]Hans Woofington, whose encouragement made this project a reality.
B., for their unwavering friendship.
destinyisbad1, for the support since the very beginning.
asofyeun, for supporting me on SubscribeStar.[/ul]
[url=licenses]Open third-party licenses[/url][/center]

View file

@ -0,0 +1,5 @@
[center]
BONUS
[url=bonus_music]Music room[/url]
[url=bonus_animation]Play video[/url]
[url=bonus_fishing]Fishing minigame[/url][/center]

View file

@ -0,0 +1,78 @@
extends Node2D
var all_targets = []
var targets_in_net = []
var grabbed_target = null
var boat_is_moving = false
var net_is_dropped = false
var fishing_target_packed_scene: PackedScene = preload("res://scenes/logic/fishing_target.tscn")
signal fished(name: String)
signal fished_all_targets
# Debug autostart
#func _ready():
# start_fishing_minigame(
# [{"name": "test1", "sprite": load("res://images/sprites/fishing_targets/test.png")}],
# 0.0,
# false,
# )
func _process(delta):
if boat_is_moving and net_is_dropped:
$ReleasedNet.position += Vector2.UP * 70.0 * delta
func play_sfx(sfx):
if $"../VNInterpreter".can_play_sfx():
#SoundManager.play("fishing_sfx", sfx)
SoundManager.play_varied("fishing_sfx", sfx, 1.0, FileGlobals.get_global_data("volume", 0.0))
func start_fishing_minigame(targets, difficulty, is_moving = false):
all_targets = targets
boat_is_moving = is_moving
if boat_is_moving:
$Background.play("fishing_moving")
else:
$Background.play("fishing_stopped")
$Net.visible = true
$Net/Button.disabled = false
for i in all_targets.size():
var target = fishing_target_packed_scene.instantiate()
target.init_target(i, all_targets[i]["sprite"], difficulty)
$FishingTargets.add_child(target)
func _on_net_dropped(dropped_position):
$ReleasedNet.play("default")
net_is_dropped = true
$ReleasedNet.position = dropped_position + 140 * Vector2.DOWN
$ReleasedNet.visible = true
$AnimationPlayer.play("drop_net")
func _on_animation_player_animation_finished(anim_name):
if anim_name == "drop_net":
play_sfx("net_splash")
$ReleasedNet.play("grab_underwater")
$ReleasedNet/DisappearTimer.start()
if targets_in_net.size() >= 1:
grabbed_target = targets_in_net.pop_back()
# Stop target's movement and set position to inside the net
grabbed_target.grab_with($ReleasedNet)
else:
grabbed_target = null
func _on_released_net_target_entered(target):
targets_in_net.append(target)
func _on_released_net_target_exited(target):
targets_in_net.erase(target)
func _on_released_net_disappear_timer_timeout():
if grabbed_target:
fished.emit(all_targets[grabbed_target.index]["name"])
if $FishingTargets.get_child_count() <= 1:
fished_all_targets.emit()
grabbed_target.queue_free()
grabbed_target = null
net_is_dropped = false
$ReleasedNet.visible = false

View file

@ -0,0 +1,364 @@
[gd_scene load_steps=44 format=3 uid="uid://b051fdn22dftw"]
[ext_resource type="Script" path="res://scenes/screens/fishing_minigame.gd" id="1_7s5h5"]
[ext_resource type="Script" path="res://scenes/logic/net.gd" id="1_yetkk"]
[ext_resource type="Texture2D" uid="uid://b3mgxwv3cp1qm" path="res://images/backgrounds/fishing_02/0001.png" id="2_4krj7"]
[ext_resource type="Texture2D" uid="uid://lqy1x6kqm88q" path="res://images/backgrounds/fishing_01.png" id="2_dgwmc"]
[ext_resource type="Texture2D" uid="uid://kepym7kmjifc" path="res://images/backgrounds/fishing_02/0002.png" id="3_e8c31"]
[ext_resource type="Texture2D" uid="uid://dgoe2mysnljkf" path="res://images/backgrounds/fishing_02/0003.png" id="4_02oa4"]
[ext_resource type="Texture2D" uid="uid://bg3w5mitkvquh" path="res://images/backgrounds/fishing_02/0004.png" id="5_tqtjh"]
[ext_resource type="Texture2D" uid="uid://c1yoisbs8lgko" path="res://images/backgrounds/fishing_02/0005.png" id="6_ty1bg"]
[ext_resource type="Texture2D" uid="uid://lxwjghm7etg2" path="res://images/backgrounds/fishing_02/0006.png" id="7_gud5g"]
[ext_resource type="Texture2D" uid="uid://b124fi3eupqhk" path="res://images/backgrounds/fishing_02/0007.png" id="8_e8v68"]
[ext_resource type="Texture2D" uid="uid://ch4b24x872268" path="res://images/backgrounds/fishing_02/0008.png" id="9_dubgg"]
[ext_resource type="Texture2D" uid="uid://dmyv3kehfplqg" path="res://images/backgrounds/fishing_02/0009.png" id="10_j2ciw"]
[ext_resource type="Texture2D" uid="uid://dbimx1shxh47s" path="res://images/sprites/fishing_net/ground.png" id="12_gow3b"]
[ext_resource type="Texture2D" uid="uid://bgxon7ni33yvo" path="res://images/sprites/fishing_foreground.png" id="12_jlj73"]
[ext_resource type="Texture2D" uid="uid://bxs47a05ioxwu" path="res://images/sprites/fishing_net/grabbed_shadow.png" id="14_mfswx"]
[ext_resource type="Texture2D" uid="uid://cca7inw67j1aj" path="res://images/sprites/fishing_net/shadow_underwater/0001.png" id="15_sanpa"]
[ext_resource type="Texture2D" uid="uid://c5p4iqee53bdn" path="res://images/sprites/fishing_net/released.png" id="16_020uy"]
[ext_resource type="Texture2D" uid="uid://bvyx2qdefcgbg" path="res://images/sprites/fishing_net/shadow_underwater/0002.png" id="16_lbjk3"]
[ext_resource type="Texture2D" uid="uid://c0v4akcfgy6f3" path="res://images/sprites/fishing_net/shadow_underwater/0003.png" id="17_dm662"]
[ext_resource type="Texture2D" uid="uid://58hecowyh01o" path="res://images/sprites/fishing_net/shadow_underwater/0004.png" id="18_rph7a"]
[ext_resource type="Texture2D" uid="uid://c7jann5xx0mjj" path="res://images/sprites/fishing_net/shadow_underwater/0005.png" id="19_17qn5"]
[ext_resource type="Texture2D" uid="uid://wbrk7ketjskv" path="res://images/sprites/fishing_net/shadow_underwater/0006.png" id="20_f1sxv"]
[ext_resource type="Texture2D" uid="uid://dere026aqonp8" path="res://images/sprites/fishing_net/shadow_underwater/0007.png" id="21_2tvvq"]
[ext_resource type="Texture2D" uid="uid://cgrrpfsuscyye" path="res://images/sprites/fishing_net/shadow_underwater/0008.png" id="22_veott"]
[ext_resource type="Texture2D" uid="uid://mh34nrov6tum" path="res://images/sprites/fishing_net/shadow_underwater/0009.png" id="23_qdeun"]
[ext_resource type="Script" path="res://addons/resonate/sound_manager/sound_bank.gd" id="26_3dk6v"]
[ext_resource type="Script" path="res://addons/resonate/sound_manager/sound_event_resource.gd" id="27_j0p8c"]
[ext_resource type="AudioStream" uid="uid://ia71ea5lkhf0" path="res://sounds/net_picked_up.mp3" id="28_gwvbf"]
[ext_resource type="AudioStream" uid="uid://cpw5iy7xmmdxl" path="res://sounds/net_splash.mp3" id="29_ws3wp"]
[ext_resource type="AudioStream" uid="uid://baaj7tqj81uun" path="res://sounds/net_returns.mp3" id="30_kih1b"]
[sub_resource type="Animation" id="Animation_niynd"]
resource_name = "RESET"
length = 0.001
tracks/0/type = "bezier"
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/path = NodePath("ReleasedNet/ReleasedNetGhost:offset:y")
tracks/0/interp = 1
tracks/0/loop_wrap = true
tracks/0/keys = {
"handle_modes": PackedInt32Array(0),
"points": PackedFloat32Array(-140, -0.25, 0, 0.25, 0),
"times": PackedFloat32Array(0)
}
tracks/1/type = "value"
tracks/1/imported = false
tracks/1/enabled = true
tracks/1/path = NodePath("Net:visible")
tracks/1/interp = 1
tracks/1/loop_wrap = true
tracks/1/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 1,
"values": [false]
}
tracks/2/type = "value"
tracks/2/imported = false
tracks/2/enabled = true
tracks/2/path = NodePath("Net/Button:disabled")
tracks/2/interp = 1
tracks/2/loop_wrap = true
tracks/2/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 1,
"values": [true]
}
tracks/3/type = "value"
tracks/3/imported = false
tracks/3/enabled = true
tracks/3/path = NodePath("ReleasedNet:animation")
tracks/3/interp = 1
tracks/3/loop_wrap = true
tracks/3/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 1,
"values": [&"default"]
}
tracks/4/type = "value"
tracks/4/imported = false
tracks/4/enabled = true
tracks/4/path = NodePath("ReleasedNet/ReleasedNetGhost:visible")
tracks/4/interp = 1
tracks/4/loop_wrap = true
tracks/4/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 1,
"values": [true]
}
tracks/5/type = "value"
tracks/5/imported = false
tracks/5/enabled = true
tracks/5/path = NodePath("ReleasedNet:visible")
tracks/5/interp = 1
tracks/5/loop_wrap = true
tracks/5/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 1,
"values": [false]
}
[sub_resource type="Animation" id="Animation_bir22"]
resource_name = "drop_net"
length = 0.8
tracks/0/type = "bezier"
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/path = NodePath("ReleasedNet/ReleasedNetGhost:offset:y")
tracks/0/interp = 1
tracks/0/loop_wrap = true
tracks/0/keys = {
"handle_modes": PackedInt32Array(0, 0, 0),
"points": PackedFloat32Array(-140, 0, 0, 0, 0, -140, 0, 0, 0, 0, -20, 0, -100, 0, 0),
"times": PackedFloat32Array(0, 0.1, 0.8)
}
tracks/1/type = "value"
tracks/1/imported = false
tracks/1/enabled = true
tracks/1/path = NodePath("ReleasedNet/ReleasedNetGhost:visible")
tracks/1/interp = 1
tracks/1/loop_wrap = true
tracks/1/keys = {
"times": PackedFloat32Array(0, 0.8),
"transitions": PackedFloat32Array(1, 1),
"update": 1,
"values": [true, false]
}
[sub_resource type="AnimationLibrary" id="AnimationLibrary_u2oub"]
_data = {
"RESET": SubResource("Animation_niynd"),
"drop_net": SubResource("Animation_bir22")
}
[sub_resource type="SpriteFrames" id="SpriteFrames_4e28o"]
animations = [{
"frames": [{
"duration": 1.0,
"texture": ExtResource("2_4krj7")
}, {
"duration": 1.0,
"texture": ExtResource("3_e8c31")
}, {
"duration": 1.0,
"texture": ExtResource("4_02oa4")
}, {
"duration": 1.0,
"texture": ExtResource("5_tqtjh")
}, {
"duration": 1.0,
"texture": ExtResource("6_ty1bg")
}, {
"duration": 1.0,
"texture": ExtResource("7_gud5g")
}, {
"duration": 1.0,
"texture": ExtResource("8_e8v68")
}, {
"duration": 1.0,
"texture": ExtResource("9_dubgg")
}, {
"duration": 1.0,
"texture": ExtResource("10_j2ciw")
}],
"loop": true,
"name": &"fishing_moving",
"speed": 6.0
}, {
"frames": [{
"duration": 1.0,
"texture": ExtResource("2_dgwmc")
}],
"loop": false,
"name": &"fishing_stopped",
"speed": 6.0
}]
[sub_resource type="RectangleShape2D" id="RectangleShape2D_7eg46"]
size = Vector2(879, 28)
[sub_resource type="RectangleShape2D" id="RectangleShape2D_qcfpa"]
size = Vector2(60, 463)
[sub_resource type="RectangleShape2D" id="RectangleShape2D_si7tm"]
size = Vector2(63, 465)
[sub_resource type="RectangleShape2D" id="RectangleShape2D_s7cl4"]
size = Vector2(876, 72)
[sub_resource type="SpriteFrames" id="SpriteFrames_nktfp"]
animations = [{
"frames": [{
"duration": 1.0,
"texture": ExtResource("15_sanpa")
}],
"loop": false,
"name": &"default",
"speed": 5.0
}, {
"frames": [{
"duration": 1.0,
"texture": ExtResource("16_lbjk3")
}, {
"duration": 1.0,
"texture": ExtResource("17_dm662")
}, {
"duration": 1.0,
"texture": ExtResource("18_rph7a")
}, {
"duration": 1.0,
"texture": ExtResource("19_17qn5")
}, {
"duration": 1.0,
"texture": ExtResource("20_f1sxv")
}, {
"duration": 1.0,
"texture": ExtResource("21_2tvvq")
}, {
"duration": 1.0,
"texture": ExtResource("22_veott")
}, {
"duration": 1.0,
"texture": ExtResource("23_qdeun")
}],
"loop": false,
"name": &"grab_underwater",
"speed": 12.0
}]
[sub_resource type="RectangleShape2D" id="RectangleShape2D_f8txh"]
size = Vector2(107, 45)
[sub_resource type="Resource" id="Resource_sxq6n"]
script = ExtResource("27_j0p8c")
name = "net_picked_up"
bus = ""
volume = -6.0
pitch = 1.0
streams = Array[AudioStream]([ExtResource("28_gwvbf")])
[sub_resource type="Resource" id="Resource_ifamc"]
script = ExtResource("27_j0p8c")
name = "net_splash"
bus = ""
volume = -6.0
pitch = 1.0
streams = Array[AudioStream]([ExtResource("29_ws3wp")])
[sub_resource type="Resource" id="Resource_8l1se"]
script = ExtResource("27_j0p8c")
name = "net_returns"
bus = ""
volume = 0.0
pitch = 1.0
streams = Array[AudioStream]([ExtResource("30_kih1b")])
[node name="FishingMinigame" type="Node2D"]
script = ExtResource("1_7s5h5")
[node name="AnimationPlayer" type="AnimationPlayer" parent="."]
libraries = {
"": SubResource("AnimationLibrary_u2oub")
}
[node name="Background" type="AnimatedSprite2D" parent="."]
position = Vector2(400, 300)
sprite_frames = SubResource("SpriteFrames_4e28o")
animation = &"fishing_stopped"
[node name="Sprite2D" type="Sprite2D" parent="Background"]
z_index = 1
texture = ExtResource("12_jlj73")
[node name="Area2D" type="StaticBody2D" parent="Background"]
collision_layer = 2
[node name="BoundaryBottom" type="CollisionShape2D" parent="Background/Area2D"]
position = Vector2(4.5, 107)
shape = SubResource("RectangleShape2D_7eg46")
[node name="BoundaryRight" type="CollisionShape2D" parent="Background/Area2D"]
position = Vector2(395, -98.5)
shape = SubResource("RectangleShape2D_qcfpa")
[node name="BoundaryLeft" type="CollisionShape2D" parent="Background/Area2D"]
position = Vector2(-396.5, -103.5)
shape = SubResource("RectangleShape2D_si7tm")
[node name="BoundaryTop" type="CollisionShape2D" parent="Background/Area2D"]
position = Vector2(0, -278)
shape = SubResource("RectangleShape2D_s7cl4")
[node name="FishingTargets" type="Node2D" parent="."]
[node name="Net" type="Sprite2D" parent="."]
visible = false
z_index = 1
position = Vector2(400, 560)
texture = ExtResource("12_gow3b")
script = ExtResource("1_yetkk")
[node name="Shadow" type="Sprite2D" parent="Net"]
z_as_relative = false
texture = ExtResource("14_mfswx")
offset = Vector2(0, 120)
[node name="Button" type="Button" parent="Net"]
self_modulate = Color(1, 1, 1, 0)
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
offset_left = -96.5
offset_top = -41.0
offset_right = -96.5
offset_bottom = -41.0
grow_horizontal = 2
grow_vertical = 2
disabled = true
[node name="ResetTimer" type="Timer" parent="Net"]
wait_time = 3.0
one_shot = true
[node name="ReleasedNet" type="AnimatedSprite2D" parent="."]
visible = false
position = Vector2(-162, 244)
sprite_frames = SubResource("SpriteFrames_nktfp")
[node name="Area2D" type="Area2D" parent="ReleasedNet"]
collision_layer = 0
[node name="CollisionShape2D" type="CollisionShape2D" parent="ReleasedNet/Area2D"]
position = Vector2(-0.5, -15.5)
shape = SubResource("RectangleShape2D_f8txh")
[node name="ReleasedNetGhost" type="Sprite2D" parent="ReleasedNet"]
z_index = 1
texture = ExtResource("16_020uy")
offset = Vector2(0, -140)
[node name="DisappearTimer" type="Timer" parent="ReleasedNet"]
wait_time = 1.5
one_shot = true
[node name="SoundBank" type="Node" parent="."]
script = ExtResource("26_3dk6v")
label = "fishing_sfx"
events = Array[ExtResource("27_j0p8c")]([SubResource("Resource_sxq6n"), SubResource("Resource_ifamc"), SubResource("Resource_8l1se")])
[connection signal="animation_finished" from="AnimationPlayer" to="." method="_on_animation_player_animation_finished"]
[connection signal="net_dropped" from="Net" to="." method="_on_net_dropped"]
[connection signal="button_down" from="Net/Button" to="Net" method="_on_button_down"]
[connection signal="button_up" from="Net/Button" to="Net" method="_on_button_up"]
[connection signal="timeout" from="Net/ResetTimer" to="Net" method="_on_reset_timer_timeout"]
[connection signal="body_entered" from="ReleasedNet/Area2D" to="." method="_on_released_net_target_entered"]
[connection signal="body_exited" from="ReleasedNet/Area2D" to="." method="_on_released_net_target_exited"]
[connection signal="timeout" from="ReleasedNet/DisappearTimer" to="." method="_on_released_net_disappear_timer_timeout"]

474
scenes/screens/maiA0EA.tmp Normal file
View file

@ -0,0 +1,474 @@
[gd_scene load_steps=30 format=3 uid="uid://onv4dnuf1kk1"]
[ext_resource type="FontFile" uid="uid://cvjffehw5s8ut" path="res://fonts/FsJenson1.ttf" id="1_qkfah"]
[ext_resource type="Script" path="res://scenes/screens/main_menu.gd" id="1_yehem"]
[ext_resource type="Texture2D" uid="uid://cwx25ylanlny2" path="res://images/backgrounds/main_menu_01/0001.png" id="2_3aa2r"]
[ext_resource type="Texture2D" uid="uid://c0qa5ixkx1cdj" path="res://images/backgrounds/main_menu_01/0002.png" id="3_rix5m"]
[ext_resource type="Texture2D" uid="uid://bags8op6x23ay" path="res://images/backgrounds/main_menu_01/0003.png" id="4_iiljn"]
[ext_resource type="Texture2D" uid="uid://8jipdoai5gy7" path="res://images/backgrounds/main_menu_01/0004.png" id="5_xbe5v"]
[ext_resource type="Texture2D" uid="uid://gobqqmxfdtq" path="res://images/backgrounds/main_menu_01/0005.png" id="6_11q4i"]
[ext_resource type="Texture2D" uid="uid://cgauglb4shsm3" path="res://images/backgrounds/main_menu_01/0006.png" id="7_mafjt"]
[ext_resource type="Texture2D" uid="uid://c1y26yiulx1xv" path="res://images/backgrounds/main_menu_01/0007.png" id="8_4qyl7"]
[ext_resource type="Texture2D" uid="uid://eepfmshimjne" path="res://images/backgrounds/main_menu_01/0008.png" id="9_hm22s"]
[ext_resource type="Texture2D" uid="uid://b21cecq2oiuj8" path="res://images/backgrounds/main_menu_01/0009.png" id="10_u8yo1"]
[ext_resource type="Texture2D" uid="uid://ryis6tpqxxpp" path="res://images/backgrounds/main_menu_2.png" id="11_c4y3s"]
[ext_resource type="Script" path="res://addons/resonate/music_manager/music_bank.gd" id="12_kf5m8"]
[ext_resource type="Texture2D" uid="uid://b350qf6o6i6gy" path="res://images/ui/volume-high-solid.svg" id="13_etr4h"]
[ext_resource type="Script" path="res://addons/resonate/music_manager/music_track_resource.gd" id="13_li636"]
[ext_resource type="Texture2D" uid="uid://ykb3qmxlb1ph" path="res://images/ui/panel-border-014.png" id="13_y2w4v"]
[ext_resource type="Theme" uid="uid://ckrbqku1sx5ge" path="res://scenes/ui_elements/textbox_theme.tres" id="14_j72go"]
[ext_resource type="Script" path="res://addons/resonate/music_manager/music_stem_resource.gd" id="14_l87h8"]
[ext_resource type="AudioStream" uid="uid://dyam8vvj6rlp7" path="res://music/Fulminant.mp3" id="15_w4ohi"]
[sub_resource type="Animation" id="Animation_3tys0"]
resource_name = "main_menu_01"
length = 1.50002
loop_mode = 1
step = 0.166667
tracks/0/type = "value"
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/path = NodePath("TextureRect:texture")
tracks/0/interp = 1
tracks/0/loop_wrap = true
tracks/0/keys = {
"times": PackedFloat32Array(0, 0.166667, 0.333333, 0.5, 0.666667, 0.833333, 1, 1.16667, 1.33333, 1.5),
"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1, 1, 1, 1, 1),
"update": 1,
"values": [ExtResource("2_3aa2r"), ExtResource("3_rix5m"), ExtResource("4_iiljn"), ExtResource("5_xbe5v"), ExtResource("6_11q4i"), ExtResource("7_mafjt"), ExtResource("8_4qyl7"), ExtResource("9_hm22s"), ExtResource("10_u8yo1"), ExtResource("2_3aa2r")]
}
[sub_resource type="Animation" id="Animation_abbe0"]
resource_name = "RESET"
length = 0.001
tracks/0/type = "value"
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/path = NodePath("ColorRect:color")
tracks/0/interp = 2
tracks/0/loop_wrap = true
tracks/0/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 0,
"values": [Color(0, 0, 0, 1)]
}
[sub_resource type="Animation" id="Animation_cf6h8"]
resource_name = "reveal_main_menu"
length = 0.5
tracks/0/type = "value"
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/path = NodePath("ColorRect:color")
tracks/0/interp = 2
tracks/0/loop_wrap = true
tracks/0/keys = {
"times": PackedFloat32Array(0, 0.5),
"transitions": PackedFloat32Array(1, 1),
"update": 0,
"values": [Color(0, 0, 0, 1), Color(0, 0, 0, 0)]
}
tracks/1/type = "value"
tracks/1/imported = false
tracks/1/enabled = true
tracks/1/path = NodePath("TitleMarginContainer:theme_override_constants/margin_top")
tracks/1/interp = 2
tracks/1/loop_wrap = true
tracks/1/keys = {
"times": PackedFloat32Array(0, 0.5),
"transitions": PackedFloat32Array(1, 1),
"update": 0,
"values": [-30, 20]
}
[sub_resource type="Animation" id="Animation_6xul7"]
resource_name = "main_menu_02"
length = 0.001
loop_mode = 2
step = 0.166667
tracks/0/type = "value"
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/path = NodePath("TextureRect:texture")
tracks/0/interp = 1
tracks/0/loop_wrap = true
tracks/0/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 1,
"values": [ExtResource("11_c4y3s")]
}
[sub_resource type="AnimationLibrary" id="AnimationLibrary_hgqec"]
_data = {
"RESET": SubResource("Animation_abbe0"),
"main_menu_01": SubResource("Animation_3tys0"),
"main_menu_02": SubResource("Animation_6xul7"),
"reveal_main_menu": SubResource("Animation_cf6h8")
}
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_llf77"]
bg_color = Color(0.74902, 0.74902, 0.74902, 1)
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_wa6sw"]
bg_color = Color(0.517647, 0.517647, 0.517647, 1)
border_width_left = 3
border_width_top = 3
border_width_right = 3
border_width_bottom = 3
border_color = Color(0.203922, 0.482353, 0.85098, 1)
corner_radius_top_left = 6
corner_radius_top_right = 2
corner_radius_bottom_right = 2
corner_radius_bottom_left = 2
expand_margin_left = 3.0
expand_margin_top = 3.0
expand_margin_right = 3.0
expand_margin_bottom = 3.0
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_07dbw"]
bg_color = Color(0.0470588, 0.0666667, 0.160784, 0.752941)
corner_radius_top_left = 14
corner_radius_top_right = 14
corner_radius_bottom_right = 14
corner_radius_bottom_left = 14
[sub_resource type="Resource" id="Resource_os855"]
script = ExtResource("14_l87h8")
name = "main"
enabled = true
volume = 0.0
stream = ExtResource("15_w4ohi")
[sub_resource type="Resource" id="Resource_kpms5"]
script = ExtResource("13_li636")
name = "fulminant"
bus = ""
stems = Array[ExtResource("14_l87h8")]([SubResource("Resource_os855")])
[node name="MainMenu" type="Node2D"]
script = ExtResource("1_yehem")
[node name="AnimationPlayer" type="AnimationPlayer" parent="."]
root_node = NodePath("../CanvasLayer")
libraries = {
"": SubResource("AnimationLibrary_hgqec")
}
[node name="AnimationPlayerBG" type="AnimationPlayer" parent="."]
root_node = NodePath("../CanvasLayer")
libraries = {
"": SubResource("AnimationLibrary_hgqec")
}
[node name="CanvasLayer" type="CanvasLayer" parent="."]
[node name="TextureRect" type="TextureRect" parent="CanvasLayer"]
anchors_preset = 7
anchor_left = 0.5
anchor_top = 1.0
anchor_right = 0.5
anchor_bottom = 1.0
offset_left = -400.0
offset_top = -600.0
offset_right = 400.0
grow_horizontal = 2
grow_vertical = 0
texture = ExtResource("11_c4y3s")
[node name="TitleMarginContainer" type="MarginContainer" parent="CanvasLayer"]
anchors_preset = 5
anchor_left = 0.5
anchor_right = 0.5
offset_left = -217.0
offset_right = 218.0
offset_bottom = 222.0
grow_horizontal = 2
theme_override_constants/margin_top = -20
[node name="Title" type="Label" parent="CanvasLayer/TitleMarginContainer"]
layout_mode = 2
theme_override_colors/font_outline_color = Color(0, 0, 0, 1)
theme_override_constants/outline_size = 40
theme_override_constants/line_spacing = -26
theme_override_fonts/font = ExtResource("1_qkfah")
theme_override_font_sizes/font_size = 180
text = "Crossing
Over"
horizontal_alignment = 1
[node name="MuteButtonContainer" type="MarginContainer" parent="CanvasLayer"]
anchors_preset = 1
anchor_left = 1.0
anchor_right = 1.0
offset_left = -40.0
offset_bottom = 40.0
grow_horizontal = 0
theme_override_constants/margin_top = 20
theme_override_constants/margin_right = 20
[node name="MuteButton" type="Button" parent="CanvasLayer/MuteButtonContainer"]
custom_minimum_size = Vector2(30, 30)
layout_mode = 2
focus_next = NodePath("../../ButtonsMarginContainer/VBoxContainer/NewGame/NewGameButton")
focus_previous = NodePath("../../ButtonsMarginContainer/VBoxContainer/Credits/CreditsButton")
theme_override_styles/hover = SubResource("StyleBoxFlat_llf77")
theme_override_styles/focus = SubResource("StyleBoxFlat_wa6sw")
keep_pressed_outside = true
icon = ExtResource("13_etr4h")
[node name="Panel" type="Panel" parent="CanvasLayer/MuteButtonContainer/MuteButton"]
layout_mode = 1
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
theme_override_styles/panel = SubResource("StyleBoxFlat_07dbw")
[node name="MarginContainer" type="MarginContainer" parent="CanvasLayer/MuteButtonContainer/MuteButton"]
layout_mode = 0
offset_right = 40.0
offset_bottom = 40.0
theme_override_constants/margin_left = 8
theme_override_constants/margin_top = 8
theme_override_constants/margin_right = 8
theme_override_constants/margin_bottom = 8
[node name="TextureRect" type="TextureRect" parent="CanvasLayer/MuteButtonContainer/MuteButton/MarginContainer"]
layout_mode = 2
texture = ExtResource("13_etr4h")
expand_mode = 2
[node name="ButtonsMarginContainer" type="MarginContainer" parent="CanvasLayer"]
anchors_preset = 7
anchor_left = 0.5
anchor_top = 1.0
anchor_right = 0.5
anchor_bottom = 1.0
offset_left = -266.0
offset_top = -52.0
offset_right = 266.0
grow_horizontal = 2
grow_vertical = 0
theme_override_constants/margin_bottom = 40
[node name="VBoxContainer" type="VBoxContainer" parent="CanvasLayer/ButtonsMarginContainer"]
custom_minimum_size = Vector2(532, 0)
layout_mode = 2
size_flags_horizontal = 4
size_flags_vertical = 4
theme_override_constants/separation = 52
alignment = 1
[node name="NewGame" type="Control" parent="CanvasLayer/ButtonsMarginContainer/VBoxContainer"]
layout_mode = 2
[node name="NewGameButton" type="Button" parent="CanvasLayer/ButtonsMarginContainer/VBoxContainer/NewGame"]
unique_name_in_owner = true
custom_minimum_size = Vector2(0, 26)
layout_mode = 1
anchors_preset = 4
anchor_top = 0.5
anchor_bottom = 0.5
offset_top = -21.0
offset_right = 512.0
offset_bottom = 21.0
grow_vertical = 2
focus_previous = NodePath("../../../../MuteButtonContainer/MuteButton")
theme_override_styles/hover = SubResource("StyleBoxFlat_llf77")
theme_override_styles/focus = SubResource("StyleBoxFlat_wa6sw")
keep_pressed_outside = true
[node name="Panel" type="Panel" parent="CanvasLayer/ButtonsMarginContainer/VBoxContainer/NewGame/NewGameButton"]
layout_mode = 1
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
theme_override_styles/panel = SubResource("StyleBoxFlat_07dbw")
[node name="NameFrame" type="NinePatchRect" parent="CanvasLayer/ButtonsMarginContainer/VBoxContainer/NewGame/NewGameButton"]
modulate = Color(0.882353, 0.894118, 0.960784, 1)
layout_mode = 1
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
texture = ExtResource("13_y2w4v")
draw_center = false
patch_margin_left = 14
patch_margin_top = 14
patch_margin_right = 14
patch_margin_bottom = 14
axis_stretch_horizontal = 1
axis_stretch_vertical = 1
[node name="Margin" type="MarginContainer" parent="CanvasLayer/ButtonsMarginContainer/VBoxContainer/NewGame/NewGameButton/NameFrame"]
layout_mode = 1
anchors_preset = 4
anchor_top = 0.5
anchor_bottom = 0.5
offset_top = -21.0
offset_right = 532.0
offset_bottom = 21.0
grow_vertical = 2
theme_override_constants/margin_left = 16
theme_override_constants/margin_top = 8
theme_override_constants/margin_right = 16
theme_override_constants/margin_bottom = 8
[node name="NewGameLabel" type="Label" parent="CanvasLayer/ButtonsMarginContainer/VBoxContainer/NewGame/NewGameButton/NameFrame/Margin"]
modulate = Color(0.882353, 0.894118, 0.960784, 1)
layout_mode = 2
size_flags_horizontal = 4
theme = ExtResource("14_j72go")
text = "New game"
visible_characters_behavior = 1
[node name="Continue" type="Control" parent="CanvasLayer/ButtonsMarginContainer/VBoxContainer"]
layout_mode = 2
[node name="ContinueButton" type="Button" parent="CanvasLayer/ButtonsMarginContainer/VBoxContainer/Continue"]
custom_minimum_size = Vector2(0, 26)
layout_mode = 1
anchors_preset = 4
anchor_top = 0.5
anchor_bottom = 0.5
offset_top = -21.0
offset_right = 512.0
offset_bottom = 21.0
grow_vertical = 2
theme_override_styles/hover = SubResource("StyleBoxFlat_llf77")
theme_override_styles/focus = SubResource("StyleBoxFlat_wa6sw")
keep_pressed_outside = true
[node name="Panel" type="Panel" parent="CanvasLayer/ButtonsMarginContainer/VBoxContainer/Continue/ContinueButton"]
layout_mode = 1
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
theme_override_styles/panel = SubResource("StyleBoxFlat_07dbw")
[node name="NameFrame" type="NinePatchRect" parent="CanvasLayer/ButtonsMarginContainer/VBoxContainer/Continue/ContinueButton"]
modulate = Color(0.882353, 0.894118, 0.960784, 1)
layout_mode = 1
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
texture = ExtResource("13_y2w4v")
draw_center = false
patch_margin_left = 14
patch_margin_top = 14
patch_margin_right = 14
patch_margin_bottom = 14
axis_stretch_horizontal = 1
axis_stretch_vertical = 1
[node name="Margin" type="MarginContainer" parent="CanvasLayer/ButtonsMarginContainer/VBoxContainer/Continue/ContinueButton/NameFrame"]
layout_mode = 1
anchors_preset = 4
anchor_top = 0.5
anchor_bottom = 0.5
offset_top = -21.0
offset_right = 532.0
offset_bottom = 21.0
grow_vertical = 2
theme_override_constants/margin_left = 16
theme_override_constants/margin_top = 8
theme_override_constants/margin_right = 16
theme_override_constants/margin_bottom = 8
[node name="ContinueLabel" type="Label" parent="CanvasLayer/ButtonsMarginContainer/VBoxContainer/Continue/ContinueButton/NameFrame/Margin"]
modulate = Color(0.882353, 0.894118, 0.960784, 1)
layout_mode = 2
size_flags_horizontal = 4
theme = ExtResource("14_j72go")
text = "Continue"
visible_characters_behavior = 1
[node name="Credits" type="Control" parent="CanvasLayer/ButtonsMarginContainer/VBoxContainer"]
layout_mode = 2
[node name="CreditsButton" type="Button" parent="CanvasLayer/ButtonsMarginContainer/VBoxContainer/Credits"]
custom_minimum_size = Vector2(0, 26)
layout_mode = 1
anchors_preset = 4
anchor_top = 0.5
anchor_bottom = 0.5
offset_top = -21.0
offset_right = 512.0
offset_bottom = 21.0
grow_vertical = 2
focus_next = NodePath("../../../../MuteButtonContainer/MuteButton")
theme_override_styles/hover = SubResource("StyleBoxFlat_llf77")
theme_override_styles/focus = SubResource("StyleBoxFlat_wa6sw")
keep_pressed_outside = true
[node name="Panel" type="Panel" parent="CanvasLayer/ButtonsMarginContainer/VBoxContainer/Credits/CreditsButton"]
layout_mode = 1
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
theme_override_styles/panel = SubResource("StyleBoxFlat_07dbw")
[node name="NameFrame" type="NinePatchRect" parent="CanvasLayer/ButtonsMarginContainer/VBoxContainer/Credits/CreditsButton"]
modulate = Color(0.882353, 0.894118, 0.960784, 1)
layout_mode = 1
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
texture = ExtResource("13_y2w4v")
draw_center = false
patch_margin_left = 14
patch_margin_top = 14
patch_margin_right = 14
patch_margin_bottom = 14
axis_stretch_horizontal = 1
axis_stretch_vertical = 1
[node name="Margin" type="MarginContainer" parent="CanvasLayer/ButtonsMarginContainer/VBoxContainer/Credits/CreditsButton/NameFrame"]
layout_mode = 1
anchors_preset = 4
anchor_top = 0.5
anchor_bottom = 0.5
offset_top = -21.0
offset_right = 532.0
offset_bottom = 21.0
grow_vertical = 2
theme_override_constants/margin_left = 16
theme_override_constants/margin_top = 8
theme_override_constants/margin_right = 16
theme_override_constants/margin_bottom = 8
[node name="CreditsLabel" type="Label" parent="CanvasLayer/ButtonsMarginContainer/VBoxContainer/Credits/CreditsButton/NameFrame/Margin"]
modulate = Color(0.882353, 0.894118, 0.960784, 1)
layout_mode = 2
size_flags_horizontal = 4
theme = ExtResource("14_j72go")
text = "Credits"
visible_characters_behavior = 1
[node name="ColorRect" type="ColorRect" parent="CanvasLayer"]
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
color = Color(0, 0, 0, 1)
[node name="MusicBank" type="Node" parent="."]
script = ExtResource("12_kf5m8")
label = "main_menu"
tracks = Array[ExtResource("13_li636")]([SubResource("Resource_kpms5")])

196
scenes/screens/main_menu.gd Normal file
View file

@ -0,0 +1,196 @@
extends Node2D
@onready var vn_scene = preload("res://scenes/screens/visual_novel.tscn")
var licenses_scroll_bar = null
func advance_sfx():
if not FileGlobals.get_global_data("muted"):
#SoundManager.play("sfx_menu", "advance")
SoundManager.play_varied("sfx_menu", "advance", 1.0, FileGlobals.get_global_data("volume", 0.0))
# Called when the node enters the scene tree for the first time.
func _ready():
get_window().title = "Crossing Over"
if not FileGlobals.has_loaded:
await FileGlobals.loaded
if not MusicManager.has_loaded:
await MusicManager.loaded
if not SoundManager.has_loaded:
await SoundManager.loaded
$CanvasLayer/CreditsMenuControl/AnimatedBardSprite.play("default")
FileGlobals.new_game_save_file.clear()
if str(FileGlobals.get_global_data("answer")) == "42":
$AnimationPlayerBG.play("main_menu_02")
else:
$AnimationPlayerBG.play("main_menu_01")
%VolumeSlider.value = FileGlobals.get_global_data("volume", 0.0)
init_credits()
if FileGlobals.can_continue:
%Continue.visible = true
for file in FileGlobals.save_files:
if file.get("is_autosave"):
%ItemList.add_item(" Autosave | %s (%s)" % [file["name"], file["timestamp"]])
else:
%ItemList.add_item(" %s (%s)" % [file["name"], file["timestamp"]])
if FileGlobals.get_global_data("muted"):
mute()
else:
MusicManager.set_volume(%VolumeSlider.value)
MusicManager.play("main_menu", "fulminant_mm", 0.0)
$AnimationPlayer.play("reveal_main_menu")
%NewGameButton.grab_focus()
func _process(delta):
if $CanvasLayer/LicensesWindow.visible:
if Input.is_action_just_pressed("ui_accept") or Input.is_action_just_pressed("ui_cancel"):
advance_sfx()
$CanvasLayer/LicensesWindow.hide()
else:
var vertical_scroll = Input.get_vector("ui_left", "ui_right", "ui_up", "ui_down").y * delta * 1000
$CanvasLayer/LicensesWindow/RichTextLabel.get_v_scroll_bar().value += vertical_scroll
func mute():
MusicManager.set_volume(-80.0)
#SoundManager.set_volume(-80.0)
FileGlobals.set_global_data("muted", true)
%MuteTextureRect.texture = load("res://images/ui/speaker-x-mark.svg")
func unmute():
var volume = FileGlobals.get_global_data("volume", 0.0)
MusicManager.set_volume(FileGlobals.get_global_data("volume", 0.0))
#SoundManager.set_volume(0.0)
#SoundManager.play("sfx_menu", "advance")
SoundManager.play_varied("sfx_menu", "advance", 1.0, volume)
FileGlobals.set_global_data("muted", false)
%MuteTextureRect.texture = load("res://images/ui/speaker-wave.svg")
func init_credits():
%CreditsRichText.text = FileAccess.open("res://scenes/screens/credits.txt", FileAccess.READ).get_as_text()
#if OS.has_feature("debug") or str(FileGlobals.get_global_data("game_completed")) == "1":
if OS.has_feature("editor") or str(FileGlobals.get_global_data("game_completed")) == "1":
%CreditsRichText.append_text(FileAccess.open("res://scenes/screens/credits_bonus.txt", FileAccess.READ).get_as_text())
%PostGameButtons.visible = true
func show_licenses():
if not $CanvasLayer/LicensesWindow/RichTextLabel.text:
$CanvasLayer/LicensesWindow/RichTextLabel.text = FileAccess.open("res://licenses.txt", FileAccess.READ).get_as_text()
advance_sfx()
$CanvasLayer/LicensesWindow.show()
func start_new_game():
FileGlobals.current_load_source = FileGlobals.VNLoadSource.NEW_GAME
get_tree().change_scene_to_packed(vn_scene)
func _on_licenses_window_close_requested():
advance_sfx()
$CanvasLayer/LicensesWindow.hide()
func _on_mute_button_pressed():
if FileGlobals.get_global_data("muted"):
unmute()
else:
mute()
func _on_new_game_button_pressed():
advance_sfx()
start_new_game()
func _on_continue_button_pressed():
advance_sfx()
$CanvasLayer/ContinueMenuControl.visible = true
$CanvasLayer/ContinueMenuControl/ReturnToMainMenuButtonContainer/ReturnToMainMenuButton.grab_focus()
$CanvasLayer/MainMenuControl.visible = false
func _on_credits_button_pressed():
advance_sfx()
$CanvasLayer/CreditsMenuControl.visible = true
$CanvasLayer/CreditsMenuControl/ReturnToMainMenuButtonContainer/ReturnToMainMenuButton.grab_focus()
$CanvasLayer/MainMenuControl.visible = false
# Return to main menu
func _on_return_to_main_menu_from_continue():
$CanvasLayer/MainMenuControl/ButtonsMarginContainer/VBoxContainer/Continue/ContinueButton.grab_focus()
_on_return_to_main_menu()
func _on_return_to_main_menu_from_credits():
$CanvasLayer/MainMenuControl/ButtonsMarginContainer/VBoxContainer/Credits/CreditsButton.grab_focus()
_on_return_to_main_menu()
func _on_return_to_main_menu():
advance_sfx()
$CanvasLayer/MainMenuControl.visible = true
$CanvasLayer/CreditsMenuControl.visible = false
$CanvasLayer/ContinueMenuControl.visible = false
$CanvasLayer/LicensesWindow.hide()
func _on_credits_rich_text_meta_clicked(meta):
match meta:
"licenses":
show_licenses()
"bonus_music":
FileGlobals.new_game_save_file["current_vn"] = "bonus_music"
start_new_game()
"bonus_animation":
FileGlobals.new_game_save_file["current_vn"] = "bonus_animation"
advance_sfx()
start_new_game()
"bonus_fishing":
FileGlobals.new_game_save_file["current_vn"] = "bonus_fishing"
advance_sfx()
start_new_game()
_:
if meta.left(8) == "https://":
advance_sfx()
OS.shell_open(meta)
else:
push_warning("Unhandled [url] meta '%s'" % meta)
func _on_save_item_list_item_selected(index):
FileGlobals.current_load_file = FileGlobals.save_files[index]
if FileGlobals.current_load_file.get("is_autosave"):
FileGlobals.current_load_source = FileGlobals.VNLoadSource.FROM_AUTOSAVE
else:
FileGlobals.current_load_source = FileGlobals.VNLoadSource.FROM_MANUAL_SAVE
advance_sfx()
get_tree().change_scene_to_packed(vn_scene)
#func _on_load_save_button_focus_entered():
# if %LoadSaveButton.disabled:
# %LoadSaveButton.find_next_valid_focus().grab_focus()
#
#func _on_load_save_button_focus_exited():
# $AnimationPlayer.play("save_file_desselected")
# await $AnimationPlayer.animation_finished
#
#func _on_load_save_button_pressed():
# advance_sfx()
# get_tree().change_scene_to_packed(vn_scene)
func _on_website_button_pressed():
_on_credits_rich_text_meta_clicked("https://badmanners.xyz")
func _on_licenses_button_pressed():
if $CanvasLayer/LicensesWindow.visible:
advance_sfx()
$CanvasLayer/LicensesWindow.hide()
else:
show_licenses()
func _on_music_room_button_pressed():
_on_credits_rich_text_meta_clicked("bonus_music")
func _on_play_video_button_pressed():
_on_credits_rich_text_meta_clicked("bonus_animation")
func _on_fishing_minigame_button_pressed():
_on_credits_rich_text_meta_clicked("bonus_fishing")
func _on_volume_slider_value_changed(value):
FileGlobals.set_global_data("volume", value)
if not FileGlobals.get_global_data("muted", false):
MusicManager.set_volume(value)

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,61 @@
[gd_scene load_steps=15 format=3 uid="uid://4v1jmfn8kjpg"]
[ext_resource type="PackedScene" uid="uid://b3hnb4vtqq6p3" path="res://scenes/ui_elements/textbox.tscn" id="1_7wls5"]
[ext_resource type="Script" path="res://scenes/screens/visual_novel.gd" id="1_hggao"]
[ext_resource type="PackedScene" uid="uid://x4yl51efxs5s" path="res://scenes/ui_elements/chat_log.tscn" id="3_cvy53"]
[ext_resource type="PackedScene" uid="uid://db604d7kgvdrt" path="res://scenes/ui_elements/prompt.tscn" id="3_fgnej"]
[ext_resource type="PackedScene" uid="uid://jfv4ss4g55mw" path="res://scenes/logic/vn_interpreter.tscn" id="5_3vb6j"]
[ext_resource type="Script" path="res://addons/resonate/music_manager/music_bank.gd" id="6_sqlrv"]
[ext_resource type="Script" path="res://addons/resonate/music_manager/music_track_resource.gd" id="7_so7qg"]
[ext_resource type="Script" path="res://addons/resonate/music_manager/music_stem_resource.gd" id="8_74ruw"]
[ext_resource type="AudioStream" uid="uid://bnvod0ng5ci14" path="res://music/LooseThoughts.mp3" id="9_4awv5"]
[ext_resource type="AudioStream" uid="uid://4oq4eo5jxtw1" path="res://music/AboardTheAkhirah.mp3" id="10_5nc5r"]
[sub_resource type="Resource" id="Resource_gpkbv"]
script = ExtResource("8_74ruw")
name = "main"
enabled = true
volume = 0.0
stream = ExtResource("9_4awv5")
[sub_resource type="Resource" id="Resource_nuey8"]
script = ExtResource("7_so7qg")
name = "loose_thoughts"
bus = ""
stems = Array[ExtResource("8_74ruw")]([SubResource("Resource_gpkbv")])
[sub_resource type="Resource" id="Resource_38r80"]
script = ExtResource("8_74ruw")
name = "main"
enabled = true
volume = 0.0
stream = ExtResource("10_5nc5r")
[sub_resource type="Resource" id="Resource_grrpr"]
script = ExtResource("7_so7qg")
name = "aboard_the_akhirah"
bus = ""
stems = Array[ExtResource("8_74ruw")]([SubResource("Resource_38r80")])
[node name="VisualNovel" type="Node2D"]
script = ExtResource("1_hggao")
[node name="Background" type="Node2D" parent="."]
[node name="Sprites" type="CanvasLayer" parent="."]
[node name="Textbox" parent="." instance=ExtResource("1_7wls5")]
[node name="Prompt" parent="." instance=ExtResource("3_fgnej")]
[node name="ChatLog" parent="." instance=ExtResource("3_cvy53")]
[node name="VNInterpreter" parent="." instance=ExtResource("5_3vb6j")]
[node name="Timer" type="Timer" parent="."]
one_shot = true
[node name="MusicBank" type="Node" parent="."]
script = ExtResource("6_sqlrv")
label = "vn_music"
tracks = Array[ExtResource("7_so7qg")]([SubResource("Resource_nuey8"), SubResource("Resource_grrpr")])

View file

@ -0,0 +1,21 @@
[gd_scene load_steps=6 format=3 uid="uid://4v1jmfn8kjpg"]
[ext_resource type="PackedScene" uid="uid://b3hnb4vtqq6p3" path="res://scenes/ui_elements/textbox.tscn" id="1_7wls5"]
[ext_resource type="Script" path="res://scenes/screens/visual_novel.gd" id="1_hggao"]
[ext_resource type="PackedScene" uid="uid://x4yl51efxs5s" path="res://scenes/ui_elements/chat_log.tscn" id="3_cvy53"]
[ext_resource type="PackedScene" uid="uid://db604d7kgvdrt" path="res://scenes/ui_elements/prompt.tscn" id="3_fgnej"]
[ext_resource type="PackedScene" uid="uid://jfv4ss4g55mw" path="res://scenes/logic/vn_interpreter.tscn" id="5_3vb6j"]
[node name="VisualNovel" type="Node2D"]
script = ExtResource("1_hggao")
[node name="Textbox" parent="." instance=ExtResource("1_7wls5")]
[node name="Prompt" parent="." instance=ExtResource("3_fgnej")]
visible = false
[node name="ChatLog" parent="." instance=ExtResource("3_cvy53")]
[node name="VNInterpreter" parent="." instance=ExtResource("5_3vb6j")]
[connection signal="prompt_option_selected" from="Prompt" to="VNInterpreter" method="_on_prompt_prompt_option_selected"]

View file

@ -0,0 +1,272 @@
extends Node2D
var can_advance_text = true
var vn_current_name = null
var vn_save_state = null
var fishing_minigame_label = ""
var fishing_minigame_finished = false
var fishing_minigame_active = false
const SHOULD_SAVE_PARSED_BUFFERS = false
const START_VN_NAME = "00_content_warning"
signal autosaved
signal quick_saved
func _ready():
if not FileGlobals.has_loaded:
await FileGlobals.loaded
if not MusicManager.has_loaded:
await MusicManager.loaded
#if SHOULD_SAVE_PARSED_BUFFERS:
# parse_all_txt_scenes()
$FishingMinigame.visible = false
$ChatLog.visible = false
# Get current load source from file globals
load_game(FileGlobals.current_load_source, FileGlobals.current_load_file)
#run_visual_novel(vn_current_name, FileGlobals.current_load_source == FileGlobals.VNLoadSource.NEW_GAME, vn_save_state)
run_visual_novel(vn_current_name, false, vn_save_state)
func _process(_delta):
if Input.is_action_just_pressed("quicksave"):
if save_game(FileGlobals.VNSaveTarget.MANUAL_SAVE):
quick_saved.emit()
elif Input.is_action_just_pressed("log"):
toggle_chatlog()
elif Input.is_action_just_pressed("ui_accept"):
if should_process_click():
#if $Textbox.is_ready():
if $Textbox.is_idle():
can_advance_text = false
$TimerCanAdvanceText.start()
vn_step()
else:
$Textbox.skip()
elif Input.is_action_just_pressed("click"):
if should_process_click():
if $Textbox.is_idle():
var mouse_position = get_global_mouse_position()
if mouse_position.x <= 60 and mouse_position.y <= 60:
toggle_chatlog()
else:
can_advance_text = false
$TimerCanAdvanceText.start()
vn_step()
else:
$Textbox.skip()
#if should_advance_textbox():
# if $Textbox.is_ready():
# vn_step()
# else:
# $Textbox.skip()
func should_process_click() -> bool:
return can_advance_text and not fishing_minigame_active and not $ChatLog.visible
#func should_advance_textbox() -> bool:
# if fishing_minigame_active or $ChatLog.visible:
# return false
# if Input.is_action_just_pressed("ui_accept"):
# return true
# if Input.is_action_just_pressed("click"):
# var mouse_position = get_global_mouse_position()
# if mouse_position.x <= 60 and mouse_position.y <= 60:
# toggle_chatlog()
# return false
# return true
# return false
func toggle_chatlog():
if $ChatLog.visible:
$ChatLog.visible = false
$VNInterpreter.advance_sfx()
elif $Textbox.is_ready():
$ChatLog.visible = true
#$ChatLog.scroll_to_end()
$ChatLog/CloseChatLogButtonContainer/CloseChatLogButton.grab_focus()
$VNInterpreter.advance_sfx()
else:
print_debug("Can't open chatlog right now!")
func load_game(load_source: FileGlobals.VNLoadSource, load_file):
var save_data = FileGlobals.load_save_file(load_source, load_file)
vn_current_name = save_data.get("current_vn", START_VN_NAME)
vn_save_state = save_data.get("save_state", {})
func save_game(save_target: FileGlobals.VNSaveTarget):
#if $FishingMinigame.visible or $ChatLog.visible or not $VNInterpreter.can_save():
if $FishingMinigame.visible or not $VNInterpreter.can_save():
print_debug("Can't save VN right now!")
return false
vn_save_state = $VNInterpreter.save_vn()
FileGlobals.create_save_file(save_target, {"current_vn": vn_current_name, "save_state": vn_save_state}, vn_save_state["title"])
return true
func parse_all_txt_scenes():
DirAccess.make_dir_absolute("user://compiled_scenes")
for path in DirAccess.get_files_at("res://scenes/visual_novels"):
if path.ends_with(".txt"):
var data = $VNInterpreter.parse_vn_file("res://scenes/visual_novels/%s" % path)
var file = FileAccess.open("user://compiled_scenes/%s.buf" % path.left(-4), FileAccess.WRITE)
file.store_buffer(var_to_bytes_with_objects(data))
file.close()
func run_visual_novel(vn_scene, should_autosave: bool = false, save_state = {}):
vn_current_name = vn_scene
# Find source for current file
var file = null
# Try pre-parsed scene first
var should_parse = false
var vn_file = "res://scenes/visual_novels/%s.buf" % vn_current_name
file = FileAccess.open(vn_file, FileAccess.READ)
if file:
file.close()
else:
# Try unparsed scene
should_parse = true
vn_file = "res://scenes/visual_novels/%s.txt" % vn_current_name
file = FileAccess.open(vn_file, FileAccess.READ)
if file:
file.close()
else:
assert(false, "Cannot find next VN scene '%s'!" % vn_scene)
push_warning("Visual novel (%s) not found. Restarting visual novel..." % vn_scene)
vn_current_name = START_VN_NAME
save_state = {}
var data = null
if should_parse:
# Parse the original file
data = $VNInterpreter.parse_vn_file(vn_file)
# Store parsed data
if SHOULD_SAVE_PARSED_BUFFERS:
DirAccess.make_dir_absolute("user://compiled_scenes")
file = FileAccess.open("user://compiled_scenes/%s.buf" % vn_current_name, FileAccess.WRITE)
file.store_buffer(var_to_bytes_with_objects(data))
file.close()
else:
# Load previously parsed data directly
file = FileAccess.open(vn_file, FileAccess.READ)
data = bytes_to_var_with_objects(file.get_buffer(file.get_length()))
file.close()
# Make sure MusicManager is ready before proceeding
if not MusicManager.has_loaded:
await MusicManager.loaded
await $VNInterpreter.load_vn_data(data, save_state)
# Autosave only when loading a new VN
if should_autosave:
var saved = save_game(FileGlobals.VNSaveTarget.AUTOSAVE)
if vn_scene != START_VN_NAME and saved:
autosaved.emit()
vn_step()
func vn_step(label = null):
while true:
var vn_value = await $VNInterpreter.advance_vn(label)
label = null
match vn_value:
[]:
return
["@escape", ..]:
match vn_value.slice(1):
# @escape print my_var $my_var
["print", var value]:
print("@print ", value)
# @escape store_global name john_doe
["store_global", var key, var value]:
FileGlobals.set_global_data(key, value)
# @escape fishing done_fishing 0.5 false {"name":"label_for_fishing_01","sprite":"sprite_name_01"} {...}
["fishing", var label_finished, var difficulty_str, var boat_is_moving_str, ..]:
fishing_minigame_label = label_finished
var difficulty = float(difficulty_str)
var is_moving = boat_is_moving_str == "true"
fishing_minigame_finished = false
var targets = []
for target_json in vn_value.slice(5):
var target = JSON.parse_string(target_json)
target["sprite"] = load("res://images/sprites/fishing_targets/%s.png" % target["sprite"])
targets.append(target)
$FishingMinigame.start_fishing_minigame(targets, difficulty, is_moving)
fishing_minigame_active = true
$FishingMinigame.visible = true
#$FishingMinigame/Net.can_move = true
$TimerNetCanMove.start()
$Sprites.visible = false
$Textbox.visible = false
$OverlayColor.visible = false
$Prompt.visible = false
# $ChatLog.visible = false
can_advance_text = false
return
["return_to_fishing"]:
if fishing_minigame_finished:
$FishingMinigame.visible = false
#$FishingMinigame/Net.can_move = false
$Sprites.visible = true
$Textbox.visible = true
$OverlayColor.visible = true
$Prompt.visible = true
# $ChatLog.visible = true
label = fishing_minigame_label
else:
fishing_minigame_active = true
#$FishingMinigame/Net.can_move = true
$TimerNetCanMove.start()
$Sprites.visible = false
$Textbox.visible = false
$OverlayColor.visible = false
$Prompt.visible = false
# $ChatLog.visible = false
return
_:
push_warning("Unhandled @escape ", vn_value.slice(1))
return
["@load", var next_scene, ..]:
run_visual_novel(next_scene, true)
return
["@eof"]:
push_warning("Reached end of VN instead of exiting gracefully!")
get_tree().change_scene_to_file("res://scenes/screens/main_menu.tscn")
return
["@quit"]:
get_tree().change_scene_to_file("res://scenes/screens/main_menu.tscn")
return
_:
push_warning("Unknown interrupt ", vn_value)
func _on_fishing_minigame_fished(target_name):
can_advance_text = false
$TimerCanAdvanceText.start()
fishing_minigame_active = false
$FishingMinigame/Net.can_move = false
$Sprites.visible = true
$Textbox.visible = true
$OverlayColor.visible = true
$Prompt.visible = true
# $ChatLog.visible = true
vn_step(target_name)
func _on_fishing_minigame_fished_all_targets():
fishing_minigame_finished = true
func _on_timer_net_can_move_timeout():
$FishingMinigame/Net.can_move = true
func _on_timer_can_advance_text_timeout():
can_advance_text = true
func _on_close_chat_log_button_pressed():
toggle_chatlog()
func _on_quicksave_button_pressed():
if save_game(FileGlobals.VNSaveTarget.MANUAL_SAVE):
quick_saved.emit()

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,120 @@
extends CanvasLayer
const MAX_LOG_SIZE = 100
const CLEAN_BUCKET = 10
var message_count = 0
@onready var scroll_container: ScrollContainer = $ScrollContainer
@onready var chat_log_lines_container: VBoxContainer = $ScrollContainer/ChatLogLinesContainer
@onready var chat_log_line = preload("res://scenes/ui_elements/chat_log_line.tscn")
var scroll_bar = null
var scroll_value = 0
var current_max_scroll = 0
var mouse_dragging = false
var mouse_scrolling = false
var mouse_dragging_initial_scroll_value = 0
var mouse_dragging_initial_pos = 0
var mouse_dragging_last_pos = Vector2.ZERO
func _ready():
scroll_bar = scroll_container.get_v_scroll_bar()
scroll_bar.changed.connect(_on_scroll_bar_changed)
scroll_bar.gui_input.connect(_on_scroll_bar_gui_input)
scroll_bar.set_deferred("custom_minimum_size", Vector2(20, scroll_bar.custom_minimum_size.y))
scroll_bar.set_deferred("position", Vector2(scroll_container.size.x - 20, 0))
#scroll_value = scroll_bar.max_value
#scroll_container.scroll_vertical = scroll_value
func _process(delta):
if visible:
set_scroll_vertical(scroll_value + Input.get_vector("ui_left", "ui_right", "ui_up", "ui_down").y * delta * 1000)
func add_line(speaker_text: String, speaker_name: String = ""):
clean_log()
var line = chat_log_line.instantiate()
if speaker_name:
line.get_node("NameLabel").text = speaker_name
else:
line.get_node("NameLabel").visible = false
line.get_node("TextLabel").text = " %s" % speaker_text
chat_log_lines_container.add_child(line)
message_count += 1
func add_selected_option_text(selected_option_text: String):
clean_log()
var line = chat_log_line.instantiate()
line.get_node("NameLabel").text = "◆ Option ◆"
line.get_node("TextLabel").text = " %s" % selected_option_text
chat_log_lines_container.add_child(line)
message_count += 1
func clean_log():
if message_count >= MAX_LOG_SIZE:
var children = chat_log_lines_container.get_children()
for i in CLEAN_BUCKET:
var child = children[i]
chat_log_lines_container.remove_child(child)
child.visible = false
child.queue_free()
message_count -= CLEAN_BUCKET
func set_scroll_vertical(value):
scroll_value = clamp(value, 0, current_max_scroll - scroll_container.size.y)
scroll_container.scroll_vertical = scroll_value
func _on_scroll_bar_changed():
if scroll_bar.max_value != current_max_scroll:
current_max_scroll = scroll_bar.max_value
scroll_value = max(0, current_max_scroll - scroll_container.size.y)
scroll_container.scroll_vertical = scroll_value
func _on_scroll_container_gui_input(event: InputEvent):
if event is InputEventMouseButton:
match event.button_index:
MOUSE_BUTTON_LEFT:
if event.pressed and not mouse_dragging:
mouse_dragging = true
mouse_scrolling = false
mouse_dragging_initial_pos = event.global_position.y
mouse_dragging_last_pos = event.global_position
mouse_dragging_initial_scroll_value = scroll_value
#scroll_value = mouse_dragging_initial_scroll_value
elif not event.pressed and mouse_dragging:
mouse_dragging = false
mouse_scrolling = false
MOUSE_BUTTON_WHEEL_UP:
set_scroll_vertical(scroll_value - 40)
MOUSE_BUTTON_WHEEL_DOWN:
set_scroll_vertical(scroll_value + 40)
elif event is InputEventMouseMotion and mouse_dragging:
# Fix for mobile touch and release not being detected; assume any instant jump in cursor distance of ~350px or more is a reset
if event.global_position.distance_squared_to(mouse_dragging_last_pos) >= 120_000:
mouse_dragging_initial_pos = event.global_position.y
mouse_dragging_initial_scroll_value = scroll_value
else:
set_scroll_vertical(mouse_dragging_initial_scroll_value - (event.global_position.y - mouse_dragging_initial_pos))
mouse_dragging_last_pos = event.global_position
func _on_scroll_bar_gui_input(event: InputEvent):
if event is InputEventMouseButton:
if event.button_index == MOUSE_BUTTON_LEFT:
if event.pressed and not mouse_scrolling:
mouse_dragging = false
mouse_scrolling = true
mouse_dragging_initial_pos = event.global_position.y
mouse_dragging_last_pos = event.global_position
mouse_dragging_initial_scroll_value = scroll_value
#scroll_value = mouse_dragging_initial_scroll_value
elif not event.pressed and mouse_scrolling:
mouse_dragging = false
mouse_scrolling = false
elif event is InputEventMouseMotion and mouse_scrolling:
# Fix for mobile touch and release not being detected; assume any instant jump in cursor distance of ~350px or more is a reset
if event.global_position.distance_squared_to(mouse_dragging_last_pos) >= 120_000:
mouse_dragging_initial_pos = event.global_position.y
mouse_dragging_initial_scroll_value = scroll_value
else:
set_scroll_vertical(mouse_dragging_initial_scroll_value + (current_max_scroll / scroll_bar.page) * (event.global_position.y - mouse_dragging_initial_pos))
mouse_dragging_last_pos = event.global_position

View file

@ -0,0 +1,6 @@
[gd_scene load_steps=2 format=3 uid="uid://x4yl51efxs5s"]
[ext_resource type="Script" path="res://scenes/ui_elements/chat_log.gd" id="1_gtkh7"]
[node name="ChatLog" type="CanvasLayer"]
script = ExtResource("1_gtkh7")

View file

@ -0,0 +1,41 @@
[gd_scene load_steps=2 format=3 uid="uid://b7un1h6gdp8bq"]
[ext_resource type="Theme" uid="uid://ckrbqku1sx5ge" path="res://scenes/ui_elements/textbox_theme.tres" id="1_erynh"]
[node name="ChatLogLine" type="HBoxContainer"]
anchors_preset = 14
anchor_top = 0.5
anchor_right = 1.0
anchor_bottom = 0.5
offset_top = -13.0
offset_bottom = 13.0
grow_horizontal = 2
grow_vertical = 2
size_flags_horizontal = 3
mouse_filter = 2
[node name="NameLabel" type="Label" parent="."]
modulate = Color(0.882353, 0.894118, 0.960784, 1)
layout_mode = 2
size_flags_vertical = 0
theme = ExtResource("1_erynh")
theme_override_colors/font_color = Color(0.698039, 0.717647, 0.823529, 1)
text = "Name "
horizontal_alignment = 1
visible_characters_behavior = 1
[node name="TextLabel" type="RichTextLabel" parent="."]
modulate = Color(0.882353, 0.894118, 0.960784, 1)
layout_mode = 2
size_flags_horizontal = 3
mouse_filter = 2
theme = ExtResource("1_erynh")
bbcode_enabled = true
text = "What the [color=#f00]fuck[/color]?!"
fit_content = true
scroll_active = false
shortcut_keys_enabled = false
meta_underlined = false
hint_underlined = false
drag_and_drop_selection_enabled = false
visible_characters_behavior = 1

View file

@ -0,0 +1,29 @@
extends CanvasLayer
signal prompt_option_selected(option_label, option_text)
var prompt_option_scene: PackedScene = preload("res://scenes/ui_elements/prompt_option.tscn")
func clear_options():
for child in $VBoxContainer.get_children():
child.queue_free()
func show_prompt():
visible = true
$AnimationPlayer.play("show_prompt")
await $AnimationPlayer.animation_finished
var first_option = $VBoxContainer.get_child(0)
if first_option:
first_option.get_child(0).grab_focus()
func hide_prompt():
visible = false
$AnimationPlayer.play_backwards("show_prompt")
func create_option(option_label: String, option_text: String):
var option = prompt_option_scene.instantiate()
option.init_option(self, option_label, option_text)
$VBoxContainer.add_child(option)
func on_option_selected(label: String, text: String):
prompt_option_selected.emit(label, text)

View file

@ -0,0 +1,102 @@
[gd_scene load_steps=6 format=3 uid="uid://db604d7kgvdrt"]
[ext_resource type="Script" path="res://scenes/ui_elements/prompt.gd" id="1_hyk7g"]
[sub_resource type="Animation" id="Animation_rdapi"]
length = 0.001
tracks/0/type = "value"
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/path = NodePath("PanelContainer:modulate")
tracks/0/interp = 2
tracks/0/loop_wrap = true
tracks/0/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 0,
"values": [Color(1, 1, 1, 0)]
}
tracks/1/type = "value"
tracks/1/imported = false
tracks/1/enabled = true
tracks/1/path = NodePath("VBoxContainer:visible")
tracks/1/interp = 1
tracks/1/loop_wrap = true
tracks/1/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 1,
"values": [false]
}
[sub_resource type="Animation" id="Animation_tuv2n"]
resource_name = "show_prompt"
length = 0.5
step = 0.25
tracks/0/type = "value"
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/path = NodePath("PanelContainer:modulate")
tracks/0/interp = 2
tracks/0/loop_wrap = true
tracks/0/keys = {
"times": PackedFloat32Array(0, 0.5),
"transitions": PackedFloat32Array(1, 1),
"update": 0,
"values": [Color(1, 1, 1, 0), Color(1, 1, 1, 1)]
}
tracks/1/type = "value"
tracks/1/imported = false
tracks/1/enabled = true
tracks/1/path = NodePath("VBoxContainer:visible")
tracks/1/interp = 1
tracks/1/loop_wrap = true
tracks/1/keys = {
"times": PackedFloat32Array(0, 0.5),
"transitions": PackedFloat32Array(1, 1),
"update": 1,
"values": [false, true]
}
[sub_resource type="AnimationLibrary" id="AnimationLibrary_ek38c"]
_data = {
"RESET": SubResource("Animation_rdapi"),
"show_prompt": SubResource("Animation_tuv2n")
}
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_w4jq4"]
bg_color = Color(0.0470588, 0.0666667, 0.160784, 0.501961)
[node name="Prompt" type="CanvasLayer"]
script = ExtResource("1_hyk7g")
[node name="AnimationPlayer" type="AnimationPlayer" parent="."]
libraries = {
"": SubResource("AnimationLibrary_ek38c")
}
[node name="PanelContainer" type="PanelContainer" parent="."]
modulate = Color(1, 1, 1, 0)
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
theme_override_styles/panel = SubResource("StyleBoxFlat_w4jq4")
[node name="VBoxContainer" type="VBoxContainer" parent="."]
visible = false
custom_minimum_size = Vector2(532, 0)
anchors_preset = 8
anchor_left = 0.5
anchor_top = 0.5
anchor_right = 0.5
anchor_bottom = 0.5
offset_left = -266.0
offset_right = 266.0
grow_horizontal = 2
grow_vertical = 2
size_flags_horizontal = 4
size_flags_vertical = 4
theme_override_constants/separation = 52
alignment = 1

View file

@ -0,0 +1,12 @@
extends Control
var prompt = null
func _on_option_button_pressed():
prompt.prompt_option_selected.emit(get_meta("option_label"), get_meta("option_text"))
func init_option(parent_prompt: Node, new_label: String, new_text: String):
prompt = parent_prompt
set_meta("option_label", new_label)
set_meta("option_text", new_text)
$OptionButton/NameFrame/Option/OptionLabel.text = new_text

View file

@ -0,0 +1,113 @@
[gd_scene load_steps=7 format=3 uid="uid://ce1bk8d2kdx2d"]
[ext_resource type="Texture2D" uid="uid://ykb3qmxlb1ph" path="res://images/ui/panel-border-014.png" id="1_j6xkn"]
[ext_resource type="Script" path="res://scenes/ui_elements/prompt_option.gd" id="1_ybyts"]
[ext_resource type="Theme" uid="uid://ckrbqku1sx5ge" path="res://scenes/ui_elements/textbox_theme.tres" id="2_xbmem"]
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_440le"]
bg_color = Color(0.74902, 0.74902, 0.74902, 1)
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_05h6u"]
bg_color = Color(0.517647, 0.517647, 0.517647, 1)
border_width_left = 3
border_width_top = 3
border_width_right = 3
border_width_bottom = 3
border_color = Color(0.203922, 0.482353, 0.85098, 1)
corner_radius_top_left = 6
corner_radius_top_right = 2
corner_radius_bottom_right = 2
corner_radius_bottom_left = 2
expand_margin_left = 3.0
expand_margin_top = 3.0
expand_margin_right = 3.0
expand_margin_bottom = 3.0
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_ujclv"]
bg_color = Color(0.0470588, 0.0666667, 0.160784, 0.752941)
corner_radius_top_left = 14
corner_radius_top_right = 14
corner_radius_bottom_right = 14
corner_radius_bottom_left = 14
[node name="PromptOption" type="Control"]
layout_mode = 3
anchors_preset = 5
anchor_left = 0.5
anchor_right = 0.5
grow_horizontal = 2
size_flags_horizontal = 0
size_flags_vertical = 8
script = ExtResource("1_ybyts")
metadata/option_label = ""
metadata/option_text = ""
[node name="OptionButton" type="Button" parent="."]
custom_minimum_size = Vector2(0, 26)
layout_mode = 1
anchors_preset = 4
anchor_top = 0.5
anchor_bottom = 0.5
offset_top = -21.0
offset_right = 512.0
offset_bottom = 21.0
grow_vertical = 2
theme_override_styles/hover = SubResource("StyleBoxFlat_440le")
theme_override_styles/focus = SubResource("StyleBoxFlat_05h6u")
keep_pressed_outside = true
[node name="Panel" type="Panel" parent="OptionButton"]
layout_mode = 1
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
theme_override_styles/panel = SubResource("StyleBoxFlat_ujclv")
[node name="NameFrame" type="NinePatchRect" parent="OptionButton"]
modulate = Color(0.882353, 0.894118, 0.960784, 1)
layout_mode = 1
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
texture = ExtResource("1_j6xkn")
draw_center = false
patch_margin_left = 14
patch_margin_top = 14
patch_margin_right = 14
patch_margin_bottom = 14
axis_stretch_horizontal = 1
axis_stretch_vertical = 1
[node name="Option" type="MarginContainer" parent="OptionButton/NameFrame"]
layout_mode = 1
anchors_preset = 4
anchor_top = 0.5
anchor_bottom = 0.5
offset_top = -21.0
offset_right = 532.0
offset_bottom = 21.0
grow_vertical = 2
theme_override_constants/margin_left = 16
theme_override_constants/margin_top = 8
theme_override_constants/margin_right = 16
theme_override_constants/margin_bottom = 8
[node name="OptionLabel" type="RichTextLabel" parent="OptionButton/NameFrame/Option"]
modulate = Color(0.882353, 0.894118, 0.960784, 1)
layout_mode = 2
size_flags_horizontal = 4
mouse_filter = 2
theme = ExtResource("2_xbmem")
bbcode_enabled = true
text = "Button text"
fit_content = true
scroll_active = false
autowrap_mode = 0
shortcut_keys_enabled = false
visible_characters_behavior = 1
[connection signal="pressed" from="OptionButton" to="." method="_on_option_button_pressed"]

View file

@ -0,0 +1,11 @@
extends CanvasLayer
# Called when the node enters the scene tree for the first time.
func _ready():
pass # Replace with function body.
# Called every frame. 'delta' is the elapsed time since the previous frame.
func _process(delta):
pass

View file

@ -0,0 +1,64 @@
extends CanvasLayer
var is_textbox_visible: bool = false
var is_textbox_expanded: bool = false
func is_ready() -> bool:
return $AnimationPlayer.current_animation == "" or $AnimationPlayer.current_animation == "textbox_idle"
func is_idle() -> bool:
return $AnimationPlayer.current_animation == "textbox_idle"
func skip():
if $AnimationPlayer.current_animation == "write_text" or $AnimationPlayer.current_animation == "collapse_textbox" or $AnimationPlayer.current_animation == "expand_textbox":
$AnimationPlayer.seek(0.9999, true)
func await_pending_animations():
if not is_ready():
await $AnimationPlayer.animation_finished
func show_textbox():
# await await_pending_animations()
$AnimationPlayer.play("show_textbox")
await $AnimationPlayer.animation_finished
func hide_textbox():
# await await_pending_animations()
$AnimationPlayer.play_backwards("show_textbox")
await $AnimationPlayer.animation_finished
func expand_textbox():
# await await_pending_animations()
$AnimationPlayer.play("expand_textbox")
await $AnimationPlayer.animation_finished
func collapse_textbox():
# await await_pending_animations()
$AnimationPlayer.play("collapse_textbox")
await $AnimationPlayer.animation_finished
func ready_textbox():
$AnimationPlayer.play("textbox_idle")
func disable_textbox():
$AnimationPlayer.play("disable_textbox")
func enable_textbox():
if $AnimationPlayer.current_animation == "disable_textbox":
$AnimationPlayer.stop()
func write_text(speaker_text: String, speaker_name: String = ""):
var text_label: RichTextLabel = $MarginContainer/VBoxContainer/TextContainer/Text/TextLabel
text_label.visible_characters = 0
text_label.text = speaker_text
if speaker_name:
$MarginContainer/VBoxContainer/NameContainer/Name/NameLabel.text = speaker_name
$MarginContainer/VBoxContainer/NameContainer.visible = true
else:
$MarginContainer/VBoxContainer/NameContainer.visible = false
$MarginContainer/VBoxContainer/NameContainer/Name/NameLabel.text = ""
# Characters per second
var animation_speed = 48.0 / text_label.get_total_character_count()
$AnimationPlayer.play("write_text", -1, animation_speed)
await $AnimationPlayer.animation_finished

View file

@ -0,0 +1,802 @@
[gd_scene load_steps=16 format=3 uid="uid://b3hnb4vtqq6p3"]
[ext_resource type="Script" path="res://scenes/ui_elements/textbox.gd" id="1_op1eo"]
[ext_resource type="Texture2D" uid="uid://djlgpmcjf3djp" path="res://images/ui/panel-border-005.png" id="2_7k7l5"]
[ext_resource type="Theme" uid="uid://ckrbqku1sx5ge" path="res://scenes/ui_elements/textbox_theme.tres" id="2_guxsf"]
[ext_resource type="Texture2D" uid="uid://6lomvlry6h2t" path="res://images/ui/panel-border-012.png" id="4_q4tn7"]
[ext_resource type="Texture2D" uid="uid://rusdm825x727" path="res://images/ui/tile_finger_pointing_right.png" id="5_cu26b"]
[ext_resource type="Texture2D" uid="uid://b1sfw7ruq8l0a" path="res://images/ui/chat-bubble.svg" id="6_27cyh"]
[sub_resource type="Animation" id="Animation_a34jj"]
length = 0.001
tracks/0/type = "value"
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/path = NodePath("MarginContainer/VBoxContainer/TextContainer/Text:theme_override_constants/margin_left")
tracks/0/interp = 2
tracks/0/loop_wrap = true
tracks/0/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 0,
"values": [0]
}
tracks/1/type = "value"
tracks/1/imported = false
tracks/1/enabled = true
tracks/1/path = NodePath("MarginContainer/VBoxContainer/TextContainer/Text:theme_override_constants/margin_top")
tracks/1/interp = 2
tracks/1/loop_wrap = true
tracks/1/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 0,
"values": [0]
}
tracks/2/type = "value"
tracks/2/imported = false
tracks/2/enabled = true
tracks/2/path = NodePath("MarginContainer/VBoxContainer/TextContainer/Text:theme_override_constants/margin_right")
tracks/2/interp = 2
tracks/2/loop_wrap = true
tracks/2/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 0,
"values": [0]
}
tracks/3/type = "value"
tracks/3/imported = false
tracks/3/enabled = true
tracks/3/path = NodePath("MarginContainer/VBoxContainer/TextContainer/Text:theme_override_constants/margin_bottom")
tracks/3/interp = 2
tracks/3/loop_wrap = true
tracks/3/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 0,
"values": [0]
}
tracks/4/type = "value"
tracks/4/imported = false
tracks/4/enabled = true
tracks/4/path = NodePath("MarginContainer/VBoxContainer/NameContainer:visible")
tracks/4/interp = 1
tracks/4/loop_wrap = true
tracks/4/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 1,
"values": [false]
}
tracks/5/type = "value"
tracks/5/imported = false
tracks/5/enabled = true
tracks/5/path = NodePath("MarginContainer/VBoxContainer/TextContainer/Text/TextLabel:visible")
tracks/5/interp = 1
tracks/5/loop_wrap = true
tracks/5/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 1,
"values": [false]
}
tracks/6/type = "value"
tracks/6/imported = false
tracks/6/enabled = true
tracks/6/path = NodePath("MarginContainer/VBoxContainer/TextContainer/Text/TextLabel:visible_characters")
tracks/6/interp = 1
tracks/6/loop_wrap = true
tracks/6/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 1,
"values": [0]
}
tracks/7/type = "value"
tracks/7/imported = false
tracks/7/enabled = true
tracks/7/path = NodePath("MarginContainer/VBoxContainer:modulate")
tracks/7/interp = 1
tracks/7/loop_wrap = true
tracks/7/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 0,
"values": [Color(1, 1, 1, 0)]
}
tracks/8/type = "value"
tracks/8/imported = false
tracks/8/enabled = true
tracks/8/path = NodePath("MarginContainer/VBoxContainer/TextContainer/Text:custom_minimum_size")
tracks/8/interp = 2
tracks/8/loop_wrap = true
tracks/8/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 0,
"values": [Vector2(0, 0)]
}
tracks/9/type = "value"
tracks/9/imported = false
tracks/9/enabled = true
tracks/9/path = NodePath("OutsideMarginContainer:visible")
tracks/9/interp = 1
tracks/9/loop_wrap = true
tracks/9/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 1,
"values": [false]
}
tracks/10/type = "value"
tracks/10/imported = false
tracks/10/enabled = true
tracks/10/path = NodePath("ChatLogIndicatorMarginContainer/TextureChatLogIndicator:self_modulate")
tracks/10/interp = 2
tracks/10/loop_wrap = true
tracks/10/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 0,
"values": [Color(0.882353, 0.894118, 0.960784, 0)]
}
[sub_resource type="Animation" id="Animation_rto2s"]
resource_name = "collapse_textbox"
step = 0.25
tracks/0/type = "value"
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/path = NodePath("MarginContainer/VBoxContainer/NameContainer:visible")
tracks/0/interp = 1
tracks/0/loop_wrap = true
tracks/0/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 1,
"values": [false]
}
tracks/1/type = "value"
tracks/1/imported = false
tracks/1/enabled = true
tracks/1/path = NodePath("MarginContainer/VBoxContainer/TextContainer/Text/TextLabel:visible")
tracks/1/interp = 1
tracks/1/loop_wrap = true
tracks/1/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 1,
"values": [false]
}
tracks/2/type = "value"
tracks/2/imported = false
tracks/2/enabled = true
tracks/2/path = NodePath("MarginContainer/VBoxContainer/TextContainer/Text:custom_minimum_size")
tracks/2/interp = 2
tracks/2/loop_wrap = true
tracks/2/keys = {
"times": PackedFloat32Array(0.25, 0.75),
"transitions": PackedFloat32Array(1, 1),
"update": 0,
"values": [Vector2(596, 128), Vector2(0, 0)]
}
tracks/3/type = "value"
tracks/3/imported = false
tracks/3/enabled = true
tracks/3/path = NodePath("MarginContainer/VBoxContainer/TextContainer/Text:theme_override_constants/margin_left")
tracks/3/interp = 2
tracks/3/loop_wrap = true
tracks/3/keys = {
"times": PackedFloat32Array(0.25, 0.75),
"transitions": PackedFloat32Array(1, 1),
"update": 0,
"values": [18, 0]
}
tracks/4/type = "value"
tracks/4/imported = false
tracks/4/enabled = true
tracks/4/path = NodePath("MarginContainer/VBoxContainer/TextContainer/Text:theme_override_constants/margin_top")
tracks/4/interp = 2
tracks/4/loop_wrap = true
tracks/4/keys = {
"times": PackedFloat32Array(0.25, 0.75),
"transitions": PackedFloat32Array(1, 1),
"update": 0,
"values": [12, 0]
}
tracks/5/type = "value"
tracks/5/imported = false
tracks/5/enabled = true
tracks/5/path = NodePath("MarginContainer/VBoxContainer/TextContainer/Text:theme_override_constants/margin_right")
tracks/5/interp = 2
tracks/5/loop_wrap = true
tracks/5/keys = {
"times": PackedFloat32Array(0.25, 0.75),
"transitions": PackedFloat32Array(1, 1),
"update": 0,
"values": [18, 0]
}
tracks/6/type = "value"
tracks/6/imported = false
tracks/6/enabled = true
tracks/6/path = NodePath("MarginContainer/VBoxContainer/TextContainer/Text:theme_override_constants/margin_bottom")
tracks/6/interp = 2
tracks/6/loop_wrap = true
tracks/6/keys = {
"times": PackedFloat32Array(0.25, 0.75),
"transitions": PackedFloat32Array(1, 1),
"update": 0,
"values": [12, 0]
}
tracks/7/type = "value"
tracks/7/imported = false
tracks/7/enabled = true
tracks/7/path = NodePath("OutsideMarginContainer:visible")
tracks/7/interp = 1
tracks/7/loop_wrap = true
tracks/7/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 1,
"values": [false]
}
tracks/8/type = "value"
tracks/8/imported = false
tracks/8/enabled = true
tracks/8/path = NodePath("MarginContainer/VBoxContainer:modulate")
tracks/8/interp = 1
tracks/8/loop_wrap = true
tracks/8/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 0,
"values": [Color(1, 1, 1, 1)]
}
tracks/9/type = "value"
tracks/9/imported = false
tracks/9/enabled = true
tracks/9/path = NodePath("ChatLogIndicatorMarginContainer/TextureChatLogIndicator:self_modulate")
tracks/9/interp = 2
tracks/9/loop_wrap = true
tracks/9/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 0,
"values": [Color(0.882353, 0.894118, 0.960784, 0)]
}
[sub_resource type="Animation" id="Animation_lv0k3"]
resource_name = "disable_textbox"
length = 0.001
loop_mode = 1
tracks/0/type = "value"
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/path = NodePath("OutsideMarginContainer:visible")
tracks/0/interp = 1
tracks/0/loop_wrap = true
tracks/0/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 1,
"values": [false]
}
tracks/1/type = "value"
tracks/1/imported = false
tracks/1/enabled = true
tracks/1/path = NodePath("ChatLogIndicatorMarginContainer/TextureChatLogIndicator:self_modulate")
tracks/1/interp = 1
tracks/1/loop_wrap = true
tracks/1/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 0,
"values": [Color(0.882353, 0.894118, 0.960784, 0)]
}
[sub_resource type="Animation" id="Animation_1wdjj"]
resource_name = "expand_textbox"
step = 0.25
tracks/0/type = "value"
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/path = NodePath("MarginContainer/VBoxContainer/NameContainer:visible")
tracks/0/interp = 1
tracks/0/loop_wrap = true
tracks/0/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 1,
"values": [false]
}
tracks/1/type = "value"
tracks/1/imported = false
tracks/1/enabled = true
tracks/1/path = NodePath("MarginContainer/VBoxContainer/TextContainer/Text/TextLabel:visible")
tracks/1/interp = 1
tracks/1/loop_wrap = true
tracks/1/keys = {
"times": PackedFloat32Array(0, 1),
"transitions": PackedFloat32Array(1, 1),
"update": 1,
"values": [false, true]
}
tracks/2/type = "value"
tracks/2/imported = false
tracks/2/enabled = true
tracks/2/path = NodePath("MarginContainer/VBoxContainer/TextContainer/Text:custom_minimum_size")
tracks/2/interp = 2
tracks/2/loop_wrap = true
tracks/2/keys = {
"times": PackedFloat32Array(0.25, 0.75),
"transitions": PackedFloat32Array(1, 1),
"update": 0,
"values": [Vector2(0, 0), Vector2(596, 128)]
}
tracks/3/type = "value"
tracks/3/imported = false
tracks/3/enabled = true
tracks/3/path = NodePath("MarginContainer/VBoxContainer/TextContainer/Text:theme_override_constants/margin_left")
tracks/3/interp = 2
tracks/3/loop_wrap = true
tracks/3/keys = {
"times": PackedFloat32Array(0.25, 0.75),
"transitions": PackedFloat32Array(1, 1),
"update": 0,
"values": [0, 18]
}
tracks/4/type = "value"
tracks/4/imported = false
tracks/4/enabled = true
tracks/4/path = NodePath("MarginContainer/VBoxContainer/TextContainer/Text:theme_override_constants/margin_top")
tracks/4/interp = 2
tracks/4/loop_wrap = true
tracks/4/keys = {
"times": PackedFloat32Array(0.25, 0.75),
"transitions": PackedFloat32Array(1, 1),
"update": 0,
"values": [0, 12]
}
tracks/5/type = "value"
tracks/5/imported = false
tracks/5/enabled = true
tracks/5/path = NodePath("MarginContainer/VBoxContainer/TextContainer/Text:theme_override_constants/margin_right")
tracks/5/interp = 2
tracks/5/loop_wrap = true
tracks/5/keys = {
"times": PackedFloat32Array(0.25, 0.75),
"transitions": PackedFloat32Array(1, 1),
"update": 0,
"values": [0, 18]
}
tracks/6/type = "value"
tracks/6/imported = false
tracks/6/enabled = true
tracks/6/path = NodePath("MarginContainer/VBoxContainer/TextContainer/Text:theme_override_constants/margin_bottom")
tracks/6/interp = 2
tracks/6/loop_wrap = true
tracks/6/keys = {
"times": PackedFloat32Array(0.25, 0.75),
"transitions": PackedFloat32Array(1, 1),
"update": 0,
"values": [0, 12]
}
tracks/7/type = "value"
tracks/7/imported = false
tracks/7/enabled = true
tracks/7/path = NodePath("MarginContainer/VBoxContainer/TextContainer/Text/TextLabel:visible_characters")
tracks/7/interp = 1
tracks/7/loop_wrap = true
tracks/7/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 1,
"values": [0]
}
tracks/8/type = "value"
tracks/8/imported = false
tracks/8/enabled = true
tracks/8/path = NodePath("OutsideMarginContainer:visible")
tracks/8/interp = 1
tracks/8/loop_wrap = true
tracks/8/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 1,
"values": [false]
}
tracks/9/type = "value"
tracks/9/imported = false
tracks/9/enabled = true
tracks/9/path = NodePath("MarginContainer/VBoxContainer:modulate")
tracks/9/interp = 1
tracks/9/loop_wrap = true
tracks/9/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 0,
"values": [Color(1, 1, 1, 1)]
}
tracks/10/type = "value"
tracks/10/imported = false
tracks/10/enabled = true
tracks/10/path = NodePath("ChatLogIndicatorMarginContainer/TextureChatLogIndicator:self_modulate")
tracks/10/interp = 1
tracks/10/loop_wrap = true
tracks/10/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 0,
"values": [Color(0.882353, 0.894118, 0.960784, 0)]
}
[sub_resource type="Animation" id="Animation_kvu86"]
resource_name = "show_textbox"
length = 0.5
tracks/0/type = "value"
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/path = NodePath("MarginContainer/VBoxContainer:modulate")
tracks/0/interp = 1
tracks/0/loop_wrap = true
tracks/0/keys = {
"times": PackedFloat32Array(0, 0.5),
"transitions": PackedFloat32Array(1, 1),
"update": 0,
"values": [Color(1, 1, 1, 0), Color(1, 1, 1, 1)]
}
tracks/1/type = "value"
tracks/1/imported = false
tracks/1/enabled = true
tracks/1/path = NodePath("OutsideMarginContainer:visible")
tracks/1/interp = 1
tracks/1/loop_wrap = true
tracks/1/keys = {
"times": PackedFloat32Array(0, 0.5),
"transitions": PackedFloat32Array(1, 1),
"update": 1,
"values": [false, false]
}
tracks/2/type = "value"
tracks/2/imported = false
tracks/2/enabled = true
tracks/2/path = NodePath("ChatLogIndicatorMarginContainer/TextureChatLogIndicator:self_modulate")
tracks/2/interp = 1
tracks/2/loop_wrap = true
tracks/2/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 0,
"values": [Color(0.882353, 0.894118, 0.960784, 0)]
}
[sub_resource type="Animation" id="Animation_u2um3"]
resource_name = "textbox_idle"
length = 4.5
loop_mode = 2
step = 0.3
tracks/0/type = "value"
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/path = NodePath("OutsideMarginContainer:visible")
tracks/0/interp = 1
tracks/0/loop_wrap = true
tracks/0/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 1,
"values": [true]
}
tracks/1/type = "value"
tracks/1/imported = false
tracks/1/enabled = true
tracks/1/path = NodePath("OutsideMarginContainer:theme_override_constants/margin_left")
tracks/1/interp = 2
tracks/1/loop_wrap = true
tracks/1/keys = {
"times": PackedFloat32Array(0, 0.3, 0.6, 0.9, 1.2, 1.5, 1.8, 2.1, 2.4, 2.7, 3, 3.3, 3.6, 3.9, 4.2, 4.5),
"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1),
"update": 0,
"values": [560, 552, 560, 552, 560, 552, 560, 552, 560, 552, 560, 552, 560, 552, 560, 552]
}
tracks/2/type = "value"
tracks/2/imported = false
tracks/2/enabled = true
tracks/2/path = NodePath("ChatLogIndicatorMarginContainer/TextureChatLogIndicator:self_modulate")
tracks/2/interp = 2
tracks/2/loop_wrap = true
tracks/2/keys = {
"times": PackedFloat32Array(0, 3.6, 4.2, 4.5),
"transitions": PackedFloat32Array(1, 1, 1, 1),
"update": 0,
"values": [Color(0.882353, 0.894118, 0.960784, 0), Color(0.882353, 0.894118, 0.960784, 0), Color(0.882353, 0.894118, 0.960784, 0.501961), Color(0.882353, 0.894118, 0.960784, 0.501961)]
}
[sub_resource type="Animation" id="Animation_8t3xa"]
resource_name = "write_text"
tracks/0/type = "value"
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/path = NodePath("MarginContainer/VBoxContainer/TextContainer/Text:theme_override_constants/margin_left")
tracks/0/interp = 2
tracks/0/loop_wrap = true
tracks/0/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 0,
"values": [18]
}
tracks/1/type = "value"
tracks/1/imported = false
tracks/1/enabled = true
tracks/1/path = NodePath("MarginContainer/VBoxContainer/TextContainer/Text:theme_override_constants/margin_top")
tracks/1/interp = 2
tracks/1/loop_wrap = true
tracks/1/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 0,
"values": [12]
}
tracks/2/type = "value"
tracks/2/imported = false
tracks/2/enabled = true
tracks/2/path = NodePath("MarginContainer/VBoxContainer/TextContainer/Text:theme_override_constants/margin_right")
tracks/2/interp = 2
tracks/2/loop_wrap = true
tracks/2/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 0,
"values": [18]
}
tracks/3/type = "value"
tracks/3/imported = false
tracks/3/enabled = true
tracks/3/path = NodePath("MarginContainer/VBoxContainer/TextContainer/Text:theme_override_constants/margin_bottom")
tracks/3/interp = 2
tracks/3/loop_wrap = true
tracks/3/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 0,
"values": [12]
}
tracks/4/type = "value"
tracks/4/imported = false
tracks/4/enabled = true
tracks/4/path = NodePath("MarginContainer/VBoxContainer/TextContainer/Text/TextLabel:visible")
tracks/4/interp = 1
tracks/4/loop_wrap = true
tracks/4/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 1,
"values": [true]
}
tracks/5/type = "value"
tracks/5/imported = false
tracks/5/enabled = true
tracks/5/path = NodePath("MarginContainer/VBoxContainer:modulate")
tracks/5/interp = 1
tracks/5/loop_wrap = true
tracks/5/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 0,
"values": [Color(1, 1, 1, 1)]
}
tracks/6/type = "value"
tracks/6/imported = false
tracks/6/enabled = true
tracks/6/path = NodePath("MarginContainer/VBoxContainer/TextContainer/Text/TextLabel:visible_ratio")
tracks/6/interp = 1
tracks/6/loop_wrap = true
tracks/6/keys = {
"times": PackedFloat32Array(0, 1),
"transitions": PackedFloat32Array(1, 1),
"update": 0,
"values": [0.0, 1.0]
}
tracks/7/type = "value"
tracks/7/imported = false
tracks/7/enabled = true
tracks/7/path = NodePath("MarginContainer/VBoxContainer/TextContainer/Text:custom_minimum_size")
tracks/7/interp = 2
tracks/7/loop_wrap = true
tracks/7/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 0,
"values": [Vector2(596, 128)]
}
tracks/8/type = "value"
tracks/8/imported = false
tracks/8/enabled = true
tracks/8/path = NodePath("OutsideMarginContainer:visible")
tracks/8/interp = 1
tracks/8/loop_wrap = true
tracks/8/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 1,
"values": [false]
}
tracks/9/type = "value"
tracks/9/imported = false
tracks/9/enabled = true
tracks/9/path = NodePath("ChatLogIndicatorMarginContainer/TextureChatLogIndicator:self_modulate")
tracks/9/interp = 1
tracks/9/loop_wrap = true
tracks/9/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 0,
"values": [Color(0.882353, 0.894118, 0.960784, 0)]
}
[sub_resource type="AnimationLibrary" id="AnimationLibrary_tk3r4"]
_data = {
"RESET": SubResource("Animation_a34jj"),
"collapse_textbox": SubResource("Animation_rto2s"),
"disable_textbox": SubResource("Animation_lv0k3"),
"expand_textbox": SubResource("Animation_1wdjj"),
"show_textbox": SubResource("Animation_kvu86"),
"textbox_idle": SubResource("Animation_u2um3"),
"write_text": SubResource("Animation_8t3xa")
}
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_6ruof"]
bg_color = Color(0.0470588, 0.0666667, 0.160784, 0.878431)
[node name="Textbox" type="CanvasLayer"]
script = ExtResource("1_op1eo")
[node name="AnimationPlayer" type="AnimationPlayer" parent="."]
libraries = {
"": SubResource("AnimationLibrary_tk3r4")
}
[node name="MarginContainer" type="MarginContainer" parent="."]
anchors_preset = 7
anchor_left = 0.5
anchor_top = 1.0
anchor_right = 0.5
anchor_bottom = 1.0
offset_left = -12.0
offset_top = -56.0
offset_right = 12.0
grow_horizontal = 2
grow_vertical = 0
size_flags_horizontal = 4
size_flags_vertical = 8
theme_override_constants/margin_bottom = 32
[node name="VBoxContainer" type="VBoxContainer" parent="MarginContainer"]
modulate = Color(1, 1, 1, 0)
layout_mode = 2
theme_override_constants/separation = 0
[node name="NameContainer" type="MarginContainer" parent="MarginContainer/VBoxContainer"]
visible = false
layout_mode = 2
size_flags_horizontal = 0
size_flags_vertical = 8
theme_override_constants/margin_left = 32
theme_override_constants/margin_bottom = -2
[node name="Panel" type="Panel" parent="MarginContainer/VBoxContainer/NameContainer"]
layout_mode = 2
theme_override_styles/panel = SubResource("StyleBoxFlat_6ruof")
[node name="NameFrame" type="NinePatchRect" parent="MarginContainer/VBoxContainer/NameContainer"]
modulate = Color(0.882353, 0.894118, 0.960784, 1)
layout_mode = 2
texture = ExtResource("2_7k7l5")
draw_center = false
patch_margin_left = 14
patch_margin_top = 14
patch_margin_right = 14
patch_margin_bottom = 14
axis_stretch_horizontal = 1
axis_stretch_vertical = 1
[node name="Name" type="MarginContainer" parent="MarginContainer/VBoxContainer/NameContainer"]
layout_mode = 2
theme_override_constants/margin_left = 16
theme_override_constants/margin_top = 8
theme_override_constants/margin_right = 16
theme_override_constants/margin_bottom = 8
[node name="NameLabel" type="Label" parent="MarginContainer/VBoxContainer/NameContainer/Name"]
modulate = Color(0.882353, 0.894118, 0.960784, 1)
custom_minimum_size = Vector2(112, 26)
layout_mode = 2
theme = ExtResource("2_guxsf")
text = "Marco"
horizontal_alignment = 1
visible_characters_behavior = 1
[node name="TextContainer" type="MarginContainer" parent="MarginContainer/VBoxContainer"]
layout_mode = 2
size_flags_vertical = 8
[node name="Panel" type="Panel" parent="MarginContainer/VBoxContainer/TextContainer"]
clip_contents = true
layout_mode = 2
theme_override_styles/panel = SubResource("StyleBoxFlat_6ruof")
[node name="TextFrame" type="NinePatchRect" parent="MarginContainer/VBoxContainer/TextContainer"]
modulate = Color(0.882353, 0.894118, 0.960784, 1)
layout_mode = 2
texture = ExtResource("4_q4tn7")
draw_center = false
patch_margin_left = 12
patch_margin_top = 12
patch_margin_right = 12
patch_margin_bottom = 12
axis_stretch_horizontal = 1
axis_stretch_vertical = 1
[node name="Text" type="MarginContainer" parent="MarginContainer/VBoxContainer/TextContainer"]
layout_mode = 2
theme_override_constants/margin_left = 0
theme_override_constants/margin_top = 0
theme_override_constants/margin_right = 0
theme_override_constants/margin_bottom = 0
[node name="TextLabel" type="RichTextLabel" parent="MarginContainer/VBoxContainer/TextContainer/Text"]
visible = false
modulate = Color(0.882353, 0.894118, 0.960784, 1)
layout_mode = 2
mouse_filter = 2
theme = ExtResource("2_guxsf")
bbcode_enabled = true
text = "What the [color=#f00]fuck[/color]?!"
scroll_active = false
scroll_following = true
shortcut_keys_enabled = false
meta_underlined = false
hint_underlined = false
drag_and_drop_selection_enabled = false
visible_characters = 0
visible_characters_behavior = 1
visible_ratio = 0.0
[node name="OutsideMarginContainer" type="MarginContainer" parent="."]
visible = false
anchors_preset = 7
anchor_left = 0.5
anchor_top = 1.0
anchor_right = 0.5
anchor_bottom = 1.0
offset_left = -12.0
offset_top = -56.0
offset_right = 12.0
grow_horizontal = 2
grow_vertical = 0
size_flags_horizontal = 4
size_flags_vertical = 8
theme_override_constants/margin_left = 560
theme_override_constants/margin_bottom = 42
[node name="TextureNext" type="TextureRect" parent="OutsideMarginContainer"]
layout_mode = 2
size_flags_horizontal = 8
size_flags_vertical = 8
texture = ExtResource("5_cu26b")
[node name="ChatLogIndicatorMarginContainer" type="MarginContainer" parent="."]
offset_right = 40.0
offset_bottom = 40.0
theme_override_constants/margin_left = 12
theme_override_constants/margin_top = 12
theme_override_constants/margin_right = 12
theme_override_constants/margin_bottom = 12
[node name="TextureChatLogIndicator" type="TextureRect" parent="ChatLogIndicatorMarginContainer"]
self_modulate = Color(0.882353, 0.894118, 0.960784, 0)
custom_minimum_size = Vector2(36, 36)
layout_mode = 2
texture = ExtResource("6_27cyh")

View file

@ -0,0 +1,7 @@
[gd_resource type="Theme" load_steps=2 format=3 uid="uid://ckrbqku1sx5ge"]
[ext_resource type="FontFile" uid="uid://vr3gwqu6tvh6" path="res://fonts/EpilepsySans.ttf" id="1_ic16e"]
[resource]
default_font = ExtResource("1_ic16e")
default_font_size = 26

View file

@ -0,0 +1,190 @@
[gd_scene load_steps=8 format=3 uid="uid://d1rjb8to843h4"]
[ext_resource type="Texture2D" uid="uid://b2r3y8ou4x24q" path="res://images/sprites/bard/normal.png" id="1_rldh6"]
[sub_resource type="Animation" id="Animation_xnq4c"]
resource_name = "RESET"
length = 0.01
tracks/0/type = "value"
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/path = NodePath("Sprite:visible")
tracks/0/interp = 1
tracks/0/loop_wrap = true
tracks/0/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 1,
"values": [true]
}
tracks/1/type = "value"
tracks/1/imported = false
tracks/1/enabled = true
tracks/1/path = NodePath("Sprite:scale")
tracks/1/interp = 2
tracks/1/loop_wrap = true
tracks/1/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 0,
"values": [Vector2(1, 1)]
}
tracks/2/type = "value"
tracks/2/imported = false
tracks/2/enabled = true
tracks/2/path = NodePath("Sprite:position")
tracks/2/interp = 2
tracks/2/loop_wrap = true
tracks/2/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 0,
"values": [Vector2(400, 300)]
}
[sub_resource type="Animation" id="Animation_cer7j"]
resource_name = "sprite_1_bounce"
length = 0.4
step = 0.05
tracks/0/type = "value"
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/path = NodePath("Sprite:visible")
tracks/0/interp = 1
tracks/0/loop_wrap = true
tracks/0/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 1,
"values": [true]
}
tracks/1/type = "value"
tracks/1/imported = false
tracks/1/enabled = true
tracks/1/path = NodePath("Sprite:scale")
tracks/1/interp = 2
tracks/1/loop_wrap = true
tracks/1/keys = {
"times": PackedFloat32Array(0, 0.2, 0.4),
"transitions": PackedFloat32Array(2, 1, 2),
"update": 0,
"values": [Vector2(0.97, 0.9), Vector2(1.05, 1.1), Vector2(1, 1)]
}
tracks/2/type = "value"
tracks/2/imported = false
tracks/2/enabled = true
tracks/2/path = NodePath("Sprite:position")
tracks/2/interp = 2
tracks/2/loop_wrap = true
tracks/2/keys = {
"times": PackedFloat32Array(0, 0.2, 0.4),
"transitions": PackedFloat32Array(2, 1, 2),
"update": 0,
"values": [Vector2(400, 360), Vector2(400, 300), Vector2(400, 300)]
}
[sub_resource type="Animation" id="Animation_624s1"]
resource_name = "fade_out"
length = 0.4
step = 0.025
tracks/0/type = "value"
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/path = NodePath("Sprite:visible")
tracks/0/interp = 1
tracks/0/loop_wrap = true
tracks/0/keys = {
"times": PackedFloat32Array(0, 0.3, 0.325),
"transitions": PackedFloat32Array(1, 1, 1),
"update": 1,
"values": [true, true, false]
}
tracks/1/type = "value"
tracks/1/imported = false
tracks/1/enabled = true
tracks/1/path = NodePath("Sprite:self_modulate")
tracks/1/interp = 2
tracks/1/loop_wrap = true
tracks/1/keys = {
"times": PackedFloat32Array(0, 0.3, 0.375, 0.4),
"transitions": PackedFloat32Array(1, 1, 1, 1),
"update": 0,
"values": [Color(1, 1, 1, 1), Color(1, 1, 1, 0), Color(1, 1, 1, 0), Color(1, 1, 1, 1)]
}
[sub_resource type="Animation" id="Animation_yrtof"]
resource_name = "fall_down"
length = 0.5
step = 0.05
tracks/0/type = "value"
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/path = NodePath("Sprite:visible")
tracks/0/interp = 1
tracks/0/loop_wrap = true
tracks/0/keys = {
"times": PackedFloat32Array(0, 0.4, 0.45),
"transitions": PackedFloat32Array(1, 1, 1),
"update": 1,
"values": [true, true, false]
}
tracks/1/type = "value"
tracks/1/imported = false
tracks/1/enabled = true
tracks/1/path = NodePath("Sprite:position")
tracks/1/interp = 2
tracks/1/loop_wrap = true
tracks/1/keys = {
"times": PackedFloat32Array(0, 0.2, 0.4, 0.45, 0.5),
"transitions": PackedFloat32Array(1, 1, 1, 1, 1),
"update": 0,
"values": [Vector2(400, 300), Vector2(400, 600), Vector2(400, 1300), Vector2(400, 1300), Vector2(400, 300)]
}
[sub_resource type="Animation" id="Animation_1wxb1"]
resource_name = "reveal_fishing_item"
length = 1.5
tracks/0/type = "value"
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/path = NodePath("Sprite:visible")
tracks/0/interp = 1
tracks/0/loop_wrap = true
tracks/0/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 1,
"values": [true]
}
tracks/1/type = "value"
tracks/1/imported = false
tracks/1/enabled = true
tracks/1/path = NodePath("Sprite:self_modulate")
tracks/1/interp = 2
tracks/1/loop_wrap = true
tracks/1/keys = {
"times": PackedFloat32Array(0, 1, 1.5),
"transitions": PackedFloat32Array(1, 1, 0.965936),
"update": 0,
"values": [Color(0, 0, 0, 1), Color(0, 0, 0, 1), Color(1, 1, 1, 1)]
}
[sub_resource type="AnimationLibrary" id="AnimationLibrary_2gw37"]
_data = {
"RESET": SubResource("Animation_xnq4c"),
"bounce": SubResource("Animation_cer7j"),
"fade_out": SubResource("Animation_624s1"),
"fall_down": SubResource("Animation_yrtof"),
"reveal_fishing_item": SubResource("Animation_1wxb1")
}
[node name="VNSprite" type="Node2D"]
[node name="AnimationPlayer" type="AnimationPlayer" parent="."]
libraries = {
"": SubResource("AnimationLibrary_2gw37")
}
[node name="Sprite" type="Sprite2D" parent="."]
position = Vector2(400, 300)
texture = ExtResource("1_rldh6")

View file

@ -0,0 +1,20 @@
$title Content warning
: This visual novel is a game about death, fishing, and vore. It contains purely fictional content deemed inappropriate for minors.
: It also deals with heavy subject matters like depression, abuse, and suicide, which may be unsuitable for some audiences.
: If you continue, you acknowledge that you're an adult, and accept responsibility for your actions.
$prompt
$option cw_end Take me out of here!
$option cw_accept I accept.
$label cw_end
$quit
$label cw_accept
$escape store_global answer $autostop_music
$set autostop_music 1
$stop_music
: Use the Spacebar/[img=center]res://images/ui/tile_controller_ps_cross.png[/img]/[img=center]res://images/ui/tile_controller_xbox_a.png[/img] to advance text.
: Use L/Esc/[img=center]res://images/ui/tile_controller_ps_square.png[/img]/[img=center]res://images/ui/tile_controller_xbox_x.png[/img], or click on the top left corner of the screen, to review the text log.
: Use Q/[img=center]res://images/ui/tile_controller_ps_triangle.png[/img]/[img=center]res://images/ui/tile_controller_xbox_y.png[/img], or the "Save" button inside of the text log, to quicksave your progress.
$collapse_textbox
$hide_textbox
$stop
$load 01_autopsy

View file

@ -0,0 +1,159 @@
$title Part 1: Autopsy
# Everything is dark
$start_music ambiance_cave
$wait 5
$show_textbox
$expand_textbox
: ...
$wait 0.5
: ......
$wait 0.5
: .........
$wait 0.5
: [color=#b2b7d2](...It feels cold. Why do I feel a draft?)[/color]
???: Excuse me!
$overlay_color #fff 0.0
$overlay_color #ffffff00 0.5
: ...?!
[color=#b2b7d2](Is someone else here?)[/color]
???: Can you hear me?
: ...Y-Yes, I can hear you.
???: Ah, that's good! And can you see me, too?
: Not really.
$stop_music 3
???: Well, focus on my voice and look at me.
: That's a weird way to call someone's attention.
???: Never mind that! Just give it a try.
$overlay_color #000 0.0
$set_background first_shot
: A-Alright, here goes...
$hide_textbox
$overlay_color #fff 1.0
$wait 0.5
$overlay_color #00000000 1.0
$wait 0.3
# Marco leaning down
: ...! GAH!
???: Hey! I assume that random grunt means you can see me, right?
: Yeah! And who are YOU? You're huge!
Marco: I'm Marco. Pleased to meet you!
: Marco, huh. And what is it with the creepy mask?
Marco: Oh, it's just something I like wearing. I didn't mean to scare you or anything!
: ...
Marco: ...
Marco: ...What, aren't you going to ask "and what is it with the creepy trench coat"? Or my leg cuffs?
: Wh-What? No, the trench coat looks fine on you.
# Marco coy or embarrassed
$set_background cave_wall_2
$set_sprite marco marco_mask/playful_speak
Marco: Hehe, I'll take that as a compliment.
: Okay, enough with the jokes. What is going on right now?! Where am I?
$set_sprite marco marco_mask/curious_speak
Marco: Alright, I'll be blunt. The short version of it is that...
$set_sprite marco marco_mask/reflect
$start_music aboard_the_akhirah
Marco: ...You are [color=#00ffff]dead[/color].
: ...
: ...You're kidding me.
$set_sprite marco marco_mask/confused_speak
Marco: Not at all! You're pretty dead.
$set_sprite marco marco_mask/confused
: Then how come I am speaking with you right now?
$set_sprite marco marco_mask/explain
Marco: That's simple! You're just a [color=#00ffff]soul[/color] now.
: A [color=#00ffff]soul[/color]...?
Marco: Yeah! And it's my duty to take you to the [color=#ff00ff]Hereafter[/color]
: Wait wait wait, slow down. What do you mean I'm a [color=#00ffff]soul[/color]? Th-That's not a real thing...!
Marco: It definitely is! I'm talking to one right now.
Marco: When a mortal's body expires, they leave a [color=#00ffff]soul[/color] behind. That's where I come in!
: When you say their "body expires", you really mean, when they die. L-Like I have...
$set_sprite marco marco_mask/confused_speak
Marco: Yes, that's what I said just now! You're dead!
$set_sprite marco marco_mask/confused
: But then... who are you?
$set_sprite marco marco_mask/confused_speak
Marco: I told you. I'm Marco.
$set_sprite marco marco_mask/confused
: I got that. What I mean is, how can you even talk to me if I'm dead?
$set_sprite marco marco_mask/confused_speak
Marco: Because it's my job to take new souls to the [color=#ff00ff]Hereafter[/color].
$set_sprite marco marco_mask/confused
: Take me? But how?
$set_sprite marco marco_mask/explain
Marco: By boat, of course.
: Uh huh. Sure. And where is this boat?
Marco: We're already on her! Take a look around.
# Reveals the cave and river
$remove_sprite marco
$set_background cave_wall
$hide_textbox
$wait 1.0
: Huh, I see. This is certainly a unique river...
# Reveals the side of Akhirah
$set_background akhirah_wings
: And what are those? Wings, on a boat?
Marco: Yes! My boat is called Akhirah, and with her, I will ferry you to the [color=#ff00ff]Hereafter[/color] in no time.
: Wait. So your job is to take [color=#00ffff]souls[/color] like me to the underworld?
Marco: The [color=#ff00ff]Hereafter[/color], but yes.
: Then, are you...Charon?
$set_background cave_wall_2
$set_sprite marco marco_mask/laugh bounce
Marco: Hahahaha!
Marco: No! Once again, I'm Marco...! Charon was a different [color=#ff00ff]soul ferrier[/color].
: A [color=#ff00ff]soul ferrier[/color]...? So there are more than one?
$set_sprite marco marco_mask/pensive_speak
Marco: Of course! I wouldn't be able to do it all by myself, you know.
$set_sprite marco marco_mask/pensive
$stop_music
: ...
$set_sprite marco marco_mask/pensive_speak
Marco: Is everything okay?
$set_sprite marco marco_mask/pensive
: Y-Yeah, no. Not really. I'm still processing all of this...
: ...Wait, how can I speak and see if I'm just a [color=#00ffff]soul[/color]?
$set_sprite marco marco_mask/pensive_speak
Marco: I don't really know. But it's certainly handy, being able to communicate with the souls I ferry around.
: S-So I'm just a [color=#00ffff]soul[/color], because I died...and you, Marco, are going to take me to this [color=#ff00ff]Hereafter[/color] on your boat...?
$set_sprite marco marco_mask/confused
Marco: ...
$set_sprite marco marco_mask/confused_speak
Marco: ...Aren't you curious?
$set_sprite marco marco_mask/confused
: Curious? About what?
$set_sprite marco marco_mask/confused_speak
Marco: About how you look, right now. What [color=#00ffff]your soul[/color] looks like.
$set_sprite marco marco_mask/confused
: I mean, I guess. All I can tell is that you're huge, so I must be s-small.
$set_sprite marco marco_mask/curious_speak
Marco: Well, try to picture looking at yourself.
$set_sprite marco marco_mask/curious
: How do I even do that?
$set_sprite marco marco_mask/curious_speak
Marco: The same way you instinctively knew how to look at me and speak. Give it a try!
$reset_background
$clear_sprites
: Alright...
: [color=#b2b7d2](Maybe I'll try imagining looking into a mirror...)[/color]
: ...
$hide_textbox
# Bard sees themself for the first time
$overlay_color #000
$set_sprite bard bard/normal
$overlay_color #00000000 1.0
$overlay_color #fff 0.0
$set_sprite bard bard/normal bounce
$overlay_color #ffffff00 0.3
: ...!
: I-Is that blobby-looking thing...me?
Marco: Yep, that's you! From core to casing, you're a glowing, frail, tiny [color=#00ffff]soul[/color]. What do you think?
$start_music ambiance_river 5.0
: I still can't believe that I'm actually [color=#00ffff]a soul[/color]...
: ...I'm sorry, Marco. I-I think I need some time to collect my thoughts...
Marco: Of course, take as long as you need.
: ...
$hide_textbox
$overlay_color #00000000 0.0
$overlay_color #000 3.0
$wait 1.0
$clear_sprites
$load 02_limbo

View file

@ -0,0 +1,287 @@
$title Part 2: Limbo
# Pan to wide shot of Akhirah
$set_background wide_shot_full_speed
$wait 0.5
$overlay_color #00000000 2.5
$wait 0.5
Marco: By the way...
Marco: I forgot to ask you for your name.
: Why? Do you really need to know?
$set_sprite marco marco_mask/curious_speak bounce {"flip_h":true}
Marco: Well, it'd just make it easier to talk to you! You don't have to tell me, of course.
$set_sprite marco marco_mask/curious RESET {"flip_h":true}
$set_sprite bard bard/normal RESET {"flip_h":true}
: ...
Marco: ...
$set_sprite marco marco_mask/confused_speak RESET {"flip_h":true}
Marco: ...Still ruminating on your life?
$set_sprite marco marco_mask/confused RESET {"flip_h":true}
: Not really. I'm just thinking about how weird this whole situation is.
$set_sprite marco marco_mask/confused_speak RESET {"flip_h":true}
Marco: I guess it would be pretty jarring. It's nothing like how things used to be for you, after all.
: I dunno. There isn't anything about my life to reflect on.
$set_sprite marco marco_mask/pensive_speak RESET {"flip_h":true}
$stop_music
Marco: There isn't? What do you mean?
$set_sprite marco marco_mask/pensive RESET {"flip_h":true}
: ...
# Marco is worried
$set_sprite marco marco_mask/shocked bounce {"flip_h":true}
Marco: Wait, did you lose your memory or something?
: ...Yeah.
$set_sprite marco marco_mask/panic_speak RESET {"flip_h":true}
Marco: Oh no! You don't remember anything?!
$set_sprite marco marco_mask/panic RESET {"flip_h":true}
: ...
$set_sprite marco marco_mask/surprised RESET {"flip_h":true}
Marco: You poor thing...! That must mean you're even more confused than I thought!
$set_sprite bard bard/face_away RESET {"flip_h":true}
: D-Don't worry about it, really.
Marco: But your precious memories...! Don't you want a last chance to reflect on how your life was like?
: I don't want to trouble you. Just do your job of taking me to the [color=#ff00ff]Hereafter[/color], or whatever.
$set_sprite marco marco_mask/pensive_speak RESET {"flip_h":true}
Marco: Oh, it's no trouble at all. And besides, I'm curious now.
$set_sprite marco marco_mask/pensive RESET {"flip_h":true}
$set_sprite bard bard/normal RESET {"flip_h":true}
: Curious? About me?
$set_sprite marco marco_mask/pensive_speak RESET {"flip_h":true}
Marco: Yeah! I've ferried many, many [color=#00ffff]souls[/color] before. Too many that I lost count!
Marco: But none of them had amnesia! There must be something... different about you.
$set_sprite marco marco_mask/pensive RESET {"flip_h":true}
: I really doubt it. I'm not special or anything... I think.
$set_sprite marco marco_mask/explain RESET {"flip_h":true}
Marco: Who knows? I think it's important to try to jog your memory, somehow. And besides, maybe there's a reason why you can't remember anything.
$set_sprite bard bard/sweat bounce {"flip_h":true}
: A-Actually, I think I can remember some things.
$set_sprite marco marco_mask/playful_speak RESET {"flip_h":true}
Marco: Really?! That's amazing! Maybe you can remember your name, for example?
$set_sprite marco marco_mask/playful RESET {"flip_h":true}
$set_sprite bard bard/face_away RESET {"flip_h":true}
: ...
$set_sprite marco marco_mask/curious_speak RESET {"flip_h":true}
Marco: No? Well, what about
$start_music loose_thoughts
Bard: Bard. My name is Bard.
$set_sprite marco marco_mask/greet RESET {"flip_h":true}
Marco: Oh, Bard! That's a nice name.
# Bard blushes
$set_sprite bard bard/sweat RESET {"flip_h":true}
Bard: Th-Thanks. Well, I guess it WAS a nice name...
$set_sprite bard bard/normal RESET {"flip_h":true}
$set_sprite marco marco_mask/pensive_speak RESET {"flip_h":true}
Marco: You know, Bard, I did find it weird how you reacted to the news about you being dead.
$set_sprite marco marco_mask/pensive RESET {"flip_h":true}
Bard: Why? I don't think most people er, most [color=#00ffff]souls[/color] would react well to that information.
$set_sprite marco marco_mask/pensive_speak RESET {"flip_h":true}
Marco: Exactly! Most of them react how I expect. With grievance, denial, anger, longing, accomplishment...or a mix of all of them.
Marco: But there are a rare few, who simply remain quiet for the whole trip.
$set_sprite marco marco_mask/pensive RESET {"flip_h":true}
Bard: That's me, right?
$set_sprite marco marco_mask/neutral_speak RESET {"flip_h":true}
Marco: Yes, and no. All of them were reflecting on the lives that they lived. So far, you're the only [color=#00ffff]soul[/color] I've seen who didn't.
$set_sprite marco marco_mask/neutral RESET {"flip_h":true}
Bard: ...Of course. Because I lost my memory.
$set_sprite marco marco_mask/shocked RESET {"flip_h":true}
Marco: Just so! That's a first for me! If your thoughts were all over the place, that would be one thing. But to even forget your own name...
Bard: B-But I remember my name now. Thanks to you.
$set_sprite marco marco_mask/reflect RESET {"flip_h":true}
Marco: And that's even more intriguing, isn't it? That means that there must be a way to make you remember more! And I'd like to help you to find out.
Marco: Actually, I might have just the thing. What do you say?
$set_sprite bard bard/sweat RESET {"flip_h":true}
Bard: W-Well...
$text_new_line [color=#b2b7d2](Whatever I say, it doesn't seem like Marco wants to let this simply go...)[/color]
$prompt
$option 02_remember Go with Marco's plan
$option 02_change_subject Change the subject
$label 02_change_subject
$increment change_subject
$set_sprite bard bard/face_away RESET {"flip_h":true}
Bard: You know, I'm not sure I can really trust you.
# Marco is confused
$set_sprite marco marco_mask/curious_speak RESET {"flip_h":true}
Marco: Why not?
$set_sprite marco marco_mask/curious RESET {"flip_h":true}
Bard: Well, it's your...c-clothes.
$set_sprite marco marco_mask/confused_speak RESET {"flip_h":true}
Marco: My clothes...?
$set_sprite marco marco_mask/confused RESET {"flip_h":true}
$set_sprite bard bard/normal RESET {"flip_h":true}
Bard: Yeah. For starters, why do you wear that creepy mask with glowing red eyes?
# Marco is embarrassed
$set_sprite marco marco_mask/shy RESET {"flip_h":true}
Marco: I... Gee, it's kind of embarrassing...
Bard: Embarrassing?
Marco: I don't like how my face looks.
Bard: ...It can't be that bad.
$set_sprite marco marco_mask/hold_face RESET {"flip_h":true}
Marco: It's bad enough that I don't want it to be the last thing you see before you cross to the [color=#ff00ff]Hereafter[/color]!
Bard: Heh. I guess I don't need to care about my appearance, now that I look like this...
$set_sprite marco marco_mask/shy RESET {"flip_h":true}
Bard: At first, you did look a bit threatening, but you really aren't.
# Marco tries to recompose himself
Marco: H-Hmf! So that means you trust me now?
$set_sprite marco marco_mask/crossed_arms RESET {"flip_h":true}
Bard: It means I don't mistrust you.
Marco: What's the difference...? Anyway, I just want to help you remember! You won't have to tell me your memories, if you prefer.
$label 02_remember
$set_sprite bard bard/face_away RESET {"flip_h":true}
Bard: Alright, I suppose. I guess it couldn't hurt.
$set_sprite marco marco_mask/laugh bounce {"flip_h":true}
Marco: That's the spirit! Let me grab my net, and we can start [color=#ffff00]fishing[/color].
Bard: ...Huh? [color=#ffff00]Fishing[/color]...? How is that supposed to help me?
$set_sprite marco marco_mask/reflect RESET {"flip_h":true}
Marco: Things here work differently than in the mortal world. Normally, when you go fishing in a body of water, you find fish, right?
$set_sprite bard bard/normal RESET {"flip_h":true}
Bard: Of course. That's why it's called "fishing".
$set_sprite marco marco_mask/explain RESET {"flip_h":true}
Marco: But in the [color=#00ffff]soul plane[/color], things are different. The rivers that we [color=#ff00ff]soul ferriers[/color] traverse may look like yours, but they are not the same.
Bard: ...The eerie pink glow gave that away.
Marco: Instead of a water stream, this river is an ethereal vein of the soul world. Everyone must traverse one of these many veins in order to reach the [color=#ff00ff]Hereafter[/color].
$set_sprite marco marco_mask/neutral_speak RESET {"flip_h":true}
Marco: And I'm the one in charge of ferrying souls in this vein, which is called the [color=#ff00ff]Carnal River[/color].
$set_sprite marco marco_mask/neutral RESET {"flip_h":true}
Bard: Is that so... Then why is it called "carnal"?
$set_sprite marco marco_mask/curious_speak RESET {"flip_h":true}
Marco: Because it's filled with material thoughts. Reveries... Wishes... Repressed desires... And even long-lost memories.
Marco: They all interweave themselves in the collective unconscious that feeds this vein... but they are usually too individualized to make out.
$set_sprite marco marco_mask/reflect RESET {"flip_h":true}
Marco: But sometimes, a strong emotion from living people and their souls can cause some objects to surface spontaneously.
Bard: So what you're saying is... Sometimes, random objects appear in this river?
$set_sprite marco marco_mask/greet RESET {"flip_h":true}
Marco: Indeed! Loose fragments from people's combined imaginations, which arise and take a defined shape for a brief moment.
$set_sprite marco marco_mask/confused_speak RESET {"flip_h":true}
Marco: I figured that we could try [color=#ffff00]fishing something out[/color], and see if whatever we catch helps you remember anything about your life...!
$set_sprite marco marco_mask/confused RESET {"flip_h":true}
$stop_music
Bard: Hmm, I'll admit that this sounds incredible... But I doubt I can fish without limbs.
$set_sprite marco marco_mask/playful_speak RESET {"flip_h":true}
Marco: Don't worry, Bard. I can be your limbs! I'll teach you how it works, and throw the net for you. It will be fun, I promise!
$set_sprite marco marco_mask/playful RESET {"flip_h":true}
Bard: Alright. I hope that it's as exciting as you make it out to be.
$set_sprite marco marco_mask/playful_speak bounce {"flip_h":true}
Marco: Great! Let me stop Akhirah first, it will be easier to fish once it's stopped.
$clear_sprites
$hide_textbox
# Akhirah's wings close, and Marco walks to the back of the boat.
$set_background wide_shot_boat_stops
$wait 0.7
$overlay_color #000 2.0
# Tutorial start
$clear_sprites
$set_background fishing_tutorial_start
$overlay_color #00000000 1.0
$start_music under_the_surface
Marco: First of all, take a look at the area immediately behind Akhirah.
$hide_textbox
$wait 1.0
Bard: Akhirah... That's the name of your ferryboat, isn't it?
Marco: Exactly! Now, do you notice anything off in the river?
Bard: Of course. There's a spot that's brighter than the rest.
$set_background fishing_tutorial_target
$hide_textbox
$wait 1.0
Marco: Yes... That's one of those surfaced emotions from the collective unconscious I mentioned. Well, a materialized version of that emotion, to be precise.
Bard: But how can we get it?
Marco: Well, I can't just reach my hand into the water and grab it, that would be too dangerous.
Bard: D-Dangerous...?
$set_background fishing_tutorial_start
Marco: Don't worry about it... Anyway, this is what this specialized [color=#ffff00]fishing net[/color] is for. Whenever it's thrown overboard, it will return to Akhirah soon afterwards.
$set_background fishing_tutorial_net
$hide_textbox
$wait 1.0
Bard: I see... So if it catches something from the river, the net will bring it to you.
Marco: Exactly!
Bard: And how do I tell you where to throw the net?
$set_background fishing_tutorial_start
Marco: Simply click and hold the net, then drag it to the desired location.
Marco: Or if you're using a keyboard/controller, press and hold Spacebar/[img=center]res://images/ui/tile_controller_ps_cross.png[/img]/[img=center]res://images/ui/tile_controller_xbox_a.png[/img], then use the directional keys or joystick to move it.
$set_background fishing_tutorial_grabbed
$hide_textbox
$wait 1.0
Bard: And then I let go of the mouse button, or whatever "[img=center]res://images/ui/tile_controller_ps_cross.png[/img]" means, to make you release the net?
Marco: Exactly! But keep an eye on the [color=#ffff00]shadow[/color] of the net. That's where it will fall, and you want your target to be right at the center.
Bard: And what if you miss?
$set_background fishing_tutorial_net
$hide_textbox
$wait 0.5
Marco: The net will return to Akhirah, so we can try again.
Bard: Alright, then. So I tell you to grab the net, move it to where I want dropped, and have you release it.
Marco: Yes, that's all there is to it!
$stop_music
$hide_textbox
$overlay_color #000 0.5
$set_background before_marco_almost_falls
$wait 0.3
$overlay_color #00000000 0.5
$wait 1.0
# Back to wide shot
$set_sprite bard bard/normal bounce
Bard: There's just one thing I don't understand.
$set_sprite marco marco_mask/confused_speak
Marco: What is it?
$set_sprite marco marco_mask/confused
Bard: Why is this Carnal River dangerous?
$set_sprite marco marco_mask/explain
Marco: Well, I told you how it's made up of the many unconscious thoughts from the minds of living beings, right?
Bard: I guess...if what you said is true.
$set_sprite marco marco_mask/greet
Marco: And it is! But that train of thought can be quite unpredictable, and as soon as that person gets distracted by something else...poof! It's gone forever.
$set_sprite marco marco_mask/curious
Bard: Hmm. So if that thought is gone, so is the materialized object.
$set_sprite marco marco_mask/curious_speak
Marco: That's right. So for example, if I were to fall into the Carnal River, then I'd immediately vanish forever, since no living mortals know me.
$set_sprite marco marco_mask/curious
Bard: You...what?! That's insane!
$set_sprite marco marco_mask/laugh
Marco: It's alright. I take all the precautions so that I don't have any accidents!
# Marco sits on the railing and almost falls back, he recovers and clutches his chest
$clear_sprites
$hide_textbox
$wait 0.5
$set_background marco_almost_falls
$wait 4.5
$set_sprite marco marco_mask/clutch_chest
Marco: ...That was a close call.
$set_sprite bard bard/sweat bounce
Bard: M-MARCO!!! D-Don't scare me like that!
Marco: I'm sorry, I didn't mean to!
Bard: Sheesh... What would I even do if you suddenly disappeared?!
# Marco blushes
$set_sprite marco marco_mask/shy
Marco: Aw, does that mean you'd miss me?
Bard: Yeah... How would I throw the fishing net without you?
# Marco is dejected
$set_sprite marco marco_mask/crossed_arms
Marco: Oh... W-Well, that's true. Plus, I still need to ferry you to the [color=#ff00ff]Hereafter[/color] and all that...
$set_sprite marco marco_mask/neutral
Marco: But don't worry, Bard. I'll be careful that nothing bad happens to
$set_sprite marco marco_mask/look_ahead_speak
Marco: ...Oh, look! There's something in the water.
$set_sprite marco marco_mask/look_ahead
Bard: Is that a fish...?
$set_sprite marco marco_mask/look_ahead_speak
Marco: I don't know. Let's try catching it!
$start_music under_the_surface
$overlay_color #000 1.0
$hide_textbox
$clear_sprites
$reset_background
$wait 0.3
$overlay_color #00000000 0.0
# Fishing 1
$escape fishing fishing_01_end 0.0 false {"name":"fishing_01_butt_plug","sprite":"butt_plug"}
$label fishing_01_butt_plug
$set_sprite fishing_item fishing_objects/butt_plug reveal_fishing_item
$expand_textbox
$wait 1.0
: You found: a butt plug!
$text_new_line An adult toy used for anal pleasure. It is, in fact, not a fish.
$remove_sprite fishing_item
$hide_textbox
$escape return_to_fishing
$label fishing_01_end
$overlay_color #000 0.0
$stop_music
$wait 2.0
$load 03_memento_mori

View file

@ -0,0 +1,208 @@
$title Part 3: Memento Mori
$overlay_color #000 0.0
$reset_background
$wait 1.0
$sound_effect net_picked_up
$wait 0.5
Marco: Good job, Bard! You did it!
Bard: ...
Marco: And did you see how I kept my arms steady when I released the net? It's all in the technique.
Bard: ...
Marco: There was this fisherman's soul who taught me the ropes. Shame that he crossed over to the [color=#ff00ff]Hereafter[/color] way before I managed to get good at it...
# Bard is embarrassed
$overlay_color #00000000 0.0
$set_sprite bard bard/sweat bounce
$start_music aboard_the_akhirah
Bard: A BUTT PLUG?!
# Marco is confused
$set_background post_fishing
$remove_sprite bard
$hide_textbox
$wait 1.5
Marco: I mean, yeah. Sex toys are pretty common representations of people's fantasies and repressed emotions.
Marco: Didn't you also think about this sort of stuff every now and then?
Bard: No! I-I mean, I don't know...!
Marco: Hmm... So it hasn't jogged your memory, huh? Maybe you're averse to sex? Not that there's anything wrong with it if you are...
Bard: I'm not I wasn't averse to sex. It's just...complicated.
Bard: ...I do remember feeling awkward talking about it with anyone. In fact, there wasn't any talking. J-Just me and my thoughts, inside of my head...
Bard: But I don't think I could ever talk about it out loud. So I always got jealous of people who talked about it like it wasn't a big deal.
$set_background akhirah_platform
$set_sprite marco marco_mask/curious_speak RESET {"flip_h":true}
$set_sprite bard bard/normal RESET {"flip_h":true}
Marco: Like I'm doing right now?
$set_sprite marco marco_mask/curious
$set_sprite bard bard/face_away RESET {"flip_h":true}
Bard: ......Y-Yeah.
$set_sprite marco marco_mask/laugh RESET {"flip_h":true}
$set_sprite bard bard/normal RESET {"flip_h":true}
Marco: That's alright, Bard. My boat is a "no judgement" zone. If you ever feel like getting something out of your metaphysical chest, I can lend you two very large ears!
Bard: ...
$set_sprite marco marco_mask/greet RESET {"flip_h":true}
Marco: ...Or not! But I'll tell you what. I've heard so many posthumous confessions by now. I don't think there's anything left that can faze me.
Bard: [color=#b2b7d2](Hmph... Marco sure seems quite pushy about getting me to talk more about myself.)[/color]
Bard: [color=#b2b7d2](I dunno if I should be this trusting. But on the other hand, I don't know if there's any point in keeping secrets, if I'm already d)[/color]
$stop_music
$set_sprite bard bard/face_away RESET {"flip_h":true}
Bard: ...
$set_sprite marco marco_mask/neutral_speak RESET {"flip_h":true}
Marco: ...Did you remember something else?
$set_sprite marco marco_mask/neutral RESET {"flip_h":true}
Bard: Huh? Ah, sorry, don't worry about me. It was just dawning on me again that I'm dead. That there isn't any going back to the way things were.
$set_sprite marco marco_mask/neutral_speak RESET {"flip_h":true}
Marco: Hmm... It's pretty normal to be shocked. Even when you know the inevitability of death.
$set_sprite marco marco_mask/neutral RESET {"flip_h":true}
$set_sprite bard bard/normal RESET {"flip_h":true}
Bard: You know, Marco...
Bard: When I was alive, sometimes I wondered what really happened after death...or if anything happened at all.
$set_sprite marco marco_mask/playful_speak RESET {"flip_h":true}
Marco: Oh. Does that mean you got some memories back?
$set_sprite marco marco_mask/playful RESET {"flip_h":true}
$start_music loose_thoughts
Bard: Actually...yeah.
# Fork 1
$prompt
$option 03_f1_route_a Remember parent's words
$option 03_f1_route_b Remember friend's words
$option 03_f1_route_c Remember guru's words
$label 03_f1_route_a
$increment route_a
$set_sprite marco marco_mask/crossed_arms RESET {"flip_h":true}
Bard: It's not much, just something that one of my parents used to say. They were pretty religious.
$overlay_color #000 0.3
$clear_sprites
$set_background cave_wall
$overlay_color #00000000 0.3
Bard: I remember them talking about souls going to heaven or hell, depending on how good or sinful they were.
Marco: Ah, I see. Heaven and hell... You said that you heard it from your parent?
Bard: I-I might've heard it from other people, too, but I definitely remember it from them, yeah.
Bard: My other parent was always at work instead of home, so I spent a lot of my time at home with this one.
Bard: To be fair, my parent didn't talk much about religion...
Bard: But every now and then, they'd talk about how a terrible person on the news would go to hell "when their time came".
Marco: I see. And what about you? Do you remember if you were religious?
$set_sprite bard bard/normal
Bard: No, I didn't believe in that stuff. And I never prayed, either. My parent did, but they never really pushed me to believe in it too.
Bard: I know that not everyone has the privilege to choose what to believe in or not. So I guess I was lucky in that sense...
$goto 03_f1_end
$label 03_f1_route_b
$increment route_b
$set_sprite marco marco_mask/crossed_arms RESET {"flip_h":true}
Bard: There was this friend of mine... Gosh, I can almost hear their voice going on and on about it!
$overlay_color #000 0.3
$clear_sprites
$set_background cave_wall
$overlay_color #00000000 0.3
Bard: They were quite a fan of ghost stuff. Every time that we met, they'd keep talking about some new thing about parapsychology...
Marco: Parapsychology...?
Bard: Yeah. In a nutshell, it's when you believe that when someone dies, their soul lingers in the place where they died.
Bard: And if that ghost had a happy death, it brings good fortune. But if they had a terrible death, they keep haunting the place that they died in.
Marco: Oh... I think I know what you mean.
Bard: I spent a lot of time with them when I wasn't at home, so they'd always be telling about all the evidence that this stuff was real. But to me, it just sounded fake.
Bard: Still, I kept hanging out with them because...
$set_sprite bard bard/blush
Bard: Uhh... Th-This is kind of embarrassing to admit.
$set_sprite marco marco_mask/shocked
Marco: Don't worry, Bard. I promise I won't laugh.
Bard: ...I had a pretty big crush on them. W-We used to be childhood friends, and I kinda secretly fell in love with them.
$set_sprite marco marco_mask/surprised bounce
Marco: Aww, that's sweet! Did you two end up dating each other?
$set_sprite bard bard/face_away
Bard: ...No. We simply stayed friends.
$set_sprite marco marco_mask/crossed_arms
Marco: Oh. I'm sorry to hear.
$set_sprite bard bard/normal
Bard: It's okay. That's way in the past now. I still enjoyed chatting with them about paranormal stuff, even just as friends.
$goto 03_f1_end
$label 03_f1_route_c
$increment route_c
$set_sprite marco marco_mask/crossed_arms RESET {"flip_h":true}
Bard: Hmm... Have you ever heard of "reincarnation", Marco?
$set_sprite marco marco_mask/explain RESET {"flip_h":true}
Marco: That's the belief that, when you die, your soul will return into a new body, no?
$overlay_color #000 0.3
$clear_sprites
$set_background cave_wall
$overlay_color #00000000 0.3
Bard: Pretty much. My guru used to say that you could reincarnate into a different species after you died. Even into a snail!
Marco: Your guru...?
Bard: Oh, yeah. They're someone I used to talk to in private after I became an adult. My parents set us up together, and I paid for weekly sessions.
Bard: I guess "counselor" is the better word, but they insisted on being called guru.
Marco: A counselor... Like a, um, what do you call it... A therapist?
Bard: Hmm... I don't think they were medically qualified or anything.
Bard: But they'd listen to me, and then offer some life advice.
$set_sprite bard bard/face_away
Bard: It's funny, they were pretty carefree and all that. But they were pretty good at giving advices!
$set_sprite bard bard/normal
Bard: I'd be so lost without their help at the start. Still, there were days where they'd just keep rambling on and on about reincarnation and astral planes and all that...
$label 03_f1_end
$clear_sprites
$overlay_color #00000000 0.0
Bard: But I guess none of it matters. Once you take me to the [color=#ff00ff]Hereafter[/color], I'll find out whether they were right or wrong about it.
$stop_music
$hide_textbox
$overlay_color #000 2.0
$set_background marco_sit
$wait 0.5
# Marco is pensive
$overlay_color #00000000 2.0
$wait 3.0
$set_sprite marco marco_mask/pensive
Marco: ...
$wait 1.0
# Marco is happy
$set_sprite marco marco_mask/playful_speak
Marco: I'm happy that you got more memories back, Bard.
$set_sprite marco marco_mask/playful
$set_sprite bard bard/normal
Bard: Th-Thanks... But that memory wasn't important or anything.
$set_sprite marco marco_mask/crossed_arms
Marco: It wasn't? It sounded like they were very important in your life...
Bard: N-No, I mean, it wasn't anything big. Like winning a championship, or going to Mars.
$set_sprite marco marco_mask/curious_speak
Marco: Sure, but it still must hold some significance. Otherwise you wouldn't have remembered it!
$set_sprite marco marco_mask/curious
$set_sprite bard bard/face_away
Bard: M-Maybe...
$set_sprite marco marco_mask/greet
Marco: Would you like to try [color=#ffff00]fishing[/color] some more, Bard? I think I spotted something else under the surface of the river.
$set_sprite marco marco_mask/neutral
$set_sprite bard bard/normal
Bard: Oh? Sure. Hopefully this one is more of a challenge to catch.
$set_sprite bard bard/face_away
Bard: ...W-Wait. Where did that... uh, "thing" we fished go?
$set_sprite marco marco_mask/explain
Marco: Ah, it must have dissipated on its own. I imagine that whichever thought it originated from must have wandered to a different fixation.
$set_sprite marco marco_mask/pensive_speak
Marco: The manifestations that originate from the Carnal River are ephemeral. Despite their looks, they aren't real objects.
$set_sprite marco marco_mask/pensive
$set_sprite bard bard/normal
Bard: By the way, Marco. Why do you use a [color=#ffff00]fishing net[/color] to fish? Wouldn't it make more sense to use a typical fishing rod...?
$set_sprite marco marco_mask/laugh
$set_sprite bard bard/sweat bounce
Marco: Haha, of course not! How would a butt plug bite a fishing hook?
$start_music under_the_surface
Bard: [color=#b2b7d2](...I really hope this next thing doesn't just turn out to be another sex toy.)[/color]
$overlay_color #00000000 0.0
$hide_textbox
$overlay_color #000 1.0
$clear_sprites
$reset_background
$wait 0.5
$overlay_color #00000000 0.0
# Fishing 2
$escape fishing fishing_02_end 0.25 false {"name":"fishing_02_vore_drawing","sprite":"vore_drawing"}
$label fishing_02_vore_drawing
$set_sprite fishing_item fishing_objects/vore_drawing reveal_fishing_item
$expand_textbox
$wait 1.0
: You found: a vore drawing!
$text_new_line It depicts a dragon swallowing a maned wolf. The artwork is incredibly detailed.
$hide_textbox
$overlay_color #000 1.0
$escape return_to_fishing
$label fishing_02_end
$stop_music
$wait 2.0
$load 04_psyche

View file

@ -0,0 +1,289 @@
$title Part 4: Psyche
$set_background cave_wall_2
$wait 1.0
$overlay_color #00000000 1.0
$wait 3.0
# Bard is embarrassed, Marco is confused
$set_sprite bard bard/blush bounce
Bard: H-Hang on, this is...!
$set_sprite marco marco_mask/reflect
Marco: ...A piece of paper? Looks like there is something drawn on it. Let me take a closer look...
$clear_sprites
$sound_effect paper_handling
$wait 1.0
Bard: ...
$wait 1.0
Marco: ...
$wait 1.0
$set_sprite marco marco_mask/show_drawing
Marco: ...
$wait 1.0
$start_music aboard_the_akhirah
Marco: ...I don't get it. Did someone have a nightmare and decided to draw it?
$set_sprite bard bard/sweat
Bard: A n-nightmare? Why do you say that...?
# Marco shows the drawing directly to the screen
Marco: Well, look. The poor maned wolf seems so scared, squirming helplessly while he's gobbled up by the large, hungry dragon.
$set_sprite bard bard/blush
Bard: ...
Marco: Bard? Are you okay? Did I scare you with this?
Bard: ...It's not meant to be scary. J-Just trust me on this, Marco.
Marco: Huh? If it's not, then what? ...Did you remember something?
Bard: [color=#b2b7d2](Ugh. I-I can't believe I have to say this out loud...)[/color]
$set_sprite bard bard/normal
Bard: H-How do I put this? It's, uh, a vore drawing. Y-You can tell by how detailed the maw is.
$set_sprite marco marco_mask/pensive_speak
Marco: A...vore drawing?
$set_sprite marco marco_mask/pensive
Bard: Yeah. Wh-Whoever drew this very much enjoys the scenario...
$set_sprite marco marco_mask/show_drawing
Marco: Huh... I mean, I can tell it's well-made, but I'm not sure I get it. I just feel bad for the poor fellow being eaten alive...
Marco: What about you? Do you enjoy this "vore"?
$set_sprite bard bard/blush bounce
Bard: U-Uhh...!
$prompt
$option 04_admit Admit it
$option 04_change_subject Change the subject
$label 04_change_subject
$increment change_subject
$if change_subject >= 2 04_roll_0_for_deception
$set_sprite bard bard/face_away
$set_sprite marco marco_mask/pensive
Bard: U-Um... M-Maybe we should try fishing something else. Something more a-alluring than some scrapped paper.
$set_sprite marco marco_mask/show_drawing
Marco: Scrapped paper? I mean, it's a bit soggy from the river's ethereal goop, but it wouldn't have manifested if it didn't mean something to someone out there.
$set_sprite marco marco_mask/shocked
Marco: ...Are you trying to hide something?
$goto 04_you_made_marco_sad
$label 04_roll_0_for_deception
$set_sprite bard bard/face_away
Bard: Wh-Why should I trust you...? Your clothes give a very suspicious vibe, a-and
# Marco is confused
$set_sprite marco marco_mask/confused
Marco: What? ...You already used that excuse before.
$label 04_you_made_marco_sad
$set_sprite bard bard/sweat bounce
Bard: U-Urk!
# Marco seems kind of dejected
$set_sprite marco marco_mask/sad
Marco: If you don't wanna tell me, that's okay. I won't force you to speak.
$set_sprite marco marco_mask/crossed_arms
Marco: But I would prefer it if you told me so, instead of making up excuses...
Bard: [color=#b2b7d2](Oh no... I think that made Marco sad.)[/color]
Bard: [color=#b2b7d2](...You know what? Screw it. For once, I want to tell the truth about how I feel!
$text_new_line ...Even though it makes me wanna throw up.)[/color]
$label 04_admit
$set_sprite bard bard/normal
Bard: ...
$set_sprite bard bard/blush
Bard: ......
Bard: .............................ffffine.
# Marco is genuinely curious
$set_sprite marco marco_mask/pensive
Marco: Hm?
$set_sprite bard bard/face_away
Bard: I admit it... I-I like vore.
Marco: ...
$set_sprite marco marco_mask/pensive_speak
Marco: ...Okay.
$set_sprite bard bard/sweat bounce
$set_sprite marco marco_mask/pensive
Bard: What?! I thought you were gonna say something more than "okay"...!
$stop_music
$if change_subject > 0 04_you_are_not_a_good_bean
$set_sprite marco marco_mask/pensive_speak
Marco: Bard, I can tell that you're being as honest with me as you can, and I really appreciate that in you...
$set_sprite marco marco_mask/explain
Marco: ...So that's why I don't want to press you on it. I'd feel guilty if I accidentally ticked you off...
$goto 04_awkward_silence
$label 04_you_are_not_a_good_bean
$set_sprite marco marco_mask/explain
Marco: I mean, I WAS going to ask you more about it...but it doesn't seem like you want to talk about it. So I won't.
$label 04_awkward_silence
$set_sprite marco marco_mask/crossed_arms
$set_sprite bard bard/normal
Bard: Ah... W-Well, I didn't expect you to be that considerate. Now I feel bad...
# Both of them seem apprehensive
Bard: ...
Marco: ...
$set_sprite bard bard/face_away
Bard: ...P-Please, just ask it. The silence is even worse.
$set_sprite marco marco_mask/shocked
Marco: Oh! Are you sure, Bard? I don't want to strike a nerve or anything.
Bard: I-I'm sure.
$text_new_line [color=#b2b7d2](...that I don't envy myself right now.)[/color]
$set_sprite marco marco_mask/curious_speak
$start_music afloat
Marco: Have you ever done a "vore" before?
$set_sprite marco marco_mask/curious
$set_sprite bard bard/blush
Bard: U-Uhh, no. Of course not.
...I mean, I'd definitely remember that.
$set_sprite marco marco_mask/curious_speak
Marco: Hmm... Then how can you like it without even trying?
$set_sprite marco marco_mask/curious
Bard: Well, I just do... G-Gosh, it's so awkward to say this out loud.
$set_sprite bard bard/face_away
Bard: What I mean is, I think it would be cozy.
$set_sprite marco marco_mask/surprised
Marco: Cozy? ...That drawing certainly doesn't give me that vibe.
$set_sprite bard bard/normal
Bard: I guess vore can mean different things for different people...
Bard: But to me, I like to imagine that I'm small. Th-Then, someone large and caring takes me in their maw, and...gently swallows me for safekeeping in their stomach.
$set_sprite bard bard/blush
Bard: So I guess it's more about being very intimate with s-someone special... at least, for me.
# Marco is pensive
$set_sprite marco marco_mask/pensive
Marco: ...
$set_sprite bard bard/sweat
Bard: ...Wh-What?
$set_sprite marco marco_mask/pensive_speak
Marco: You know, Bard.
Marco: I've ferried many, many souls. And I've never heard any mention of vore from any of them.
Bard: Oh.
# Marco smiles
$set_sprite marco marco_mask/laugh
Marco: So I guess that makes you special!
$set_sprite bard bard/normal
Bard: ...
Bard: ...What.
Marco: Yeah! I mean, it's not going to Mars or anything, but I think that's very unique!
$set_sprite bard bard/blush
Bard: B-But it's just a silly fetish! That certainly doesn't make me special...!
Marco: Well, anything that makes you YOU is special, right?
$set_sprite bard bard/sweat bounce
Bard: If I WERE special... But I'm definitely not!
Marco: I'd argue you definitely are! Not everyone can make something like vore sound so nice and comfy! It even makes me want to try it!
$stop_music
Bard: R-Really, it's not a special memory or ...Wh-What do you mean, try it?
# Marco has a hungry look and Bard is flustered
$remove_sprite bard
$set_sprite marco marco_mask/neutral
Marco: ...
$wait 0.5
$set_sprite marco marco_mask/neutral_speak
Marco: What I mean is...
$set_sprite marco marco_mask/neutral
$wait 0.5
$set_sprite marco marco_mask/hungry
Marco: You look so small...and I'm so big...
$wait 0.5
Bard: M-Marco...! Wh-What are y-you?!
$wait 0.5
# Marco opens his maw towards the camera
$set_sprite marco marco_mask/show_maw
Marco: ...Wouldn't you like to get inside...?
Bard: M-MARCO...!!!
$wait 0.5
# Marco acts coy
$set_sprite marco marco_mask/shy
Marco: A-Ah... I'm sorry, Bard! I didn't mean to make you panic...! I just wanted to see if that would make you happy.
$set_sprite bard bard/unwell
Bard: I-I'm getting dizzy...
$set_sprite marco marco_mask/curious_speak
Marco: Oh, wow. I didn't expect it to give you that much of a reaction...
$set_sprite marco marco_mask/curious
Bard: N-No... I actually feel sick...
$set_sprite marco marco_mask/panic_speak bounce
Marco: Oh no! Is everything okay?!
$set_sprite marco marco_mask/panic
$set_sprite bard bard/unwell fall_down
Bard: ...Ughh, m-my head...
$overlay_color #fff 0.0
$overlay_color #000 1.0
$sound_effect wood_thud
$clear_sprites
Marco: Bard...?!
$wait 0.5
Bard: ...
$set_background marco_kneel_front
$wait 1.0
$overlay_color #00000000 1.0
Marco: ...
$wait 1.0
Bard: ...I-I'm better now.
Marco: Are you sure...?
$set_sprite bard bard/normal
Bard: Yeah... I'm sure. Don't worry about me.
$set_sprite marco marco_mask/clutch_chest
Marco: Phew. I'm glad. I was really worried that you'd... Just tell me if you feel unwell again, Bard.
Bard: Is something wrong?
$set_sprite marco marco_mask/crossed_arms
Marco: No, no. Nothing wrong. You look alright to me. But I should order Akhirah to take us to the [color=#ff00ff]Hereafter[/color] quickly.
$set_sprite bard bard/face_away
Bard: ...Actually, Marco.
$set_sprite marco marco_mask/neutral
Marco: Hm?
$set_sprite bard bard/sweat
Bard: D-Do you mind if we [color=#ffff00]fish[/color] some more...? I think I saw something else under the surface.
$set_sprite marco marco_mask/greet
Marco: O-Of course! We can fish some more. Let me grab my net first...
$overlay_color #000 0.5
$reset_background
$clear_sprites
Bard: [color=#b2b7d2](I-I don't know what happened. But I should trust Marco's knowledge as a [/color][color=#ff00ff]soul ferrier[/color][color=#b2b7d2], and put that aside...)[/color]
$overlay_color #00000000 0.0
$start_music under_the_surface
$collapse_textbox
$hide_textbox
$set_background akhirah_back_stopped
# Fishing 3
$escape fishing fishing_03_end 0.50 false {"name":"fishing_03_gold_case","sprite":"gold_case"} {"name":"fishing_03_grimoire","sprite":"grimoire"}
$label fishing_03_gold_case
$set_sprite fishing_item fishing_objects/gold_case reveal_fishing_item
$expand_textbox
$wait 1.0
: You found: a gold-filled briefcase!
$text_new_line A rather tacky representation of wealth. The real thing would be too heavy for someone to carry.
$set_sprite bard bard/normal bounce
Bard: Wow! This suitcase is chockfull of gold! I don't think I've ever seen so much of it at once before.
$set_sprite marco marco_mask/curious_speak
Marco: Actually, that's a briefcase.
$set_sprite marco marco_mask/curious
Bard: Huh...? What's the difference?
$set_sprite marco marco_mask/explain
Marco: A suitcase is normally larger, and supposed to carry clothes. On the other hand, a briefcase normally holds documents and small objects.
$set_sprite marco marco_mask/pensive
Bard: I don't really get it. And several bars of gold don't really qualify as "small".
$set_sprite marco marco_mask/pensive_speak
Marco: But
$set_sprite marco marco_mask/confused
Marco: ...
$set_sprite marco marco_mask/confused_speak
Marco: ...I guess the distinction doesn't really matter.
$hide_textbox
$clear_sprites
$escape return_to_fishing
$label fishing_03_grimoire
$set_sprite fishing_item fishing_objects/grimoire reveal_fishing_item
$expand_textbox
$wait 1.0
: You found: a magical grimoire!
$text_new_line A thick, menacing book, filled with magical spells and large illustrations for padding.
$set_sprite bard bard/normal
Bard: For a second there, I thought the eye on the cover was actually following me.
$set_sprite fishing_item fishing_objects/grimoire_left
Bard: ...
$set_sprite bard bard/sweat bounce
Bard: A-Ah! It IS actually following me...!
$set_sprite fishing_item fishing_objects/grimoire_right
$set_sprite marco marco_mask/confused_speak
Marco: It's supposed to be a magical object, right? Maybe that's part of its charm, in the mind of whoever conjured it.
$set_sprite marco marco_mask/confused
$set_sprite fishing_item fishing_objects/grimoire_left
Bard: I don't think it's charming at all. It's kinda creepy...
$set_sprite fishing_item fishing_objects/grimoire_right
$set_sprite marco marco_mask/neutral_speak
Marco: Don't worry, Bard! Unconscious manifestations from the Carnal River can't really hurt you...
$set_sprite marco marco_mask/confused_speak
Marco: ...I think.
$hide_textbox
$clear_sprites
$escape return_to_fishing
$label fishing_03_end
$stop_music
$overlay_color #000 1.0
$wait 2.0
$load 05_flux

View file

@ -0,0 +1,445 @@
$title Part 5: Flux
$set_background sit_on_platform
$wait 1.0
$overlay_color #00000000 1.0
$wait 1.5
Bard: Hmm...
Marco: Is something the matter?
Bard: I was just expecting more...you know...sex stuff. Or kinky stuff. Not a book and a box.
Marco: Well, the flows of the Carnal River can be really unpredictable! You can fixate on objects for reasons other than being horny.
Marco: It could be something that brings back painful memories. Or something that leaves a strong impression on someone.
Bard: ...So what you're saying is that they are pretty much random.
Marco: Pretty much! After all, mortals are very complicated. What's trivial to one may be another's deepest fear.
Bard: Y'know, Marco. It sounds like you know a lot about people. Is it all really just from listening to rambling [color=#00ffff]souls[/color] like me...?
Marco: I wouldn't say "ramble"... Ah, and from [color=#ffff00]fishing[/color], too! It's like getting many unconnected glimpses into people's lives.
Marco: But I wouldn't go so far as to say I know a lot... Honestly, with each day, it feels like I know less and less. But I still find it all fascinating.
Bard: Is it really...?
Marco: Yes! A certain soul told me that it sounded to them like putting together a large puzzle, trying to fit the pieces together...
Marco: And then when you find a piece that doesn't fit anywhere, it turns out that the puzzle was much bigger than you imagined!
Marco: ...
Marco: I don't really get how puzzles work or why they would be fun, but I imagine that a fellow soul like you might appreciate the metaphor better than me.
Bard: Yeah...it sounds about right. Life is pretty scary...
Marco: But I've still learned so much! And who knows what else is there to discover...
Marco: Such as vore! Until you explained it to me, I never could've even imagined that it was a real thing...
Bard: Uhhhh... I-I still think that you're putting too much thought into that, Marco. It's not something I really care about.
Marco: Are you sure? Maybe you still have to remember that you did care!
Bard: Y-Yeah, well... My memory isn't really that good. Although, that thing we [color=#ffff00]fished[/color] reminds me
$start_music loose_thoughts
$set_background cave_wall_2
$set_sprite bard bard/sweat bounce
$set_sprite marco marco_mask/surprised bounce
Marco: Oh! Does that mean you remembered something else? That's incredible, Bard!
Marco: Would you mind telling me more about it?
Bard: [color=#b2b7d2](Gee... Marco really finds this stuff fascinating, huh.)[/color]
# Fork 2
$if route_b == 1 05_f2_prompt_b
$if route_c == 1 05_f2_prompt_c
Bard: I-I guess not...
$prompt
$option 05_f2_route_a Parent and career
$option 05_f2_route_d Cousin and alien
$label 05_f2_prompt_b
Bard: I-I guess not...
$prompt
$option 05_f2_route_b Friend and theater
$option 05_f2_route_d Cousin and alien
$label 05_f2_prompt_c
Bard: I-I guess not...
$prompt
$option 05_f2_route_c Guru and secret
$option 05_f2_route_d Cousin and alien
$label 05_f2_route_a
$increment route_a
$set_sprite bard bard/normal
Bard: Seeing all that gold in one place reminded me of my own money situation...
$set_sprite marco marco_mask/curious_speak
Marco: Oh. Did you struggle with money?
$set_sprite marco marco_mask/curious
Bard: Hmm, not really. My parents weren't wealthy, but we had enough to get by.
Bard: But my parent... They were really obsessed that I'd get an important job that paid a lot.
$set_sprite marco marco_mask/confused_speak
Marco: Hmm... Your religious parent, correct?
$set_sprite bard bard/normal
$set_sprite marco marco_mask/confused
Bard: Yeah, that one. They said that I was gifted, since I was always getting high grades in school. That I'd go on and get a diploma in one of the best colleges in the country.
$set_sprite marco marco_mask/playful_speak
Marco: It sounds like you were a great student!
$set_sprite marco marco_mask/playful
$set_sprite bard bard/face_away
Bard: Nah... Only when I actually liked the classes. In fact, there was this one time in high school where I couldn't care less about an exam that was coming up.
Bard: Instead of studying, me and my cousin decided to hang out all night. Obviously, we both flunked it.
$set_sprite bard bard/normal
$set_sprite marco marco_mask/crossed_arms
Marco: Were you upset?
Bard: Upset? W-Well, I would just study harder for the next exam to compensate... or something.
Bard: But I still tried to hide the bad grade, because I knew that my parent would overreact.
$set_sprite marco marco_mask/curious_speak
Marco: Overreact...?
$set_sprite marco marco_mask/curious
$set_sprite bard bard/face_away
Bard: Yeah. They actually found out later, and got upset.
Bard: But instead of shouting at me, they thought that the teacher had made a mistake. That they had something against me.
$set_sprite bard bard/sweat bounce
Bard: At one point, they went over to the school and started a shitstorm! They kept fighting the school board over it, hoping that the teacher would give me a better grade.
$set_sprite marco marco_mask/explain
Marco: Heh. So you got away with it, in the end?
Bard: Oh, no. As soon as my parent confronted me about it, I told them the truth. That I didn't study.
$set_sprite bard bard/face_away
Bard: But they didn't care, and kept fighting the school until they changed my grade.
$set_sprite marco marco_mask/shocked
Marco: Oh wow! They kept fighting the school on your behalf, even though you admitted to it. That's quite the stubbornness!
Bard: It was pretty crazy.
$set_sprite marco marco_mask/curious_speak
Marco: Aw... I think it's bittersweet that your parent decided to stand up for you, even if they were pretty misguided.
$set_sprite marco marco_mask/curious
$set_sprite bard bard/normal
Bard: Maybe. I felt pretty bad about it, though. If I had just studied for the exam, then none of this would have happened...
$goto 05_f2_end
$label 05_f2_route_b
$increment route_b
$set_sprite bard bard/normal
Bard: Th-The briefcase was what jogged my memory.
$set_sprite marco marco_mask/curious_speak
Marco: The gold, you mean?
$set_sprite marco marco_mask/curious
$set_sprite bard bard/sweat
Bard: No, no. The briefcase itself. It reminded me of a play I saw once.
$set_sprite marco marco_mask/pensive_speak
Marco: A play...?
$set_sprite marco marco_mask/pensive
$set_sprite bard bard/normal
Bard: Yeah, like in theater. With a stage and actors and such.
$set_sprite marco marco_mask/confused
Bard: I don't remember what it was called. I just remember that there was this briefcase, and all of the characters wanted to get it for some reason or another.
$set_sprite marco marco_mask/confused_speak
Marco: Oh... Sounds like a complex plot. And what was inside of the briefcase?
$set_sprite marco marco_mask/confused
Bard: That's the thing, nobody knew. Everyone thought it was something different. That was the whole joke.
$set_sprite marco marco_mask/laugh
Marco: They all had their reasons to seek it out... That sounds interesting!
$set_sprite bard bard/face_away
$set_sprite marco marco_mask/pensive
Bard: ...Actually, I thought it was pretty bad. The ending was very abrupt and confusing.
$set_sprite marco marco_mask/crossed_arms
Marco: Oh.
Bard: I only watched it because my friend dragged me. They were really into theater.
$set_sprite marco marco_mask/surprised
Marco: By friend, do you mean the one who you had a crush on?
$set_sprite bard bard/blush
$set_sprite marco marco_mask/playful
Bard: Y-Yeah. They wanted to become an actor, so they dragged me along for all the plays that they could find around town.
$set_sprite bard bard/face_away
Bard: Some of them were really weird or boring. I only remember the briefcase one because of all of the jokes that we made.
$set_sprite marco marco_mask/neutral_speak
Marco: Jokes?
$set_sprite marco marco_mask/neutral
Bard: Yeah! It was so bad that we kept making jokes about it the whole week. I remember the jokes better than the plot of the play!
$set_sprite marco marco_mask/curious_speak
$set_sprite bard bard/blush
Marco: Aw... I think that's bittersweet. Despite you not enjoying the play, you two still managed to find some joy in it!
$set_sprite marco marco_mask/playful_speak
Marco: P-Plus, you got to spend more time with the friend you had strong feelings for.
$set_sprite marco marco_mask/playful
$set_sprite bard bard/normal
Bard: T-True... But I still think watching that bad play was a waste of time.
$goto 05_f2_end
$label 05_f2_route_c
$increment route_c
$set_sprite bard bard/normal
Bard: It's not much, just this movie I saw a while ago. It was about a wizard who only l-learned a single spell
$set_sprite marco marco_mask/curious_speak
Marco: Oh! Did he have a book like the one we found?
$set_sprite marco marco_mask/curious
Bard: No, he only had a magic wand. And the only spell it could cast was to...uh...shrink whoever used.
$set_sprite bard bard/blush
Bard: And the premise of the whole movie is that the wizard gets in all sorts of, uh, s-situations because of that spell... But he also uses it to get out of them.
$set_sprite marco marco_mask/reflect
Marco: That sounds like an intriguing movie. Did you like it?
Bard: Y-Yeah...a bit too much. I-It kinda made me realize how much I wanted to be like him.
$set_sprite marco marco_mask/explain
Marco: You mean, being a wizard who could shrink at will?
Bard: ...
Bard: I-It's a bit embarrassing to admit, but I realized that I had a...let's say, micro k-kink.
$set_sprite marco marco_mask/explain
Marco: Hmm... So being small is another fetish for you. Besides vore.
$set_sprite bard bard/face_away
Bard: ...
$set_sprite marco marco_mask/playful_speak
Marco: That's okay! I'm not judging.
...But I guess that one did become a reality, considering how small you are.
$set_sprite bard bard/sweat bounce
$set_sprite marco marco_mask/playful_speak
Bard: ...!
$set_sprite bard bard/blush
Bard: Y-You're right. G-Gosh... Now I'm making this w-weird...!
$set_sprite marco marco_mask/surprised
Marco: Oh, oops. I didn't mean to make you even more flustered! Besides, I said I don't judge, and that's still true.
$set_sprite marco marco_mask/explain
Marco: Aaaanyway, you were saying...
$set_sprite marco marco_mask/pensive
Bard: ...A-After that movie, I was feeling kinda embarrassed. I thought about shrinking myself nonstop. I couldn't really talk to anyone about it...except my guru.
Bard: I was really afraid that they'd laugh at me...! B-But they didn't, and I felt so relieved. I was just glad to get it off my chest.
$set_sprite marco marco_mask/reflect
Marco: Ah, you mentioned your guru earlier. The one that gave you private counseling sessions, right?
Bard: Y-Yeah... I told them about my micro fetish, but th-there's no way I would tell them about my vore one...!
$set_sprite marco marco_mask/explain
Marco: Why not tell anyone else? Is it really that embarrassing?
$set_sprite bard bard/blush
Bard: ...
$set_sprite marco marco_mask/curious_speak
Marco: Aw... Well, I think that it's bittersweet that you still had someone that you could confide your secrets to.
$set_sprite marco marco_mask/curious
$set_sprite bard bard/normal
Bard: I dunno... Maybe it would be better if my tastes weren't so weird in the first place.
$goto 05_f2_end
$label 05_f2_route_d
$increment route_d
$set_sprite bard bard/normal
Bard: But it's not much. Just this cousin that came to visit every now and then.
$set_sprite marco marco_mask/reflect
Marco: Your cousin? How did [color=#ffff00]fishing[/color] remind you of them?
Bard: I-It's a long story. My cousin was older than me, but they lived nearby, so they'd come visit every other day.
$set_sprite bard bard/face_away
Bard: I don't think I told you, but... I was super kinda into space stuff. And it was definitely their fault.
$set_sprite marco marco_mask/pensive_speak
Marco: So you two were pretty friendly?
$set_sprite bard bard/normal
$set_sprite marco marco_mask/pensive
Bard: Yeah! They were like a sibling to me. Or my best friend. I've been thinking a lot about them lately.
$set_sprite marco marco_mask/greet
Marco: I'm glad that you're remembering more, Bard!
$set_sprite bard bard/sweat
Bard: T-To answer your question...I guess I remembered them because of the creepy yellow eye on that book.
$set_sprite marco marco_mask/curious
$set_sprite bard bard/face_away
Bard: My cousin always had the coolest concepts for new alien species, and kept showing me their new doodles.
Bard: There was this alien that they liked the most. It was just a purple blob. It didn't even have a skeleton...just a yellow eye floating inside of them.
$set_sprite marco marco_mask/curious_speak
Marco: A purple blob with a
$set_sprite marco marco_mask/playful_speak
Marco: ...Oh! That's similar to the cover of the grimoire.
$set_sprite bard bard/normal bounce
Bard: Mhm! So that's how I made the connection, I guess.
$set_sprite marco marco_mask/sad
Bard: This alien had a whole tragic backstory, too. Because of her appearance, she was misunderstood by the other aliens, and treated like a monster...
$set_sprite bard bard/face_away
Bard: ...but in truth, she was a valiant hero, helping others through the galaxy without getting anything in return. Only more insults.
$set_sprite marco marco_mask/reflect
Marco: ...A book judged by its cover, as the mortal saying goes.
$set_sprite marco marco_mask/confused_speak
$set_sprite bard bard/normal
Marco: So this alien still took the effort to help others? Even though they all treated her poorly?
$set_sprite marco marco_mask/confused
Bard: Yeah. She believed that, deep down, anyone could be a hero. As long as they set their hearts to it.
$set_sprite bard bard/face_away
Bard: One time, she was hitching a ride in the engine room of a spaceship, hiding until they got to the next spaceport. Then...
$set_sprite bard bard/sweat
$set_sprite marco marco_mask/surprised
Bard: BAM! The spaceship was attacked by bandits! It seemed like they wouldn't be able to survive the barrage of lasers, and the entire engine would fall off.
Bard: But the alien managed to use her glue-like powers to hold the thrusters and the spaceship together, and thanks to her, they all managed to escape safe and sound.
$set_sprite marco marco_mask/playful_speak
Marco: Wow! That's quite the action.
$set_sprite bard bard/face_away
$set_sprite marco marco_mask/playful
Bard: Yeah. She saved the day, and yet again, nobody even knew what she did.
$set_sprite marco marco_mask/curious_speak
Marco: Aw... I think that it's bittersweet that the alien still has her resolve to help others, even if she gets no credit in the end.
$set_sprite marco marco_mask/laugh
Marco: I guess the story about that alien must have resonated with you that you would remember it so dearly, Bard.
$set_sprite bard bard/normal
Bard: Nah. I was just thinking about my cousin, really...
$label 05_f2_end
$stop_music
$overlay_color #000 0.5
$wait 0.3
$set_background sit_on_platform
$overlay_color #00000000 0.5
Bard: ...
$wait 2.0
$set_sprite marco marco_mask/greet
Marco: I'm happy that you remembered more, and even decided to share it with me, Bard.
$set_sprite marco marco_mask/confused
Bard: I'm sorry.
$set_sprite marco marco_mask/confused_speak
Marco: Hm? What for?
$set_sprite marco marco_mask/confused
$set_sprite bard bard/face_away
Bard: For souring the mood. I'm just rambling about some stupid stuff I remember.
$set_sprite marco marco_mask/greet
$continue_after_text
Marco: Oh, it's not stupid at all. I think it's very interesting! I'm very fascinated by you
$set_sprite marco marco_mask/crossed_arms bounce
$set_sprite bard bard/normal
$wait 1.0
Marco: r experiences. Fascinated by your experiences in the mortal plane.
Bard: [color=#b2b7d2](Hmm? What was that weird pause...?)[/color]
Marco: ...Like I've told you, I've met many [color=#00ffff]souls[/color]. And they all told me their share of what it was like to be alive.
$set_sprite marco marco_mask/curious_speak
Marco: And with each one with each story , I feel like I learn a little bit more about the world of the living.
$set_sprite marco marco_mask/curious
Bard: Would you like to go there and see for yourself, one day?
$set_sprite marco marco_mask/confused_speak
Marco: Go...where?
$set_sprite marco marco_mask/confused
Bard: Well, the [color=#00ffff]world of the living[/color], of course. Where I came from.
$set_sprite marco marco_mask/crossed_arms
Marco: But I can't simply abandon my job as a [color=#ff00ff]soul ferrier[/color].
Marco: Therefore, my only contact with the mortal plane is hearing what [color=#00ffff]souls[/color] like you tell me... and [color=#ffff00]fishing[/color], of course.
$set_sprite bard bard/face_away
Bard: Well... At least, it must be nice, not being a mortal. It means that you won't die, or go through the bad parts of life.
$set_sprite marco marco_mask/sad
Marco: ...
$set_sprite bard bard/normal
Bard: By the way, I noticed that you already knew some of the stuff I was talking about.
$set_sprite marco marco_mask/confused_speak bounce
Marco: Hm? Like what?
$set_sprite marco marco_mask/confused
$if route_a >= 2 05_marco_knew_a
$if route_b >= 2 05_marco_knew_b
$if route_c >= 2 05_marco_knew_c
Bard: Like what spaceships are. Or what an alien even means.
$goto 05_marco_knew_end
$label 05_marco_knew_a
Bard: Like what a school is. Or what grades even mean.
$goto 05_marco_knew_end
$label 05_marco_knew_b
Bard: Like what actors are. Or what a play even means.
$goto 05_marco_knew_end
$label 05_marco_knew_c
Bard: Like what movies are. Or what a fetish even means.
$label 05_marco_knew_end
$set_sprite marco marco_mask/confused_speak
Marco: Yeah, I learned it before. A [color=#00ffff]soul[/color] like you taught me.
$set_sprite marco marco_mask/confused
Bard: So you learned EVERYTHING just from listening to souls.
$set_sprite marco marco_mask/explain
Marco: ...It was a lot of souls.
$set_sprite bard bard/face_away
Bard: Whew. Th-That's kinda hard to believe.
$set_sprite marco marco_mask/greet
Marco: But it's true! I have no reason to lie about that. I haven't been counting, but it must've been hundreds of thousands of
$set_sprite marco marco_mask/panic
$set_sprite bard bard/sweat bounce
Bard: HUNDREDS OF THOUSANDS?!
$start_music afloat
$set_sprite marco marco_mask/crossed_arms
Marco: ...Maybe just over a million.
Bard: That's too many!! And you remember all of them?!
$set_sprite marco marco_mask/laugh
Marco: Heh, no. Of course not. Only the special ones.
$set_sprite bard bard/face_away
Bard: Then you'll probably forget about me.
# Marco is coy
$set_sprite marco marco_mask/shy
Marco: ...won't...
$set_sprite bard bard/normal
Bard: Hm? What did you say?
Marco: Oh, um, it was nothing, Bard.
$set_sprite bard bard/face_away
Bard: ...
Bard: You must think that the living world sucks.
$set_sprite marco marco_mask/shocked
Marco: Why?
$set_sprite bard bard/normal
Bard: Because you probably get a lot of dead people complaining about how the world isn't fair, and such.
$set_sprite marco marco_mask/confused_speak
Marco: Is that what you believe? That the world isn't fair?
$set_sprite marco marco_mask/confused
Bard: Yes...i-if my memory serves me right.
$set_sprite marco marco_mask/pensive_speak
Marco: Hmm... From what I've heard, I only agree in part. It can be an unjust place, but it seems to have equal parts hurt and beauty.
$set_sprite marco marco_mask/pensive
Bard: B-But I only seem to remember the ugly parts.
$set_sprite marco marco_mask/playful_speak
Marco: Ugly parts...? But all that you've told me is nice, isn't it? You certainly made them sound like fond memories.
$set_sprite bard bard/face_away
Bard: ...
$set_sprite marco marco_mask/neutral_speak
Marco: Of course, each soul is unique. Some of them tell me good things, like you have! Others only focus on the bad parts.
Marco: But regardless of optimism, all of them seem to regret not doing enough while they were alive, in one way or the other.
$set_sprite bard bard/normal
$set_sprite marco marco_mask/neutral
Bard: ...D-Do you remember ferrying any remarkable soul?
$set_sprite marco marco_mask/laugh
Marco: Oh, there were so many. I don't think I could list them all!
Bard: No, but I mean... Any one that sticks out to you in particular? Someone that you think about a lot?
$set_sprite marco marco_mask/curious_speak
Marco: Hmm... Oh! There was this lady who died of old age. Listening to her recount her own life was quite amazing.
$set_sprite marco marco_mask/curious
Bard: Yeah? What did she do?
$set_sprite marco marco_mask/explain
Marco: Nothing.
Bard: ...
$set_sprite marco marco_mask/neutral
Marco: ...
$set_sprite bard bard/sweat bounce
Bard: Nothing at all?
$set_sprite marco marco_mask/crossed_arms
Marco: Well, of course she did a lot. She didn't do anything remarkable by YOUR standards, though.
$set_sprite bard bard/face_away
Bard: [color=#b2b7d2](...Ouch. Perhaps Marco is right, I'm being too judgmental.)[/color]
$set_sprite bard bard/normal
Bard: U-Umm... Can you tell me about her?
$set_sprite marco marco_mask/explain
Marco: Well, she grew up in her dad's farm, and worked the fields until she got married.
$set_sprite marco marco_mask/pensive_speak
Marco: Then she had children, then grandchildren, then great-grandchildren...and then, she passed away. In her sleep, she recalls.
$set_sprite marco marco_mask/pensive
Bard: She remembers passing away in her sleep...?
$set_sprite marco marco_mask/curious_speak
Marco: Every soul remembers how they died... But you're the exception, of course.
$set_sprite marco marco_mask/curious
Bard: ...That's all? Nothing that sticks out?
$set_sprite bard bard/face_away
Bard: T-To you, I mean. I just don't understand why you'd remember her out of a million other people...
$set_sprite marco marco_mask/greet
Marco: Well, I wouldn't do her justice if I gave you the short version. You had to hear it straight from her soul!
$set_sprite marco marco_mask/reflect
Marco: Oh, but she had an astonishing memory, too! She kept diaries since she was young, and she wouldn't skip a single day. There wasn't a thing she didn't remember...!
Marco: There were good and bad moments. But she really cherished them both, and seemed content with the life she'd led, and the example she'd set for her children.
$set_sprite bard bard/normal
Bard: Hmm... She sounds like the complete opposite of me.
$set_sprite bard bard/face_away
Bard: I kinda wish that my life had been that simple... On the other hand, I dunno if I could handle a quiet life in a farm.
Bard: So she died with no regrets?
$set_sprite marco marco_mask/confused_speak
Marco: Oh, she still had regrets, like everyone. Her grandchildren moved to the big city, and they kept struggling with money.
Marco: She wished that she could've helped them more with their financial situation.
$set_sprite marco marco_mask/crossed_arms
Marco: She also wished that she still had her hearing when her great-grandson was born, so she could've heard him cry for the first time.
$set_sprite bard bard/normal
Bard: Oh... Th-That's so sad.
$set_sprite marco marco_mask/neutral
Marco: It is. But I think she still enjoyed life to its fullest extent. She remarked that the good things and the bad things were important parts of who she grew up to be.
$stop_music
Bard: I-I wish that I could have
# Silence
$set_sprite bard bard/face_away
Bard: ...
Bard: No, never mind...
Marco: ...?
$overlay_color #000 1.0
$set_background before_command_boat_to_move
$clear_sprites
$wait 1.0
$overlay_color #00000000 1.0
$wait 2.0
Bard: M-Marco, do you think we can fish some more?
Marco: Again, already...? But I don't see anything in the river.
Marco: I can move Akhirah to a different spot and try our luck somewhere else.
Marco: Plus, I could use a break from throwing the net around. My arms are a bit tired.
Bard: Oh, okay...
$collapse_textbox
$hide_textbox
# Marco raises his finger and Akhirah starts moving, before it fades to black
$start_music ambiance_river 5.0
$set_background command_boat_to_move
$wait 2.5
$overlay_color #000 1.0
$reset_background
$wait 0.5
$load 06_decay

View file

@ -0,0 +1,457 @@
$title Part 6: Decay
$overlay_color #000 0.0
$reset_background
$set_sprite marco marco_mask/crossed_arms
$wait 2.0
$overlay_color #00000000 1.5
$show_textbox
$expand_textbox
Marco: ...
$set_sprite bard bard/face_away
Bard: ...
Marco: You know, Bard.
Bard: What?
$set_sprite marco marco_mask/reflect
Marco: I think I could probably do it.
Bard: Do what?
$set_sprite marco marco_mask/playful_speak
Marco: Swallow you. For your vore fantasy, I mean.
$set_sprite bard bard/sweat bounce
$set_sprite marco marco_mask/surprised
$overlay_color #fff 0.0
$overlay_color #ffffff00 0.5
Bard: M-MARCO!! Are you still thinking about that?!
$set_sprite marco marco_mask/curious_speak
Marco: Yes. That's why I'm telling you that I could do it! Probably.
$set_sprite bard bard/blush bounce
$set_sprite marco marco_mask/curious
Bard: W-W-Well, think of something else! Anything else...!
$set_sprite marco marco_mask/confused_speak
Marco: Why? I thought you'd enjoy it...
$set_sprite bard bard/face_away
$set_sprite marco marco_mask/confused
Bard: ...B-But it's not even real. My fantasy, I mean.
$set_sprite marco marco_mask/sad
Marco: It could be real, now. And safe. With
$set_sprite bard bard/blush
Bard: But wh-what if it's not actually safe? What if something goes wrong?!
$set_sprite marco marco_mask/explain
Marco: I'd do my utmost to ensure that nothing would go wrong. I promise you, Bard.
$set_sprite bard bard/normal
Bard: ...
$set_sprite marco marco_mask/shy
Marco: I would be careful that no harm would come to you when I swallow you... If you'd let me try.
$set_sprite bard bard/blush
Bard: ......
# Marco dejected again
$set_sprite marco marco_mask/sad
Marco: ...Okay, I'm sorry. I just wanted to do something that we'd both enjoy. I won't bring it up again.
$set_sprite bard bard/normal
Bard: [color=#b2b7d2](Did Marco just say that he would enjoy it, too...?!)[/color]
$set_sprite bard bard/face_away
Bard: [color=#b2b7d2](...But no. A-As nice as it sounds, I still dunno if I can trust Marco with something so... significant.)[/color]
$clear_sprites
$hide_textbox
$overlay_color #000 0.0
$set_background akhirah_back_moving
$overlay_color #00000000 1.0
$wait 0.8
Bard: ...
Marco: ...
$set_sprite bard bard/face_away
Bard: ...I made things awkward again, huh?
$set_sprite marco marco_mask/crossed_arms
Marco: No, not at all! I didn't mean to badger you, Bard.
$set_sprite marco marco_mask/neutral_speak
Marco: Anyway, I'll make sure that Akhirah takes us to our destination.
# Marco gets up
$set_sprite bard bard/normal bounce
$set_sprite marco marco_mask/shocked
Bard: ...What is it like?
$set_sprite marco marco_mask/curious_speak
Marco: Excuse me?
$set_sprite marco marco_mask/curious
Bard: The [color=#ff00ff]Hereafter[/color]. That's where you're taking me, right?
$set_sprite marco marco_mask/neutral_speak
Marco: Yes. Right at the end of the Carnal River. It's where I've taken every single [color=#00ffff]soul[/color] I've ferried.
Bard: Well, what is the [color=#ff00ff]Hereafter[/color] like?
# Marco looks serious
$set_sprite marco marco_mask/neutral
$stop_music
Marco: ...
$set_sprite marco marco_mask/sad
$wait 0.5
Marco: ...
$wait 0.5
Marco: I was afraid that you'd ask.
$set_sprite bard bard/sweat bounce
Bard: Wh-Why? Is it bad?
$set_sprite marco marco_mask/crossed_arms
Marco: No. It's just that you'll think I'm lying.
Bard: ...
$start_music aboard_the_akhirah
$set_sprite marco marco_mask/neutral_speak
Marco: ...[color=#ff00ff]I don't know[/color].
$set_sprite bard bard/normal
$set_sprite marco marco_mask/neutral
Bard: You...what?
$set_sprite marco marco_mask/sad
Marco: I don't know anything that lies before the Carnal River... or anything that lies AFTER.
$set_sprite marco marco_mask/neutral_speak
Marco: I just know that I have to
$set_sprite bard bard/sweat bounce
$set_sprite marco marco_mask/neutral
Bard: What do you mean, you don't know?! It's your entire job to take people there!
$set_sprite marco marco_mask/neutral_speak
Marco: You're right, Bard. I have to bring [color=#00ffff]souls[/color] to the [color=#ff00ff]Hereafter[/color] without exception. But I don't know what happens to them afterwards.
$set_sprite marco marco_mask/reflect
Marco: However, it's more than my "job". It is...my [color=#ff00ff]purpose[/color].
Bard: Your...purpose?
Marco: Yes. And I was [color=#ff00ff]made[/color] for it.
$set_sprite bard bard/face_away
Bard: ...What are you hiding from me?
$set_sprite marco marco_mask/crossed_arms
Marco: I-I'm not hiding anything, Bard! At least, nothing that would
$set_sprite marco marco_mask/sad
Marco: ...How could I have told you about the [color=#ff00ff]Hereafter[/color], if I don't know what happens to you there? THAT would be lying...
Marco: And if I casually brought up that I didn't know, you would have been suspicious of me!
$set_sprite bard bard/normal
Bard: ...I-I am suspicious of you.
$set_sprite marco marco_mask/surprised
Marco: Exactly my point! I didn't mean to lie to you, Bard. Not even by omission. But how could I even bring up that subject in the first place...?
$set_sprite bard bard/face_away
Bard: ...
Bard: ...I think I had the right to know.
$set_sprite marco marco_mask/crossed_arms
Marco: I apologize. And you have every reason to be skeptical of me. I am responsible for every [color=#00ffff]soul[/color] that I ferry, after all.
$set_sprite marco marco_mask/neutral_speak
Marco: Listen... Since there isn't anything in my [color=#ff00ff]Maker[/color]'s rules about keeping it a secret, I'll answer all questions you may have.
$set_sprite bard bard/normal
$set_sprite marco marco_mask/neutral
Bard: G-Good, because I have a lot of them.
Bard: First of all...what ARE you, really?
$set_sprite marco marco_mask/crossed_arms
Marco: I'm a [color=#ff00ff]soul ferrier[/color]. And, like many other soul ferriers, I was made to bring the dead to the [color=#ff00ff]Hereafter[/color].
$set_sprite marco marco_mask/curious_speak
Marco: But I am not like you, Bard. You are a mortal: you're conceived by your parents, you attain a [color=#00ffff]soul[/color], and you live in the mortal world... until you die.
Marco: Meanwhile, I am a [color=#ff00ff]spirit[/color]. I don't have parents; I have a [color=#ff00ff]Maker[/color]. And I don't die; I am... unmade.
$set_sprite marco marco_mask/curious
Bard: ...A Maker?
$set_sprite marco marco_mask/neutral_speak
Marco: Yes. [color=#ff00ff]Spirits[/color] like me are conceived by a [color=#ff00ff]Maker[/color]. And when a Maker has need of a new a spirit... Poof! Suddenly, it exists.
Marco: The same happened for me. In a single moment, I was given a physical body, tools, and memories...
$set_sprite bard bard/face_away
$set_sprite marco marco_mask/neutral
Bard: Th-That's how you were made?! You suddenly appeared out of thin air, one day?
$set_sprite marco marco_mask/reflect
Marco: That's right. And when I was made, I already knew what my purpose was. And with Akhirah ready for me, I was set off to commence my duty as a [color=#ff00ff]soul ferrier[/color].
Bard: And who is your [color=#ff00ff]Maker[/color]?
$set_sprite marco marco_mask/sad
Marco: ...
$set_sprite bard bard/sweat bounce
Bard: ...You don't know, either?!
$set_sprite marco marco_mask/clutch_chest
Marco: I was only given the memories that my [color=#ff00ff]Maker[/color] chose to give me. The bare minimum in order to act as [color=#ff00ff]soul ferrier[/color].
$set_sprite marco marco_mask/crossed_arms
Marco: I know that I have a [color=#ff00ff]Maker[/color]... But I wouldn't know who they are.
$set_sprite bard bard/normal
Bard: But that memory was implanted in you. It could be that the memory of how you were made was implanted by someone other than your [color=#ff00ff]"Maker"[/color].
$set_sprite marco marco_mask/neutral_speak
Marco: Very astute, Bard. That's certainly a possibility.
$set_sprite bard bard/face_away
$set_sprite marco marco_mask/neutral
Bard: ...Then it's fake. All of your memories
$set_sprite marco marco_mask/confused_speak
Marco: Not everything. I have my own personality. Plus, there's all that I've come to learn about the mortal world on my own terms.
$set_sprite marco marco_mask/neutral_speak
Marco: My clothes, too, are my own. I made them over the years with whatever materials I could forage near the Carnal River.
$set_sprite marco marco_mask/playful_speak
Marco: I even used whatever objects that I [color=#ffff00]fished[/color] as a reference...!
$set_sprite marco marco_mask/curious_speak
Marco: Ahem. But still, all that I know about Akhirah, the Carnal River, [color=#00ffff]souls[/color], even the existence of my own [color=#ff00ff]Maker[/color]...
Marco: Everything which was necessary to perform my purpose was placed in my head when I was made.
$set_sprite bard bard/normal
$set_sprite marco marco_mask/curious
Bard: Then what do you actually know about the nature of [color=#00ffff]souls[/color]? Wh-Whether it's an implanted memory or not. What can you tell me?
$set_sprite marco marco_mask/curious_speak
Marco: Hmm... I wouldn't know how they come to be, I simply know that they come from mortals. All of them have both a [color=#00ffff]soul[/color], and a vessel.
$set_sprite marco marco_mask/neutral
Bard: A vessel?
$set_sprite marco marco_mask/pensive_speak
Marco: Yes. Your physical body. And when your body dies, your [color=#00ffff]soul[/color] is left only with a very small, ephemeral vessel instead.
$set_sprite marco marco_mask/pensive
Bard: You mean, this blue blobby body that I have now.
$set_sprite marco marco_mask/neutral_speak
Marco: [color=#ff00ff]Spirits[/color] have vessels, too. It's what you're looking at right now. It was given to me by my [color=#ff00ff]Maker[/color]... supposedly.
$set_sprite marco marco_mask/neutral
Bard: But you can't die, can you?
$set_sprite marco marco_mask/confused_speak
Marco: Yes...and no.
$set_sprite marco marco_mask/confused
Bard: What does that mean?
$set_sprite marco marco_mask/explain
Marco: My vessel can't age. However, it can be unmade.
Bard: Right... You said earlier that you'd disappear if you fell in the river.
$set_sprite marco marco_mask/curious_speak
Marco: Or, for example, if my [color=#ff00ff]Maker[/color] chooses to unmake me.
$set_sprite bard bard/sweat
$set_sprite marco marco_mask/curious
Bard: W-Wait, that can happen? Why?
$set_sprite marco marco_mask/pensive_speak
Marco: Maybe when [color=#ff00ff]soul ferriers[/color] are no longer needed. Or maybe if I go too far.
$set_sprite marco marco_mask/pensive
Bard: G-Go too far...?
$set_sprite marco marco_mask/greet
Marco: Do you remember when you arrived in Akhirah? And you asked me about Charon?
$set_sprite bard bard/normal
Bard: I-I almost forgot about that.
$set_sprite marco marco_mask/sad
Marco: Charon was [color=#ff00ff]a soul ferrier[/color] like me. But he went to the world of the living, to commune with them and tell them all that he knew.
$set_sprite marco marco_mask/crossed_arms
Marco: And when his Maker learned about his carelessness, he was unmade.
$set_sprite bard bard/face_away
Bard: ...
Marco: My memory of Charon, naturally, was also [color=#ff00ff]implanted[/color] in my mind when I was made. As a cautionary tale, I suppose.
$set_sprite bard bard/sweat
$stop_music
Bard: B-But that's just cruel!
$set_sprite marco marco_mask/confused_speak
Marco: Cruel?
$set_sprite bard bard/normal
$set_sprite marco marco_mask/confused
Bard: Yeah! H-How your [color=#ff00ff]Maker[/color] could erase you from existence as soon as they want, without any warning or a fair trial...!
Bard: A-And how you are forced to be a [color=#ff00ff]soul ferrier[/color], never to leave your post!
Marco: ...
Bard: ...
$start_music loose_thoughts
$set_sprite marco marco_mask/neutral_speak
Marco: I disagree.
$set_sprite bard bard/sweat
$set_sprite marco marco_mask/neutral
Bard: Huh?
$set_sprite marco marco_mask/curious_speak
Marco: I guess it's simply a different way of thinking about it.
$set_sprite bard bard/face_away
$set_sprite marco marco_mask/explain
Marco: When mortals are born, they aren't destined for a single task.
Marco: How their lives shape out depends on their circumstances, which are out of their control. It's just the way things are.
Marco: Or, like you said before, how the world can be unfair.
$set_sprite marco marco_mask/reflect
Marco: Still, you mortals also have the power of choice. You can affect the material circumstances around you, and bring consequences to your lives and those of others.
Marco: Which means you get some control in how you live your own lives.
$set_sprite marco marco_mask/neutral_speak
Marco: In that sense, my existence is very simple. I'm part of a greater cycle, like a cog in a machine. Made by my [color=#ff00ff]Maker's[/color] design, for a single purpose.
$set_sprite marco marco_mask/neutral
Bard: A greater cycle...?
$set_sprite marco marco_mask/neutral_speak
Marco: And fulfill that purpose I must. Until maybe, one day, for whichever reason, I will no longer want to fulfill it. Or there won't be any more need of me.
$set_sprite marco marco_mask/curious_speak
Marco: And when that time comes... Poof! I'll be unmade and disappear, just as quickly as I was made.
Marco: ...If my [color=#ff00ff]Maker[/color] decides to, of course.
$set_sprite bard bard/normal
$set_sprite marco marco_mask/curious
Bard: ...So you'll still die, one day?
$set_sprite marco marco_mask/reflect
Marco: Not die, be unmade. But yes, it's a possibility. One that approaches 100% over an infinite amount of time...
$set_sprite bard bard/face_away
Bard: But it's not fair that you should die! I-I mean, be [color=#ff00ff]unmade[/color]!
$set_sprite marco marco_mask/reflect
Marco: ...
Marco: Do you think it was fair that I should have been [color=#ff00ff]made[/color] in the first place?
Bard: W-Well! ...Th-That question doesn't make any sense! You can't say it was fair or not that you happened to exist.
$set_sprite marco marco_mask/neutral_speak
Marco: Exactly. So why shouldn't the end my end be any different? Who's to say existence itself, or nonexistence, is fair?
$set_sprite bard bard/sweat
$set_sprite marco marco_mask/neutral
Bard: ...M-Marco...
$set_sprite marco marco_mask/crossed_arms
Marco: Don't worry, Bard. I promise you that my demise won't come before I bring you to the [color=#ff00ff]Hereafter[/color].
$set_sprite bard bard/normal
Bard: S-Still with your [color=#ff00ff]Hereafter[/color] business, huh...
$set_sprite marco marco_mask/explain
Marco: I hope that I've made it abundantly clear why I insist on it.
$set_sprite marco marco_mask/neutral
Bard: A-Abundantly... But how can you even say all of this with a straight face, and still want to continue your duty?!
Bard: Isn't it pointless, if you'll just be unmade and replaced one day?
$set_sprite bard bard/face_away
Bard: I-Is there even [color=#ff00ff]a Hereafter for spirits[/color]...?
$set_sprite marco marco_mask/neutral_speak
Marco: No. Once I'm unmade, that's it. I don't have a [color=#00ffff]soul[/color] to leave behind, and thus, my essence will be lost.
$set_sprite marco marco_mask/neutral
Bard: ...
$set_sprite marco marco_mask/confused
Marco: ...
$set_sprite marco marco_mask/confused_speak
Marco: But that's exactly what bothers me.
$set_sprite bard bard/normal
$set_sprite marco marco_mask/confused
Bard: Huh...?
$set_sprite marco marco_mask/crossed_arms
Marco: I know that, one day, I'll be gone. I have been made at a whim, and I've always known that I could be unmade at another.
$set_sprite marco marco_mask/shocked
Marco: But mortals, like you, know that you'll die. It's not a memory imparted onto you since you're born, but surely you all realize it at some point in your lives.
Bard: Y-Yeah... I have.
$set_sprite marco marco_mask/confused_speak
Marco: So it's roughly the same situation, right? Then there's something that I don't understand.
Marco: Why do most mortals seem to reject so vehemently the idea that they'll die one day? Wouldn't that make the moments while they are alive more important?
$set_sprite bard bard/face_away
$set_sprite marco marco_mask/neutral
Bard: ...
Bard: I-I dunno, Marco. Maybe it's just easier not to think about it?
$set_sprite marco marco_mask/neutral_speak
Marco: Maybe. But I'm not sure if that's the main reason that leads someone to avoid the subject... Especially given its gravity.
$stop_music
$set_sprite bard bard/normal
$set_sprite marco marco_mask/neutral
Bard: ...
$set_sprite marco marco_mask/crossed_arms
Marco: ...I told you all that I know, Bard. I didn't want to keep this all from you.
$set_sprite marco marco_mask/reflect
Marco: Most [color=#00ffff]souls[/color] that I've ferried don't ever ask anything about me. They normally just need a confidant as they recall their lives...and I'm happy to offer them that.
$set_sprite marco marco_mask/curious_speak
Marco: Not because it's my purpose, or because my memories force me to. It's because I really want to hear what they have to say.
$set_sprite marco marco_mask/curious
Bard: C-Can I ask you something...?
$set_sprite marco marco_mask/pensive_speak
Marco: Of course.
$set_sprite marco marco_mask/pensive
Bard: ...H-How many [color=#00ffff]souls[/color] have asked you this much?
$set_sprite marco marco_mask/pensive_speak
Marco: Regarding the [color=#ff00ff]Hereafter[/color]? Only a handful. Maybe five or six. None of them believed me at first about it, either.
$set_sprite marco marco_mask/curious_speak
Marco: ...Do you believe me now, Bard?
$set_sprite marco marco_mask/curious
$set_sprite bard bard/face_away
Bard: ...
Bard: Th-Thank you, Marco. For telling me the truth. I can see why you thought I wouldn't believe you...
Bard: Just one more question.
$set_sprite bard bard/normal
$set_sprite marco marco_mask/crossed_arms
Bard: ...
Bard: You said that you don't understand why some people pretend that death doesn't exist. And how we don't really appreciate life because of it.
$set_sprite bard bard/sweat
Bard: If...If I remembered that I was one of those people... W-Would you hate me?
$set_sprite marco marco_mask/playful_speak
Marco: That's not
...Of course not, Bard. I wouldn't hate anyone for that.
$set_sprite marco marco_mask/shy
Marco: Besides, I don't think I would ever hate YOU... You're special, after all.
$set_sprite bard bard/face_away
Bard: ...
$set_sprite marco marco_mask/sad
Marco: ...
$set_sprite bard bard/blush
$continue_after_text
Bard: ...I
$wait 0.5
$reset_background
$set_sprite marco marco_mask/look_ahead_speak bounce
$set_sprite bard bard/sweat bounce
Marco: ...Oh, look at that!
$set_sprite bard bard/normal
$set_sprite marco marco_mask/look_ahead
Bard: H-Huh?
$set_sprite marco marco_mask/look_ahead_speak
Marco: I can see a few more reveries surfacing up. We could try [color=#ffff00]fishing[/color] some more, if you're up for it.
$set_sprite marco marco_mask/look_ahead
Bard: Oh. Are you sure? Weren't your arms tired?
$set_sprite marco marco_mask/greet
Marco: They've had enough rest. Anyway, would you like to try catching them without Akhirah slowing down? It could be an extra challenge.
Bard: An extra challenge?
$set_sprite marco marco_mask/explain
Marco: It's not much. It just means that, when you drop the net, it'll go [color=#ffff00]a bit further up[/color] before actually landing on the surface.
$set_sprite marco marco_mask/greet
Marco: What do you say?
$prompt
$option 06_fishing_04_hard Count me in!
$option 06_fishing_04_easy No, it's hard enough as is.
$label 06_fishing_04_easy
$set fishing_04_easy 1
$start_music under_the_surface
$set_sprite bard bard/sweat
Bard: M-Maybe not. Better not to make your arms tired again with the extra throwing.
$set_sprite marco marco_mask/playful_speak
Marco: I'm sure they'll be fine. But I appreciate the concern, Bard!
$overlay_color #00000000 0.0
$collapse_textbox
$overlay_color #000 1.0
$clear_sprites
$hide_textbox
$overlay_color #00000000 0.0
$wait 0.5
# Fishing 4
$escape fishing fishing_04_end 0.75 false {"name":"fishing_04_head_harness","sprite":"head_harness"} {"name":"fishing_04_toy_rocket","sprite":"toy_rocket"}
$label 06_fishing_04_hard
$start_music under_the_surface
Bard: Sure. That sounds fun.
$set_sprite marco marco_mask/playful_speak
Marco: Alright, then! Whenever you're ready.
$overlay_color #00000000 0.0
$collapse_textbox
$overlay_color #000 1.0
$clear_sprites
$hide_textbox
$overlay_color #00000000 0.0
$wait 0.5
$escape fishing fishing_04_end 0.75 true {"name":"fishing_04_head_harness","sprite":"head_harness"} {"name":"fishing_04_toy_rocket","sprite":"toy_rocket"}
$label fishing_04_head_harness
$set_sprite fishing_item fishing_objects/head_harness reveal_fishing_item
$expand_textbox
$wait 1.0
: You found: a head harness!
$text_new_line A kinky accessory for BDSM, complete with leather straps and a silicone gag ball for one's snout.
$set_sprite bard bard/blush
Bard: O-Oh! More k-kinky stuff...
$set_sprite marco marco_mask/confused_speak
Marco: Is it? I can't really figure out what this one is about.
$set_sprite bard bard/face_away
$set_sprite marco marco_mask/confused
Bard: W-Well, you wear it around your head. Your snout goes b-back here, see.
$set_sprite bard bard/normal
Bard: Then the gag would go between your jaws, and you can breathe through these h-holes...
$set_sprite marco marco_mask/sad
Marco: ...
$set_sprite marco marco_mask/shy
Marco: Would you like me to try it on?
$set_sprite bard bard/blush bounce
Bard: N-NO, M-Marco! I d-definitely wasn't thinking that...!
$set_sprite marco marco_mask/hold_face
Marco: G-Good...! I'd rather not remove my mask.
$hide_textbox
$clear_sprites
$escape return_to_fishing
$label fishing_04_toy_rocket
$set_sprite fishing_item fishing_objects/toy_rocket reveal_fishing_item
$expand_textbox
$wait 1.0
: You found: a toy rocket!
$text_new_line A cheap plastic toy shaped like a starfaring aircraft. It looks old and has a few dents.
$set_sprite bard bard/normal
Bard: Ah, this...
$set_sprite marco marco_mask/pensive_speak
Marco: Hmm... This is a dildo, no?
$set_sprite marco marco_mask/pensive
Bard: .........
$set_sprite marco marco_mask/confused_speak
Marco: It isn't...?
$set_sprite bard bard/blush
$set_sprite marco marco_mask/confused
Bard: M-Marco...it's a children's toy.
$set_sprite marco marco_mask/playful_speak
Marco: Oh! But it's so bright and long, and even has a flared base!
$set_sprite marco marco_mask/playful
$set_sprite bard bard/normal
Bard: Because it's a toy rocket...! I'm sure that the cheap plastic would be too toxic for a sex toy.
$remove_sprite marco
Bard: ...
$set_sprite bard bard/sweat bounce
Bard: A-Actually, I'm sure that the cheap plastic WOULD be too toxic for a children's toy!
$hide_textbox
$clear_sprites
$escape return_to_fishing
$label fishing_04_end
$stop_music
$overlay_color #000 1.0
$wait 2.0
$load 07_tomb

View file

@ -0,0 +1,568 @@
$title Part 7: Tomb
$overlay_color #000 0.0
$set_sprite marco marco_mask/look_ahead
$wait 0.5
$overlay_color #00000000 0.5
$wait 2.5
Marco: ...
$set_sprite marco marco_mask/look_ahead_speak
Marco: I think that's everything that we are able to [color=#ffff00]fish[/color] from the Carnal River for now.
$if fishing_04_easy < 1 07_didnt_do_easy_fishing
Marco: I've already ordered Akhirah to set sail.
$label 07_didnt_do_easy_fishing
$set_sprite marco marco_mask/look_ahead
$set_sprite bard bard/face_away
Bard: ...
$set_sprite marco marco_mask/confused_speak
Marco: Is everything alright? ...Are you still mad about earlier?
$set_sprite bard bard/normal
$set_sprite marco marco_mask/confused
Bard: Hm? O-Oh... Not really. I was thinking about the thing that we [color=#ffff00]fished[/color].
$set_sprite marco marco_mask/reflect
Marco: That BDSM harness...?
Bard: No, the rocket. I remember having a toy just like that as a young kid. It was my favorite one...
$set_sprite marco marco_mask/shocked
Marco: A plastic toy rocket?
$set_sprite bard bard/sweat
Bard: Yeah, but it was a different model, with more details. It was some merch from a cartoon series I was very into.
$set_sprite bard bard/face_away
$set_sprite marco marco_mask/crossed_arms
Bard: But I've always been fond of space stuff. When I was a kid, I liked to pretend that I was an astronaut.
$set_sprite bard bard/normal
Bard: Just exploring the vast expanse of the Universe, far away from Earth. Far away from every problem...
$start_music scars
Bard: And I wanted to escape so bad.
# Fork 3
$if route_a >= 2 07_f3_definitely_not_route_d
$if route_b >= 2 07_f3_definitely_not_route_d
$if route_c >= 2 07_f3_definitely_not_route_d
$goto 07_f3_route_d
$label 07_f3_definitely_not_route_d
Bard: Because in space, I wouldn't have to think about
$set_sprite bard bard/face_away
Bard: ...
$set_sprite marco marco_mask/curious_speak
Marco: ...What's wrong?
$set_sprite marco marco_mask/curious
$if route_a >= 2 07_f3_route_a
$if route_b >= 2 07_f3_route_b
$if route_c >= 2 07_f3_route_c
$escape print ERR_FORK_3
$label 07_f3_route_a
Bard: B-But I could never be an astronaut. Up in space, the stakes are much higher...
Bard: If an astronaut makes the wrong choice and fails, they can put their entire crew at risk. They could destroy everything.
$set_sprite marco marco_mask/sad
Marco: Bard...?
$set_sprite bard bard/normal
Bard: ...After I got that bad grade, my parent got stricter. They ordered me to show them every assignment, and every grade.
$set_sprite bard bard/face_away
Bard: It was humiliating...whenever I got a bad grade, they didn't even say anything. Th-They just gave me this terrifying look.
Bard: They started assigning me private tutors. I no longer had any free time, not even for my best friend...
Bard: I had just moved to a new high school, too, b-but I couldn't even socialize and make new friends. Th-Those years were a living hell.
$set_sprite marco marco_mask/crossed_arms
Marco: ...
$set_sprite bard bard/normal
Bard: And I tried. I tried to reach the high standards that my parent set out for me. I tried...!
Bard: B-But things only got worse. I was too tired to focus on my studies, and they pushed me to take more and more meds for my concentration.
$set_sprite marco marco_mask/sad
Marco: Bard...
Bard: Th-Then it was the day of the entrance exam for college. All I wanted to do was strap myself to the next rocket to Alpha Centauri...
$set_sprite bard bard/face_away
Bard: B-Because it felt like if I failed that exam, I'd simply die.
$set_sprite marco marco_mask/clutch_chest
Marco: ...
Bard: I-I still remember the smell of that room. I couldn't handle all of the pressure... I was staring at my exam, but all of the words were too blurry. I started hyperventilating.
$set_sprite bard bard/normal
Bard: They...they t-took me to the infirmary in the middle of the exam. They said I was having ch-chest pains... but I can barely remember having a panic attack.
$set_sprite marco marco_mask/sad
Marco: ...
Bard: I was relieved when I woke up the next day, and I wasn't actually dead. B-But then I realized how crushing it was to be such a failure.
$set_sprite marco marco_mask/crossed_arms
Marco: ...I-I'm sorry, Bard.
Bard: Worst of all was the look on my parent's face. Ever since that exam, th-they never looked at me the same. Like they'd completely given up on me.
$set_sprite bard bard/face_away
Bard: Th-The criticism only got worse. Anything I did in front of them was always wrong. No matter what, I'm just doomed to fail at everything...!
$goto 07_f3_end
$label 07_f3_route_b
$set_sprite bard bard/normal
Bard: Y'know... Wh-When an astronaut floats away from their spaceship without a lifeline, i-it's over for them.
Bard: There isn't any way to propel themselves back to their spaceship, in the vacuum of space.
$set_sprite bard bard/face_away
Bard: They can only watch the ship slowly float away from reach, until their oxygen tank runs out...
$set_sprite marco marco_mask/sad
Marco: Bard...?
Bard: You still remember me talking about my crush, don't you, Marco...?
$set_sprite marco marco_mask/curious_speak
Marco: Y-Yes, of course. Your friend who was into theater.
$set_sprite marco marco_mask/curious
$set_sprite bard bard/normal
Bard: ...Back then, th-they were the only person I was allowed to hang out with.
$set_sprite marco marco_mask/confused_speak
Marco: Why?
$set_sprite marco marco_mask/confused
Bard: They said...they said that one of my friends hated them. A-And they told me, I had a choice to make. It was either stick with my other friend, or them.
$set_sprite marco marco_mask/neutral
Marco: ...
$set_sprite bard bard/face_away
Bard: I-I was still in love with them, so I agreed. I g-guess they realized they could manipulate someone stupid like me.
Bard: After that, they tricked me into ditching another friend...then another...then another...
Bard: S-Soon, I wasn't allowed to speak to anyone else. A-And they kept treating me worse and worse when we were in private.
$set_sprite marco marco_mask/sad
Marco: ...
$set_sprite bard bard/normal
Bard: I-It still took me a while to finally stop having feelings for them. To realize what a fool I was.
Bard: I wanted to break up, in p-private. When I finally worked up the courage.
$set_sprite bard bard/face_away
Bard: B-B-But they threw a tantrum, and humiliated me in public.
$set_sprite marco marco_mask/crossed_arms
Marco: ...I-I'm sorry, Bard.
$set_sprite bard bard/normal
Bard: None of my old friends sided with me. They were s-still angry with me...
Bard: ...Plus, my c-crush had been telling everyone lies behind my back, to rally them against me in case we broke up.
Bard: I-In a single moment, I was alone. My lifeline was gone... And I became a laughing stock.
$set_sprite bard bard/face_away
Bard: M-My crush made sure that if I didn't stay with them, I'd have no friends left... It was all or nothing.
Bard: Th-The bullying got so tough, my parents h-had to move me to another high school...
Bard: A fresh start, they said. The only friend I still had left after that was from my family, after all...
Bard: But I p-promised myself that I'd never, ever fall in love again. How could I have been so stupid to let my own emotions be weaponized against me?!
$goto 07_f3_end
$label 07_f3_route_c
Bard: B-But no, I wouldn't be an astronaut. Most likely, I'd be an alien...
$set_sprite bard bard/normal
Bard: And y-you know what they would do if they found an alien, Marco...?
Bard: They'd study it. F-Figure out why it's different. Dissect it... Kill it.
$set_sprite marco marco_mask/sad
Marco: Bard...?
$set_sprite bard bard/face_away
Marco: After I told my guru about my s-secrets, our sessions started getting worse and worse...
Bard: Th-They started talking about their thoughts. Nasty thoughts...t-terrible thoughts...
Bard: And they said I should be okay with it, b-because deep down, I was just a pervert.
$set_sprite marco marco_mask/neutral
Marco: ...
$set_sprite bard bard/normal
Bard: I s-said that I was uncomfortable, but they kept going...every new session, they kept talking more about it...
Bard: I told th-them, if they didn't stop...then I wouldn't come back. And they just looked at me with a ferocious look, and told me...
$set_sprite bard bard/face_away
Bard: ...
$set_sprite marco marco_mask/curious_speak
Marco: ...What did they tell you?
$set_sprite marco marco_mask/curious
Bard: Th-That if I left, they would tell everyone... EVERYONE... my s-secrets. Th-That no one would love a perv like me after the truth came out.
$set_sprite marco marco_mask/sad
Marco: ...
$set_sprite bard bard/normal
Bard: O-One day, things got worse. They kept making me uncomfortable again... And then they...they touched my leg
$set_sprite bard bard/face_away
Bard: ...I ran away immediately. Before it could get worse.
Bard: Even though I knew what they would do next.
$set_sprite marco marco_mask/crossed_arms
Marco: ...I-I'm sorry, Bard.
$set_sprite bard bard/normal
Bard: Actually, I-I still don't know...if they told everyone or not. If they actually revealed my secrets. And I'm too afraid to find out.
Bard: I only ever asked my cousin about it... They denied it, but maybe it was just a lie to hide the terrible truth...
$set_sprite bard bard/face_away
Bard: Now it feels like everyone sees an alien where I'm standing... D-Do they all secretly know what a filthy degenerate I am?!
$goto 07_f3_end
$label 07_f3_route_d
$set_sprite marco marco_mask/curious_speak
Marco: I remember you talking about that earlier. How your cousin also enjoyed space stuff, and shared their characters with you.
$set_sprite marco marco_mask/playful_speak
Marco: They practically got you to like that sort of thing, right?
$set_sprite marco marco_mask/playful
Bard: ...
$set_sprite marco marco_mask/pensive
Marco: ...
Bard: Y-Yes. We were always pretending to go on different space adventures. Since we were little... but even as we grew up, we continued.
Bard: People would say that we were too old to play pretend, but I didn't care. Our adventures were just for the both of us, and nobody else...
Bard: ...We would...
Bard: ...
$set_sprite marco marco_mask/sad
Marco: ...Bard?
Bard: W-We would both hide in the dark, moldy attic at home. That was the dark side of the Moon, y-you see...where all my old space toys were.
Bard: There, nobody in the entire world could reach us. N-No one in the entire blue ball hidden behind the lunar surface...
Bard: ...Just two a-a-astronauts...me and them...
$set_sprite marco marco_mask/curious_speak
Marco: What's wrong, Bard?
$set_sprite marco marco_mask/curious
Bard: I s-saw a lot of myself in my cousin. Sometimes, it felt like they were the only person who understood me. The only one...!
Bard: Then, one day...
$set_sprite marco marco_mask/crossed_arms
Marco: ...
Bard: ...Then, one day...they stopped visiting.
Bard: And I got a call.
Bard: ...
Bard: ...They were no longer with us.
$set_sprite marco marco_mask/clutch_chest
Marco: ...I-I'm sorry, Bard.
Bard: ...
Bard: I couldn't... I c-couldn't understand, Marco.
Bard: I s-s-saw them a few days before.
Bard: ...
Bard: I became...angry.
Bard: I went back to the attic.
Bard: I d-destroyed every single one of my old toys. Even my rocket.
$set_sprite marco marco_mask/crossed_arms
Marco: ...
Bard: Why? Why...?
Bard: Why why WHY?! Wh-Why would they do that...?
Bard: Why would they be so selfish, and leave me all by myself?!
$label 07_f3_end
$set_sprite marco marco_mask/clutch_chest
$stop_music 3.0
Marco: B-Bard... I think that's enough.
$set_sprite bard bard/unwell bounce
$set_sprite marco marco_mask/shocked
Bard: A-Aaaagh...!!
# Bard falls to the floor
$set_sprite bard bard/unwell fall_down
$wait 0.5
$sound_effect wood_thud
Marco: Bard? What's wrong?!
$remove_sprite bard
Bard: M-My....my head i-is...!
$set_sprite marco marco_mask/panic_speak bounce
Marco: B-Bard...! Stay with me!
$set_sprite marco marco_mask/panic_speak fade_out
$hide_textbox
$overlay_color #000 0.0
$clear_sprites
$set_background remove_mask_1
$wait 1.0
$overlay_color #00000000 1.0
$wait 2.0
Bard: Hnnnggg...
$set_sprite marco marco_mask/clutch_chest
Marco: Y-Your vessel...it's getting weaker. If it continues like this, then your [color=#00ffff]soul[/color] will!
Bard: M-Marco...p-please...
$set_sprite marco marco_mask/crossed_arms
Marco: B-Bard, I won't let your soul be extinguished. I promised that I'd take you to the [color=#ff00ff]Hereafter[/color].
Bard: ...
$set_sprite marco marco_mask/crossed_arms fade_out
$hide_textbox
$set_background remove_mask_2
$wait 3.0
$set_sprite marco marco_mask/panic_speak bounce
Marco: Vessel...I need a vessel...
$set_sprite marco marco_mask/panic
Bard: ...
$wait 0.5
# Marco puts his hand to his face
$set_sprite marco marco_mask/hold_face
Marco: ...
$wait 0.5
$overlay_color #fff 0.0
$overlay_color #ffffff00 0.3
$set_sprite marco marco_mask/hold_face bounce
Marco: ...!
Marco: Of course! My mask! The material should be compatible, but...
$set_sprite marco marco_mask/hold_face fade_out
$wait 1.0
$clear_sprites
Marco: ...
Marco: ...Screw it.
$hide_textbox
$set_background remove_mask_3
$wait 0.5
$sound_effect remove_mask
$wait 1.0
$stop
$set_background remove_mask_pause
$wait 2.0
# Marco slowly takes off his mask and lowers it to Bard, and it disappears.
Marco: ...
Marco: I-I really hope this works...
$hide_textbox
$wait 0.5
$set_background remove_mask_4
$wait 0.5
$set_background remove_mask_5
$wait 2.5
$sound_effect glowing_soul
$wait 1.0
$set_background remove_mask_6
$wait 2.0
Bard: ...
Marco: ...
# Bard lights up and gets off the ground
Bard: Wh-What happened...?
$set_background cave_wall
$set_sprite bard bard/sweat bounce
Bard: ...Ah!
Bard: M-Marco? Your face...
$set_sprite marco marco_no_mask/neutral reveal_fishing_item
$wait 1.2
Marco: ...
$wait 0.5
$set_sprite marco marco_no_mask/neutral_speak
Marco: I'm sorry, Bard.
$set_sprite marco marco_no_mask/explain
Marco: I-I bought you some time by giving up my mask for your vessel. And it worked, thank goodness...
$set_sprite marco marco_no_mask/crossed_arms
$set_sprite bard bard/normal
Bard: Wh-What happened?
$set_sprite marco marco_no_mask/crossed_arms_speak
Marco: It's your soul, Bard. Your vessel was no longer holding up on its own.
$set_sprite marco marco_no_mask/sad_speak
Marco: I...I haven't been completely honest with you.
$set_sprite bard bard/face_away
$set_sprite marco marco_no_mask/sad
Bard: ...
$set_sprite marco marco_no_mask/confused_speak
Marco: I've led Akhirah away from the [color=#ff00ff]Hereafter[/color]. I didn't want you to cross over yet.
$set_sprite marco marco_no_mask/confused
$set_sprite bard bard/normal
Bard: What? B-But your purpose
$set_sprite marco marco_no_mask/neutral_speak
Marco: I know, I know. But you weren't ready... No. I wasn't ready.
$set_sprite marco marco_no_mask/closed_eyes_speak
Marco: I didn't want to say farewell just yet.
$set_sprite marco marco_no_mask/closed_eyes
Bard: ...
$set_sprite marco marco_no_mask/pensive_speak
Marco: Souls aren't supposed to last this long out in the open. And I knew that.
Marco: It was selfish of me to let you stay, but I didn't want to alarm you.
$set_sprite marco marco_no_mask/shy_speak
Marco: The truth is... you're special to me, Bard. In a way I can't put into words.
$set_sprite marco marco_no_mask/shy
$set_sprite bard bard/face_away
Bard: ...B-But I'm not.
$set_sprite marco marco_no_mask/shocked
Marco: Huh?
$set_sprite bard bard/normal bounce
Bard: I-I'm not special. Y-You're lying to me...!
$set_sprite marco marco_no_mask/wide_eyed_speak
Marco: N-No, Bard. I really want to
$set_sprite marco marco_no_mask/wide_eyed
$set_sprite bard bard/normal bounce
Bard: I-I know! You're hiding something else! Y-You're trying to manipulate me!
$set_sprite marco marco_no_mask/surprised
Marco: That's not true.
$set_sprite bard bard/face_away bounce
Bard: S-Stay away! The only reason someone would want me would be if they want to use me, and then discard me. Like everyone else...!
$set_sprite marco marco_no_mask/shocked
Marco: Bard, I...I just want to help you.
Bard: ...
$set_sprite marco marco_no_mask/crossed_arms_speak
Marco: ...Please.
$set_sprite marco marco_no_mask/crossed_arms
$set_sprite bard bard/normal
Bard: There is n-nothing you can do for me, Marco.
Bard: I-I've been lying to you all of this time! Y-You don't know what I truly am... A despicable!
$set_sprite bard bard/face_away
Bard: ...
$set_sprite bard bard/normal
Bard: A despicable burden. And I'll always be one.
Bard: There, I said it. That's what I am.
$set_sprite marco marco_no_mask/shocked
Marco: Th-That's not true. You're not a burden!
Bard: ...
$set_sprite bard bard/face_away
Bard: I-I've already made up my mind.
$set_sprite marco marco_no_mask/surprised bounce
Marco: What...?
Bard: I will stop w-wasting your time... G-Goodbye.
$reset_background
$clear_sprites
Marco: Bard?
Marco: ...?!
Marco: Wait!! D-Don't!
# Panic song starts playing
$wait 1.0
: ...
$wait 1.0
$sound_effect water_splash
: *splash*
$wait 0.5
$set_sprite marco marco_no_mask/panic_speak bounce
$start_music eruption
Marco: N-No... Bard jumped into the Carnal River!
$set_sprite marco marco_no_mask/surprised
Marco: This isn't good! They could vanish forever! I have to get Bard back onboard before it's too late...!
$set_sprite marco marco_no_mask/reflect
Marco: ...I know! I'll use my [color=#ffff00]fishing net[/color] to pull them out.
$set_sprite marco marco_no_mask/pensive_speak
Marco: This time, I'll need to keep Akhirah moving. I just have to remember that [color=#ffff00]the net will move a bit further up from where I drop it[/color]...
# Akhirah starts moving and Marco looks around
$set_sprite marco marco_no_mask/look_ahead
$hide_textbox
$stop
$wait 1.0
$continue_after_text
Marco: ...
$wait 1.0
$set_sprite marco marco_no_mask/look_ahead_speak
Marco: There. I found Bard!
# Marco is surprised
$set_sprite marco marco_no_mask/wide_eyed_speak
Marco: W-Wait... There's more than one [color=#00ffff]soul[/color] in the river?! But that's impossible
$set_sprite marco marco_no_mask/reflect
Marco: ...No matter. Bard has to be one of these outlines. I have no choice but to fish them all!
$collapse_textbox
$clear_sprites
# Fishing 5
$set fishing_05_progress 0
$escape fishing fishing_05_end 1.00 true {"name":"fishing_05_any","sprite":"bard"} {"name":"fishing_05_any","sprite":"bard"} {"name":"fishing_05_any","sprite":"bard"}
$label fishing_05_any
$increment fishing_05_progress
$if fishing_05_progress == 1 fishing_05_progress_01
$if fishing_05_progress == 2 fishing_05_progress_02
$goto fishing_05_progress_03
$label fishing_05_progress_01
$set_sprite fishing_item fishing_objects/bard_regret reveal_fishing_item
$expand_textbox
$wait 1.0
: You found: the Regret.
$text_new_line It's whispering something in an angry voice...
$wait 1.0
???: "I never manage to meet other people's expectations. Why am I like this? I must be broken, deep down..."
$wait 1.0
$set_sprite marco marco_no_mask/shocked bounce
Marco: Is this...Bard's voice? It looks like a soul, but it's definitely not one. I've never seen anything like it before...
$set_sprite marco marco_no_mask/panic_speak
Marco: That doesn't matter right now. I have to keep looking!
$clear_sprites
$wait 0.5
$escape return_to_fishing
$label fishing_05_progress_02
$set_sprite fishing_item fishing_objects/bard_guilt reveal_fishing_item
$expand_textbox
$wait 1.0
: You found: the Guilt.
$text_new_line It's whispering something in a sad voice...
$wait 1.0
???: "If I wasn't an unwanted failure, the lives of everyone else would be better! I make them worse simply by existing..."
$wait 1.0
$set_sprite marco marco_no_mask/curious_speak
Marco: Another soul-shaped anomaly. Could it be that Bard's soul has fractured and?!
$set_sprite marco marco_no_mask/hold_face
Marco: ...No. I know that Bard is intact. They have to be...!
$clear_sprites
$wait 0.5
$escape return_to_fishing
$label fishing_05_progress_03
$set_sprite fishing_item fishing_objects/bard_solitude reveal_fishing_item
$expand_textbox
$wait 1.0
: You found: the Solitude.
$text_new_line It's whispering something in a tired voice...
$wait 1.0
???: "Distancing myself is the only way to stop hurting others. I'll vanish from everyone's lives, even when the loneliness becomes unbearable..."
$wait 1.0
$set_sprite marco marco_no_mask/sad
Marco: ...
$set_sprite marco marco_no_mask/look_ahead_speak
Marco: None of these were Bard. I have to keep looking...!
$set_sprite marco marco_no_mask/look_ahead
$remove_sprite fishing_item
$hide_textbox
$wait 2.0
Marco: ...
$set_sprite marco marco_no_mask/look_ahead_speak
Marco: I don't see anything else near the surface...
$set_sprite marco marco_no_mask/crossed_arms
$escape return_to_fishing
$label fishing_05_end
Marco: ...
$set_sprite marco marco_no_mask/crossed_arms_speak
Marco: Bard...
$set_sprite marco marco_no_mask/confused_speak
Marco: Wh-Why would you...
$set_sprite marco marco_no_mask/confused bounce
Marco: ...?
$set_sprite marco marco_no_mask/surprised
Marco: Wait. I think I see something else!
$set_sprite marco marco_no_mask/panic_speak
Marco: H-Hang on, Bard! I'm coming for you!
$set_sprite marco marco_no_mask/panic_speak fade_out
$hide_textbox
$wait 0.3
$clear_sprites
$escape fishing fishing_06_end 1.00 true {"name":"fishing_06_soul","sprite":"bard"}
$label fishing_06_soul
$set_sprite bard fishing_objects/bard_weird reveal_fishing_item
$expand_textbox
$wait 1.0
: You found: Bard...?
$text_new_line This soul's core is completely clouded with self-doubt. It is unresponsive.
$stop_music
$set_sprite marco marco_no_mask/reflect
Marco: Th-This is definitely Bard's [color=#00ffff]soul[/color]! But...
Marco: ...
$set_sprite marco marco_no_mask/shocked bounce
Marco: O-Oh, no. Its core... Is it too late?
$set_sprite marco marco_no_mask/crossed_arms_speak
Marco: Is Bard...?
$set_sprite marco marco_no_mask/crossed_arms
$overlay_color #00000000 0.0
$start_music ambiance_cave 5.0
$collapse_textbox
$hide_textbox
$overlay_color #000 2.0
$remove_sprite marco
$reset_background
$escape return_to_fishing
$label fishing_06_end
$wait 3.0
$overlay_color #00000000 1.0
Marco: Come on... Wake up!
$continue_after_text
: ...
$wait 2.5
Marco: ...
$wait 0.5
Marco: I managed to find you, Bard. Y-You're safe now. Please... Wake up...
$continue_after_text
: ...
$wait 2.5
Marco: ...
$wait 0.5
Marco: It was all my fault. All because I couldn't do my job. All because...
Marco: ...I started to have feelings for you.
$continue_after_text
: ...
$wait 2.0
Marco: It was so selfish of me. I should have given you a proper send off, like I would any other soul. It's my fault you won't be able to cross over anymore!
$continue_after_text
: ...
$wait 1.0
Marco: I-Is your vessel growing weak? But I already sacrificed my mask...
Marco: Wait, my trench coat! I can also give it to you! Let me just...
$set_sprite bard fishing_objects/bard_weird
$stop_music 0.0
: ...Don't...
Marco: ...!
$start_music ambiance_river 5.0
$overlay_color #ffffff00 0.0
$overlay_color #fff 1.0
$wait 0.5
$set_sprite bard fishing_objects/bard_normal
$overlay_color #ffffff00 2.0
# Bard's soul appears unclouded
$continue_after_text
Bard: ...
Bard: Don't... take off your trench coat... I-It looks fine on you.
$set_sprite marco marco_no_mask/shocked bounce
Marco: Bard!
$set_sprite marco marco_no_mask/happy
$wait 0.5
Marco: Bard...I...
$set_sprite marco marco_no_mask/sad
$wait 1.5
$continue_after_text
Marco: ...
$wait 1.0
$set_sprite marco marco_no_mask/cry bounce
# Marco is covering his teary eyes with his arm
$overlay_color #00000000 0.0
Marco: ......
$hide_textbox
$wait 1.0
$overlay_color #000 2.0
$clear_sprites
$wait 1.0
$load 08_judgement

View file

@ -0,0 +1,288 @@
$title Part 8: Judgement
$overlay_color #000 0.0
$wait 1.0
$set_background after_rescue
$overlay_color #00000000 1.0
$stop_music
$wait 1.5
Marco: ...As far as I can tell, your [color=#00ffff]soul[/color] is stable. The vessel is still weak, but it appears to have no lingering side effects from the Carnal River.
Bard: Why?
Marco: I don't know. Maybe the Carnal River
$set_sprite bard bard/sweat bounce
$set_sprite marco marco_no_mask/confused
$start_music loose_thoughts
Bard: N-No. I mean, why did you s-save me?
$set_sprite marco marco_no_mask/clutch_chest
Marco: Why wouldn't I?! The thought of losing you made my chest hurt, like it was twisting itself inside-out.
$set_sprite bard bard/face_away
Bard: B-Because it's your job to take me safely to the [color=#ff00ff]Hereafter[/color]...
$set_sprite marco marco_no_mask/sad_speak
Marco: No.
Marco: I also didn't want to take you there, and be forced to say farewell to you.
$set_sprite marco marco_no_mask/sad
$set_sprite bard bard/normal
Bard: ...
$set_sprite marco marco_no_mask/crossed_arms_speak
Marco: I don't understand why I feel like this... and I was afraid of these emotions, because they go directly against my duty as [color=#ff00ff]soul ferrier[/color].
$set_sprite marco marco_no_mask/crossed_arms
$set_sprite bard bard/blush
Bard: M-Marco...
$set_sprite marco marco_no_mask/explain
Marco: But more than that, there was one thing that I was afraid of the most...
Marco: That you wouldn't understand why I didn't want you to cross over. That you would misinterpret my intent, and do something reckless.
$set_sprite bard bard/face_away
Bard: ...A-And I did just that.
$set_sprite marco marco_no_mask/closed_eyes_speak
Marco: Still... I'm sorry that I lied and caused you so much pain.
$set_sprite marco marco_no_mask/neutral
$set_sprite bard bard/normal
Bard: N-No, Marco! I'm the one who should be apologizing...!
Bard: First of all, for throwing myself into the Carnal River, and causing you to panic when you tried to rescue me... But I
Bard: ...I'm so sorry, Marco. Gosh, that was so stupid in retrospect.
$set_sprite bard bard/face_away
Bard: Besides, I understand why you'd lie about the [color=#ff00ff]Hereafter[/color]... M-Meanwhile, I've only had stupid reasons to lie to you, from the very start.
$set_sprite marco marco_no_mask/pensive
Marco: ...
$set_sprite bard bard/normal
Bard: When we first met, I told you that there wasn't anything in my life to reflect on.
Bard: And you thought I had amnesia, or something... but I really didn't. Still, I went along with it.
Bard: It was just a tiny lie so you would stop asking me questions, b-but you only kept asking me more... And you even tried to help me remember!
$set_sprite marco marco_no_mask/confused
Marco: ...
$set_sprite bard bard/face_away
Bard: I...I decided to play along. I pretended that I didn't have my memories.
Bard: That's how I learned to deal with others while I was alive. Lie, and pretend that everything was alright... And that I didn't need help from anyone else.
Bard: It was like wearing a mask for the sake of others, to hide the ugly world inside of my own head. And to keep others away so that they couldn't hurt me.
$set_sprite bard bard/normal
Bard: When I said that there wasn't anything to reflect on... It's not that I'd forgotten everything.
Bard: It's because my life, in the end, amounted to nothing.
$set_sprite bard bard/face_away
Bard: It was pointless. Meaningless. Not worth reflecting on.
Bard: When I met you, I decided to wear this mask one more time, and lie. And, well...
Bard: Heh. In the end, I guess this charade almost made my life sound interesting, didn't it...?
$set_sprite bard bard/normal
Bard: But the reality is that it's not...
Bard: I'm sorry, Marco. For lying. For everything. I know now that I shouldn't have. You've been nothing but kind to me...
$stop_music
$wait 0.5
$set_sprite marco marco_no_mask/curious
Marco: ...
$wait 0.5
$set_sprite bard bard/face_away
Bard: I understand if you hate me, now that you know the truth. I didn't want to toy with your emotions
$set_sprite marco marco_no_mask/curious_speak
Marco: I always knew.
$set_sprite bard bard/sweat bounce
Bard: H-Huh?
$set_sprite marco marco_no_mask/explain
Marco: I mean, not with certainty. But I had a hunch. That you hadn't actually lost your memories.
$set_sprite bard bard/sweat
Bard: H-How...?
$set_sprite marco marco_no_mask/pensive_speak
Marco: Well, just a few details you've let slip here or there. I wasn't certain until you admitted to it, though.
$set_sprite marco marco_no_mask/pensive
$set_sprite bard bard/normal
Bard: Th-Then... Why didn't you confront me about it?!
$set_sprite marco marco_no_mask/playful_speak
Marco: Because if I did, you would've likely stayed quiet. And you wouldn't have been able to reflect about your life, and realize how precious it was.
$set_sprite marco marco_no_mask/playful
$start_music stars
$set_sprite bard bard/face_away
Bard: ...B-But I still don't think it was.
$set_sprite marco marco_no_mask/neutral
# Fork 4
$if route_a >= 2 08_f4_route_a
$if route_b >= 2 08_f4_route_b
$if route_c >= 2 08_f4_route_c
$goto 08_f4_route_d
$label 08_f4_route_a
Bard: I couldn't ever do anything right... So I thought, why do anything at all? I was bound to fail, anyway.
$set_sprite bard bard/normal
Bard: A-And even if I did anything, I'd get the same negative criticism. If the result I get is the same, it's better to save my energy and not do it in the first place, right?
Bard: I could never accomplish anything good. There were days when I felt like just a waste of space. M-My entire existence felt like a net negative in the world...
$set_sprite bard bard/face_away
Bard: If heaven and hell really exist, then I'm doomed for hell, no matter what.
$set_sprite marco marco_no_mask/neutral_speak
Marco: Bard, you don't have to be perfect. Nobody CAN be perfect. That's why it's only an ideal.
$set_sprite marco marco_no_mask/crossed_arms_speak
Marco: No matter what your parent thought, failure is a part of doing things. It doesn't mean that putting in the effort is worthless, or that goals are not worth pursuing.
$set_sprite marco marco_no_mask/happy
Marco: And whether you have managed to achieve a lot in your life or not doesn't mean that you are or aren't deserving of love.
$goto 08_f4_end
$label 08_f4_route_b
Bard: After my first crush...well, crushed my heart, I could never trust anyone with my feelings anymore... What if someone started using them against me again?
Bard: N-No matter if it was a romantic or a platonic relationship, almost all of them felt hollow. Like we were just two people using each other...
$set_sprite bard bard/normal
Bard: Was I manipulating them into liking me, unconsciously lying about myself? I wanted something that was real, but...
Bard: The romances that you see in movies and games... Are they all just fairy tales? Simply fake?
$set_sprite bard bard/face_away
Bard: You know...even i-if I turn into a ghost, and roam the Earth for an eternity, I don't think I'll ever stumble upon another ghost who really likes me.
$set_sprite marco marco_no_mask/neutral_speak
Marco: Bard, I
$set_sprite marco marco_no_mask/shy
Marco: ...
$set_sprite marco marco_no_mask/shy_speak
Marco: There's more to relationships than just mutual attraction. There are boundaries, affection, commitments, vulnerabilities... and much more.
$set_sprite marco marco_no_mask/neutral_speak
$set_sprite marco marco_no_mask/greet
Marco: For some people, being in a relationship is extremely hard. Opening yourself to someone else is always a very brave thing to do.
$set_sprite marco marco_no_mask/crossed_arms_speak
Marco: I think that love is real, and you deserve to be loved. But that friend of yours wasn't going to offer you any real love.
$set_sprite marco marco_no_mask/crossed_arms
$goto 08_f4_end
$label 08_f4_route_c
Bard: Most of my life, it felt like everyone else was hiding something from me. Something obvious. Something that everyone knew except for me.
Bard: Maybe they all were pretending to like me, b-but they secretly hated me. I kept feeling like people were talking about me behind my back...
$set_sprite bard bard/normal
Bard: It only made me feel like I had to hide myself even more. So other people could have as little reasons to hate me as possible.
Bard: It feels that, if I reincarnate as a snail or something, the other snails will still be able to look through me and see how twisted my soul really is.
$set_sprite bard bard/face_away
Bard: I'll just want to hide forever in my little snail shell... All alone in the next life, too.
$set_sprite marco marco_no_mask/neutral_speak
Marco: Bard, I don't think your soul is twisted. It's normal to have different preferences, and that doesn't make you better or worse than others.
$set_sprite marco marco_no_mask/reflect
Marco: It's also normal to have darker thoughts. And I think it's wrong that others would judge you harshly about your fetishistic desires if you aren't harming anyone.
$set_sprite marco marco_no_mask/crossed_arms_speak
Marco: I'd rather judge someone like your guru, who's actually doing harm to others.
$set_sprite marco marco_no_mask/sad_speak
Marco: The world at large may not change into a more accepting place... But I'm sure there is a community out there that would have accepted you.
$set_sprite marco marco_no_mask/happy
Marco: I wish you could go back to the living world, just to find these people who would truly love you for who you are.
$goto 08_f4_end
$label 08_f4_route_d
$set route_d 1
Bard: Unlike my c-cousin's... They always seemed so happy, I always remembered their face with a smile on it.
Bard: Th-They were the only person who could understand me on a deep level. It was like a mirror into who I'd grow up to be.
$set_sprite bard bard/normal
Bard: And maybe, if they could be happy, then I could, too...
Bard: ...So it sounded like a lie, at first. When I heard that they had taken their own life.
$set_sprite bard bard/face_away
Bard: It...it wasn't fair. The only person I truly cherished... who I loved like my sibling... That they would come to such a terrible conclusion.
Bard: A-And I kept asking myself... Was it maybe my fault, somehow? Maybe I didn't see the signs. Maybe I said something I shouldn't, or didn't say something I should have?
Bard: A-And worst of all... Was it inevitable that I'd follow in their f-footsteps...?
$set_sprite marco marco_no_mask/neutral_speak
Marco: Bard. What happened to your cousin was their choice. It wasn't your fault.
$set_sprite marco marco_no_mask/pensive_speak
Marco: I can't tell you why they did it. Maybe they were desperate, and couldn't keep their self-doubt in check. Maybe they thought the world didn't have a place for them.
$set_sprite marco marco_no_mask/curious_speak
Marco: But it wasn't your fault. It's clear that you loved them a lot, and they must've known that you did. They should have known how their death would affect you.
$set_sprite marco marco_no_mask/crossed_arms_speak
Marco: Unfortunately, we can't change the past. What's done is done.
$set_sprite marco marco_no_mask/neutral_speak
Marco: But I've met enough souls, and I don't think suicide is ever the answer. Not to them, or their loved ones, or anyone.
Marco: No matter how much things may seem hopeless in the moment.
$set_sprite marco marco_no_mask/clutch_chest
Marco: When you're lost in your own self-destructive thoughts, it's easy to forget about all the love present in your life.
$set_sprite bard bard/normal
Bard: ...
Bard: ...You're n-not just talking about my cousin, are you?
$set_sprite marco marco_no_mask/crossed_arms
Marco: ...
$set_sprite bard bard/face_away
Bard: Did...did you always know?
$set_sprite marco marco_no_mask/sad_speak
Marco: ...I had a hunch, too.
$set_sprite marco marco_no_mask/sad
$label 08_f4_end
Bard: ...
$set_sprite bard bard/normal
Bard: Y-You know... When you talk like that... It sounds like you know a lot more about life than anyone who actually lived.
$set_sprite marco marco_no_mask/shy_speak
Marco: Who, me? Not at all. There is still a lot I struggle to understand.
$set_sprite marco marco_no_mask/shy
$set_sprite bard bard/blush
Bard: ...Yeah, me too.
$set_sprite bard bard/normal
Bard: Oh. I was thinking about something.
$set_sprite marco marco_no_mask/curious_speak
Marco: What is it?
$set_sprite marco marco_no_mask/curious
Bard: I still don't understand how I'm still... w-well, "alive" is not the right word. But how didn't my [color=#00ffff]soul[/color] disappear when I threw myself into the Carnal River?
$set_sprite marco marco_no_mask/pensive
Marco: Hmm...
$set_sprite marco marco_no_mask/explain
Marco: It could be that my implanted memories are wrong, or incomplete. Or...
$set_sprite marco marco_no_mask/confused_speak
Marco: ...Maybe your soul weighs heavy on a living person's mind, even as we speak.
$set_sprite marco marco_no_mask/confused
$set_sprite bard bard/face_away
Bard: ...
$set_sprite marco marco_no_mask/closed_eyes_speak
Marco: Bard, please try not to take what I'm about to say the wrong way.
$set_sprite marco marco_no_mask/playful_speak
Marco: But maybe you're ACTUALLY forgetting something. Or rather, someones.
$set_sprite marco marco_no_mask/playful
$set_sprite bard bard/normal
Bard: Someones...?
$set_sprite marco marco_no_mask/sad_speak
Marco: Yes. Other people who are still alive. Who you shared nice moments with, and who have fond memories of you. To whom you were very dear.
$if route_d < 1 08_no_route_d_extra
$set_sprite marco marco_no_mask/clutch_chest
Marco: Like your cousin was to you.
$label 08_no_route_d_extra
$set_sprite bard bard/face_away
Bard: ...
$set_sprite marco marco_no_mask/sad
Bard: I...I think I remember at least one. But I'm not sure if they really cared about me...
Bard: I never had the chance to talk to you about them, but
$set_sprite bard bard/normal
Bard: ...
Bard: I-I feel guilty about leaving them behind, Marco.
$set_sprite marco marco_no_mask/pensive_speak
Marco: I think that's normal, Bard. I haven't met a single [color=#00ffff]soul[/color] that doesn't feel regretful about something after they've passed away.
$set_sprite bard bard/face_away
$set_sprite marco marco_no_mask/pensive
Bard: ...E-Even the farmer lady...
$set_sprite marco marco_no_mask/closed_eyes_speak
Marco: Even the farmer lady.
$set_sprite marco marco_no_mask/closed_eyes
$stop_music
Bard: ...
$overlay_color #00000000 0.0
$overlay_color #000 2.0
$reset_background
$clear_sprites
$overlay_color #00000000 1.0
$set_sprite bard bard/sweat bounce
$set_sprite marco marco_no_mask/surprised
$overlay_color #fff 0.0
$overlay_color #ffffff00 0.3
Bard: IT'S NOT FAIR!!
$set_sprite marco marco_no_mask/wide_eyed_speak
Marco: Not fair...?
$set_sprite marco marco_no_mask/wide_eyed
$set_sprite bard bard/face_away
Bard: I-It's not fair... that only when I'm running out of time... that only after I DIED...
$set_sprite bard bard/normal
Bard: It's not fair that I only found a purpose to live now, of all times...!
$set_sprite marco marco_no_mask/shy
Marco: ...
$set_sprite marco marco_no_mask/shy_speak
Marco: And...what is that purpose?
$set_sprite marco marco_no_mask/shy
$set_sprite bard bard/blush
Bard: ...
$start_music afloat
Bard: It's you, Marco.
Bard: Being with you, after all I've been through... Somehow, it makes me feel special.
$set_sprite marco marco_no_mask/crossed_arms
$set_sprite bard bard/normal
Bard: ...You make me feel special.
$set_sprite marco marco_no_mask/clutch_chest
Marco: O-Oh, Bard...
$wait 0.5
# Marco covers his face with his sleeve again
$set_sprite marco marco_no_mask/cry
$wait 0.5
Marco: I'm so happy to hear you say that...!
$hide_textbox
$overlay_color #00000000 0.0
$wait 1.0
$overlay_color #000 5.0
$clear_sprites
$reset_background
$wait 1.0
# Fade to black
$load 09_postmortem

View file

@ -0,0 +1,303 @@
$title Final Part: Postmortem
$overlay_color #000 0.0
$set_background marco_piloting_with_bard_1
# Fade back to Akhirah traveling at top speed, and Marco turns towards Bard
$wait 2.0
$overlay_color #00000000 3.0
$wait 2.0
$set_background marco_piloting_with_bard_2 true
$set_background marco_piloting_with_bard_3
$wait 2.0
Marco: Akhirah will take us straight to the [color=#ff00ff]Hereafter[/color]. It shouldn't be long, and your vessel should hold until then.
Bard: ...
Bard: D-Do I really have to...?
Marco: I won't force you to cross over. That's up to you. And what awaits you after is beyond me.
Bard: ...So we can't even stay together.
Marco: N-No, I'm afraid. Your vessel will only get weaker while it's exposed to the environment, in the same Manner as metal oxidizes.
Bard: B-But I don't want to leave you behind and make you sad, Marco.
Marco: It's fine, Bard. I will miss you, but things inevitably had to come to an end. I'll be sure to give you a proper send-off.
# Marco seems down
Marco: ...
Bard: ...
$set_background cave_wall_2
$set_sprite bard bard/normal bounce
$set_sprite marco marco_no_mask/sad
Bard: But...what if th-there's another way...?
$set_sprite marco marco_no_mask/sad_speak
Marco: Hmm?
$set_sprite bard bard/blush
Bard: ...N-No, nevermind. It was a bad idea.
$set_sprite marco marco_no_mask/greet
Marco: Whatever you have in mind, I'd love to hear it, Bard.
$set_sprite bard bard/face_away
Bard: Well, what if there was a way I could stay with you? In a place where my soul wouldn't stay exposed to the environment.
$set_sprite bard bard/blush
Bard: ...Inside of you.
$set_sprite marco marco_no_mask/shocked
Marco: Oh! You mean, that vore thing we were talking about earlier.
$set_sprite marco marco_no_mask/clutch_chest
Marco: But I promised you that I wouldn't bring it up again...
$set_sprite bard bard/sweat bounce
Bard: W-Well, I'm bringing it up now! It could work, right...?
$set_sprite marco marco_no_mask/reflect
Marco: I...I think so. But I'm afraid that I might hurt you, even if I'm completely careful.
$set_sprite bard bard/face_away
Bard: ...Is THAT your worry? Not your duty as [color=#ff00ff]soul ferrier[/color]?
$set_sprite marco marco_no_mask/confused_speak
Marco: My duty... What about it?
$set_sprite marco marco_no_mask/confused
$set_sprite bard bard/sweat
Bard: That's why I thought it was a bad idea. Because then it might be against your [color=#ff00ff]purpose[/color], and
$set_sprite marco marco_no_mask/playful_speak
Marco: Oh, that? Bard... You're more important to me than that.
$set_sprite bard bard/normal
$set_sprite marco marco_no_mask/playful
Bard: ...Really?
$set_sprite marco marco_no_mask/shy_speak
Marco: Really.
$stop_music
$set_sprite bard bard/face_away
$set_sprite marco marco_no_mask/shy
Bard: ...
Bard: Then I've made up my mind.
$set_sprite bard bard/blush
Bard: I want you to swallow me.
$set_sprite marco marco_no_mask/surprised
Marco: Bard, are you sure? The last time I brought this up, you weren't happy about it.
$set_sprite marco marco_no_mask/wide_eyed
$set_sprite bard bard/face_away
Bard: ...
$set_sprite bard bard/normal
Bard: N-No, I'm not sure. But I'm not sure about going to the [color=#ff00ff]Hereafter[/color], either.
Bard: I can never be sure if I'm doing the right thing or not.
$set_sprite marco marco_no_mask/closed_eyes
Marco: ...
$set_sprite bard bard/blush
Bard: I trust you, Marco. Before, I didn't know if I wanted to risk being inside of someone I barely knew.
Bard: But now, deep down in my soul, I know that this is what I want. To be close to you.
$set_sprite marco marco_no_mask/hold_face
$set_sprite bard bard/normal
Marco: ...I'm also not sure, Bard.
$set_sprite marco marco_no_mask/explain
Marco: Excited as I was to try it, my implanted memories said nothing about vore. And even if they did, I wouldn't trust them necessarily.
$set_sprite marco marco_no_mask/curious_speak
Marco: In theory, your vessel should be safe inside of mine. You would be safe from the environment, and your soul should remain intact.
Marco: Still, there are things that we cannot be certain about. Something bad could happen even if we are extremely careful.
$set_sprite marco marco_no_mask/neutral_speak
Marco: ...But my feelings also want me to figure it out, together with you.
$set_sprite marco marco_no_mask/neutral
$set_sprite bard bard/blush
Bard: Y'now, I have a feeling that it will be alright. But...
$set_sprite bard bard/normal
Bard: I-I just don't want anything bad to happen to you for my sake.
$set_sprite marco marco_no_mask/reflect
Marco: But as I've told you, this is what I want. It's also for my sake. I've already made up my mind.
$set_sprite marco marco_no_mask/sad_speak
Marco: No matter what comes of it, concerning my [color=#ff00ff]Maker[/color] or not... I will deal with any consequences later.
$set_sprite marco marco_no_mask/neutral_speak
Marco: But I assure you that they won't be bad... And I assure that I won't ever abandon you.
$set_sprite marco marco_no_mask/neutral
$set_sprite bard bard/face_away
Bard: ...O-Okay.
$set_sprite marco marco_no_mask/neutral_speak
Marco: Are you ready?
$set_sprite marco marco_no_mask/neutral
$set_sprite bard bard/normal
Bard: ...Yes. Absolutely.
$set_sprite marco marco_no_mask/happy
Marco: I promise I'll be gentle, Bard. N-Now, please stay still...
# Play animation
$overlay_color #00000000 0.0
$collapse_textbox
$overlay_color #000 1.0
$hide_textbox
$reset_background
$clear_sprites
$wait 0.5
$overlay_color #00000000 0.0
$start_music entangled
$play_video animation
$stop_music 0.0
$wait 2.0
$show_textbox
$expand_textbox
: ...
$wait 1.0
Marco: ...Hic!
$set_sprite marco marco_post_vore/confused reveal_fishing_item
$wait 1.5
Marco: O-Oh, that felt weird... It was harder than I thought it would be.
: ...
$set_sprite marco marco_post_vore/neutral_speak
Marco: Bard, can you hear me?
$set_sprite marco marco_post_vore/neutral
: ...
$set_sprite marco marco_post_vore/worried_speak
Marco: I-Is everything alright in there?
$set_sprite marco marco_post_vore/worried bounce
Bard: AAAAAAHHH!
Marco: ...?!
Bard: I-It's...it's amazing!!
$set_sprite marco marco_post_vore/confused
Marco: ...Being inside of me?
Bard: Yes! M-Marco, that was better than anything I could've hoped for...
$set_sprite marco marco_post_vore/worried_speak
Marco: But I tossed you around in my mouth, and you felt so tight going down my throat! I didn't accidentally scrape your vessel with my tooth, did I? Or
$set_sprite marco marco_post_vore/worried
Bard: Slow down, Marco...! I told you, it was perfect.
$set_sprite marco marco_post_vore/think_speak
Marco: ...How does it feel?
$set_sprite marco marco_post_vore/think
Bard: It feels...warm. And bright. And safe. It's as if I can feel you all around me.
$set_sprite marco marco_post_vore/grin
Marco: Well, I am literally all around you...
$set_sprite marco marco_post_vore/neutral
Bard: I-It's simply wonderful. And perfect... I'm loving every moment of it...
$set_sprite marco marco_post_vore/neutral_speak
$start_music stars
$overlay_color #00000000 0.0
Marco: ...Me too.
$set_sprite marco marco_post_vore/neutral fade_out
$hide_textbox
$wait 0.5
$overlay_color #000 1.0
$wait 1.0
$set_background post_vore_1
$overlay_color #00000000 1.0
$wait 2.0
Bard: ...Marco?
$set_sprite marco marco_post_vore/confused
Marco: Yes?
Bard: I...I'm thinking about what you told me earlier.
$set_sprite marco marco_post_vore/think_speak
Marco: Thinking about what, exactly?
$set_sprite marco marco_post_vore/think
Bard: Well... I guess all of it, really. Mainly the things you said about love, and my life...
Bard: A part of me still thinks it's pointless to think about it, since I'm already dead. But it's still a big part of who I turned out to be.
Bard: I dunno, there's still a lot I haven't talked about. The good moments I had. The harm that I caused to others.
Bard: I regret not telling you all of it before you decided to swallow me. I'm worried that you only started to like me based on a lie...
$set_sprite marco marco_post_vore/confused
Marco: Well, I still like you for who you are! It's not like everything you told me was a lie.
Marco: And I could still see through the glaring ones, and find the nugget of truth in your words.
$set_sprite marco marco_post_vore/think_speak
Marco: And it's normal to feel regrets after anything. Especially when it comes to your entire life.
Marco: Life is complicated... Figuring stuff out on your own is a tough ask of anyone. Still, no one knows what it's like to be you better than yourself.
$set_sprite marco marco_post_vore/neutral_speak
Marco: And besides, we didn't have time before. Now we'll have all the time for you to tell me those things... At your own pace.
Marco: You, too, are a never-ending puzzle. And, if you'll let me, I'd love to figure out together how big it can get with each new piece!
$set_sprite marco marco_post_vore/neutral
Bard: ...You're too good, Marco.
Bard: A-Also, I think I have the answer to your question.
$set_sprite marco marco_post_vore/confused
Marco: My...question?
Bard: You were trying to figure out the meaning of life for us mortals, no? Why we think about our deaths differently from spirits like you.
$set_sprite marco marco_post_vore/think_speak
Marco: ...Do you think you can answer that?
$set_sprite marco marco_post_vore/think
Bard: K-Kinda... But it's kinda scary to think about.
Bard: I think that... There is no answer. There is no purpose to life.
$set_sprite marco marco_post_vore/neutral
Marco: ...
Bard: Good things and bad things happen without a greater meaning behind them. I-I tried to make sense of the world, but there wasn't any sense to make out.
Bard: Life and death will always exist, even if someone like me tries to pretend they don't. And that finality is what makes life worth living.
$set_sprite marco marco_post_vore/think
Marco: ...
Bard: O-Of course, everything will end eventually, and the memories will no longer exist.
Bard: But the things that you do will still impact the world around you. Maybe in ways I can't even imagine.
Bard: We can ignore that every action has a reaction, or that anyone can do both good and bad things. But that's taking away the importance of our lives.
Bard: And just because something is meaningless, it doesn't mean it's worthless. Like life itself.
$set_sprite marco marco_post_vore/think
Marco: ...
Bard: So, I think that's my answer. I don't think there's any real meaning to life, but I think that its existence is still important.
$stop_music
$set_sprite marco marco_post_vore/confused
Marco: ...Hmm.
Bard: W-Well...?
$set_sprite marco marco_post_vore/think_speak
Marco: I couldn't agree more with you, Bard.
Marco: ...Except for one thing.
$set_sprite marco marco_post_vore/think
Bard: And that is...?
$set_sprite marco marco_post_vore/think_speak
Marco: Well, all that you just told...
# Marco grins
$set_sprite marco marco_post_vore/grin bounce
$wait 0.5
$start_music fulminant
Marco: That still doesn't answer my question.
# A few objects appear in the Carnal River
$set_sprite marco marco_post_vore/grin fade_out
$hide_textbox
$wait 1.0
$set_background post_vore_2 true
$overlay_color #ffffff00 0.0
$wait 1.0
$set_background post_vore_3
$wait 1.0
$set_sprite marco marco_post_vore/grin
Bard: A-Answer...? But my point is that there isn't a way to answer!
$set_sprite marco marco_post_vore/confused
Marco: Well, sure. I still haven't figured out how mortal lives work.
$set_sprite marco marco_post_vore/think_speak
Marco: And while you've certainly given me an explanation... It's still only a single explanation.
# More things appear, and things get brighter
$set_sprite marco marco_post_vore/think fade_out
$set_background post_vore_4
$overlay_color #ffffff18 2.0
$set_background post_vore_5
$wait 1.0
$set_sprite marco marco_post_vore/think
Bard: A-A single explanation...?
$set_sprite marco marco_post_vore/think_speak
Marco: Yes. I figured out that there is more than one explanation to my question.
Marco: I appreciate what you've just told me. But I'm still not satisfied.
$set_sprite marco marco_post_vore/grin
Marco: In fact, your words only makes me want to seek it out even more. I want to figure out what mortal life really is like. What it means... to me.
$overlay_color #ffffff30 0.5
Bard: Heh... S-So you're not giving up.
$set_sprite marco marco_post_vore/neutral_speak
Marco: I'm not.
$set_sprite marco marco_post_vore/neutral
Bard: Good... I just hope that I can stick with you as you figure things out.
$set_sprite marco marco_post_vore/neutral_speak
Marco: Of course, Bard.
$set_sprite marco marco_post_vore/accomplished bounce
$wait 0.5
Marco: And... I'll be glad if you do. I wouldn't have it any other way.
$wait 0.5
$set_sprite marco marco_post_vore/accomplished fade_out
$hide_textbox
$stop_music 8.0
# Things get impossibly bright, the entire river is white now. Fulminant fades out
$set_background post_vore_6
$overlay_color #ffffff7f 2.0
$set_background post_vore_7
$wait 1.0
$clear_sprites
Bard: Oh, and Marco?
$wait 1.0
Marco: Yes, Bard?
$wait 1.0
Bard: ...
$wait 2.0
Bard: ...Thank you.
# It all fades completely to white
$wait 2.0
$collapse_textbox
$hide_textbox
$wait 0.5
$overlay_color #fff 4.0
# Slowly fades to black
$wait 2.0
$set_background the_end
$overlay_color #000 4.0
# "The End" slowly fades in
$wait 1.5
$set game_completed 1
$escape store_global game_completed $game_completed
$set answer 42
$escape store_global answer $answer
$overlay_color #00000000 1.5
$wait 5.0
$stop
$end

View file

@ -0,0 +1,10 @@
$title Animation Player
$set disable_sfx 1
$stop
$wait 0.5
$start_music entangled
$play_video animation
$stop_music 0.0
$wait 1.0
$stop
$end

View file

@ -0,0 +1,198 @@
$title Fishing Minigame
$start_music under_the_surface
$label prompt1
: How many fishing targets?
$prompt
$option t1 One
$option t2 Two
$option t3 Three
$label t1
$set targets 1
$goto prompt2
$label t2
$set targets 2
$goto prompt2
$label t3
$set targets 3
$goto prompt2
$label prompt2
: Which difficulty?
$prompt
$option d0 0%
$option d25 25%
$option d50 50%
$option d75 75%
$option d100 100%
$label d0
$set difficulty 0
$goto prompt3
$label d25
$set difficulty 25
$goto prompt3
$label d50
$set difficulty 50
$goto prompt3
$label d75
$set difficulty 75
$goto prompt3
$label d100
$set difficulty 100
$goto prompt3
$label prompt3
: Should the boat keep moving?
$prompt
$option m1 Yes
$option m0 No
$label m0
$hide_textbox
$set_background akhirah_back_stopped
$if difficulty >= 100 m0_d100
$if difficulty >= 75 m0_d75
$if difficulty >= 50 m0_d50
$if difficulty >= 25 m0_d25
$label m0_d0
$if targets >= 3 m0_d0_t3
$if targets >= 2 m0_d0_t2
$goto m0_d0_t1
$label m0_d25
$if targets >= 3 m0_d25_t3
$if targets >= 2 m0_d25_t2
$goto m0_d25_t1
$label m0_d50
$if targets >= 3 m0_d50_t3
$if targets >= 2 m0_d50_t2
$goto m0_d50_t1
$label m0_d75
$if targets >= 3 m0_d75_t3
$if targets >= 2 m0_d75_t2
$goto m0_d75_t1
$label m0_d100
$if targets >= 3 m0_d100_t3
$if targets >= 2 m0_d100_t2
$goto m0_d100_t1
$label m1
$hide_textbox
$set_background akhirah_back_moving
$if difficulty >= 100 m1_d100
$if difficulty >= 75 m1_d75
$if difficulty >= 50 m1_d50
$if difficulty >= 25 m1_d25
$label m1_d0
$if targets >= 3 m1_d0_t3
$if targets >= 2 m1_d0_t2
$goto m1_d0_t1
$label m1_d25
$if targets >= 3 m1_d25_t3
$if targets >= 2 m1_d25_t2
$goto m1_d25_t1
$label m1_d50
$if targets >= 3 m1_d50_t3
$if targets >= 2 m1_d50_t2
$goto m1_d50_t1
$label m1_d75
$if targets >= 3 m1_d75_t3
$if targets >= 2 m1_d75_t2
$goto m1_d75_t1
$label m1_d100
$if targets >= 3 m1_d100_t3
$if targets >= 2 m1_d100_t2
$goto m1_d100_t1
# Boat stopped, difficulty = 0%
$label m0_d0_t1
$escape fishing fishing_over_single 0.0 false {"name":"success","sprite":"default"}
$label m0_d0_t2
$escape fishing fishing_over 0.0 false {"name":"success","sprite":"default"} {"name":"success","sprite":"default"}
$label m0_d0_t3
$escape fishing fishing_over 0.0 false {"name":"success","sprite":"default"} {"name":"success","sprite":"default"} {"name":"success","sprite":"default"}
# Boat stopped, difficulty = 25%
$label m0_d25_t1
$escape fishing fishing_over_single 0.25 false {"name":"success","sprite":"default"}
$label m0_d25_t2
$escape fishing fishing_over 0.25 false {"name":"success","sprite":"default"} {"name":"success","sprite":"default"}
$label m0_d25_t3
$escape fishing fishing_over 0.25 false {"name":"success","sprite":"default"} {"name":"success","sprite":"default"} {"name":"success","sprite":"default"}
# Boat stopped, difficulty = 50%
$label m0_d50_t1
$escape fishing fishing_over_single 0.50 false {"name":"success","sprite":"default"}
$label m0_d50_t2
$escape fishing fishing_over 0.50 false {"name":"success","sprite":"default"} {"name":"success","sprite":"default"}
$label m0_d50_t3
$escape fishing fishing_over 0.50 false {"name":"success","sprite":"default"} {"name":"success","sprite":"default"} {"name":"success","sprite":"default"}
# Boat stopped, difficulty = 75%
$label m0_d75_t1
$escape fishing fishing_over_single 0.75 false {"name":"success","sprite":"default"}
$label m0_d75_t2
$escape fishing fishing_over 0.75 false {"name":"success","sprite":"default"} {"name":"success","sprite":"default"}
$label m0_d75_t3
$escape fishing fishing_over 0.75 false {"name":"success","sprite":"default"} {"name":"success","sprite":"default"} {"name":"success","sprite":"default"}
# Boat stopped, difficulty = 100%
$label m0_d100_t1
$escape fishing fishing_over_single 1.0 false {"name":"success","sprite":"default"}
$label m0_d100_t2
$escape fishing fishing_over 1.0 false {"name":"success","sprite":"default"} {"name":"success","sprite":"default"}
$label m0_d100_t3
$escape fishing fishing_over 1.0 false {"name":"success","sprite":"default"} {"name":"success","sprite":"default"} {"name":"success","sprite":"default"}
# Boat moving, difficulty = 0%
$label m1_d0_t1
$escape fishing fishing_over_single 0.0 true {"name":"success","sprite":"default"}
$label m1_d0_t2
$escape fishing fishing_over 0.0 true {"name":"success","sprite":"default"} {"name":"success","sprite":"default"}
$label m1_d0_t3
$escape fishing fishing_over 0.0 true {"name":"success","sprite":"default"} {"name":"success","sprite":"default"} {"name":"success","sprite":"default"}
# Boat moving, difficulty = 25%
$label m1_d25_t1
$escape fishing fishing_over_single 0.25 true {"name":"success","sprite":"default"}
$label m1_d25_t2
$escape fishing fishing_over 0.25 true {"name":"success","sprite":"default"} {"name":"success","sprite":"default"}
$label m1_d25_t3
$escape fishing fishing_over 0.25 true {"name":"success","sprite":"default"} {"name":"success","sprite":"default"} {"name":"success","sprite":"default"}
# Boat moving, difficulty = 50%
$label m1_d50_t1
$escape fishing fishing_over_single 0.50 true {"name":"success","sprite":"default"}
$label m1_d50_t2
$escape fishing fishing_over 0.50 true {"name":"success","sprite":"default"} {"name":"success","sprite":"default"}
$label m1_d50_t3
$escape fishing fishing_over 0.50 true {"name":"success","sprite":"default"} {"name":"success","sprite":"default"} {"name":"success","sprite":"default"}
# Boat moving, difficulty = 75%
$label m1_d75_t1
$escape fishing fishing_over_single 0.75 true {"name":"success","sprite":"default"}
$label m1_d75_t2
$escape fishing fishing_over 0.75 true {"name":"success","sprite":"default"} {"name":"success","sprite":"default"}
$label m1_d75_t3
$escape fishing fishing_over 0.75 true {"name":"success","sprite":"default"} {"name":"success","sprite":"default"} {"name":"success","sprite":"default"}
# Boat moving, difficulty = 100%
$label m1_d100_t1
$escape fishing fishing_over_single 1.0 true {"name":"success","sprite":"default"}
$label m1_d100_t2
$escape fishing fishing_over 1.0 true {"name":"success","sprite":"default"} {"name":"success","sprite":"default"}
$label m1_d100_t3
$escape fishing fishing_over 1.0 true {"name":"success","sprite":"default"} {"name":"success","sprite":"default"} {"name":"success","sprite":"default"}
$label success
$wait 0.3
$escape return_to_fishing
$label fishing_over_single
: You've fished the target!
$quit
$label fishing_over
: You've fished all of the targets!
$quit

View file

@ -0,0 +1,32 @@
$title Music Test
$set disable_sfx 1
$label test_music
$start_music fulminant
: Now playing: Fulminant
$start_music aboard_the_akhirah
: Now playing: Aboard the Akhirah
$start_music loose_thoughts
: Now playing: Loose Thoughts
$start_music under_the_surface
: Now playing: Under the Surface
$start_music afloat
: Now playing: Afloat
$start_music scars
: Now playing: Scars
$start_music eruption
: Now playing: Eruption
$start_music stars
: Now playing: Stars
$start_music entangled
: Now playing: Entangled
# $start_music ambiance_cave
# : Now playing: Ambiance (Cave)
# $start_music ambiance_river
# : Now playing: Ambiance (River)
$stop_music 0.0
: Return to main menu?
$prompt
$option test_music_end Yes
$option test_music No
$label test_music_end
$end

View file

@ -0,0 +1,27 @@
$title Test fishing
Bard: You can still save here...
$overlay_color white 0.0
$overlay_color fff0 0.3
Bard: It's fishing time babyyyyy
$escape fishing fishing_test_over 0.0 false {"name":"fishing_03","sprite":"butt_plug"}
$label fishing_01
: You found: A blah #1!
Marco: btw, you shouldn't be able to save here
$escape return_to_fishing
$label fishing_02
: You found: A blah #2!
Marco: Lorem ipsum dolor sit amet, eu graeci denique sed. Eam eu nostrud nominati. Te pri probo epicuri voluptatum. Sit in tantas viderer accusam, pro volumus appellantur at.
$escape return_to_fishing
$label fishing_03
: You found:
$wait 1
$set_sprite fished_item marco_no_mask/dab_poggers bounce
: ...a guy!
$remove_sprite fished_item
: cool.
$escape return_to_fishing
$label fishing_test_over
: Fishing is over, hooray!
: Check if you can save here.
: Now back to main menu...
$quit

View file

@ -0,0 +1,60 @@
$title Testing my Visual Novel engine!!
$start_music aboard_the_akhirah
$prompt
$option start Do the whole test
$option take_me_here Jump to prompt
$option opt2 Jump to [color=#b2b7d2]very end[/color]
$label start
$clear_sprites
$stop
$show_textbox
$expand_textbox
$set_sprite layer1 bard/sweat
Bard: What the [color=#0f0]fuck?![/color]
$if test_var < 900 skip_test_line
Bard: I remember the CW stuff!
$label skip_test_line
$set_sprite layer1 bard/sweat bounce
: I don't know, I am just writing a lot of text to make sure that it will take a long time to write all of this out.
$collapse_textbox
$stop
$expand_textbox
$stop
$set_sprite two marco_no_mask/dab_poggers bounce
Marco: l
m
f
$text_new_line a
o
$clear_sprites
$collapse_textbox
$hide_textbox
$show_textbox
$hide_textbox
$stop
# Some comment about the dialogue, maybe??
$label take_me_here
$set_sprite two marco_no_mask/greet
Marco: What if I just print stuff without the usual animations?
$set some_variable 9
$label redo_prompt
: Will you wait?
$prompt
$option opt1 Yes?
$option opt2 No, I think I can skip...
$label opt1
$increment some_variable
$remove_sprite layer1
$continue_after_text
:...
$wait 2.0
$set_sprite layer1 bard/blush bounce {"flip_h":true}
Bard: I say this as long as you pick yes! But only a few times.
$if some_variable <= 10 redo_prompt
Bard: [color=#b2b7d2](Okay, that's enough...)[/color]
$label opt2
$clear_sprites
Hehe... I'm actually a different textbox
$collapse_textbox
$hide_textbox
$goto start