Rogue Reflections Postmortem


About Me

As a bit of background about me, I'm a full time software developer, I've been working professionally for 10 years, went to college 3 years prior to that, and have been dabbling with programming since I was about 12.

I've always had an interest in game development, but never got into it due to a lack of understanding and drive to do more than dabble with small prototypes.  Years later, a little game jam called js13k caught my eye and I complete my first ever game in 2017.

What js13k taught me is I enjoy reinventing the wheel, and using pre-made game engines and libraries just did not appeal to me, which is a theme you'll see with all of the game I make (for better or worse).

The Goals

Most jams I set myself some semi-arbitrary goals about the design of the engine I write, and the game code around it; mostly to challenge myself or to see if there's a better way to do things.

  • I wanted to avoid using any kind of OOP patterns, and stick to a procedural programming style as it tends to lend itself to better performance and a lower memory footprint in Javascript.
  • Additionally I wanted to use a scene graph renderer as it has been my go to for a couple of games now, and both the ease of use and performance is top notch.
  • I also wanted to setup a CI/CD system using itch.io's butler command line tool, so I hooked that into a GitHub Actions build pipeline.
  • As my last 3 games had been card and dice centric, I wanted to try to branch out into another gameplay style.

The Plan

Day 1 of the jam I came up dry for ideas and just worked on some structural engine code (scenes, input, renderer, etc.).

The morning of Day 2 I came up with the idea of a mirrors and self-reflection focused roguelike / rpg. I wanted a dark moody atmosphere, low rez sprites, meta-progression, save files, and procedural generate dungeons to explore. A few times in the past I had an idea about using a simplified room-to-room traversal system for a dungeon crawler, so I decided to finally give it a whirl!

The plan on Day 2 looked something like this:

  • Dark and moody
  • Low rez sprites
  • Save File System for long term play
  • Meta-progression / Currencies
  • Crafting and Upgrade Systems
  • Procedural Level Generation
  • Remember to add sound and music (I often push this to the end and nearly forget)

It wasn't until Day 3 or 4 that I settled on the idea of having the combat be an auto-battling system, prior to that I bounced between the ideas of some sort of matching games, puzzle games, trick taking games, or dice games to take the place of the "combat" sections.

From this point forward is was just hours and hours of programming, art and trial & error as I worked towards the final product.

The Tech & Tools

Here's a quick run down of the tech and tools I used to build the game.

Tools:

Tech:

  • Typescript (Language))
  • Gulp (Build System)
  • Rollup (Module Bundling)
  • Terser (Minification)
  • Butler (Used for CI with itch.io)

Libraries

What Went Right

  • The core game play loop was completed by the deadline.
  • Game performance is great.
  • Controls are all mobile friendly.
  • Atmosphere for the game was what I was going for.
  • The game is very stable, I was able to find a squash the few bugs in the game prior to the deadline.
  • Overall the game was better received than I feared it would be.
    • 21st place overall
    • 3rd place in the web monetization category

What Went Wrong

  • It was a lot of work (~100 hours all in)
  • I was only able to play test the game for a few hours total.
    • The playable game wasn't complete until the final weekend.
  • I had to cut some content & features that while not core, would have been nice to have.
  • I did not have time to squeeze in an more in-depth tutorial.
    • This point was repeated in the comments about my entry, a lot of people felt lost when they started the game.
  • I didn't have time to compose my own music, so I had to use music I own that is licensed for commercial game dev.



Leave a comment

Log in with itch.io to leave a comment.