 var FEAT_NONE           = 0x00;
 var FEAT_FLOOR          = 0x01;
 var FEAT_INVIS          = 0x02;
 var FEAT_GLYPH          = 0x03;
 var FEAT_OPEN           = 0x04;
 var FEAT_BROKEN         = 0x05;
 var FEAT_LESS           = 0x06;
 var FEAT_MORE           = 0x07;
 var FEAT_PATH           = 0x08;
 var FEAT_TRAP_HEAD      = 0x10;
 var FEAT_TRAP_TAIL      = 0x1F;
 var FEAT_DOOR_HEAD      = 0x20;
 var FEAT_DOOR_TAIL      = 0x2F;
 var FEAT_SECRET         = 0x30;
 var FEAT_RUBBLE         = 0x31;
 var FEAT_MAGMA          = 0x32;
 var FEAT_QUARTZ         = 0x33;
 var FEAT_MAGMA_H        = 0x34;
 var FEAT_QUARTZ_H       = 0x35;
 var FEAT_MAGMA_K        = 0x36;
 var FEAT_QUARTZ_K       = 0x37;
 var FEAT_WALL_EXTRA     = 0x38;
 var FEAT_WALL_INNER     = 0x39;
 var FEAT_WALL_OUTER     = 0x3A;
 var FEAT_WALL_SOLID     = 0x3B;
 var FEAT_PERM_BUILDING  = 0x3C;
 var FEAT_PERM_INNER     = 0x3D;
 var FEAT_PERM_OUTER     = 0x3E;
 var FEAT_PERM_SOLID     = 0x3F;
 var FEAT_MINOR_GLYPH    = 0x40;
 var FEAT_PATTERN_START  = 0x41;
 var FEAT_PATTERN_1      = 0x42;
 var FEAT_PATTERN_2      = 0x43;
 var FEAT_PATTERN_3      = 0x44;
 var FEAT_PATTERN_4      = 0x45;
 var FEAT_PATTERN_END    = 0x46;
 var FEAT_PATTERN_OLD    = 0x47;
 var FEAT_PATTERN_XTRA1  = 0x48;
 var FEAT_PATTERN_XTRA2  = 0x49;
 var FEAT_SHOP_HEAD      = 0x4A;
 var FEAT_SHOP_TAIL      = 0x55;
 var FEAT_GATE           = 0x60;
 var FEAT_WATER          = 0x61;
 var FEAT_TREE           = 0x62;
 var FEAT_BUSH           = 0x63;

 var CAVE_MARK           = 0x01;    /* memorized feature */
 var CAVE_GLOW           = 0x02;    /* self-illuminating */
 var CAVE_ICKY           = 0x04;    /* part of a vault */
 var CAVE_ROOM           = 0x08;    /* part of a room */
 var CAVE_LITE           = 0x10;    /* lite flag  */
 var CAVE_VIEW           = 0x20;    /* view flag */
 var CAVE_TEMP           = 0x40;    /* temp flag */
 var CAVE_XTRA           = 0x80;    /* misc flag */


var cave;


function initCave(){
  cave = new Array();
  for (x = 0; x < MAX_WID; x++){
    cave[x] = new Array();
    for (y = 0; y < MAX_HGT; y++)
      cave[x][y] = createCell();
  }
  cave.initialize = _initialize;
  cave.placeMonsters = _placeMonsters;
  cave.initialize();
}

function _placeMonsters(){}

function _initialize(){
  cave.dungeonReady = false;
  /* Mega-Hack -- no panel yet */
  cave.panelRowMin = 0;
  cave.panelRowMax = 0;
  cave.panelColMin = 0;
  cave.panelColMax = 0;
  /* Reset the monster generation level */
  cave.monsterLevel = population.level = player.dungeonLevel;
  /* Reset the object generation level */
  cave.objectLevel = loot.level = player.dungeonLevel;

  for (x = 0; x < MAX_WID; x++)
    for (y = 0; y < MAX_HGT; y++){
      cave[x][y].feat = FEAT_NONE; //FEAT_NONE;//FEAT_FLOOR;
      cave[x][y].info = 0; //Hmmmm
  }


}


//cave _floor_bold -> cave[x,y].isLevel()
//Level means flat in this case
function _isLevel( x , y ){
  return (((!(this.feat & 0x20)) && (!(this.feat == FEAT_BUSH))) || (this.feat == FEAT_WATER));
}


//cave_ empty_bold -> !cave[x,y].isOccupied()
// Line 1 -- forbid doors, rubble, seams, walls
// Line 2 -- forbid normal monsters
// Line 3 -- forbid the player
function _isOccupied(x,y){
  return !( this.isLevel(x,y) && this.m_idx == 0 && ( player.x != x || player.y !=y ) );
}


//cave _clean_bold -> cave[x,y].isClean()
function _isClean(x,y){
  return ( this.feat == FEAT_FLOOR && this.o_idx == 0 );
}


//cave _naked_bold -> cave[x,y].isEmpty()
// Line 1 -- forbid non-floors
// Line 2 -- forbid normal objects
// Line 3 -- forbid normal monsters
// Line 4 -- forbid the player
function _isEmpty(x,y){
	return ( this.feat == FEAT_FLOOR && this.o_idx == 0 && this.m_idx == 0 && ( player.x != x || player.y !=y ) );
}

function createCell(){

  var cell   = new Object();
  cell.info  = 0;  /* Byte Hack -- cave flags */
	cell.feat  = 0;  /* Byte Hack -- feature type */
	cell.o_idx = 0;  /* Int Object in this cell */
	cell.m_idx = 0;  /* Int Monster in this cell */
  cell.isEmpty = _isEmpty;
  cell.isLevel = _isLevel;
  cell.isOccupied = _isOccupied;
  cell.isClean = _isClean;
  return cell;

}
