My Selected Works

Kardiya: The Winds of Fate

A narrative RPG inspired by Hamlet. I designed its narrative structure and its variables and conditions, and I wrote its text.

Kardiya: The Winds of Fate key art. Three characters with braided hair stand in front of a valley town under a sunset sky, with a column of smoke rising behind them.
Role
Technical Narrative Designer & Writer
Team
6 people
Studio
InEv Games
Format
Narrative RPG
Status
Coming soon on Steam · playtest sign-ups open
Tools
Unity, VSM, Twine (prototypes)

Highlights

  • Designed the game’s narrative structure and prototyped it in Twine.
  • Designed the state behind it: 12 global flags and 67 chapter variables.
  • Specified the challenge and action nodes. The developer built them into VSM.
  • Wrote the game’s text and built every scene in VSM: 3,023 nodes in Chapters 2 to 4.

I designed and built Kardiya’s narrative systems.

Kardiya follows Ukral, the heir of Atroven, from childhood to adulthood. When he dies, he wakes in Araf and lives the story again.

In a challenge, the player chooses an action, then rolls against its Physical, Mental or Social difficulty to determine the outcome. VSM is our in-house node-based writing tool for Unity.

Below is one Chapter 2 choice, from my notebook to the scenes that read it. I also show the VSM workflow on Milord.

  1. A notebook page: two boxes, if Ukral lies and if Ukral tells the truth, each with an arrow to its consequences.1PaperI planned it in my notebook.
  2. The Mental challenge tooltip in the game: average difficulty, and the stress risk.2GameThe player answers and rolls.
  3. KasyaThen that must be mud on your hands, too.KasyaTell me what you’re running from. Talk.1. I told them everything.2. “I can’t say.”3ScriptThe scene as I wrote it.
  4. VSM: the two answers, each running into a challenge node.4VSMEach answer runs into a challenge node.
  5. VSM: condition 401 reads the flag, with its true output ringed in gold.5PayoffsLater scenes check it 11 times.

I planned the choice and its consequences on paper.

Chapter 2, Into the Wild · what the lie costs
A notebook page in Turkish. A question in the middle asks what lying or telling the truth changes in play. Below it, two boxes, if Ukral lies and if Ukral tells the truth, each with an arrow to a relation change and a circled BUT that leads to a consequence.

The page where the lie got its consequences. The question in the middle asks what lying or telling the truth changes in play.

On the pageIn VSM
If Ukral lies: his relation with Kasya and Yarenay dropsChapter2_ukrallied global flag, Kasya −1, Yarenay −1
If he tells the truth: the relation risesKasya +1, Yarenay +1
But Munnan reports him to HostguardChapter 3 reads the flag: Hostguard raids the caravan
Three more pages from the notebook
Chapter 2, Into the Wild · what each scene sets
A notebook page split into boxes for Scene 1, Scene 2, Scene 3.1, Scene 3.2 and Scene 4. Each box lists what the scene sets, with arrows to the scene where it comes back. Finished lines are marked in green.

Each scene has its own box, and arrows point to the scene where a boost or a clue comes back.

On the pageIn VSM
Kasya, Yarenay, Cardis, Child inspectedkasyainspected yarenayinspected cardisinspected childinspected bool, counted in inspectcounter int
Clue +1, for Ak Esherif and for the wolvesakesherifclue int, wolvesclue int
Ukral liedChapter2_ukrallied global flag
Yarenay’s Gift → Fresh Mint boost in Scene 4item Yarenays Gift, boost FreshMint
Yek’s Mark, for the wolvesboost YeksMark
Murane Ana’s herbs → Absolute Zero boostboost AbsoluteZero
Porph Bait (item), Porph Bait Scent (boost)item PorphBait, boost PorphBaitScent

The same step in VSM

VSM: the choice to watch Kasya, Node 7, runs into condition node 35, outlined in gold, then a Physical challenge, two action nodes, two narration nodes and action node 31, outlined in gold.
“Kasya inspected”, the first line of Scene 1. The condition reads the counter, the challenge decides what he notices, and the last action node stores that he watched her.VSMcondition reads inspectcounter → Physical challenge → action sets kasyainspected → inspectcounter +1
Chapter 3, Vanya’s Caravan · the first sequence if he lied
A notebook page headed Seq1 (lied). Three answers to Kasya run down three columns, each with its boost, its stress and the sequence where it comes back. Below, three answers about the pouch, each setting pouchstory to a different word.

The page lists three answers to Kasya and three stories about the pouch. Red boxes mark the boosts and variables.

On the pageIn VSM
Apologise, defend himself, or stay silentkasyachoice string: apology, defense, silent
Erinyes’ Whisper, a negative boostboost ErinyesWhisper
Janus’ Mask boost, for the Social challenge in Seq 3boost JanusMask
Kasya’s villain arc opensChapter3_kasyavillain global flag
pouchstory = heirloom, worthless or watchedpouchstory string, the same three values
Stress +1action node, AddStress

