In the past two weeks, much work has been done in two separate projects. The first, of course, is StoryDev, where simulations have been optimised with beneficial markers indicating variables that have changed, certain additions to the debugging and an entirely new map system has been introduced.
The second of these projects is a new website to replace this one. To help market StoryDev for when it is finally released, it seems only fitting to develop a website that provides the user interface suitable for it. This also means good-bye to Ghost, but we will discuss this painful decision later.
Syntax Changes to StoryScript
New syntax has been added in the form of a "Fall-Through", which is a method of dynamically altering the way conversations are displayed in the resulting game.
Take the following extract from the upcoming video game, Age of Atlantis:
|=> ! var _01_WestRoad_STC_End = true; Saniyah : Hey, Caroline. Caroline : Uh oh. Saniyah : What? Caroline : I know when you call me by my full name. Caroline : You always say that when you start talking serious. Saniyah : Well, it is serious. Caroline : Well, what is it? It's very quiet. Saniyah : Exactly. Saniyah : Too quiet. Caroline : Where is everyone? : Saniyah returns to the Guard's office. Saniyah : Hey! Saniyah : Ugh... What's your name? Guard Ramon : Ramon Marlbe. Saniyah : Okay... Guard Ramon : What is it? Saniyah : Why is it so quiet here? |= BELIEVED_AS_RESIDENTS > ! _01_WestRoad_STC_End = false; Guard Ramon : Why are you asking that question? Guard Ramon : You're residents, aren't you? : Saniyah looks stunned. Guard Ramon : <looks angered> Aren't you? Saniyah : Well... Guard Ramon : You lied to me! Saniyah : I'm sorry, I just... : Saniyah turns around to see her sister wandering off. Saniyah : Carol, what are you doing!? Caroline : What? I want to explore. Guard Ramon : Okay! Guard Ramon : You two! Get here now! end |= !BELIEVED_AS_RESIDENTS > Guard Ramon : Well, normally you would arrive from the south gate, but since you detoured you are found at a very quiet place. Guard Ramon : It is not a trade route like it once was. Saniyah : It was a trade route? : Caroline rushes over to hear the conversation. Caroline : What's this about a trade route?
The new syntax, as you might have guessed, takes the form of
|=>. In between
> a condition can be applied. We do also have Option Conditionals which take the form of
=! which also does something similar, but here is the catch.
=! syntax, for Option Conditionals, means everything below it will not be rendered if the condition doesn't match, Fall-Through means to render everything below it even if it belongs to an Option Conditional.
|=> on its own means to render everything below that point. It ignores Option Conditionals. Where a Fall-Through involves a condition, it will see if the condition matches or not. If the condition matches, everything but a Fall-Through will be rendered. Once another Fall-Through is detected, that condition is evaluated and it will render everything below that if true, or will render everything below if no condition is met.
Taking the above example, we have
|= BELIEVED_AS_RESIDENTS >. If
BELIEVED_AS_RESIDENTS is true, everything below it is rendered. If that is the case,
_01_WestRoad_STC_End = false; is executed. That means when we reach
end, we end the conversation and move straight to any choices that might be available. If
BELIEVED_AS_RESIDENTS is false, then neither the code nor
end is called, and thus we reach
|= !BELIEVED_AS_RESIDENTS > which means everything below that is executed.
If this was divided off using Option Conditionals, our parser would instead think everything below the top part of the conversation should be executed, since there is nothing to evaluate against, and execute anything there instead. Everything else would be ignored.
This is the difference between Option Conditionals and Fall-Throughs. Option Conditionals execute ONLY what is below it and does not apply to the rest of the conversation, while Fall-Through will do as it says, it falls-through the conversation until it reaches the end of the conversation, an
end keyword or another Option Conditional.
Minor, Beneficial Debug Updates
In the debugger, we have added two features. The first you will see is the tracker, in which the variables that change are highlighted yellow. This gives us an indicator to what has changed throughout the entire simulation. Our simulation is also run in a background thread, meaning that we will see this tracker appear immediately when we run, even if the simulation has not finished.
You will also see in the background the addition of Errors, Warnings and Messages, to display information to us about the game. There may be coding errors, warnings about missing characters in the game's data, or messages displaying useful but unimportant information.
We will likely expand the Options menu in the Simulation options to allow you to customise the types of errors/warnings you would like to see, as well as perhaps other details not yet considered.
Custom Variables was actually implemented since the last article was written, but I neglected to include it. This is unlike using a
var inside of a conversation. These Custom Variables are most useful if you wish to use variables across conversations, rather than just the conversation you're currently working on.
In the Simulation Engine, it has been setup to add all the custom variables and initialise them prior to any conversations being run, and the same will apply to the resulting video game. What this means is that you would not have to worry about the order in which variables are declared. You might find this confusing, since we have "Declared Chapter" above. This, along with "Variables" (which should be Type), are filters to conveniently find the variable you are looking for.
We can right-click a variable and Copy Name whenever we need to use it. And just as it says below the results, we can indeed prefix the dollar sign ($) to print out the result of the variable in conversation, which our parser will eventually be able to do. This is not particularly useful for the editor, but in-game it will be.
New Map System
Yes, the map system is being revisited. You may be wondering why the idea behind Maps was initially brought up in the first place, especially when I described how it was not worth over-complicating an interactive story. However, you may also remember that I mentioned considering the hand-drawn approach. Well, here it is. It's not amazing graphics, but it is something.
There are two reasons for this approach.
- Firstly, this approach offers a visual approach to designing the game. Most of the conversations are simply files that we double click and open. This is all well and good, but constantly trying to find conversations in a folder with potentially hundreds of others may become a chore. The Map System will help to find and identify which conversations happen where to make it easier to locate and edit them.
- And secondly, and the least of my worries but still useful to those playing the game, we will represent the maps we create in-game when they are required. It will give a visual understanding of where the player is in the game and provide more useful utility than Journals.
This is not complete yet, though I'm sure by the next article we will be.
Our new website started being designed not long after our last article as a result of a desire to market StoryDev when it is released. This does not mean we are marketing the project for profit. In fact, despite all the effort that has gone into StoryDev and will continue to receive, this interactive story development tool will be released free-of-charge, with the source code available on GitHub.
You saw that correctly. StoryDev will be free-of-charge. It will be licensed using MIT and downloadable from this new website when it goes live.
That being said, there is a possibility in the future to develop server tools to go with StoryDev, but this is not a consideration as yet. It is simply an idea that may not ultimately come to fruition, unless there is demand for it.
Now, let's get down and discuss Ghost.
This platform offers a very nice user interface for blogging. But that's all it really offers. For the hosting price, it's not bad, considering you also get dedicated SSL and you support what is technically an open source project. There is no reason why I would want to trade Ghost for anything else, even if it is something developed in-house.
So, here's the catch.
We will continue to use Ghost, but all of the feeds and delivery of the posts will be done through the Ghost API onto our new website, rather than directly on the Ghost platform. This also means we can take full advantage of whichever hosting platform we choose to use for deploying our new website once it is complete and not be hindered by the limitations of the blogging platform.
You could say we could build our own Ghost theme, but remember that downloadable content is not possible. Custom backend scripting is not available. Besides, being me, that is me and not anyone else, I prefer coding from scratch and only using the libraries that offers a practical, immediate benefit rather than a benefit that requires extensive research and planning before it comes to fruition.
At my age, I don't want to spend hours, days, weeks, or even months, learning large hierarchically overwhelming third-party libraries that sound good on paper, but is ultimately a waste of my time, when a language and framework I am already proficient and knowledgeable with I can work with immediately without needing to learn much (see my rant on procedural code).
The same is especially the case with the Web. I am okay learning new tools and libraries so long as it is easy to understand for my stubborn brain, but React, Angular, Django, Ruby on Rails, and all these other web frameworks that try to hide the core problem that is: the Web sucks for programmers; are not helping, unfortunately. The Web just needs a complete revamp for me to actually enjoy it, but since there are so few resources online for programmers like me who prefer real programming and not the stupid design of the Web, it seems that building websites from scratch is the only option.
Yes, I tend to rant about web design and programming. It will be my love-hate relationship for my entire life, most likely.
We will stick with Ghost, but only as a platform to post and manage our news articles. Everything else on our new website will be managed independently.
StoryDev has had many new features, with many more yet to come. Both the Map System and full debugging information should be available by the time the next article comes around, plus more progress on the website.
See you in the next morale meeting. Marvellous!