June 2026 Writer Support Thread

Goals are simple this months:

Get anything written. Health is kicking my butt and with no way to pay the bills I’m souping by.

But I aim to get something done.

16 Likes

Settled on a structure for the remainder of my game.

There’s a fairly linear sequence where the bad guys catch up with the good guys, as well as a sort of delayed-reaction segment where the consequences of decisions earlier in the timeline have to be dealt with. If you do it properly, you get more time left in the hub world before the bad guys arrive. Eventually, however, they do, and you have to do a negotiation scene which determines a lot of the rest of the game. From there, you have a choice on how you tackle the final two bad guys which branches a little bit, and then there’s an extended epilogue that explores the consequences of a very wide variety of choices.

The linear “AA, BA, CA, AB, BB, CB” structure was actually how I originally structured an earlier chapter before I completely shattered it apart and gave the player control over the order in which things happen. Not doing that here.

I originally planned to have it be a lot more crazy and spiralling but if I want to get this game actually finished this is the best way to knuckle down and do it.

17 Likes

The CoG style guide says to use second person in narrative, but first person in choice option text. E.g.

The dragon raises its claws in a boxing stance.

#I take it down with jiujitsu.
#I consider that if it breathes acid now, it will damage its own claws.
#I leave.

I tried this out a bit, but it sounds worse? It always sounds better either as a ‘You’ sentence or as an imperative. I wonder why they do this. Maybe it forces the writer to always move the plot forward?

9 Likes

All the CoGsters are big D&D players, and this gives the implicit vibe of a D&D session – everything before the choice is the DM telling you what’s going on, and the #options are the PC telling the DM what “I” the character does next. It’s one way to generate a sense of cooperative storytelling, where the reader is an active co-creator of the story.

24 Likes

I find first person for the options natural - it’s the player responding to the game text with what their character is doing or thinking.

19 Likes

I remember someone wanted to see the code I used for searching terms, so I’ve pasted it below devoid of my language terms.

In summary, the search code:
• searches for terms including spaces and dashes
• takes the first letter of a term to search just those terms beginning with said first letter
• takes the term and capitalizes each letter

this is long
*label sub_search_resets
*set search_term_st ""
*set search_term_compare ""
*set space " "
*set dash "-"
*set search_position 1
*set search_letter ""
*set search_term_first_letter ""
*return

*label sub_all_caps
*temp search_letter ""
*temp search_term_first_letter ""
*temp search_length length(search_term_st)
*comment Search position is the numerical representation of which position the computer reads.

