KISH: the evolution of a sketch
Kish is a 2D fast action arcade-style "strategic collecting" game, with creatures called "Pulsers" that express emotions according to player's actions. The player's goal is to increase their total score by collecting Pulsers and depositing them in a "basket." The player moves the Pulsers by using an avatar that can attract and repel (pull and push) the Pulsers.
On the technical side, I'm using Processing to create the game, leveraging the Traer physics library, the Ess sound library, the proCONTROLL joystick library, and a beat detection class that I wrote to work with Ess. Despite being developed to be played with a PS2 controller, you will not be able to use one with any of these versions because it doesn't work over the web. The "pulsers" mentioned up above are spawned by the beat of the music and continue to pulse with the beat that spawned them. There are three types: kick, snare, and hi-hat pulsers. The movement of the pulsers is controlled by a particle system, the only animation involved is the pulsing and the "rays" of the push/pull force in later versions. I suppose this is where I should throw in that handy buzzword: procedural. Oh, and here's another one: emergent gameplay.
So, without furthur ado, here are some links for you to click on:
Ha, fooled you, that one's not a link. v0.1 used Sonia as its audio library but that requires installing a browser plugin, so I've not uploaded it because people just can't be bothered to do such things. You can just play with v0.2, which uses Ess and looks pretty much exactly the same.
KISH v0.2 [07-27-06]
v0.2 features four circular pulsers of different sizes and one blue square. It loads an mp3 file for music, so you don't have to feed it your own. This version is pre-physics and the pulsers don't move until you go collect them by using the arrow keys to move the little blue square close to them. The collected pulser then starts following the square around, doing a jiggly little dance that, while adorable, is not the kind of behaviour one expects from a polished game. This version is also pre-beat detection. The pulsing is being triggered by the music, but in a very naive way, so it just looks kind of random.
KISH v0.3 [09-03-06]
v0.3 introduces the particle system and the smooth() function. When you collect a pulser it attaches itself to you with a slightly elastic spring, making for very fluid movement. I also put in collision detection so that the pulsers bounce off of each other and the walls. Aside from the fact that the control is jerky, it's pretty fun to play with.
KISH v0.4 [09-17-06]v0.4 features proper beat detection and spawning of three different types of pulsers. The pulsers age out if you don't collect them so that the screen doesn't become hella crowded. The pulsers attach themselves in a line instead of all attaching to the player, so you can make a big long tail that follows along behind you. It's a little problematic because when the tail gets really long it becomes easily tangled up with itself and the uncollected pulsers, sometimes causing it to break. Keyboard control is still jerky because it is left over from pre-joystick versions and I couldn't be bothered to fix it when the Dual Shock on my desk works just fine.
KISH v0.5 [09-17-06]
v0.5 introduces gameplay devised by Fish. Unfortunately, because it relies on using an analog stick, you won't be able to see it. Which is a shame because I spent a long ass time staring a my poorly drawn geometric sketches trying to figure out how to do it. I had to map direction and magnitude to an arc on a circle. Then I had to figure out how to tell if a pulser was inside of that arc. Well, they both turned out to be rather simple calculations, but the path to enlightenment was fraught with many visits to trigonometry lessons long left behind me! Martyrdom aside, this version also introduces the visual style of the game. The render mode in this version is P3D, which doesn't support smoothing, so it won't look as nice as v0.4. However, the glow effect, at least as I am programming it, is too expensive for the default JAVA2D render engine and framerate goes down the shitter. Keyboard control has been smoothed. Use 'a' and 's' for push and pull forces. Also, you need to feed this version audio so that it can spawn pulsers. You can do this by setting the record source of your soundcard to "line in" and plugging your iPod or CD player into the line-in jack (don't forget to press play), or you can set it to "stereo mix" or the like and simply play mp3s in your player of choice. Because it's a web applet trying to access your line-in, you'll have to accept my self-signed security certificate for the sketch to run. Please trust me.
KISH v0.55 [09-18-06]
Still only one facial expression, but now all the pulsers look in the direction of the player. Also changed the size of the viewport to 1024x768 because that is the resolution that the game will be projected at in November. Tweaked the glow effect yet again in a bid for improved performance.
KISH v0.6 [09-19-06]
Previously, the sucking force was created using an Attraction in the physics system. This version swaps that out for a Spring which means that once you suck up a pulser you won't lose it until you let it go. A nice side-effect of this is that I balanced the strength of the spring with the strength of the blowing force so that when you use both of them the collected pulsers stick at the perimeter of the force. The directional force control has been removed, not that you were ever able to see how that worked. The looking has been changed so that now the pulsers only look at you when you are within 200 pixels of their location. The glow is still pissing me off, but I promised to stop talking about that.
KISH v0.6s [09-21-06]
Fish came up with some more complicated artwork which got me thinking that maybe I wanted to use sprites instead of having to figure out how to draw everything using vertex lists. So I had him make me a PNG of a pulser and stuck it into v0.6. The result is not very pretty and also runs rather slowly. So pretty much I've scrapped that idea. But, hey, you still get to look at it!
KISH v0.7 [09-21-06]
Wuh-hay, it's a game! The pulsers no longer age out, they simply stop spawning when a preset total is reached. The player has been changed to an unfilled yellow circle and the suck/blow forces are now animated. The coolness of the animation is due entirely to an awesome suggestion I stumbled upon in the Processing forums while reading old-ass threads. The poster mentioned that rather than setting the background to a solid color every frame to clear the viewport, they were blending frames by drawing a semi-transparent rectangle over the entire viewport. Basically this makes everything ghost. This is great because it means I don't have to manage a list of past locations and radii for each pulser and it costs absolutely nothing to use the effect. How clever! Nests, or goals if you like, have been added that randomly appear and are randomly assigned one of the three pulser colors. The point of the game is to get pulsers into their respective nests. I even keep track of how many you "save" so that you can have the neighborhood bragging rights. There's currently no time-limit so your ability to be the braggart pretty much depends on how long you are willing to play the game for.
KISH v0.8 [10-01-06]
Lots of new stuff. Emotions for the Pulsers have been implemented. The two bad guys have been implemented. Now there are seek-and-destroy Deathskull guys and stationary Sucker/Blower guys. You can kill them by bouncing Pulsers off of them. The Nests look a little different now and actually catch the Pulsers so that once they enter a Nest they don't leave. The Pulser sticks around for a brief amount of time showing you its GLEE face and then explodes. When Pulsers are destroyed, either by a Nest or by an enemy, they display a point amount and that amount gets added to your score. We haven't worked out a scoring system yet so you just get points for putting a Pulser in a Nest and lose points when one gets killed by an enemy. I ditched my poorly written PulserList ADT and started using the Vector class. It is super handy. Also, I've started developing in OPENGL mode because that is what we will show the games with. However, I can't seem to get an OpenGL applet working so this export is in P3D. That means it will likely run slow on a lot of machines. I hope to get the OpenGL issue sorted out for the next version.
KISH v0.85 [10-06-06]
Incrementing the version number by only .05 is a little misleading. By all rights this should be version 0.9 but I'm trying to pace myself so version 1.0 is the finished game. However, this will probably result in versions 0.91 thru 0.999 or something obnoxious like that. Anyhow, it's my numbering system and I'll do what I like with it!
So, onto the new stuff. The player now collides with the enemies and can move them ever so slightly with suck/blow. The blow force now works by a single button push generating a single wave. So you can't hold down the button for continuous blowing. Additionally, the pulsers collide with the actual location of the wave instead of with a fixed force radius. You can no longer damage enemies with the pulsers while they are attached to you. You must shoot them at an enemy or wait until they become VORACIOUS (it's a mean little face they get after being collected for a short amount of time) and then release them within range of an enemy. When you do this they will fly at the enemy and bash their little selves into it until it dies. It's really pretty amusing. There is now art for the nests! Nests sometimes show a preference with a thought bubble and you get twice as many points for bringing them pulsers of the kind they are thinking of. I'm not sold on the thought bubble thing, though, so we might indicate their preference a different way. The Sucker/Blowers now generate their blow waves the same way that the player does but using the beat as a trigger. Like the player's blow waves, the pulsers collide with where the outermost wave actually is, rather than a fixed radius.
I've implemented a play time limit. Now the game will start in "demo" mode, showing no score and not allowing you to control the player. To start the game you press the Start button on the controller (or any key on the keyboard). There is then a countdown and the game board clears and it displays a score. You have 5 minutes to collect pulsers, kill or avoid enemies. At the end of the time limit it displays your score and the number of pulsers saved in the middle of the screen, pauses for 5 seconds and then goes back into demo mode, continuing the game from where it was paused.
KISH v0.88 [10-13-06]
Yet more version numbering madness. Anyway, what do you care? So, let's see, lots of changes and some new stuff. Here, I will make a bulleted list for you:
- There's a new color scheme!
- There is only one nest.
- The nest indicates what kind of pulsers it wants by changing to that pulser type's color.
- The nest never appears on top of things, this solved the slightly annoying problem of the nest sometimes appearing directly over the player and picking up all the attached pulsers.
- The nest emits a colored ring in time with the beat. These rings persist even after the nest hides itself.
- There is a scoring system in place, including sexy graphical effects.
- The sucker/blower enemy has been split into two enemies: one always sucks, one always blows. They are now predictable, meaning they suck/blow for 5 seconds and then rest for 3.
- The sucker gets a spiky outline when sucking, making it look much more dangerous. This carried over to the shape of the suck wave, which is pretty cool.
- There are now bumpers. Currently three spawn right at the beginning of game and stay there the whole time. Eventually, they will be used as part of a special event, rather than always being preset.
- The skulls now propel themselves using addVelocity() instead of setVelocity(), which just makes their movements a little more smooth. It also makes it possible to bounce them off of the bumpers.
- We have a player Avatar!
- The player is now propelled using setVelocity(), rather than moveBy(), so that I can bounce the player off of the bumpers and the walls.
- The player's blow/suck forces have a very slight effect on the enemies.
- Picking up pulsers makes the player heavier, so the more pulsers you are carrying around the slower you will move. It also means you won't bounce as far off of the bumpers and walls. How realistic!
- Of course, the pulsers bounce off of the bumpers, as well.
- I fixed some collision code so that it works better. I don't think I've fixed all of it though. There's always room for improvement, dontcha know.
KISH v0.9 [10-24-06]
I really need to start keeping track of features as I add/change them because I'm sure there is stuff different between this version and the last that I'm not going to remember. The bulleted list seemed to work well last time. Let's do it again!
- The nest makes an "oh" face when there are pulsers in it.
- There's a little green pentagon dude that triggers special events when dragged into the nest.
- There are six special events, here are their names: Pulser Overload, Death Swarm, Skullzilla, Pinball, Super Suck, and Ultra Blow. I think the names are pretty self-explanatory.
- Fixed the rest of the collision code, in particular adjusted the way pulsers bounce off each other. The result is slightly less bouncy pulsers, but I think it's for the better.
- The bumpers have art!
- Most of the text has been replaced with glowing text images.
- Changed the skull's logic so that they don't become immobile when being attacked.
- When pulser's become angry they stay that way for about 3 seconds once the player releases them, rather than remaining angry for as long as they are moving.
- Probably some stuff I've forgotten about.
GLEE v1.0 [11-11-06]
And so we have come to the end of this version tracking adventure. GLEE, codenamed KISH, was presented at the SAT in Montréal on November 9, 2006 along with six other games by independent developers from Montréal, Toronto and Carnegie Mellon University. The following additions were seen in this version:
- A game counter is faintly displayed in the background.
- The pulsers change color when they become angry.
- The pulsers stay angry until attacking an enemy three times or being pulled into a nest.
- The enemies blink red when damaged.
- The pick-up guy now flashes like a star in Super Mario Bros. and when it is collected the name of the event triggered pops out of it and moves to the corner of the screen.
- The scoring system was tuned.
- The enemy hitpoints were tuned so that it's actually possibly to kill the enemies without using "enraged" pulsers.
- The game checks for a new version when it starts up.