// Another stat keeper... this one for all items in the
// game hopefully.  - Radix 1996
// Version 1.0
 
inherit "/std/object.c";
 
#define SAVE "/save/"
 
mapping container_data, armour_data, weapon_data;
 
// Pouches, backpacks, ...
mapping query_container_data() { return container_data; }
// Armours...
mapping query_armour_data() { return armour_data; }
// Weapons...
mapping query_weapon_data() { return weapon_data; }
int query_prevent_shadow(object o) { return 1; }
 
void load_this_ob() {
     restore_object(SAVE+"item_info");
}
 
void save_this_ob() {
    save_object(SAVE+"item_info",1);
}
 
create()
{
   object::create();
   container_data = ([ ]);
   weapon_data = ([ ]);
   armour_data = ([ ]);
   load_this_ob();
   seteuid("Root");
}
 
dest_me()
{
   save_this_ob();
   destruct(this_object());
}
 
string crop_string(string longpa, int howlong) {
  string shorter;
  shorter = longpa[sizeof(longpa)-howlong..sizeof(longpa)];
  return shorter;
}
 
// Called from /global/creator/cmds/qc.c
int query_qc_perms(string name)
{
   string *rights = ({ "taniwha","kodiak" });
   rights += ({ "/d/aprior/master"->query_dom_lord() });
   return member_array(name, rights) != -1;
}
// Called from /global/creator/cmds/info.c 
int query_info_perms(string name, object obj)
{
   string dom = domain_origin(obj);
   mixed mas;
   if(!dom) return 0;   // /w/creator won't have data anyway
   mas = "/d/"+dom+"/master";
   return mas->valid_write(explode(real_filename(obj),"/"),name,0);
}
void display_item_properties(object ob)
{
   mapping m;
   int i;
   m = ob->query_properties();
   if(!sizeof(keys(m)))
      return ;
   write("Properties:\n   ");
   for(i=0; i<sizeof(keys(m)); i++)
      write(keys(m)[i]+" : "+m[keys(m)[i]]+"\n   ");
   write("\n");
   return;
}
/* container_data mapping:
     ([ "domain" : 
         ([ "path" : ({
                        max_weight,
                        enchant,
                        qc'ed,
                        qc'ed by,
                        comments
                     })
         ])
     ])
*/
void update_container(object ob)
{
   mapping obmap = ([ ]);
   mixed tmp = ({ });
   int caught = 0;
   string dom, file;
   if(!ob) 
      return;
   dom = domain_origin(ob);
   file = real_filename(ob);
   if(!dom || !file)
      return;
   obmap = container_data[dom];
   if(!m_sizeof(obmap)) obmap = ([ ]);
   tmp = obmap[file];
   if(!sizeof(tmp))
   {
      tmp = allocate(5);
      tmp[0] = ob->query_max_weight();
      tmp[1] = ob->query_enchant();
      tmp[2] = 0;
      tmp[3] = 0;
      tmp[4] = 0;
      obmap[file] = tmp;
      container_data[dom] = obmap;
      save_this_ob();
      return;
   }
   if(tmp[0] != ob->query_max_weight()) caught = 1;
   if(tmp[1] != ob->query_enchant()) caught = 1;
   if(caught)
   {
      tmp[2] = 0;
      tmp[3] = 0;
      obmap[file] = tmp;
      container_data[dom] = obmap;
      save_this_ob();
   }
   return;
}
 
