I’ve posted a postmortem of my LD48 #24 project, over on my ludumdare.com journal.
After poking around for my old journal entries on ludumdare.com, I think they may purge content, so in case that’s true I’m mirroring the post below, after the cut:
I’m not super happy with the way things went this time around, I’ll just say that up front. I don’t want to be too negative, and any weekend I spend doing game development is better than just about any other weekend, but I was hoping for a lot more, and I’m just disappointed in myself.
What went well
Not a whole lot.
I did finish and submit my game 5 min before the compo deadline ended, thereby salvaging a weak type of “success” at the end. I could congratulate myself, but the outcome just wasn’t what I had hoped, and I’d be bullshitting myself if I said I was satisfied with the outcome. I could have just decided to make this a Jam entry instead, and used the additional 24 hours to make the game closer to what I think it could be, but realistically I won’t be able to do that since I have work tomorrow.
The last 5 hours of the compo were intense. I finally got into the zone and was able to focus, but I’m afraid it wasn’t enough to do more than be able to say I managed to make a game that didn’t feel incomplete, even if it did feel like a weak and junky game that I didn’t like very much. I would have had a much better compo if I could have felt this way from the very beginning.
I did get to put music into a game. I spent a couple hours with iNudge.net creating a really simple loop in a really easy to use sequencer that doesn’t have near as many features as I wish it did, but was easy to use. I had to record the music as it was playing, rather that do a cleaner, better quality export directly out of iNudge, because lol they don’t have that feature. But it’s really easy to click a few random cells in the sequencer and generate a loop that sounds like weaksauce synth music that’s not too annoying on repeat play and takes zero talent to create. This is encouraging, because I really do have zero talent when it comes to music, but unfortunately I still feel there’s a wide gulf between me and being able to create anything better than this kindof “random junk when looped sounds like it could be easily mistake for music” approach to making a BGM.
What went wrong
Lol, just about everything.
Theme
I was not thrilled about the theme this time around. Last time I wasn’t very inspired by “Tiny World” either, but in comparison I was at least able to come up for an idea for my Tiny World game in the first three hours, and spend the rest of the time working on building it. This time, I had a couple ideas, but they were too big to fit into a weekend. Evolution is a big, complex thing, and not easy to fit into a 48-hour game.
Additionally, I kept banging up against the fact that if you try many of the obvious ways to gamify evolution, it stops being evolution. Evolution is not:
- A series of power-ups
- A roundabout way of designing something
- Something that you control
Idea 1
Idea 1 was a concept for an RTS I came up with last fall, but haven’t worked on at all yet, plus some features that make the game units more evolution-y. This was way too much to attempt in 48 hours. I’d first need to create a simulated ecosystem, then make it into an RTS game, and then add genetic algorithms into my unit spawning code… Yeah, that might be a multi-year project.
I still want to do this game, but I’m not sure that Game Maker is well suited to it, so it may need to wait until I feel comfortable enough in a different framework to try to pull it off.
Idea 2
Idea 2 was a series of encounters between your creature and a randomly generated creature. You choose to fight or mate. If you fight, whoever wins is the “fitter” and survives. Regardless of whether “you” win or the other creature wins, you control the winner of the fight into the next round. If you mate, your traits are combined with the traits of the other creature, and a new creature is created, which you then control in the next round. This seemed like a pretty interesting idea, but again, I didn’t feel I could fit it into 48 hours. Just coming up with a decent random creature generator would have been a lot to ask for. If I’d done this, I would have made the fighting abstracted, not controlled, like a stat-based text + flashcard graphics game.
I might still try to implement this idea, who knows. The more I think about it, the more promise I think it has to be a fun game, if done properly. It’d be kindof useful to have a creature system and a random creature generator under my belt. If I didn’t have to worry about controlling the creature and animating the graphics, it seems reasonable that I could complete it in a short time. Maybe that’ll be my next mini project.
Idea 3
Idea 3 was the one I ended up going with. But what I ended up completing isn’t quite the Idea 3 that I started out with. My initial concept was to make a game where you’re a single-celled organism, and you go around eating food. When you eat enough, you mutate into a new creature, based on the types of food you found/selected. Once you’ve mutated, your old form becomes available as a AI-controlled enemy in the game. This idea had cool potential in that it allowed the player to kindof design the game as they played, and also as they got better at the game, it would challenge them with their own built-up character.
I wanted to do something that would generate new graphics as you play, so that when you mutate, you never know what you’re going to see, and it would always be a fresh experience for the player. Creating new sprites on the fly isn’t too difficult in Game Maker, but coming up with drawing methods that would result in controlled randomness was a hard thing to wrap my head around. I wanted to have the game draw a random shape and attach it to the existing sprite, and I couldn’t figure out how I’d determine where the edge of the existing sprite was, or how I’d know what the new sprite’s size would need to be in order to incorporate the new shape, and so on. I also needed to come up with some way of creating an AI that would learn how to use a randomly-generated creature in a manner which was reasonably effective and challenging and fun, pretty much no matter what the random generator came up with. That’s a lot to ask for for 48 hours, and I quickly saw that it would be well beyond my current abilities as a programmer to do something like that. I believe I could figure it out in about a week, since that’s about how long on average it takes me to figure out how to do something I have never tried before to do in Game Maker.
My fallback position was to a character who mutated, not graphically, but in terms of abilities. Unfortunately this is not too uncommon in videogames whatever their theme. Most games have a progression that you go through, gaining power and abilities as you go on. Thus, simply doing this would not feel sufficiently evolutionary. To make the mutations feel less like standard videogame power-ups, I decided to make them random, such that you might get better OR you might get worse in a given trait. Also, I made the mutations depend on the type of food you ate. So if you eat a lot of the thing that gives you Speed, your speed attribute will change by a wider margin; if you eat a lot of the thing that gives you health, your health will mutate more wildly, etc. I came up with this idea toward the end of the compo, a few hours before deadline, and it was the only thing that I implemented where I felt like I was “in the zone” getting things done at a fast pace and knowing what I was doing and what I wanted to do next. Unfortunately, I don’t think there’s a strong enough association between an enemy type and what it does for you. I don’t really feel like I have a good “system” of attributes, either — all I got done was max health, speed, and turn speed. I would have added more attributes if time had allowed, possibly Attack, Defense, some kind of shield or different attack modes beyond ramming. I wanted to get a bare minimum done to have a viable proof of concept, and that’s all I ended up accomplishing.
Sadly, not communicating the mutation graphically to the user is really disappointing and makes for a counter-intuitive game. You mutate, there’s a sound, and your abilities change but you look the same as you ever did. You end up just scratching your head. I wanted to convey things more through color, but I didn’t quite this implemented. That’s why most of the game is in black and white. What I did manage was that you turn more transparent when you’re closer to mutating, and you turn more red the more damaged you are. I had wanted to color code the enemies somehow, so you.
Development
I did a lot of new things. I struggled with them, and didn’t end up accomplishing as much, and what I did end up accomplishing wasn’t as good as I wanted it. But I did do a few new things.
Movement
Getting movement to work right was most of Friday night, once I started on my Idea 3 concept, which wasn’t until about 11pm or so. I wanted the game to feel like you were in an open, unrestricted space, and I didn’t want it to have boundaries. Creating a really big room wouldn’t have worked very well, and would have hurt performance. I elected to take an approach that is pretty counter-intuitive in Game Maker, which was to create a room that is only as big as the current view, put the player object in the center of the room, and when you control the player to move, it stays still, but everything else in the game moves in a relative way, giving the illusion that you’re moving. This was simple with static object that didn’t also need to move on their own, but it took a little bit of trial and error to figure out moving objects. I wanted to have things that moved in a straight line, and from there a progression from ellipses to spirals, which I got, then to undulating motion, which stumped me. I did also implement an AI (“Homey”) who homes in on the nearest object, and if I’d had more time I would have created something that went off in one direction, randomly turned around to a new direction and then went off in that direction. I spent a lot of time working on these behaviors, and I thought a simple progression that built up might be fun as well as simple to implement and give a sense of a path of evolution. Probably this would have been better if I’d designed my game to throw each type at the player one at a time, to create that feeling of progression, instead of all at once.
Inheritance
I tried to do some crazy things with inheritance, not all of which was successful. I had created some motion classes which worked pretty well, and my intention was to create collision classes, which would randomly inherit one of the motion classes. That way, there would be different styles of interaction between the player and the different objects in the game. Some would be immobile, some would be pushable, some would be eatable, some would hurt you, and so on. And they were going to be color coded to help the player know which ones were safe/desirable to collide with and which ones to avoid. GML has a function object_set_parent() which I thought might have been useful, but I’d never used it before, and it turned out not to do what I had hoped. I was trying to get it to randomly re-assign a motion class as a parent to a collision class, and that would have given me a large combination of dynamically derived classes to throw in to the game, which could have been done in such a way as to convey a sense of evolution taking place as well. My objects in the game are really, really simple, as they currently stand, but I was hoping to introduce complexity through successive mutations, each round of mutation resulting in a blending of attributes from different classes into new classes, randomly creating new types of enemies. I think there is probably still a way to do this in Game Maker, as it is possible to generate a new object type at runtime, but the approach I was attempting was the wrong one, and due to my lack of understanding of a language feature I’d never tried to use before, I squandered too much time. Rather than trying to re-assign parents of existing classes, I should just have created new objects entirely.
Multi-platform builds
I had wanted to create a Windows, OS X, and HTML5 build for the game. In the end, I only manged to make an HTML5 game. For some reason, Game Maker Studio lost the ability to build this project to Windows along the way, and I couldn’t spare time to try to troubleshoot the issue. Since HTML5 is accessible to both Windows and Mac OS X users with no performance penalty, this isn’t too big of a deal.
Diet
I noticed on Saturday that I really didn’t feel so great. I think most of this is attributable to poor diet choices on my part, especially too much caffeinated soda. I think it’s very typical for people to load up on snack foods, caffeine, and sugar, and not plan or prepare real meals, because it saves time. This is just not a good idea. You should fuel your mind/body as you would for any other rigorous competitive event, such as rock climbing or a marathon.
Sleep
I did sleep pretty much normal. I was up until about 3:30am on Friday, but went to bed at around 11 on Saturday. My Saturday was almost a complete waste, though, I barely got anything done, felt like crap all day, and couldn’t focus. Sunday was more of the same up until about 4-5 hours before deadline.
What I learned
Figuring out the motion trick thing was the one useful thing I learned this weekend. I learned a lot of “what not to do” also.
What else you should know
It was really nice being able to spend the weekend with the Cleveland Game Developers meetup members who showed up at our site at Shaker LaunchHouse. Extra special thanks to Dar Caldwell, Matt Perrin, and Steve Felix for putting the site together and for everyone who showed up, participated, and helped out.