POSTMORTEM


Overview The Forgotten Archive started as an experiment in puzzle-driven storytelling. My original idea was a sound-based game, but that quickly shifted into a text-based adventure about surviving a collapsing archive while racing against time. Developing it in Twine taught me a lot about how narrative, mechanics, and code interact. I also realized how much iteration, debugging, and simplification shape the final experience.

Initially, the game jumped straight to the Time Up ending because I forgot to initialize $gameOver to false. Fixing this small oversight not only solved the bug but reinforced a broader programming lesson: even one missing variable can derail an entire system.

Puzzle Variety and Flow Each section of the archive featured a different type of puzzle: math equations, ordering challenges, geometry problems, and riddles. This variety kept players engaged and provided a clear sense of progression. Pacing was important and I made sure that easier equations led into ordering logic, which escalated to abstract riddles, all culminating in the Vault’s multiple endings.

For this game, I didn’t want wrong answers to be overly punishing. Instead of resetting the player to the start, mistakes triggered environmental warnings:

:: CiphersWrong

The numbers blur, collapsing into nonsense. The ceiling groans overhead.  

[[Try again->Ciphers]]

Originally, I thought about forcing players to restart on errors, but testing showed it broke immersion. Letting players retry while layering on atmospheric cues made the archive feel alive and unstable without causing frustration. This taught me that failure can escalate tension rather than simply punish.

Multiple Endings and Player Choice

The Vault became the central payoff of the game, where players were given the opportunity to decide their own fate. Instead of endings being locked strictly behind which puzzles were solved, I allowed players to choose which ending they wanted once they reached the final chamber. They could flee with the tome, remain behind as the eternal librarian, be buried as the archive collapsed, or pursue the True Ending that preserved the archive’s memory.

What I liked about this approach was that it gave players agency at the very end, making the finale feel more personal. The puzzles still shaped the journey and built tension along the way, but the decision about how to conclude the story rested with the player. Allowing that choice turned the Vault into a narrative crossroads rather than a rigid outcome, and it reinforced the theme of legacy by letting players decide how their role in the archive would ultimately be remembered.

What Went Wrong

One of the earliest problems I ran into was with timers. In the final version, I used (live:) with (replace:) to show the countdown dynamically, but my first attempts never displayed the timer on screen. The logic was subtracting from $counter, but I hadn’t written anything to actually output the number back to the player. Even worse, I sometimes forgot to initialize $counter or $gameOver, which meant the timer either broke instantly or jumped straight to the “Collapse” ending. It was frustrating to see my passages skip without warning, but that taught me the importance of setting up variables correctly at the very start of a project.

Conditionals also gave me trouble. For example, in my True Ending code, I eventually used:

(if: $ciphersSolved is true and $shelvesSolved is true and $scrollSolved is true and $observatorySolved is true)[

    [[Enter the Vault (all mysteries solved)->TrueEnding]]

]

(else:)[

    [[Proceed to the Inner Vault->Vault]]

]

But my first attempts at this check were sloppy. I tried chaining conditionals without proper syntax, and Twine either broke completely or ignored half the logic. Getting the commas, is true checks, and nesting right was a painful trial-and-error process. This slowed development and made me more aware of how unforgiving Twine can be with syntax.

Narrative pacing was another issue. The original intro I wrote dragged on for too long and buried the urgency I wanted the player to feel. In the final draft, I cut it down to just a few lines:

The archive is collapsing and time is running out.

Ahead lie locked chambers sealed by puzzles and riddles.

Solve them, or be lost with the ruins.

This sharper version finally set the tone I was aiming for. That rewrite showed me that clarity in narrative works the same way as clarity in code; less clutter makes for a stronger experience.

Lastly, the Vault was tricky to design. Early on, I thought the endings should depend strictly on which puzzles the player solved, but that created too many logic loops and dead ends. The flowchart got messy fast, and playtesters felt boxed in. In the final version, I switched gears and let the player choose their ending directly in the Vault. That not only solved my branching chaos but also gave players more agency.

Lessons Learned

  1. Always initialize variables early. A missing $counter or $gameOver caused timers to break in ways that weren’t obvious until testing.
  2. Syntax precision matters. Twine is strict about commas, operators, and conditionals, and one small mistake can collapse entire passages.
  3. Keep the intro sharp. Overwriting with too much text diluted urgency. Brevity is often more powerful.
  4. Don’t punish players unnecessarily. Wrong answers now give atmospheric feedback instead of sending players back to square one, which makes the archive feel alive instead of cruel.
  5. Choice can be more impactful than logic. Letting players pick their ending in the Vault made for a stronger finale than tying everything strictly to solved puzzles.

Final Thoughts

Working on The Forgotten Archive was a great coding and narrative lesson. Every broken timer, collapsed conditional, and overwritten passage reminded me to step back, simplify, and focus on what actually creates tension and fun.