I made this game for Games Made Quick, a twice-annual game jam that takes place during a big speedrunning event called Games Done Quick, because the person hosting the jam was tired of wasting an entire week just watching speedruns.
The inspiration for this game came from a couple places:
- This jam often has some sort of optional ironic theme suggestions; this year, one of those suggestions was "the faster you go, the longer it takes". I'd already used the theme a previous year, for Stop and smell the flowers; in that game, you have to go slowly in order to get any points. This time, you're supposed to go fast, but the goal is to last as long as possible, so doing better means the game takes longer. (Also I made the game over screen take longer if you get a higher score.)
- During a previous jam, I'd made a game called One side, one jump (or 1S1J for short). In that game, I'd implemented physics for the character rolling down slopes. I kind of liked how that felt, but it seemed underutilized, since there weren't even any slopes until the last three levels (one of which is only sort of a level). I wanted to do something more with the concept.
- The name and the story were inspired by a meme from GDQ. In Super Mario World, one of the levels, "Sunken Ghost Ship", ends with an orb with a question mark on it (which is a reference to the orbs in Super Mario Bros. 3 at the end of every fortress stage). It somehow became a meme for the audience to shout "ORRRB!" whenever a speedrunner collected that question mark orb, so in this game, I made the player be the question-mark orb. The game over screen is based on the level clear screen from Super Mario World.
- Three of the power-ups have very similar effects to the shields from Sonic 3: the speed boost is similar to the fire shield, the double jump is similar to the electric shield, and the bubble shield is similar to the bubble shield. I don't remember how intentional that was; I think maybe the speed boost and double jump weren't intentionally based on Sonic 3, but the bubble shield was (I mean… I explicitly called it
BubbleShield
in the code), at which point I realized the similarities of the other two power-ups.
Some challenges I faced:
- Figuring out how to make sure the character can always move forward. In early versions, the character could easily roll down an upward slope, and I tried various ways of fixing that. At some point, I realized that what I had was similar to a game I played a long time ago called Wavespark by nmccoy (which unfortunately doesn't work on modern web browsers), so I looked to see what that game did; in that game, if your horizontal velocity goes below some minimum, it's just set to that minimum, so I copied that.
- Figuring out how to keep the player tangent to the ground (since in 1S1J, the player goes through slopes a bit). The way I solved it is that the actual shape of the ground stored in memory corresponds to where the center of the orb goes, and I draw the ground lower. Also the ground is made of line segments and arcs, making it easier to calculate where the ground should appear to be.
- Figuring out the right speed for the speedrunner (I'm still not sure if I got this right). I ended up having the character also having their momentum affected by slopes (which was not my original plan), since that could compensate for whatever terrain happened to be generated (if you get some steep upward slope where it's hard to move fast, then it'll also be hard for the speedrunner to move fast).
- I seem to remember the reason I added walls was because at that point you could win by doing nothing.
- I wanted to try to take the spinning of the orb into account when bouncing and landing, but I couldn't figure out the physics behind that.
- This was after the original jam was over (since it was a post-jam update), but actually getting the orb on the title screen in the right spot was harder than it should have been, because JavaScript doesn't seem to have a way to get font metrics that works on all browsers. I ended up drawing an O onto an off-screen canvas, and then looking at the pixels (from a Stack Overflow post).
- Speaking of post-jam updates, like I mentioned on the version history page, in 1.0 you could use the speed boost power-up infinitely many times. Using a power-up doesn't actually delete the power-up, it just sets a variable saying that power-up is used, and I forgot to check that variable. (The power-up has to still be active so that it can draw the animation for using the power-up.)
The game is infinite and procedurally generated, but it's consistent each time. In other words, I'm using a fixed-seed random number generator… kind of. See, there have been a number of times when having something like a fixed-seed random number generator would be useful, but I wanted something random-access, or maybe even something where I just give it a value (maybe not even a number) and get back a single random number. At some point, it occurred to me that there was a class of functions that already existed that had that property: cryptographic hash functions. So the random number generator I used is MD5. (This is a thing I've used multiple times before.) Consistent procedural generation isn't something that I see that often; the only other game I can think of that uses it is one of nmccoy's other games, Circus Peanuts (although AFAIK that doesn't use cryptographic hashes).
2021 Games Made Quick update
For the winter 2021 Games Made Quick jam, the theme was "don't make a game, make something for a game". My initial idea was to make a level editor for the games that I've made that have levels, which I could then use to make new games. (Actually more like a framework for making level editors; each editor would still have some game-specific code.) However, for various reasons, I ended up not working on it a lot, and then GDQ was over and I had 24 hours and not much done, so I tried to think of something I could do fairly quickly. What I came up with was adding audio to a game that didn't have audio, and I chose this game. But then while I was doing that, I remembered that I'd thought about making a manual for this game and developer's commentary, so I did that as well.