I’m probably not someone who should be giving advice considering my first WIP has been on hiatus for far too long. I am absolutely in the same boat, and as someone with a decent enough background in programming, I have been finding ChoiceScript a bit limiting in some of the features that I wanted to implement.
Some of the features that I want to include:
- A save system which generates unique “savecodes” based on the choices made and can be shared and loaded by others by pasting it in
- A “novel mode” where you can read your playthroughs again (or others) by removing choices and following valid “savecodes”, I figure that this would be a cool feature to share your favorite playthroughs with others
Definitely check out the ChoiceScript wiki and forums for help with and example usage of the available commands.
With choices in games, I use the following terminology:
There are several types of choices that can be made in games and what kind they are depends whether you actually need to create a new branch or not. We might have the following types of choices:
- A “fake choice” where the result does not affect the plot but may change the player’s status, inventory, or other variables.
- These changes still affect the plot by potentially enabling/disabling or hiding/showing future options in choices, showing additional dialog or editing how dialog is phrased such as with multireplace, or making other similar small insertions or variable changes down the line.
- A “true choice” where the narrative branches such as accepting a quest at a guild, you would necessarily need to write the details of what happens on each quest. However, all of these choices do not necessarily need to have the same length or level of detail.
- Choices that result in easy versus difficult paths might allow for shorter writing on the easier path (or on the difficult path if the player can die, preferably sending back to a checkpoint).
If the narrative truly branches and you need to reduce the number of branches to make it more manageable, you do not necessarily need to remove the choices entirely. This can be done through what I call “rooting”. This is where multiple branches return to a single point which is similar to what *fake_choice
does.
With conversations, there are several techniques to make them more manageable from the games that I have played.
- Repeated
*fake_choice
scheme. The dialog progresses the same except for a few inserted paragraphs that differ depending on which option is chosen, but the conversation flow remains the same.
Repeated Fake Choices
Conversation start.
Shared dialog part 1.
*fake_choice
#Option 1
Unique text after option 1 is selected.
#Option 2
Unique text after option 2 is selected.
#Option 3
Unique text after option 3 is selected.
Shared dialog part 2.
*fake_choice
#Option 1
Unique text after option 1 is selected.
#Option 2
Unique text after option 2 is selected.
#Option 3
Unique text after option 3 is selected.
etc.
*finish
- The
*disable_reuse
scheme where you have a *label
that you return to.
Disable Reuse and Label
Unrepeated text.
*label conversation
Repeated text.
*choice
*disable_reuse #Choice 1
*goto c1_text
*disable_reuse #Choice 2
*goto c2_text
*disable_reuse #Choice 3
*goto c3_text
#End Choice
*goto end_choice
*label c1_text
Long discussion 1.
*goto conversation
*label c2_text
Long discussion 2.
*goto conversation
*label c3_text
Long discussion 3.
*goto conversation
*label end_choice
Continue here.
*finish
- Shared
*label
rooting. This is where your many choices are reduced in branches instead of increasing by grouping similar options.
Shared Label Rooting
*temp suboption 0
How are you doing today?
*choice
#Fantastic! My day could not be any better.
*set suboption 1
*goto positive
#Great. Smooth sailing and all that.
*set suboption 2
*goto positive
#Good. Everything is going smoothly.
*set suboption 3
*goto positive
#Alright.
*set suboption 1
*goto neutral
#Okay.
*set suboption 2
*goto neutral
#Meh.
*set suboption 3
*goto neutral
#Not too great. I've been better
*set suboption 1
*goto negative
#Badly. When it rains, it pours.
*set suboption 2
*goto negative
#Terrible! Today is literally the worst day of my life.
*set suboption 3
*goto negative
*label positive
Good for you! @{suboption Let's hope it lasts.|Let's hope it gets even better!|Let's hope it goes from good to great!}
*goto after
*label neutral
Just another day, eh? @{suboption Well, it could be worse.|The good and the bad are just about even.|Well, it could be better.}
*goto after
*label negative
I'm sorry to hear that. @{suboption If it's any consolation, it could be a lot worse.|If it's any consolation, it could be worse.|Well, at least it can only get better from here, right?}
*goto after
*label after
This is the main shared branch.
*finish
There are countless more and you can combine or nest the above in infinite combinations to create nice branching conversations without exponentially increasing the amount of code and dialog required. You can also use *if
statements and conditionals to allow for even more sophisticated branching and rooting. Of course, the more unique interactions and paths, the more complex things will become, which is why many stories tend to only have a few branches at a time and use other techniques to give the player more interaction and ways to impact the story.
As can be seen by my WIP, I am a prime example of what you describe.
I also have been having some issues with the styling of the game finding myself wishing for additional fonts (like monospace to make ASCII art), additional justification and spacing options for text, and more control of background color and font color (to make the reader appear more like a terminal). I went on a long side quest looking at Twine and SugarCube, though they require additional knowledge of HTML, CSS, and JavaScript in exchange for the additional freedom.
I have also gone on several side quests because some of the IDEs and Hosting Sites for ChoiceScript did not support the latest features, properly display images, etc. As a result, I wrote a bunch of Python scripts to automatically convert images to URI format to embed in the compiled HTML, etc. Luckily, it seems that some of these changes have been fixed since then… though others have been introduced. Hopefully, I will be able to finally make some progress without feeling too bogged down by ChoiceScript.
Knowing what I know now, I would not avoid these ambitious ideas entirely. However, creating a simpler version is definitely an option, especially to keep the ball rolling and avoid overexerting yourself. For me, my biggest problem has been separating coding and ambitious ideas which are impractical in ChoiceScript from writing. I know that I can make a version in ChoiceScript, but it will be quite slimmed down and not quite what I wanted. But, at the same time, the alternatives require a lot more code and time to pick up.
Right now, I am planning to separate my structuring and coding from writing by having all of the text in separate files and using *gosub_scene
and variables to bring the text over. This will allow for me to write what I want and then structure and balance the options later on and to separate debugging from writing. Of course, I am still quite stuck on how exactly I will be writing from the perspective of an AI and none of my current ideas translate that well into ChoiceScript. I am lowering my ambitions for my ChoiceScript version to be realistic, but my story ambitions remain. I definitely released my WIP too early and should have fleshed out the story a little more and reigned in some of my ideas.
I recommend planning out your ideas however you need, whether it is through some kind of flowchart, mind map, or other format. Once you have the skeleton planned out, I think it will be easier to fill in the details, eliminate/combine unnecessary branches, add interesting ones, and otherwise keep making progress. Definitely read more ChoiceScript based games from Choice of Games and Hosted Games to see how they handle branching and conversations to balance complexity with replayability. Hope this helps.