
Now that I've had a few days to breathe and think about what I did for the compo, I wanted to share a more in depth look at how I approached making a game in 48 hours.
Game here: https://ldjam.com/events/ludum-dare/44/the-oarsman
Friday
I think this was the most important night for me. I actually didn't do any prep for this and had no prior ideas what I wanted to do with the theme (I did for the color and shelter themes, but that was it), so while I thought of a theme, I did art. Specifically the characters sprite and the animation for running, jumping, falling, and backward dashing. Those two mechanics were the only ones I knew I wanted in the game - dashing and jumping. So on to setting up controls.

Playtesting vs Personal Preference, Accessibility vs Comfort
I play a lot of platformers with keyboards, so I know what I like. I like tight controls and fast movement. Therefore I balanced controls around that. Another thing was going for accessibility or comfort. For me, these are the same thing, but I know some don't feel the same. I wanted the whole game to be able to played with one hand so even if someone has problems using both hands, they can still play. I also thought it was intuitive to be able to dash in the direction you are moving, so combining movement with dash direction made the most sense to me. I intended to put controller support here, but it skipped my mind with all the other stuff. It's here I had the idea to put in a backdash when standing still, but because of time constraints, after the movement was further refined, it was left in because I didn't have the time to take it out.
Once I got the basic animations and controls down, I made the general use auto-tile template I use to speed things up. It was originally colored black and white as I hadn't settled on any kind of color theme let alone what this game was. At this point, I just knew I had this ghost like figure and wanted to save souls.

Adding shadow effects
Finally, before I went to bed on the first night, I wanted to get my shadow effects on the character (inspired by the Castlevania games I played as a child). I accomplished this by creating a brand new sprite every frame, adding it to a node which I had preset in the level template, and adding a script to it to force it to fade and delete itself after a set amount of time. This allowed me to constantly add the shadow but not add an endless pile of objects and create a memory leak. That was my biggest fear - creating memory leaks and bugs with this stuff. I'm happy to say I avoided that.

Saturday
This is where I got the bulk of my work done. I had thought of the color theme I wanted, a simple purple and blue background. That translated to night, therefore my game was now at night. I wanted it to be outside so I could use layered parallax backgrounds to make. So that was my first step. I created the night sky by simply coloring a large canvas a dark blue, adding a ton of noise, and then zooming into the noise to make the stars. The clouds and mountains are really just blobs with some layering. The trees are inspired by Shovel Knight's trees, but really it's just one tree layered and flipped. The moon is what I was most proud of, it was simple, but it's my favorite piece of art I did for this game.

At this point I added the dash animation you see in the picture above and with that, I started making traps and obstacles.
The theme
After this was all done, I finally decided on the mechanics for the theme - you must sacrifice your life to interact with objects and to save souls. With that, I went through and created the three basic interactions - souls, doors, and switches. I had added hearts to the UI at this point and had this all hooked up quickly by using groups and placing all the code within the player's script so I didn't have to do much if any scripting for objects.

Next, I needed to add danger.
Taking shortcuts
I don't know how to do AI that well, so creating enemies were out of the question because I didn't have time to teach myself that, so the solution? I'm making a platformer, let's use traps and spikes. The classics of the platformer genre. I took a few shortcuts with this. For example, instead of determining when they hit, all of that is done via collision within the player's script and placing all things that damage in a "danger" group. Next, I had built platforms at this point, so for moving traps, I simply attached the spike traps (a trap without any scripts) to a platform, and voila - I now have a moving trap that I can adjust to go horizontal or vertical, change distance, and change speed all from the ui thanks to exported variables.
I took he exported variable root with my range traps as well as you can see below where the direction Vector2 dictates not only the direction of firing but also the direction the sprite is rotated in.

Level Design
At this point, I started putting together a single level.

I wanted to show off just about everything in the first level, but still make it extremely accessible. All balancing was done without any power ups, so if I couldn't beat a level without power ups, I didn't think it was a good level. Placing a switch outside a building with the wall and soul all in view was to show the player the interactions. A hidden room with a lantern was clearly visible underground to try and show that there are hidden rooms to upgrade. Once I had the basic level design, it was already 3 AM, so I ended my night there with less than a day left to complete this.
Sunday
All the small things
So I had a lot to do and not a lot of time to do it. I woke up at 8 AM and immediately started working on sound effects and music because those add the most atmosphere. I used Bfxr and BeepBox to make 8 bit sounding music. At this point, I also wanted to put in an effect from one of my first projects I ever did - lanterns that disappeared and had light intensity that goes with the music. Godot doesn't have a lot of tools for this, so I used 6 different music channels each with eq values set to only pick up one range of sounds within the music and then used range_lerp to change it to the within the range of values I actually needed.

At that point, it was just playing with colors and lighting. I try and add some reference to either the bisexual or LGBTQ+ community in all my games, so I made 6 colored lanterns that I would use later all with the pride flag colors and mapped them to each of the 6 EQ busses I had set up with a white one for the music bus. From there it was creating victory music, creating level transitions, and various other small improvements to help the feel like shaders for the water and the bullets. Things that no one is going to stop and really notice unless they were missing.
The second and third levels
I originally wanted to do a level editor to make levels quicker, and if I had been doing the jam and had the extra day, I would have, but for the compo I didn't have time. So I reduced my scope from 8 levels to 3 and wanted to show off every feature I had put in within those three levels.
Level 2

I put in 3 souls and only required 2. Because of how agile the player is, movement wasn't a problem for me and if you grabbed upgrades, you would be even more agile - so I balanced around base power until I found it fun. I wanted platforms to disappear on a timer, so I added that and then placed the warning sound in a global audio node rather than a 2D one to give the player warning. This one was supposed to be difficult, but not impossible.
Level 3

I doubt many will notice, but it's actually just a big turtle with teeth. This was going to show off everything. I wanted it in the water as that was the original reason I wanted the water effect. I made this one - admittedly - very hard unless you had upgrades. Still beatable, but very hard.
Finishing up
The UI was the last thing I did. Adding sound options, credits, menus, and the theming were all done within about 2 hours total. This is the part I feel is the most rushed. I wanted to put more indications on what happened when you interacted with things and more indication what the coins did, etc. Mostly I ended up relying on sound design for that, but I don't think that was sufficient. I needed visual feedback, but I didn't have the time to put it in effectively. One of the nice things about how I design levels, is that playtesting was pretty much done at this point as I playtest as I create - section by section. There were still more things I wanted to add - options for various hearts, controller support, and better UI placement, but these were all lost due to the time crunch.
Post release feedback
This is where I think I've gotten the most value from this experience. It was my first ever compo and I've only been making games for about 9 months now, so this is the first thing I'll have published for more than friends or people who watch my streams get to see and give feedback. There have been extremely helpful feedback that's shown the faults of the game that I didn't even consider. All of it reinforcing the idea that player testing is not only important but necessary.
Overall, this was super enjoyable and something I'm going to do more of - though maybe next time I'll be able to improve thanks to the experiences from this one. This one was kind of a "let's wing it" experience, the next one - I hope - will be more planned on my part.
