var waterimgs = new Array();
waterimgs[0] = new Image();
waterimgs[0].src = "images/water.gif";
waterimgs[1] = new Image();
waterimgs[1].src = "images/water.gif";
waterimgs[2] = new Image();
waterimgs[2].src = "images/water2.gif";

var waterx = new Array();
var watery = new Array();
var waterxmax = new Array();
var waterxmin = new Array();
var waterxvee = new Array();
var wateryvee = new Array();

var yoffset = 250;

var level = 1;
var activeboats = 2;
var score = 0;

var mouseX, mouseY;

var gunpos=200;
var bulletx, bullety, bulletstate
var bullets = 5;
var firing=0;

var bulletimage = new Array();

var boattimer = new Array();
var watertimer = 0;
var guntimer = 0;

gunimage = new Image();
gunimage.src = "images/gun.gif"
emptyimage = new Image();
emptyimage.src = "images/emptygun.gif";

splatimage = new Image();
splatimage.src = "images/splat.gif";

var stroking = 0;
var stroke = new Array();
stroke[0] = new Image();
stroke[0].src = "images/stroke1.gif";
stroke[1] = new Image();
stroke[1].src = "images/stroke2.gif";
var numstrokes = 2;

bulletimage[0] = new Image();
bulletimage[1] = new Image();
var transparent = new Image();

bulletimage[0].src = "images/bullet0.gif";
bulletimage[1].src = "images/bullet1.gif";
transparent.src = "images/transparent.gif"

var boats = new Array();
boats[0] = new Image();
boats[0].src = "images/b1.gif";
boats[1] = new Image();
boats[1].src = "images/b2.gif";
boats[2] = new Image();
boats[2].src = "images/b3.gif";
boats[3] = new Image();
boats[3].src = "images/b4.gif";
boats[4] = new Image();
boats[4].src = "images/b5.gif";
boats[5] = new Image();
boats[5].src = "images/b6.gif";
boats[6] = new Image();
boats[6].src = "images/b7.gif";
var numboats = 7;

var pirates = new Array();
pirates[0] = new Image();
pirates[0].src = "images/p1.gif";
pirates[1] = new Image();
pirates[1].src = "images/p2.gif";
pirates[2] = new Image();
pirates[2].src = "images/p3.gif";
pirates[3] = new Image();
pirates[3].src = "images/p4.gif";
var numpirates = 4;

var pirateshit = 0;

var pirateboats = new Array();

var boatsthislevel;

boatsink = new Image();
boatsink.src = "images/sink.gif";

piratesink = new Image();
piratesink.src = "images/psink.gif";

var boaty = new Array();
var boatx = new Array();
var boatyvee = new Array();
var boatxvee = new Array();


var spriteMove;

if(document.layers) {
	spriteMove = function(name, x, y) {
		y += yoffset;
		eval("document." + name + ".left='" + x + "'");
		eval("document." + name + ".top='" + y + "'");
	}
}
if(document.getElementById) {
	spriteMove = function(name, x, y) {
		y += yoffset;
		document.getElementById(name).style.left = x + "px";
		document.getElementById(name).style.top = y + "px";
	}
} else if(document.all) {
	spriteMove = function(name, x, y) {
		y += yoffset;
		eval("document.all." + name + ".left ='" + x + "'");
		eval("document.all." + name + ".top ='" + y + "'");
	}
}


function randint(n) {
	return(Math.floor(Math.random() * (n - 0.5)));
}

function getImg(img, d) {
	var	tmp;

	tmp = d.images[img];
	if(!tmp && d.layers) {
		for(var i=0 ; !img && i<d.layers.length ; i++) {
			tmp = getImg(img, d.layers[i].document);
		}
	}
	return tmp;
}

function setimg(img, pic) {
	var tmp;

	tmp = getImg(img, document);
	if(!tmp) {
		alert("Aig!");
		return;
	}
	tmp.src = pic.src;
}

function setimgdim(img, x, y) {
	var tmp;

	tmp = getImg(img, document);
	if(!tmp) {
		alert("Aig2!");
		return;
	}
	tmp.width = x;
	tmp.height = y;
}

function chooseboat(n) {
	var tmp;
	var ispirate;

	if(boatsthislevel >= (5*activeboats)) {
		if(setlevel(level + 1)) {
			return;
		}
		boatsthislevel = 0;
	}

	if(randint(4) == 0) {
		ispirate = 1;
		tmp = randint(numpirates);
		pirateboats[n] = 1;
	} else {
		ispirate = 0;
		tmp = randint(numboats);
		pirateboats[n] = 0;
	}

	boatsthislevel++;

	boaty[n] = 150;
	boatxvee[n] = randint(10) + 6 + (4*level);
	boatyvee[n] = randint(5);

	if(randint(2) == 0) {
		// Start from the left..
		boatx[n] = 0;
	} else {
		boatx[n] = 840;
		boatxvee[n] = -boatxvee[n];
	}

	if(ispirate) {
		setimg("boat" + n + "img", pirates[tmp]);
	} else {
		setimg("boat" + n + "img", boats[tmp]);
	}
	moveboat(n);
}

