Postmortem Part 3: Make ALL the games!


RiftBreak took fourth place in SBIG Jam 2020! Given the huge pool of quality entries, I think that’s a great result. Once again, many thanks to Ned Reid (Znedd1) for running the jam, itch.io for hosting it, and of course everyone who participated!


I chose to do three gameplay segments, plus a few other bits and pieces. I’m not sure how I came up with that number, it might have been based on scheduling (two days per) or just the number of things I’m familiar with. In retrospect, it was kind of crazy to essentially do three games for one jam, even if I had taken steps to limit the scope.

As you can see, I scheduled things mostly linearly, and had a few slips. A lot of the miscellaneous bits like the titles and bonus content as well as actually finishing the launcher was spread out across the days. Testing was done continuously, with at least one run through at the end and some user testing (ie my friends). Of course I left myself extra time; I always plan to finish early which gives me time to breathe (best case) or gives me time to finish (worst case).

I’ll go through each piece of the puzzle more or less in order from first to last implemented. Things were pretty hectic so I did go back and forth a bit.

Intro: Katana

The first segment of the game is a fairly simple kind of visual novel/negotiation game. I decided to blow the dust off my old Katana project one last time and build something on that codebase.

Project Katana was my failed visual novel project, with a custom engine built in TypeScript running on nw.js (katana can be used to refer to both the engine and the game that was to be based upon it, the former is used here). I started the project in 2018 and worked on it on and off for the next year or two before ultimately calling it quits, mostly because I couldn’t figure out where I really wanted to take it. It was a fun project, something different from my usual Unity stuff and the first one I really did any art for, and by the end I had most of the core gameplay stuff working. I’ve released the source code and most of the artwork under permissive licenses.



A scene from Project Katana, never completed

Its dialogue format lives on in CommonCore, and in fact that was my backup plan if I couldn’t get it working again for this.

I should mention that visual novels are kind of cursed for me. Katana failed, as I’ve mentioned, Whistler was finished but turned out horrible and I never released it, and Shattered morphed into something that wasn’t really a VN anymore.

Whistler, never released. This is CommonCore, not Katana.

I decided to build a kind of negotiation game this time, involving a rogue AI taking over a plane. Halfway through I realized this might be too soon for people close to the 737 MAX crashes, so that’s where the “is this too soon” line comes from.

This the segment I’m the least happy with, because I rushed the living hell out of it. Originally I wanted the negotiation sequence to actually make sense, but I was quickly running out of allotted time because I’d spent more than expected on infrastructure and I think some of the cutscenes, so I just filled the chart in with more or less random responses.

It looks complicated here but it wasn’t too bad to implement. I wish I’d had one more layer, though. I also wish I had made it more clear what happened when you succeeded and crashed anyway.

Anyway, by the time I had this all implemented it was late as hell and I just threw in the first vaguely appropriate piece of music I had. Another delay came from a “bug” that drove me nuts but turned out to be me just overwriting the wrong dialogue file, probably because I was tired.

I actually considered omitting this section because I wasn’t sure it flowed well in terms of surprising the player with lousy gameplay but I left it in because I’d already finished it by the time I’d had second thoughts.

Finally, look very closely at the people at the opposite side of the aisle from Sid (visible when the flight attendant talks to you) for another easter egg.

Intro Videos

Both of the airplane intro videos are actually done in Unity. The movement is controlled by scripts, not the fancy timeline cinemachine stuff, because I didn’t need to do anything complicated and the last time I used the fancy stuff I fucked it up horribly. There’s no frame capture going on here, I just exported and ran it on my gaming machine, capturing high-quality video with OBS Studio. The audio for the second scene is in-engine, even.

The first scene- the good one- doesn’t look prerendered because it’s a crazy high bitrate, 4K60 video. It’s nicer in video quality than any actual cutscene I’ve seen in a AAA game. It probably lags like an in-engine cutscene on slow machines too.

The reason why I made one very nice scene and one very ugly scene is because I wanted to draw players in with the impression of quality, while the second one the gig was up already and I was going for funny. I also didn’t want the silly airplane to go to waste although Znedd ended up using it in his game anyway. Funny enough, the only asset here I paid for are the clouds, which I wasn’t happy with at all. The airplane had to be texture edited and materials adjusted, and I had to fight with water and lighting for the island, but even after tweaking I still couldn’t get the clouds to look how I wanted.

