Project Good Robot 18: More Robots

By Shamus Posted Wednesday Sep 25, 2013

Filed under: Good Robot 151 comments

A small announcement before I get to the post itself: Last entry I mentioned I needed music. I didn’t expect that multiple people would be offering to compose original music for my game for free. I’ve been quiet about these offers for help so far because I didn’t know how to respond, but then composer Fawstoar made this track and I couldn’t say no.

But here’s the thing: I’m really nervous about inviting people to make tracks for the game, because I’m the absolute worst sort of person to make music for. My tastes are lowbrow, but I’m also incredibly picky and I know nothing whatsoever about music. I’m sure everyone has run into the classic Clients from Hell stories, where a client keeps asking for changes because they do know what they don’t want but they don’t know what they do want and in any case they lack the basic vocabulary to even express their preferences. So you wind up with a client repeatedly asking you to change the color scheme of the website and it isn’t until your sixth revision that you discover the color isn’t the problem, it’s that they wanted the buttons to look more “glossy” like [huge boring corporate site that’s looking kind of dated] and they’re actually colorblind and couldn’t even detect most of the changes you were making.

That client? That irritating jackass? That’s me. You don’t want to make music for me. I’m an idiot. I want a very specific kind of inoffensive electronic music, I lack the knowledge and language to explain what it is, and I don’t want to pay for anything. Who would want to deal with that?

While I’m wise enough to see that making music for my game would be bad for you, I’m also selfish enough that I’m willing to offer the chance if you want to try. But rather than asking someone to go out and make music, I’ll just leave the door open for submissions. If you think you have something that fits, just leave a comment with a link to the track on Soundcloud or Youtube or whatever and I’ll give it a listen. If I like it, I’ll put it in the game. If I don’t, I will probably avoid saying why because I don’t want you to spend two days re-working it only to have me still not like it because I gave you bad advice.

Obviously I’m not looking for exclusive rights. I just want tracks that I’m allowed to use in my game. And if you don’t want to do hours of work trying to please an ignorant slob who might not finish the stupid videogame anyway? I don’t blame you.

The mood I’m going for is… uh. I guess pretty much the original Descent:

Link (YouTube)

Except maybe not quite so… 1994 MIDI-ish? (See what I mean about me being a horrible and difficult client?) Perhaps the Unreal soundtrack would be a better example. Tracks don’t need to be epic long compositions. In testing, levels currently only take about five to ten minutes, so a two or three minute track that’s looping-friendly should do just fine. Most players won’t even notice the repetition in that timeframe.

Some of you have already linked to your work on Soundcloud / Youtube / Jamendo. I’ve listened, and I’m considering some of them. We’ll see.

Anyway, let’s talk about the game:

This problem would be easier to solve if I wasn’t out of missiles myself.

You know what’s fun in this game? Dodging missiles. Maybe it’s just me. So far only two of my seven playtesters (my daughter Rachel and myself) seem to get caught up in missile-dodging.

How it works is this: A robot shoots a homing missile at you. Your lasers are busy elsewhere, so instead of shooting down the missile you cut to the side at the last second and the missile zips by. You feel pretty good until you realize it’s not going to give up that easily. It loops around and while that’s happening another missile is already on the way. The turning radius of a missile is too large to hit you like this, so there’s now a missile circling you in each direction and also the robot is still shooting so you’ve got another one on the way. It seemed like a pretty slick move the first time you dodged one, but now you’re kind of pinned in this circle until you can shoot them down, which makes it hard to avoid all this incoming laser fire.

So dodging missiles is a very temporary solution to the problem, and in fact can make things worse if you let it get out of hand. But it’s fun.

The missile flight patterns are interesting enough that I’m thinking it would be good to have an enemy that moves this way. This would mean making one that moves forward constantly and must turn itself around to change movement direction. So let’s do that. I think I’ll call these new enemies “flyers”, since they fly around you all the time.

I’ll confuse him by dodging directly into his lasers!

It’s kind of boring to have them just fly loops around you, and it also makes them kind of predictable. But after some experimenting I find a nice simple system for keeping their movements interesting. Instead of orbiting the player, they orbit a point a slight distance from the player. If the robot is on your left, it tries to fly around a spot just above you. If it’s on your right, it goes for a spot just below you. When it shoots, it reverses these.

This is complete chaos. These rules are dead simple, but this thing is hard to hit and hard to dodge, which is a surprising combination. Just about the point where I get the little bastard lined up, it’s ramming into me and I have to juke to avoid getting… uh… bitten? I dunno. Whatever we’re calling these melee attacks.

The other thing that makes this fun to fight is that when I’m in a tight passage, it spends about half its time inside the walls. I haven’t written any collision detection for it yet, so instead of slamming into walls it just passes through like Casper. Then I spend a few panicked seconds waving my laser around, wondering where it will pop out.

Where is Kevin Bacon when you need him?

This behavior is interesting enough that I think it needs to be a feature. So I add some effects to make it look like this thing is boring through walls. When it collides with level geometry, it halves its speed, gives off a scattering of rock particles, and begins emitting a rumbling sound. There’s another sound and particle burst when it exits again.

Great. So I’ve come up with another new and interesting enemy type. Which tunnels through the ground. And which I’ve named “Flyer”. The name is extra stupid, since most of the other robots also fly.

I spend a few minutes re-naming this and everything is great. But speaking of naming problems…

Originally you were going to buy upgrades in this game. Monsters would drop coins, and when you reached a shop you would pay for upgrades. Except, I don’t like the feel of this. If the player happened to miss the shop (easy to do in these tunnels) then they might go for a long time with a bunch of money they couldn’t spend. Also, I wanted to give out lots of upgrades at first and gradually space them out later on. How do I do that? Give more money in the easy early levels and less when the game is hard? That would just incentivize the worst sort of grinding. I could have the costs ramp up over time, but that goes against the type of upgrade system I’m trying to make.

Then I realized that what I wanted was a leveling system. So I replaced the store system with a level system. Except…

I already have a “level” system. In level.cpp, I procedurally generate gameplay areas called “levels”. It took me a couple of days to even notice I’d made this blunder. When I did, I figured it was no big deal. I’ll just make sure to name stuff like “character_level” to differentiate from “place level”. Surely I can keep the two level systems straight, right?

Well, no. A few days later I got myself turned around and started plugging the wrong variable into the wrong system. I was messing with xp per level, which I thought was how much xp it takes to gain a level, but was actually how much xp was available in a specific area of the game. Then later I thought the “max level” variable in the save file was how far something(?) had leveled up, but it was really the highest numbered checkpoint save the player had reached. And then there are skill levels, which is how far individual skills have been upgraded. Basically this Order of the Stick has become a running gag all through my code.

For a while I get by with making the names more descriptive. I’ll call something “character_level” instead of “level”. But there are still situations where meanings can be ambiguous and turning variables into sentences is a poor solution to that. This is only going to get worse. If I’m getting confused when I’m actively working on the project, then this is very bad. If I had to step away from the project for a few days due to sickness or other obligations, then by the time I got back I would have forgotten which level was which and it would be madness.

So over the course of two honkin’ hours I painstakingly rename everything to do with gamespace geometry from “level” to “map”. It probably would have been faster to rename the other sort of level, but I have no idea what else it could be called that I’d remember and that wouldn’t just cause more confusion elsewhere.

I suppose it would help if I had better refactoring tools. Or if I had any at all. When I worked with the Qt platform, the dev environment had a built-in feature that would let you rename a variable. It was smart enough to understand the difference between the variable you’re renaming, and another variable elsewhere that happens to have the same name. (Which is probably why you’re renaming this one.) It’s smart enough to not mess with stuff inside comments, or rename partial matches.

Maybe I should have made you sign an NDA before I let you see this code.

