/* Aragon Online - Copyright 2003-2008 by Russell Shilling */
/* hex.js */

var obj_timer = Array();

// LINE OF SIGHT

function line_of_sight(xs,ys, xe,ye) {

    var x, y, z, zs, ze, dx, dy, dz, dist, slope;

    if (!xe)
        return true;

    if (distance(xs,ys, xe,ye) <= 1)
        return true;

    zs = map[xs][ys][5]; // use elev for start and end hex
    ze = map[xe][ye][5];
    // Use hgt if atop a wall or tower
    if (is_wall(map[xs][ys][1]))
        zs = map[xs][ys][4];
    if (is_wall(map[xe][ye][1]))
        ze = map[xe][ye][4];

    xs = parseInt(xs); ys = parseInt(ys);
    xe = parseInt(xe); ye = parseInt(ye);

    if (xs & 1) ys -= 0.5;
    if (xe & 1) ye -= 0.5;

    if (xs == xe)
        slope = (ye > ys ? 1000: -1000);
    else
        slope = (ye - ys) / (xe - xs);

    if (Math.abs(slope) > 1) {

        dist = Math.floor(Math.abs(ye - ys));

        dx = (xs == xe ? 0 : 1 / Math.abs(slope));
        if (xe < xs) dx = -dx;
        dy = (ye > ys ? 1 : -1);
        dz = (ze - zs) / dist;

        x = xs + dx;
        y = ys + dy;
        z = zs + dz + 3;

        for (var d = 1; d < dist; d++) {
            if (dy < 0) {
                var z0 = hgt_hex_up(x, y, z);
                if (z < z0) {
                    return false;
                }
            } else {
                var z0 = hgt_hex_down(x, y, z);
                if (z < z0) {
                    return false;
                }
            }
            x = x + dx;
            y = y + dy;
            z = z + dz;
        }
        return true;

    } else {

        dist = Math.abs(xe - xs);

        dx = (xe > xs ? 1 : -1);
        dy = (ye - ys) / dist;
        dz = (ze - zs) / dist;

        x = xs + dx;
        y = ys + dy;
        z = zs + dz + 3;

        for (var d = 1; d < dist; d++) {
            var z0 = hgt_hex_x(x, y, z);
            if (z < z0) {
                return false;
            }

            x = x + dx;
            y = y + dy;
            z = z + dz;
        }
        return true;
    }
}

// Show the LOS blocked graphic for 2.5 secs
function show_blocked(x1,y1, x2,y2) {

  var sx1 = Math.floor(x1);
  var sy1 = Math.floor(y1);
  var sx2 = Math.floor(x2);
  var sy2 = Math.floor(y2);

  var scrn_y = (terrain_scrn_y(sx1,sy1)+terrain_scrn_y(sx2,sy2))/2 + Y_OFFSET;
  var scrn_x = (sx1+sx2)/2 * X_SCALE;

  var obj = $('blocked1');

  obj.style.left = scrn_x + 'px';
  obj.style.top = scrn_y + 'px';
  obj.style.display = 'block';

  // obj_timer = setTimeout('hide_blocked();', 2500);
}

function hide_blocked() {
  var obj = $('blocked1');

  if (obj)
    obj.style.display = 'none';

  // clearTimeout(obj_timer);
}

function hgt_hex_x(x, y, z) {
    var y1, y2, f1, f2;
    if (x & 1) {
        y1 = Math.max(0, Math.floor(y + 0.5));
        y2 = Math.min(Math.ceil(y + 0.5));
    } else {
        y1 = Math.max(0, Math.floor(y));
        y2 = Math.min(Y_MAX, Math.ceil(y));
    }
    f1 = 1 - y + y1; f2 = 1 - f1;
    // alert('x,y:'+x+','+y+' y1,f1:'+y1+','+f1+' y2,f2:'+y2+','+f2);
    var z0 = map[x][y1][4] * f1 + map[x][y2][4] * f2;

    if (z < z0) {
      show_blocked(x,y1, x,y2);
    }
    return z0;
}
function hgt_hex_down(x, y, z) {
    var x1, x2, f1, f2, y1, y2;
    x1 = Math.max(0, Math.floor(x));
    x2 = Math.min(X_MAX, Math.ceil(x));
    f1 = 1 - x + x1;    f2 = 1 - f1; // x2 + x;
    y1 = Math.min(Y_MAX, Math.ceil(y));
    // y2 = Math.min(Y_MAX, Math.ceil(y));
    // var z0 = map[x1][y1][4] * f1 + map[x2][y2][4] * f2;
    var z0 = map[x1][y1][4];

    if (z < z0) {
      show_blocked(x1,y1, x2,y1);
    }
    return z0;
}
function hgt_hex_up(x, y, z) {
    var x1, x2, f1, f2, y1, y2;
    x1 = Math.max(0, Math.floor(x));
    x2 = Math.min(X_MAX, Math.ceil(x));
    f1 = 1 - x + x1;    f2 = 1 - f1; // x2 + x;
    y1 = Math.min(Y_MAX, Math.ceil(y));
    // y2 = Math.min(Y_MAX, Math.ceil(y));
    // var z0 = map[x1][y1][4] * f1 + map[x2][y2][4] * f2;
    var z0 = map[x1][y1][4];

    if (z < z0) {
      show_blocked(x1,y1, x2,y1);
    }
    return z0;
}