*set search_letter search_term_st#search_position
*if (search_position = 1) and (search_position <= search_length)
	*if (search_letter = "a") or (search_letter = "A")
		*set search_term_compare "A"
		*set search_term_first_letter search_term_compare
		*set search_position +1
		*goto search_cap2
	*elseif (search_letter = "b") or (search_letter = "B")
		*set search_term_compare "B"
		*set search_term_first_letter search_term_compare
		*set search_position +1
		*goto search_cap2
	*elseif (search_letter = "c") or (search_letter = "C")
		*set search_term_compare "C"
		*set search_term_first_letter search_term_compare
		*set search_position +1
		*goto search_cap2
	*elseif (search_letter = "d") or (search_letter = "D")
		*set search_term_compare "D"
		*set search_term_first_letter search_term_compare
		*set search_position +1
		*goto search_cap2
	*elseif (search_letter = "e") or (search_letter = "E")
		*set search_term_compare "E"
		*set search_term_first_letter search_term_compare
		*set search_position +1
		*goto search_cap2
	*elseif (search_letter = "f") or (search_letter = "F")
		*set search_term_compare "F"
		*set search_term_first_letter search_term_compare
		*set search_position +1
		*goto search_cap2
	*elseif (search_letter = "g") or (search_letter = "G")
		*set search_term_compare "G"
		*set search_term_first_letter search_term_compare
		*set search_position +1
		*goto search_cap2
	*elseif (search_letter = "h") or (search_letter = "H")
		*set search_term_compare "H"
		*set search_term_first_letter search_term_compare
		*set search_position +1
		*goto search_cap2
	*elseif (search_letter = "i") or (search_letter = "I")
		*set search_term_compare "I"
		*set search_term_first_letter search_term_compare
		*set search_position +1
		*goto search_cap2
	*elseif (search_letter = "j") or (search_letter = "J")
		*set search_term_compare "J"
		*set search_term_first_letter search_term_compare
		*set search_position +1
		*goto search_cap2
	*elseif (search_letter = "k") or (search_letter = "K")
		*set search_term_compare "K"
		*set search_term_first_letter search_term_compare
		*set search_position +1
		*goto search_cap2
	*elseif (search_letter = "l") or (search_letter = "L")
		*set search_term_compare "L"
		*set search_term_first_letter search_term_compare
		*set search_position +1
		*goto search_cap2
	*elseif (search_letter = "m") or (search_letter = "M")
		*set search_term_compare "M"
		*set search_term_first_letter search_term_compare
		*set search_position +1
		*goto search_cap2
	*elseif (search_letter = "n") or (search_letter = "N")
		*set search_term_compare "N"
		*set search_term_first_letter search_term_compare
		*set search_position +1
		*goto search_cap2
	*elseif (search_letter = "o") or (search_letter = "O")
		*set search_term_compare "O"
		*set search_term_first_letter search_term_compare
		*set search_position +1
		*goto search_cap2
	*elseif (search_letter = "p") or (search_letter = "P")
		*set search_term_compare "P"
		*set search_term_first_letter search_term_compare
		*set search_position +1
		*goto search_cap2
	*elseif (search_letter = "q") or (search_letter = "Q")
		*set search_term_compare "Q"
		*set search_term_first_letter search_term_compare
		*set search_position +1
		*goto search_cap2
	*elseif (search_letter = "r") or (search_letter = "R")
		*set search_term_compare "R"
		*set search_term_first_letter search_term_compare
		*set search_position +1
		*goto search_cap2
	*elseif (search_letter = "s") or (search_letter = "S")
		*set search_term_compare "S"
		*set search_term_first_letter search_term_compare
		*set search_position +1
		*goto search_cap2
	*elseif (search_letter = "t") or (search_letter = "T")
		*set search_term_compare "T"
		*set search_term_first_letter search_term_compare
		*set search_position +1
		*goto search_cap2
	*elseif (search_letter = "u") or (search_letter = "U")
		*set search_term_compare "U"
		*set search_term_first_letter search_term_compare
		*set search_position +1
		*goto search_cap2
	*elseif (search_letter = "v") or (search_letter = "V")
		*set search_term_compare "V"
		*set search_term_first_letter search_term_compare
		*set search_position +1
		*goto search_cap2
	*elseif (search_letter = "w") or (search_letter = "W")
		*set search_term_compare "W"
		*set search_term_first_letter search_term_compare
		*set search_position +1
		*goto search_cap2
	*elseif (search_letter = "x") or (search_letter = "X")
		*set search_term_compare "X"
		*set search_term_first_letter search_term_compare
		*set search_position +1
		*goto search_cap2
	*elseif (search_letter = "y") or (search_letter = "Y")
		*set search_term_compare "Y"
		*set search_term_first_letter search_term_compare
		*set search_position +1
		*goto search_cap2
	*elseif (search_letter = "z") or (search_letter = "Z")
		*set search_term_compare "Z"
		*set search_term_first_letter search_term_compare
		*set search_position +1
		*goto search_cap2
	*else
		*set search_term_first_letter search_term_compare
		*goto search_cap2

*label search_cap2
*if (search_position > search_length)
	*return
