This is more of a development diary so please excuse the wall of text.
For a long time now, I wanted to make a narrated game, ideally in the style of Bastion or Little Big Planet where the narrator is in on the fact that we are in a video game.
I have also been taking piano lessons for well over a year now and I wanted to make a more orchestral soundtrack using some of the knowledge I gained during that time.
As always I tried to keep distractions to a minimum so after my family agreed to go on a weekend trip, I was down for Ludum Dare and had the house to myself.
Unfortunately I had came down with a cold two days prior, so I needed to take care of getting enough rest, especially since doing voice work with a stuffed nose was not going to happen.
I always try to pick one of the finalist themes a day before the jam and think about what kind of game I would like to make, just to get into the problem-solving mood.
I chose Each Playthrough Builds on the Last and thought about making a game where the hero is constantly killed by a Bond villain's contraptions that explode in the process and change the environment for the next attempt which then lets the hero overcome the challenge.
Day 1
I woke up to the theme Sacrifices must be made and had to scrap the Bond villain idea. I'd have loved to act out the bad guy, but maybe another time.
Taking a shower usually helps me getting my creativity into gear and I came up with this idea of having a giant space fleet fighting against a powerful alien creature where you have to constantly sacrifice ships in order to protect your main vessels. The past weeks I had been listening a lot to Warhammer 40k audio books (Horus Heresy), and both the narrative force of the readers as well as the wording and the idea of sacrificing units in war without remorse was a bit of an inspiration here.
Since I planned on making an orchestral OST I fired up some epic music playlists on Youtube, which gave me a huge push in motivation right from the start.
9:00
In GameMaker, I loaded my boilerplate project with my usual settings (a few empty rooms, some basic input code). Since I wanted to have a hierarchy of ships, I decided on having one main flagship with a number of command ships, each of which would be swarmed by some fighter ships. The game would be turn-based strategy but I did not have a clear picture about what the actual challenge was supposed to be, hoping that it would fall into place eventually. So I played around with some fighter formations.

11:30
Next up was the enemy attacks. I wanted to have a spread shot, a laser that could destroy all ships in its way, a swarm of rockets randomly hitting the sides of the fleet and a large missile attacking in a straight line from the top. I eventually got rid of the missile as it was too similar to the laser. The original idea had an energy bar for each ship but that was also scrapped pretty soon.
I wondered how the laser should pick its next target. I thought about going for the strongest/weakest command ship but eventually decided on picking the closest.

13:00
I added the spread shot.
14:00
I added the spread shot a second time after Gamemaker deleted some of my code. It's a really weird behavior where you can compile and run your game but it actually does not save your sources. So at one point I clicked "no" when I closed a window and it asked me whether I wanted to save. In hindsight, I was very lucky that I did not lose more. After that I started doing regular check-ins.

14:30
Added some limits on motion range to force the player to think ahead when placing their ships

15:15
Lunch Break
16:00
Added the rocket swarm. I originally wanted the rockets to swoosh across the screen randomly but I started out with a simplified version where they just fly in from the sides. It turned out later that it was really hard to implement my original idea while making sure that the rocket behaviour was predictable enough so that the player would be able to plan their move properly, so in the end I kept it pretty much as it was at this point.

18:00
I needed a break. Brain overload combined with the common cold is a bad combo.
19:15
Decided to limit the overall distance from the flagship to prevent drifting too far over consecutive rounds. Doing a proper "stay within two circles" routine was much tougher than it seemed initially.

20:45
Defined a central function for level design and control. This allowed me to set up all parameters for each level in one single place (number of command ships, number of rounds per level, enemy attack patterns etc.)
22:00
End of day 1
Day 2
7:00
I hadn't slept as much as I'd wanted to, but at least my cold didn't get worse. My voice was still ok and I felt confident that I would be able to get my voice overs done.
Still in bed, I took a notepad and wrote down level configurations. It turned out to be a great idea to do this offline on a piece of paper as it helps to stay focused on how things should look instead of getting too hung-up on the technical details.
7:30
Since the new levels demanded multiple flagships and multiple bosses, I had to revisit and refactor all of my code to accommodate for that fact. This would pose some additional challenges for the rocket swarms, as I wanted each boss to be able to fire rockets at each flagship.
9:00
Added some indicators for which ships would be hit by the next attack round. I decided to do a quick fix for the visual part by using image tinting, however this would lead to one of the visual problems in the final game. More on that later.
The indicators proved to become my biggest headache, since I wanted to be absolutely sure that whatever ship was indicated as being hit would actually be hit during the attack phase. The first implementation of checking intersection of the targeting rays and the ships was not precise enough, but worked for the time being.

11:00
I implemented the levels I had thought out in the morning. The game was now playable from start to finish in a rough alpha
12:00
Next I tried to get my hit indicators for the spread shot more precise. I decided to simulate each shot along each targeting ray and checking for collision with each ship. The original implementation was super-inefficient, especially when there were multiple bosses involved but I pushed that back to the optimization phase. However it left a bad feeling in my gut because I did not have a clear solution in mind.
12:45
I played around with bezier curves for the rockets, which promised to look very cool but I had to scrap this idea in the end since I couldn't get the target indicators updated in real-time in a meaningful manner. It's always painful to let go of a really cool idea, but sometimes you have to cut your losses before they drag you down with them.

