//<!-- Original:  Jason Hotchkiss (jasonhotchkiss@home.com) -->
//<!-- Begin

var ship =  [[[1,5], [1,2,5], [1,2,3,5], [1,2,3,4,5]], [[6,10], [6,7,10], [6,7,8,10], [6,7,8,9,10]]];   /* Information used to draw the ships */
var dead = [[[201,203], [201,202,203], [201,202,202,203], [201,202,202,202,203]], [[204,206], [204,205,206], [204,205,205,206], [204,205,205,205,206]]];    /* Information used to draw sunk ships */
var shiptypes = [["stamps",2,4],["stamps",3,4],[ "stamps",4,2],[ "stamps",5,1]];   /* Information used to describe ships */
var gridx = 16, gridy = 16;
var player = [], computer = [], playersships = [], computersships = [];
var playerlives = 0, computerlives = 0, playflag=true, statusmsg="";
var movesT = 0;

/* Function to preload all the images, to prevent delays during play */
var preloaded = [];
function imagePreload() 
{
  var i,ids = [1,2,3,4,5,6,7,8,9,10,100,101,102,103,201,202,203,204,205,206];  window.status = "Preloading images...please wait";
  for (i=0;i<ids.length;++i) {var img = new Image, name = "/images/games/bstamp/batt"+ids[i]+".gif"; img.src = name; preloaded[i] = img;}
  window.status = "";
}

/* Function to place the ships in the grid */
function setupPlayer(ispc) 
{ 
  var y,x; grid = []; for (y=0;y<gridx;++y) { grid[y] = []; for (x=0;x<gridx;++x) grid[y][x] = [100,-1,0]; }

  var shipno = 0;
  var s;

  for (s=shiptypes.length-1;s>=0;--s) 
  {
    var i;
    for (i=0;i<shiptypes[s][2];++i) 
    {
      var d = Math.floor(Math.random()*2);
      var len = shiptypes[s][1], lx=gridx, ly=gridy, dx=0, dy=0;
      if ( d==0) { lx = gridx-len; dx=1; }
      else { ly = gridy-len; dy=1; }
      var x,y,ok;
      
      do 
      {
        y = Math.floor(Math.random()*ly);
        x = Math.floor(Math.random()*lx);
        var j,cx=x,cy=y;
        ok = true;
        for (j=0;j<len;++j) {if (grid[cy][cx][0] < 100) {ok=false; break;} cx+=dx; cy+=dy; }
      } while(!ok);
      
      var j,cx=x,cy=y;
      for (j=0;j<len;++j) {grid[cy][cx][0] = ship[d][s][j]; grid[cy][cx][1] = shipno; grid[cy][cx][2] = dead[d][s][j]; cx+=dx; cy+=dy;}
      if (ispc) {computersships[shipno] = [s,shiptypes[s][1]]; computerlives++;}
      else {playersships[shipno] = [s,shiptypes[s][1]]; playerlives++;}
      shipno++;
    }
  }
  return grid;
}

/* Function to change an image shown on a grid */
function setImage(y,x,id,ispc) 
{
  if ( ispc ) {computer[y][x][0] = id; document.images["pc"+y+"_"+x].src = "/images/games/bstamp/batt"+id+".gif";}
  else         {player[y][x][0] = id; document.images["ply"+y+"_"+x].src = "/images/games/bstamp/batt"+id+".gif";}
}

/* Function to insert HTML source for a grid */
function showGrid(ispc) 
{
  var y,x;
  for (y=0;y<gridy;++y) 
  {
    document.write('<div>');
    for (x=0;x<gridx;++x) 
    {
      if ( ispc ) {document.write ('<a href="javascript:gridClick('+y+','+x+');"><img style="border-color: #0000ff;" name="pc'+y+'_'+x+'" src="/images/games/bstamp/batt100.gif" width=16 height=16></a>');}
      else        {document.write ('<a href="javascript:void(0);"><img style="border-color: #0000ff;" name="ply'+y+'_'+x+'" src="/images/games/bstamp/batt'+player[y][x][0]+'.gif" width=16 height=16></a>');}
    }
    document.write('</div>');
   }
}

/* Handler for clicking on the grid */
function gridClick(y,x) 
{
  movesT++;
  if ( playflag ) 
  {
    if (computer[y][x][0] < 100) 
    {
      setImage(y,x,103,true);
      var shipno = computer[y][x][1];
      if ( --computersships[shipno][1] == 0 ) 
      {
        sinkShip(computer,shipno,true);
        alert("You wiped out some of my "+shiptypes[computersships[shipno][0]][0]+"!");
        updateStatus();
        if ( --computerlives == 0 ) 
        {
          alert('You win after ' + movesT + ' moves!');
          var nPoints = Math.round(100 / movesT * 400 * 32);
          var strMsg = "Your score is " + nPoints + " points. \nPlease enter your name for the scoreboard:";
          var strPlayerName = "";
          strName = prompt(strMsg, strPlayerName);
          if(strName != null && strName != "")
          {
            strPlayerName = strName.substr(0, 20);
            strURL = "/html/games/games_addscore.php" + "?b=battlestamps&n=" + escape(strPlayerName) + "&p=" + nPoints;
            window.open(strURL, "Highscore", "toolbar=no,location=no,status=no,menubar=no,scrollbars=yes,resizable=yes,width=440,height=600");
          }
          playflag = false;
        }
      }
      if ( playflag ) computerMove();
    }
    else if (computer[y][x][0] == 100) 
    {
      setImage(y,x,102,true);
      computerMove();
    }
  }
}

