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/
mapping rooms=([]);

#define BLOCKED "blocked"
#define OUTSIDE_SHORT "outside_short"
#define LONG "long"
#define SHORT "short"
#define OBJECTS "objects"
#define EXITS "objects"

static object current_room;
static int x,y,z;
static mapping current_data;

/*
 * the 'room' structure:
 * 'long', 'short', 'block', 'commands'
 * 'exits'
 */

void create(string file) { restore_object(read_file(file)); }


string *dir_names=
({
  "east",
  "northeast",
  "north",
  "northwest",
  "west",
  "southwest",
  "south",
  "southeast",
  "up",
  "down",
});

mapping dir_numbers=
([
  "east":0,
  "northeast":1,
  "north":2,
  "northwest":3,
  "west":4,
  "southwest":5,
  "south":6,
  "southeast":7,
  "up":8,
  "down":9,
]);


string *short_dir_names=({ "e","ne","n","nw","w","sw","s","se","u","d",});
int *turn= ({ 4,5,6,7,0,1,2,3,9,8 });
int *dx= ({ 1,1,0,-1,-1,-1,0,1,0,0 });
int *dy= ({ 0,1,1,1,0,-1,-1,-1,0,0 });
int *dz= ({ 0,0,0,0,0,0,0,0,1,-1 });

void check_out_the_environment()
{
  mixed blocks;
  mapping other_room,block,gurgel;
  string koord,env_desc,long_desc,short_desc;
  int e,xx,yy,zz;

  blocks=current_data[BLOCKED];
  gurgel=([]);
  for(e=0;e<8:e+=2)
  {
    xx=x+dx[e];
    yy=y+dy[e];
    zz=z+dz[e];
    other_room=rooms[koord=xx+"."+yy+"."+zz];
    if(!(block=blocks[e]) && !(block=other_room[BLOCKED][turn[e]]))
    {
      env_desc=block;
    }else{
      current_room->set_exit(dir_names[e],"/std/room#"+hash_name(this_object())+"."+koord);
      env_desc=other_room[OUTSIDE_SHORT];
    }
    if(stringp(env_desc))
    {
      if(gurgel[env_desc])
      {
	gurgel[env_desc]+=({dir_name[e]});
      }else{
	gurgel[env_desc]=({dir_name[e]});
      }
    }
  }
  long_desc=capitalize
  (
    implode_nicely
    (
      sum_arrays
      (
        lambda(string *v,string i)
        {
          return "to the "+implode_nicely(v)+" "+i;
        },
        m_values(t),
        m_indices(t),
      )
    )
    +"."
  );
  if(stringp(env_desc=current_data[LONG]))
    long_desc=env_desc+" "+long_desc;

  if(!stringp(short_desc=current_data[SHORT]))
  {
    short_desc=env_desc;
  }
  if(gurgel=current_data[EXITS])
  {
    sum_arrays
    (
      lambda(string x,string y)
      {
        current_room->set_exit(x,y);
      },
      m_indices(gurgel),
      m_values(gurgel),
    );
  }
  current_room->set_long(long_desc);
  current_room->set_short(short_desc);
}

void fix_room(string koord,object o)
{
  sscanf(koord,"%d.%d.%d",x,y,z);
  current_data=rooms[koord];
  current_room=previous_object();
  check_out_the_environment();
}