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.

- 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.
1PaperI planned it in my notebook.
2GameThe player answers and rolls.- 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.
4VSMEach answer runs into a challenge node.
5PayoffsLater scenes check it 11 times.
I planned the choice and its consequences on paper.

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 page | In VSM |
|---|---|
| If Ukral lies: his relation with Kasya and Yarenay drops | Chapter2_ukrallied global flag, Kasya −1, Yarenay −1 |
| If he tells the truth: the relation rises | Kasya +1, Yarenay +1 |
| But Munnan reports him to Hostguard | Chapter 3 reads the flag: Hostguard raids the caravan |
Three more pages from the notebook
| On the page | In VSM |
|---|---|
| Kasya, Yarenay, Cardis, Child inspected | kasyainspected yarenayinspected cardisinspected childinspected bool, counted in inspectcounter int |
| Clue +1, for Ak Esherif and for the wolves | akesherifclue int, wolvesclue int |
| Ukral lied | Chapter2_ukrallied global flag |
| Yarenay’s Gift → Fresh Mint boost in Scene 4 | item Yarenays Gift, boost FreshMint |
| Yek’s Mark, for the wolves | boost YeksMark |
| Murane Ana’s herbs → Absolute Zero boost | boost AbsoluteZero |
| Porph Bait (item), Porph Bait Scent (boost) | item PorphBait, boost PorphBaitScent |

The page lists three answers to Kasya and three stories about the pouch. Red boxes mark the boosts and variables.
| On the page | In VSM |
|---|---|
| Apologise, defend himself, or stay silent | kasyachoice string: apology, defense, silent |
| Erinyes’ Whisper, a negative boost | boost ErinyesWhisper |
| Janus’ Mask boost, for the Social challenge in Seq 3 | boost JanusMask |
| Kasya’s villain arc opens | Chapter3_kasyavillain global flag |
| pouchstory = heirloom, worthless or watched | pouchstory string, the same three values |
| Stress +1 | action node, AddStress |
The same step in VSM
kasyachoice = apology, boost ErinyesWhisper · kasyachoice = silent · off screen: kasyachoice = defense, Chapter3_kasyavillainpouchstory = heirloom · pouchstory = worthless · pouchstory = watchedThe 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.

I wrote both versions of the conversation.
The forest · Kasya’s camp · night
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.
He’s asking where your guards are. Are they close?
- “There’s no one. I came here alone.”
- I couldn’t answer.
- “They’re... close.”
I see. So... if your guards are that close, what were you running from?
Then Yarenay’s anxious voice made me turn.
Ukral, what happened to you?
- I told them everything that happened in Atroven.
- “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
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.
Yes.
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.
I’ve seen people run from things. What you ran from was no animal. Tell me what you’re running from. Talk.
- I told them everything that happened in Atroven.
- “I can’t say.”
The two answers, line by line
A · He tells them
VSMTelling the truth is a Mental roll. Fail it, and he hides the truth anyway.Mental challenge · ✓ → node 62 · ✗ → action 972 → node 502
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.
That’s impossible. The Khan of Atroven, murdered by his own brother?
A Homin spilling another Homin’s blood.
The stranger had already reached for his bag when Kasya’s voice nailed him to the spot.
You’re not going anywhere, Munnan!
B · He keeps it
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
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
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.
Two things, and then I won’t ask anything else. Do what you want. Is anyone after you? Are you being followed?
I don’t think so. No one.
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.
Mental ✗ and Social ✓ → action 559 · set Chapter2_ukralliedEarlier choices change dialogue and events in later chapters.
Chapters 3 and 4 check the flag eleven times. Five of those scenes are below.
A · The player chooses to tell the truthB · The player chooses to lieChapter2_ukrallied, saved after the choice and carried along
The choice
Telling the truth is a Mental roll, lying is a Social roll. Fail either roll and you land on the other path.
Mental challenge (truth) · Social challenge (refusal) · action 559 sets Chapter2_ukralliedRight away
Both answers change the relations at once. The lie also sets the flag.
Waking up
Ukral wakes in Vanya’s caravan. The flag decides who is sitting with him.
The game table
Munnan heard the truth in the forest. If Ukral told it, Munnan won’t sit at a table with him.
Lying to Vanya
Vanya asks who he is. A lie is a Social roll, and the flag makes it one step harder.
The last morning
If Ukral told the truth, Hostguard came in the night looking for a yellow-eyed boy, and Munnan’s cart at the front is empty.
Ak Esherif
A stranger in Ak Esherif talks about Vanya. What he heard depends on the flag.
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.
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.
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.






































