My 25th Ludum Dare's Postmortem: "Prince Charmony"
"I better not touch that Postmortem Ruining Device 3000."

"Oh no! Somebody else made this postmortem too long!"
The idea:
So the theme was "Tiny Creatures" and the first thing I though of was a disney princess singing to woodland critters as a means to make them do your bidding. Unfortunately, I'm a Bass/Baritone and not a Soprano, so let's make the princess a prince this time.
Prince Charming... singing a harmony. Charming... Harmony... Charmony! Good enough for me!
Goals:
I've been trying for 8 Ludum Dare's now to make a really good "tree swaying in the wind" shader. There's a good screenshot in my LD54 postmortem of the tree shader going wrong and being abandoned. Actually, to quote my previous postmortem, "I could absolutely boost my graphics ratings with some neat shaders." I wanted to go all out on graphics this time. It's been a while since I've scored in the top 10 of graphics, and my art has improved a ton since then.
On top of focusing on art, I wanted to mimic the story-telling of my LD 53 game, Inbox Fool. Having a villain that taunts you in every level (as well as making bad jokes) is a very natural way to put my bad sense of humor into my LD games, so I plan to do that too.
These goals will be explained in the following sections: * Shader-land * The Critical Blunder * Okay, what the heck was that story? * A lot of singing * Let's talk about why I ran out of time.
Shader-land:
Let's make some trees that sway in the wind.
Step 1, separate the trunks from the leaves.

To make the leaves sway, we'll create a texture for the shader. The purpose of this is to seperate each chunk of leaves into their own sections that sway individually. We want the tops of the leaves to be fixed on the tree, but the lower parts sway further than the higher parts. Imagine a gradient from black to white, where darker shades of grey represent less movement, and lighter shades represent more movement.

Now in the shader code, just scoot the pixels of the leaves over to the right some distance, multiplied by the brightness of that pixel in the lookup table texture. (Multiplying by a dramatic amount just to highlight the effect. Obviously the trees swaying this much looks bad. The key is being subtle.)

Modify the amplitude of the displacement by multiplying by some sine wave over time, and you've got some reasonable tree swaying!
There was another effect I really wanted to create. You know when you're walking through a forest and there's a patch of spotlights as the sun pokes through the leaves? A bunch of little pinhole spotlights would really make the forest scene a delight.
Step 1: Make a circle.

By adding some "cutoff" value, we can make the circle solid instead of blurry.

Step 2: Fading luminosity.
I want the circle to be bright when it's near some target point, and fade away as the circle moves from the target point.
I started by adding the target point, and setting the pixel's brightness to be the pixel's distance from the point:

Not quite what I was going for. Instead, set the brightness to the distance of the circle's center from the target point:


Looking good!
Step 3: More dots.
Okay, so how do we scale this? The way I'm creating the circle reminded me of voronoi noise! (Which is way too much code to put in a single screenshot, so from here on out, I'll just show the results)

Applying the fading luminosity, and we got something looking like this:

Step 4: Replacing the luminosity "point" with perlin noise.
Using a perlin noise texture, I performed some math to create "blobs" that would be hotspots for the pinhole lights.

Now instead of using math to calculate the brightness of the circle, I just grab the value from the perlin noise:
I also added multiple layers when I move the dots around, so they aren't all in unison.

Oh yes.
Make all the local texture coordinates into world coordinates, and you've got yourself some neat tree pinhole spotlights!