After skipping the Bezier curves it turned out to be for the best to forego the target indicators on the rockets completely and just give a general indication about where they would roughly hit. There is an important lesson here: If there is a concept that is complicated to implement, try to find a different concept that solves the same problem and is easier to implement. The player won't care how hard it was to implement as long as it works out in the end.
13:30
With the game mechanics complete I had to make a plan for assets. If I really wanted to go for recorded vocals, I would have to cut some corners for graphics, but since I'd wanted to do this for so long, I decided to go for it. So I went off the computer to write some narrative.
14:45
I really should have set up my recording equipment before the jam, there was a lot I'd forgotten since last I used Reaper, but in the end everything came together nicely. I think I botched some lines which I should have re-recorded a few more times, but I didn't want to push my luck on the remaining time so I rolled with what I had. Much later I realized that I actually misspoke in one of the lines, which turned sector 74-11 into sector 7-11 but I didn't have time to fix it and hoped that nobody would notice. Adding the recorded voices to the game was easy enough and gave me a lot of satisfaction.
17:00
Dinner break before the final push. Only 10 hours to go.
17:45
Music time! I realized quickly that I really couldn't apply a lot of my piano lessons when composing for orchestra and again, writing music was a struggle for me. I ended up with a somewhat simplistic composition using timpani, cymbals, cellos, trumpets and a bit of choir. Not exactly the quality I had in mind, especially since the lead lines were pretty boring and I didn't really make a lot of progress since previous LDs, but at least I got it done without wasting too much time.
20:45
As time was slowly ticking down I made the decision to only do a quick overhaul of my graphics to get the bare necessities improved. I'd stumbled upon the AAP-64 palette that I wanted to try out but quickly realized that the colors were much too vibrant for my shading skills so I abandoned that idea and went with custom shades. In hindsight, I should have spent more time fine-tuning the visuals which in the end for me turned out to be the weak point of the game and definitely a step back from my previous entries.
21:30
Now I started to panic. There was still this horrible runtime issue with the shot prediction and huge pile of things that were not finished. No title and ending screens, no background image, no sound effects, levels not balanced and a plethora of other minor points that were not much effort by themselves but which seemed like a mountain of work.
So I decided to tackle the big mountain of open points one by one, deciding to make most of the remaining time.
So I fiddled around with the slowdown issue and found a configuration that somewhat worked, but made the game look kind of crappy since the markers jumped around a lot. At least there was something I could ship even if it wasn't that great.
The game desperately needed some visual effects, but I didn't have enough time actually draw any, so I fell back to the good old trick of drawing explosions as white circles that flash up for a very short time. Instead of creating a convoluted solution with a lot of timers that would render the code unreadable, I had the idea of letting the explosions manage themselves. So the explosion object draws itself, counts down its lifetime and deletes itself when its time runs out. I was even able to cascade explosions by having an explosion object spawn other explosion objects. All I had to do was to create an instance of my object in a single line of code and never worry about it again. This concept is definitely a keeper for future games. Maybe with nicer graphics.
00:15
It was past midnight now and I wanted to focus on the important missing aspects. But since the recorded narration mentioned an asteroid field, I definitely had to have one for consistency. Turned out the background motion was very distracting to the game, so I decided to just play it once in the beginning of each level and let the player concentrate on the play field after that.
00:45
Time for some sound effects. This went fairly quickly since I only needed a handful, and Chiptone produces nice results really fast.
01:30
With 1.5 hours left on the clock there were a few more issues to resolve. I needed a visual indicator that if one flagship dies it's game over, even if the others survive. So I created a cascading explosion that would engulf all other ships. When revisiting a certain section of my code, I saw the instancegetnearest() function I had used there and had an epiphany. Could this be faster than manually checking for collisions in my hit prediction routine? I tried it out and it worked like a charm. Not only was it really fast now, it looked and felt way better than before. What a relief!
2:00
I spent the last hour doing some minor tweaks to the level definitions, adding a better title screen and gave the graphics some minor touch-ups.
3:00
Time to upload the game and finish this thing.

Final Analysis
The Good
- I set out to make a game with voice overs and I did.
- I always found the idea of making a turn-based strategy game intimidating, but I made one.
- I set out with a concrete idea and the end result got pretty close that.
- Time-management went alright, and I even managed to drink enough water to battle my cold.
- Besides the runtime issue I didn't have a single element that took up way more time than it should have. Efficiency get!
- I'm quite happy with how the game mechanics and the level progress all came together in the end
The Less Good
- Though it turned out alright in the end, it was too much of a close call for my tastes. The game only started to really come together as a coherent whole towards the last few hours of development and that felt like a lot of luck, which I don't like at all. It was ok in the end but next time, I would like to be in control more.
- I really had to tone down my graphics effort and it shows. The hit indicators should have blinked a clear red, but the tinting threw everything out of whack when I changed the ships' graphics, so now it's orange versus darker orange. The background is very simplistic and could need a bit more contrast. There is only very basic shading and the boss's graphics need work. The rockets still have their placeholder graphics and the explosions are just white circles. Maybe I'm overly picky but I feel I could have done a lot better with a little more time.
- The final push really wrecked my health. I had been able to push back the cold during the jam, but came down hard right after I handed in the results. Totally worth it though.
Final Verdict
Although not my prettiest game, it was one of my most ambitious that actually got done on time (looking at you, Snackleworth!). I'd love to revisit audio narration in the future, if it fits the genre, but should spend more time on polish here. Ultimately I am very happy that I can scratch a challenge off my list, maybe next time I can relax a little and not try to be overly ambitious.
Thanks for reading so far. If you want to give The Omicron Fleet a go, please be my guest:
https://ldjam.com/events/ludum-dare/43/the-omicron-fleet