The same step in VSM

VSM: Node 250 forks into Ukral’s three answers, Nodes 253, 251 and 252. The apology runs through Kasya’s reply into action node 254, outlined in gold. The silence ends in action node 276, outlined in gold. The third answer runs into a Social challenge.
The three answers to Kasya. The apology and the silence each end in an action node that stores the answer. The third runs into a Social challenge and stores its answer further on.VSMkasyachoice = apology, boost ErinyesWhisper · kasyachoice = silent · off screen: kasyachoice = defense, Chapter3_kasyavillain
VSM: Vanya’s question, Node 39, forks into four answers. Three of them run into action nodes 334, 142 and 144, outlined in gold.
Vanya asks what is in the pouch. Three of the answers store a story.VSMpouchstory = heirloom · pouchstory = worthless · pouchstory = watched
Chapter 1, Birth of a Wound · the tags to track
A notebook page headed Birth of a Wound. Scene 1 lists Dutiful, Defiant and Distant. Below, a table of the tags to follow through Scenes 1 to 3, with Homin and Bacter beside it.

How Ukral answers his father in Scene 1, and which side of his family he leans to.

On the pageIn VSM
Dutiful, Defiant, Distantdutiful defiant distant int
#Homin, #Bacterhominscale bacterscale int, and the global flags Chapter1_HominUkral and Chapter1_BacterUkral

The player chooses an answer and resolves its challenge.

Ukral flees into the wild after his uncle Sungur Khan has his father killed. He has blood on his sleeves, and Kasya wants to know why. The player picks an answer and rolls against its difficulty. A failed roll sends the story down another branch.

The scene in the game: Kasya asks what he is running from, the choices are listed, and a Mental challenge tooltip shows the difficulty and the stress risk.
Before the player picks, the tooltip shows the roll: its difficulty and the stress a failure costs.

I wrote both versions of the conversation.

Kardiya · Chapter 2, Kasya’s camp (excerpt)

The forest · Kasya’s camp · night

Kasya(with a half smile)

Ukral? I think you’d better let the boy go, Munnan... I wouldn’t recommend holding a knife to the throat of Atroven’s Tigin.

He took a step back and glanced around, uneasy. Then he turned to Kasya and made a string of hand signs I couldn’t follow.

Kasya

He’s asking where your guards are. Are they close?

Player choice
  1. “There’s no one. I came here alone.”
  2. I couldn’t answer.
  3. “They’re... close.”
Kasya

I see. So... if your guards are that close, what were you running from?

Then Yarenay’s anxious voice made me turn.

Yarenay

Ukral, what happened to you?

Player choice
  1. I told them everything that happened in Atroven.
  2. “Nothing happened. Just... a walk in the night. I saw a wild animal.”

VSMThe lie is a Social roll. Pass it and Kasya keeps pressing. Fail it and the truth comes out here.Social challenge · ✓ → node 88 · ✗ → node 62

Kasya

And instead of going to your guards, instead of going back to Atroven, you went deeper into the forest?

The man shifted his grip on the knife. He was looking me straight in the eye.

Ukral

Yes.

Kasya

Then that must be mud on your hands, too.

It was the first time I looked at my hands. In the firelight they were covered in dark stains. Layer upon layer, up to my wrists, soaking the sleeves of my silk clothes an even darker colour.

Kasya

I’ve seen people run from things. What you ran from was no animal. Tell me what you’re running from. Talk.

Player choice
  1. I told them everything that happened in Atroven.
  2. “I can’t say.”
The two answers, line by line

A · He tells them

Telling the truth

VSMTelling the truth is a Mental roll. Fail it, and he hides the truth anyway.Mental challenge · ✓ → node 62 · ✗ → action 972 → node 502

Ukral

My father... Sungur Khan... the Eubacs... They killed him, my father... There was blood everywhere. On the floor... My father’s body.

VSMKasya +1, Yarenay +1.action 558

No order, no sense. As the words spilled out of me, the mocking smile on Kasya’s face fell apart.

Yarenay

That’s impossible. The Khan of Atroven, murdered by his own brother?

Kasya

A Homin spilling another Homin’s blood.

The stranger had already reached for his bag when Kasya’s voice nailed him to the spot.

Kasya

You’re not going anywhere, Munnan!

B · He keeps it

Refusing

VSMRefusing is a Social roll.Social challenge · ✓ → the lie holds · ✗ → Kasya keeps asking and the truth comes out

VSMIf it holds: Kasya −1, Yarenay −1, the Natural Liar boost, and the flag that later chapters read.action 559 · set Chapter2_ukrallied

Kasya

Then you’re free to do as you please, Tigin of Atroven. We’re in no position to help you.

Then she knelt beside the boy.

If the roll fails

Kasya

Can’t say, or won’t say?

Silence settled between us. The boy moaned softly where he lay. Kasya’s body turned toward him for a moment, but her eyes never left me.

