From cde04c66ac5e4704cdf0d11e703c8cef812a8718 Mon Sep 17 00:00:00 2001 From: Bram Dingelstad Date: Sat, 20 Nov 2021 11:47:14 +0100 Subject: [PATCH] restored some things to the original state --- Dialogue.gd | 7 + Dialogue.tscn | 42 ++- addons/Wol/Ostrich Sans Font.tres | 11 + addons/Wol/Ostrich Sans Heavy LICENSE OFL.txt | 97 +++++++ addons/Wol/OstrichSans-Heavy.otf | Bin 0 -> 19460 bytes addons/Wol/Wol.gd | 32 ++- addons/Wol/autoloads/execution_states.gd | 4 +- addons/Wol/core/compiler/compiler.gd | 4 +- addons/Wol/core/dialogue/line.gd | 8 +- .../core/program/{yarn_line.gd => line.gd} | 0 .../core/program/{yarn_node.gd => node.gd} | 0 addons/Wol/core/virtual_machine.gd | 16 +- addons/Wol/examples/example1.yarn | 33 --- dialogue.yarn | 249 +----------------- 14 files changed, 191 insertions(+), 312 deletions(-) create mode 100644 Dialogue.gd create mode 100644 addons/Wol/Ostrich Sans Font.tres create mode 100644 addons/Wol/Ostrich Sans Heavy LICENSE OFL.txt create mode 100644 addons/Wol/OstrichSans-Heavy.otf rename addons/Wol/core/program/{yarn_line.gd => line.gd} (100%) rename addons/Wol/core/program/{yarn_node.gd => node.gd} (100%) delete mode 100644 addons/Wol/examples/example1.yarn diff --git a/Dialogue.gd b/Dialogue.gd new file mode 100644 index 0000000..464dc2a --- /dev/null +++ b/Dialogue.gd @@ -0,0 +1,7 @@ +extends Control + +func _ready(): + pass + +func _on_Wol_line(line): + prints('got a line', line) diff --git a/Dialogue.tscn b/Dialogue.tscn index 87700fd..8e93037 100644 --- a/Dialogue.tscn +++ b/Dialogue.tscn @@ -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"] anchor_right = 1.0 anchor_bottom = 1.0 +script = ExtResource( 7 ) __meta__ = { "_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"] diff --git a/addons/Wol/Ostrich Sans Font.tres b/addons/Wol/Ostrich Sans Font.tres new file mode 100644 index 0000000..6710887 --- /dev/null +++ b/addons/Wol/Ostrich Sans Font.tres @@ -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 ) diff --git a/addons/Wol/Ostrich Sans Heavy LICENSE OFL.txt b/addons/Wol/Ostrich Sans Heavy LICENSE OFL.txt new file mode 100644 index 0000000..f1a20ac --- /dev/null +++ b/addons/Wol/Ostrich Sans Heavy LICENSE OFL.txt @@ -0,0 +1,97 @@ +Copyright (c) , (), +with Reserved Font Name . +Copyright (c) , (), +with Reserved Font Name . +Copyright (c) , (). + +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. diff --git a/addons/Wol/OstrichSans-Heavy.otf b/addons/Wol/OstrichSans-Heavy.otf new file mode 100644 index 0000000000000000000000000000000000000000..e93aed3168606941fd26d41d828dd1a822f0af55 GIT binary patch literal 19460 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 lRRxo>7_Sx 0: + return WolGlobals.HandlerState.PauseExecution + else: + return WolGlobals.HandlerState.ContinueExecution func _handle_options(options): - emit_signal('options', options) + call_deferred('emit_signal' ,'options', options) return WolGlobals.HandlerState.PauseExecution func _handle_dialogue_complete(): @@ -111,7 +115,7 @@ func start(node = start_node): return init_dialogue() - emit_signal('running') + emit_signal('started') running = true dialogue.set_node(node) diff --git a/addons/Wol/autoloads/execution_states.gd b/addons/Wol/autoloads/execution_states.gd index 56342a7..818bf4c 100644 --- a/addons/Wol/autoloads/execution_states.gd +++ b/addons/Wol/autoloads/execution_states.gd @@ -1,7 +1,5 @@ extends Node -#VM Execution States - enum ExecutionState { Stopped, Running, @@ -152,7 +150,7 @@ enum ExpressionType { } -enum StatementTypes j{ +enum StatementTypes { CustomCommand, ShortcutOptionGroup, Block, diff --git a/addons/Wol/core/compiler/compiler.gd b/addons/Wol/core/compiler/compiler.gd index ffa657e..14333b1 100644 --- a/addons/Wol/core/compiler/compiler.gd +++ b/addons/Wol/core/compiler/compiler.gd @@ -1,8 +1,8 @@ extends Object const Lexer = preload("res://addons/Wol/core/compiler/lexer.gd") -const LineInfo = preload("res://addons/Wol/core/program/wol_line.gd") -const WolNode = preload("res://addons/Wol/core/program/wol_node.gd") +const LineInfo = preload("res://addons/Wol/core/program/line.gd") +const WolNode = preload("res://addons/Wol/core/program/node.gd") const Instruction = preload("res://addons/Wol/core/program/instruction.gd") const WolProgram = preload("res://addons/Wol/core/program/program.gd") const Operand = preload("res://addons/Wol/core/program/operand.gd") diff --git a/addons/Wol/core/dialogue/line.gd b/addons/Wol/core/dialogue/line.gd index f998fe1..133268e 100644 --- a/addons/Wol/core/dialogue/line.gd +++ b/addons/Wol/core/dialogue/line.gd @@ -1,11 +1,7 @@ extends Object -const LineInfo = preload("res://addons/Wol/core/program/wol_line.gd") - var id : String var substitutions : Array = []#String -var info : LineInfo -func _init(id: String, info: LineInfo): - self.id = id - self.info = info +func _init(id: String): + self.id = id diff --git a/addons/Wol/core/program/yarn_line.gd b/addons/Wol/core/program/line.gd similarity index 100% rename from addons/Wol/core/program/yarn_line.gd rename to addons/Wol/core/program/line.gd diff --git a/addons/Wol/core/program/yarn_node.gd b/addons/Wol/core/program/node.gd similarity index 100% rename from addons/Wol/core/program/yarn_node.gd rename to addons/Wol/core/program/node.gd diff --git a/addons/Wol/core/virtual_machine.gd b/addons/Wol/core/virtual_machine.gd index 8ee1eac..e9e8880 100644 --- a/addons/Wol/core/virtual_machine.gd +++ b/addons/Wol/core/virtual_machine.gd @@ -36,14 +36,13 @@ func _init(dialogue): self._dialogue = dialogue _state = VmState.new() - func set_program(program): _program = program #set the node to run #return true if successeful false if no node #of that name found -func set_node(name:String)->bool: +func set_node(name:String) -> bool: if _program == null || _program.wolNodes.size() == 0: printerr("Could not load %s : no nodes loaded" % name) return false @@ -160,17 +159,18 @@ func find_label_instruction(label:String)->int: func run_instruction(instruction)->bool: match instruction.operation: WolGlobals.ByteCode.Label: - #do nothing woooo! pass + WolGlobals.ByteCode.JumpTo: #jump to named label _state .programCounter = find_label_instruction(instruction.operands[0].value)-1 + WolGlobals.ByteCode.RunLine: #look up string from string table #pass it to client as line 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 # of format function @@ -183,7 +183,6 @@ func run_instruction(instruction)->bool: if pause == WolGlobals.HandlerState.PauseExecution: executionState = WolGlobals.ExecutionState.Suspended - WolGlobals.ByteCode.RunCommand: var commandText : String = instruction.operands[0].value @@ -196,13 +195,14 @@ func run_instruction(instruction)->bool: if pause == WolGlobals.HandlerState.PauseExecution: executionState = WolGlobals.ExecutionState.Suspended - WolGlobals.ByteCode.PushString: #push String var to stack _state.push_value(instruction.operands[0].value) + WolGlobals.ByteCode.PushNumber: #push number to stack _state.push_value(instruction.operands[0].value) + WolGlobals.ByteCode.PushBool: #push boolean to stack _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 var dest : String = _state.peek_value().as_string() _state.programCounter = find_label_instruction(dest)-1 + WolGlobals.ByteCode.Pop: #pop value from stack _state.pop_value() + WolGlobals.ByteCode.CallFunc: #call function with params on stack #push any return value to stack @@ -257,7 +259,6 @@ func run_instruction(instruction)->bool: if function.returnsValue: _state.push_value(result) - pass WolGlobals.ByteCode.PushVariable: #get content of variable and push to stack @@ -326,7 +327,6 @@ func run_instruction(instruction)->bool: #when user makes selection optionsHandler.call_func(choices) - pass _: #bytecode messed up woopsise executionState = WolGlobals.ExecutionState.Stopped diff --git a/addons/Wol/examples/example1.yarn b/addons/Wol/examples/example1.yarn deleted file mode 100644 index 7c67745..0000000 --- a/addons/Wol/examples/example1.yarn +++ /dev/null @@ -1,33 +0,0 @@ -title: Start -tags: -colorID: 3 -position: 332,79 ---- -Oh well hello, what should we set number variable to? -<> --> Set Number to 6 - <> --> Set Number to 5 - <> -We will also set a cat boolean --> to false - <> --> 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 <> -->This only options is showing because cat variable is 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 < 5 >> - Coool, yes the number was greater than 5 <> - But not anymore! ha -Now we are finished, GoodBye! -=== diff --git a/dialogue.yarn b/dialogue.yarn index 954c4a5..64241d5 100644 --- a/dialogue.yarn +++ b/dialogue.yarn @@ -1,103 +1,4 @@ -title: Waking up -tags: -colorID: 0 -position: -1544,-923 ---- -<> -<> -<> -<> - ->.< ->…< ->…< ->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 couldn’t 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.< - -//<> -<> -<> -<> -<> -<> -<> -<> -<> - ->Ah… that’s 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 reflection’s 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 couldn’t 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 wasn’t much help either. All I could see was a little bit of dark auburn hair.< ->It seems like I didn’t 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 doesn’t have a bump right now, so I guess that’s a testimony to it. -???: And mine was hurting enough as it was. -Kiwa: Uh? - -<> -<> - -???: What’s happening? I can’t 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.< - -<> - -???: ... -Kiwa: Wait, I’d 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: We’ll 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 there’s 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 heart’s content, participant.- - -<> -<> -=== -title: The Revolver +title: Start tags: colorID: 0 position: -1892,-1013 @@ -168,152 +69,10 @@ Masami: Gina! [[Waking up]] === -title: Screen +title: Waking up tags: colorID: 0 -position: -1170,-560 +position: -1527,-881 --- -<> -???: Pair 8? -Kiwa: Us, probably. -???: What are they preparing us for exactly? -Kiwa: I don’t think I want to find out. -Kiwa: The countdown already made me nervous. -=== -title: Chairs -tags: -colorID: 0 -position: -874,-551 ---- -<> -Kiwa: That’s 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 ---- -<> -Kiwa: That’s… 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: It’s definitely ugly. -=== -title: Vent -tags: -colorID: 0 -position: -338,-536 ---- -<> -Kiwa: Do you think we could get out through that vent? -???: I don’t 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, what’s with this smell? It’s really sweet. Like someone dumped a bag of sugar into an air filter. -???: You are right. It’s quite overpowering. I hope it won’t make me sick. -=== -title: Mirror -tags: -colorID: 0 -position: -1438,-573 ---- -<> ->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 ---- -<> - <> - -You are a hopeless cause.- - <> - ???: ... - 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 there’s 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.- - <> -<> - >Well, there isn’t much else to look at. Maybe I should try to talk to him more. He might know something.< - >I guess I’ll 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 don’t know. Hopefully just hostage money. - Kiwa: Maybe we’ll get sold for the black market. - ???: Oh god. Hopefully not. - Kiwa: Anyway, what sort of torture chamber is covered in pink hearts? - ???: I don’t even want to entertain the implications. - ???: Let’s 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. What’s 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 don’t. I don’t want to get grouped in with your lawsuit. - >That’s the part you are worried about?< - ???: Are you some sort of criminal? - Kiwa: Something along those lines, sure. - ???: I’m assuming a petty one at that then. - Kiwa: Yeah. - Kiwa: Sorry, I guess introductions weren’t the first thing on my mind. - Kiwa: I’m 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: I’m really good at pointing fingers at people. - ???: Meaning? - Kiwa: If you have a problem and you don’t 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 wouldn’t be surprised if this whole kidnapping thing was my fault. - Kiwa: Though I don’t 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 Valentine’s 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 don’t travel much. - Masami: Well, I work there nowadays. - Masami: My work includes taking bets, distributing cards to the players, and making sure those players don’t cheat among other things. - Kiwa: Cool. So, you are a former ultimate yourself? - Masami: That’s what that would imply, yes. - Kiwa: I really don’t remember you. What class were you in? I didn’t interact much with upper or underclassmen during my time in Hope’s Peak. - Masami: 72nd, Class A. - Kiwa: Ah, I’m from 71st B. I guess we both didn’t lose our titles that long ago. - Masami: Still, like you said. If we don’t 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 it’s back to us and started to leave through the open door.< - >Figuring out I didn’t 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.< - - <> -<> +You: *waking up noices* ===