I’d put all the subprojects into one Git repository, which worked okay although I had to be careful about overall size (which I’m usually careful with anyway) and gitignores. However, I was lazy and decided to do the cutscene stuff in my “Unity Asset Slave” project which I use for downloading stuff from the asset store and sorting it out before putting it into projects. That means the source for this isn’t in the same spot as the rest.

I’ll end this section with two random bits of trivia. The “Delta Star Lines” logo is, ahem, inspired by the Delta Electronics logo. They make really loud fans and also other things. I also forgot the credit for the silly plane and had to reupload an 830MB file to fix it.

Chapter 7: Unity  


Let’s talk about the worst level in Halo, The Library.

I talked about how this came about in my first post so I won’t repeat it here. I think I started moving toward the idea of a game that sets up and disappoints at about the same time I starting leaning towards remaking this awful level. At one point I was going to do a scene-by-scene remake of the level but that was quickly tossed aside for time.

It is apparently recognizable enough that the friend I played through the real level with said something along the lines of “my god, this is the fucking Library” when he tried it.

I did make sure to get the annoying door, the lifts, the breakable floor glass and the literally copy/pasted sections in. I did want to do more with the Monitor but cut way back on that for time- I budgeted only two days to build this whole section. That’s the main reason the Monitor sits there and the door opens slowly, because I figured it would be faster to implement than a proper hover in, wait, open door sequence.

For enemies I was going to do just spiders and zombies. That particular spider model is near and dear to my heart; it was used in my very first Unity project. Then I found the spider queen model while trawling the Asset Store’s free section for something else and decided it had to make it in. That’s three enemies that map pretty cleanly to the Flood Infection Form, Combat Form, and Carrier Form. I wish I’d tweaked them a bit more to make them even closer to their inspirations.

This section is built on top of CommonCore, my custom framework for Unity. It’s mainly the tech behind Ascension III, if that’ll ever come out, but variants of it have also powered almost every Unity game I’ve made in the past couple years. It’s split out into a basic Core component without game logic and an RPGGame component as well as a few other modules, and that’s what’s in use here.

The overarching goal is to be able to forget about the technical nitty gritty and Just Build A Game, the way I used to back when GZDoom was my engine of choice. I’m close, really close to that point.

Sometimes things go together so well it feels like cheating (I’ve never been kicked out of a game jam, but I also avoid ones with rules that specify everything must be created from scratch). On the other hand, because it’s an in-house framework sometimes things break horribly. I didn’t run into anything game-breaking this time, unlike Shattered where I had tons of issues with everything from the dialogue not being parsed correctly to actors getting stuck in their pain state to saves failing to work at all.

This time I “only” had serious performance issues.

I still don’t know why this level has insane CPU usage and runs like shit. I know it has something to do with the actors and probably their movement, but I don’t know why it’s so bad. I know that my scripts aren’t optimized for having a lot of actors on screen at once- this was never a design goal- but I have fewer here than I did in Shattered and it runs noticeably worse.

This looks worse, but doesn’t run as badly

The whole map isn’t active at once, either. The same section is copy/pasted four times, and there’s a trigger in the S-shaped corridors between them that deactivates the last section and activates the next one.

I’ve also brought CommonCore to the point where I have enough rope to hang myself with. I’m lazy and wanted to avoid writing new code so I implemented the spider queen death in a hilariously stupid way. When the spider queen attacks, it shoots a projectile that immediately kills it, which spawns an effect that deals radius damage and spawns some baby spiders. I think I ended up having to write more code than if I’d just implemented proper actor suicides, and it was buggy as hell too.

I built a new HUD for this and grabbed a pack of nice looking guns off the Asset Store- the focus was really on making it look nice so I could sell the opening scene. I really wanted new arms but I couldn’t find anything suitable and ran out of time to make or adapt something, so ended up just retexturing the same ones I’m using in Ascension III (Shattered stepped around this by using 2D weapon sprites).

Convincing?

