final_realms_fluffos_v1/
final_realms_fluffos_v1/bin/
final_realms_fluffos_v1/fluffos-2.9-ds2.11/
final_realms_fluffos_v1/fluffos-2.9-ds2.11/ChangeLog.old/
final_realms_fluffos_v1/fluffos-2.9-ds2.11/Win32/
final_realms_fluffos_v1/fluffos-2.9-ds2.11/compat/
final_realms_fluffos_v1/fluffos-2.9-ds2.11/compat/simuls/
final_realms_fluffos_v1/fluffos-2.9-ds2.11/include/
final_realms_fluffos_v1/fluffos-2.9-ds2.11/testsuite/
final_realms_fluffos_v1/fluffos-2.9-ds2.11/testsuite/clone/
final_realms_fluffos_v1/fluffos-2.9-ds2.11/testsuite/command/
final_realms_fluffos_v1/fluffos-2.9-ds2.11/testsuite/data/
final_realms_fluffos_v1/fluffos-2.9-ds2.11/testsuite/etc/
final_realms_fluffos_v1/fluffos-2.9-ds2.11/testsuite/include/
final_realms_fluffos_v1/fluffos-2.9-ds2.11/testsuite/inherit/
final_realms_fluffos_v1/fluffos-2.9-ds2.11/testsuite/inherit/master/
final_realms_fluffos_v1/fluffos-2.9-ds2.11/testsuite/log/
final_realms_fluffos_v1/fluffos-2.9-ds2.11/testsuite/single/
final_realms_fluffos_v1/fluffos-2.9-ds2.11/testsuite/single/tests/compiler/
final_realms_fluffos_v1/fluffos-2.9-ds2.11/testsuite/single/tests/efuns/
final_realms_fluffos_v1/fluffos-2.9-ds2.11/testsuite/single/tests/operators/
final_realms_fluffos_v1/fluffos-2.9-ds2.11/testsuite/u/
final_realms_fluffos_v1/fluffos-2.9-ds2.11/tmp/
final_realms_fluffos_v1/fluffos-2.9-ds2.11/windows/
final_realms_fluffos_v1/lib/baseobs/guilds/
final_realms_fluffos_v1/lib/baseobs/misc/
final_realms_fluffos_v1/lib/baseobs/races/shadows/
final_realms_fluffos_v1/lib/cmds/god/
final_realms_fluffos_v1/lib/cmds/handlers/
final_realms_fluffos_v1/lib/cmds/handlers/cmds/
final_realms_fluffos_v1/lib/d/heaven/
final_realms_fluffos_v1/lib/d/heaven/heaven/ave/
final_realms_fluffos_v1/lib/d/mudlib/
final_realms_fluffos_v1/lib/d/newbie/
final_realms_fluffos_v1/lib/d/newbie/docs/
final_realms_fluffos_v1/lib/d/newbie/drow/armour/
final_realms_fluffos_v1/lib/d/newbie/drow/items/
final_realms_fluffos_v1/lib/d/newbie/drow/mobs/
final_realms_fluffos_v1/lib/d/newbie/drow/oldmobs/
final_realms_fluffos_v1/lib/d/newbie/drow/weapons/
final_realms_fluffos_v1/lib/d/newbie/duergar/weapons/
final_realms_fluffos_v1/lib/d/newbie/dwarf/weapons/
final_realms_fluffos_v1/lib/d/newbie/elf/cafe/
final_realms_fluffos_v1/lib/d/newbie/elf/chars/equip/
final_realms_fluffos_v1/lib/d/newbie/elf/items/armours/
final_realms_fluffos_v1/lib/d/newbie/elf/items/obj/
final_realms_fluffos_v1/lib/d/newbie/elf/items/weapons/
final_realms_fluffos_v1/lib/d/newbie/elf/quick_fix/
final_realms_fluffos_v1/lib/d/newbie/gnome/armour/
final_realms_fluffos_v1/lib/d/newbie/gnome/buildings/
final_realms_fluffos_v1/lib/d/newbie/gnome/items/
final_realms_fluffos_v1/lib/d/newbie/gnome/npcs/clones/
final_realms_fluffos_v1/lib/d/newbie/gnome/rooms/northrooms/
final_realms_fluffos_v1/lib/d/newbie/gnome/weapons/
final_realms_fluffos_v1/lib/d/newbie/goblin/armour/
final_realms_fluffos_v1/lib/d/newbie/goblin/items/
final_realms_fluffos_v1/lib/d/newbie/grads/log/
final_realms_fluffos_v1/lib/d/newbie/grads/npcs/
final_realms_fluffos_v1/lib/d/newbie/grads/rooms/
final_realms_fluffos_v1/lib/d/newbie/grads/rooms/cave1/
final_realms_fluffos_v1/lib/d/newbie/grads/temp/
final_realms_fluffos_v1/lib/d/newbie/guests/weapons/
final_realms_fluffos_v1/lib/d/newbie/half-elf/items/
final_realms_fluffos_v1/lib/d/newbie/half-elf/newroomss/
final_realms_fluffos_v1/lib/d/newbie/half-elf/rooms/
final_realms_fluffos_v1/lib/d/newbie/half-elf/rooms/castle/
final_realms_fluffos_v1/lib/d/newbie/half-elf/rooms/drows/
final_realms_fluffos_v1/lib/d/newbie/half-elf/rooms/savannah/
final_realms_fluffos_v1/lib/d/newbie/half-elf/rooms/secret/
final_realms_fluffos_v1/lib/d/newbie/half-elf/rooms/town/
final_realms_fluffos_v1/lib/d/newbie/halfling/
final_realms_fluffos_v1/lib/d/newbie/halfling/misc/
final_realms_fluffos_v1/lib/d/newbie/halfling/rooms/cave/
final_realms_fluffos_v1/lib/d/newbie/human/
final_realms_fluffos_v1/lib/d/newbie/human/armour/
final_realms_fluffos_v1/lib/d/newbie/human/monsters/
final_realms_fluffos_v1/lib/d/newbie/human/obj/
final_realms_fluffos_v1/lib/d/newbie/human/weapons/
final_realms_fluffos_v1/lib/d/newbie/lizard/armour/
final_realms_fluffos_v1/lib/d/newbie/lizard/items/
final_realms_fluffos_v1/lib/d/newbie/lizard/underwater/
final_realms_fluffos_v1/lib/d/newbie/lizard/weapons/
final_realms_fluffos_v1/lib/d/newbie/logs/
final_realms_fluffos_v1/lib/d/newbie/new_halfelf/
final_realms_fluffos_v1/lib/d/newbie/new_halfelf/npcs/
final_realms_fluffos_v1/lib/d/newbie/newdrow/npcs/
final_realms_fluffos_v1/lib/d/newbie/newdrow/rooms/
final_realms_fluffos_v1/lib/d/newbie/newelf/
final_realms_fluffos_v1/lib/d/newbie/newelf/chars/
final_realms_fluffos_v1/lib/d/newbie/newelf/npcs/
final_realms_fluffos_v1/lib/d/newbie/newelf/npcs/recopied/
final_realms_fluffos_v1/lib/d/newbie/newelf/obj/
final_realms_fluffos_v1/lib/d/newbie/newelf/quest_docs./
final_realms_fluffos_v1/lib/d/newbie/newken/
final_realms_fluffos_v1/lib/d/newbie/newken/chars/
final_realms_fluffos_v1/lib/d/newbie/newken/misc/
final_realms_fluffos_v1/lib/d/newbie/newken/npcs/
final_realms_fluffos_v1/lib/d/newbie/newken/obj/
final_realms_fluffos_v1/lib/d/newbie/newliz/
final_realms_fluffos_v1/lib/d/newbie/newliz/cave/
final_realms_fluffos_v1/lib/d/newbie/newliz/npcs/
final_realms_fluffos_v1/lib/d/newbie/orc/items/misc/
final_realms_fluffos_v1/lib/d/newbie/orc/items/weapons/
final_realms_fluffos_v1/lib/d/newbie/orc/tower/
final_realms_fluffos_v1/lib/d/vehicle/
final_realms_fluffos_v1/lib/doc/
final_realms_fluffos_v1/lib/doc/driver/
final_realms_fluffos_v1/lib/doc/driver/concepts/
final_realms_fluffos_v1/lib/doc/driver/driver/
final_realms_fluffos_v1/lib/doc/driver/efuns/arrays/
final_realms_fluffos_v1/lib/doc/driver/efuns/bitstrings/
final_realms_fluffos_v1/lib/doc/driver/efuns/communication/
final_realms_fluffos_v1/lib/doc/driver/efuns/core/
final_realms_fluffos_v1/lib/doc/driver/efuns/debugging/
final_realms_fluffos_v1/lib/doc/driver/efuns/filesystem/
final_realms_fluffos_v1/lib/doc/driver/efuns/interactive/
final_realms_fluffos_v1/lib/doc/driver/efuns/mappings/
final_realms_fluffos_v1/lib/doc/driver/efuns/objects/
final_realms_fluffos_v1/lib/doc/driver/efuns/security/
final_realms_fluffos_v1/lib/doc/driver/efuns/strings/
final_realms_fluffos_v1/lib/doc/driver/efuns/system/
final_realms_fluffos_v1/lib/doc/driver/efuns/types/
final_realms_fluffos_v1/lib/doc/driver/lpc/constructs/
final_realms_fluffos_v1/lib/doc/driver/lpc/types/
final_realms_fluffos_v1/lib/doc/driver/platforms/
final_realms_fluffos_v1/lib/doc/lpc/
final_realms_fluffos_v1/lib/doc/mail/
final_realms_fluffos_v1/lib/doc/man/
final_realms_fluffos_v1/lib/doc/man/html/
final_realms_fluffos_v1/lib/doc/man/html/applies/
final_realms_fluffos_v1/lib/doc/man/html/applies/parsing/
final_realms_fluffos_v1/lib/doc/man/html/driver/
final_realms_fluffos_v1/lib/doc/man/html/efuns/
final_realms_fluffos_v1/lib/doc/man/html/efuns/arrays/
final_realms_fluffos_v1/lib/doc/man/html/efuns/buffers/
final_realms_fluffos_v1/lib/doc/man/html/efuns/compile/
final_realms_fluffos_v1/lib/doc/man/html/efuns/floats/
final_realms_fluffos_v1/lib/doc/man/html/efuns/functions/
final_realms_fluffos_v1/lib/doc/man/html/efuns/general/
final_realms_fluffos_v1/lib/doc/man/html/efuns/numbers/
final_realms_fluffos_v1/lib/doc/man/html/efuns/parsing/
final_realms_fluffos_v1/lib/doc/man/local/
final_realms_fluffos_v1/lib/doc/man/local/applies/
final_realms_fluffos_v1/lib/doc/man/local/applies/interactive/
final_realms_fluffos_v1/lib/doc/man/local/applies/master/
final_realms_fluffos_v1/lib/doc/man/local/concepts/
final_realms_fluffos_v1/lib/doc/man/local/defines/
final_realms_fluffos_v1/lib/doc/man/local/driver/
final_realms_fluffos_v1/lib/doc/man/local/efuns/
final_realms_fluffos_v1/lib/doc/man/local/efuns/arrays/
final_realms_fluffos_v1/lib/doc/man/local/efuns/buffers/
final_realms_fluffos_v1/lib/doc/man/local/efuns/calls/
final_realms_fluffos_v1/lib/doc/man/local/efuns/compile/
final_realms_fluffos_v1/lib/doc/man/local/efuns/filesystem/
final_realms_fluffos_v1/lib/doc/man/local/efuns/floats/
final_realms_fluffos_v1/lib/doc/man/local/efuns/functions/
final_realms_fluffos_v1/lib/doc/man/local/efuns/general/
final_realms_fluffos_v1/lib/doc/man/local/efuns/interactive/
final_realms_fluffos_v1/lib/doc/man/local/efuns/internals/
final_realms_fluffos_v1/lib/doc/man/local/efuns/mappings/
final_realms_fluffos_v1/lib/doc/man/local/efuns/mudlib/
final_realms_fluffos_v1/lib/doc/man/local/efuns/numbers/
final_realms_fluffos_v1/lib/doc/man/local/efuns/objects/
final_realms_fluffos_v1/lib/doc/man/local/efuns/parsing/
final_realms_fluffos_v1/lib/doc/man/local/efuns/sockets/
final_realms_fluffos_v1/lib/doc/man/local/efuns/strings/
final_realms_fluffos_v1/lib/doc/man/local/efuns/system/
final_realms_fluffos_v1/lib/doc/man/local/historical/
final_realms_fluffos_v1/lib/doc/man/local/lfun/QC/
final_realms_fluffos_v1/lib/doc/man/local/lfun/events/
final_realms_fluffos_v1/lib/doc/man/local/lfun/monster/
final_realms_fluffos_v1/lib/doc/man/local/lfun/properties/
final_realms_fluffos_v1/lib/doc/man/local/lpc/
final_realms_fluffos_v1/lib/doc/man/local/lpc/constructs/
final_realms_fluffos_v1/lib/doc/man/local/lpc/types/
final_realms_fluffos_v1/lib/doc/man/local/standards/
final_realms_fluffos_v1/lib/doc/man/local/tutorials/
final_realms_fluffos_v1/lib/doc/man/local/tutorials/basic/
final_realms_fluffos_v1/lib/doc/man/local/tutorials/intermediate/
final_realms_fluffos_v1/lib/doc/man/mudos/applies/
final_realms_fluffos_v1/lib/doc/man/mudos/applies/interactive/
final_realms_fluffos_v1/lib/doc/man/mudos/applies/parsing/
final_realms_fluffos_v1/lib/doc/man/mudos/concepts/
final_realms_fluffos_v1/lib/doc/man/mudos/driver/
final_realms_fluffos_v1/lib/doc/man/mudos/efuns/arrays/
final_realms_fluffos_v1/lib/doc/man/mudos/efuns/buffers/
final_realms_fluffos_v1/lib/doc/man/mudos/efuns/calls/
final_realms_fluffos_v1/lib/doc/man/mudos/efuns/compile/
final_realms_fluffos_v1/lib/doc/man/mudos/efuns/filesystem/
final_realms_fluffos_v1/lib/doc/man/mudos/efuns/floats/
final_realms_fluffos_v1/lib/doc/man/mudos/efuns/functions/
final_realms_fluffos_v1/lib/doc/man/mudos/efuns/general/
final_realms_fluffos_v1/lib/doc/man/mudos/efuns/mappings/
final_realms_fluffos_v1/lib/doc/man/mudos/efuns/mixed/
final_realms_fluffos_v1/lib/doc/man/mudos/efuns/mudlib/
final_realms_fluffos_v1/lib/doc/man/mudos/efuns/numbers/
final_realms_fluffos_v1/lib/doc/man/mudos/efuns/parsing/
final_realms_fluffos_v1/lib/doc/man/mudos/lpc/constructs/
final_realms_fluffos_v1/lib/doc/man/mudos/lpc/types/
final_realms_fluffos_v1/lib/doc/races/
final_realms_fluffos_v1/lib/doc/races/old_race/
final_realms_fluffos_v1/lib/global/virtual/
final_realms_fluffos_v1/lib/global/wiz_backup/
final_realms_fluffos_v1/lib/net/config/
final_realms_fluffos_v1/lib/net/daemon/chars/
final_realms_fluffos_v1/lib/net/inherit/
final_realms_fluffos_v1/lib/net/intermud3/
final_realms_fluffos_v1/lib/net/intermud3/cmds/
final_realms_fluffos_v1/lib/net/intermud3/save/
final_realms_fluffos_v1/lib/net/intermud3/services/
final_realms_fluffos_v1/lib/net/obj/
final_realms_fluffos_v1/lib/net/old/
final_realms_fluffos_v1/lib/net/old/intermud/
final_realms_fluffos_v1/lib/net/old/intermud/adm/
final_realms_fluffos_v1/lib/net/old/intermud/services/
final_realms_fluffos_v1/lib/net/old/intermud/udp/
final_realms_fluffos_v1/lib/net/virtual/
final_realms_fluffos_v1/lib/obj/b_day/
final_realms_fluffos_v1/lib/obj/chars/
final_realms_fluffos_v1/lib/obj/handlers/lists/
final_realms_fluffos_v1/lib/obj/handlers/useless/
final_realms_fluffos_v1/lib/obj/monsters/
final_realms_fluffos_v1/lib/obj/roomgen/
final_realms_fluffos_v1/lib/obj/soul/
final_realms_fluffos_v1/lib/obj/vegetation/
final_realms_fluffos_v1/lib/obj/weapons/oldsys/
final_realms_fluffos_v1/lib/open/
final_realms_fluffos_v1/lib/players/g/
final_realms_fluffos_v1/lib/releasefiles/d/heaven/
final_realms_fluffos_v1/lib/releasefiles/d/mudlib/
final_realms_fluffos_v1/lib/releasefiles/d/newbie/
final_realms_fluffos_v1/lib/releasefiles/doc/
final_realms_fluffos_v1/lib/releasefiles/players/g/
final_realms_fluffos_v1/lib/releasefiles/save/
final_realms_fluffos_v1/lib/releasefiles/save/environ/
final_realms_fluffos_v1/lib/releasefiles/save/roomgen/
final_realms_fluffos_v1/lib/releasefiles/secure/
final_realms_fluffos_v1/lib/releasefiles/w/
final_realms_fluffos_v1/lib/releasefiles/w/god/
final_realms_fluffos_v1/lib/room/
final_realms_fluffos_v1/lib/save/
final_realms_fluffos_v1/lib/save/environ/
final_realms_fluffos_v1/lib/save/roomgen/
final_realms_fluffos_v1/lib/scripts/
final_realms_fluffos_v1/lib/secure/crerem/
final_realms_fluffos_v1/lib/secure/dom/
final_realms_fluffos_v1/lib/secure/log/
final_realms_fluffos_v1/lib/secure/misc/
final_realms_fluffos_v1/lib/std/adnd/
final_realms_fluffos_v1/lib/std/commands/shadows/
final_realms_fluffos_v1/lib/std/creator/
final_realms_fluffos_v1/lib/std/curses/
final_realms_fluffos_v1/lib/std/curses/old_sys/
final_realms_fluffos_v1/lib/std/curses/shadows/
final_realms_fluffos_v1/lib/std/dom/
final_realms_fluffos_v1/lib/std/effects/
final_realms_fluffos_v1/lib/std/effects/healing/
final_realms_fluffos_v1/lib/std/effects/other/
final_realms_fluffos_v1/lib/std/effects/poisons/
final_realms_fluffos_v1/lib/std/environ/
final_realms_fluffos_v1/lib/std/guilds/
final_realms_fluffos_v1/lib/std/guilds/priests/samples/
final_realms_fluffos_v1/lib/std/guilds/wizards/
final_realms_fluffos_v1/lib/std/living/baldy/
final_realms_fluffos_v1/lib/std/living/divstuff/
final_realms_fluffos_v1/lib/std/paran/
final_realms_fluffos_v1/lib/std/poisons/
final_realms_fluffos_v1/lib/std/poisons/shadows/
final_realms_fluffos_v1/lib/std/poisons/weapons/
final_realms_fluffos_v1/lib/std/race_groups/
final_realms_fluffos_v1/lib/std/room/
final_realms_fluffos_v1/lib/std/room/old/
final_realms_fluffos_v1/lib/std/rooms/
final_realms_fluffos_v1/lib/std/shadows/
final_realms_fluffos_v1/lib/std/shadows/test_shad/
final_realms_fluffos_v1/lib/std/socket/
final_realms_fluffos_v1/lib/std/spells/
final_realms_fluffos_v1/lib/std/vaults/
final_realms_fluffos_v1/lib/tmp/
final_realms_fluffos_v1/lib/w/
final_realms_fluffos_v1/lib/w/god/
final_realms_fluffos_v1/old/
final_realms_fluffos_v1/win32/
// NPC statistic tracker for FR-Mud
// Radix - April 6, 1996
// Version 1.7

