restored some things to the original state

This commit is contained in:
Bram Dingelstad 2021-11-20 11:47:14 +01:00
parent aeb74a2d43
commit cde04c66ac
14 changed files with 191 additions and 312 deletions

7
Dialogue.gd Normal file
View file

@ -0,0 +1,7 @@
extends Control
func _ready():
pass
func _on_Wol_line(line):
prints('got a line', line)

View file

@ -1,8 +1,48 @@
[gd_scene format=2] [gd_scene load_steps=4 format=2]
[ext_resource path="res://addons/Wol/Ostrich Sans Font.tres" type="DynamicFont" id=1]
[ext_resource path="res://addons/Wol/Wol.gd" type="Script" id=2]
[ext_resource path="res://Dialogue.gd" type="Script" id=7]
[node name="Dialogue" type="Control"] [node name="Dialogue" type="Control"]
anchor_right = 1.0 anchor_right = 1.0
anchor_bottom = 1.0 anchor_bottom = 1.0
script = ExtResource( 7 )
__meta__ = { __meta__ = {
"_edit_use_anchors_": false "_edit_use_anchors_": false
} }
[node name="Wol" type="Node" parent="."]
script = ExtResource( 2 )
path = "res://dialogue.yarn"
auto_start = true
[node name="RichTextLabel" type="RichTextLabel" parent="."]
anchor_right = 1.0
anchor_bottom = 1.0
margin_left = 16.0
margin_top = 16.0
margin_right = -16.0
margin_bottom = -256.0
custom_fonts/normal_font = ExtResource( 1 )
text = "Here is where the dialogue will go.
Run the scene in order to see how \"wol\" works."
[node name="VBoxContainer" type="VBoxContainer" parent="."]
anchor_right = 1.0
anchor_bottom = 1.0
margin_left = 16.0
margin_top = 344.0
margin_right = -16.0
__meta__ = {
"_edit_use_anchors_": false
}
[node name="ButtonTemplate" type="Button" parent="VBoxContainer"]
margin_right = 992.0
margin_bottom = 66.0
custom_fonts/font = ExtResource( 1 )
text = "This is a dialogue option"
[connection signal="line" from="Wol" to="." method="_on_Wol_line"]

View file

@ -0,0 +1,11 @@
[gd_resource type="DynamicFont" load_steps=2 format=2]
[ext_resource path="res://addons/Wol/OstrichSans-Heavy.otf" type="DynamicFontData" id=1]
[resource]
size = 64
use_mipmaps = true
use_filter = true
extra_spacing_top = 8
extra_spacing_bottom = 8
font_data = ExtResource( 1 )

View file