The opening scene itself is actually the Windridge City environment asset, or rather a picture of it. I built it and then recorded a video and picked a frame I liked. I don’t like the postprocessing they used; it makes it weirdly soft and breaks the illusion of this part being actually ingame a bit. It was a nightmare and a half to match the lighting but I think I got it mostly done- the key was greatly reducing the ambient lighting. There is no camera magic here; the screenshot is literally a texture pasted on a quad slapped in front of the player. Once the player does something that would break the illusion (shooting, moving, looking), a script changes the lighting back to defaults along with revealing the actual room and doing some effects.

The real level geometry is almost entirely built with ProBuilder. I’ve used ProBuilder for a long time, since before it was acquired by Unity. Firefighter VR was built entirely with the limited free version. In general I like it, though I’m still learning it and I really wish the CSG tools worked better. Some day I may do a proper devlog on how I use it.

I started making the second level of this chapter- the outside area- before I’d finished the first. It has a few purposes: to push the disjointed narrative forward, to provide another nice screenshot for the Itch page, and because I wanted to make a light switch that turns the sun on and off. The dragon flying backwards with no animations is supposed to be a reference to an infamous Skyrim glitch (though not one I’ve ever experienced).

I threw in several easter eggs, but I doubt anyone saw them. It turns out the best strategy for this level is to run past the enemies as fast as possible. While the giant door takes forever to open fully, it only takes about ten seconds to open enough to crouch under. It’s possible to sail through the entire level in a minute or two. Then again, at least one person found the secret room (teleporter off the last lift), so maybe not was for naught.

While CommonCore has a working save system, I didn’t bother trying to make it work here because I had no plans to integrate it with the menus etc anyway. You can try saving and loading through console commands, but it probably won’t work. I think it’s less an issue in Chapter 7 than Chapter 3 but this would definitely be a consideration for a larger game.

Overall I think trying to do this much in this short a period of time was insane, even for me, even compared to the other sections, and I’ll probably do it again some time because I just don’t learn.

 

Chapter 3: RPG Maker MV

Chapter 3 is the second section played but the last real one that I built. It’s the most open for the player, but it was the most open to develop, too.

I have mixed feelings about RPG Maker. It’s easy and fun to use, but it’s hard to make a really standout good game because to do that you need to go beyond the defaults and I’ve found that doing so throws away a lot of the ease of use advantage. I do like RPG Maker MV better than VX Ace, although half of that is because of how much better it works with source control.

This time around I went lazy and cut scope by using a ton of stock assets, example maps, and the built-in character generator and just had fun making a stupid game. I had a general structure in mind by the time I started, but I threw in a lot of random stuff I thought of just as I thought of it as well. For example, there was originally going to be a three piece quest then another part to the quest, then I cut the extra piece (this is the backup singer situation referenced in the game), then I added a new part with the buckets which is totally stupid, incredibly tedious, and I thought up of on the spot and decided to roll with.

There are a few shout-outs (well, more cheap shots at) some of my other RPG Maker projects, released and unreleased. In some ways it’s a throwback to Ja Wizardman 4. The atrocious art from Ascension 2 is made fun of. The Frostbite Spider was going to be in The Old Papers V: Stratopause (the mythical Wizardman sequel) in the brief period when it was planned as an RPG Maker project. Jen from Katana also appears here.

Although many of the environments are premade, generated, or just very lazy, I spent a lot of time making a lot of silly interactions with things in the world. I had fun making those and I think they’re about 90% of the experience here. I also tried to make the world dynamic, with NPCs moving around and popping in and out as you moved through the main quest.

There are a few things I feel didn’t work out as well as planned. Some of the easter eggs are very hard to find, for example you can search some gross places but only after trying 10 times or so. Sometimes it is not obvious how to progress and some of the hints are even harder to find. There are a few instant game overs and at least one comes with no warning. And in general it was a very long, tedious section with overly long chores and awful unbalanced combat and I might not have done enough to push players forward.

This was the first time I’ve made a custom RPG Maker MV plugin. It’s not so bad, but I’m still not a fan of JavaScript. I overrode a bunch of stuff to skip the main menu and exit out on game over, writing magic values to a special file as I’ve described in a previous section. I also added some code to force fullscreen. I probably did it all in horribly hacky ways but it seems to work.

