Indie game storeFree gamesFun gamesHorror games
Game developmentAssetsComics
SalesBundles
Jobs
Tags

The game has been has been released! You can play it here!

Glad the final stretch didn't take too long. This time I won't showcase what have been done in term of composition (since can just listen to it for yourself), but just focus on the technicals aspects of the development. Next time I might try to write a post mortem.

Basement

Last piece of music in the game. Well, “music”… It's actually noise. First dark piano and a low cello, then dissonant notes, and finally just voices, random instruments and noises. A pretty din! The tricky part was obviously to make it progressive. I had to export each sound individually, make sure they fit well together, try several combinations, regularly change the volume… The result is pretty ok in term of atmosphere. I might not be able to sing, but at least I can make groans!

But the real challenge was making those noises loop. Unlike the music bits, these are sustained notes, or ambients that keep changing. If I just loop on them, it will sound like a scratched disk. So I have two techniques:

  • For sustained notes, I export two measures, and then cut to only take the second one. This way the attack isn't part of the sound, there only here the sustain.
  • For sounds that don't loop, I cut them approximately in the middle, then invert the position of the two parts, so that the end fits with the beginning. Then, at the middle, I create a fading by duplicating the track. This works well when the track is longer than the intended loop: the two parts can overlap each other and fade smoothly.

Did it work? Eh, kind of, but with mixed results. The sounds are looping, but there are still presence of light "pops". This seems to be linked to the Web Audio API: I encounter no problem with Audacity, and for other game engines it actually worked. It's not the first time I encounter this issue in the game, but usually the "pops" are masked by percussion. Here they are not here, so… It makes the sound a bit glitchy. Fortunately, the text is short enough and the loop long enough so that the player won't have time to notice it. And if they do, it can be perceived as part of the noise. I'm certainly not a perfectionist, but I tried my best to have a result at least decent.

And so we are done with the music. But there is a last thing before the game can be released…

Handling promises and errors

There's a lot of resources this game has to load before properly working. All those audio files need to get fetched to be read by the browser! And if you try to start the game before they are all loaded? Hem, you won't get really far before the game collapse on itself.

So instead of writing a message asking for players to wait a bit if they don't want to crash the game, I needed to actually make a loading screen! Fortunately for me, there is already one in SugarCube 2! SugarCube is the story format for Twine I used for this project. It is not installed by default with twee, but I heavily recommend it if you know a bit of programming and want to go beyond the basics of Twine. It has a nice API, and (most importantly) a clear documentation. I was about to lose my mind with Jonah and Sugarcane before I tried out this one. Anyway, as I was saying, SugarCube display a short loading screen before launching the game. You can control this screen with the methods LoadScreen.lock and LoadScreen.unlock. So working with promises is quite easy, just a little then and you're good to go!

But we also to take in consideration this important detail: this is a web application. It is doomed to fail somehow. Browsers compatibility, or connection mishaps. The factor most prone to error is the Web Audio API itself. Some browsers are just not compatible with it. But the player should still be able to play the game, even without sound! Checking if the browser is compatible with the Web Audio API is easy: you just have to check if window.AudioContext or window.webkitAudioContext exist. The most tedious part was maybe to display a little warning if the sppund part fail. I intended to use a Twine variable, and perform a basic if operation… Well, here's what took me half an hour to figure out: a variable called myVar in the JS object States.variables of SugarCube will be referenced as $myVar in Twine passagesQuite simple, but poorly explained in the documentation.

Another little thing I learned, and I'm surprised there isn't a lot of resources about it on the web. The function AudioParam.linearRampToValueAtTime is deprecated on Chrome! Instead, you should use AudioParam.setTargetAtTime. It's less intuitive, but should be supported in the long term, and actually works better on some browsers. Yep, it fixed a bug I had on Firefox. Finding it at the very end of the development was frightening, but I happy I could resolve it so quickly! I also changed my fading function so that the audio doesn't increase weirdly when you quickly switch between two rooms. Haha, take THAT sneaky player who try to break my game! I'm know what you're doing!

Anyway, the synchronized loop system I have is now pretty solid. I plan to make it into an open-source library, maybe. It just needs some polishing with names, and a documentation.

Okay now the game works, it handle errors, it has everything… It can finally be released! Oh, but there's just a little silliness on the way.

Meta Game Jam

Meta Game Jam is a jam still open, on meta games. I joined it last year when it has been announced, thinking it would be a nice break from my projects. What I didn't know is that it would start the very same day my game was finished! Well, I could have put Blood Not Alone aside to just work on something else, but I was so close to getting it done Friday that I decided to rush it in order to join the jam completely free!

I had some initial ideas for the jam. The theme was "meta", games about games. I had decided I should make an Alexandre Pontaise's game. Alexandre Pontaise is a supposedly genius game-designer, but actually a terrible one, with garbage opinions like “Games should be fun and rewarding for players”, “If video game artists had any talent, they wouldn't be working in the game industry”, or “Players are just pathetic people that need to escape in virtual worlds to feel great about themselves”. A lovely character, isn't he? I already used him in one of my previous game, All About the Player, which is a satire about the opposition of “gameplay” and art or story, and the hypocrisy behind putting the player at the center of everything. For the Meta Game Jam, I thought of a game about game development, where the player would be given instructions from Pontaise to make a sequel. It would just be a boring QTE until they disobey, which would trigger fun glitches. But then Pontaise would step in to explain that this excessive creativity goes against his genius vision. That concept and story was pleasant… However, there was something troubling me: it was a satire again. It was mostly a complain about “Game development is hard”, “Artists don't get the respect they deserve”, “Nintendo games are mostly crap”, blablabla. Could I make a positive meta game, for a change?

