Iridescence development visualized

Three name changes, three frameworks, and 33,697 lines of code and data — this video represents 11 months of nearly solo development at the rate of two days per second.

Each dot is a file, and each cluster represents a folder. Green lines represent new files being created, yellow for modifications, and red for deletions. Source code settles out at the bottom left, with level files top right. Audio is up on top near the levels, with an equal number of .oggs and .mp3s to support multiple platforms.

Towards the end it’s obvious that a lot of work is being done on level design, with scattered changes to source code as I fixed last-minute bugs, and a lot of new image files being added as I rounded up screenshots and promotional art.

Created with Gource. Music is “Hongdae” by Lukhash.

Get the game:

Hypothermia is now on!


A while back I made a little game called Hypothermia for Experimental Gameplay‘s “Temperature” challenge, a game jam of sorts that ran for a week during November/December 2013. It got reviewed by Indie Impressions and Indie Statik, and some guy from China did a Let’s Play of it.

Based solely on download count, it’s my most successful game thus far, but I never managed to find a hosting site for it that was a good fit, so despite it being a flash game anyone who wanted to play it had to download an archive containing the SWF and a web page. Thanks to, I now have a place to upload it without having to worry about it being blammed by people who don’t understand game jams. 😉

Play it here!

Stuck Scripting overhaul

Early on in the development of Slide (before Iridescence had come to be), I added support for small script files to allow levels to contain more complicated puzzles without running into false positives that caused the reset button to show up while the level was still perfectly solvable. I was using C# at the time, and options for proper scripting languages on the .NET platform are shamefully limited, so I rolled my own.

Here’s a sample of what it looked like:

R > B;
G > B;
B > G ! B -> [B];
B > R ! B -> [B];

The use-case for stuck scripts is extremely specific, so the language itself didn’t need too many bells and whistles. All I needed to do at any time was compare the number of game objects of a given color, and check if pawns had a valid path to their targets. The snippet above basically translates like so:

The puzzle is unsolvable if any of these are true:

there are more red pawns than blue
there are more green pawns than blue
there are more blue pawns than green, unless all blue pawns can reach a target
there are more blue pawns than red, unless all blue pawns can reach a target

Needless to say, it’s as ugly as it is functional, and adding new features proved difficult. The inflexibility of the original design meant for some truly impressive hijinks as I tried to implement more complex behaviors with only the original syntax.

Today I stripped the whole system out and replaced it with a new one. Since I’m using Haxe for this remake, I was able to take advantage of hscript, a subset of Haxe that allows for runtime interpretation. Now, the script above looks like this:

var reds = count(Pawns.Red);
var greens = count(Pawns.Green);
var blues = count(Pawns.Blue);

if (reds > blues) fail();
if (greens > blues) fail();

if (blues > greens && !hasPathToExit(Pawns.Blue))

if (blues > reds && !hasPathToExit(Pawns.Blue))

Much better.

The original scripting system was designed as a black box, with a minimal number of inputs and outputs. By keeping the interface consistent between implementations, I was able to completely change the underlying code without changing any other aspect of the program. It’s nice to be able to change something so integral to the gameplay without worrying about side effects.

Disappointments: Amnesia a Machine for Pigs

Amnesia: The Dark Descent is a game that’s near and dear to my heart. It’s a masterpiece not only of the independent scene but of the entire games industry, succeeding brilliantly at delivering a truly terrifying experience that stuck with me long after I finished it. When the sequel, A Machine for Pigs, was announced, I preordered it as soon as I was able. Frictional’s games have only improved with each new title, and I was confident this latest release would be even better than the original.

As it turns out, that’s not the case.

A Machine for Pigs (AMFP from here on out) is developed by TheChineseRoom, best known for their experimental narrative game Dear Esther, with Frictional taking a minor role as producer and publisher. I absolutely adore Dear Esther for what it is: a beautiful dream of a game with breathtaking visuals and fantastic atmosphere. For all that, however, it’s very linear and involves no environmental interaction whatsoever, and unfortunately this design approach is carried right over into AMFP. Dear Esther was an extremely focused game; no element was included that wasn’t directly necessary to tell the story they were looking to tell, including many conventions considered standard in a first-person-perspective game, such as the ability to crouch and jump. While crouching and jumping are still in place in AMFP, it’s astonishing just how many other core systems were removed from the core Amnesia gameplay.