@ -0,0 +1,97 @@
Copyright (c) <dates>, <Copyright Holder> (<URL|email>),
with Reserved Font Name <Reserved Font Name>.
Copyright (c) <dates>, <additional Copyright Holder> (<URL|email>),
with Reserved Font Name <additional Reserved Font Name>.
Copyright (c) <dates>, <additional Copyright Holder> (<URL|email>).
This Font Software is licensed under the SIL Open Font License, Version 1.1.
This license is copied below, and is also available with a FAQ at:
http://scripts.sil.org/OFL
-----------------------------------------------------------
SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
-----------------------------------------------------------
PREAMBLE
The goals of the Open Font License (OFL) are to stimulate worldwide
development of collaborative font projects, to support the font creation
efforts of academic and linguistic communities, and to provide a free and
open framework in which fonts may be shared and improved in partnership
with others.
The OFL allows the licensed fonts to be used, studied, modified and
redistributed freely as long as they are not sold by themselves. The
fonts, including any derivative works, can be bundled, embedded,
redistributed and/or sold with any software provided that any reserved
names are not used by derivative works. The fonts and derivatives,
however, cannot be released under any other type of license. The
requirement for fonts to remain under this license does not apply
to any document created using the fonts or their derivatives.
DEFINITIONS
"Font Software" refers to the set of files released by the Copyright
Holder(s) under this license and clearly marked as such. This may
include source files, build scripts and documentation.
"Reserved Font Name" refers to any names specified as such after the
copyright statement(s).
"Original Version" refers to the collection of Font Software components as
distributed by the Copyright Holder(s).
"Modified Version" refers to any derivative made by adding to, deleting,
or substituting -- in part or in whole -- any of the components of the
Original Version, by changing formats or by porting the Font Software to a
new environment.
"Author" refers to any designer, engineer, programmer, technical
writer or other person who contributed to the Font Software.
PERMISSION & CONDITIONS
Permission is hereby granted, free of charge, to any person obtaining
a copy of the Font Software, to use, study, copy, merge, embed, modify,
redistribute, and sell modified and unmodified copies of the Font
Software, subject to the following conditions:
1) Neither the Font Software nor any of its individual components,
in Original or Modified Versions, may be sold by itself.
2) Original or Modified Versions of the Font Software may be bundled,
redistributed and/or sold with any software, provided that each copy
contains the above copyright notice and this license. These can be
included either as stand-alone text files, human-readable headers or
in the appropriate machine-readable metadata fields within text or
binary files as long as those fields can be easily viewed by the user.
3) No Modified Version of the Font Software may use the Reserved Font
Name(s) unless explicit written permission is granted by the corresponding
Copyright Holder. This restriction only applies to the primary font name as
presented to the users.
4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
Software shall not be used to promote, endorse or advertise any
Modified Version, except to acknowledge the contribution(s) of the
Copyright Holder(s) and the Author(s) or with their explicit written
permission.
5) The Font Software, modified or unmodified, in part or in whole,
must be distributed entirely under this license, and must not be
distributed under any other license. The requirement for fonts to
remain under this license does not apply to any document created
using the Font Software.
TERMINATION
This license becomes null and void if any of the above conditions are
not met.
DISCLAIMER
THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
OTHER DEALINGS IN THE FONT SOFTWARE.

Binary file not shown.

View file

@ -7,14 +7,14 @@ signal options(options)
signal command(command) signal command(command)
signal node_completed(node) signal node_completed(node)
signal running signal started
signal finished signal finished
const WolCompiler = preload("res://addons/Wol/core/compiler/compiler.gd") const WolCompiler = preload('res://addons/Wol/core/compiler/compiler.gd')
const WolDialogue = preload("res://addons/Wol/core/dialogue.gd") const WolDialogue = preload('res://addons/Wol/core/dialogue.gd')
export(String, FILE, "*.wol") var path setget set_path export(String, FILE, '*.wol,*.yarn') var path setget set_path
export(String) var start_node = "Start" export(String) var start_node = 'Start'
export(bool) var auto_start = false export(bool) var auto_start = false
export(NodePath) var variable_storage_path export(NodePath) var variable_storage_path
@ -50,12 +50,12 @@ func init_dialogue():
if existing_state: if existing_state:
dialogue._visitedNodeCount = existing_state dialogue._visitedNodeCount = existing_state
dialogue.get_vm().lineHandler = funcref(self, "_handle_line") dialogue.get_vm().lineHandler = funcref(self, '_handle_line')
dialogue.get_vm().optionsHandler = funcref(self, "_handle_options") dialogue.get_vm().optionsHandler = funcref(self, '_handle_options')
dialogue.get_vm().commandHandler = funcref(self, "_handle_command") dialogue.get_vm().commandHandler = funcref(self, '_handle_command')
dialogue.get_vm().nodeCompleteHandler = funcref(self, "_handle_node_complete") dialogue.get_vm().nodeCompleteHandler = funcref(self, '_handle_node_complete')
dialogue.get_vm().dialogueCompleteHandler = funcref(self, "_handle_dialogue_complete") dialogue.get_vm().dialogueCompleteHandler = funcref(self, '_handle_dialogue_complete')
dialogue.get_vm().nodeStartHandler = funcref(self, "_handle_node_start") dialogue.get_vm().nodeStartHandler = funcref(self, '_handle_node_start')
dialogue.set_program(program) dialogue.set_program(program)
@ -73,10 +73,14 @@ func _handle_line(line):
func _handle_command(command): func _handle_command(command):
call_deferred('emit_signal', 'command', command) call_deferred('emit_signal', 'command', command)
if get_signal_connection_list('command').size() > 0:
return WolGlobals.HandlerState.PauseExecution return WolGlobals.HandlerState.PauseExecution
else:
return WolGlobals.HandlerState.ContinueExecution
func _handle_options(options): func _handle_options(options):
emit_signal('options', options) call_deferred('emit_signal' ,'options', options)
return WolGlobals.HandlerState.PauseExecution return WolGlobals.HandlerState.PauseExecution
func _handle_dialogue_complete(): func _handle_dialogue_complete():
@ -111,7 +115,7 @@ func start(node = start_node):
return return
init_dialogue() init_dialogue()
emit_signal('running') emit_signal('started')
running = true running = true
dialogue.set_node(node) dialogue.set_node(node)