But I’m using Microsoft Dev Studio, and for some unfathomable reason they don’t have a tool like that. The environment is actually aware of variables, but it doesn’t use that knowledge when renaming. All you get is stupid Find & Replace, which is incredibly dangerous. One bad command can make a complete mess of the code, or rename things in ways you don’t realize until much later. And if you’re trying to rename something because it’s too similar to something else, then Find & Replace is like using a Flamethrower to test your smoke detector: You’re likely to cause a catastrophic version of the problem you’re trying to avoid.

(To be fair, maybe the full version of Visual Studio has a proper rename tool. I’m using the Hippie Freeloader Edition™ right now. Then again, I had the pro edition of an old (1998) version at my old job, and it didn’t have smart renaming either.)

It sucks to lose a couple of hours like that, but this sort of thing happens. As a program grows it gets harder to keep the whole thing in your head. If you’re like most people you probably gravitate towards certain words and those habits find their way into code. And if you’re like me then you’re probably getting on in years and finding it harder to remember what you were thinking when you wrote something.

So those are the most interesting problems last week. I have to say this is going amazingly well. I haven’t lost a day to some intractable tech problem. Or had to deal with ongoing crash bugs. I haven’t been plagued by performance problems. Maybe this is because “2D is easy”, or maybe I’m just really at the top of my game, but it feels good when a project flows like this.


From The Archives:

151 thoughts on “Project Good Robot 18: More Robots

  1. Benjamin says:

    The full version of VS doesn’t have anything better than find and replace, unless I’m completely missing it.

    1. Abnaxis says:

      If I remember correctly, you can right click on a class, function, or variable and have it list out the declaration of the thing as well as every place it is referenced. I…thiiiiink there’s some smart replace functionality in there? If nothing else, it’s a “find” that works better than the blithe text-matching of “find and replace”

      1. MJG says:

        There’s built-in refactoring for C# code in the full VS 2010/2012, which I use quite a bit. Right click on a class/variable/method name, and there’s an entire “Refactor” sub menu. But I don’t think there is similar built-in functionality for C++.

        1. Abnaxis says:

          It’s there for C++, at least it was there the last time I was using Visual Studio.

          Now mind this was a number of years ago and I think Microsoft completely obliterated IntelliSense for VC++ and rebuilt it from the ashes since then so the feature might be gone now, but I remember using it…

        2. Mephane says:

          A lot of the features that Visual Studio has for C# are not available for C++, which at least partially has to do with the fact that C++ is much more complicated to parse.

    2. James Schend says:

      Depends on the language you’re working with.

      You can’t automatically refactor JavaScript (for all intents and purposes) so Visual Studio won’t even let you try. This isn’t a “Microsoft was lazy”, this is a “it’s literally an impossible programming problem to solve”.

      With C, C++, C# and other C-like languages, the refactoring tool works fine.

      I have no idea what “Microsoft Dev Studio” Shamus is referring to, but Visual Studio (even the Express versions) have no problem refactoring variable/function/class names in C++ (which is what he’s using)– I’m not sure what the difficulty was.

    3. James Schend says:

      Depends on the language you’re working with.

      You can’t automatically refactor JavaScript (for all intents and purposes) so Visual Studio won’t even let you try. This isn’t a “Microsoft was lazy”, this is a “it’s literally an impossible programming problem to solve”.

      With C, C++, C# and other C-like languages, the refactoring tool works fine.

      I have no idea what “Microsoft Dev Studio” Shamus is referring to, but Visual Studio (even the Express versions) have no problem refactoring variable/function/class names in C++ (which is what he’s using)– I’m not sure what the difficulty was.

      Visual Studio is by far the best IDE available, so I won’t have it impugned. Haha.

      EDIT: Oop the link further down supports that VS no longer does it for C++, for reasons similar to the reasons it doesn’t do it for JavaScript. Sorry if I’m spouting lies.

      And amen! I haven’t had to touch C++ in long enough that I’m forgetting stuff about it.

      1. John says:

        I don’t know of any versions of Visual Studio that have this sort of functionality built-in for C++, but there is a plugin called VisualAssist which does a lot of what you want.

        I haven’t used VisualAssist in a while (because VS already has this stuff for C# and that’s what I use for preference), but I recall it being pretty good.

        (EDIT I think I replied to the wrong thing here, whatever)

        1. Freykin says:

          I’ve been using Visual Assist for about a year now, and it’s amazing. It’s the best plugin I could have ever hoped for; it’s cut down my keystrokes to about 75% what they were before, and the refactoring tools are brilliant.

    4. Eldiran says:

      Don’t know if this will be helpful at all, but in Visual Studio 2010 you can rename variables across the project just by going to the definition, retyping the name, and clicking on the tiny red rectangle that appears right below the variable. Then it’ll give you a dropdown with the option to rename.

      Hopefully it’s possible you also have that option and it was just too well hidden…? Thought I’d give it a shot anyway.

    5. Cybron says:

      I use the pro version of VS for C#, and it asks you if you want to rename all references to a variable whenever you change its name. So yes, the new version of pro does have renaming, for C# at least.

    6. kdansky says:

      Writing C++ code with VS means you either need VS2012+, or if you want to use an older version, get the plugin Visual Assist X. It has great code completion and refactoring features.

      As for Shamus having trouble keeping the different types of levels seperate: That’s what a type system is for. Don’t store your stuff in integers, but make actual classes for it. Then you can go wild with the naming and the compiler will hit you with a stick if you mess up.

      1. wererogue says:

        +1 for Visual Assist X. I have never worked for a large dev studio that didn’t have it, and when I worked for a small studio that didn’t have it, we didn’t make that kind of refactor.

  2. Skye says:

    I love watching simple rules turn into complex and terrifying opponents. It took me a while in Minecraft to figure out how the skeletons were making their choices- There was always two or three of them, and it seemed like they were hunting me fairly efficiently.

    1. Primogenitor says:

      Flocking (aka boids) is another example of this, and could be really cool in the sense of scaling up here – in teh beginning they are one at a time, by teh end your fighting a flock of 50 of the same things behaving like one super-organism.

    2. swenson says:

      Creeper AI also appears a great deal more complex than it really is. In reality, they just try to get as close to you as possible before making any noise (and, in a previous version, would tend to circle to your left). But in-game, it looks like they’re ambushing you from behind corners, sneaking up behind you, etc.

      It really is neat how such a simple rule can work so well.

    3. ET says:

      The rules for Pacman’s ghosts are another great example of simple rules giving (seemingly) complex behaviour.
      At least, for players who aren’t masters of the game.
      Once you know their rules and/or are looking for their patterns, they are sort-of easy to keep track of, or so I’ve read.

        1. Neil Roy says:

          Thanks for that link!!! VERY interesting reading! I created Deluxe Pacman for the PC and I used the same collision detection as the original Arcade game (with the same rare pass-through bug). I love how their path finding is so simple, yet appears more complex. In my version of the game (available online for free here) I needed to add in much better path finding because the game comes with a level editor and some levels you can design so you have to wrap around the screen to get to another part of the level and in the Arcade versions logic, that would totally stump the ghosts. I also used the same logic they did for finding a new direction at intersections, I am proud that I came to the same conclusion. ;) I am working on a new version which uses circle collision detection and I want to improve my path finding. That was a great read anyhow!

  3. Jarenth says:

    It’s interesting, the way different brains work. I see you describe an enemy that flies circles around you at a set distance, and I think ‘Orbiter’. Or maybe ‘Circle-Flying Guy’.

    That second-to-last screenshot, with Good Robot staring directly at the camera, is just begging for a witty caption. Other Commenters: your time to shine is now!

    1. Lovecrafter says:

      “Should’ve gone left at Albuquerque.”

    2. MrGuy says:

      “I hate snakes! I hate ’em!”

      1. bucaneer says:

        “Enough is enough! I have had it with these Samuel L. Jacksoning snakes in this Samuel L. Jacksoning cave!”

        1. MrGuy says:

          It’s actually a quote from Raiders of the Lost Ark, but I can see the confusion.

        2. Dave B. says:

          Samuel L. Jackson. Why did it have to be Samuel L. Jackson?

    3. swenson says:

      “They don’t pay me enough for this.”

    4. Zock says:

      “It was already broken when I got here.”

    5. Paul Spooner says:

      “Don’t worry, it won’t come back out until you’re reading the next paragraph.”

  4. Volfram says:

    Yep, renamed a couple of classes because I wanted to use their names for something more appropriate.

    Werkkzeug1. which is a public-release version of the tool Farbrausch used to make their groundbreaking 64-kb demo, “fr-08 .the .product” has the option to name variables so that you can recover them elsewhere. You can also rename those variables from any store or load, and all other instances will be renamed appropriately.

    I like Werkkzeug1. I’d like to one day make a system that’s similar.

    1. Mephane says:

      Incoming digression into language nitpicking:


      Is this how it is actually written? If yes than this is a horrible, horrible name for a tool. It has wrong spelling; obviously it is meant to mean “Werkzeug”, which means “tool” in English. So they actually named their tool… Tool 1. Is there also a Tool 2, and if yes what’s the difference? Or is it just version 1 of Tool? And what makes the matter even worse is the fact that anything programming related sounds completely awkward in German anyway (and I say that as a native speaker).

      1. DrMcCoy says:

        As a native German speaker, let me tell you, as a fellow native German speaker, that Farbrausch is a German group, consisting of 90% or so native German speakers.

        They probably know what they’re doing. It’s very probably meant humorously. You know, humor, that thing we allegedly don’t posses.

      2. Volfram says:

        As a non-German speaker… yes, that is how Farbrausch spells the name for their demotool. I double-checked before hitting “Submit.” Yes, there is a Tool 2. Also a Tool 3 and a Tool 4. Yes, they’re just versions 1-4 of Tool. The last one can be downloaded here.

        And yes, DrMcCoy is right, Farbrausch are based in Germany, they a warped sense of humor(They are responsible for “The Product,” “Poem To A Horse,” “The Popular Demo,” and “Debris,” and the “.HUND” meme), and they’re probably doing it on purpose.

        1. Peter H. Coffin says:

          See, it would be FUNNIER if there was only Tool 1. And it did everything, so that one would think there would never be a need for a Tool 2.

  5. Robert Conley says:

    The Full version Visual Studio has refactoring tools either as a low cost/free add-on or built-in since VS 2005. I use them all the time in my C#/VB.NET projects. Extract method is amazingly great. Allows you select a section of a subroutine and turn it into another subroutines with the correct parameters to preserve and pass data.

    1. MrGuy says:

      It does have them for C#, but not for C++.

  6. Tholmir says:

    I’m using Microsoft Visual Studio C# 2010 Express, and you can easily rename variables (or anything). Just hit F2, and it’s doing a really great job.

  7. Enjolras says:

    There’s a hilarious paragraph in the (1st edition) Advanced Dungeons & Dragons Dungeon Master’s Guide about all the uses in that game for the term level: dungeon level, character level, spell level, monster level….

    So Shamus, this isn’t a new problem. :)

    And that is my nerdy contribution for today.

  8. Guts says:

    You might find some fitting music from NoSoapRadio.
    It’s licensed under Creative Commons, so it’s free and can be used commercially.

  9. MrGuy says:

    Sorry to repeat a thread, but since the original was so far down on the last Good Robot update….

    I am encouraging anyone who’s interested in demonstrating “I support this thing Shamus is trying to do” to donate $9.99 via PayPal. The donate link is right there on the right side.

    This is completely unofficial. It is NOT a pre-order, or anything you should expect something from Shamus in return for. It’s not conditional on other people donating or anything. It’s more an expression of “hey, I think this is neat, and I want to encourage you to keep going.”

    It’s also some expression of “hey, I like the idea of this game and the series of posts enough to want to contribute in some very very small way towards Shamus being able to bring this thing to life.”

    1. Shamus says:

      Real talk: That helped quite a bit. Several people joined you yesterday. I was able to put the money into some hopefully cool stuff that I’ll talk about later. I didn’t want to go to all the time / hassle / risk of running a Kickstarter for just a few hundred bucks. (Kickstarters take time, and then MORE time to get your money once you’re funded.) This project is too small and fast for that sort of formality.

      But those donations let me grab some stuff that I’d been putting off.

      1. Inscrutibob says:

        Add me to the list of donors. For you are awesome, and deserve support. Personal stuff, coding stuff, game industry stuff, whatever.

      2. Phantos says:

        I wish there was an alternative to Pay Pal, since that service has royally f***ed me and everyone I know so many times. To the point where me and every Canadian I know can’t use it anymore. It just won’t transfer money anymore for us, but that’s the only thing anyone uses for online money transfers.

        It sucks not being able to support something because everyone on the internet has married themselves to something terrible.

        1. Strangeite says:


          I have donated in the past and can’t any longer because I can’t use PayPal.

          Edit: To clarify, Paypal has some problem with my credit cards because they are tied to my business. I have tried 3 different times to sort it out but the hoops they want me to jump through are confusing, too onerous and stupid. So I just have said screw PayPal. The small businesses I use that still rely on it are more than happy to accept a check.

    2. James Schend says:

      I’m going to be “that guy”, but I’d donate if it weren’t Paypal.

      1. Squash says:

        Then PM Shamus, ask for his address, and send him an envelope full of coins.

        Seriously, you may not like using PayPal but is it going to kill you this once?

        1. James Schend says:

          Is it going to kill me? No. Am I going to support Paypal’s terrible business practices by giving them money? Not a single goddamned cent.

          Amazon has the same feature run by a company that isn’t run by scumbags.

          1. Bropocalypse says:

            I’m sure they’ll miss that cut of your ten dollars enough to change their ways. Unfortunately I don’t have that sort of moral fortitude, so I donated a sawbuck anyway.

            1. Zukhramm says:

              Choosing not to sue something you dislike is rarely about making them change by hurting them.

              1. MrGuy says:

                Oops – this was supposed to be a reply to grandparent. Parent is on the same point I am. Sorry for the mis-thread

                Sure, but sometimes you draw a line and say “nope, not doing it.” Whether it makes them change or not – it’s about choosing not to be part of something.

                It’s the relationship I have (or, more correctly, don’t have) with Facebook. I recognize I’m mostly hurting myself by not being on Facebook – there are a lot of updates, relationships, photos, meetups I miss out on. And frankly, the social graph they have is so complete they probably know who my friends are anyways. But I simply cannot abide willingly becoming part of their machine.

                So I respect the stand.

                But that said, in this case, PayPal is the option we have for “go donate money to Shamus right now.” Which is why I’m asking you to use it.

                If you want to lobby Shamus to switch to another provider, go for it. I expect that’s a “some point in the future” item at best.

          2. Soylent Dave says:

            “Amazon has the same feature run by a company that isn't run by scumbags”

            As that’s the same Amazon who literally don’t pay any taxes in the UK (and precious little anywhere else), despite making squillions in profit, I’m going say that actually: they’re scumbags too.

            ’cause: corporation.

            Good luck finding one that isn’t evil.

      2. Dragomok says:

        Out of curiosity: is that because of ideological (say, that recent IndieGogo controversy) or availability reasons?

    3. jarppi says:

      I already did that a couple of weeks ago. I’d also encourage other people to do the same :)

    4. Bear says:

      In like Flynn

    5. Andy L says:

      This is probably sounds really petty, but if enough people think like me it might be a real thing :

      I get nervous when someone’s PayPal address doesn’t match their contact info and/or doesn’t contain their own domain.

      If the PayPal address is overtly religious and/or political (And the site I’m sending money to isn’t) it makes me even more nervous.

      I don’t have a particular underhanded dealing that I’m worried about specifically. It’s just an irrational fear of somehow sending money to the wrong place. …but it’s just one more little thing that makes me hesitate to open my metaphorical wallet.

      1. Shamus says:

        I totally understand this. It’s actually my fault. My wife has been bugging me to set up a PayPal specifically for this site and I keep putting it off. This has been going on for a couple of years now.

        I’ll get to it eventually.

  10. Julian says:

    “There are two hard problems in computer science: cache invalidation and naming things.”

    I have no idea who originally said that.

    1. lethal_guitar says:

      The version I know also has “…and off-by-one errors.” :D

      1. aldowyn says:

        as an amateur programmer, off-by-one errors do happen a lot. luckily they’re usually pretty easy to identify and fix…

      2. MrGuy says:

        There are 1 kinds of programmers. Those who start counting at zero, and those who don’t.

        1. RodeoClown says:

          Except programmers don’t start counting at 0.
          But they do use offsets a LOT.

          When you see “ArrayName[0]”, that’s referencing the first element (element number 1), but it has an offset of 0 into the array (you are counting 0 elements past the first one).

          Off-by-one errors occur when you confuse your offsets with your counts.
          There is method to this (apparent) madness ;)

          1. MrGuy says:

            Yeah, true, but the joke sucks your way…

      3. Richard says:

        The version I know also has “handling the 29th of February”, and it’s three problems.

  11. rofltehcat says:

    Oh god… while the design behind that “Drillbot” is great, it remembers me of the possessed paintings in Rogue Legacy: They are just the kind of circle-flying monster that can clip through walls like your Drillbot.
    They are also both annoying to avoid and annoying to kill and later they can even change direction and shoot projectiles… am I giving you enough ideas yet? :D

    1. The Drill Bots are also very similar to the worms in Terraria. Those things are some of the most terrifying or most annoying enemies, depending on your current power level. You hear them coming, know they’re somewhere nearby, but don’t have a chance to defend yourself until they’re already on top of you. It’s shocking how effective they are, and the Terraria worms don’t even have a ranged attack. I already fear the Drill Bots.

  12. WILL says:

    Refactoring in C++ is apparently very difficult and unsafe, so they just never did it in Visual Studio.

    Here’s a quick explanation on the problem here.

    Although I know there are third party tools to refactor in C++ made for visual studio, not sure how good they are.

    1. Abnaxis says:

      Alright, this is the third place I see that, and now I ‘m starting to think I am insane.

      Didn’t Visual Studio used to do refactoring, but drop it a few years ago as it became a complete hog on large projects? Or am I just making crap up? Google has failed me…

      1. James Schend says:

        For what it’s worth I thought it did too and now am thinking I’m insane. Maybe we were both working on C (not C++) projects and have lousy memories?

        In any case, like I posted above: I just thank God I haven’t had to touch C++ in years.

    2. DrMcCoy says:

      Just keep in mind that this is the C++ FQA (note: not the FAQ, the FQA) that solely exists to bash C++. :P

    3. Matt Downie says:

      In my office we use the Visual Assist plugin for that sort of thing. It’s good but I think it costs $100 or so.

  13. Zeta Kai says:

    Hey, a new Experienced Points & a Good Robot article! Awesome! Hey, wait a minute…

    Where’s the DieCast this week? Where is it?!? Hello! Hello…

    DieCast… come back…

  14. Tim Keating says:

    Then again, I had the pro edition of an old (1998) version at my old job, and it didn't have smart renaming either.)

    That’s because in 1998, refactoring was basically just an academic’s wet dream.

  15. Nathan says:

    Here’s a track I made recently that fits the style you’re looking for, although the mood might be a bit too bright and sunny

    1. Fawstoar says:

      Sounds cool; nice work. I like that while it has a retro sensibility, the production is a lot more creative than just chipmusic. The arping progression in the second half is pretty. Seems like it wants to go somewhere at the end, but you cut it short!

  16. Akri says:

    That inaptly-named Flyer bot makes me think of the worms in Terraria. You’ll be down in a cave, mining happily, and then you hear CH-CH-CH-CH-CH! and a worm explodes out of the wall, chomps on you, and then disappears into another wall.

  17. MichaelG says:

    Shamus, go to and pick a track. Tons of stuff to listen to. And if you don’t want to pay $150 for a license, link your choice on your site and say “something like this, please.”

    You may not be able to describe exactly what you want, but you can pick something and point to it.

    1. MrGuy says:

      Just a meta-comment here (not directed at you specifically, but at a number of suggestions similar to this)…

      That’s a great site. But comments like “go here and listen to the hours and hours of available stuff and pick what you like” may not be helpful. Selfishly, I want Shamus to spend his time working on the game (so we’ll actually maybe get a game), rather than exploring large libraries of music to see if there’s anything he likes in there.

      What I suspect would be most helpful would be volunteering to “curate” that library. Go explore, and bring back “Hey, Shamus, here are 5-6 specific tunes in that repo that I think might be good for the game. Take a quick listen and tell us which ones line up with your thoughts on the game.”

      1. MichaelG says:

        I just hate the thought of people putting in time to perform music and send it to him, only to have him shrug or not answer at all. Cruel!

        If he has this “I’ll know it when I hear it” attitude, he should browse for something. I also don’t think that paying $150 for a track license is too much to ask.

        1. giantraven says:

          I’m planning on writing some songs and if they don’t get picked up, at least I’ll have some nice new material to slap up on band camp at some point in the future.

          The act of creating something makes it all worthwhile really.

        2. Moridin says:

          $150 may not sound very much, but remember that Shamus has no idea at all how many people will end up buying the game and I assume that he’s still hoping that he’ll at least get some money out of it. If he chooses to charge $10 for the game, that means he’ll need an extra 15 customers for each track he licenses. That’s not a big deal if he gets hundreds or thousands of customers, but for all he knows the number might be measured in dozens instead.

      2. Dave B. says:

        Beyond that, it might be helpful for Shamus to listen to them in pairs, and tell you which one seems to fit better with his idea for the game, even if neither of them is exactly what he wants.

  18. Matt Budke says:

    Since you are being a difficult music patron anyway….

    I would like to suggest finding/commissioning a piece of multi-track music where the the basic/bottom layer of mood and percussion would play throughout. But then, perhaps tied to the number of sprites being processed, additional layers would kick in. 1 enemy? simple melody line. 3 enemies? Additional percussion. Where did all those missiles come from?!? additional base notes and harmonies. And then as things are destroyed the music would fade back out to the background mood layer.

    You could even take the same music layer and have different “instruments” play it so Flyers sound different from Walkers.

    1. bucaneer says:

      I see a potential problem with this idea: enemies that sound so good that you don’t want to kill them.

      1. Paul Spooner says:

        Why stop there? Write an entire procedural music engine that builds a fully orchestrated emergent symphony based off of your mission progress up to that moment. As more and more enemies are defeated the musical accompaniment gets more and more complex. But, as your health goes down, the number of simultaneous instruments gets less and less until just before you die you’re left with a single drumline or frantic square-wave solo.

        Oh, right, it takes enough time to write this stuff already.

        Well, procedural sound-track would still be awesome. I guess we’ll just have to wait on that for the next project.

        1. Epopisces says:

          I. . .kinda want to play this game now. The ‘enemies = music’ game, that is (though I certainly intend to buy/download/consume-in-whatever-form-Shamus-offers Good Robot too :P)

          1. Bryan says:

            Well, there’s already a music=enemies game (Symphony), that I got from GoG a while back. I really like it, too, except that its bosses cheat, at least in the version I have. (The invulnerability powerup has no effect on hits from them. Oops.)

            Not *quite* the same thing, of course…

        2. giantraven says:

          This would be the most fantastic thing. There aren’t enough games with procedurally generated soundtracks. It’s one of the biggest, most interesting ideas that gaming has over soundtracks in other mediums.

        3. harborpirate says:

          I’d go with the following:

          Number of instruments playing = some combination of enemy count, enemy power level, and player health lost; with diminishing returns so the system isn’t trying to add 1300 instruments.

          You’d want instruments added in order from least to most frantic sounding.

          So, you’re starting out, a single baseline melody is playing (maybe even just a simple drum & bass).

          An enemy appears, and after a second or so, the tune gets a bit more complex.

          You get hit, it adds another part about a second afterwards.

          Pretty soon, you’re deep into the level, things are swarming around you, your health is getting low, and the music is just carrying on frantically with crazy harmonies, pounding drums, electric guitars, etc.

          I think that would nicely enhance how you already feel as a player. The mood of the music should end up pretty closely matching the mood of your situation. The more dire the situation, the more frantic the music.

          1. Paul Spooner says:

            Yeah, you’d have to do a bit of experimentation to see what works.
            Like Shamus was saying, you want to get as many input channels as possible, and the music is another way to do this, with proper hooks. Different instruments or melody segments could indicate different enemies, powerups, level geometry, etc.

            Another thing to play with is the instrument waveforms themselves. If it’s totally procedural then you should be able to layer the even harmonics (wind and string) for a soothing tone, or the odd harmonics (brass and bell) for the more tense moments. Harmonies and extra rythm complexity is basically the same thing on a macro-musical scale. Perhaps a fractal composition ruleset? So many options!

    2. aldowyn says:

      huh, that’s a really cool idea. You’d have to keep the layers fairly simple, I think… Hmm.

    3. Receiver actually did this quite well – it’s not super integrated into specifics of the game, either, so it doesn’t seem like it would take a massive amount of time.
      It also sounds a lot better because of it’s relative simplicity- it never draws attention to itself.
      The most important thing, though, is that type of enemy doesn’t affect it – it maintains the tension of uncertainty (that the game is focused on creating), but creates an adrenaline rush specifically designed – rather than the cacophony of several different types of enemy.

  19. Jamas Enright says:

    Question about the missiles that the other robots shoot at you: can they damage other robots?
    I can see that it could be fun to use the enemy missiles against them (reminiscent of big plane battles), but that might be a whole ‘nuther level of coding you don’t want to have to track.

    1. Shamus says:

      I’m considering it. Right now their missiles pass through each other.

      The thing is, late in the game you end up fighting big crowds of bad robots. I don’t want to have the ones in the back destroying the group with friendly fire. You’d end up with situations where they blew themselves up before you even began worrying about them.

      I’m not sure how avoiding friendly fire would impact the gameplay. It might be tricky to really get them out of each other’s way. And even if I did, it might make them fan out in ways that make missiles less satisfying to use.

      It’s on the list of stuff to play around with. We’ll see.

      1. Daemian Lucifer says:

        How about making friendly fire do a portion of damage(say 1/10 for lasers,1/2 for missiles).That way,being crowded by melee bots would give you some benefit,and they wouldnt get shredded fast in this manner.

      2. bucaneer says:

        Perhaps friendly fire for missiles could be turned on after a certain amount of time spent in flight – long enough that the player would have to worry about each one, but allowing for some offensive use of the ones that have already been successfully dodged. (Do enemies actively dodge missiles?)

      3. Ambitious Sloth says:

        Similar to bucaneer’s idea you could go with a timer that changes what the missiles do after a countdown finishes. Right now I assume that the missiles explode when they hit something. If the missiles primary purpose also causes friendly fire though it would make the bad robots seem dumb. They would act like less of a team and more just a horde of suicide bots just racing beat the other bad robots in a game of kill the player.

        Perhaps after a set amount of time the missiles self destruct on their own? And then that last attempt can be wild and uncontrolled enough to damage any other robots caught in the explosion. I think I remember hearing that old missiles/bombs/torpedoes worked by have a timer so they would explode while passing the enemy. But I don’t have time to go through old war documentaries to look for where I heard it. Either way, it could be fun to use the dodging skill as a way to essentially get free rockets that you can use against the robots themselves.

      4. Piflik says:

        Maybe when the missiles are close enough to the player they become neutral (infected by some computer virus or other thingamabob, doohickey or oojah). So the player can ‘catch’ missiles, like planets catch moons, and then use them against the bad guys, if they can fly well enough.

      5. Syal says:

        Just to add a counter-voice; I think the “friendly fire” feature would be better implemented in a game that didn’t feature player upgrades, and that the two conflict with each other tonally. It’s a tactical feature, and would be more in place in a Cave Story-type setup where weapons have tactical advantages over each other rather than being straight-up improvements.

        (That is, friendly fire implies “the right tool for the right job”-type play, while upgrades imply “all you have is a hammer”-type play.)

        1. I also want to add a counter voice – missiles seem like a more common occurrence in this game. Dealing with friendly fire, while it seems like a really simple task, would actually be one of the ones that take up a massive amount of time.
          It’s kind of the inverse of the worm-thing you talk about in this post – a bunch of simple changes make a massive difference, in this case an increase in complexity of how the missiles work and an incredible complexity in how the AI works (if you want them to actually react).
          Given the massive amounts of missiles we see regularly in the screen shots, I really don’t think that it’s worth the effort – especially since communicating exactly what has happened will also be a challenge.

      6. Mephane says:

        Another idea: how about some sort of missile guidance jammer either as an ability the player can activate (which has some kind of limitation, like a cooldown, needs its own type of ammo, or drains the player’s energy) or a temporary power up that can be collected, and for the time it is active, enemy missiles do friendly fire?

        1. This idea is quite good – it seems to be in the vein of “things that have simple rules, that could create emergent properties”, but also would be relatively easy to implement.
          It’d have to be experimented with, however.

        2. Aaron says:

          I pondered this and like the idea of having to choose between shields that block damage altogether, or a missile jammer that just removes their ability to lock onto you. Then you not only have new gameplay options, you have to choose between your desire to soak up damage via sheilds, or if you’re confident, dodge everything for a bit. I don’t know, probably not workable for various reasons, but it intrigues me.

      7. kdansky says:

        How about the missiles don’t start out as armed, and only get explosive once they get near the player. If they circle around and hit an enemy, you get friendly fire for being skilful. If the missiles just cruise towards you, they can’t hit other enemies.

      8. Andy L says:

        A compromise solution might be to have one type of enemy that does ridiculous damage, but can also hurt friendlies.

        Players would learn to direct the mega-bomb-bots back towards their fellows.

  20. atomf says:

    Just a suggestion…if dodging missiles is fun, and missiles tend to orbit you a bit, why not make them do damage to enemies? It might be interesting to slam missiles into enemies by maneuvering correctly.

  21. topazwolf says:

    So if theoretically, we wanted to drop a few sprites/artistic assets off here and there where would we do such a thing? Should we just bomb the comments, are you going to set up a thread in the forums, or do we email it to you?

    This is also relevant to music tracks (though I am practically tone deaf it does not apply to me). Just dropping links in the comments is great, but what happens in a few weeks when you accidentally delete the sound file and have to re-download it. Do you want to go spelunking through hundreds of comments over several post? Or would you rather delegate this organizational task to present Shamus so that future Shamus does not have to handle such mishaps.

    This could however be sidestepped by keeping records, but I am a fan of letting your loyal legion (what do you call your community? The twentsiders? The Legion of Dice? Shamians?) handle it rather than you having to keep records.

  22. Drew says:

    I wonder if it was annoying naming issues like your situation with the “flyer” above that led to us getting wonderful names like Tektites, Octoroks, Leevers and Stalfos. You can completely change the enemy’s look and behavior, and the name remains just as appropriate. And on a side note, it adds a tremendous amount of personality that would be lost with bland, descriptive enemy names.

    1. Mephane says:

      The names of objects within the program code need not match those that are displayed to the user.

  23. Joe Cool says:

    Ah, good ol’ Descent 1-1. Believe it or not, that level figures very prominently in my life story. It led to me dating the woman who would eventually become my wife.

    1. Hydralysk says:

      Glad to see Descent getting some love. Descent 1-2 were some of the first games I got as a kid, and my parents didn’t buy me many games. Descent 2 in particular holds a special place in my heart, to the point where I know the first 8 levels by heart. I still feel chills when this track comes on in my playlist.

  24. Cyprene says:

    I don’t know if it matters, but isn’t that worm enemy an awful lot like the one from Bleed? That was also a flyer that jumped in and out of the ground, and graphically it looks identical.

    I’m sure you’re not ripping them off, but it was weird enough I thought I should ask.

  25. Daemian Lucifer says:

    A nice solution for level cap is to give a fixed amount of skill points at the end of each level(or at certain checkpoints if levels are too big),which can then be spent on stuff.And if everything costs just 1 skill point to upgrade all the time,you wont have to worry about saving up for something cool later on.

    1. aldowyn says:

      I think he said 5-10 minutes, which is probably a little long for a game like this? *shrug*

  26. postinternetsyndrome says:

    Oh gosh the unreal soundtack is unreal. (It occurs to me that the DX soundtrack is quite similar.)

    The reason the old descent music sounded “midi-ish” is probably because it uses standard midi sounds! That’s easy to avoid. :)

    1. StashAugustine says:

      Deus Ex and Unreal had the same composer. Never played Unreal, but the soundtrack to Deus Ex is one of my favorites.

      1. Bryan says:

        Yeah, when I finally played through DX, I really liked the soundtrack on the NYC level. A bit later I realized *why* — it sounded a lot like a couple of the Unreal levels’ soundtracks.

        GoG also provides the DX soundtrack, and from there I was able to find the composer (Alexander Brandon IIRC) — a bit of wikipedia’ing revealed that he did Unreal as well, and everything suddenly clicked.

        Unreal is one of those games that I *still* replay parts of every so often. Fond memories of the first time I played the level where the first Titan shows up, too. It was a “HOLY CRAP WHAT IS THAT THING?!” sort of moment, followed by “so… uh… *HOW* am I supposed to kill it exactly? AAAAH, INCOMING ROCKS, OW!”. :-)


    2. James Schend says:

      The first (DOS) release of Descent literally was using MIDI music.

      The later CD releases (For Mac, and the second PC version that ran in Windows 95) had the music tracks on the CD, so they sounded much better. But the CD tracks were just made by running the original MIDI tracks through a really good synth.

      1. ancestral says:


        The Redbook audio was not a result of simply just running the MIDI through better synth. Certainly, elements were borrowed and mixed, but there were artists and musicians involved, using samples and live instruments. Just listen to the guitars in this track. That's definitely not output straight from MIDI.

  27. Eldiran says:

    As an aside to the mention of Jamendo, I have a question to all the musicians on here: how does Jamendo work exactly? It seems as if you’re supposed to ‘buy’ music from Jamendo regardless of license, but how does that work with some of the songs I see on there being marked as Creative Commons, even for commercial use? (Like this: )

    Does that mean you still have to pay Jamendo for music marked with the above license?

    1. For personal use (i.e. just listening to it as music in your playlists), you just find what you are looking for on jamendo and download it. However, if you want to use it commercial, you pay for the royalty free licence (or something, they might have renamed it) and use it.
      I have no idea how this works for the creative commons songs that are also allowed for commercial use – I presume you can just use those (as they are still entirely owned by the creators), but if you want to use others, you pay.
      But that’s just a guess.

      1. Eldiran says:

        Unfortunately I was hopin’ to use some commercially. Thanks for the guess though; sounds like we came to the same conclusions.

  28. Heaven Smile says:

    Well, Decent music feel different depending on the music card you selected (remember those times where you have to test the sound and music?). Examples:

    Descent music – Level 1 (PC-AdLib) (OPL3)
    Though the description box says: “Recorded from a Sound Blaster 16 CT1740.”

    Same music but on MIDI:


    If you are going to reference the music of Unreal, you may as well mention the composer Alexander Brandon. He made the music for Deus Ex, Jazz Jackrabbit and Tyrian, a vertical shoot em up that you may want to take notes from if you desire. But what stands out is the music he decided to go with the game. The music is so cool that even the act of buying and selling stuff feels like the most important decision in your life:–Ny9Y

    Or you know, you could just use ambient noise ala Super Metroid to set the atmosphere of a living world that its out to get you:

    Super Metroid – Lower Brinstar (Underground Depths)

    1. postinternetsyndrome says:

      JazzJackrabbit is my childhood… Awesome music.

      1. Heaven Smile says:

        Here is your childhood in 3:40 minutes.

    2. ancestral says:

      And it sounds (arguably) even better when you have the Redbook audio CD version. I had this glorious music to listen to when I was playing Descent for the first time.

    3. ancestral says:

      Supposedly, the MIDI was recorded with a Roland SC-55, so one could consider it to be the “true” way it was intended to be heard. (See: and

  29. BeamSplashX says:

    Despite writing music for 9 years, somehow the most appropriate thing I have is this downtempo thing I wrote during my shaky high school days. In any case, I hope you can find a use for it.

  30. The Rocketeer says:

    I suppose if you decide to change the way missiles gather and circle around the player, you could make missiles begin a short countdown to detonation once they’ve passed within a certain distance of the player.

    This is slightly closer to how real missiles work, which I am both eager and hesitant to explain in unsparing detail. Ugh, a chance to use my career skills, wasted.

  31. Kevin C. says:

    You make mention of “not having any tech problems.”

    ARE YOU NUTS???? You just invited Murphy to the party!


    Seriously, I hope you have a few backups of this at different locations. This is looking too cool to let a tech problem destroy it.

  32. Jeff says:

    If you called your character levels “Ranks”, you’d be able to apply witty rank names when they leveled up.

  33. MadTinkerer says:

    “Originally you were going to buy upgrades in this game. Monsters would drop coins, and when you reached a shop you would pay for upgrades.”

    Do a Miyamoto: coins can pay for temporary buffs, heals, monster debuffs, “Metroid missile” weapons that are more powerful but in limited supply, TF2 style keys, etc. Maybe these aren’t even “bought” in “shops” but manufactured by Futuristic 3D Printers (“Synthesizers”) from scrap you collect. You then have control over how much currency per enemy, how much currency the player can hold at once, which items the shops have / items the synths can create, where those shops are, etc.

    Oh dear, you need a Large Key to open this door. What? You can’t find a Large Key? Go see if the synth over there has the recipe!

    And speaking of recipes, maybe you can hack synths to add recipes you find along the way, et cetera and so on…

    1. MrGuy says:

      And if you’re really good at Pipe Dream, you can get everything for a slight discount!

  34. Chris says:

    If your editor/IDE doesn’t support automatic renaming, statically-typed languages can still help accomplish renames by employing the compiler for the task. Assuming you can currently perform an error-free compile: do a full clean of your build, rename whatever it is you’re renaming where it’s declared (i.e. header file), then do your build. All the locations requiring a rename will be marked as compile errors. If your editor/IDE has a decent keyboard macro system you can probably use it to automatically step through each of the errors and perform the rename.

    There are a handful of situations that this could miss — like when identifiers are being aliased — so it’s something like a 99% solution.

    1. Paul Spooner says:

      Awesome idea. Why didn’t I think of this? Induce intentional compile-time errors as a refactoring ploy! Brilliant.

  35. Richard says:

    Seeing as you mentioned it, Qt Creator is just a C++ IDE.

    Personally, ever since they added the ‘split as new window’ feature (the one thing I’ve been waiting for since dot), I’m utterly sold on it as the best C++ IDE there is.

    You don’t have to use it with the Qt libraries at all if you don’t want to – the only key features it gives you when used with Qt are the context-sensitive help on Qt classes and methods and QObject-based code generation. Neither of which are a big deal.

    Just treat the .pro as an IDE-specific project file, no different to a .vcproj or .sln

    Incidentally, QString is natively unicode, and QObject provides for translation from the beginning (along with a macro you can set to *force* everything to be translatable so you don’t miss anything), which means that my software is actually translatable without me having to do anything at all – other than an UI to pick a non-default translation and obviously the actual translation itself.

    All of which kinda made me go ‘hmm’ when you mentioned that – because as far as I’m concerned, it all came free with my preferred toolkit.

    Obviously all this comes at a cost – turning unicode into arbitrary font glyphs into renderable bitmaps is expensive, compared to turning Latin1 into a single font’s renderable bitmap.

    – Partly because Unicode means you simply cannot assume any given codepoint & font always has the same bitmap output, but also because modern fonts are actually procedural image generators – rather like your map generator – and so you’re dependent on the speed of the font as well as the application itself!

    Of course, caching a bitmap for each piece of text (not character!!) is an obvious speedup – and for a game like this, it may well make perfect sense to go so far as to actually store each piece of text as an actual bitmap.

  36. Fawstoar says:

    Commenting to mention that I’m currently finishing up another track for the game. It’s a little slower; might work better for a main menu theme? Link to the current version is in the comment name.

    EDIT: Whoops, link seems to be broken. Here’s the correct one:

  37. RCN says:

    Ok, just for fun and the heck of it, I devised some kind of possible progression for the skills and level ups. You said you wanted every level to feel like a great change, so that’s what I did. I tried to make it so that every choice is a valid choice for maxing out first and ignoring the rest. Probably the numbers are all out of whack (and probably it should cost 2 points only for the last upgrade), since I don’t really have any idea of how the variable are inside your game. What I went was fun bonuses and extras with every level, a bit like the best flash-based Tower Defense games out there (Kingdom Rush and Cursed Crystals, I believe). No need to test them, or even regard them. Like I said it was a fun exercise for me. I’m doing something similar towards Might and Magic IX. Like I said, this is FUN for me. Anyway…

    Power –

    0 – Initial shot damage. Does 10 damage, costs 2 energy.
    1 – 15 damage for 3 energy.
    2 – 20 damage for 4 energy. Every successive shot on the same target does 1 extra damage up to 10 extra damage.
    3 – 30 damage for 8 energy. When destroying an enemy with the energy blast, it overcharges doing 20 damage in a small area around the target (lets say 20 units)
    4 – 40 damage for 12 energy. Shot explodes in an energy blast doing its damage in a small radius (10 units)
    5 – 60 damage for 16 energy. Shot pierces its target and goes a little further, possibly causing damage to another enemy for 50% damage.
    6 – 80 damage for 20 energy. Shot does 5 extra damage with each successive shot for up to 50 extra damage.
    7 – 120 damage for 25 energy. If target is killed by the energy blast it feeds on the enemy’s power source to split into two shots for 100% damage on possible secondary targets. Target blast does 100 damage on 50 units around it.
    8 – 160 damage for 30 energy. Shot pierces its target and keeps going unhindered. Can pierce up to 3 targets. Full damage on secondary targets.
    9 – 240 damage for 40 energy. Each successive shot on the same target does 20 extra damage, up to 200 extra damage per shot.
    10 – 400 damage for 50 energy. When an enemy is destroyed by the blasts it explodes for 500 damage on 100 units around it. Also it splits into 3 shots and pierces up to 5 targets.

    Fire-rate –

    0 – Initial rate of fire. Shoots once every .5 seconds.
    1 – Keep rate of fire, but now if you just tap the fire button you do a burst of 3 consecutive shots. You can only tap once every second. The burst only costs twice the energy of a normal shot. Holding the fire button shoots normaly.
    2 – Shoots once every .33 seconds. You can tap for burst every .66 seconds. When you kill an enemy you assimilate its gun for a short frenzy to get 20% rate-of-fire bonus for 2 seconds.
    3 – Shoots every .25 seconds. Burst fire every .5 seconds.
    4 – You get a secondary turret that shoots from the same origin as your original weapon. The secondary turret shoots inaccurately around your line of fire for 50% the normal damage and 50% the normal energy.
    5 – Shoots every .20 seconds. Burst fire now shoots 4 times for 2.5 times the energy. The frenzy now gets you a 25% rate-of-fire bonus for 3 seconds, if you kill another enemy during this time you get another 10% rate-of-fire, but the timing doesn’t reset.
    6 – You get a tertiary turret that shoots even less accurate for 33% damage and 33% of the energy. Secondary turret does 66% damage.
    7 – Shoots every .15 seconds, burst fire every .35 seconds. The frenzy is now a 35% rate-of-fire bonus for 4 seconds, getting another 15% and 5% if you kill more enemies, but the duration doesn’t reset.
    8 – You get a quaternary turret that sprays all around your line of fire for 25% damage and 25% of the energy. The tertiary turret does 40% damage and the secondary does 75% damage.
    9 – Shoots every .10 seconds, burst fire every .25 seconds. The frenzy is now a 50% rate-of-fire bonus for 5 seconds, getting another 25%, 15% and 10% if you kill more enemies, but the duration doesn’t reset.
    10 – You get a girating turret that shoots randomly in every direction for 50% damage and 25% of the energy. Burst fire now shoots five times for 3 times the energy. The frenzy doesn’t get better, but now its duration increases by .5 seconds for every extra kill, possibly being maintained indefinitely. The secondary turret does 80% damage, the tertiary does 60% damage and the quaternary does 40% damage.

    Energy –

    0 – Initial energy supply. 50 energy, 1 energy recovery per second.
    1 – 75 energy, 2 energy per second.
    2 – 100 energy, 3 energy per second. When you kill an enemy you get 10 energy.
    3 – 150 energy, 5 energy per second. When you are hit, you get 1 energy for every 5 damage (even damage absorbed by the shields count).
    4 – 200 energy, 7 energy per second. When you kill an enemy you get 20 energy. You do extra damage with your shots equal to 5% of your current energy.
    5 – 300 energy, 10 energy per second. Whenever you are hit, you get 1 energy for every 3 damage. When your energy is spent to less than 5% it releases the excess heat for 200 damage in a large area (500 units) around you. This can happen once every 10 seconds.
    6 – 400 energy, 13 energy per second. When you kill an enemy you get 35 energy. Every missile you shoot and hits a target leeches energy for you, recovering 50 energy.
    7 – 600 energy, 16 energy per second. You do 10% of your current energy as extra damage for your shots. You do 400 damage when your energy depletes.
    8 – 800 energy, 20 energy per second. When you kill an enemy, you get 50 energy and 10% extra energy recovery for 5 seconds, up to 50%, resetting the timing for every kill.
    9 – 1100 energy, 24 energy per second. If you get out of shields, you go into engine re-route mode, you start taking damage in your energy instead of being killed. You do not get any damage reduction your shields might have. You can’t absorb damage as energy in this mode.
    10 – 1500 energy, 30 energy per second. You do 15% of your current energy as extra damage per shot. You get one shield for every 2 damage you take and the energy recovery for killing an enemy can get to 100%. You get 75 energy per kill and your missiles leech 50 energy PER enemy damaged. You do 1000 damage when the energy is depleted.

    Movement –

    0 – Initial movement. Let’s estipulate an arbitrary 100 units of movement per second, two seconds to accelerate.
    1 – 110 units of movement per second, it takes 1.5 seconds to accelerate.
    2 – 120 units of movement per second, if you tap twice in a single direction you make a small dash up to the distance you’d go in .5 seconds almost instantly, you can only dash every three seconds.
    3 – 130 units of movement per second, if you tap twice in opposite directions you make a small reversal dash on the last direction tapped for the distance you’d go in 1 second. You can do this reverse every five seconds.
    4 – 140 units of movement per second. The dash and reversal also slows time by 20% for 1 second after being performed, giving you more time to react.
    5 – 150 units of movement per second. The dash and reversal also misdirects missiles, making them lose your track and trying to track a close-by enemy. If it doesn’t hit a target in 1 second, it realigns itself and darts for you again.
    6 – 170 units of movement per second. The dash can by done every 2 seconds and the reversal can be done every 3 seconds, the slowdown is now 30%.
    7 – 190 units of movement per second. The missile misdirect now makes missiles track enemies for 3 seconds.
    8 – 210 units of movement per second. It takes 1 second to accelerate and when you do a dash or reversal you become invisible for half a second, with most enemies incapable of reacquiring you inside this window. The slowdown is now 40%.
    9 – 230 units of movement per second. When you do a dash or reversal you actually teleports the small distance, leaving a ghost behind you for 1 second that will still attract fire (though missiles are still misdirected). During the teleport you’re invincible.
    10 – 250 units of movement per second. The slowdown is now 50% and you can do a dash every 1.5 seconds and a reversal every 2 seconds, effectively keeping ghosts and the slowdown permanently if you can string them, with a very small window during which any enemy can hit you.

    Shield –

    0 – Initial shields. 100 points, no inerent recharge, only recharging with pickups.
    1 – 150 shield points, recharge at the rate of 1 per second.
    2 – 200 shield points. When you kill an enemy you recover 5 shields.
    3 – 300 shield points. You ignore the first 5 points of damage of any attacks, attacks that do 5 or less damage are ignored by your shields. (Continual attacks like a flamethrower or a saw-blade only have the first 5 damage of the attack absorbed).
    4 – 400 shield points. Recharge rate of 5 points per second. You also recover 1 shield every time you attack.
    5 – 600 shield points. When you kill and enemy you recover 30 shields. If a missile hits you it damages you normally, but also damages every enemy missile in a moderate radius around you, possibly destroying them harmlessly (150 units).
    6 – 800 shield points. The shields ignore the first 10 points of damage of any source. Every consecutive hit that still damages you increases this reduction by 1, up to 25 points of reduction. This lasts for 20 seconds and is renewed every time you’re damaged.
    7 – 1200 shield points. You recover 20 points per second. You also recover 5 shield points every time you attack. Your missiles are themselves shielded with 100 shield.
    8 – 1600 shield points. When you kill an enemy you recover 100 shields. Missiles hitting you detonate and damage enemies and missiles in a moderate area around you (250 units) for 50% of their damage. If your energy runs out you can still you go into shield re-route mode, spending shields to shoot. You spend 3 times more shields than energy per shot and it isn’t mitigated by the damage reduction. You go out of the reroute mode and start shooting only with the energy you have if you release the shoot button and press it again, or do a burst shot.
    9 – 2000 shield points. The shields ignore the first 30 points of damage of any source. Every consecutive hit that still damages you increases this reduction by 3, up to 75 points of reduction. This bonus still lasts for 20 seconds.
    10 – 3000 shield points. The shields ignore the first 50 points of damage and 5 extra damage for every consecutive damaging hit, up to 150 damage reduction. Missiles detonate for 100% damage on every enemy and missile around you (250 units). You recover 50 shields per second and recover 200 shields every time you kill an enemy unit. Every shot recover 10 shields. Your missiles have 200 shields.

    Missiles –

    0 – Initial missile status. 50 damage, 20 units of blast area (lets say enough to hit two enemies if they’re very close), 50% damage on other enemies inside blast, 4 missiles, missiles about as fast as your own robot (100 units). Five seconds to rearm.
    1 – 75 damage, 30 units of blast area, 6 missile capacity.
    2 – 100 damage, 40 units of blast area, missiles twice as fast as your initial speed (200 units). If you destroy two or more enemies with a missile you get 1 missile.
    3 – 150 damage, 50 units of blast area. 70% damage to units inside blast, 10 missiles in capacity, missiles are homing.
    4 – 200 damage, 60 units of blast area. 3 seconds to rearm, initial target is damaged twice, once for the missile damage and then again by the blast radius.
    5 – 300 damage, 70 units of blast area. Missiles are three times as fast as your initial speed (300 units), when an unit is killed by a missile the blast is overcharged for 50% more area.
    6 – 400 damage, 80 units of blast area. When a missile gets past its target without hitting it it will detonate before leaving the blast range. 20 missiles in capacity.
    7 – 600 damage, 100 units of blast area. 100% damage to units inside blast. 1 second to rearm. If you destroy more than two enemies with a missile, you get one extra missiles for every square of 2 you destroy (+2 missiles for 4, +3 for 8, etc…)
    8 – 800 damage, 130 units of blast area. After hitting an enemy the missiles spawn 3 more small small missiles in the opposite direction that automatically acquire targets. Each spawned missile does 25% of the original’s damage and have no blast radius.
    9 – 1100 damage, 160 units of blast area. The missile is four times faster than your initial speed (400 units) and if it destroys an enemy it overcharges to increase the blast radius by 100%. You can shoot every .5 seconds and keep 40 missiles in capacity.
    10 – 1500 damage, 200 units of blast area. The missile is five times fast than your initial speed (500) and spawns 5 extra missiles if it hits, each one doing 30% of the original’s damage and exploding a small area (50 units). You can keep 60 missiles and if you hold the missile buttom you spray 10 missiles in front of you, each acquiring targets. 120% damage to units inside blast.

  38. RCN says:

    Hmm… did my post got bugged out or was it deleted? I mean, if there was some kind of notification, I’d know… just wondering. Was there any point you asked not to intrude into your process? If so, I apologize.

  39. I’ve gone for a techno retro electro feel with my musical contribution, knocked up today for your edification. Well done to all the other musicians, by the way; I’ve enjoyed what you’ve made!

    I’ve called it Bad Robot for some reason. Here it is!

    1. Shamus says:


      Okay, I should probably formalize this somehow. I need to be able to match track names to artist names for in the credits. I’ll do a follow-up post on this next week.

      1. Paul Spooner says:

        It’s confirmed folks! There will be credits in the game!

        Wait, maybe they will just be printed in the paper booklet that comes in the box. Sorry everybody! False alarm.

  40. Argh – double post! (Joins mosh pit for future music entries.)

  41. LazerBlade says:

    Here are a couple of tracks I put together as potential soundtrack pieces:

    There are HQ mp3 download links in the video description. You (Shamus Young) may use them under this license I just made up: You can redistribute and modify them in any way you see fit, provided you both credit the original author (John Serafino) and drop him an e-mail or reply noting that you intend to use them.

    If you need them to loop any particular way that editing raw sound waves can’t do well, I can modify the originals myself.

    The above license also applies to the following three tracks I made before this project, but which may still be of interest to you:
    however, I cannot modify the originals, as the source materials have been lost. There are still download links in the descriptions though.

  42. Tom H says:

    Hey Shamus – Not sure if you’re still looking for music, but here are a few tracks that may find some use for you. They’re about the best I could guess from the examples of Descent and Unreal. Hope it helps.

    Auvto (Slinker)
    Deus Ex (1&2)
    That’s the Flavor
    Emdrive Plaid
    Methylbenzene (1-octen-2-one)
    Speedhop Karate Chop
    Bit 11
    Hat Trick (17×22)

    Feel free to use these however you’d like etc, etc. If you’d like any of them in higher quality .aif files or higher bitrate mp3’s just send an email.

    And good luck on Project Good Robot!

  43. ZzzzSleep says:

    Hey Shamus,

    There’s an interesting link over at Man Fight Dragon about the assorted different store options available to indie game devs. It can be found at

  44. LazerBlade says:

    Are you still collecting music for this? If so, I’ve recently been working on a track I realized would work pretty well for a boss fight theme in a 2d shooter. It’s not setup to be loop friendly, but I can kick out a slightly extended version with a bit more content and make it loop friendly in a snap since it’s just a quick experiment right now.

Thanks for joining the discussion. Be nice, don't post angry, and enjoy yourself. This is supposed to be fun. Your email address will not be published. Required fields are marked*

You can enclose spoilers in <strike> tags like so:
<strike>Darth Vader is Luke's father!</strike>

You can make things italics like this:
Can you imagine having Darth Vader as your <i>father</i>?

You can make things bold like this:
I'm <b>very</b> glad Darth Vader isn't my father.

You can make links like this:
I'm reading about <a href="">Darth Vader</a> on Wikipedia!

You can quote someone like this:
Darth Vader said <blockquote>Luke, I am your father.</blockquote>

Leave a Reply

Your email address will not be published.