#include "timestuff.h"
#include "XP_adjust.h"
/* The data mappings...
  ([ "directory of death room" :
     ([ "filename" : ({  
                       kills, 
                       levels killed, 
                       total xp killed/100, 
                       last kill, 
                       time averaged,
                       killed, 
                       level killed by, 
                       total xp killed/100 by, 
                       xp awarded
                       lasted killed, 
                       time averaged,
                       kill xp
      }) ])
  ])
*/

inherit "/std/object.c";

#define SAVE "/save/"
#define PKHAND "/obj/handlers/pk"

mapping data;
int totaldif,diftimes;

void reset_screw_rate() {
  totaldif = 0;
  diftimes = 0;
}

int query_screw_rate() {
  int num = diftimes;
  int dif = totaldif;
  write(num+"\n");
  if(num > 20000) reset_screw_rate();
  if(num <= 0) return 1; // Taniwha
  return dif/num;
}

int query_number_screwed() { return diftimes; }

mapping query_data() { return data; }

void load_this_ob() {
   if(!m_sizeof(data))
     restore_object(SAVE+"death");
}

void save_this_ob() {
  if(m_sizeof(data)) 
    save_object(SAVE+"death",1);
}

create()
{
   ::create();
   data = ([ ]);
   load_this_ob();
}

