Author Archive

For the last Ludum Dare, I started using Flixel, but ran into problems with how it handled rotation and nested sprites. As a result, on Saturday night I tore out Flixel, and started throwing together a quick DisplayObject-based replacement framework, including some basic rigid-body physics. I didn’t finish in time for the end of Ludum Dare, but since then I’ve cleaned it up somewhat and fixed the worst of the bugs.

Here’s a brief bouncing-balls demo. The balls have an elasticity greater than one, meaning they gain energy from collisions. The world wraps horizontally. If you wait a bit, you can see the balls go through a phase transition similar to what happens to photons in a laser.

Instant Jam was an online rhythm game for Facebook. Its major selling point was “play with your music library”–they provided note charts for songs, while you provided the MP3 files. This allowed them to have a vast selection of available songs without paying the usual licensing fees, and meant that users didn’t need to re-buy songs they already owned to play them in Instant Jam.

I worked on the Flash version of the Instant Jam client frontend. It was created for compatibility with Macs, and as a preview for users who did not wish to download the proprietary InstantAction plugin.

I did a lot of UI work for Instant Jam, attempting to match the features of the InstantAction version as closely as possible. I also heavily optimized the main rhythm game component, using profilers to pinpoint causes of frame hiccups and then addressing them.

A while back, I found Simple Sudoku, a freeware Sudoku puzzle maker/solver. It generates puzzles for you to solve, and also has a lot of features to make it easier to solve them. After playing way too much Sudoku in it, I realized why it makes things so much easier. On the surface, Sudoku is all about logical deduction–the 9 in this square means you can eliminate 9’s elsewhere in the row and column, and so on. However, at higher levels, Sudoku is actually about pattern recognition, and that is what Simple Sudoku reveals.

One thing I noticed about the Ludum Dare Flash entries was that most of them were done with flixel. For the competition, I decided not to use it because I didn’t want to learn a new library in the same 48 hours I had to make a game.

Anyway, I’ve finally gotten around to trying flixel out. I cast around a bit for a game idea that I thought would suit flixel’s strengths. It’s a game with 3 tracks where rocks come at you and you have to switch tracks to dodge them. The longer you stay on a track, the faster it gets. Also, as you get closer to the right side, the track speeds up and you gain a score bonus. Pick up ore for points, and red orbs for more time.

SEEK*TOR is a puzzle game about revealing the single enemy turret on an obscured map. It was created for the 16th Ludum Dare competition, a 48-hour long solo game development challenge. The theme of the competition was “Explore.”

SEEK*TOR was ranked 5th overall of the 121 entries. Play it below:(more…)

Turns off debug flag so turret layouts are randomized between 4 choices instead of just one

Background music now loops

So what caused the unclickable-things bug, and how did I track it down?

With the help of debug output, I discovered that when a turret or enemy was unclickable, it was because something else on the screen “stole” the click event. In the unclickable upper-left turret bug, the click event was going to the flare display in the upper-left. In the unclickable enemy square bug, the click event was going to an object with a name like SpriteXXX. XXX was a number that was larger the later in the game the bug appeared.

The object name was my biggest clue. The number meant that it was a sprite that was created every level. The turrets are created anew every level, but they show up as TurretXXX. So I combed through the code until I found a sprite that was being created every level.

The sprite I found was the little explosion graphic that shows when you click on the enemy turret. In my competition-driven haste, I’d written code that created a new sprite every time the explosion went off, and didn’t bother to make it unclickable, or remove it from the stage afterward. To fix the bug, I modified the code so that it created the explosion sprite only once and reused it every level, and I made sure the sprite was unclickable. That fixed the bug.

So this was my first Ludum Dare. I did the Global Game Jam back in February, so I had some idea of what to expect, although the GGJ was teams rather than solo. One thing I do regret is not interacting more with the community–IRC, Twitter, etc. I could have used more feedback than I got, instead of relying almost entirely on my husband’s comments.
Friday night I spent brainstorming ideas and thinking over mechanics. Saturday morning I started coding. By late afternoon / early evening, I had the major mechanics implemented, but it wasn’t fun. At that point the turrets were just yellow diamonds (and they were warp portals which your cyan circle teleported between), and the hint circle always disappeared before you could fire again.

Screenshot of older version of SEEK*TOR