function moveboat(n) {
	if(boattimer[n]) {
		clearTimeout(boattimer[n]);
	}

	boaty[n] += boatyvee[n];
	boatx[n] += boatxvee[n];

	switch(n) {
	case 0:
	case 3:
		delta = 0;
		break;
	case 1:
	case 2:
		delta = 30;
		break;
	}

	if(boaty[n] > (113 - delta)) {
		boaty[n] = 113 - delta;
		boatyvee[n] = -boatyvee[n];
	} else if(boaty[n] < (105-delta)) {
		boaty[n] = 105 - delta;
		boatyvee[n] = -boatyvee[n];
	}

	if(boatxvee[n] > 0) {
		if(boatx[n] > 840) {
			chooseboat(n);
			return;
		}
	} else {
		if(boatx[n] < 0) {
			chooseboat(n);
			return;
		}
	}

	spriteMove("boat" + n, boatx[n], boaty[n]);
	boattimer[n] = setTimeout("moveboat(" + n + ");", 100);

}

function movegun(dir, amount) {
	switch(dir) {
	case 'R':
		if(gunpos < 800) {
			gunpos += amount;
			if(gunpos > 800) {
				gunpos = 800;
			}
		}
		break;
	case 'L':
		if(gunpos > 25) {
			gunpos -= amount;
			if(gunpos < 25) {
				gunpos = 25;
			}
		}
		break;
	default:
		alert("Internal error 1");
		return;
	}

	spriteMove("gun", gunpos, 290);
}

function gunupdate() {
	var delta, tmp;

	tmp = gunpos+45; /* Center of the gun */
	if(tmp > mouseX) {
		delta = (tmp - mouseX);
		dir = 'L';
	} else {
		delta = (mouseX - tmp);
		dir = 'R';
	}

	if(delta > 50) {
		delta = 15;
	} else if(delta > 25) {
		delta = 10;
	} else if(delta > 15) {
		delta = 7;
	} else if(delta > 0) {
		delta = 1;
	}
	if(delta) {
		movegun(dir, delta);
	}
	guntimer = setTimeout("gunupdate();", 20);
}

function restoreammo() {
	setimg("gunimg", gunimage);
}
function sinkboat(count, n) {
	if(count == 0) {
		chooseboat(n);
		return;
	}
	boaty[n] += 4;
	count = (count-1);
	if(count > 5) {
		spriteMove("splat" + n, boatx[n], boaty[n]);
	}
	if(count == 5) {
		setimg("splat" + n + "img", transparent);
		if(pirateboats[n]) {
			setimg("boat" + n + "img", piratesink);
		} else {
			setimg("boat" + n + "img", boatsink);
		}
	}
	spriteMove("boat" + n, boatx[n], boaty[n]);
	setTimeout("sinkboat(" + count + "," + n + ");", 50);
}

function dopirate() {
	alert("You've hit 3 pirates! Game over dude!");
}

function dohit(n) {
	if(boattimer[n]) {
		clearTimeout(boattimer[n]);
	}
	if(pirateboats[n]) {
		pirateshit++;
		if(pirateshit >= 3) {
			dopirate();
			setlevel(99); // End game
		}
	}
	spriteMove("splat" + n, boatx[n], boaty[n]);
	setimg("splat" + n + "img", splatimage);
	sinkboat(10, n);

	score++;
	document.controls.score.value = score;
}

function movebullet() {
	var ylimit = 50;

	if(bulletstate == 0) {
		bulletstate = 1;
	} else {
		bulletstate = 0;
	}

	if(bullety <= ylimit) {
		setimg("bulletimg", transparent);
		firing = 0;
		return;
	}

	bullety -= 8;


	/* Figure out scale factor for distance.. */
	d = bullety - ylimit; /* Goes from 200 to 0 */
	size = Math.floor((d / 200) * 24) + 16;
	setimgdim("bulletimg", size, size);
	setimg("bulletimg", bulletimage[bulletstate]);	
	spriteMove("bullet", bulletx, bullety);

	// Check for a hit!

	for(n = 0; n < activeboats; n++) {
		if(bullety > (boaty[n]) && bullety < (boaty[n]+120)) {
			if(bulletx > (boatx[n])&&bulletx < (boatx[n]+120)) {
				dohit(n);
				setimg("bulletimg", transparent);
				firing = 0;
				return;
			}
		}
	}
	setTimeout("movebullet()", 5);
}

