var Bomb = Entity.extend({

	// constructor
	initialize: function() {

		// super()
		Entity.prototype.initialize.apply(this, arguments);

		// properties
		extend(this, {
			direction: Math.random() * twopi,
			distance: .75,
			orbit: (random(0, BOMB_ORBIT_LIKELIHOOD) === 0),
			speed: Bomb.speed
		});

		// bloop!
		var fromFreq = random(200, 400);
		Sound.play({
			type: random(0, 1) * 4,
			from: fromFreq,
			to: fromFreq + random(200, 300),
			duration: 150
		});

	},

	// each tick
	update: function(dt) {

		// move me
		this.distance -= (this.speed * dt);
		if (this.orbit) {
			this.direction = (this.direction - (BOMB_ORBIT_SPEED * dt)) % twopi;
		}

		// we'll decide whether I should be destroyed
		var destroyMe = false;

		// if I'm in the heart...
		if (this.distance < 0) {
			shield.health -= BOMB_DAMAGE;
			destroyMe = true;
			Sound.play(BOOM_DATA);
			pool.add(new Message('AW SHIT', '255, 0, 0'));
			shield.combo = 0;
		}

		// if I hit the shield...
		else if ((Math.abs(this.distance - shield.radius) < BOMB_RADIUS) && (shield.health > 0)) {
			var normalized = this.direction + shield.direction;
			while (normalized < 0) {
				normalized += twopi;
			}
			normalized %= (twopi / shield.holes);
			destroyMe = normalized > (twopi * shield.holePercentage / shield.holes);
			if (destroyMe) {
				Sound.play({
					type: random(0, 1) * 4,
					from: random(900, 1000),
					to: random(1200, 1300),
					duration: 150
				});
				shield.combo ++;
				if ((shield.combo % 3) === 0) {
					pool.add(new Message(shield.combo + ' COMBO', '255, 0, 255'));
				}
			}
		}

		// should I be destroyed?
		if (destroyMe) {
			this.destroy();
			if (shield.health > 0) {
				points += 1;
			}
		}

	},

	// draw me
	draw: function(context) {

		var particleSize = BOMB_RADIUS * screenSize;

		var x = centerX + (Math.cos(this.direction) * (this.distance * screenSize))
		var y = centerY - (Math.sin(this.direction) * (this.distance * screenSize))

		var color = randomColor();
		context.outline({
			fillColor: color,
			shadowColor: color,
			shadowBlur: particleSize * 1.5,
			path: function(context) {
				context.arc(x, y, particleSize, 0, twopi, false);
			}
		});

	}

});

Bomb.speed = BOMB_INITIAL_SPEED;

@@ -318,127 +318,54 @@
 !%0A%09%09
-var fromFreq = random(200, 400);%0A%09%09Sound.play(%7B%0A%09%09%09type: random(0, 1) * 4,%0A%09%09%09from: fromFreq,%0A%09%09%09to: fromFreq +
+Sound.play(%7B%0A%09%09%09type: 'sine',%0A%09%09%09from:
  random(
 200,
@@ -364,19 +364,30 @@
 dom(
-2
+5
 00, 
-3
+20
 00),%0A
+%09%09%09to: 1,%0A
 %09%09%09d
@@ -391,26 +391,26 @@
 %09%09duration: 
-15
+30
 0%0A%09%09%7D);%0A%0A%09%7D,
@@ -1250,24 +1250,150 @@
 estroyMe) %7B%0A
+%09%09%09%09shield.combo ++;%0A%09%09%09%09if ((shield.combo %25 3) === 0) %7B%0A%09%09%09%09%09pool.add(new Message(shield.combo + ' COMBO', '200, 0, 200'));%0A%09
 %09%09%09%09Sound.pl
@@ -1406,32 +1406,28 @@
 %09%09%09%09
+%09
 type: 
-random(0, 1) * 4
+'triangle'
 ,%0A
+%09
 %09%09%09%09
@@ -1437,27 +1437,12 @@
 om: 
-random(900, 1000)
+1
 ,%0A
+%09
 %09%09%09%09
@@ -1450,33 +1450,20 @@
 to: 
-random(1200, 1300)
+1200
 ,%0A%09%09%09%09%09
+%09
 dura
@@ -1472,24 +1472,25 @@
 on: 
-1
 5
+0
 0%0A%09%09%09%09
+%09
 %7D);%0A%09%09%09%09
 shie
@@ -1489,126 +1489,116 @@
 %09%09%09%09
-shield.combo ++;%0A%09%09%09%09if ((shield.combo %25 3) === 0) %7B%0A%09%09%09%09%09pool.add(new Message(shield.combo + ' COMBO', '255, 0, 255')
+%7D else %7B%0A%09%09%09%09%09Sound.play(%7B%0A%09%09%09%09%09%09type: 'triangle',%0A%09%09%09%09%09%09from: 1,%0A%09%09%09%09%09%09to: 1200,%0A%09%09%09%09%09%09duration: 100%0A%09%09%09%09%09%7D
 );%0A%09

change some bomb sounds