// Called from /global/creator/cmds/qc.c
void qc_item_container(object ob)
{
   mapping obmap = ([ ]);
   mixed tmp = ({ });
   int caught = 0;
   string dom, file;
   if(!ob) 
      return;
   dom = domain_origin(ob);
   file = real_filename(ob);
   if(!dom || !file)
      return;
   obmap = container_data[dom];
   if(!m_sizeof(obmap)) obmap = ([ ]);
   tmp = obmap[file];
   if(!sizeof(tmp))
   {
      write("ERROR: Container has no data!\n");
      return;
   }
   tmp[2] = 1;
   tmp[3] = geteuid(this_player());
   obmap[file] = tmp;
   container_data[dom] = obmap;
   save_this_ob();
   write("File: "+file+" now QCed.\n");
   return;
}
void info_item_container(object ob)
{
   mapping obmap = ([ ]);
   mixed tmp = ({ });
   int caught = 0;
   string dom, file;
   if(!ob) 
      return;
   dom = domain_origin(ob);
   file = real_filename(ob);
   if(!dom || !file)
      return;
   obmap = container_data[dom];
   if(!m_sizeof(obmap)) obmap = ([ ]);
   tmp = obmap[file];
   if(!sizeof(tmp))
   {
      write("ERROR: Container has no data!\n");
      return;
   }
   write("Filename: "+file+"\n"+
        "Max weight: "+tmp[0]+"\n"
        "Enchant: "+tmp[1]+"\n"
        "QCed: ");
   if(tmp[2])
      write("Yes \nQCed by: "+capitalize(tmp[3])+"\n");
   else write("No\n");
   write("Comments:\n   ");
   if(tmp[4] == "NA") write("None.\n\n");
   else
      write(tmp[4]+"\n\n");
   return;
}
// Called from /global/creator/cmds/info.c
void domain_item_containers(string dom)
{
   string s;
   mixed obs, obmap;
   mixed tmp;
   int i;
   if(member_array(dom,get_dir("/d/")) == -1)
   {
      write(capitalize(dom)+" does not exist.\n");
      return;
   }
   obmap = container_data[dom];
   if(!obmap)
      obmap = ([ ]);
   obs = sort_array(keys(obmap),1);
   s = sprintf("%-40s %6s %6s %12s %6s\n",
      "Filename","Mx Wt","Enchnt","QCed by","Com'ed");
   if(!sizeof(obs))
      s+= sprintf("\nNo data.\n");
   for(i=0; i<sizeof(obs); i++)
   {
      tmp = explode(obs[i],"/");
      tmp = implode(tmp - ({ tmp[0], tmp[1] }),"/");
      s+= sprintf("%-35s%5d%5d ",
               tmp, obmap[obs[i]][0], obmap[obs[i]][1]); 
      s+= sprintf("%12s",obmap[obs[i]][3]);
      if(obmap[obs[i]][4]) 
         s += sprintf("%5s","Yes");
      s+= "\n";
   }
   write(s);
}
/* weapon_data mapping:
     ([ "domain" : 
         ([ "path" : ({
                        weight,
                        enchant,
                        rolls,
                        dice,
                        roll_add,
                        twohanded,
                        qc'ed by,
                        comments
                     })
         ])
     ])
*/
void update_weapon(object ob)
{
   mapping obmap = ([ ]);
   mixed tmp = ({ });
   int caught = 0;
   string dom, file;
   int *dmg;
   if(!ob) 
      return;
   dom = domain_origin(ob);
   file = real_filename(ob);
   if(!dom || !file)
      return;
   obmap = weapon_data[dom];
   if(!m_sizeof(obmap)) obmap = ([ ]);
   tmp = obmap[file];
   dmg = ob->query_damage_vals();
   if(!sizeof(tmp))
   {
      tmp = allocate(8);
      tmp[0] = ob->query_weight();
      tmp[1] = ob->query_enchant();
      tmp[2] = dmg[0];
      tmp[3] = dmg[1];
      tmp[4] = dmg[2];
      tmp[5] = ob->query_twohanded();
      tmp[6] = 0;
      tmp[7] = 0;
      obmap[file] = tmp;
      weapon_data[dom] = obmap;
      save_this_ob();
      return;
   }
   if(tmp[0] != ob->query_weight()) caught = 1;
   if(tmp[1] != ob->query_enchant()) caught = 1;
   if(tmp[2] != dmg[0]) caught = 1;
   if(tmp[3] != dmg[1]) caught = 1;
   if(tmp[4] != dmg[2]) caught = 1;
   if(tmp[5] != ob->query_twohanded()) caught = 1;
   if(caught)
   {
      tmp[6] = 0;
      obmap[file] = tmp;
      weapon_data[dom] = obmap;
      save_this_ob();
   }
   return;
}
 