View file

@ -1,7 +1,5 @@
extends Node extends Node
#VM Execution States
enum ExecutionState { enum ExecutionState {
Stopped, Stopped,
Running, Running,
@ -152,7 +150,7 @@ enum ExpressionType {
} }
enum StatementTypes j{ enum StatementTypes {
CustomCommand, CustomCommand,
ShortcutOptionGroup, ShortcutOptionGroup,
Block, Block,

View file

@ -1,8 +1,8 @@
extends Object extends Object
const Lexer = preload("res://addons/Wol/core/compiler/lexer.gd") const Lexer = preload("res://addons/Wol/core/compiler/lexer.gd")
const LineInfo = preload("res://addons/Wol/core/program/wol_line.gd") const LineInfo = preload("res://addons/Wol/core/program/line.gd")
const WolNode = preload("res://addons/Wol/core/program/wol_node.gd") const WolNode = preload("res://addons/Wol/core/program/node.gd")
const Instruction = preload("res://addons/Wol/core/program/instruction.gd") const Instruction = preload("res://addons/Wol/core/program/instruction.gd")
const WolProgram = preload("res://addons/Wol/core/program/program.gd") const WolProgram = preload("res://addons/Wol/core/program/program.gd")
const Operand = preload("res://addons/Wol/core/program/operand.gd") const Operand = preload("res://addons/Wol/core/program/operand.gd")

View file

@ -1,11 +1,7 @@
extends Object extends Object
const LineInfo = preload("res://addons/Wol/core/program/wol_line.gd")
var id : String var id : String
var substitutions : Array = []#String var substitutions : Array = []#String
var info : LineInfo
func _init(id: String, info: LineInfo): func _init(id: String):
self.id = id self.id = id
self.info = info

View file

@ -36,7 +36,6 @@ func _init(dialogue):
self._dialogue = dialogue self._dialogue = dialogue
_state = VmState.new() _state = VmState.new()
func set_program(program): func set_program(program):
_program = program _program = program
@ -160,17 +159,18 @@ func find_label_instruction(label:String)->int:
func run_instruction(instruction)->bool: func run_instruction(instruction)->bool:
match instruction.operation: match instruction.operation:
WolGlobals.ByteCode.Label: WolGlobals.ByteCode.Label:
#do nothing woooo!
pass pass
WolGlobals.ByteCode.JumpTo: WolGlobals.ByteCode.JumpTo:
#jump to named label #jump to named label
_state .programCounter = find_label_instruction(instruction.operands[0].value)-1 _state .programCounter = find_label_instruction(instruction.operands[0].value)-1
WolGlobals.ByteCode.RunLine: WolGlobals.ByteCode.RunLine:
#look up string from string table #look up string from string table
#pass it to client as line #pass it to client as line
var key = instruction.operands[0].value var key = instruction.operands[0].value
var line = Line.new(key, _program.wolStrings[key]) var line = Line.new(key)
#the second operand is the expression count #the second operand is the expression count
# of format function # of format function
@ -183,7 +183,6 @@ func run_instruction(instruction)->bool:
if pause == WolGlobals.HandlerState.PauseExecution: if pause == WolGlobals.HandlerState.PauseExecution:
executionState = WolGlobals.ExecutionState.Suspended executionState = WolGlobals.ExecutionState.Suspended
WolGlobals.ByteCode.RunCommand: WolGlobals.ByteCode.RunCommand:
var commandText : String = instruction.operands[0].value var commandText : String = instruction.operands[0].value
@ -196,13 +195,14 @@ func run_instruction(instruction)->bool:
if pause == WolGlobals.HandlerState.PauseExecution: if pause == WolGlobals.HandlerState.PauseExecution:
executionState = WolGlobals.ExecutionState.Suspended executionState = WolGlobals.ExecutionState.Suspended
WolGlobals.ByteCode.PushString: WolGlobals.ByteCode.PushString:
#push String var to stack #push String var to stack
_state.push_value(instruction.operands[0].value) _state.push_value(instruction.operands[0].value)
WolGlobals.ByteCode.PushNumber: WolGlobals.ByteCode.PushNumber:
#push number to stack #push number to stack
_state.push_value(instruction.operands[0].value) _state.push_value(instruction.operands[0].value)
WolGlobals.ByteCode.PushBool: WolGlobals.ByteCode.PushBool:
#push boolean to stack #push boolean to stack
_state.push_value(instruction.operands[0].value) _state.push_value(instruction.operands[0].value)
@ -220,9 +220,11 @@ func run_instruction(instruction)->bool:
#jump to label whose name is on the stack #jump to label whose name is on the stack
var dest : String = _state.peek_value().as_string() var dest : String = _state.peek_value().as_string()
_state.programCounter = find_label_instruction(dest)-1 _state.programCounter = find_label_instruction(dest)-1
WolGlobals.ByteCode.Pop: WolGlobals.ByteCode.Pop:
#pop value from stack #pop value from stack
_state.pop_value() _state.pop_value()
WolGlobals.ByteCode.CallFunc: WolGlobals.ByteCode.CallFunc:
#call function with params on stack #call function with params on stack
#push any return value to stack #push any return value to stack
@ -257,7 +259,6 @@ func run_instruction(instruction)->bool:
if function.returnsValue: if function.returnsValue:
_state.push_value(result) _state.push_value(result)
pass
WolGlobals.ByteCode.PushVariable: WolGlobals.ByteCode.PushVariable:
#get content of variable and push to stack #get content of variable and push to stack
@ -326,7 +327,6 @@ func run_instruction(instruction)->bool:
#when user makes selection #when user makes selection
optionsHandler.call_func(choices) optionsHandler.call_func(choices)
pass
_: _:
#bytecode messed up woopsise #bytecode messed up woopsise
executionState = WolGlobals.ExecutionState.Stopped executionState = WolGlobals.ExecutionState.Stopped

View file

@ -1,33 +0,0 @@
title: Start
tags:
colorID: 3
position: 332,79
---
Oh well hello, what should we set number variable to?
<<set $visited = visit_count()>>
-> Set Number to 6
<<set $number to 6 >>
-> Set Number to 5
<<set $number to 5 >>
We will also set a cat boolean
-> to false
<<set $cat to false>>
-> to true
<<set $cat to true>>
[[SecondNode]]
===
title: SecondNode
tags:
position: 678.16,263.66
---
sweet - Now we are in the Second node
->this one only shows when Visit count of first node is 1 <<if $visited == 1>>
->This only options is showing because cat variable is true <<if $cat == true>>
ok then I guess cat is true
->Some other option with no requirement
this is some other option woooooohooo
->This shows when number greater than 5 <<if $number > 5 >>
Coool, yes the number was greater than 5 <<set $number to 1>>
But not anymore! ha
Now we are finished, GoodBye!
===

View file

@ -1,103 +1,4 @@
title: Waking up title: Start
tags:
colorID: 0
position: -1544,-923
---
<<fade_out>>
<<go_to_space Beginning Room>>
<<protagonist Kiwa>>
<<set $something to 1>>
>.<
>…<
>…<
>I woke up to a pulsating pain in my head.<
>It hurts.<
>It hurts a lot.<
>It was like someone was hammering an ice pick right into my head and chiselling my brain into multiple chunks at once.<
>I tried to reach my head in an attempt to cradle it, hoping I could just slump into a fetal position and wait for the pain to go away.<
>But I couldnt move my arms.<
>Something was keeping them in place.<
>Something cold and really sturdy.<
>Then the implications of that set in.<
>And I shot my eyes wide open.<
>But all I could see was [p;pink].<
>So much [p;pink].<
>And a figure sitting in front of me.<
//<<opening_screen prologue>>
<<toggle_dialogue off>>
<<picture Prologue title>>
<<fade_in>>
<<wait 3>>
<<fade_out>>
<<picture Kiwa looking at mirror>>
<<fade_in>>
<<toggle_dialogue on>>
>Ah… thats just me. Dang, I almost got startled by my own reflection.<
>Why is there a mirror in front of me anyway?<
>I looked down at my reflections hands.<
>Yeah, I was definitely tied up alright. Fun.<
>I tried to yank my arm out of the handcuffs in hopes of a poor job done by whoever had gotten me in this situation.<
>After a few pulling attempts all I got was a bruised wrist. It was a long shot anyways.<
>Okay… What can I do in this situation?<
>I looked around me.<
>This looks like a welcome party or something… Except for all those chairs straight from an old timey asylum.<
>The chairs looked pretty much like mine, meaning-<
???: Ugh…
>The sound came from behind me.<
>I tried to crane my neck to look at the source of the voice but a dull thud accompanied by the feeling of my helmet bouncing against something stopped me.<
???: Ow!
>A long string of surprisingly mild but creative curses echoed in the room.<
???: Was that really necessary?
>I couldnt see much from the angle I was in but from the voice I figured a man around my age was sitting with his back against mine.<
>The mirror wasnt much help either. All I could see was a little bit of dark auburn hair.<
>It seems like I didnt learn from the first attempt and tried to turn my head again to see the source of the voice.<
???: OW! Christ! Please stop hitting your head against mine!
Kiwa: Oh, my bad?
???: Who wears a helmet inside?
Kiwa: Precautions?
Kiwa: I mean, my head doesnt have a bump right now, so I guess thats a testimony to it.
???: And mine was hurting enough as it was.
Kiwa: Uh?
<<hide_pictures>>
<<zoom to VentLid>>
???: Whats happening? I cant see from this position.
Kiwa: A… a countdown?
Kiwa: What does this mean?
>I had a bad feeling. A feeling that solidified into a webbed dark lump inside my chest.<
>My mind was screaming at me to run away as the countdown neared zero.<
-PAIR 8, STARTING PREPARATIONS-
Kiwa: Starting... Wha-
-Click-
???: The restraints!
>We scrambled off the chairs as quickly as humanly possible.<
<<switch_to_camera PanningRoomCamera>>
???: ...
Kiwa: Wait, Id be amazed if that door is open by any chance.
-Click Click-
???: It really is locked.
???: I figured I had nothing to lose by trying.
Kiwa: Well just have to wait then. What is this room anyway?
???: All I can say is this looks rather dubious.
Kiwa: Hmm.
-Welcome esteemed guests! The game you have been dying to participate in has begun!-
-But first, let us get you familiar with the control scheme-
-I know this can get quite tedious to a brilliant mind such as yours truly, but some of the controls and mechanics may vary from the original games.-
-By pressing [p;Shift], you can see circles around objects or characters that indicate theres dialogue to be explored. [b;Blue circles] are optional dialogue while [y; yellow circles] will progress the plot.-
-If a scene has multiple [y;yellow circles], you need to exhaust all yellow dialogue options before you can progress with the plot.-
-[p;Ctrl] opens and closes the transcript in case you need to review previous dialogue.-
-Now then, explore your first area to your hearts content, participant.-
<<switch_to_camera PanningRoomCamera>>
<<detective_mode>>
===
title: The Revolver
tags: tags:
colorID: 0 colorID: 0
position: -1892,-1013 position: -1892,-1013
@ -168,152 +69,10 @@ Masami: Gina!
[[Waking up]] [[Waking up]]
=== ===
title: Screen title: Waking up
tags: tags:
colorID: 0 colorID: 0
position: -1170,-560 position: -1527,-881
--- ---
<<zoom to Screen>> You: *waking up noices*
???: Pair 8?
Kiwa: Us, probably.
???: What are they preparing us for exactly?
Kiwa: I dont think I want to find out.
Kiwa: The countdown already made me nervous.
===
title: Chairs
tags:
colorID: 0
position: -874,-551
---
<<zoom to Chairs>>
Kiwa: Thats a lot of chairs.
???: 16 of them…
Kiwa: Were we the last to wake up?
???: My question is where are the other 14 people?
???: What happened to them?
===
title: Decorations
tags:
colorID: 0
position: -593,-554
---
<<zoom to Decorations>>
Kiwa: Thats… a lot of hearts.
???: My eyes hurt just from looking at all of this. It feels like a crime to have this many shades of pink together at once.
Kiwa: Its definitely ugly.
===
title: Vent
tags:
colorID: 0
position: -338,-536
---
<<zoom to Vent>>
Kiwa: Do you think we could get out through that vent?
???: I dont even know how we could reach it. Let alone open it.
Kiwa: Yeah, the chairs look like they have been bolted to the floor.
Kiwa: Also, whats with this smell? Its really sweet. Like someone dumped a bag of sugar into an air filter.
???: You are right. Its quite overpowering. I hope it wont make me sick.
===
title: Mirror
tags:
colorID: 0
position: -1438,-573
---
<<zoom to Mirror>>
>I look like I always look. A disheveled hobo skater who got severely dunked on recently.<
???: Admiring yourself in the mirror?
Kiwa: Not really.
???: I wonder why there are so many mirrors in this room. It feels like an interactive exhibit of a contemporary art gallery or something along those lines.
Kiwa: Or a fun house without those wobbly mirrors.
???: Or that...
===
title: Ending
tags:
colorID: 0
position: -139,-184
---
<<if !(visited("Mirror") and visited("Vent") and visited("Chairs") and visited("Decorations") and visited("Screen"))>>
<<if visit_count() is 2>>
-You are a hopeless cause.-
<<else>>
???: ...
Kiwa: He's looking around the room. Maybe I should do the same. Access my surroundings and all that...
- ...Hmm. Like I previously established, please take a look at your surroundings.-
-By pressing [p;Shift], you can see circles around objects or characters that indicate theres dialogue to be explored. [b;Blue circles] are optional dialogue while [y; yellow circles] will progress the plot.-
-If a scene has multiple [y;yellow circles], you need to exhaust all yellow dialogue options before you can progress with the plot.-
-[p;Ctrl] opens and closes the transcript in case you need to review previous dialogue.-
-You can move around the room with the [p;A] and [p;D] keys.-
-Do not make me repeat myself again.-
<<endif>>
<<else>>
>Well, there isnt much else to look at. Maybe I should try to talk to him more. He might know something.<
>I guess Ill try to make light of the situation. That works with lowering stressful atmosphere, right?<
Kiwa: Uh, so… Do you come around here often?
???: Seriously? In this situation?
Kiwa: It was just a joke? I think?
???: You are taking this very nonchalantly.
???: And by this, I mean the obvious kidnapping for… for…
???: I dont know. Hopefully just hostage money.
Kiwa: Maybe well get sold for the black market.
???: Oh god. Hopefully not.
Kiwa: Anyway, what sort of torture chamber is covered in pink hearts?
???: I dont even want to entertain the implications.
???: Lets just say the uncomfortable kind.
>He suddenly perked up and started to pat down his pant pockets before his stature deflated again.<
???: Of course they would empty our pockets. Whats left of my belongings is some spare change and pocket lint.
Kiwa: Oh.
>I quickly checked my own pockets.<
Kiwa: You are right. No phone, or keys... or wallet.
Kiwa: They only left me with my lighter but no cigarettes. Why would they take those away but not the lighter?
???: So arson is fine but they draw the line at lung abuse?
Kiwa: This is going to be a problem… mainly for me.
Kiwa: Well, if it comes to it, I can at least set this room on fire.
???: Please dont. I dont want to get grouped in with your lawsuit.
>Thats the part you are worried about?<
???: Are you some sort of criminal?
Kiwa: Something along those lines, sure.
???: Im assuming a petty one at that then.
Kiwa: Yeah.
Kiwa: Sorry, I guess introductions werent the first thing on my mind.
Kiwa: Im Kiwa Fukuda, the former ultimate scapegoat.
???: What a title. And you were an ultimate to boot.
???: How come I have never heard of you?
Kiwa: I try to keep a low profile. That works best with what I do.
???: What exactly does a scapegoat do for a living?
Kiwa: Im really good at pointing fingers at people.
???: Meaning?
Kiwa: If you have a problem and you dont want to deal with it like a respectable member of society, you come to me. I will either make it look like I fucked up the whole situation or I make someone else who is more suited for the situation look like they were at fault.
???: How do you find out you have such a talent in the first place?
Kiwa: With a lot of stupid actions, a lot of accidents, and a lot of dumb luck.
Kiwa: It can get very messy sometimes but it pays my rent three times over.
Kiwa: There are a lot of people who would like to have my head for less than one yen, so I wouldnt be surprised if this whole kidnapping thing was my fault.
Kiwa: Though I dont get why you would be in the same situation then? I have never seen you in my life.
Kiwa: Who are you?
???: …Right.
Masami: My name is Masami Kiyokane, the former ultimate croupier.
Kiwa: A croupier?
Masami: Basically, I am a card dealer at a casino. The Valentines Hand Casino to be exact. You may have heard of it.
Kiwa: Ah, yeah. That one is really highly praised. One of the best in the country, right? Never been there myself. I dont travel much.
Masami: Well, I work there nowadays.
Masami: My work includes taking bets, distributing cards to the players, and making sure those players dont cheat among other things.
Kiwa: Cool. So, you are a former ultimate yourself?
Masami: Thats what that would imply, yes.
Kiwa: I really dont remember you. What class were you in? I didnt interact much with upper or underclassmen during my time in Hopes Peak.
Masami: 72nd, Class A.
Kiwa: Ah, Im from 71st B. I guess we both didnt lose our titles that long ago.
Masami: Still, like you said. If we dont even know each other, how are we in this situation?
Masami: To be honest, I thought the kidnapping was my fault at the start. But now that I have someone here who runs into legal problems constantly…
Kiwa: Why would you think this is your fault?
Masami: Well-
???: Good afternoon.
Masami: What... is that?
Kiwa: A bird?
???: You have successfully woken up. Good.
???: You are expected at the trial grounds. Follow me.
>The strange bird turned its back to us and started to leave through the open door.<
>Figuring out I didnt exactly have anywhere else to go I started following it. Or tried to, at least.<
>A hand grabbed my wrist and forcefully yanked me to run into another direction.<
<<go_to_space Lobby>>
<<endif>>
=== ===