Category Archives: Game design

trigger

Slide

My OneGameAMonth entry for July is a puzzle game called Slide.

You can download the game here. The music is from the amazing General Fuzz’s album Miles Tones, which you can download for free on his website.

I’ve never made a puzzle game before, so this was a great way to broaden my horizons. It turns out that coming up with puzzles is really, really hard at first. If the systems of the game are straightforward it can be difficult coming up with problems that don’t have immediately obvious solutions, but a puzzle game with opaque mechanics is never fun to play. Eventually, the process clicked and I was coming up with puzzle ideas faster than I could open a new level in the editor (the vast majority, alas, never made it past their first iteration before being scrapped).

Since the mechanics in Slide are pretty simple (strictly speaking there are exactly three of them), designing levels was all about challenging the way the player would . It was really interesting to think about what the obvious move in a certain scenario would be, and then subvert that idea and require a move that was slightly different in order to solve it. I still remember playing Rush Hour at the age of 12 or 13 and suddenly having the realization that just because a piece could be moved all the way to the other side of the board, in some cases it was necessary to stop one square short. Most of the levels in Slide are based on this kind of approach; get the player used to behaving in a certain way, and then introduce a situation where that behavior won’t result in the desired outcome after all.

Of course, in order to be able to solve a puzzle one must first understand the systems involved. Slide’s tutorial follows my design philosophy of teaching through curiosity; when shown a screen that is empty save for an interesting or out-of-place item, the player will eventually be drawn to that item and will try to interact with it. This kind of exploratory learning is something I try to encourage in all my games, and I think it is especially suited to puzzle games.

There’s no clear point where Slide’s tutorial actually ends; after a certain point it simply stops introducing new systems. I didn’t want to communicate to the player at any time that there was no more to learn, because a puzzle game can only last as long as it is able to expand on itself in interesting ways. I had originally planned to ship the game with a minimum of 25 levels; it ended up having only 16, and I think that 16 was enough. I might come back and add some more someday, and I included the Ogmo editor project file with the release bundle in case anyone else feels like creating some of their own, but I’m satisfied with the final count. I feel that going further would have resulted in the inclusion of a bunch of levels that rehashed old mechanics and added nothing new to the experience.

When I started work on this project I had no idea what it was supposed to end up like — my entire plan consisted of the words “puzzle game” and “colored squares”. Fortunately the design seemed to flow naturally as I worked, and I’m very happy with the way it’s turned out.

If you liked the game, or if you created a level and want to share it, please let me know!

I’m an international superstar

Of all the games I’ve made so far, Hypothermia has seen the most success. I somehow managed to get reviewed by both Indie Impressions and IndieStatik shortly after release, which drove a lot of traffic to my site that I just wouldn’t have had any way of attracting otherwise. I check back on the download counter every now and then and it’s fun to see that it’s still being downloaded over six months after I released it.

Today I did a search to see if there was any coverage I had missed out on and found this:

http://www.bilibili.tv/video/av441497/

Someone from China did a Let’s Play of my game.

This is the best feeling in the world.

I know how to count to three in Chinese, and that’s about it. Watching this video was really interesting for me, because even though I didn’t understand his words I could still tell what he was feeling as each phase of the game played out; worried tension as he got close to losing, and then surprised relief as he finished the game and got the good ending. It really makes me happy that I was able to create something that someone from a totally different culture could enjoy and relate to.

When I design games I try to use as few words as possible while still conveying the story. I like my games to be accessible to as wide an audience as possible; particularly one that might not be able to speak English. Baseborn and Humphrey’s Tiny Adventure were both designed in this way, and I’m while Hypothermia’s two endings each have their fair share of text, the rest of the gameplay didn’t rely on any dialogue. Until today I’ve never had the kind of reach where this kind of accessibility mattered, but this makes it all worthwhile.

slime

Game design by necessity

I started work on a game called Gunbuilding about a week ago with the purpose of stress-testing #Punk, a C# port of Flashpunk that I’ve been developing. Nothing puts a framework through its paces like using it for a game jam, and if nothing else I ended up fixing a lot of bugs that would have inevitably bitten me later on. On the downside, though, my idea for the game changed drastically to fit inside my schedule, and I’m not thrilled with the way it came out.

If you want to play it, go here.

The first thing to go was the mechanic that gave the game its name. I created a system that assembled bullets by passing data through a set of components that could be swapped out at any time. In theory, this could have allowed for a crazy number of combinations, resulting in bullets that homed in on enemies and spawned others to ricochet around after impact. The system technically works as it is, but I didn’t have time to create more than one component for each category. I’d like to explore this type of system again in the future, though; it seemed like it had potential to be a lot of fun.

The next feature to be cut was the enemy AI. I’m pretty happy with the way my little guys hop around (the quadratic curve movement system they use was one of the first holdups I encountered), but they don’t do anything to avoid each other and always ended up clumping together into a group as they moved towards the player. As a solution (though at the time it was a joke) I made them explode when they touched each other, and then made that explosion chain to other nearby enemies. The chaining was super simple and easy to do thanks to #Punk’s extensive message broadcasting capabilities, and it turned out to be a lot more fun than the approach I had been using, so in one sense I’m glad I ran low on time to implement the rest of the game systems.