The Critical Blunder:
It really wouldn't be Ludum Dare if everything went right. So there were framerate issues. I was half-joking with a roommate that I'm being punished for having a really good GPU, but in hindsight I really do need to test my game on a laptop or something. I think a lot of us have been in a situation during Ludum Dare where we are mentally exhausted, we're rushed for time, and not thinking clearly. This is one of those situations.
So the pinhole shader is looking cool, but I want more spots, you know? Let's loop the existing code, oh- I don't know... 60 times.
I'm such an idiot.
Now, initially I set that number to be like, 100. It looked great, but in the Unity Editor, I was also getting some dips in performance. Granted, this was with the scene viewer, which on my monitor was around 2500:1000 pixels. I forced the resolution of the game to be 768:512, which dramatically cuts down on the number of pixels in need of calculations, which fixed the performance on my end. I also then cut the number of iterations from 100 to 60, so I figured it was good to go.
After reports of bad performance, I knew exactly what the cause was. I modified the shader and capped it at 4 iterations, making a Post-Compo "light GPU build". It looks basically the same.
Dang it.
Okay, what the heck was that story?:
Or, "How I recorded a ton of lines that never got implemented because I ran out of time." I ran into a similar situation in LD52. Voice lines were recorded, but there wasn't enough time to implement them. Here was the plan:
The story of the game is as follows. Your golden parrot is stolen. Now, under the control of The Dissonancer, your parrot will act as a messenger, delivering the stupid messages the boss has to say. The message for level 1 read:
"MYRAH! Look, I'm your parrot! I'm loyal to The Dissonancer now! Ha, just kidding. It's me! The Dissonancer! I already taught your parrot how to say this message. Uh- Don't question it. I'm just going to be "mocking" you through this "bird". Squawk- this is your parrot speaking now. Ohhhh, you're gonna miss me! ... Okay, how do I tell the bird to stop recording? Is there like, an off button or a command? This was a good message. You should fly over to that Charmony dork and let him hear it."
And I had stupid banter for some other levels as well, but I was RUSHING to finish everything and it didn't make it into the game, which is devastating because there were some really bad jokes in some of those banters, and I really wish they made it into the game.
Anyway, all that's left of the story now is: the wall is destroyed, the Dissonancer steals the parrot, the parrot sings the boss fight music (but there's no animation or indication that it's the parrot singing it.... oh well), and then you get the parrot back and explain why you can't pay to have the wall replaced. There were more references to the wall in the unused dialogue, and it would've made the payoff at the end so much stupider.
A lot of singing:
This is the sixth Ludum Dare in a row in which I've added Acapella music. I'm still not an expert, but it's fun!
Since this game revolves around singing to creatures, naturally I had to sing some music. I'm not actually a professional, (and I thought it would be really funny if it's obvious Prince Charmony isn't either) so his "singing" is mostly him going "Doo doo doot doo doo! Blah bomp. Bwa dunna domp blomp womp!"
Before I talk about the boss fight music, let me take a brief moment to talk about the new things I tried with my synth music. I picked up some slap bass VSTs, and oh my god... I cannot believe I hadn't been using slap bass this whole time.
And as always, the acapella is way easier to make if I already have a synth version made first.

As for the acapella boss fight music, I had big plans. I know I've done it a lot this postmortem, but allow me to refer to a previous postmortem. In my postmortem for LD55, I wrote "I realize I forgot to do some cool stereo effect, with one set of vocals specifically in one ear, and another in another. Oh well- Next time!" and I can safely say, ladies, gentleman, and everyone still listening, "we got 'em".

For all those who doubted me, I say:

I can't honestly think of something that went wrong with the music, which is a relief considering a lot went wrong with the graphics. I added stereo effects, chords, and it sounded great! Perhaps the music could have been a longer loop, but I haven't heard anybody complain about the repetition.
Let's talk about why I ran out of time:
Okay, so I over-did it on the art. I spent 5 hours on the background. And in Ludum Dare Compo terms, that's a LOT of time. It wasn't just to try and score well in graphics, but more importantly, I really struggled to make a "game" from my concept.
One idea I had for the gameplay would be to set up a rube-Goldberg machine using the animals to move an orb to... I dunno, a sleeping deer or something. Another woodland creature of sorts, who would then point the way to the next level. The puzzles would be all about setting it up, and watching it go, but I was not sold on that idea.
I wanted to make a puzzle game akin to my LD53 entry, Inbox Fool. I scrapped the rube-Goldberg machine idea, but the phrase "solid cube of birds" rung comically in my mind. I needed to make that. Frogs being bounce pads also made sense in my mind. I had a game coming together.
I initially couldn't come up with enough interesting mechanics from the critters, so as I brainstormed, I drew art. The rabbits were specifically the animal I struggled with. The birds and frogs both provide vertical movement, and I needed to make sure the rabbits were actually important. My first draft ideas included them becoming a ladder (vertical movement. bad.) or a placeable singing-platform. For people who didn't play me game, the singing platforms are where you can command the animals, so being able to place one would make for interesting puzzles. I assume.
In the end, rabbits making tunnels sounded really cool, but wow that's more vertical movement tools. I guess they can also make a bridge, I don't know. And viola! All creatures got ideas, and wow I spent 5 hours drawing the background while I figured this out, it's time to program stuff now.
Polish as you go.
Call me dumb all you want, but you cannot deny my games have presentation. (and yet I wonder why I run out of time so often)
Once the trees were moving, the tree-pinhole-spotlights glowing, the character moving, and the camera smooth as butter, I got started implementing the woodland creatures.
The big takeaway from my LD52 game, "The Bountiful" was (and I repeat this in every postmortem) "Focus on a single main mechanic, and let the story come second".
Despite "commanding woodland creatures" feeling like a single main mechanic conceptually, it was really 6 individual mechanics that all needed to work perfectly together. Birds need to be solid cubes and double jump zones. Frogs need to be bounce pads and boosts to jump height. Rabbits need to be bridges and tunnels. Then I need to program the singing-platforms and the HUD elements to go along with the animals.
Then I wanted a boss fight akin to Inbox Fool. That game flipped the main mechanic on it's head, but I couldn't find a way to flip the animal commanding into something new. You basically just collect the animals and use them to defeat the boss.
And I wanted 9 levels before the boss. 3 levels for each animal to be in the spotlight.
The timeline of this LD was: Draw characters and all animations, draw woodland creatures, character movement code, QOL features like coyote time and buffered jumps (pressing jump briefly before landing will still jump after you land), sleep.
Draw foreground elements, background elements, shader code, program birds (fun hopping animations, cool patterns in bird-cube-mode), singing-platforms and HUD, program frogs, start writing music, title screen art, sleep.
Program rabbits, make 3 bird levels, I made 1 frog level, 3 rabbit levels, finish writing level music, and sing the acapella music, make the boss room, draw/animate/voice both cutscenes, record a whole bunch of banter dialogue that got cut, make the remaining frog levels (all levels complete!), add code to progress from one level to the next, pressing R to reset a level, implement the title screen code, add the victory screen + speedrun timer, program the boss fight (the barrels are just a copy of the player movement code, you can tell I was panicking!), pause menu, and publish!
The pause menu almost didn't make it. I was rushing the whole weekend.
Reflection
I'm writing this before the results go live, so these are my genuine feelings about the game with no bias towards how the results may ruin my opinions.
I like it. I'm comparing the art from my LD45 game that scored 10th in graphics. It was another game featuring a forest as the backdrop, and just look at the difference!

