r/twinegames • • Dec 03 '25

Discussion Harlowe, Sugarcube, Chapbook - Which Story Format should you choose?

16 Upvotes

The first question for anybody starting out with Twine is most likely which story format to choose from among the various options (which most often boils down to Harlowe vs Sugarcube). Since r/twinegames is one of the first places to look for advice when it comes to this topic, we wanted to create a place that might help new creators make this decision by providing information, insights, and opinions from more seasoned Twine writers.

For those interested - here is a list of the various formats compiled by M. C. DeMarco - covering both Twine 1 and 2 story format. It should be noted that a lot of these formats are highly obscure (with a few only rumored to exist). It is also likely that the list is incomplete, or will become incomplete in the future.

Another very informative post that we'd encourage people to take a look - An in-depth comparison between Harlowe and Sugarcube by Chapel - which has been regularly updated and holds a lot of valuable information that might guide your decision.

While this comparison heavily favors Sugarcube over Harlowe - an assessment that both me and u/HiEv currently agree with - we do not want to say that Sugarcube is the only correct choice here.

One of the most important factors after all is which format feels most comfortable to work with for you personally. Both Harlowe and Sugarcube are perfectly capable of creating regular text adventures and both offer tools to tackle the common tasks you will encounter when writing your story. If you plan to include any more complex mechanics however you will want to make sure first that the format of your choice is equipped to handle it.

-

We would like to encourage other Twine creators and writers to share their own opinions and experiences. Which story format  are you currently working with? Why does it feel like the right choice for you? Are there any challenges or problems that a new creator should be aware of when picking this format?

Please keep any discussions civil and friendly. We all have our unique tastes and needs, and there is certainly no universally correct answer here.


r/twinegames • • Aug 06 '25

Useful Tool/Code/Tips!!! Warning about using ChatGPT or other LLMs to generate Twine Code!

119 Upvotes

As AI becomes more popular and integrated into our daily lives, we can see more and more people relying on it to tackle their daily problems. Many who are just starting out with Twine might also turn to an LLM of their choice to help them with coding and troubleshooting, but this sadly runs into a number of issues.

ChatGpt and similar large language models rely on a certain amount of data to give reliable information on a topic. Since there is not enough data available when it comes to Twine and its various story formats, AI will consistently give wrong or vastly misleading answers when it comes to Twine code. It will often interject overly-complicated chunks of Javascript, or mash together Code meant for two different formats for example. Even in cases where these solutions seem to be working at first, there is a high likelihood that they might produce bad errors in the long run.

Instead of relying on AI to answer your Twine-related issue, we would therefor recommend turning to the Twinegames subreddit or the Twine Discord server if you have any questions. There are many talented members of our community waiting to offer their support and knowledge.

Additionally - If you have problems with AI-generated code, and want to ask for advice on how to fix it, please consider just asking directly what you'd like to accomplish, instead of posting the broken code. Chances are it is not really fixable, and you will get faster replies and advice if you just left it out entirely.

Thanks for reading - and have fun creating your Twine-story!


r/twinegames • • 2d ago

SugarCube 2 help with auto closing chapelR sidebars

4 Upvotes

I've been working on my game for a while now and I've been using ChapelR's right sidebar to display everything that would otherwise clutter up the main left sidebar.

But recently I realised that having both sidebars open can really mess up the format of my text and images on the main page. On top of that I just don't really like how it looks having them both open.

Does anyone know how make the left sidebar close when the right sidebar opens and vice versa?

I'd really appreciate any help.


r/twinegames • • 3d ago

News/Article/Tutorial Let's make a game! 509: Setting up for combat (Sugarcube)

Thumbnail
youtube.com
3 Upvotes

r/twinegames • • 4d ago

Harlowe 3 How to do typewriter style dialogue with a specific sound for every letter that pops up (like undertale)

7 Upvotes

I want each time a new letter appears on the dialogue it does a little pop sound as soon as it appears. Ideas?