/* Function to make the computers move. Note that the computer does not cheat, oh no! */
function computerMove() 
{
  var x,y,pass;
  var sx,sy;
  var selected = false;

/* Make two passes during 'shoot to kill' mode */
  for (pass=0;pass<2;++pass) 
  {
    for (y=0;y<gridy && !selected;++y) 
    {
      for (x=0;x<gridx && !selected;++x) 
      {
        /* Explosion shown at this position */
        if (player[y][x][0]==103) 
        {
          sx=x; sy=y;
          var nup=(y>0 && player[y-1][x][0]<=100);
          var ndn=(y<gridy-1 && player[y+1][x][0]<=100);
          var nlt=(x>0 && player[y][x-1][0]<=100);
          var nrt=(x<gridx-1 && player[y][x+1][0]<=100);
          if ( pass == 0 ) 
          {
            /* On first pass look for two explosions
               in a row - next shot will be inline          */
            var yup=(y>0 && player[y-1][x][0]==103);
            var ydn=(y<gridy-1 && player[y+1][x][0]==103);
            var ylt=(x>0 && player[y][x-1][0]==103);
            var yrt=(x<gridx-1 && player[y][x+1][0]==103);
            if ( nlt && yrt) { sx = x-1; selected=true; }
            else if ( nrt && ylt) { sx = x+1; selected=true; }
            else if ( nup && ydn) { sy = y-1; selected=true; }
            else if ( ndn && yup) { sy = y+1; selected=true; }
          }
          else 
          {
            /* Second pass look for single explosion - 
               fire shots all around it                     */
            if ( nlt ) { sx=x-1; selected=true; }
            else if ( nrt ) { sx=x+1; selected=true; }
            else if ( nup ) { sy=y-1; selected=true; }
            else if ( ndn ) { sy=y+1; selected=true; }
          }
        }
      }
    }
  }
  if ( !selected ) 
  {
    /* Nothing found in 'shoot to kill' mode, so we're just taking
       potshots. Random shots are in a chequerboard pattern for 
       maximum efficiency, and never twice in the same place         */
    do
    {
      sy = Math.floor(Math.random() * gridy);
      sx = Math.floor(Math.random() * gridx/2)*2+sy%2;
    } while( player[sy][sx][0]>100 );
  }
  if (player[sy][sx][0] < 100) 
  {
    /* Hit something */
    setImage(sy,sx,103,false);
    var shipno = player[sy][sx][1];
    if ( --playersships[shipno][1] == 0 ) 
    {
      sinkShip(player,shipno,false);
      alert("I obliterated some of your "+shiptypes[playersships[shipno][0]][0]+"!");
      if ( --playerlives == 0 ) {knowYourEnemy(); alert("I win! Press the Refresh button on\n" + "your browser to play another game."); playflag = false;}
    }
  }
  else 
  {
    /* Missed */
    setImage(sy,sx,102,false);
  }
}

/* When whole ship is hit, show it using changed graphics */
function sinkShip(grid,shipno,ispc) 
{
  var y,x;
  for (y=0;y<gridx;++y) 
  {
    for (x=0;x<gridx;++x) 
    {
      if ( grid[y][x][1] == shipno )
      if (ispc) setImage(y,x,computer[y][x][2], true);
      else setImage(y,x,player[y][x][2], false);
    }
  }
}

/* Show location of all the computers ships - when player has lost */
function knowYourEnemy() 
{
  var y,x;
  for (y=0;y<gridx;++y) 
  {
    for (x=0;x<gridx;++x) 
    {
      if      ( computer[y][x][0] == 103 ) {setImage(y,x,computer[y][x][2],true);}
      else if ( computer[y][x][0] < 100 )  {setImage(y,x,computer[y][x][0],true);}
    }
  }
}

/* Show how many ships computer has left */
function updateStatus() 
{
  var f=false,i,s = "Computer has ";
  for (i=0;i<computersships.length;++i) 
  {
    if (computersships[i][1] > 0) 
    {
      if (f) s=s+", "; else f=true; {s = s + shiptypes[computersships[i][0]][0];}
    }
  }
  if (!f) {s = s + "nothing left, thanks to you!";}
  statusmsg = s;
  window.status = statusmsg;
}

function setStatus() {window.status = statusmsg;}

/* Start the game! */
imagePreload();
player = setupPlayer(false);
computer = setupPlayer(true);
document.write("<center><table border=0><tr><td align=center><p style='font-size:14pt; font-weight:bold; font-family:sans-serif'>COMPUTER'S INVENTORY</p></td>"+
"<td align=center><p class='heading'>PLAYER'S INVENTORY</p></td></tr><tr><td>");
showGrid(true);
document.write("</td><td>");
showGrid(false);
document.write("</td></tr></table></center>");
updateStatus();
setInterval("setStatus();", 500);

//  End -->