I think I mentioned previously the serious dearth of quality of life features. There are pause menus and a main menu, but no config and no saving. Nowhere is this felt more than in Chapter 3, which is by far the longest section of the game and has a few points that are immediate game overs if you make the wrong decisions. RPG Maker MV has a full save system, and I figured out how to integrate it, but didn’t have the time or energy to implement it. Basically, we’d allow resuming from the last save if Continue is selected from the main menu, by passing an argument and adding a special case to the (already overridden) game starting code.

Fake Chapters

Toward the end of the jam, I realized I really wanted more than 3 chapters out of 19. I wanted to pad things out a bit and make the game feel a bit less sparse, as well as giving players some incentive to try the chapter selection. There was no way I was going to be able to make three more games, but I could easily add some more videos or other quickly bodged together segments.

I don’t remember the exact thought process- it was Thursday or Friday by this point and I was very tired- but I settled on making a very nice looking static scene (a version of a real scene I’d previously had in mind), an infinite loading screen (a joke I’d used before), and a fake text adventure that immediately kills you.

The static scene was made in Unity, although I created a new project for it this time. At one point I wanted to make it an in-engine part with maybe a little interactivity, but that was quickly dropped, partly because I was very worried about file size by this point and I knew a video would be smaller.

I used a premade environment from the Asset Store, and I was looking at a few models from there as well before I decided to pull out a very nice model I’d downloaded from blendswap (I think, could have been cgtrader) ages ago. It was never made for games, isn’t rigged at all hence the weird pose, and the materials were all messed up. It didn’t have textures at all for the pistol it came with, but fortunately was divided into objects so I could replace it with one from the Asset Store and it only looked kind of terrible.

If you didn’t get the “fuck you Jason” reference, go back to Beach Defend 2000 and give the bonus track (warp to stage 51 or dig it out of the StreamingAssets folder) a listen.

The loading screen is dirt simple. It’s not entirely static, you can turn the model and zoom in and out like Creation Engine loading screens. The gun is one of the extras in the pack I bought for Chapter 7. This section did not use CommonCore, and used Unity 2019.3 instead of 2018.4, just for the lulz. I’d previously made a nearly identical “joke” as an April Fools project and recycled it because I figured nobody would remember.

The text adventure isn’t really a text adventure, just two static screens that kills you no matter what. I decided to make it all in bad German with Google Translate, I guess to make it more incomprehensible or something. Russian might have been better since two of the themes related to it but I already had a “bad translation” chapter with a German title I wanted to slot it into. It was also built for .NET Framework instead of .NET Core to save space, at the cost of only probably working on people’s computers.

It took me a few tries to get these chapters added properly to the project build and the launcher code because I was so burned out by this point

End Credits

Visual pun!

A badly sung ending song was pretty much at the top of the list of things I wanted to do this time around. I had decided on doing a Nightwish song early on when this project was still under the working title The Greatest Show On Earth. There were a few possibilities, but in the end I went with Nemo because it’s the first Nightwish song I ever heard. In retrospect, one of the many songs called “Impossible” would have been a better choice (although the only one I know is the one Exit Eden covered).

The backing track is a MIDI I rendered via OPL emulation for another project and kept around because I am apparently a huge data hoarder. The actual singing was done over a karaoke video on YouTube which was good enough for even me to follow.

The voice track synced with the MIDI almost perfectly, and on only my second attempt at lining it up! I was amazed- I was expecting it to badly desync by halfway through though for something like this I would have been content to leave it anyway.

I wanted to do more with the end credits visually, but I was running out of time and energy by that point, and putting in the big credits scroll almost crashed Premiere Pro so I didn’t want to push my luck any further.

Bonus

The little bonus at the end (in the menu incorrectly titled The Wizard Man in 1.0, corrected to Out Of Order in 1.1) is one of the parts I had the most fun with. I’ve talked about how this came about in the first part, so I suppose I should talk about how I did it.

EnigmaticCynic suggested “Uncivil Disobedience” as a title, but I wanted to do a kind of physics pun like Gearbox did for the Half-Life expansions, as I was kind of thinking along the lines of an official third-party expansion. I racked my brains for a while before coming up with active resistance as a near-synonym for uncivil disobedience. That’s not a real thing, but dynamic resistance is!