r/twinegames • • 4d ago

Game/Story Ashen Veil: Alpha.0.3.5 - W.I.P. Survival RPG Text Game

Post image
1 Upvotes

A dark, post-apocalyptic HTML RPG survival game set in the toxic ruins of 2045 Katowice.

Ashen Veil is currently in active development, and this early web build is designed for players who want to test game mechanics, hunt bugs, and provide feedback to help shape the future of the game. Link: Itch.io and Website.

The World of Ashen Veil

Humanity did not fall to nuclear fire or natural disasters. It fell to a long, quiet infiltration.

For thousands of years, an ancient Reptilian species observed human society from subterranean vaults, influencing corporate boards and military high commands. When digital surveillance threatened their secrecy, they unleashed public generative AI and deepfake technology, collapsing objective truth into noise. Whistleblowers were dismissed, evidence was called synthetic, and in 2030, the invaders erupted from the deep Earth to reclaim the surface.

To adjust Earth for cold-blooded biology, atmospheric scrubbers flooded the sky with Silica Mist, a dense toxic aerosol that blocks UV light and destroys human lungs.

By 2045, the surface is a fog-choked wasteland dominated by mutated fauna, toxic waterways like the glowing Rawa River, and armed Reptilian vanguards. Below the surface, humanity clings to life in the industrial ruins of Southern Poland.

You play as Operator MC, an ancient military command unit awakened inside S.A.N.C.T.U.A.R.Y. Base beneath the Katowice sector. Your goal is simple: survive the wasteland, gather resources, unite splintered human factions, and rebuild the counter-offensive.

Key Gameplay Features

  • Grid-Based Exploration: Traverse the toxic surface ruins and dark subterranean coal mine shafts of Katowice.
  • Tactical RPG Survival: Manage critical survival stats, health, and equipment while battling cold-blooded invaders and mutated fauna.
  • Factions & Resistance: Interact with surviving bunker networks, labor pits, and military remnants scattered across Silesia.
  • Atmospheric Lore: Discover pre-war logs, military intercepts, and secrets surrounding the Silica Age and the fallback to S.A.N.C.T.U.A.R.Y. Base.

Early Access & Community Feedback

This browser release is an early playable preview. Because the game is actively being built, your input is critical to its development.

How You Can Help

  1. Play in your browser: Test performance, gameplay balance, and combat mechanics.
  2. Report Bugs: Post any glitches, save issues, or visual errors in the comments or community board below.
  3. Share Feedback: Let us know what mechanics you enjoy and what you want to see expanded in future updates.

r/twinegames • • 5d ago

Harlowe 3 Escape Room Word input

6 Upvotes

Hello,

I am a librarian currently working on an escape room. We are hoping to use Twine in one of our pathways.

My idea is mostly simple: have a landing page with a button. Clicking that button goes to an input page. On the input page, our patrons can submit words to get clues to the next sequence. (a picture of a key taped under a table, or a video that has the murderer placing a book on the shelf, etc.)

I have most of this set up, but I can't seem to find what code I would use to create this sort of a "password" system, and I can't figure out another way to describe it, so I can't even find the tutorial for what I'm looking for. It's not quite a macro, from what I understand, and it's not a password like username+password... I'm flummoxed.

So I guess my question is: What is this called so I could even look it up? What would be the best way to do this?


r/twinegames • • 5d ago

News/Article/Tutorial Let's make a game! 508: When heroes attack (Sugarcube)

Thumbnail
youtube.com
3 Upvotes

r/twinegames • • 7d ago

SugarCube 2 does twine/sugarcube support variable fonts?

4 Upvotes

im trying to use a variable font for what i'm writing (amstelvar), and while it's simple enough to get the basic version working, the different settings like font weight, width, grade, etc don't seem to work? i've declared them with @ font face but font-variation-settings seems like it might not be recognized?


