lpc4/lib/
lpc4/lib/doc/efun/
lpc4/lib/doc/lfun/
lpc4/lib/doc/operators/
lpc4/lib/doc/simul_efuns/
lpc4/lib/doc/types/
lpc4/lib/etc/
lpc4/lib/include/
lpc4/lib/include/arpa/
lpc4/lib/obj/d/
lpc4/lib/save/
lpc4/lib/secure/
lpc4/lib/std/
lpc4/lib/std/living/
#include "map.h"
inherit "std/room";

int x,y,z;
int room_type;
int zipcode;
mixed zipcodes;
int cache_flow;
int height;
string name;
mixed *extra_data;

void reset()
{
  if(!first_inventory()) destruct();
}

string get_map_dir_nr(int i)
{
  switch(i)
  {
  case 0: return "north";
  case 1: return "south";
  case 2: return "east";
  case 3: return "west";
  case 4: return "up";
  case 5: return "down";
  }
}

int get_map_nr_dir(string i)
{
  switch(i)
  {
  case "north": return 0;
  case "south": return 1;
  case "east": return 2;
  case "west": return 3;
  case "up": return 4;
  case "down": return 5;
  default: return -1;
  }
}

int get_dx(int i)
{
  switch(i)
  {
  case 2: return 1;
  case 3: return -1;
  }
}

int get_dy(int i)
{
  switch(i)
  {
  case 0: return 1;
  case 1: return -1;
  }
}

int get_dz(int i)
{
  switch(i)
  {
  case 4: return 1;
  case 5: return -1;
  }
}

string create(string s)
{
  mixed *data,*zipdata;
  ::create(s);
  unpack(s,x,y,z);
  data=(mixed *)MAPBASE->get_koord_data(x,y,z);
  zipcodes=data[ROOM_ZIPCODE];
  if(intp(zipcodes)) zipcode=zipcodes; else zipcode=zipcodes[0];
  zipcode=data[ROOM_ZIPCODE];
  cache_flow=data[ROOM_CACHE_FLOW];
  height=data[ROOM_LEVEL];
  zipdata=(mixed *)MAPBASE->get_zip_data(zipcode);
  if(zipdata)
  {
    room_type=zipdata[ZIP_TYPE];
    name=zipdata[ZIP_NAME];
    extra_data=zipdata[ZIP_DATA];
  }else{
    room_type=R_Dummy;
    name="The void";
    extra_data=0;
  }
  switch(room_type)
  {
  case R_Water: set_short("In water"); break;
  case R_House: set_short("Inside"); break;
  case R_Forest: set_short("In a forest"); break;
  case R_Street: set_short("On a street"); break;
  case R_Dummy: set_short("Nowhere"); break;
  case R_Air: set_short("Open air"); break;
  case R_Ground: set_short("Down under"); break;
  case R_Field: set_short("Field"); break;
  }
  if(name) set_short(name);
}

string query_exit_desc(string dir)
{
  switch(room_type)
  {
  case R_Water:
    return "you see water";

  case R_House:
    return "there is house";

  case R_Forest:
    return "you see a forest";

  case R_Street:
    return "the street continues";

  case R_Dummy:
    return 0;

  case R_Air:
    return "there is open air";

  case R_Ground:
    return "you see a wall of dirt";

  case R_Field:
    return "there is a field";
  }
}

string get_numbered_room_name(int i)
{
  return file_name()+"#"+pack(x+get_dx(i),y+get_dy(i),z+get_dz(i));
}

string collect_environment_desc(int flag)
{
  mapping t;
  string q,dir;
  int e;
  t=([]);
  for(e=0;e<4;e++)
  {
    dir=get_map_dir_nr(e);
    q=get_numbered_room_name(e);
    if(query_is_exit(dir) && q->query_is_exit(opposite_dir(dir)))
       set_exit(dir,q);

    q=(string)q->query_exit_desc(dir);
    if(q)
    {
      if(t[q])
      {
	t[q]+=({get_map_dir_nr(e)});
      }else{
	t[q]=({get_map_dir_nr(e)});
      }
    }
  }
  if(!m_sizeof(t)) return 0;
  return capitalize
  (
    implode_nicely
    (
      sum_arrays
      (
        lambda(string *v,string i)
        {
          return "to the "+implode_nicely(v)+" "+i;
        },
        m_values(t),
        m_indices(t),
      )
    )
    +"."
  );
}

int query_is_exit(string dir)
{
  switch(room_type)
  {
  case R_Water:
  case R_House:
  case R_Dummy:
  case R_Air:
  case R_Ground:
    return 0;

  case R_Forest:
  case R_Street:
  case R_Field:
    return 1;
  }
}

void build_desc()
{
  string *t;
  t=({});
  switch(room_type)
  {
  case R_Water:
    t+=({"You are standing in deep water."});
    break;

  case R_House:
    if(name)
      t+=({"You are inside a house called "+name+"."});
    else
      t+=({"You are inside."});
    break;

  case R_Forest:
    if(name)
      t+=({"You are in a the forest "+name+"."});
    else
      t+=({"You are in a forest."});
    break;

  case R_Street:
    if(name)
      t+=({"You are on "+name+"."});
    else
      t+=({"You are on a street."});
    break;

  case R_Dummy:
    t+=({"You are in a big void, in fact you really shouldn't be here..."});
    break;

  case R_Air:
    t+=({"You are floating around in open air, strange.."});
    break;
    
  case R_Ground:
    t+=({"You're dead! (or at least buried)"});
    break;

  case R_Field:
    t+=({"You're on a large field."});
    break;
  }
  t+=({collect_environment_desc(0)});
  set_long(implode(t," "));
}

void init()
{
  if(!exits)
  {
    build_desc();
  }
  ::init();
}

int query_room_type() { return room_type; }
int query_x_koor() { return x; }
int query_y_koor() { return y; }
int query_z_koor() { return z; }
int query_zipcode() { return zipcode; }
int query_cache_flow() { return cache_flow; }
int query_height() { return height; }
string query_name() { return name; }
mixed *query_extra_data() { return extra_data; }