void 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;
}

string environment_path(object obj)
{
  string fname = file_name(environment(obj));
  string *dom = explode(fname,"/");
  dom -= ({ dom[sizeof(dom)-1] });
  return implode(dom,"/");
}

mapping query_npcstats() {
  load_this_ob();
  return data;
}

mapping query_domain_npcstats( string dom ) { 
  load_this_ob();
  if(data[dom]) return data[dom];
  return 0;
}

mixed *query_npc_stat( string dom, string pathname ) {
  load_this_ob();
  if(data[dom]) {
    if(data[dom][pathname]) return data[dom][pathname];
  }
  return 0;
}

void full_path_report(string dom) {
  int i,j;
  string outgoing;
  string *indic;
  load_this_ob();
  outgoing = "\nfilename kills lvkls xpkls lakil tiavg killd lvkby "
      "xpkb xpaw lakld tiavg kxp\n";
  outgoing += "(XP in units of 100, time in player minutes)\n\n";
  if(data[dom]) {
    indic = m_indices(data[dom]);
    for(i=0;i<m_sizeof(data[dom]);i++) {
      outgoing += crop_string(indic[i],10)+" ";
      for(j=0;j<sizeof(data[dom][indic[i]]);j++) {
        outgoing += data[dom][indic[i]][j]+" ";
      }
      outgoing += "\n";
    }
    outgoing += "\n";
    this_player()->more_string(outgoing);
  }
}