function strokeit(n, s, u) {
	if(u) {
		s++;
		if((s+1) == numstrokes) {
			u = 0;
		}
	} else {
		s--;
		if((s - 1) < 0) {
			u = 1;
		}
	}

	setimg("gunimg", stroke[s]);

	n = (n - 1);

	if(n > 0) {
		setTimeout("strokeit(" + n + "," + s + "," + u + ")", 250);
	} else {
		stroking = 0;
		bullets = 5;
		setimg("gunimg", gunimage);
	}
}

function reload() {
	if(stroking) {
		return;
	}
	stroking = 1;
	strokeit(10, 0, 1);
}

function shoot() {
	if(bullets == 0) {
		reload();
		return;
	}
	if(firing == 1 && bullets == 0) {
		return;
	}

	firing = 1;
	bullets--;
		
	bullety = 270;
	bulletx = gunpos+55;
	bulletstate = 0;

	setimgdim("bulletimg", 32, 32);
	spriteMove("bullet", bulletx, bullety);
	movebullet();
}

function setlevel(n) {
	level = n;

	if(level < 3) {
		setimg("water0img", transparent);
	} else {
		setimg("water0img", waterimgs[0]);
	}
	setimg("water2img", waterimgs[2]);
	setimg("water1img", waterimgs[1]);

	for(i = 0; i < activeboats; i++) {
		if(boattimer[i]) {
			clearTimeout(boattimer[i]);
		}
		setimg("boat" + i + "img", transparent);
	}

	document.controls.level.value = level;

	switch(level) {
	case 1:
	case 2:
		activeboats = 1;
		break;
	case 3:
		activeboats = 2;
		break;
	case 4:
		activeboats = 2;
		break;
	case 5:
		activeboats = 3;
		break;
	default:
		document.controls.level.value = "Game Over";
		activeboats = 0;
		return true;
		break;
	}

	boatsthislevel = 0;

	for(i = 0; i < activeboats; i++) {
		chooseboat(i);
	}
	return false;
}
function newgame() {
	score = 0;
	bullets = 5;
	pirateshit = 0;
	document.controls.score.value = 0;
	setlevel(1);
}
function movewater() {
	var i;

	for(i = 0; i < 3; i++) {
		waterx[i] += waterxvee[i];
		watery[i] += wateryvee[i];

		if(waterx[i] > waterxmax[i]) {
			waterx[i] = waterxmax[i];
			waterxvee[i] = -waterxvee[i];
		}
		if(waterx[i] < waterxmin[i]) {
			waterx[i] = waterxmin[i];
			waterxvee[i] = -waterxvee[i];
		}

		if(watery[i] < 0) {
			watery[i] = 0;
			wateryvee[i] = -wateryvee[i];
		}
		if(watery[i] > 50) {
			watery[i] = 50;
			wateryvee[i] = -wateryvee[i];
		}

		spriteMove("water" + i, watery[i], waterx[i]);
	}

	watertimer = setTimeout("movewater();", 150);
}

function stopgun() {
	if(guntimer) {
		clearTimeout(guntimer);
	}
}

function stopwater() {
	if(watertimer) {
		clearTimeout(watertimer);
	}
}

function startwater() {
	waterx[0] = 0;
	watery[0] = 130;
	waterxmax[0] = 135;
	waterxmin[0] = 127;
	waterxvee[0] = 1;
	wateryvee[0] = 1;

	waterx[1] = 25;
	watery[1] = 155;
	waterxmax[1] = 158;
	waterxmin[1] = 153;
	waterxvee[1] = -2;
	wateryvee[1] = -2;

	waterx[2] = 25;
	watery[2] = 175;
	waterxmax[2] = 179;
	waterxmin[2] = 172;
	waterxvee[2] = -2;
	wateryvee[2] = 1;

	movewater();
}

function mousepos(ev) {
	if(document.layers) {
		mouseX = ev.pageX;
		mouseY = ev.pageY;
	} else if(document.all) {
		mouseX = window.event.x+document.body.scrollLeft;
		mouseY = window.event.y+document.body.scrollTop;
	} else if(document.getElementById) {
		mouseX = ev.pageX;
		mouseY = ev.pageY;
	}
}

var instructionstate = 0;
var insx = -570;
var insvee = 0;

function scrollins() {
	insx += insvee;

	spriteMove("instructions", insx, -150);

	if(insvee > 0) {
		if(insx >= -20) {
			instructionstate = 3;
			return;
		}
	} else if(insvee < 0) {
		if(insx <= -570) {
			instructionstate = 0;
			startwater();
			gunupdate();
			return;
		}
	}
	setTimeout("scrollins();", 50);
}

function toggleinstructions() {
	stopwater();
	stopgun();

	switch(instructionstate) {
	case 0:  // hidden
		instructionstate = 1;
		insvee = 50;
		scrollins();
		break;
	case 1:  // coming out
		instructionstate = 2;
		insvee = -50;
		break;
	case 2: // going in
		instructionstate = 1;
		insvee = 50;
		break;
	case 3: // out
		instructionstate = 2;
		insvee = -50;
		scrollins();
		break;
	}
}
