So, this is currently what is haunting my mind the most, and why the current version is whitelist-only. Nothing on the internet is truly for forever, but I wanted to make the experience of creating and publishing as friction-less as possible. Some of the main features I still need to implement are the ability to export your data and save it locally, and more frequent database backups rather than just full server backups. The last thing I’d want to happen is to be responsible for people’s lost work. Ergo, whitelist until I can guarantee full data safety.
Regarding open source, I have considered this, but I might once I feel less embarrassed about parts of the source code. Other than that, I had considered building a sort of docker application allowing people to self-host using exported data. I want to give this the best shot it has at life if possible. I truly lament people’s lost creative efforts on any platform, and I’d hope to make sure such a thing doesn’t happen here.
Speaking of, currently I have decided to keep everything within the website itself. I am heavily considering exportable websites, but I know not everyone is equally technically minded, so the emphasis right now is on one central platform both for easy discoverability, and ease of use. This also ties into features regarding collaboration and shared development.
This is a point that I am still racking my brain over. I am currently paying for hosting costs myself, which means I also have limited persistent memory to work with. To prevent link rot in images, I have elected to allow people to upload images to the server directly, or indeed define a link to an externally hosted image in the ‘image definition’ in the image library. This system works well, but it means I already need to be memory conscious.
What is difficult with sound is that I need to make really, really sure I can store those sounds, or make sure a system can import externally hosted sounds while minimising the risk of link rot, or just accept the risk of link rot happening.
Another idea I had was to have a custom music parser, upload a custom soundfont to the system, and then write a domain specific language to parse that soundfont into music. However, I fear this might just be my over-enthusiastic designer brain speaking, rather than a feature people would appreciate digging into. Still, I might just do it this way to preserve storage, and then upload a set of default sound files.
TL;DR on some of the technical verbiage I casually threw in.
TL;DR on 'link rot'
**Link rot** is a phenomenon where links to external websites and the resources they host stop working, either because the link no longer points to the right address, the website is down, or the website is no longer hosting the resource. You'll often see this with old forum posts pointing to resources on the internet, but when you click the link, you'll get a 'page not found' error.
The same can happen with images, where you upload an image somewhere like imgur, but it suddenly being deleted at one point because imgur would only store the image for a limited amount of time. This means you would have to keep updating and refreshing links for your resources once you notice the link no longer works.
TL;DR on soundfonts and domain specific languages
A soundfont is basically a set of default sounds a system can draw from to render its soundscape. For example, if Arial is your default font in writing, Midi sounds built into the computer are your default 'sounds' for different things. So a piano always sounds the same on most PCs using a specific sound card, same with drums and bass.
A soundfont overwrites those defaults. It will tell the midi parser “Hey, don’t use your default piano when I tell you to play a piano sound, use the one I give you.” A famous example is the soundfont from RuneScape. A very specific set of sounds used to generate all music in RuneScape, since it needed to be very memory conscious when it launched in 2007. So instead of storing the music files, it just generated the music using midi and its recognisable soundfont, much like tracker music does.
A domain specific language or DSL is a programming or parse-able language or syntax usually written to work within a specific environment. ChronicleHub uses something I called “ScribeScript” which is just text formatted in a certain way so the parser will understand it. For example, when it sees {} brackets, it will know that it needs to evaluate and resolve whatever is between the brackets. If it sees a { $quality }, it will know to insert the level of that quality into the text, unless it’s a String-type quality, in which case it will insert the StringValue associated with that quality (useful for something like the $player_name or $player_title for example). It even has support for $item.source, which is specific logic I built in so that the text can refer to where you got a specific item from, to really make the world feel like a living, breathing thing.
When I refer to a DSL in regards to music, I am thinking of something like the way strudel has a custom language which is converted to midi and played with soundfonts, or Mabinogi’s MML, or Music Macro Language
So this is a big one for me as well. @HanonO or @JoshGrams mentioned this in another post I made a while back (I think, I have been digging through my history trying to find the precise quote, but I seem to be unable to find it). QBN games only work with sufficient content already in place. That is a challenge.
Edit: Apparently this is from a blog post by Emily Short where she states:
QBN does pose some challenges of scale at both the high and the low end. I think StoryNexus is hard on new authors because the content tends to be uninteresting until there are a fair number of storylets in the database, so it’s hard to feel like you’re really rolling until you’ve spent quite a bit of time in the tool. Conversely, when you’ve got very large amounts of content, you may find that the list of available storylets gets overwhelming for the player.
This is why I made the choice for an online platform initially. What I currently have implemented is the ability to collaborate with other people on the same world, making it so you can all put the pieces in place to build a game together (though I still need to debug this). Collaborators can be limited in their role, so they can only modify the parts of the world/story they have created, for example. My dream is to see multiple people work together on one world to create something beautiful as a result, and I hope this will happen at some point. I’ve already invited a friend of mine to collaborate on a world of my own!
In addition, I have added the ability for the creator to define how their action economy works, how long their timer is, whether card draws cost actions, how many actions clicking an option costs by default, how much is regained once a timer runs out, etc.
Another big part of the plan is to have a community resources tab, where people can upload self-contained stories, carousels, interconnected storylets, decks, images, etc. so that you could feasibly construct a world or story using bits and pieces from other people. This would be fantastic for something like a Dungeons and Dragons-like Fantasy world where it’s less about the precise lore, and more about just having something to do. Sometimes good enough is good enough.