void killed_awarded_ratio(string dom) {
  int i,j;
  int killed,kt,awarded,at;
  float ratio;
  string outgoing;
  string *indic;
  load_this_ob();
  outgoing = "\nEnd of filename     player xp killed / xp awarded \n";
   outgoing += "(player xp in units of 100)\n\n";
  if(data[dom]) {
    indic = m_indices(data[dom]);
    for(i=0;i<m_sizeof(data[dom]);i++) {
      killed = data[dom][indic[i]][2];
      awarded = data[dom][indic[i]][8];
      kt+=killed;
      at+=awarded;
      outgoing += crop_string(indic[i],30)+" ";
     if(awarded)
      outgoing += (killed+0.0)/(awarded+0.0)+"\n";
     else
      outgoing += killed+" killed, never been killed.\n";
    }
    outgoing += "\nTOTAL "+(kt+0.0)/(at+0.0)+"\n\n";
    this_player()->more_string(outgoing);
  }
}

void full_domain_kar(string realdom) {
  int i,j;
  int killed,kt,awarded,at;
  int tim, timt, timtt, time_now;
  int ktt,att;
  float ratio;
  string dom, outgoing;
  string *indic;
  string *ind;
  string *tmp;
  load_this_ob();
  time_now = TIMEKEEPER->query_running_time()/60.0;
  outgoing = "\nDirectory      pc xp killed/xp award    awarded rate\n";
  outgoing += "(player xp in units of 100, time in player hours)\n\n";
  if(!mappingp(data)) data = ([ ]); // Taniwha
  ind = m_indices(data);
  for(i=0;i<sizeof(ind);i++) {
    tmp = explode(ind[i],"/");
    if(sizeof(tmp) < 2) continue;
    if(tmp[1] == realdom) {
      dom = ind[i];
      indic = m_indices(data[dom]);
          if(!m_sizeof(data[dom])) {
            data = m_delete(data,data[dom]);
            continue;
          }
      for(j=0;j<m_sizeof(data[dom]);j++) {
        killed = data[dom][indic[j]][2];
        awarded = data[dom][indic[j]][8];
        if(((time_now - data[dom][indic[j]][3]) > BASE_WEEK/30.0
          && (time_now - data[dom][indic[j]][9]) > BASE_WEEK/30.0)
          || (time_now - data[dom][indic[j]][3]) < 0.0
          || (time_now - data[dom][indic[j]][9]) < 0.0)
        {
          data[dom] = m_delete(data[dom],indic[j]);
          continue;
        }
        tim = data[dom][indic[j]][10];
        if(tim > timt) timt = tim;
        kt+=killed;
        at+=awarded;
      }
      if(dom)
         dom = dom[strlen(realdom)+3..1000]+"/";
      if(at)
         outgoing += sprintf("%-35s %15.4f ", dom, ((kt+0.0) / (at+0.0)));
      else
         outgoing += sprintf("%-35s %15.4f ", dom, 0.0);
      if(timt)
         outgoing += sprintf("%15.4f\n", ((at+0.0) * 60.0) / (timt+0.0));
      else
      outgoing += sprintf("%15.4f\n", 0.0);
      ktt += kt;
      att += at;
      if(timt > timtt) timtt = timt;
      at = 0;
      kt = 0;
      timt = 0;
    }
  }
  if(att)
  outgoing += "\nTOTAL  "+(ktt+0.0)/(att+0.0)+" ";
  if(timtt) outgoing += (att+0.0)*60.0/(timtt+0.0)+"\n";
  else outgoing += " NKTT";
  this_player()->more_string(outgoing);
}