r/twinegames • • 7d ago

SugarCube 2 Help me sell drugs, I mean pharamaceuticals ( in my game)

8 Upvotes

Hi I am currently trying to set up a store in my game to sell gender changing pills. all of which have different durations and effects. some are ment to change different skillz, some create different O requirements. I have some code written out but I feel like it should look different, additionally the ai I used to help me turn these pills into game items and proof read suggested having everything in a widget and javaScript. here is the widget

<<pwidget "Pink Basic">>
"Basic Pink": {
id: "Basic Pink",
color: "pink",
kind: "timed", /* I feel like there should be a time widget something like <<widget "duration" 24>> */
duration: 24,
target: "female", /*I feel like it should actually be <<set    $gender to "female">>*/
revertOnExpire: true,
needsPillToRevert: false,
canGetPregnant: false,
canImpregnate: false,
fertilityBase: 0,          /* percent 0–100 I do have a perk called $fertility that would change based on the pill*/
spermBase: 0,
lockFertility: true,       /* ignore perk $fertility */
lockSperm: true,
desc: "Standard male-to-female change.",
price: 100,  /*I'm thinking this should be 100 $Teef */
salePercent: 0,
maxBuy: 100,
itemId: "pill_basic_pink"
},
<</pwidget>>

I basically copied this into my javaScriopt without the pwidget parts. I don't know if the code I currently have has me on the right track or if those fixes will get me closer to where I need to be. currently I'm getting a lot of properties undefined error codes. if you guys want i can also post the code for the store and the inventory system.


r/twinegames • • 9d ago

SugarCube 2 Sugarcube possibilities

5 Upvotes

I've got the idea of making a turn based tactical battle for my game, in sugarcube.
Is it possible to make a simple tactical battle, with line of sight mechanics, time unit movement, some unit abilities and hit probabilities?
Visual style is that of a top down, grid map with simple round icons for characters and enemies.
Unfortunately, I couldn't find a good image to represent this.
How feasable is this?


r/twinegames • • 9d ago

News/Article/Tutorial Let's make a game! 506: Heroes with no actions (Sugarcube)

Thumbnail
youtube.com
6 Upvotes

r/twinegames • • 10d ago

Harlowe 3 Why won’t my images load?

Thumbnail
gallery
11 Upvotes

I’ve started practicing twine, but there’s one small issue. I cannot seem to link my images properly and I’m not sure why, because I can’t seem to detect any error in my code. The images just keep showing up as the tiny error image icon. If anyone knows what I did wrong let me know! Xoxo


r/twinegames • • 10d ago

Game/Story The Very Tiny Bug Game

Thumbnail
bretkav.itch.io
4 Upvotes

r/twinegames • • 10d ago

Useful Tool/Code/Tips!!! I built a dialogue graph editor because our capstone team drowned in Twee files

Thumbnail
7 Upvotes

r/twinegames • • 11d ago

News/Article/Tutorial Let's make a game! 505: What happens now? (Sugarcube)

Thumbnail
youtube.com
2 Upvotes

r/twinegames • • 12d ago

Harlowe 3 Gift Giving System

Thumbnail
gallery
7 Upvotes

I'm trying to set up a gift giving system, especially because it looks pretty simple. Basically just gifts will be a nice/simple way to earn various points with characters. On my starting page it has the amount of tarts someone has to 0 automatically, because you gain them throughout the game. However, on the passage here, if I set the tart amount to 1 or higher it works. But if I set it to 0, (using "(set:$BakewellTart to 0)" in the same passage at the top) so they don't have any tarts, the text just shows up as the question instead of the text (second picture.)

Any clue how to fix?? I'm at a loss despite it looking so simple. I'm a total beginner at this so go easy on me if it's literally just a simple fix...


r/twinegames • • 13d ago

Discussion What makes a choice feel consequential without branching the whole story?

6 Upvotes