*elseif (search_position > 1) and (search_position <= search_length)
	*set search_letter search_term_st#search_position
	
	*if (search_letter = "a") or (search_letter = "A")
		*set search_letter "A"
		*set search_term_compare search_term_compare&search_letter
		*set search_position +1
		*goto search_cap2
	*elseif (search_letter = "b") or (search_letter = "B")
		*set search_letter "B"
		*set search_term_compare search_term_compare&search_letter
		*set search_position +1
		*goto search_cap2
	*elseif (search_letter = "c") or (search_letter = "C")
		*set search_letter "C"
		*set search_term_compare search_term_compare&search_letter
		*set search_position +1
		*goto search_cap2
	*elseif (search_letter = "d") or (search_letter = "D")
		*set search_letter "D"
		*set search_term_compare search_term_compare&search_letter
		*set search_position +1
		*goto search_cap2
	*elseif (search_letter = "e") or (search_letter = "E")
		*set search_letter "E"
		*set search_term_compare search_term_compare&search_letter
		*set search_position +1
		*goto search_cap2
	*elseif (search_letter = "f") or (search_letter = "F")
		*set search_letter "F"
		*set search_term_compare search_term_compare&search_letter
		*set search_position +1
		*goto search_cap2
	*elseif (search_letter = "g") or (search_letter = "G")
		*set search_letter "G"
		*set search_term_compare search_term_compare&search_letter
		*set search_position +1
		*goto search_cap2
	*elseif (search_letter = "h") or (search_letter = "H")
		*set search_letter "H"
		*set search_term_compare search_term_compare&search_letter
		*set search_position +1
		*goto search_cap2
	*elseif (search_letter = "i") or (search_letter = "I")
		*set search_letter "I"
		*set search_term_compare search_term_compare&search_letter
		*set search_position +1
		*goto search_cap2
	*elseif (search_letter = "j") or (search_letter = "J")
		*set search_letter "J"
		*set search_term_compare search_term_compare&search_letter
		*set search_position +1
		*goto search_cap2
	*elseif (search_letter = "k") or (search_letter = "K")
		*set search_letter "K"
		*set search_term_compare search_term_compare&search_letter
		*set search_position +1
		*goto search_cap2
	*elseif (search_letter = "l") or (search_letter = "L")
		*set search_letter "L"
		*set search_term_compare search_term_compare&search_letter
		*set search_position +1
		*goto search_cap2
	*elseif (search_letter = "m") or (search_letter = "M")
		*set search_letter "M"
		*set search_term_compare search_term_compare&search_letter
		*set search_position +1
		*goto search_cap2
	*elseif (search_letter = "n") or (search_letter = "N")
		*set search_letter "N"
		*set search_term_compare search_term_compare&search_letter
		*set search_position +1
		*goto search_cap2
	*elseif (search_letter = "o") or (search_letter = "O")
		*set search_letter "O"
		*set search_term_compare search_term_compare&search_letter
		*set search_position +1
		*goto search_cap2
	*elseif (search_letter = "p") or (search_letter = "P")
		*set search_letter "P"
		*set search_term_compare search_term_compare&search_letter
		*set search_position +1
		*goto search_cap2
	*elseif (search_letter = "q") or (search_letter = "Q")
		*set search_letter "Q"
		*set search_term_compare search_term_compare&search_letter
		*set search_position +1
		*goto search_cap2
	*elseif (search_letter = "r") or (search_letter = "R")
		*set search_letter "R"
		*set search_term_compare search_term_compare&search_letter
		*set search_position +1
		*goto search_cap2
	*elseif (search_letter = "s") or (search_letter = "S")
		*set search_letter "S"
		*set search_term_compare search_term_compare&search_letter
		*set search_position +1
		*goto search_cap2
	*elseif (search_letter = "t") or (search_letter = "T")
		*set search_letter "T"
		*set search_term_compare search_term_compare&search_letter
		*set search_position +1
		*goto search_cap2
	*elseif (search_letter = "u") or (search_letter = "U")
		*set search_letter "U"
		*set search_term_compare search_term_compare&search_letter
		*set search_position +1
		*goto search_cap2
	*elseif (search_letter = "v") or (search_letter = "V")
		*set search_letter "V"
		*set search_term_compare search_term_compare&search_letter
		*set search_position +1
		*goto search_cap2
	*elseif (search_letter = "w") or (search_letter = "W")
		*set search_letter "W"
		*set search_term_compare search_term_compare&search_letter
		*set search_position +1
		*goto search_cap2
	*elseif (search_letter = "x") or (search_letter = "X")
		*set search_letter "X"
		*set search_term_compare search_term_compare&search_letter
		*set search_position +1
		*goto search_cap2
	*elseif (search_letter = "y") or (search_letter = "Y")
		*set search_letter "Y"
		*set search_term_compare search_term_compare&search_letter
		*set search_position +1
		*goto search_cap2
	*elseif (search_letter = "z") or (search_letter = "Z")
		*set search_letter "Z"
		*set search_term_compare search_term_compare&search_letter
		*set search_position +1
		*goto search_cap2
	*elseif (search_letter = space)
		*set search_letter space
		*set search_term_compare search_term_compare&search_letter
		*set search_position +1
		*goto search_cap2
	*elseif (search_letter = dash)
		*set search_letter dash
		*set search_term_compare search_term_compare&search_letter
		*set search_position +1
		*goto search_cap2
	*else
		*bug I missed a letter.
*else
	*return
7 Likes

Oh, that makes total sense! It creates more of an “interactive dialogue” feeling that way.

7 Likes

I have zero interest in D&D as a system, which is why it took me seven years to go from “I want to start playing TTRPGs” to actually start playing TTRPGs… my campaign options outside D&D/Pathfinder are few and far between!

6 Likes

@Havenstone is 100% correct in that it’s kinda meant to read like the game asking you the player what you want to do, and then the options are your direct response to that challenge, like a DM and a player in a DnD game.

I did this in Kiss from Death and Gray Painter. However I’ve actually changed this in Dance with the Devil because the first-person narrator and second-person narrator are actually two different characters. You have some control over both so there needs to be clarity in the choice options about who is doing what.

Which means quite frequently I have the narration in 1st person and the choice option in 2nd person which is completely the opposite of how it’s normally done lmao. I got used to it.