void original_radix_data(string dom) {
  int i,j;
  int died,dt,kills,kt,timd,tmdt,timk,tmkt,levd,ldt,levk,lkt,xpd,
      xdt,xpk,xkt,awded,awdt;
  float ratio;
  string outgoing;
  string *indic;
  load_this_ob();
  outgoing = "\nfilename  freqdied freqkills avglevd avglevk avgxpd"
      " avgxpk rateawarded\n";
  outgoing += "(player xp in units of 100, time in player hours)\n\n";
  if(data[dom]) {
    indic = m_indices(data[dom]);
    for(i=0;i<m_sizeof(data[dom]);i++) {
      died = data[dom][indic[i]][5];
      dt += died;
      kills = data[dom][indic[i]][0];
      kt += kills;
      timd = data[dom][indic[i]][10];
      if(timd > tmdt) tmdt = timd;
      timk = data[dom][indic[i]][4];
      if(timk > tmkt) tmkt = timk;
      levd = data[dom][indic[i]][6];
      ldt += levd;
      levk = data[dom][indic[i]][1];
      lkt += levk;
      xpd = data[dom][indic[i]][7];
      xdt += xpd;
      xpk = data[dom][indic[i]][2];
      xkt += xpk;
      awded = data[dom][indic[i]][8];
      awdt += awded;
      outgoing += crop_string(indic[i],20);
      if(timd) outgoing += " "+(died+0.0)*60.0/(timd+0.0);
      else outgoing += " NTD";
      if(timk) outgoing += " "+(kills+0.0)*60.0/(timk+0.0);
      else outgoing += " NTK";
      if(died) outgoing += " "+(levd+0.0)/(died+0.0);
      else outgoing += " ND";
      if(kills) outgoing += " "+(levk+0.0)/(kills+0.0);
      else outgoing += " NK";
      if(died) outgoing += " "+(xpd+0.0)/(died+0.0);
      else outgoing += " ND";
      if(kills) outgoing += " "+(xpk+0.0)/(kills+0.0);
      else outgoing += " NK";
      if(timd) outgoing += " "+(awded+0.0)*60.0/(timd+0.0);
      else outgoing += " NTD";
      outgoing += "\n";
    }
    outgoing += "\nTOTAL";
      if(tmdt) outgoing += " "+(dt+0.0)*60.0/(tmdt+0.0);
      else outgoing += " NTD";
      if(tmkt) outgoing += " "+(kt+0.0)*60.0/(tmkt+0.0);
      else outgoing += " NTK";
      if(dt) outgoing += " "+(ldt+0.0)/(dt+0.0);
      else outgoing += " ND";
      if(kt) outgoing += " "+(lkt+0.0)/(kt+0.0);
      else outgoing += " NK";
      if(dt) outgoing += " "+(xdt+0.0)/(dt+0.0);
      else outgoing += " ND";
      if(kt) outgoing += " "+(xkt+0.0)/(kt+0.0);
      else outgoing += " NK";
      if(tmdt) outgoing += " "+(awdt+0.0)*60.0/(tmdt+0.0);
      else outgoing += " NTD";
    outgoing += "\n\n";
    this_player()->more_string(outgoing);
  }
}