I had to take a few liberties with Frank Mallone since he doesn’t actually have a face in the game. I think it turned out pretty well. The resistor exploding was originally drawn too small and I had to redraw it; the original version looked better, especially the explosion. For the girl I was trying to do that iconic twisted comic book pose. I struggled with it a lot because it doesn’t make physical sense. The black helicopters were added late for flavour, and the background is actually two gradients overlaid. Finally I dug out the “retro” XCVG Systems logo variant and made up one for Enygmatic, and made a halfassed attempt to match the fonts from OUT OF ORDER.

Sauce engine? Not sure how that came about. It’s a pun on Source Engine and I was probably very tired.

I wanted to do something more than a static image, so I decided to add a voiceover. Trying to mimic the voices in OUT OF ORDER was difficult but it turned out well, and the processing I did to the audio helps mask the differences a little. I needed a visual for that so I decided to do a tape deck. It’s just two frames and almost looks like it’s spinning. Kinda wish I’d gone more retro-futuristic than just retro, though. The music I threw in on a whim when editing it all together in Premiere Pro.

The voice tracks were recorded in Audacity from my headset mic, then processed a bit, exported in pieces, assembled in Premiere Pro, exported as a whole, brought into Audacity again, processed, exported, brought back into Premiere Pro, and composited with the video. Why did I do that, and why did I use Audacity when I have access to Audition?

I don’t know. It’s a game jam.

Platform Build: Mac

It’s a cheap, tired, mean joke, but I couldn’t resist making it. This was before the WWDC announcement but I think is slightly funnier now that that’s happened.

I actually played with XCode a bit leading up to the jam and built something very similar mostly because I couldn’t figure out anything else. I figured out that yeah, I can do this, and yeah, I still hate XCode.

It’s also padded out with 800MB of junk data. I made this by taking video files, compressing and encrypting them with 7-zip with a key I don’t know, and deleting the header in a hex editor. For all intents and purposes it’s garbage data. Later I found out that said hex editor (HxD) can generate random bytes directly. Oh well.

I later threw in a version of the text adventure thing as a small bone for Mac users but it requires .NET Core and it isn’t obvious that it can be run so that probably didn’t work out so well.

I have made efforts to support Mac users in the past, but given recent developments that will end soon as it just won’t be feasible for me to do anymore. In this particular case there was never any chance of this project running on anything but Windows since I used a lot of platform-specific technologies. Even if I hadn’t, the burden of testing something so complicated on such disparate systems with so little time would have been prohibitive so a Windows-only path was chosen early on.

Platform Build: Linux

The “Linux version” is just a bunch of broken source code with no chance of actually building it. Some of it is real source code from this project, so it might be worth downloading and digging through if you’re curious.

Like the Mac version, it’s kind of a cheap shot at users of that platform. I kind of regret it, but only kind of. It seemed like a funnier joke at the time but now just seems means.

I later threw in a version of the text adventure thing as a small bone for Linux users but it requires .NET Core and it isn’t obvious that it can be run so that probably didn’t work out so well.

I think this one has real videos in it as well but I’m not sure.

Platform Build: Windows 32-bit

The 32-bit build is almost half the size of the 64-bit build. There is a good (terrible?) reason for that.

While the launcher and most of the documentation are real, the rest has been “converted” with a custom tool that literally removes half the bits. I mentioned this in passing before the jam, I think I had another use in mind when I created it but this was the perfect application for it.

Obviously none of it will actually work.

I used to support 32-bit Windows, but I don’t anymore. With the exception of some very low end laptops and tablets, the last PCs incapable of running 64-bit Windows were sold well over a decade ago. These machines are so slow by today’s standards that anything remotely intensive- including nearly every game I make- won’t run on them in a usable way at all anyway.

 

Closing Thoughts

This really was a crazy plan for a one week game jam, as I think the length of this post can attest. I’m not going to lie, it was stressful, and I pushed harder than I’d planned to push. But it was a lot of fun and I’m pretty happy with what came out in the end despite its flaws.

The next post will be the final part in this series, and probably the shortest. I will go over some of the things I wish I’d had time to do and some of my possible future plans.

Get RiftBreak

Leave a comment

Log in with itch.io to leave a comment.