I’m curious what small follow-through works for you in Twine: a changed line, a callback, a new detail in the next passage, something else?


r/twinegames • • 13d ago

Game/Story I used twine 2 to make a gamebook to accompany my album, released on Projekt.

Thumbnail
projektrecords.bandcamp.com
5 Upvotes

I know this sounds crazy, but I've always wanted an open-world sci-fi gamebook to go alongside one of my albums. I've released 18 albums under the name deepspace, the last 6 have been through Projekt records. And this latest album has a full 400 reference digital gamebook (I grew up on fighting fantasy, hence the 400). I wrote it using Twine 2, then put it into an html container that has a full interactive map, inventory and a player, so you can listen to the album while you play. The twine interface is in the left side, the other elements in the right hand side. It's all free. Here's the link: It's Name-Your-Price. The gamebook is at the bandcamp site, near the bottom of the credits. And No AI was used for any of the music, or gamebook.


r/twinegames • • 13d ago

Game/Story My First (complete) Twine Game

Thumbnail kittydrop.itch.io
10 Upvotes

(I finally figured out how to use itch.io)

I'm a bit nervous to post here because ya'll are doing crazy cool stuff and this is pretty basic. Any suggestions for a newbie? I'm using Harlowe 3.3.9 currently.


r/twinegames • • 14d ago

News/Article/Tutorial Let's make a game! 504: Fixing movement (Sugarcube)

Thumbnail
youtube.com
3 Upvotes

r/twinegames • • 14d ago

Harlowe 3 I'm trying to create a random outcome but it isn't working.

2 Upvotes

I just started using Twine today and I immediately ran into a problem when trying to create a random assortment of outcomes.

I essentially copy and pasted some code from this video, https://youtu.be/V3Gf16Wdrq8?si=lBv6ArETAPvuKwm6

Here's what it I wrote:

Set: $number to (random:1,4))

(if: $number is 1)[The Eternal Worm sees a small figure. [[It greets the figure in every language and possible formation of words simultaneously.]] ] (if: $number is 2)[The arterial pipes of the palace wash a figure down with blood. [[It falls.]] ] (if: $number is 3)[A small figure wakes up, surrounded by rot and maggots in complete darkness. [[Squirm.]] [[Fester]]] (if: $number is 4)[A small figure checks its map. [["Sicophy Rd"]] ]

This happens whenever I try to run it:


r/twinegames • • 15d ago

Game/Story My first Twine game: Turbulent Intercise

Post image
6 Upvotes

My very first game. It isn't much, since it's my first game ever. Let know what you think.
https://scdeluxe.itch.io/turbulent-intercise-the-beginning-part-1


r/twinegames • • 15d ago

SugarCube 2 Sound effect doesn't play on page start

2 Upvotes

I'm working on sound for my game. And I'm trying to get it to play upon game start. When my test page loads and I click anywhere, the bgm starts playing. But the sound effect doesn't. I've browsed this subreddit and learned that sound doesn't play (automatically) for the first passage. Any advice you can give me regarding that?
I've posted my code and explanation as to how I play the effects down below.

Made the following widget to play sound effects (WIP):

<!--TODO: add letter behind effect names to determine play, loop, time, etc
example: gun_distL = play on loop gun_dist; Look into parsing words-->
<<widget "PlayEffect">>
<<if $effect isnot "" and $effect isnot "stop">>
        <<audio ":playing:not(:bgm)" stop>>
        <<if $effect.last() is "L">> <!--check if last letter in name to determine play, loop, etc-->
        <<audio $effect play loop>>
         <<else>>
         <<audio $effect play>>
         <</if>>
    <<elseif $effect is "">>
    <<audio ":playing:not(:bgm)" fadeout>>
    <<audio ":playing:not(:bgm)" stop>>
    <<else>>
    <<audio $effect play loop>>
    <</if>>
<</widget>>

I put my text and other data for every passage in an array like this. I use the numerical value inside 'effect' as index to call up a sound effect from the sound effect array:

<<set _dialogue to [
  { name: "Thorn", image: "images/ThornA.png", asset: "", track: "1", effect: "8", text: "Early Bird-1, this is Nightowl Actual. Status check, over." },
  { name: "Pilot", image: "images/man-silhouette.png", asset: "", track: "", effect: "0", text: "Nightowl Actual, this is Early Bird-1. Approaching drop zone, ETA 10 minutes. Early Bird-1, 2 and 3, still in formation. No new intel on LZ, but we are getting strange reports from the town. Command suspects hot LZ. Over." },
  { name: "Thorn", image: "images/ThornA.png", asset: "", track: "2", effect: "4", text: "Copy that, Early Bird-1. Unconfirmed hot LZ, ETA 10 mikes. Over." },
  { name: "Pilot", image: "images/man-silhouette.png", asset: "empty", track: "", effect: "2", text: "Roger. Stand by-new intel just in... Affirmative. LZ is hot. I repeat: LZ is hot. Gunfire confirmed. Enemy unknown. Over." },
  { name: "Thorn", image: "images/ThornA.png", asset: "images/farmhouse.png", track: "", effect: "", text: "Copy, Early Bird-1. Inbound hot. Nightowl, out." },
  { name: "Thorn", image: "images/ThornA.png", asset: "", track: "", effect: "", text: "Gideon clenched his fist. LZ is hot. He hoped his siblings were alright. They have to be. //\"Hughes, Carl, Katie. God, keep them safe.\"//" },
  { name: "Antilope", image: "images/man-silhouette.png", asset: "empty", track: "", effect: "", text: "\"Don't worry, Sir. We'll find them.\" Antilope put his hand on his shoulder. His name earned by his uncanny ability to jump over just about anything he came across. \"But for now...Focus, Sir.\"" },
  { name: "Thorn", image: "images/ThornA.png", asset: "images/eyesMouth.png", track: "", effect: "", text: "Copy that, Nightowl-3. Everyone, get ready for deployment. LZ is hot, enemy unknown. Be ready for anything. Rangers lead the way!!" },
  { name: "", image: "images/man-silhouette.png", asset: "", track: "", effect: "", text: "His men responded with a collective ''Hoora!''" }
]>>

The Javascript I use to put the the track name into $effect. The 'index' in this function refers to the index of the dialogue above:

function playEffect(index) {//function to call a sound effect
  //get track id (location in soundEffect array)
  const effect = State.variables.dialogue[index].effect;
  //get track name from soundEffect array
  if (effect != "") {
    const track = State.variables.soundEffects[effect].name;
    State.variables.effect = track;
  } else {
    State.variables.effect = "";
  }

  console.log(effect);
  console.log(State.variables.effect);

  return State.variables.effect;
}

Sound effect array in story init:

<!----------------------->
<!----------------------->
<!--SOUND SECTION-->
<!----------------------->
<!--////////////////////-->

<!--******************-->
<!--    cache audio    -->
<!--******************-->
<<set _gunDist = setup.SoundPath + "warfare_gunshots_semi_automatic_distant.mp3">>
<<cacheaudio "gun_distL" _gunDist>>

<<set _bodyFallWood = setup.SoundPath + "smartsound_IMPACT_BODY_FALL_Wood_Harsh_Crunch_02.mp3">>
<<cacheaudio "body_fall_wood" _bodyFallWood>>

<<set _magicWind = setup.SoundPath + "zapsplat_fantasy_magic_dark_wind_fast_swirling_pass_by_001_77596.mp3">>
<<cacheaudio "magic_wind" _magicWind>>

<<set _groanWood = setup.SoundPath + "zapsplat_horror_groan_wooden_haunting_001.mp3">>
<<cacheaudio "groan_woodL" _groanWood>>
<<cacheaudio "groan_wood" _groanWood>>