The best thing that happened for the game occurred when I sent my Saturday prototype to a friend for feedback. He told me two very important things:

He had the most fun figuring out where the hint circles intersected

He wanted to know why you had to aim and fire to reveal the map instead of just placing light bulbs around the “platforms” (yellow diamonds)

So I made the hints persist but fade over time. That means you can see the hint circle intersections, but the screen doesn’t become overly-cluttered with old hint circles. It also means the aiming mechanic is important, since if you take too long, the previous hint will have faded away. I also changed the theming of the game so that the portals became turrets and you selected a turret to fire from, rather than teleporting between them.
Sunday was mostly a day of polish. The big feature changes were implementing multiple levels, scoring, and flare limits. I also added the start, game over, and between-level screens, made the graphics, (such as they are–hooray for GlowFilter!) composed a background track, and created the sound effects.
In the end, I was successful in terms of having a pretty-much finished game at the end. On the other hand, seeing some of the other entries, I kind of wish I’d done something a little more ambitious…
Things that worked out:

Using abstract glow-y vector graphics instead of trying to draw. (I spent about 20 minutes attempting to draw a single turret before deciding my time was better spent elsewhere.)

The game selects from 4 (hand-crafted) turret layouts and randomizes the enemy and player locations. That turned out to be enough randomization that I didn’t need to make a turret layout generator. In fact, I only just realized that I left the game in debug mode where it always chooses the same turret layout.

Things that didn’t work out:

When I started, I implemented everything in one file just to see if the core mechanic would work. I made such a mess of my code that I spent hours late Saturday night moving code around so I could add levels. Spending hours working on code without actually adding new functionality–even regressing at times–was very hard on my morale.

I spent too long trying to make my git history tidy. I’d keep forgetting to add a file to the commit or not commit for a while and wind up with a gigantic commit that involved 3 features and all the source files. Then I’d try to figure out how to break up or revise the commits. (And how to use vim, since that’s the default git editor…) Given that I never had to revert to a previous version, it was kind of silly of me.

Sweet, I managed to complete my first Ludum Dare! I was thinking of learning Push Button Engine for it, but after going through a couple of tutorials I decided I’d go for straight-up Actionscript instead. PBE has some neat features, but I need more time to get my head around its component-based programming model.Anyway, SEEK*TOR is a game where you’re trying to locate the enemy by firing search flares from turrets. You have limited flares, and turrets have a limited range, so you need to carefully choose where you aim. It’s in Flash.

Incidentally, I’m annoyed with Audacity because it added an initial silence to all the mp3 files I encoded with it. So all the sounds come in late. Also, I just realized that I forgot to have the background music loop…

Though my website is hosted on Dreamhost, these days I mostly use them for version control hosting. So I was very happy when they set up git on their servers.

Casper Fabricius’ Keeping git repositories on Dreamhost using SSH has some instructions and a handy script for automating the process. Thing is, I tend to create the folders and files for a project before I set up the git repository. Casper’s script assumes you want to create the folder and repository at the same time.

So here’s my version of the script. If you call it without arguments, it assumes you want to make a repository for the current directory.

A while back, I worked on an online Flash version of the game show Don’t Forget the Lyrics. It’s a game show where contestants get up and sing along to some music until the music stops dead and they have to fill in the rest of the line. They have three lifelines (a la Who Wants to be a Millionaire) they can use: show the first three words, turn the question into a multiple-choice question, or get their pre-appointed friend to answer for them. The first two are easy to code up, the third not so much. We didn’t have the budget to record people singing the missing lyrics, so it had to be text-based. We thought of randomly selecting one of the multiple choice answers, but realized that people would probably feel cheated at being given a wrong answer. And it would be too easy to just always give them the right answer.

At some point, I came up with the idea of showing the player a scrambled version of the correct answer. That would leave it up to the player’s skill to get the correct answer from it, so it wasn’t a guaranteed success but would still seem fair. Then I had to come up with an algorithm for scrambling words that wasn’t too easy, but wasn’t too hard for anyone to solve in the time limit.

I'm a full-stack web developer with a front-end focus. My expertise is in Ruby on Rails, Javascript, and React JS, but I've worked on all parts of the stack, including database and API design to dev pipelines and end-to-end testing.