Dethroned – Post-Jam, Post-Mortem

Posted by
December 13th, 2016 3:15 pm

Dethroned_title

So, I did say I’d write a post-mortem, since it was my first Ludum Dare ever, and actually the first game I’ve made that could be considered potentially finished. I definitely want to record my mistakes for future reference, and to just share my experiences and maybe see if someone possibly had similar problems.

I’ve really only made rather convoluted solutions to game mechanics than games themselves up to this point, and as such, the timeframe and workflow kinda caught me by surprise even though I thought I’d planned along it. So while I have some Unity mechanics and Editor tools under my belt, it dawned on me that I’m still a complete noob 😛 My biggest strength really was my experience with having to do stuff with short sleep cycles. And music production too, of course.

TL;DR: It was a mess, and I enjoyed it.

Day 1

We spent a good amount of time (5-8 hours?) planning what we’d do with the theme. We had quite a lot of ideas, but landed on a “combo performing game happening inside an enclosed arena, which is one room”. I went on to declare all the base mechanics of the game, but did so in the manner of creating bunch of excessive inheritance and stuff that weren’t really needed. In fact, the first 12 hours that I did actual work on the game went down the drain because it simply didn’t work right.

The fighters still work through an IFighter interface that I created assuming that I might want to have more than two fighters at the same time. Not only is it kinda stupid to create an interface that acts more like a class (instead of like IDamageable, IDodgeable),  it was pretty evident from the very beginning that this wouldn’t really be the case, so I ended up doing a lot of useless code. So, the #1 lesson learned: Keep It Simple, Stupid.

I went to bed, slept for maybe 3-4h and got up again to continue where I left off.

Day 2

I was not happy with the progress. At this moment everything was still 100% text from the debug console, and things we’re running amok in their own Update loops. All I really needed was just an event sequencer, so I decided to revise the whole thing into nested Coroutines. They’re very handy when it comes to having control of the timings of your process, but I find them kinda tricky to manage if you want to keep your game Garbage Collection allocation – free. Safe to say, this game isn’t. An actual Coroutine State Machine class that explicitly plays a requested sequence would have been the better approach, but I didn’t want to spend any more time on mechanisms that wouldn’t necessarily be used.

Anyway, this put things into motion, and I quickly had the basics down. I had to google how to get Animation States and stuff from Mecanim, but luckily they’ve added StateBehaviours which allows you to write C# into Mecanim states. I used that to tell my Animator abstraction script “AnimatorController” what state the Entity was in, and thus got some knowledge on when to pull off transitions in the Coroutines.

Now, having basically two separate State machines doing their own timings without full control opened a can of worms. I had to do some brute force fudging (yield return null for teh lulz) to get it working relatively bug-free, which is just plain bad. Overall the code’s a mess, and I didn’t really bother optimizing a lot of the shenanigans. Lesson #2: Be Less Stupid, Stupid.

Hell, maybe I could have possibly made the entire thing with Mecanim + StateBehaviours alone.

Still, things were moving on quite well in the end, and I decided that from here on out I would only take short hour-long naps and get this thing done in time.

Day 3

After a nap, I went back to my computer at 4 AM and started up Reaper, fired up a bunch of free NES synths, had loads of fun and was done with the job in a couple hours (gg ez).

It was time for the UI Elements to get made. Up to this point I had fun with the Ludum Dare challenge. Oh, how I love the Unity UI and it’s intricate way of sometimes working and sometimes blatantly refusing to function under the simplest terms.

Luckily I’ve already had my share of text elements not updating to know that you often need to string.Format() your text to get the UI system to recognize the change and update itself. Then again, there’s still loads of bugs in the UI that haven’t been fixed and probably won’t be. I probably spent more time fighting with the UI elements than producing actual content which is ridiculous.

Also, Enemy death animations we’re screwing up everything for unknown reason that I could not seem to fix through conventional means. I decided to disable pooling and just have them be Instantiated to avoid these post-death disorders of doom.

In the final 30 minutes of submission hour, I created an ending to the game. It comes after 50 waves of enemies, I have never tested it and I have no idea what happens once you achieve it 😛 Do tell me if you find out.

 

So, it was quite the experience, and I probably didn’t mention half of the stuff I wanted to. I had slept for minimal amounts of time, drank probably 40 cups of coffee in 72 hours and completely neglected any attempt at keeping up appearances. Would have been a funny stream, if I had to time to stream it. But all in all, it was totally worth it. Can’t wait for the next one!

Tags: , , , ,


Leave a Reply

You must be logged in to post a comment.

[cache: storing page]