I’ve had an enormously entertaining, enlightening, and indelible experience (grr…) in this inexorable endurance endeavor, but it’s also been extraordinarily hard. I guess that’s what makes a game jam and game jam, and the Ludum Dare compo is probably one of the hardest due to its restrictions. Due to the complete and utter reliance on oneself, it seems that luck is much more involved than in more collaborative jams. If the theme that is picked is something I have absolutely no interest in, then I have no one to really fall on to help push me in a good direction. This isn’t even touching the need to be a multitalented genius to hit all the usual game departments.
This is all just leading up to a nice pat on the back for myself for completing…something…on my very first game jam. Supernova is more or less a game. It seems to bug out after only a few minutes of play, but I also felt that I took a fairly large idea to start with, so I didn’t really have much time to squash bugs beyond the first moments of gameplay. But I am getting ahead of myself. DNIWER.
What is Supernova?
Supernova is essentially a tower defense game. The object is to protect your sun from an invading alien army. You do so by placing planets around it on one of three orbits. There are three different types of planets to choose from:
Attack Planets: weak, but is the only planet that can actively attack enemies, by launching missiles at them.
Additionally, you can buy upgrades to these planets that increase their potency (or alternatively, you can use the upgrade to heal the sun). Keep in mind that the cost of each planet goes up after every purchase, so plan carefully…or not…
It’s an endless game (or at least it should be), so there isn’t a win condition, which sucks. But whatever; I’ll leave the professionalism to my second LD48.
Planning: How does it work?
I’ll start with the bad, because that means I’ll leave you with a warm, fuzzy feeling instead of a cold, hard feeling.
- Plan until you can’t plan, and then plan some more: I did not plan much at all. I could chalk it up to the fact that I initially had an entirely different idea for my game, and spent at least two hours working toward that idea, but looking back, I still had plenty of time to plan better. I’m almost certain I lost at least four hours because of bad planning. Case in point: my HealthBar class. Because I made my Sun an entirely standalone class, when I went to attach it to my Sun, I couldn’t easily do it the same way I did with all my other planetoids. Since I didn’t really get HealthBar working nicely until the last day, I literally had to implement an additional attach slot in every HealthBar just for the Sun’s HealthBar. I shudder at the ugliness of that.
- There is a difference between understanding your tools, and knowing your tools: I am fairly new to haXe, NME, and HaxePunk. I understand haXe syntax, I understand the nme command-line tool, and I understand the general hierarchy of a HaxePunk game. As I learned throughout these past 48 hours, I don’t really know any of them. I would spend 10-15 minutes creating some algorithm or function, only to stumble across a prebuilt version somewhere in those tools. I know how to make an Entity, but do I know how to make an animated Entity? What about a Tilemap? Would a GraphicList help when I want to create a button with images and text? How do I get rid of the black background of my Text graphics? These questions have fairly available answers (usually in the form of FlashPunk tutorials, but haXe and Actionscript are so similar its stupidly easy to transfer it over), and if I would have had a bit more time with my tools, I would have not wasted more time on learning them during the compo.
- Do not decide to get the latest version of your development engine’s libraries DURING THE COMPO: don’t really need to say much more there.
- If you do not have artistic skills, don’t even bother trying to make it look nice: I spent far too much time just thinking about art. I don’t have the skills to put the grand image in my brain onto the computer screen, so don’t bother trying when you are being timed.
Overloading add() to success
- Given my overall disappointment with the chosen theme, I felt I had a decent enough idea: originally, I wanted to make a 2D, Shadow of the Colossus-esque side scroller. But I got about 5 minutes into the level design, and I realized that I don’t have really any idea on how to get started on the gameplay, so I scrapped it. Luckily, Tiny World got me to think about the end scene from the first Men in Black (I linked to it on an earlier post), where the camera flies backward from the Earth’s surface, through the solar system and out into the galaxy, only to reveal that the Milky Way is actually just a nice design for a marble in an alien’s current set. I felt, what if that alien had to protect his marble, by intervening in galactic conflicts when necessary. Something like a sun being forced into supernova ahead of schedule. What lengths would that alien go?
- Even though it was the hardest thing I have ever done (programming-wise), it wasn’t THAT hard: most of my game is just logic. If your shoot timer goes off, fire at the closest planetoid/enemy. If button is clicked, attach planet to cursor, and remove resources when planet is placed. There were a few tricky spots, like getting the placement of the planet by the cursor to work correctly in conjunction with rotation (which I mainly blame my addled mind for causing me such pain over the issue; I still don’t know how arctan2 is supposed to give me an angle between two vectors).
- Some people might call it hacking; I call it SUPER SEXY FUN TIME: there were a few ah-ha moments during this weekend that helped boost my confidence and strive to finish. One of them came when I was thinking of better ways to attach HealthBars to planetoids (not the super ugly situation I described before, but getting the Healthbar to do its thing automatically). A neat feature about haXe is that (I think) all methods are virtual. So when I needed to release a planetoid from my cursor to an orbit, since I wasn’t inside the GameWorld, I would have a hard time getting any special function to work outside of it. But, with an overridden add() function, I just check to see if the new Entity is a planetoid, and add a HealthBar right then and there. Brilliant!
Hopefully Supernova is enjoyable. I certainly am proud of it, but I also certainly will need to good LONG rest before I can think properly again.