Kasya

Two things, and then I won’t ask anything else. Do what you want. Is anyone after you? Are you being followed?

Ukral

I don’t think so. No one.

Kasya

Second question. Is Toygar Khan alive?

It landed like a punch to the face. Something I couldn’t control must have shown on my face, because Kasya pressed her lips together.

His face gives him away, and the scene joins the truth

I connected the answers to challenge and action nodes.

Each answer runs into a challenge node. Both routes to the lie end at one action node, which sets the flag.

The scene in VSM: I told them everything runs into a Mental challenge, I can’t say into a Social challenge. Both routes to the lie meet at action node 559, outlined in gold, then Kasya’s line and the next choice.
The truth goes through a Mental challenge and the refusal through a Social challenge. The action node stores the lie.VSMMental ✗ and Social ✓ → action 559 · set Chapter2_ukrallied

Earlier choices change dialogue and events in later chapters.

Chapters 3 and 4 check the flag eleven times. Five of those scenes are below.

Pick a choice to follow its path. Click any point to open it.
Chapter 2
Chapter 3
Chapter 4

A · The player chooses to tell the truthB · The player chooses to lieChapter2_ukrallied, saved after the choice and carried along

Kasya asks

The choice

Telling the truth is a Mental roll, lying is a Social roll. Fail either roll and you land on the other path.

Kasya says: Tell me what you’re running from. Talk. Two choices: I told them everything, with a Mental challenge tooltip, and I can’t say.
In the game
The VSM graph: Kasya’s question forks into a Mental challenge and a Social challenge. The routes to the lie meet at the action node that sets the flag.
Kasya’s question forks into two rolls. Both routes to the lie end where the flag is set.VSMMental challenge (truth) · Social challenge (refusal) · action 559 sets Chapter2_ukrallied

The game has 12 global flags. Chapter2_ukrallied is one of the six that a later chapter reads.

Global flag Set in Read in What it remembers
Chapter1_HominUkral Ch 1 Ch 2 He went to the rite as a Homin.
Chapter1_BacterUkral Ch 1, 2 Ch 1, 4 He took his mother’s Bakter side.
Chapter1_VisitedTerrace Ch 1 Ch 1, 2 He went up to the terrace.
Chapter1_Docsholder Ch 1 Ch 3, 4 He promised to carry the ledgers to Bilig.
Chapter2_ukrallied Ch 2 Ch 3, 4 He hid the truth from Kasya and Yarenay.
Chapter3_playedFATE Ch 3 Ch 3, 4 He sat down to the game at the fire.

The game text spells the name Bakter, and the flag names spell it with a c. Node numbers start again in each chapter, so node 559 is an action node in Chapter 2 and a condition node in Chapter 3.

I revised the narrative structure during development.

How the structure took shape: the notebook, the roguelite change, a starting item, the scale

I turned the notebook plans into playable scenes.

  1. Why follow a twelve-year-old?

    ProblemThe first draft gave the player no reason to care about a boy on the run.

    SolutionGive him a goal: reach Bilig in Ak Esherif.

  2. Teaching the dice

    ProblemThe dice had too many rules to explain at once.

    SolutionOpen them slowly, starting in Chapter 0’s fight with Sungur Khan.

Three pages from the notebook

I replaced the roguelite map with authored chapters.

My first design was a roguelite map of random encounters. It multiplied what we had to write, so the map went, and its dice, stress, death and Araf moved into the chapters.

The opening conversation determines Ukral’s starting item.

Items change the dice in a challenge. Before Ukral is born, a voice asks him Hamlet’s question, and his two answers pick his first item.

First answer · stat Unmasker Playwright Determinist (×0.8 to the other two)
Questions the question · Physical Strawberry, +1 Lactobus Milk, +1 Unbearable Responsibility, ×1.5
Asks again · Mental Currant, +1 Father’s Testament, +1 Forked Tongue, ×1.5
Wants to stay · Social Antique Carpet, +1 The Strange One, +1 Alkhemist’s Kit, ×1.5

The scene is broken down beat by beat, from script to VSM to game, on the Chapter 0 page.

These graphs show the implemented chapter structure.

Chapters 2 to 4 hold 3,023 nodes. The rings mark where the flag is set and checked.

The whole Chapter 3 graph in VSM, zoomed out: five long rows of nodes, with yellow rings on the ten conditions that read the flag.
Chapter 3 has 841 nodes and ten of the checks.
Chapters 2 and 4
The whole Chapter 2 graph in the VSM editor, zoomed out: eight long rows of nodes. A yellow ring marks the action node that sets the flag.
Chapter 2 has 1,130 nodes. The ring marks where the flag is set.
The whole Chapter 4 graph in VSM, zoomed out, with a yellow ring on the condition that reads the flag.
Chapter 4 has 1,052 nodes and the eleventh check.

These pages show the tutorial and earlier narrative plans.

Click the picture to zoom · click outside to close