I still fall back on imperatives quite often as there’s no chance of mistake. I wish I could say they were intentional and the imperative choice options are responding to direct orders, but I usually just write whatever I think sounds best in the moment and don’t have, like, a specific rule that I follow.

11 Likes

Cool beans! I’ve been considering standardising the choice perspectives, but it sounds like it is fine to have a mixture. It reads more naturally.

6 Likes

Apropos, I have a bizarre problem. I like how the WoD games show stats, and have been wanting to do something similar. But! I also have a stat system that can include negative stats! How on Earth am I going to symbol-charsheet that??? :person_facepalming:

Like, am I just going to go with ○┃○○○○○ or something? □○○○○○?

7 Likes

This is cool! You might run into problems if you ever have any accented characters though.

You could also condense a lot of this down into a single “search string” of valid letters, which might also help with the aforementioned problem–it’s a lot easier to add extra letters to a long string than to copy/paste a hundred more if statements. Also, if you force the input string into allcaps, you can store your searchable terms in allcaps and then not need to worry about how a player inputs them (so you don’t need to check for both “A” and “a”, for example). When you want to print the terms, just have a corresponding lowercase version with a very similar variable name (something like a suffix with “_lc” on the end) and you’re good to go!

(Would be easier if we could force lowercase with ChoiceScript, but alas… It was something I literally wanted to do for something in my story where I was condensing names together–ended up having to make a whole function for it.)

EDIT: Hmm, I might have misread your code or misunderstood your post first time around, because it looks like you are doing more or less what I suggested–converting everything to all caps? Worth mentioning this can be done natively in ChoiceScript, though! That would make this part of the code a LOT simpler. Like, one single line level of simpler.

8 Likes

If you want to keep the ●●●○○ aesthetic without confusing the player, just anchor the line with a literal + or - at the front of the bar.

Example:

+3 [+] ●●●○○

0 [0] ○○○○○

-2 [-] ●●○○○

-5 [-] ●●●●●

Or, keep the standard left-to-right filling, but change the symbol entirely to represent a negative value. A hollow circle ○ is empty, a solid circle ● is positive, and a harsh symbol like a square ■ or an X :multiply: is negative.

Example:

+3 ●●●○○

0 ○○○○○

-1 :multiply:○○○○

-3 :multiply::multiply::multiply:○○

10 Likes

I’ve thought about changing the symbol entirely, but a) it can’t go lower than -1, and b) I want to make TTRPG-style charsheets for myself, so I can’t be changing shapes willy-nilly. :person_facepalming:

And then there’s the fact that the symbols should be of similar enough size, which isn’t even consistent between the Unicode table and browser! Argh. Otherwise I’d just use ⊗ which then fills out.

…wait, ⊗○● actually doesn’t look too bad.

The idea is that 0 means “has no knowledge in this skill” and -1 is “has no knowledge of this skill”, which comes with hilarious gameplay results if you want to use those negative skills.

Like, if your driving skill is -1, you might be able to ride a car like a horse, because you don’t know it’s not supposed to work like that (which you do know with skill level 0, you know what cars are, you just can’t drive) and if you’ll be insistent enough, you’ll break reality.

6 Likes

Bitten the bullet and will finally finish off the Rebirth update/bugfix now and I am sat here chuckling at the easter eggs/hints I had forgotten I planted.

Past me was pretty funny.

21 Likes

I’d be tempted to simply leave it blank. Either, don’t even list it with the other skills they do know about or, just leave all indicators of a level off so it’s just whitespace, a bit like ‘null’ in code.

5 Likes

Today I had an annoyingly unproductive morning errand, so I got less writing done than I would like.

I did manage to resist the urge to include wasps in an almost-date scene with a possible love interest NPC.

7 Likes

Instead of trying to make the dots do all the work, maybe adding a single checkbox could do the trick. Use a standard white square (□) and black square (■).

Example:

-1 (Total Ignorance): □ ○○○○○ (Empty square: Unaware. Empty circles: No skill.)

0 (Untrained Baseline): ■ ○○○○○ (Filled square: Aware. Empty circles: No skill yet.)

+2 (Trained): ■ ●●○○○ (Filled square: Aware. Filled circles: Two points of skill.)

5 Likes

Earlier games were a lot more explicit about this, to the degree that if you look into like, Choice of the Dragon and Choice of Broadsides, the narrative voice will be closer to that of a DM, up to and including asking you what you want to do.

12 Likes

Yeah, that’s pretty much what I was going for with ○┃○○○○○, where the separated circle would be the “knows of”.

(I don’t like mixing circles and squares on the same row, they don’t vertical-align properly.)

But I think it’s important information!

6 Likes