I made Loop-D-Pool for the 2025 GMTK Game Jam, with the theme "loop". Like last year, the jam was four days, instead of two days like other years.
Some things that I thought of after hearing the theme that ended up inspiring the game:
I thought loop-de-loops and the not-going-left mechanic from One Way wouldn't work together, since loop-de-loops require you to go left at the top of them (this was partly because I was misremembering that game as having ratchet scrolling, rather than just disabling the left arrow key; maybe I could have made that work, with being unable to move left except in loop-de-loops), but I remembered I had other ideas while making One Way, like making the whole thing on rails (like the mine carts from Donkey Kong Country). Incorporating water slides ended up with the idea I used in the final game, with water slides over a swimming pool, with the initial idea being a collect-a-thon where you go down different paths on each loop (like increasingly-elaborate versions of what the second level in the final game ended up being), though once I actually designed the levels they ended up not as collect-a-thon-y.
But then if the character can swim in the pool, they can move left, so how do I make them actually use the looping mechanic? Time limits! If I make water movement slow and water slides fast, then I can make it so you don't have enough time if you try to go backwards in the water but do have enough time if you just keep going forward and loop around.
My initial idea had the character being a mermaid, and starting underwater, and there would be some underwater sections with a lot of swimming and other sections that were above the water on water slides. At some point I remembered a mechanic from one of my other games (unfinished, don't think it's currently accessible without cheat codes) that involved jumping into water from high places to go lower (Yoshi games have a similar mechanic), and thought maybe I'd want a similar thing here, so I decided to have water physics that just let you dive a bit.
But then, a mermaid wouldn't make as much sense, since she should be able to swim more freely. I could have a ball or something that rolls along the slides, but I just had a ball-like character last year, and I've actually made four game jam games with that character, so I felt like I should do something different. What swims on top of the water but doesn't spend a lot of time under it… a goose! Or a duck. I did kind of want to have a goose, though, since they're less common in stuff, and I've been seeing baby geese a lot. Do goslings go in the water? I feel like I've mostly seen them near the water.
I ended up not actually having that much in the water, which meant I had a tutorial for a diving mechanic that was never useful again, though the intro section does provide a contrast between the slow water and the faster water slides. I also kind of stopped working on the water mechanics after I decided to focus more on just the slides, which is part of why rising up after a dive is so slow in the jam version. I also initially had the camera always center vertically on the player, which caused a lot of vertical movement when the character was in water which I worried could cause motion sickness or something; a bit later in the jam, after I realized there was nothing underwater, I decided to have the camera locked above a certain height, which ended up fixing that problem.
The diving part at the beginning did end up kind of being a tutorial for the down arrow key doing something. At one point I was trying to decide pressing Jump should do when the player is in a loop. In Sonic (at least the original Genesis games) it jumps perpendicular to the loop, but that would make jumping off ramps not work as well (at least if I wanted to be consistent), so jump is always up, which meant that I couldn't use it for dropping off of a loop, so I used the down arrow for that.
I chose spirals as the collectable because I was thinking recentlyish about how hearts and stars are both abstract symbols with vague enough meaning that they've been used for lots of different things in video games, and was wondering if there were other vague symbols like that that weren't used as much, and I thought of spirals. They're also kind of loopish (they go around in circles) and kind of not (they don't actually get back to their starting point), sort of like a loop that's stopped being a loop, so they make sense for their use here.
I included a grapple mechanic because there was at least one previous game where I wanted a grapple mechanic at first but ended up not including it (Disconnected Space, because it would fit with the "joined together" theme), and also I could have the player go in a circle around the grapple point.
Super early on (before I decided on the water slide thing), I had ideas for maybe making a programming-related game (because that could involve loops), or maybe making a game about turning finite automata into regular expressions (those can be sort of loopy). I didn't come up with much more than just the basic idea for those. Some sort of maze also occurred to me.
I had some thoughts early on about reversing gravity; maybe there'd be a loop with a hole on top, and when you went through it, you'd fall up. Or maybe one of the levels would take you up so high you'd end up in outer space, which could have swimming mechanics (back when I was still thinking I'd have underwater swimming), and then you'd stay up there for a few levels and then have a really big slide coming back down. Or maybe one of the levels would be Möbius loop themed, and the looping part would be upside-down, but then that would mean I'd need water on top which might not work with the space idea. And the Möbius loop level could also have loops that twisted so you'd end up on the outside (but that would be a bit complicated to implement).
After I actually started the game, I was thinking one of the levels could have a bunch of platforms at different heights where you had to go through one loop to see which platforms the spirals were on, and then another loop to jump between the platforms, maybe have a loop-de-loop around the outside that you could go around on your first time through the level when seeing where the spirals were. I made the level (at that point the third level, after the first two that are still in the final game), and it didn't work as well as I wanted, not interesting enough and if I included the loop-de-loop it got in the way. Here's a slightly-more-finished and slightly-more-playable version:
I had an idea for a level where the water slide was in a spiral shape and you collected a lot of spirals with a magnet, but I ended up not making it, partly because I made "Big Loop!" which used the collect-a-lot-of-spirals-with-a-magnet idea and partly because I wasn't sure if I could orient the spiral in a way where you could actually get on it and get enough speed to go all the way around.
The last level is basically a scripted path where you have to jump once, and I was envisioning more levels like that (but with more jumps) than what I actually did.
The game has code for water slides that have different speeds or that have water moving to the left instead of right, but that's unused (and untested).
Graphics for the water slides was originally going to be completely different, having segments with a blue-to-white gradient moving along at the speed the water is going, but I decided that might be too difficult to implement in the time I had, and once I saw how fast the waves were moving once I decided on having waves instead, I thought maybe my initial idea would have too much fast movement.
I wanted to do more stuff in the background… at one point I was thinking of having a sprinkler at one point come on screen that would show a rainbow if you saw it from the correct angle. I wanted a rainbow somewhere. The spirals are at least rainbow-colored. I also thought about having the sun with some lens flare effects, but I ended up deciding the sun is behind the camera.
Like most of my jam games, I used a framework I've been making based on code from previous jam games, and like most of my jam games, I wrote most of the physics and level loading code during the jam, though I did a lot of things similar ways to previous games I've made.
Each water slide is made up of segments, which can be either straight or circular arcs. When the duck lands on a water slide, she moves only along that slide until she jumps or falls off, and all collision with water slides is disabled. This means that the other side of a loop doesn't get in the way, and slides can cross in front of each other as much as I'd like, but it does mean I can't really make walls.
If you're on a water slide and pressing right, the game tries to make you move at 6 px/frame (4 px/frame from the moving water + 2 px/frame from the duck's speed). At some point I realized this was too strong, and you weren't able to actually build up speed, but then my attempt to fix it broke existing levels (jumps that previously lined up perfectly now massively overshot). My solution to this was to just disable the code that accelerates you towards 6 px/frame (or 4 or 2 depending on what key you're holding) if you're going faster than 7 px/frame.
The game keeps track of three levels at a time (these can point to the same object): the level the duck is currently in, the one to the left of it, and the one to the right of it. When the duck enters the level to the right, the it changes the level on the left to be what the current level used to be, the current level to be what the right level used to be, and the right level stays what it was (so that it loops). Also the duck's position moves to the left one level-width, so that her coordinates are always relative to the current level. If the right level has all spirals collected and it's off-screen, then it advances to the next level.
This means that if you're too close to the right edge of the level when you collect the last spiral, you'll have to loop an extra time, because I didn't want the level change to be visible. I later added a feature where if the beginning of the next level is the same (which is something I had to manually specify) then it can change the level while the part that's the same is still visible. A lot of later levels start with a platform in exactly the same place to take advantage of this.
The level data format has ways to specify trails of spirals that follow a water slide or that follow the character's jump arc or are in a horizontal row, though I had to manually place the spirals in "Loop Around" (a circle around a grapple point) and the rows of spirals in "Big Loop" (the loop that has a lot of spirals you collect with a magnet). Colors are assigned automatically based on the spirals' order in the level data, though I can manually override this.
In the jam version, clocks don't do anything if you have a spiral magnetized towards you. This was done both to prevent a bug (spirals didn't reset to their original positions if the timer didn't actually run out; I knew why but didn't want to fix it properly) and to make it so you don't accidentally reset when you just need to collect the last few spirals that have already been magnetized.
Magnets work by increasing the hitboxes of all spirals. If you touch a spiral once, it gets magnetized and shrinks its hitbox, and if you touch it again, you actually collect it. The code to do this doesn't actually check if you have a magnet (assuming you'll touch a spiral for at least two frames), so there's a bug that I knew about and left in that can happen if you touch a spiral for exactly one frame.
I was going for sort of a tropical beach vibe (because water). My biggest inspiration for the music was Beach Bowl Galaxy from Super Mario Galaxy, which starts with an arpeggio going up and then a bunch of repeated syncopated notes. I also started with an arpeggio and some repeated notes (but different), and used syncopation (but differently), and then went in a different direction from there.
For the main instrument, I was trying to go for something steel drum–ish, but I don't know that I got that close. (I used additive synthesis, adding together sine waves of different frequencies, and I did it just by ear, and I don't know of any good resources for doing that well.) Some of the other instruments I copied from Framed Animals.
I was worried about the music getting too repetitive due to looping, so I copied it and made a few changes in the second loop, and then copied it again and made even more changes in the third loop.
The sound effects use notes from the current chord in the music, which is something I did before (also in Framed Animals), though it's more noticeable here since there are rows of items that you have to collect. That feature from Framed Animals was in turn inspired by Super Mario Galaxy, which does something similar with a few sound effects.
I had an idea for a thing I could do in a slower middle section (thinking some levels could have different music), which involved changing the rhythm of part of the main theme, but I ended up not having any slower-paced levels to use it in. I ended up using it as the ending theme.
Wednesday:
Thursday:
At this point I was thinking I was close enough to being done with the mechanics that I could spend most of the next day working on levels. I also still had placeholder graphics (the player being green sometimes is a debugging thing, it shows whether you can jump or not), and there's a bug where collecting one of the spirals (red circles) actually collects multiple spirals (which I hadn't yet noticed since there was no sound effect or on-screen spiral counter). Play this version (slightly modified to make the text on the buttons visible, since there's an issue with my template that I haven't gotten around to fixing; also I had decided on a title, just hadn't put it into the game yet)
Friday:
Okay, so I did have a lot more non–level-design things to do. But I have made games in 48 hours (and I'm farther along than I was at this point when making Disconnected Space), so I should still be able to finish… on the other hand, I've made games in 48 hours before, so why am I not done except for polish and/or even more levels than I had before? Play this version
Saturday:
After uploading that and putting my computer to sleep for the night, I realized that there was a thing in the top-left corner that showed a bunch of debugging information that I forgot to turn off. (You can enable it by typing DEBUG_DISPLAY = true;
in the web console. It shows the player's x and y positions, x and y velocity, speed the last time they were on a water slide, and in the post-jam version, the framerate. Color of the text changing doesn't mean anything; it just uses the color of the last thing drawn, which is either other text (black) or the clock icon (white).)
Sunday:
I got way more ratings than I usually do (123; my previous highest was Disconnected Space, with 25 ratings), and I don't know why. Did someone stream my game that I don't know about? Was my thumbnail/title/tagline just that good? Are there people who sort by most ratings and amplify whatever initial noise there is?
I participated less in the ratings this year and last year than I have previous years… I think partly I'm just kind of more tired after a longer jam, and also the amount of time we had to rate stuff was less (I think I tended to rate more near the end of the rating period).
A couple people had issues with the spirals not catching up to them with the magnet. That was intentional (or at least something I knew about and decided not to fix); you're supposed to find a way to slow down. (The clock in "Jump! Jump!" does look like it's going to get in your way, but clocks don't activate if you have a spiral going towards you… which probably wasn't clear enough, and is probably also the issue with a different comment complaining about not being able to retry because the timer ran out. I've modified some things in the post-jam version that should hopefully help with those issues.)
Some people had issues with Z to jump (which is fairly common), which has happened at least once on a previous game, but at least this time they said what they expected the controls to be. Space bar, which is fine I guess (though I'm not sure what they'd expect for attack in games that have that), I can add that as a default control, but up (or W)? I think all platformers I've played (except possibly some jam games etc., since I don't remember all of them) have had jump and horizontal movement on different hands (notably things like Mario, which have movement on the D-pad with the left hand and jump on A or B with the right hand; also some platformers (including a couple that I made) use up for something other than jumping, like aiming or climbing). Are there a bunch of platforms that I'm just not familiar with that use up for jump, or are these people who just don't play platformers? (Also are some of these people who complained about Z to jump trying to use WASDZ even though both times I listed the controls give WASD+J and arrows+Z as separate options?)
(While arrows + ZXC isn't the same as 8- and 16-bit console platformers, it does keep actions that are on the face buttons in those games together, so I could easily see this as being a divide based on how familiar one is with console platformers from that era. Also notice that in my game, Z is both jump and accept in menus by default—I'm thinking of Z as the A button on an NES controller or something similar.)
Despite getting more ratings than usual, and despite getting a bunch of positive comments, I ended up doing worse in rankings than other years (except the two where I agree that my game was worse than usual), even though I didn't feel like my game was actually much worse, and I don't know why…
"I'm just going to make a few tweaks to levels to make them easier, change the water physics a bit, maybe a few graphical improvements, shouldn't take too long." And then I just kept finding things to add or change…
I added two levels in the middle, and made some major changes to some other levels, because of a thing Mark Brown said in one of his streams of the jam games, which was about having a tutorial level and then levels using the mechanic, and I have a bad habit of only putting a tutorial for a mechanic and then nothing else. In the post-jam version, I tried to have at least one level using the mechanic after each tutorial (not three like he said, partly because I misremembered but also I initially didn't want to add any new levels due to not wanting the speedrun to be too long):
(Wait, I could have another magnet level… "Big Loop" doesn't use grapple, I could move it earlier… darn it! I thought I was done making changes to the game! …Okay, done.)
I also added X to quack, because every game where you play as an animal needs a make-animal-sound button. The quack, like the music and all the other sound effects, is synthesized, and I'm not sure I did a good enough job (I'm worried people will judge it who expect every game to use sampled audio).
I made rising up in water faster, which was a bit tricky since it's too easy to accidentally have the duck start rising and falling with increasing amplitude.
Also more graphics. Moon is associated too much with night, even though it's visible during the day, so we need more daytime moons. Bushes reuse some code from the clouds, but are recolored. Also I changed the color of the pool's tiles to green to blend in with the bushes (I initially chose a color close to the sky so it would look less like a platform you can stand on).