float get_real_rate(mixed vals, object npc)
{
   float rateret;
   if(sizeof(vals) < 12)
      return -1;
   if(vals[5] && vals[6] / vals[5] < 4) return -1;
   if(vals[10] < BASE_WEEK/60 && vals[7] < 1000000000) return -1;
   if (!vals[8]) {
     if (vals[2]) return MAX_XP_BON;
     else return -1;
   }
   rateret = (vals[2]+0.0)/(vals[8]+0.0)/BASE_KAR;
   if(rateret*vals[11] > npc->query_level()*60*MAX_XP_BON)
     rateret = MAX_XP_BON*(npc->query_level()+0.0)*60.0/(vals[11]+0.0);
   if(rateret*vals[11] < npc->query_level()*60*MAX_XP_PEN)
   {
     rateret = MAX_XP_PEN*(npc->query_level()+0.0)*60.0/(vals[11]+0.0);
     if(rateret > 1.0) rateret = 1.0;
   }
   return rateret;
}

float update_npc_died(object npc, object player)
{
   mixed vals;
   mapping tmp;
   string domname, obname;
   int i, temp;
   int time_now, time_since, total_time, time_extra;
   float rateret;

   if(!(obname = real_filename(npc))) 
      return 1;
   if(!(domname = environment_path(npc)))
      return 1;
   load_this_ob();
   tmp = data[domname];
   if(!tmp) 
      tmp = ([ ]);
   vals = tmp[obname];
   if(!vals) vals = ({0,0,0,0,0,0,0,0,0,0,0,0});
   
   if(!(player->query_creator()) && 
     strsrch(player->query_name(),"test") == -1) {
   time_now = TIMEKEEPER->query_running_time()/60.0;
   if(!vals[9]) vals[9] = time_now;
   time_since = time_now - vals[9];
  if(time_since < 0) time_since = 0;
   if(time_since > BASE_WEEK/30.0) {
     vals[5]=0;
     vals[6]=0;
     vals[7]=0;
     vals[8]=0;
     vals[9]=time_now;
     vals[10]=time_since;
   }
   else {
     total_time = vals[10]+time_since;
     if(total_time > BASE_WEEK/30.0) {
       time_extra = total_time - BASE_WEEK/30.0;
       temp = vals[5]*((vals[10]-time_extra)*10.0/vals[10])/10;
       vals[5] = temp;
       temp = vals[6]*((vals[10]-time_extra)*10.0/vals[10])/10;
       vals[6] = temp;
       temp = vals[7]*((vals[10]-time_extra)*10.0/vals[10])/10;
       vals[7] = temp;
       temp = vals[8]*((vals[10]-time_extra)*10.0/vals[10])/10;
       vals[8] = temp;
       temp = BASE_WEEK/30.0;
       vals[10] = temp;
     }
     else vals[10] = total_time;
     vals[9] = time_now;
   }
   
   if(vals[10] < 0) vals[10] = BASE_WEEK/30;
   vals[5] += 1;
   vals[6] += player->query_level();
   vals[7] += player->query_total_xp()/100;
   vals[11] = npc->query_kill_xp();
   vals[8] += vals[11];
     if(vals[7] > 2000000000) {
       temp=vals[5]*2000000000.0/vals[7];
       vals[5]=temp;
       temp=vals[6]*2000000000.0/vals[7];
       vals[6] = temp;
       temp=vals[8]*2000000000.0/vals[7];
       vals[8] = temp;
       temp=vals[10]*2000000000.0/vals[7];;
       vals[10] = temp;
       vals[7]=2000000000;
     }

   tmp[obname] = vals;
   data[domname] = tmp;
   save_this_ob();
   }

   // Made seperate function for other purposes - Radix
  rateret = get_real_rate(vals, npc);
  if(rateret == -1)
     return 1.0;

   if(!(player->query_creator()) &&
     strsrch(player->query_name(),"test") == -1) {
   totaldif += rateret*vals[11]-(npc->query_level()*60);
   diftimes += 1;
  }
   if(rateret) return rateret;
   return 1.0;
}