As for improvements to the art, I think the solid-black parts of the foreground should have been a dark brown. I think the background might be too saturated, and some parts could be confused for solid objects. I've also been told a few times that the background does not match the art style for the playable character, which... yeah. As I become a better artist, I should probably do something about my character art style. I absolutely love the very simple designs (and I'd like to emphasize how quickly I can draw in this style) but if the character does not match the background, it feels weird. Perhaps the real issue is the background being too detailed, ha! I'll try and make the characters match the scene next time.
The puzzles in my LD53 game, Inbox Fool, were poorly tutorialized, and I think that applies here as well, but it's slightly better than my LD53 game. Some other shortcomings with this game include janky corner clipping. You could sometimes clip upwards and reach platforms you otherwise shouldn't be able to reach, which could potentially cheese a puzzle, or confuse someone who accidentally clips up thinking it was intended.
I think the music was perfect with this game.
Reflection part 2, What did we learn?
First of all, let's address all the points from the previous postmortem.
"Focus on a single mechanic, and let the story come second"
It became 6 mechanics, but I think I did a good job. There was a lot more emphasis on the levels and design than emphasis on story. (Story elements were even cut because I ran out of time)
“Get feedback before the deadline”
Okay... so my roommates were both gone this weekend too, ha. I reached out to some friends on Discord when LD started saying "Hey, will you be around to test this on Sunday around noon? (6 hours before submission)" and I got a handful of people ready. Alas, I was so rushed for time I wasn't even able to make a build for testing. I had too much to do, and, wouldn't you know it, that came back to haunt me.
Okay, what would we have learned this time? The framerate issues. One of the puzzles consistently stumps every one of my friends, and some corners were clippable. All of that could have been fixed.
This is something that I will make a priority next Ludum Dare.
“Make sure the camera isn’t jank”
I made a 2D game this time, so that was easy. I actually started with the camera before I even figured out what I wanted the game to be. I wanted it to be smooth as butter, and I can safely say I did that.
"Make another game with an interesting mechanic, broken into a series of small levels."
I took that to heart, and you bet it worked out. This game was a lot more fun to make than my fancy cutscene/dialogue engine with a game attached.
What did we learn this time?
I pretty much want to just repeat the lesson from LD53, about getting feedback before the deadline. To actually add to my repertoire of lessons from each LD, I'm going to say the big takeaway here was test the game on the worst laptop you own. My roommates have computers of similar quality, so the framerate issues present in the game wouldn't have even been noticed by having them test it.
Also, if I'm going nuts with shaders, just don't be dumb about it. Perhaps that's the real lesson.
The Results
13th Overall
15th Graphics
6th Humor
1st Audio
Reflection part 3, and Conclusion
Honestly, I'm satisfied with the results. I'm a bit befuddled by my score in graphics just barely not being better than my game from 11 Ludum Dare's ago, but I've noticed LD results are incredibly varied sometimes. Luck of the draw on who rates your game, I guess? But also the frame rate issues likely played a part in losing a few points there.
Honestly, now that it's all said and done, I think I should spend less time drawing detailed background, and perhaps trying to stylize the heck out of things with simpler designs. I spent so much time on the art that the rest of the game was rushed, but if I'm going for cartoony, why not go all in, you know?
And, Woo! Another trophy in Audio! The acapella music seems to work. It's such a shame there were voice lines that didn't make the cut, as that probably could've boosted my Humor score a little more, but oh well. We'll get 'em next time.
All around, this one was a great time! It was fun to develop, which instantly makes it better than a few of my previous jam games. I like the puzzles I made, and the world I built. I really can't ask for more.
Anyway, that's it for Ludum Dare 56! I'll stop myself from rambling even more. See you at the next one!









Here is the second devlog of the post jam version of 