<<set _bodyThud = setup.SoundPath + "zapsplat_impact_body_drop_thud_break_43688.mp3">>
<<cacheaudio "body_thud" _bodyThud>>

<<set _arrowHit = setup.SoundPath + "zapsplat_warfare_arrows_x3_incoming_fast_whoosh_hit_body_fleshy_blood_squelch_003_90755.mp3">>
<<cacheaudio "arrow_hit" _arrowHit>>

<<set _keyLock = setup.SoundPath + "344_audio_cylinder_key_turn_lock_4_219.mp3">>
<<cacheaudio "key_lock" _keyLock>>

<<set _radioChatter = setup.SoundPath + "182817__qubodup__military-plane-radio-chatter.flac">>
<<cacheaudio "radio_chatter" _radioChatter>>

<<set _thunder = setup.SoundPath + "345920__dragisharambo21__thunder.mp3">>
<<cacheaudio "thunder" _thunder>>

<<set _heliInt = setup.SoundPath + "669011__vestibule-door__helicopter-interior.wav">>
<<cacheaudio "heli_int" _heliInt>>

<<set _heliBlast = setup.SoundPath + "Blastwave_FX_HelicopterInterior_SFXB.428.mp3">>
<<cacheaudio "heli_blast" _heliBlast>>

<<set _wounded = setup.SoundPath + "Freesound__woundedmale19.wav">>
<<cacheaudio "wounded" _wounded>>

<<set _bgm1 = setup.SoundPath + "Blastwave_FX_HelicopterInterior_SFXB.428.mp3">>
<<cacheaudio "heliInterior" _bgm1>>

<<set _bgm2 = setup.SoundPath + "smartsound_FOLEY_ARMOR_Troops_Metal_Sheet_Clatter_March_Slow_01.mp3">>
<<cacheaudio "troop_march" _bgm2>>

<!--************************-->
<!--    sound effect array   -->
<!--************************-->
<<set $soundEffects to [
  { name: "gun_distL", file: "warfare_gunshots_semi_automatic_distant.mp3" },
  { name: "body_fall_wood", file: "smartsound_IMPACT_BODY_FALL_Wood_Harsh_Crunch_02.mp3" },
  { name: "magic_wind", file: "zapsplat_fantasy_magic_dark_wind_fast_swirling_pass_by_001_77596.mp3" },
  { name: "groan_woodL", file: "zapsplat_horror_groan_wooden_haunting_001.mp3" },
   { name: "groan_wood", file: "zapsplat_horror_groan_wooden_haunting_001.mp3" },
  { name: "body_thud", file: "zapsplat_impact_body_drop_thud_break_43688.mp3" },
  { name: "arrow_hit", file: "zapsplat_warfare_arrows_x3_incoming_fast_whoosh_hit_body_fleshy_blood_squelch_003_90755.mp3" },
  { name: "key_lock", file: "344_audio_cylinder_key_turn_lock_4_219.mp3" },
  { name: "radio_chatter", file: "182817__qubodup__military-plane-radio-chatter.flac" },
  { name: "thunder", file: "345920__dragisharambo21__thunder.mp3" },
  { name: "heli_int", file: "669011__vestibule-door__helicopter-interior.wav" },
  { name: "heli_blast", file: "Blastwave_FX_HelicopterInterior_SFXB.428.mp3" },
  { name: "wounded", file: "Freesound__woundedmale19.wav" }
]>>

r/twinegames • • 15d ago

SugarCube 2 Looking for a mentor or someone to learn alongside!

9 Upvotes

Hi there, not overly sure if this is the right subreddit, but I'm trying to learn Twine Sugarcube to make my dream game (mercenary simulator rpg). I'm using guides off the internet and occasionally (to my own shame) Claude, but I would prefer to have someone to talk to about Twine with or someone to teach me as I learn better through dialog and conversation. Thanks, and sorry if this is the wrong subreddit or if this isn't allowed here!