Simplifications in interactivity
Nearly every object in the world of Amnesia: The Dark Descent (just Amnesia from here on) could be picked up and manipulated. Books could be taken from bookshelves, bricks could be used to bash a hole in a damaged wall, and barrels could be stacked to collect out-of-reach items. AMFP limits interactivity strictly to puzzle items, doors and desk drawers. One memorable moment during my playthrough was when I came across a tubular object on the floor and picked it up, overjoyed to have found something to physically connect me to the world I was trying to immerse myself in. As it turned out, the object was a fuse that belonged to a fusebox in the next room. I plugged it in and went on my way.


While the lack of clutter in a level might seem like a petty complaint, the ability to interact with items in Amnesia’s environment was one of the things that really made me feel like I was inhabiting an actual space, rather than proceeding through a tightly directed tour. In AMFP, if you find an object you can pick up, make sure to take it with you, because you’ll definitely need it to solve an upcoming puzzle — or what passes for one in this game, anyway.

Disruption of Balance
Amnesia’s sanity meter has been criticized as being unrealistic and distracting, but I think it’s one of the game’s best mechanics. In a castle filled with murderous creatures and without any means of defending yourself, the obvious tactic is to skulk around in the dark to avoid detection. Amnesia made this very approach inadvisable with the simple rule that the darkness itself is your enemy too, causing hallucinations and insanity if you spent too long without coming into the light. It forced you to balance the preservation of your sanity with the knowledge that standing in the light made it possible for a monster to see you as well.

I’ll never forget one time in particular when I encountered a monster after having spent far too long in the dark. He roared as he spotted me and I sprinted away, veering madly. As I ran towards the door which would take me back to the safety of the main hall, I tried to make a minor correction in my heading and instead spun completely around to face him as he wound up for a swing. I turned again, view flailing, fumbling at the door just as his attack landed. I made it out. Barely.

In AMFP, the sanity mechanic is completely gone. You can creep around in the shadows to your heart’s content with no ill effects. In Amnesia, taking more than a quick glance at a patrolling monster was a good way to induce a noisy panic attack, but in AMFP you can stare at them with impunity, effectively removing the risk involved in learning patrol patterns and turning such segments into uninspired stealth gameplay. Far from being vulnerable and helpless, the player is just as empowered as the hero in any other sneak-em-up.


At least, until you get to the boss fight against this teleporting cybernetic hogman.

Resource management
As with every other aspect of the game, resource management has been simplified to the bare minimum. The inventory has been completely removed; all puzzle elements are physical objects that you carry in your hands, laudanum is no longer available to sooth wounds, and tinderboxes have been replaced with the ability to conjure fire from your fingertips onto certain candles.

None of the above issues are really that big of a deal, but one more mechanic was removed that I can’t come up with a satisfactory justification for: the lantern no longer consumes fuel and can be used infinitely. Ultimately this decision cascades from the removal of the sanity meter and the fact that there’s no downside to being in the dark, but the tension produced by the knowledge that your fuel could run out at any time is noticeably absent. Yet another crucial element falls on the chopping block in the name of accessibility.

Direction over systems
Amnesia had its fair share of scripted events; whenever a door blew open in the wind or a monster broke into the room just after you picked up a puzzle piece, that was a scripted event firing off. For the most part, though, Amnesia was content to leave you to your devices. AMFP, on the other hand, is filled with scripted moments. You can hardly go a dozen steps without triggering a piece of expository voice-over, slow-motion walking sequence, or level-shaking earthquake. Not only do these get tedious after the first fifty or so occurrences, they always broke my immersion for a simple reason that can be applied across all types of games:

There is nothing safer than a scripted event.

When the game takes control away from me and forces me to watch as a monster shuffles through a doorway ahead of me, I know that at that moment there’s no way I’m in any danger. AMFP indulges in these moments all too often, and each time any tension that has managed to build up is dispelled. The director has called for a scene and I am to watch.

Another addition that I found strange is a new behavior of the lantern. If, while creeping around in the dark, you should happen to aim the light at a monster, it will flicker and go out briefly. While the game makes a halfhearted attempt at explaining this effect, the true reason is obvious; it exists wholly as a safety net to give me an opportunity to quickly put out the light and hide. For a horror game, AMFP is surprisingly keen on keeping me alive. Rather than designing systems that terrify, TheChineseRoom has created an experience in which I am constantly reassured that I’m completely safe.