// Called from /global/creator/cmds/info.c
void info_npc(object npc)
{
   mixed vals;
   mapping tmp;
   float rateret;
   string domname, obname;
   
   if(!(obname = real_filename(npc)) || !(domname = environment_path(npc)))
   {
      write("Invalid NPC object filename or environment path.\n");
      return 0;
   }
   tmp = data[domname];
   if(!tmp)
   {
      write("No data for NPC in this environment.\n");
      return 0;
   }
   vals = tmp[obname];
   rateret = get_real_rate(vals, npc);
   if(rateret == -1)
      rateret = 1.0;
   write("Info Data for NPC: "+npc->query_short()+"\n");
   write("Filename: "+obname+"\n");
   write("Environment: "+domname+"\n");
   write("----------------------------------------\n");
   write("Kill xp: "+npc->query_kill_xp()+"\n");
   write("Rate Return: "+rateret+"\n");
   write("Total: "+npc->query_kill_xp() * rateret+"\n");
   return;
}
void update_player_died(object npc, object player)
{
   mixed vals;
   mapping tmp;
   string domname, obname;
   int i, temp;
   int time_now, time_since, total_time, time_extra;

   if(player->query_creator() || 
     strsrch(player->query_name(),"test") != -1) return;
   if(!(obname = real_filename(npc))) 
      return;
  if(!(domname = environment_path(npc)))
    return;
   load_this_ob();
   tmp = data[domname];
   if(!tmp) 
      tmp = ([ ]);
   vals = tmp[obname];
   if(!vals) vals = ({0,0,0,0,0,0,0,0,0,0,0,0});
   
   time_now = TIMEKEEPER->query_running_time()/60.0;
   if(!vals[3]) vals[3] = time_now;
   time_since = time_now - vals[3];
   if(time_since < 0) time_since = 0;
   if(time_since > BASE_WEEK/30.0) {
     vals[0]=0;
     vals[1]=0;
     vals[2]=0;
     vals[3]=time_now;
     vals[4]=time_since;
   }
   else {
     total_time = vals[4]+time_since;
     if(total_time > BASE_WEEK/30.0) {
       time_extra = total_time - BASE_WEEK/30.0;
       temp = vals[0]*((vals[4]-time_extra)*10.0/vals[4])/10;
       vals[0] = temp;
       temp = vals[1]*((vals[4]-time_extra)*10.0/vals[4])/10;
       vals[1] = temp;
       temp = vals[2]*((vals[4]-time_extra)*10.0/vals[4])/10;
       vals[2] = temp;
       temp = BASE_WEEK/30.0;
       vals[4] = temp;
     }
     else vals[4] = total_time;
     vals[3] = time_now;
   }
   
   if(vals[4] < 0) vals[4] = BASE_WEEK/30;
   vals[0] += 1;
   vals[1] += player->query_level();
   vals[2] += player->query_total_xp()/100;
   vals[11] = npc->query_kill_xp();
   
   tmp[obname] = vals;
   data[domname] = tmp;
   save_this_ob();
   return;

}