// Show the hex destination highlight for 2.5 secs
function show_hilite(x, y, i) {

  var sx = Math.floor(x);
  var sy = Math.floor(y);
  //if (scale >= 3) {
  //  sx -= origin_x;
  //  sy -= origin_y;
  //}
  var scrn_y = terrain_scrn_y(sx,sy) + 4;
  var scrn_x = sx * X_SCALE;

  var obj = $('hilite'+i);
  clearTimeout(obj_timer[i]);

  obj.style.left = scrn_x + 'px';
  obj.style.top = scrn_y + 'px';
  obj.style.display = 'block';

  obj_timer[i] = setTimeout('hide_hilite('+i+');', 2500);
}

function hide_hilite(i) {
  var obj = $('hilite'+i);

  if (obj)
    obj.style.display = 'none';

  erase_path();

  // clearTimeout(obj_timer[i]);
}

// MISC HEX FUNCTIONS

function distance (x1, y1, x2, y2) {
    dx = Math.abs(x1 - x2);
    dy = Math.abs(2 * y1 - (x1 & 1) - 2 * y2 + (x2 & 1));
    dist = dx + Math.max(0, Math.floor((dy - dx) / 2));

    return dist;
}
function in_map(x,y) {
  return (x>=0 && x<X_MAX && y>=0 && y<Y_MAX);
}

function move_x(x,y,d) {
  var x1;
  if (d == 0) return x;
  switch (d) {
  case 1: x1 = x + 1; break;
  case 2: x1 = x; break;
  case 3: x1 = x - 1; break;
  case 4: x1 = x - 1; break;
  case 5: x1 = x; break;
  case 6: x1 = x + 1; break;
  }
  return x1;
}
function move_y(x,y,d) {
  var y1;
  if (d == 0) return y;
  if (x & 1) {
    switch (d) {
    case 1: y1 = y - 1; break;
    case 2: y1 = y - 1; break;
    case 3: y1 = y - 1; break;
    case 4: y1 = y; break;
    case 5: y1 = y + 1; break;
    case 6: y1 = y; break;
    }
  } else {
    switch (d) {
    case 1: y1 = y; break;
    case 2: y1 = y - 1; break;
    case 3: y1 = y; break;
    case 4: y1 = y + 1; break;
    case 5: y1 = y + 1; break;
    case 6: y1 = y + 1; break;
    }
  }
  return y1;
}
function get_terrain(x,y) {
  return map[x][y][0];
}
function get_feature(x,y) {
  return map[x][y][1];
}
function get_elev(x,y) {
  return map[x][y][0].substr(0,1);
}
function terrain_scrn_y(x,y) {
  scrn_y = y * Y_SCALE;
  if ((x & 1) == 0) scrn_y += Y_HALF;
  if (scale > 0) {
    z = parseInt(map[x][y][0].substr(0,1));
    if (z > 2)
        scrn_y -= 3 * (z - 2);
  }
  return scrn_y;
}
function feature_scrn_y(x,y) {
  return terrain_scrn_y(x,y);
}
function is_wall(t) {
  if (t) {
    var pre = t.substr(0,1);
    var nbr = t.substr(1,1);
    if (nbr >= '0' && nbr <= '9')
      if (pre == 'w' || pre == 'g' || pre == 't') return pre;
  }
  return 0;
}

function get_elev_dir(x,y,z,d) {
  var yy = move_y(x,y,d);
  var xx = move_x(x,y,d);
  if (in_map(xx, yy)) {
    var z1 = get_elev(xx,yy);
    return z1 > z ? z1 : z;
  } else {
    return z;
  }
}
function get_terrain_fixup(x,y) {
  var z = get_elev(x,y);
  var terr = '' + z + get_elev_dir(x,y,z,1) + get_elev_dir(x,y,z,2) + get_elev_dir(x,y,z,3) +
          get_elev_dir(x,y,z,4) + get_elev_dir(x,y,z,5) + get_elev_dir(x,y,z,6);

  return terr;
}

