Frame 1
stop();
Frame 2
function trackMouseMovement() {
trackHeroPositionToMouse();
}
function trackMouseClick() {
shoot();
}
function mainLine() {
if (paused) {
return(undefined);
}
updateSimulation();
render();
}
function updateSimulation() {
updateHero();
updateBullets();
updateEnergy();
updateShield();
updateHull();
updateEnemies();
checkCollisions();
}
function render() {
renderHero();
renderBullets();
renderEnergy();
renderShield();
renderHull();
renderEnemies();
updateUi();
}
function checkCollisions() {
var _local7 = bullets.length - 1;
while (_local7 >= 0) {
var _local3 = bullets[_local7];
var _local9 = _local3[X_POSITION];
var _local8 = _local3[Y_POSITION];
var _local6 = false;
if (_local3[OWNER] == "hero") {
var _local1 = enemies.length - 1;
while (_local1 >= 0) {
var _local2 = enemies[_local1];
var _local5 = _local2[X_POSITION];
var _local4 = _local2[Y_POSITION];
var _local10 = distanceBetween2DPoints(_local9, _local8, _local5, _local4, false);
if (_local10 <= enemyCollisionDistance) {
_local6 = true;
deadEnemyCounter++;
enemies.splice(_local1, 1);
_local2[CLIP_HANDLE].removeMovieClip();
break;
}
_local1--;
}
} else if (_local3[OWNER] == "enemy") {
var _local10 = distanceBetween2DPoints(_local9, _local8, heroXPosition, heroYPosition, false);
if (_local10 <= heroCollisionDistance) {
_local6 = true;
shield = shield - shieldDamagePerHit;
if (shield < minShield) {
hull = hull - (minShield - shield);
if (hull < minHull) {
hull = minHull;
}
shield = minShield;
}
}
}
if (_local6) {
bullets.splice(_local7, 1);
_local3[CLIP_HANDLE].removeMovieClip();
bulletHits++;
}
_local7--;
}
}
function updateUi() {
scoreText.text = deadEnemyCounter * 10;
livesText.text = lives;
}
function toggleFiringMode() {
if (firingMode == SINGLE_FIRE) {
firingMode = DUAL_FIRE;
} else if (firingMode == DUAL_FIRE) {
firingMode = QUAD_FIRE;
} else if (firingMode == QUAD_FIRE) {
firingMode = SINGLE_FIRE;
}
}
function togglePause() {
if (paused) {
resumeGame();
} else {
pauseGame();
}
}
function pauseGame() {
paused = true;
var _local1 = parent.attachMovie("PauseMenu", "PauseMenu", workingDepth++);
_local1._x = 0;
_local1._y = 0;
_local1._alpha = 50;
}
function resumeGame() {
paused = false;
parent.PauseMenu.removeMovieClip();
}
function updateEnergy() {
if (energy < maxEnergy) {
energy = energy + currentEnergyRegenRate;
}
currentEnergyRegenRate = currentEnergyRegenRate + energyRegenRate;
if (energy > maxEnergy) {
energy = maxEnergy;
}
}
function renderEnergy() {
var _local1 = energy * 3;
energyBar._y = originalEnergyBarYPosition - _local1;
energyBar._height = _local1;
}
function updateShield() {
if (shield < maxShield) {
shield = shield + shieldRegenRate;
}
if (shield > shield) {
shield = maxShield;
}
}
function renderShield() {
var _local1 = shield * 3;
shieldBar._y = originalShieldBarYPosition - _local1;
shieldBar._height = _local1;
hero.shield._alpha = shield;
}
function updateHull() {
}
function renderHull() {
var _local1 = hull * 3;
hullBar._y = originalHullBarYPosition - _local1;
hullBar._height = _local1;
}
function trackHeroPositionToMouse() {
var _local4 = _xmouse;
var _local3 = _ymouse;
var _local6 = hero._x;
var _local5 = hero._y;
if (_local3 > mouseYEndPosition) {
_local3 = mouseYEndPosition;
}
var _local2 = determineAngleBetweenPoints(_local4, _local6, _local3, _local5);
if (_local2 < 0) {
_local2 = _local2 + (Math.PI*2);
}
var _local1 = 0;
if (_local2 > heroAngle) {
_local1 = heroAngle + heroRotationSpeed;
if (_local1 > _local2) {
_local1 = _local2;
}
} else {
_local1 = heroAngle - heroRotationSpeed;
if (_local1 < _local2) {
_local1 = _local2;
}
}
if (_local1 >= heroMaxAngle) {
_local1 = heroMaxAngle;
} else if (_local1 <= heroMinAngle) {
_local1 = heroMinAngle;
}
heroAngle = _local1;
heroStopXPosition = _local4;
}
function shoot() {
var _local6 = getTimer();
if (_local6 > timeAtNextShot) {
var _local4 = null;
if (firingMode == QUAD_FIRE) {
_local4 = new Array(4);
_local4[0] = guns[0];
_local4[1] = guns[1];
_local4[2] = guns[2];
_local4[3] = guns[3];
} else if (firingMode == DUAL_FIRE) {
_local4 = new Array(2);
if (currentFiringPair == INNER_GUN_PAIR) {
currentFiringPair = OUTER_GUN_PAIR;
_local4[0] = guns[0];
_local4[1] = guns[1];
} else {
currentFiringPair = INNER_GUN_PAIR;
_local4[0] = guns[2];
_local4[1] = guns[3];
}
} else if (firingMode == SINGLE_FIRE) {
_local4 = new Array(1);
_local4[0] = guns[currentGun];
currentGun++;
if (currentGun > 3) {
currentGun = 0;
}
}
var _local5 = _local4.length;
if (energy <= (energyPerShot * _local5)) {
return(undefined);
}
timeAtNextShot = _local6 + (minDelayBetweenShots * _local5);
bulletCounter++;
currentEnergyRegenRate = energyRegenRate;
energy = energy - (energyPerShot * _local5);
var _local2 = 0;
while (_local2 < _local5) {
var currentGun = _local4[_local2];
var _local1 = new Array();
_local1[X_POSITION] = (heroXPosition + (currentGun[X_OFFSET] * Math.cos(heroAngle - (Math.PI/2)))) + (currentGun[Y_OFFSET] * Math.cos(heroAngle));
_local1[Y_POSITION] = (heroYPosition + (currentGun[X_OFFSET] * Math.sin(heroAngle - (Math.PI/2)))) + (currentGun[Y_OFFSET] * Math.sin(heroAngle));
var _local3 = heroAngle + currentGun[ANGLE_OFFSET];
_local1[X_VELOCITY] = bulletSpeed * Math.cos(_local3);
_local1[Y_VELOCITY] = bulletSpeed * Math.sin(_local3);
_local1[ROTATION] = _local3;
_local1[OWNER] = "hero";
_local1[CLIP_HANDLE] = null;
bullets.push(_local1);
_local2++;
}
}
}
function updateHero() {
var _local2 = Math.abs(heroStopXPosition - heroXPosition);
if (_local2 <= heroXSpeed) {
heroXPosition = heroStopXPosition;
} else {
var _local1 = heroXSpeed;
if (heroStopXPosition < heroXPosition) {
_local1 = _local1 * -1;
}
heroXPosition = heroXPosition + Math.round(_local1);
}
trackHeroPositionToMouse();
}
function renderHero() {
var _local3 = hero._x;
hero._x = heroXPosition;
var _local1 = "Straight";
var _local2 = Math.abs(centerHeroAngle - heroAngle);
if (_local3 < heroXPosition) {
if (heroSmallTurnThreshold >= _local2) {
_local1 = "Right";
} else {
_local1 = "FarRight";
}
} else if (_local3 > heroXPosition) {
if (heroSmallTurnThreshold >= _local2) {
_local1 = "Left";
} else {
_local1 = "FarLeft";
}
}
hero.gotoAndPlay(_local1);
hero._rotation = radiansToDegrees(heroAngle);
}
function updateBullets() {
var _local2 = 0;
while (_local2 < bullets.length) {
var _local1 = bullets[_local2];
_local1[X_POSITION] = _local1[X_POSITION] + _local1[X_VELOCITY];
_local1[Y_POSITION] = _local1[Y_POSITION] + _local1[Y_VELOCITY];
_local2++;
}
}
function renderBullets() {
var _local3 = bullets.length - 1;
while (_local3 >= 0) {
var _local2 = bullets[_local3];
var _local5 = _local2[X_POSITION];
var _local4 = _local2[Y_POSITION];
var _local1 = _local2[CLIP_HANDLE];
if (_local1 == null) {
_local1 = parent.attachMovie("Bullet", "bullet" + bulletCounter, workingDepth++);
_local2[CLIP_HANDLE] = _local1;
_local1._rotation = radiansToDegrees(_local2[ROTATION]);
}
if ((((_local5 < 0) || (_local5 > stageWidth)) || (_local4 < 0)) || (_local4 > stageHeight)) {
bulletMisses++;
bullets.splice(_local3, 1);
_local1.removeMovieClip();
} else {
_local1._x = Math.round(_local5);
_local1._y = Math.round(_local4);
}
_local3--;
}
}
function updateEnemies() {
if (getTimer() >= timeAtNextEnemy) {
enemyCounter++;
timeAtNextEnemy = getTimer() + randomNumberInRange(minTimeBetweenEnemies, maxTimeBetweenEnemies);
var _local1 = new Array();
_local1[X_POSITION] = randomNumberInRange(0, stageWidth - (enemyXOffset * 2)) + enemyXOffset;
_local1[Y_POSITION] = -30;
_local1[X_VELOCITY] = 0;
_local1[Y_VELOCITY] = randomNumberInRange(minEnemyFallRate, maxEnemyFallRate);
_local1[TIME_AT_NEXT_SHOT] = getTimer() + randomNumberInRange(minTimeBetweenEnemyShots, maxTimeBetweenEnemyShots);
_local1[CLIP_HANDLE] = null;
enemies.push(_local1);
}
var _local4 = getTimer();
var _local3 = 0;
while (_local3 < enemies.length) {
var _local1 = enemies[_local3];
_local1[X_POSITION] = _local1[X_POSITION] + _local1[X_VELOCITY];
_local1[Y_POSITION] = _local1[Y_POSITION] + _local1[Y_VELOCITY];
if (_local1[TIME_AT_NEXT_SHOT] < _local4) {
var _local2 = new Array();
_local2[X_POSITION] = _local1[X_POSITION];
_local2[Y_POSITION] = _local1[Y_POSITION] + enemyBarrelLength;
_local2[X_VELOCITY] = 0;
_local2[Y_VELOCITY] = bulletSpeed;
_local2[ROTATION] = degreesToRadians(90);
_local2[CLIP_HANDLE] = null;
_local2[OWNER] = "enemy";
bullets.push(_local2);
_local1[TIME_AT_NEXT_SHOT] = getTimer() + randomNumberInRange(minTimeBetweenEnemyShots, maxTimeBetweenEnemyShots);
}
_local3++;
}
}
function renderEnemies() {
var _local3 = enemies.length - 1;
while (_local3 >= 0) {
var _local2 = enemies[_local3];
var _local4 = _local2[X_POSITION];
var _local5 = _local2[Y_POSITION];
var _local1 = _local2[CLIP_HANDLE];
if (_local1 == null) {
_local1 = parent.attachMovie("Enemy", "enemy" + enemyCounter, workingDepth++);
_local2[CLIP_HANDLE] = _local1;
}
if (((_local4 < 0) || (_local4 > stageWidth)) || (_local5 > stageHeight)) {
enemies.splice(_local3, 1);
_local1.removeMovieClip();
escapedEnemyCounter++;
} else {
_local1._x = Math.round(_local4);
_local1._y = Math.round(_local5);
}
_local3--;
}
}
function determineAngleBetweenPoints(x1, x2, y1, y2) {
var _local2 = x1 - x2;
var _local3 = y1 - y2;
var _local1 = Math.atan2(_local3, _local2);
return(_local1);
}
function radiansToDegrees(radians) {
var _local1 = radians * 57.2957795130823;
return(_local1);
}
function degreesToRadians(degrees) {
var _local1 = degrees * (Math.PI/180);
return(_local1);
}
function randomNumberInRange(min, max) {
var _local2 = max - min;
var _local1 = Math.floor((Math.random() * _local2) + min);
return(_local1);
}
function distanceBetween2DPoints(x1, y1, x2, y2, useSqrt) {
var _local2 = x2 - x1;
var _local3 = y2 - y1;
var _local1 = (_local2 * _local2) + (_local3 * _local3);
if (useSqrt) {
_local1 = Math.sqrt(_local1);
}
return(_local1);
}
var centerHeroAngle = degreesToRadians(270);
var heroAngle = centerHeroAngle;
var heroXPosition = hero._x;
var heroYPosition = hero._y;
var bullets = new Array();
var timeAtNextShot = getTimer();
var bulletCounter = 0;
var bulletHits = 0;
var bulletMisses = 0;
var enemies = new Array();
var enemyCounter = 0;
var deadEnemyCounter = 0;
var escapedEnemyCounter = 0;
var timeAtNextEnemy = (getTimer() + 3000);
var parent = _root;
var workingDepth = 1000;
var lives = 3;
var paused = false;
var heroXSpeed = 8;
var heroRotationSpeed = degreesToRadians(2);
var heroMinAngle = degreesToRadians(250);
var heroMaxAngle = degreesToRadians(290);
var heroSmallTurnThreshold = degreesToRadians(10);
var maxEnergy = 100;
var energy = maxEnergy;
var minEnergy = 0;
var energyPerShot = 2;
var energyRegenRate = 0.006;
var currentEnergyRegenRate = energyRegenRate;
var originalEnergyBarYPosition = energyBar._y;
var maxShield = 100;
var minShield = 0;
var shield = maxShield;
var shieldDamagePerHit = 40;
var shieldRegenRate = 0.1;
var originalShieldBarYPosition = shieldBar._y;
var maxHull = 100;
var minHull = 0;
var hull = maxHull;
var hullDamagePerHit = 40;
var originalHullBarYPosition = hullBar._y;
var stageWidth = 640;
var stageHeight = 480;
var mouseYEndPosition = 350;
var minDelayBetweenShots = 85;
var bulletSpeed = 16;
var minTimeBetweenEnemies = 500;
var maxTimeBetweenEnemies = 2000;
var minEnemyFallRate = 1;
var maxEnemyFallRate = 5;
var enemyXOffset = 30;
var enemyBarrelLength = 15;
var minTimeBetweenEnemyShots = 1000;
var maxTimeBetweenEnemyShots = 3000;
var enemyRadius = 22;
var heroRadius = 64;
var bulletRadius = 3;
var enemyCollisionDistance = ((enemyRadius + bulletRadius) * (enemyRadius + bulletRadius));
var heroCollisionDistance = ((heroRadius + bulletRadius) * (heroRadius + bulletRadius));
var X_POSITION = 0;
var Y_POSITION = 1;
var X_VELOCITY = 2;
var Y_VELOCITY = 3;
var ROTATION = 4;
var OWNER = 5;
var CLIP_HANDLE = 6;
var TIME_AT_NEXT_SHOT = 7;
var X_OFFSET = 0;
var Y_OFFSET = 1;
var ANGLE_OFFSET = 2;
var guns = new Array();
guns[0] = new Array();
guns[0][X_OFFSET] = 3;
guns[0][Y_OFFSET] = 38;
guns[0][ANGLE_OFFSET] = degreesToRadians(0.4);
guns[1] = new Array();
guns[1][X_OFFSET] = -3;
guns[1][Y_OFFSET] = 38;
guns[1][ANGLE_OFFSET] = degreesToRadians(-0.4);
guns[2] = new Array();
guns[2][X_OFFSET] = 42;
guns[2][Y_OFFSET] = -2;
guns[2][ANGLE_OFFSET] = degreesToRadians(5.5);
guns[3] = new Array();
guns[3][X_OFFSET] = -42;
guns[3][Y_OFFSET] = -2;
guns[3][ANGLE_OFFSET] = degreesToRadians(-5.5);
var SINGLE_FIRE = 0;
var DUAL_FIRE = 1;
var QUAD_FIRE = 2;
var firingMode = SINGLE_FIRE;
var INNER_GUN_PAIR = 0;
var OUTER_GUN_PAIR = 1;
var currentFiringPair = INNER_GUN_PAIR;
var currentGun = 0;
_root.onEnterFrame = mainLine;
var mouseListener = new Object();
mouseListener.onMouseMove = function () {
trackMouseMovement();
};
mouseListener.onMouseUp = function () {
trackMouseClick();
};
Mouse.addListener(mouseListener);
var keyListener = new Object();
keyListener.onKeyUp = function () {
var _local1 = chr(Key.getAscii());
if ((_local1 == "p") || (_local1 == "P")) {
togglePause();
} else if ((_local1 == "m") || (_local1 == "M")) {
toggleFiringMode();
}
};
Key.addListener(keyListener);
stop();
Symbol 13 Button
on (release) {
_root.gotoAndStop(2);
}
Symbol 18 Button
on (release) {
stopAllSounds();
}
Symbol 35 MovieClip Frame 1
collisionShape1._alpha = 0;
collisionShape2._alpha = 0;
collisionShape3._alpha = 0;
collisionShape4._alpha = 0;
collisionShape5._alpha = 0;
collisionShape6._alpha = 0;
stop();
Symbol 35 MovieClip Frame 2
stop();
Symbol 35 MovieClip Frame 3
stop();
Symbol 35 MovieClip Frame 4
stop();
Symbol 35 MovieClip Frame 5
stop();