Narrative flaws
AMFP will undoubtedly be praised for its writing, which somehow manages to be even more florid than that of Dear Esther and is the very epitome of style over substance, littered with tangentially related references to great works of literature. The protagonist, Oswald Mandus (whose own name is itself a reference), makes elaborate mementos that reek of thesaurus abuse — why say “earth” when “loam” sounds so much more profound? The two words aren’t, in fact, equivalent; one does not “descend into the loam” when taking a trip underground. This is just one example of the pseudo-intellectual language found throughout all text in the game, from dialogue to notes found in the environment.

When Oswald isn’t making tortured similes in his journal or waxing poetic in one of his frequent monologues, the environmental storytelling is just as confused. No justification is ever given, for example, of the village church’s stained glass windows featuring pig-headed saints and altar piled high with butchered swine. If the titular machine is such a well-kept secret, some explanation is necessary for this inclusion, but there is none. Tom Clancy has been quoted as saying that the difference between fiction and reality is that fiction has to make sense, and when studied carefully, AMFP does not make sense. Gaping plot holes, inconsistencies, and leaps of logic that strain verisimilitude are scattered all throughout, and the climax is never satisfactorily resolved.

I really, really wanted to like Amnesia: A Machine for Pigs, but it seems as far removed from the spirit of Amnesia: The Dark Descent as is possible before losing all resemblance. TheChineseRoom might excel at creating introspective art games, but masters of horror they are not, and AMFP manages to be neither a worthy successor to Amnesia nor a compelling horror game in its own right.

Hitman: Absolution is not a good game

My relationship with the newest Hitman game is…strained, to put it mildly.

I bought Absolution shortly after it came out, hoping against hope that it would be a worthy sequel to one of my favorite all-time games, Hitman: Blood Money. I added Absolution it to my favorites list before Steam had even finished downloading it.

According to the Steam counter, I played for a total of 13 hours before I removed it from that list. I’d be willing to bet that the majority of that time was spent doing something else, leaving the game running in the background as I watched videos on Youtube or worked on one of my programming projects.

Two weeks after removing it from my favorites, I uninstalled it. I don’t think I’ll be back.

Hitman: Absolution is not a good game.

What do I mean by this? Several distinct things at once, actually;

  • It is not a good Hitman game,
  • It is not a good stealth game,
  • It is not a game that respects my time, and
  • It is not a game that respects my intellect.

I’ll go through these one by one.

Continue reading →

Humphrey’s Tiny Adventure: Remastered

Last year I participated in my first game jam with Ludum Dare #23. The result of those 48 hours was Humphrey’s Tiny Adventure, which I’ve written about previously. I was really proud of what I was able to accomplish, but there was a lot that I wanted to do with the project that I didn’t have time for. I didn’t include any sound or music, and I didn’t have anyone test it before release, so I never had the chance to get feedback. I recently decided to give Humphrey a long-overdue makeover for one of my entries in OneGameAMonth.

Over the past three weeks I’ve rewritten every piece of code in the game. Looking back at the original code, I’m literally terrified at the prospect of dealing with it. For the most part the gameplay is nothing complex, so I was able to build on the engine I wrote for Hypothermia. I created a data-driven cutscene scripting system using Slang, which I wrote about here. This was immensely helpful both in terms of writing reusable code and iterating quickly on the way each scene played out.

I’ve also redone almost all of the artwork. The art in the original version of Humphrey was composed entirely of large colored squares. This was mainly due to time constraints; the abstract style allowed me to spend very little time on each asset while still conveying the desired meaning. For the remake I did away with this restriction, and I’m very happy with the results. As usual, I used Inkscape for all the art.

Finally, this release includes a fantastic soundtrack by Chris Logsdon. It was composed specifically for the game, and you can download it here in high quality for the price of your choice.

Download the game here! I’d love to hear what you think of it!

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


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!

Experimental Gameplay roundup: Temperature

The list of games made for Experimental Gameplay November/December ’12 is up, and I thought I would give a bit of a mini review for each of them, since I participated this time around.

Hypothermia was my game, so I can’t really review it fairly. Nonetheless, I’m quite happy with the way it turned out, and I would consider it feature-complete, which is always a good goal. The postmortem is here.

Firesweeper has an interesting idea behind it, but I never quite figured it out. You’re supposed to control the spread of a fire by dropping water on a grid of squares, Minesweeper style. I might just be terrible at it, but I couldn’t find a consistent logic behind the fire’s spread or the way that it was counteracted by the water.