The last thing I didn’t have time for was to put any effort into graphics. Everything in the game is made up of colored squares, with the  exception of a grass tile I used for the background and a tiny image for the particle effects. I generally try to prototype with as few art assets as possible to avoid getting stuck perfecting them before any gameplay is in place. In one sense that worked out this time — I can’t imagine what else I would have had to cut had I spent all kinds of time on art early on — but I feel like shipping the game in such an incomplete state is a real shame.

Overall I’m disappointed with the way the game turned out, but this was never about the game. I’m pleased with the number of bugs I was able to fix in the framework, and that was the whole point anyway, so I’d call this experiment a success.

Ludum Dare 26 theme brainstorming: Round 1

I’m probably not going to be able to take part in Ludum Dare this time around, but I always like voting for the themes anyway. I thought it would be a good exercise to come up with a game idea based on each theme, and it turned out to be a lot of fun. Here’s what I came up with for the first round.

Afterlife: Roguelike where you fight your way down into a dungeon. When you die, you become a ghost and are sent to the bottom floor. You must now use your ghostly powers to sneak back upstairs to find your body and carry on.

Against the Rules: The story of a man working a dead-end job for a faceless megacorporation in a cyberpunk city where routine is law. The game really starts when he disregards protocol and finds himself on the run from the authorities.

Alternative Physics: Platformer where you’re swimming through a coral reef while wearing a life vest. You have to strain against its flotation and propel yourself down under the water.

Ancient Ruins: An endless racing game starring Nevada Clarke, intrepid explorer. Climb out of a collapsing pyramid and collect valuable artifacts before being swallowed up by the desert.

Apocalypse: Play as the earth as you try to divert earthquakes, floods and other natural disasters to areas where they’ll do the least amount of damage so the humans will have enough time to get to safety. Beware of rising panic levels leading to mass suicides and hysteria.

Chaos:  Orchestrate the perfect jailbreak and take over a high-security prison with hundreds of your fellow inmates. Could be a good application for a flocking algorithm.

Colony: A city building game set in space after an exodus from Earth due to resource scarcity. Terraforming is a key component.

Dreams: A point-and-click adventure in which you play a young girl who can interact with other peoples’ dreams. The items necessary to progress can be summoned by influencing her sleeping family into dreaming about them.

Electricity: You play a malevolent storm cloud. Use various types of lightning to rain destruction down on a peaceful city; lightning strikes cause chaining through water towers, sheet lightning blinds meteorologists, etc.

Everyone Is Dead: Survival horror where you are the last living person in a plague-stricken city. Your character mutters to himself about watching out for zombies and mutants. Plot twist: There’s nothing in the game that can hurt you.

Flammable: A god game in which you play a fire god. Your only means of communicating with your followers is by setting things on fire. Lead them in the winter and show them where to avoid in the summer.

Going Backwards: A stealth game in which your character can only moonwalk. Timing becomes paramount as you must move between hiding spots without being able to look in the direction you’re moving.

Industrial:  A rhythm game where you play a technician in charge of training assembly line machines. As you successfully perform each procedure, you move further down the line onto the next step in the line, each more complicated than the last.

Journey:  An adventure game where you play a sword. Throughout your owner’s quest, you must decide whether his cause is just and influence his fighting skill accordingly.

Keeping Control: An action game starring a brain. You have to suppress the right synapses and stimulate others in order to keep your owner, a mental patient on parole, from being recommitted.

Lifecycle: A tron-like in which you try to capture the most plots in a graveyard to raise an undead army.

Lost: Survive on a desert island after being marooned by your mutinous pirate crew. Survive long enough to signal a passing trade ship or settle down for the long-term.

Mutation: An RPG beat-em-up set in a science facility where you gain new powers by imbibing various chemicals and cultures from genetic experiments.

No Weapons Allowed: You play an assassin who specializes in penetrating highly secure government facilities. Your latest mission requires you to enter through the front door with a group of tourists, so bringing in weapons is out of the question. You’ll have to improvise with whatever you can find throughout the compound.

Point of No Return:  A metroidvania where every room is sealed after you exit it.

Rediscovery: A point-and-click detective story where the crime scene is slightly different every time you return.

Rise and Fall: A dating sim in which you play the Sun and try to find true love with the Moon.

Seasons: An art game in which you play a tree. You must balance your ability to survive the cycle of the seasons with your desire to cause happiness in people who look at your leaves and pick your fruit.

Surrounded: A simulation game where you manage a resort on a tiny tropical island.

Underworld: A tycoon game where you play a mob boss in his bid to become the kingpin of crime by rubbing out the competition.

paragade

Game pitch: Legacy

I wrote a pitch for a game that I designed, called Legacy. It’s an RPG inspired by the things that I feel the Mass Effect series does wrong, in particular the Paragon/Renegade morality system.