void domain_death(object victim, object enemy)
{
   string *path = explode(file_name(environment(victim)),"/");
   mixed mas;
   if(sizeof(path) < 2 || (path[0] != "d" && path[0] != "w"))
      return;
   mas = "/"+path[0]+"/"+path[1]+"/master";
   catch(mas->domain_death(victim, enemy));
}

void mud_death(object victim, object enemy)
{
   string *path = explode(file_name(environment(victim)),"/");
   mixed mas;
   string *doms = get_dir("/d/");
   int i;
   for(i=0; i<sizeof(doms); i++)
   {
      mas = "/d/"+doms[i]+"/master";
      catch(mas->mud_death(victim, enemy));
   }
   return;
}

float update_statistics(object victim, object enemy)
{
   string create_name;
   if(enemy && victim)
   {
      if(environment(enemy) && environment(victim))
      {
         domain_death(victim, enemy);
         mud_death(victim, enemy);
      }
      if(interactive(victim) && enemy->query_npc()) {
         update_player_died(enemy, victim);
         return 1;
      }
      create_name = victim->query_create_me();
      if(victim->query_npc() && interactive(enemy)) {
         if(!enemy->query_creator())
            if(create_name != "Object" && create_name != "Root")
               log_file("CREATE_ME",real_filename(victim)+
                  " ["+victim->query_create_me()+"] killed by "+
                  enemy->query_cap_name()+" for "+
                  victim->query_kill_xp()+" :"+ctime(time())+"\n");
         return update_npc_died(victim, enemy);
      }
      // PKing...
      if(interactive(victim) && interactive(enemy))
         catch(PKHAND->update_player_killed(victim, enemy));
  }
  return 1;
}