But then this lucky coincidence came: I finish my game, Blood Not Allowed, just at the start of the jam! Wouldn't it be a fun idea to make a game about it? Dumb enough for me at least! Plus, it can be a celebration about creation. How finishing something can feel great, how releasing a several month project is exciting, how working on something can be hard but seeing the work done is so satisfying! Great. So let's not release Blood Not Allowed now: let's make a game teaser for it. Announcing a game not with a trailer, but a playable teaser. Heeeeeey. (now that I think about it, Blood Not Allowed is a fake horror game, it would have been fun to actually make a P.T. for it). I had several ideas in mind. Maybe I could learn bitsy for the jam? Yeah, my game is a text-only walking simulator with music. I could make a silent walking-simulator with visuals to reproduce the manor, give a little preview of the game's world! All this accompanied with comments by me and maybe Pontaise promoting Blood Not Allowed, criticizing its game-design, giving fake goals and challenges, questioning its nature of game, and how this jam entry is just a disguised advertisement. So I read the bitsy documentation, then opened a new project, and then… Wait, where is my motivation gone?

Oh dear, it turned out I wasn't in the mood to be creative at all. I've spent the week working on a previous game, that took me months to finish, starting a new one immediately was too abrupt. Plus, I was eager to release my game! It monopolized my mind: I wanted this game to be out! So I step down a bit, went back to the previous idea: okay, a QTE, just a QTE. It can be done in full JS, with a bit of vector drawing, it would be a nice occasion to learn it. And I can work on another dynamic soundtrack, make weird visual effects, and create some kind of story… Maybe a "dev" mode and a "game" mode, the first with Pontaise and the second with me? I opened Sublime Text, initialized a npm project… And faced the same wall. I realized I didn't want to spend the week-end working on a game. I needed a break. Time for myself. And I wanted Blood Not Allowed to be out, dammit!

So I aimed at something cheap. Really reeaaaally cheap. A silly thing, lazy, short. Just a dumb joke. And most importantly: easy to make. Using only tools that I know well. The initial idea, making a game with just QTE, seemed simple enough! Display a text, choose a random key, wait for the player to press it, increase an index, then repeat. Okay. But that would just be a serie of sentence laborious to read. It needed something more. I like games to be systems, and I wanted to present at least a fun one. Then I had the idea to just make 3D corpses move randomly. Yeah, easy too. I can do it with superpowers, it will be faster. Well, I have never done that actually. But I know how to make it in 2D! Bouncing floating objects, with a bit of rotation. Just put them on different Z axis, and you get a nice depth! All there was to do then was create the prefab, display the text behind, and call the same function when the player press the correct key to spawn another floating object and update the text. And just with that, the game creates some fun visuals. Its systems is very basic, but it has enough emergence and random aspects to be a bit pleasant.

How about assets? Just use some from older projects. LAZY. Actually, this laziness was the core joke of the game: it's a game that doesn't even try to be good or original. A complete scam! The two dialogs of the game go in this direction. The first one doesn't make any sense at first, just mixing game-design terms in absurd ways. Then it become even more satirical by just revealing that it is mostly interested in players' money. The second one is more honest, it's my speech to the players. Promoting Blood Not Allowed, apologizing for this terrible game, and being honest with my current mood. And thus I kinda achieved what I wanted: a text that, sure, is a bit satirical, but mostly humorous and positive. A game about finished projects, the joy of game making, and the satisfaction of seeing the end of it!

And so, Stuff Made was released the same day than Blood Not Allowed. Instead of promoting Blood Not Allowed, I directed people toward this game! The actual game announcement was included in it. I received some feedbacks without being sure they were talking about this one or Blood Not Allowed. I'm a bit ashamed to have made this opportunist entry, but fortunately people took my joke quite well so far. And most importantly: I had the entire Sunday to relax (and continue Breath of the Wild!).

What can I learn from this? Well, making a silly little game is funny, but let's not be kidding: it's the equivalent of “I make a thing to says I'm out of idea”, and it only work once! I feel also a bit for not taking the jam seriously. At least, I intend to check out the other entries! Sure, on the other hand, I couldn't make a decent entry anyway. It's not so negative, and in fact I'm happy with how things turned out. It started as a nice little coincidence, and ended with a dumb little thing, nothing more. But it got me thinking: if I want to promote my next games with something fancy, let it be a game or video or something else, it should definitely be prepared in advance, and most importantly, not once the game is finished! Because then I just want to release it as soon as possible, which make any other creation nearly impossible. I can prepare a teaser, trailer, demo, in the middle of development, or when I feel the end is getting closer. It might even fix a release date! This way I am still productive, and can change my mind just a bit. Because you know what? Creating Stuff Made was actually fun. Making teasers is quite enjoyable, and makes you regain confidence a bit in your project. I'm terrible at self-promoting, but I'm surprisingly more comfortable with those kind of teasers than with forum posts. Maybe because I can be creative and express myself with fun ideas, instead of just asking people to take a look at my things.


And that closes this devlog! As said above, maybe I will update this topic with a post mortem one day. But until then, I will probably start another project. Hopefully this one will be short. Thank you for your time, and see you soon!