Check it out!

It’s not a real pitch in that the game doesn’t exist and I don’t really have any inclination to make it, but it was a great thought experiment and I had a lot of fun planning it out. Let me know what you think!

 

Image by ~dmcblue on DeviantArt
screenshot

Must’ve been rats!

This past weekend I participated in the Global Game Jam with Chris Logsdon and Paul Ouellette. The theme was “heartbeat”, so we made a stealth game called “Must’ve been rats!” in which you have to search for a briefcase containing a beating heart so you can escape in a heart-powered elevator.

Download here!

Overall I’m pretty satisfied with the way this jam turned out. We had a lot of fun designing the gameplay and systems, and the game is feature complete despite having only one level at the moment. Even after testing and debugging for 48 hours straight I still enjoy playing the game, which feels like an accomplishment of its own. Still, it’s not a game jam if you don’t make some stupid mistakes and learn a few things, so here are my Things That Went Right and Wrong.

What went right

Flashpunk

At this point I can’t imagine using anything but Flashpunk for my game jam needs. Paul was able to pick it up fairly quickly, despite the fact that he hadn’t used it at all until a few days before the jam. Chris and I have used it a number of times, and even so we both found new features that we’d never known about. The API feels complete and intuitive, and it seems like there’s a function or class for everything we could ever need.

Systemic design with message passing

We designed our base engine as a set of systems that communicated with each other indirectly through message broadcasting, instead of directly through function calls. This allowed us to focus on programming the rules of the game world instead of specific interactions between different entity types. Even though getting each system working correctly was a challenge, adding new rules and rule responses is quite simple.

Data-driven workflow

We did all of our level design using Ogmo Editor, and as usual it served us well. Since we used a tileset for our levels’ art and a grid for collision and pathfinding, I modified my OgmoWorld utility classes to automatically import each of these types automatically and take advantage of FLAKit‘s live reloading capabilities. These changes will be included when I get around to officially releasing OgmoWorld.

What went wrong

Systemic design with message passing

Yeah, I know this one is in both groups. That’s deliberate.

Despite the fact that message passing is really cool and allows for some interesting emergent interactions, it’s not a good fit for everything. One example of a poor application is updating each enemy with the player’s position. My solution was to broadcast a message that told the player to report back with his position. This was slower and less elegant than searching the world for the player instance, and I wish I had realized that sticking rigidly to message passing was a bad approach.

Preconceived ideas

Chris and I had decided we wanted to make a stealth game before the jam started. Even though we didn’t do any kind of brainstorming beforehand, that decision still limited our ability to be creative with our interpretation of the theme. Fortunately we still managed to stay in scope and get the game to feature-complete, but I still wish we had come into the jam without any plans.

 

Overall, I’d call this Game jam another success. Make sure you play the game!

Data-driven action scheduling in Flash

One of recent experiments in game development has been to orient my workflow away from code and towards data. When I use Flash, I’ve started using Ogmo Editor to design my levels, XML to handle settings, and Slang to handle game logic whenever possible. As a result, a lot of the code I’ve written recently can be easily reused across projects, and my classes are systemic and steer clear of situation-specific behavior. It’s been quite fulfilling and has done wonders for my iteration time; the focus on data instead of code means that I can take advantage of live-reloading for nearly every aspect of development. It’s not uncommon for me to work for an hour without ever closing my game, as I can simply reload all assets and data with the press of a button.

Today I’ve been working on Humphrey’s Tiny Adventure: Remastered, a post-compo version of my first 48 hour game. There are a number of places in the game where I need to set up events on a timeline, which I’ve done a few times already (see here and here), and each time I used some variation of traversal over a queue of function closures. While this approach worked well enough, it was tedious to set up and a pain to debug, not to mention the fact that it was anything but systemic. The most criticized aspect of the Ludum Dare version of Humphrey was that the intro cutscene was too long, and I agree. I think I knew that even before I released the game, but there was no way I was diving into that code to change it.

For Humphrey: Remastered, I was determined to achieve the same type of event scheduling in a data-driven way. Thanks to Slang, I was able to do just that. Here are the scripts for a scene I’ve been testing that involve two actors; Humphrey and Abe. This won’t be in the finished game, but it’s a good demonstration of the system’s capabilities.

Actions are called sequentially by the actor that the script is attached to. Each action block defines a set of statements that will be run as the events are executed. Calling done moves to the next action, and delay causes the actor to stop executing actions for the given number of seconds.

The give-cue and await-cue functions allow actors to pass messages between each other. In the above example, Humphrey give a cue to tell that he’s finished a set of actions, and Abe, who has been waiting for that cue, executes his final action in response.

There are only a few control functions involved, but so far the system has proven to be very powerful, and more than capable enough for the needs of this project. With the addition of message passing and response, specialized actor classes will be able to define custom behaviors while allowing the system to remain pure.

I’m quite happy with the way this has turned out. It’s fun to experiment with what can be done with Slang even in its current, quite minimal state.