// Called from /global/creator/cmds/qc.c
void qc_weapon(object ob)
{
   mapping obmap = ([ ]);
   mixed tmp = ({ });
   int caught = 0;
   string dom, file;
   if(!ob) 
      return;
   dom = domain_origin(ob);
   file = real_filename(ob);
   if(!dom || !file)
      return;
   obmap = weapon_data[dom];
   if(!m_sizeof(obmap)) obmap = ([ ]);
   tmp = obmap[file];
   if(!sizeof(tmp))
   {
      write("ERROR: Weapon has no data!\n");
      return;
   }
   tmp[6] = geteuid(this_player());
   obmap[file] = tmp;
   weapon_data[dom] = obmap;
   save_this_ob();
   write("File: "+file+" now QCed.\n");
   return;
}
void info_weapon(object ob)
{
   mapping obmap = ([ ]);
   mixed tmp = ({ });
   int caught = 0;
   string dom, file;
   if(!ob) 
      return;
   dom = domain_origin(ob);
   file = real_filename(ob);
   if(!dom || !file)
      return;
   obmap = weapon_data[dom];
   if(!m_sizeof(obmap)) obmap = ([ ]);
   tmp = obmap[file];
   if(!sizeof(tmp))
   {
      write("ERROR: Weapon has no data!\n");
      return;
   }
   write("Filename: "+file+"\n"+
        "Weight  : "+tmp[0]+"\n"
        "Enchant : "+tmp[1]+"\n"
        "Damage  : "+tmp[2]+"d"+tmp[3]+"+"+tmp[4]+"\n"
        "Hands   : ");
   if(ob->query_twohanded())
      write("2\n");
   else
      write("1\n");
   write("QCed : ");
   if(tmp[6])
      write("Yes \nQCed by: "+capitalize(tmp[6])+"\n");
   else 
      write("No\n");
   if(!tmp[5]) 
      if(file_size(file+".comments") > 0)
         write(read_file(file+".comments")+"\n\n");
      else
         write("None.\n\n");
   else
      write(tmp[5]+"\n\n");
   display_item_properties(ob);
   return;
}
// Called from /global/creator/cmds/info.c
void domain_weapons(string dom)
{
   string s;
   mixed obs, obmap;
   mixed tmp;
   int i;
   if(member_array(dom,get_dir("/d/")) == -1)
   {
      write(capitalize(dom)+" does not exist.\n");
      return;
   }
   obmap = weapon_data[dom];
   if(!obmap)
      obmap = ([ ]);
   obs = sort_array(keys(obmap),1);
   s = sprintf("%-40s %6s %6s %12s %6s\n",
      "Filename","Enchnt","Damage","QCed by","Com'ed");
   if(!sizeof(obs))
      s+= sprintf("\nNo data.\n");
   for(i=0; i<sizeof(obs); i++)
   {
      tmp = explode(obs[i],"/");
      tmp = implode(tmp - ({ tmp[0], tmp[1] }),"/");
      s+= sprintf("%-40s%5d ",
               tmp, obmap[obs[i]][1]); 
      s+= sprintf("%6s",obmap[obs[i]][2]+"d"+obmap[obs[i]][3]+"+"+
               obmap[obs[i]][4]);
      if(obmap[obs[i]][6])
         s+= sprintf("%12s",capitalize(obmap[obs[i]][6]));
      else
         s+= sprintf("%12s","");
      if(obmap[obs[i]][7]) 
         s += sprintf("%5s","Yes");
      s+= "\n";
   }
   this_player()->more_string(s);
}
/* armour_data mapping:
     ([ "domain" : 
         ([ "path" : ({
                        weight,
                        size,
            enchant,
                        ac,
                        qc'ed by,
                        comments
                     })
         ])
     ])
*/
void update_armour(object ob)
{
   mapping obmap = ([ ]);
   mixed tmp = ({ });
   int caught = 0;
   string dom, file;
   if(!ob) 
      return;
   dom = domain_origin(ob);
   file = real_filename(ob);
   if(!dom || !file)
      return;
   obmap = armour_data[dom];
   if(!m_sizeof(obmap)) obmap = ([ ]);
   tmp = obmap[file];
   if(!sizeof(tmp))
   {
      tmp = allocate(6);
      tmp[0] = ob->query_weight();
      tmp[1] = ob->query_size();
      tmp[2] = ob->query_enchant();
      tmp[3] = ob->query_ac();
      tmp[4] = 0;
      tmp[5] = 0;
      obmap[file] = tmp;
      armour_data[dom] = obmap;
      save_this_ob();
      return;
   }
   if(tmp[0] != ob->query_weight()) 
   {
      caught = 1;
      tmp[0] = ob->query_weight();
   }
   if(tmp[1] != ob->query_size()) 
   {
      caught = 1;
      tmp[1] = ob->query_size();
   }
   if(tmp[2] != ob->query_enchant()) 
   {
      caught = 1;
      tmp[2] = ob->query_enchant();
   }
   if(tmp[3] != ob->query_ac()) 
   {
      caught = 1;
      tmp[3] = ob->query_ac();
   }
   if(caught)
   {
      if(this_player() && this_player()->query_creator() && tmp[4])
         write("\nThis item needs to be QCed again.\n");
      tmp[4] = 0;
      obmap[file] = tmp;
      armour_data[dom] = obmap;
      save_this_ob();
   }
   return;
}
 