5 summers left reminded me a lot of Braid — what I was able to play of it, that is. It’s a puzzle platformer where you interact with the level in different ways depending on the season; for example, the ground is slippery during winter, but enemies are frozen in place. I didn’t get very far in the time I played it; it’s quite hard, and there’s no checkpoint or life counter system, which means starting the entire level over each time you die. I think it has promise, although I would like to see the limit on season changes removed.

Too hot too cold is another puzzle platformer that plays with switching back and forth between temperatures, but you change the state of the character instead of changing the world. Lighting yourself on fire allows you to burn through crates, and freezing yourself lets you break ice blocks. Remaining in either state for too long will kill you, but getting close enough to death gives you special powers for a short time. Later levels of the game rely on the use of these powers to complete, so getting a feel for how long you have to live is essential. This was one of my favorites.

Global warming was another one I really liked, probably due to my penchant for games where speed is the objective. You play a penguin running along an ice floe as it melts beneath his feet, trying to stay alive as long as possible. You earn money as you run, which allows you to purchase upgrades to increase your speed and acceleration. It’s good mindless fun, especially late in the game when all stats have been maxed out.

Temperature gods is an interesting RPG fighting game where you have to manage not only your health and mana, but also the temperature of the planet which you rule. Driving the temperature of the planet towards your goal increases your mana and gives you an edge on your opponent, but a lower temperature will give him the advantage. The soundtrack is quite excellent, and the mechanics of the game are sound — with a little polish it could be really great.

Heating and Cooling is another game I don’t quite understand. The goal is to keep the temperature of your house at a certain level by catching snowballs and fireballs. This works well, but I’m not sure that there’s a win state. A timer keeps track of how long you last, but there’s no scoring or leaderboard, so I don’t know that that’s for either. It’s obvious that there’s still work to be done, though, so maybe a future update will fix those problems.

Defenders of the Core is a top-down turn based strategy game in which you control a squad of firefighters trying to contain a blaze. You build a team up of several different classes that are designed to work together: for example, the Hydromancer can create hydrants, but a level 2 Firefighter is required in order to attach hoses to them. It’s very much a work in progress, according to the developer, but it looks like it has promise.

Last, but certainly not least, is Hot Plates. This one is my favorite of all the games that were submitted, and it barely squeaked in before the deadline. It’s a puzzle game based on Richard Feynman‘s work on theoretical physics. You control an ant which must find its way to all the food in the level within a certain number of steps. Temperature zones on the map affect the distance the ant can travel with each step; the warmer the zone, the further he can move. I started playing it and couldn’t walk away until I had beaten every level. It’s the only game I can think of which I’ve replayed over and over again in order to get gold ratings on all the levels (although getting higher than silver on 11, 15 and 18 still evades me). Hands down the best game of them all.

I really enjoyed participating, and it’s awesome to see so many other great games come out of the challenge as well. I’m going to be participating in OneGameAMonth this year, so I’m sure I’ll be able to incorporate Experimental Gameplay in with that.

Until next time!


Hypothermia — Experimental Gameplay challenge

Update: Hypothermia is now available on!

For the last few days I’ve been participating in the Experimental Gameplay challenge, a monthly game-making competition. The only rule is that you can only spend a week on your entry, so on December 1st I sat down and started crunching on a game for the chosen theme, “Temperature“. The result is Hypothermia, a first-person point-and-adventure in the style of Templar Studios’ Mata Nui online game. You can download it here.

This is the first game I’ve made that used Slang for scripting. Nearly all gameplay code is written in Slang, and it was incredibly helpful. Instead of making changes in AS3, recompiling the game and testing, I was able to hot-reload script files with FLAKit and see the changes instantly.

In addition, I used Ogmo Editor to set up entities in the scenes. I’ve never used it myself before, and I wish I had started sooner. With the help of the OgmoWorld and XMLEntity classes I wrote, I was able to load entities from Ogmo levels automatically with barely any prep work involved. And, once again, FLAKit’s hot-reloading allowed me to modify the levels and see my changes instantly.

Using Slang and Ogmo together allowed me to use a much more data-oriented approach to development than I’ve been able to in the past. This greatly decreased iteration times and allowed me to get scenes finished faster. In many cases I was able to work on the game for upwards of ten minutes without closing it once.

As usual, I used Flashpunk as a flash framework and Inkscape for graphics. The source code (as well as the original SVGs for all the art assets) can be found on the project repository in Bitbucket.