I wasn’t planning on posting updates today, since real life problems and bad weather conspired to keep me down, but in retrospect the game has progressed noticeably anyway, even if it didn’t feel like that at first.
So, a week ago I announced my new game, a good old shoot’em up called Laser Sky simply because the name was available — as opposed to pretty much anything involving the word “neon”. (Do you know how hard it is to come up with original titles these days? RogueBot for instance is used by a whole bunch of other projects, from a variety of fields. Hopefully nobody sues.)
Anyway, at the time Laser Sky was just beginning to feel like a game, but still lacked variety. So one of the first things to add was power-ups. The first one restores lost energy, or else gives points if you’re topped up — power-ups should never become useless! The second gives you an extra gun (then a third in the tail, which was sorely needed), and after that it erases the heat build-up, that gets significant even though with two guns you fire more slowly. The whole thing took some balancing work, because more guns should be more powerful overall, but still come at a cost. With a bit of special-casing, and otherwise fewer changes than expected, that too worked out great. It requires a change in strategy that just makes sense, and feels satisfying. Not bad for just one addition!
It took some thinking, but the third power-up became a shield that, while active, absorbs half the damage you get. Initially it lasted until consumed, but that turned out to be a really long time whenever I happened to be on a roll and/or catch two of them in a row. So now shields also expire by themselves after a while — long enough so you don’t feel cheated, but short enough that you have to plan for it. Yet another gameplay element that’s helpful without breaking balance.
Another change entirely was the addition of one more enemy type, the sixth so far, and the last of those originally planned. This one also had to be special-cased, fortunately not too much. It also took a lot of tweaking, because at first it felt too weak, so I made it stronger, but since it’s also great at ramming you that made it too dangerous, even if it didn’t also shoot missiles, which it does. In the end I erred on the side of easy (a little, mind), because other players won’t be as intimately familiar with the game as its author. At least waves 11 and 12 are survivable with skill now, rather than just dumb luck or exceptional reflexes.
Speaking of which, a non-gameplay addition is continues — a necessity for testing the game as it gets longer: changing the code all the time to start in the middle not only gets old quick, but could make me forget how my audience experiences the game without having that luxury. For now continues are infinite, and don’t penalize you much; perhaps later there will be an option to limit or disable them, for gamers who want a bit of a challenge. Cheats would have been another option, but eh. They’re not as easy to implement, and they feel like a childish thing these days.
In the way of programming, it’s worth mentioning that sometime after adding the ability to space out enemies in a wave, the game began to stutter consistently, on two different browsers/engines. It seemed odd that a simple “if” statement could do that, but the rhythm of the stutter was telling. Either way, making sure the
GameWorld object now runs in strict mode, as well as replacing all instances of
!= in the code with
!== respectively, made the game run smoothly again, even on my elderly CPU. A hope for the future!
The next step will be to add sound effects, for which purpose I’m going to raid the same collection used in Attack Vector. Got an idea for how to get music, too. May or may not add a menu screen before release, but the first level should be complete in any event — twenty waves, or 6 minutes and change of play time. Then it will be a toss-up whether to add more levels or make a desktop edition for sale, and leave the HTML5 prototype as a demo. But first, to get some feedback. Stay tuned.