// Called from /global/creator/cmds/qc.c
void qc_armour(object ob)
{
   mapping obmap = ([ ]);
   mixed tmp = ({ });
   string dom, file;
   if(!ob) 
      return;
   dom = domain_origin(ob);
   file = real_filename(ob);
   if(!dom || !file)
      return;
   obmap = armour_data[dom];
   if(!m_sizeof(obmap)) obmap = ([ ]);
   tmp = obmap[file];
   if(!sizeof(tmp))
   {
      write("ERROR: Armour has no data!\n");
      return;
   }
   tmp[4] = geteuid(this_player());
   obmap[file] = tmp;
   armour_data[dom] = obmap;
   save_this_ob();
   write("File: "+file+" now QCed.\n");
   return;
}
// Called from /global/creator/cmds/info.c
void info_armour(object ob)
{
   mapping obmap = ([ ]);
   mixed tmp = ({ });
   string dom, file;
   if(!ob) 
      return;
   dom = domain_origin(ob);
   file = real_filename(ob);
   if(!dom || !file)
      return;
   obmap = armour_data[dom];
   if(!m_sizeof(obmap)) obmap = ([ ]);
   tmp = obmap[file];
   if(!sizeof(tmp))
   {
      write("ERROR: Armour has no data!\n");
      return;
   }
   write("Filename: "+file+"\n"+
        "Weight  : "+tmp[0]+"\n"
        "Size    : "+tmp[1]+"\n"
        "Enchant : "+tmp[2]+"\n"
        "AC      : "+tmp[3]+"\n"
        "QCed    : ");   
   if(tmp[4])
      write("Yes \nQCed by : "+capitalize(tmp[4])+"\n");
   else 
      write("No\n");
   write("Comments:\n   ");
   if(!tmp[5]) 
      if(file_size(file+".comments") > 0)
         write(read_file(file+".comments")+"\n\n");
      else
         write("None.\n\n");
   else
      write(tmp[5]+"\n\n");
   display_item_properties(ob);
   return;
}
// Called from /global/creator/cmds/info.c
void domain_armours(string dom)
{
   string s;
   mixed obs, obmap;
   mixed tmp;
   int i;
   if(member_array(dom,get_dir("/d/")) == -1)
   {
      write(capitalize(dom)+" does not exist.\n");
      return;
   }
   obmap = armour_data[dom];
   if(!obmap)
      obmap = ([ ]);
   obs = sort_array(keys(obmap),1);
   s = sprintf("%-40s%4s%4s%4s%5s%12s%10s\n",
      "Filename","Wt","Sz","AC","Ench","QCed by","Commented");
   if(!sizeof(obs))
      s+= sprintf("\nNo data.\n");
   for(i=0; i<sizeof(obs); i++)
   {
      tmp = explode(obs[i],"/");
      tmp = implode(tmp - ({ tmp[0], tmp[1] }),"/");
      s+= sprintf("%-40s%4d",tmp, obmap[obs[i]][0]); 
      s+= sprintf("%4d%4d",obmap[obs[i]][1],obmap[obs[i]][3]);
      s+= sprintf("%5d",obmap[obs[i]][2]);
      if(stringp(obmap[obs[i]][4]))
         s+= sprintf("%12s",capitalize(obmap[obs[i]][4]));
      else
         s+= sprintf("%12s","");
      if(stringp(obmap[obs[i]][5]))
         s+= sprintf("%10s","Yes");
      else
         s+= sprintf("%10s","No");
      s+= "\n";
   }
   this_player()->more_string(s);
}