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/
inherit "std/object";
inherit "inherit/property";
#pragma strict_types
#pragma save_types

string short_desc,lockee;
mapping items,taste,smell,sound,feel,commands;
string *names,*pl_names,*adj;

string short()
{
  return short_desc;
}

int com(string a,string b,string c,string d,string e,string f,string g,string h)
{
  mixed *data;
  data=commands[query_verb()];
  return get_function(data[0],data[1])(a,b,c,d,e,f,g,h);
}

void init()
{
  int e;
  mixed *a,*b;
  ::init();
  if(!commands) return;
  a=m_indices(commands); b=m_values(commands);
  for(;e<sizeof(a);e++) add_action(a[e],com,0);
}

mapping general_set(mixed item,mixed desc,mapping map)
{
  string e;
  if(lockee) return map;
  if(!map) map=([]);
  if(pointerp(item)) 
  {
    foreach(item,e) map[e]=desc;
  }else
    map[item]=desc;
  return map;
}

mapping general_remove(mixed item,mapping map)
{
  int e;
  if(lockee) return map;
  if(!map) return 0;
  if(pointerp(item))
    map=map-mkmapping(item,item);
  else
    map=m_delete(map,items);
  if(m_sizeof(map)) return map;
  return 0;
}

mixed general_get(mixed item,mapping map) { return map?map[item]:0; }

/**** Configuration ****/
void lock() { if(!lockee) lockee=file_name(previous_object()); }
void unlock() { if(file_name(previous_object())==lockee) lockee=0; }

void set_item(mixed item,string desc) { items=general_set(item,desc,items); }
void set_smell(mixed item,string desc) { smell=general_set(item,desc,smell); }
void set_sound(mixed item,string desc) { sound=general_set(item,desc,sound); }
void set_feel(mixed item,string desc) { feel=general_set(item,desc,feel); }
void set_taste(mixed item,string desc) { taste=general_set(item,desc,taste); }

void remove_item(mixed item) { items=general_remove(item,items); }
void remove_smell(mixed item) { smell=general_remove(item,smell); }
void remove_sound(mixed item) { sound=general_remove(item,sound); }
void remove_feel(mixed item) { feel=general_remove(item,feel); }
void remove_taste(mixed item) { taste=general_remove(item,taste); }

void set_short(string s) { if(!lockee) short_desc=s; }
void set_long(string long) { set_item(0,long); }

void set_command(string co,string fun,mixed ob)
{
  commands=general_set(co,({ob,fun}),commands);
}
void remove_command(string co)
{
  commands=general_remove(co,commands);
}

void update_actions()
{
  object o;
  if(environment()) move_object(environment());
  foreach(all_inventory(),o) o->update_actions();
}

/**** get ****/
string get_item(mixed item) { return items?items[item]:0; }
string get_feel(mixed item) { return feel?feel[item]:0; }
string get_smell(mixed item) { return smell?smell[item]:0; }
string get_sound(mixed item) { return sound?sound[item]:0; }
string get_taste(mixed item) { return taste?taste[item]:0; }

/**** query ****/
string query_short() { return short_desc; }
string query_long() { return get_item(0); }
mapping query_item() { return items; }
mapping query_smell() { return smell; }
mapping query_sound() { return sound; }
mapping query_feel() { return feel; }
mapping query_taste() { return taste; }

/***** Some basic stuff *****/
varargs void add_name(string name,string pl)
{
  if(lockee) return;
  if(!names) names=pl_names=({});
  if(!pl) pl=pluralize(name);
  names+=({name});
  pl_names+=({pl});
}

void set_name(string n) { add_name(n); }

void add_adjective(string ad)
{
  if(lockee) return;
  if(!adj) adj=({});
  adj+=({ad});
}

varargs void remove_name(string name,string pl)
{
  if(lockee || !names) return;
  if(!pl) pl=pluralize(name);
  names-=({name});
  pl_names-=({pl});
}

int id(string s)
{
  if(pointerp(names) && member_array(s,names)!=-1) return 1;
}

string *query_name() { return names[0]; }
string *query_names() { return names; }
string *parse_plyral_names() { return pl_names; }
string *parse_adjectives() { return adj; }

/* No light check yet */
string long(string id,int perc)
{
  return query_long();
}

int query_get() { return !query_property("no_get"); }
int query_drop() { return !query_property("no_drop"); }