nightmare3_fluffos_v2/
nightmare3_fluffos_v2/bin/
nightmare3_fluffos_v2/fluffos-2.9-ds2.08/
nightmare3_fluffos_v2/fluffos-2.9-ds2.08/ChangeLog.old/
nightmare3_fluffos_v2/fluffos-2.9-ds2.08/Win32/
nightmare3_fluffos_v2/fluffos-2.9-ds2.08/compat/
nightmare3_fluffos_v2/fluffos-2.9-ds2.08/compat/simuls/
nightmare3_fluffos_v2/fluffos-2.9-ds2.08/include/
nightmare3_fluffos_v2/fluffos-2.9-ds2.08/testsuite/
nightmare3_fluffos_v2/fluffos-2.9-ds2.08/testsuite/clone/
nightmare3_fluffos_v2/fluffos-2.9-ds2.08/testsuite/command/
nightmare3_fluffos_v2/fluffos-2.9-ds2.08/testsuite/data/
nightmare3_fluffos_v2/fluffos-2.9-ds2.08/testsuite/etc/
nightmare3_fluffos_v2/fluffos-2.9-ds2.08/testsuite/include/
nightmare3_fluffos_v2/fluffos-2.9-ds2.08/testsuite/inherit/
nightmare3_fluffos_v2/fluffos-2.9-ds2.08/testsuite/inherit/master/
nightmare3_fluffos_v2/fluffos-2.9-ds2.08/testsuite/log/
nightmare3_fluffos_v2/fluffos-2.9-ds2.08/testsuite/single/
nightmare3_fluffos_v2/fluffos-2.9-ds2.08/testsuite/single/tests/compiler/
nightmare3_fluffos_v2/fluffos-2.9-ds2.08/testsuite/single/tests/efuns/
nightmare3_fluffos_v2/fluffos-2.9-ds2.08/testsuite/single/tests/operators/
nightmare3_fluffos_v2/fluffos-2.9-ds2.08/testsuite/u/
nightmare3_fluffos_v2/fluffos-2.9-ds2.08/tmp/
nightmare3_fluffos_v2/fluffos-2.9-ds2.08/windows/
nightmare3_fluffos_v2/lib/cmds/ambassador/
nightmare3_fluffos_v2/lib/cmds/database/
nightmare3_fluffos_v2/lib/cmds/hm/
nightmare3_fluffos_v2/lib/cmds/soul/
nightmare3_fluffos_v2/lib/daemon/cfg/
nightmare3_fluffos_v2/lib/daemon/cfg/mon_races/
nightmare3_fluffos_v2/lib/daemon/cfg/races/
nightmare3_fluffos_v2/lib/daemon/include/
nightmare3_fluffos_v2/lib/daemon/save/
nightmare3_fluffos_v2/lib/daemon/services/
nightmare3_fluffos_v2/lib/daemon/soul/
nightmare3_fluffos_v2/lib/doc/
nightmare3_fluffos_v2/lib/doc/TestPlans/
nightmare3_fluffos_v2/lib/doc/approval/
nightmare3_fluffos_v2/lib/doc/approval/QC/
nightmare3_fluffos_v2/lib/doc/approval/balance/
nightmare3_fluffos_v2/lib/doc/build/
nightmare3_fluffos_v2/lib/doc/build/armours/
nightmare3_fluffos_v2/lib/doc/build/economy/
nightmare3_fluffos_v2/lib/doc/build/etc/
nightmare3_fluffos_v2/lib/doc/build/monster/
nightmare3_fluffos_v2/lib/doc/build/room/
nightmare3_fluffos_v2/lib/doc/build/virtual/
nightmare3_fluffos_v2/lib/doc/build/weapon/
nightmare3_fluffos_v2/lib/doc/classes/
nightmare3_fluffos_v2/lib/doc/efun/
nightmare3_fluffos_v2/lib/doc/etc/
nightmare3_fluffos_v2/lib/doc/help/creator/
nightmare3_fluffos_v2/lib/doc/help/hm/
nightmare3_fluffos_v2/lib/doc/law/
nightmare3_fluffos_v2/lib/doc/lpc/basic/
nightmare3_fluffos_v2/lib/doc/lpc/data_types/
nightmare3_fluffos_v2/lib/doc/lpc/etc/
nightmare3_fluffos_v2/lib/doc/lpc/intermediate/
nightmare3_fluffos_v2/lib/doc/lpc/types/
nightmare3_fluffos_v2/lib/doc/mudlib/
nightmare3_fluffos_v2/lib/doc/mudlib/features/
nightmare3_fluffos_v2/lib/domains/Examples/etc/
nightmare3_fluffos_v2/lib/domains/Examples/room/
nightmare3_fluffos_v2/lib/domains/Examples/virtual/
nightmare3_fluffos_v2/lib/domains/Examples/virtual/exaA/
nightmare3_fluffos_v2/lib/domains/Examples/virtual/exaB/
nightmare3_fluffos_v2/lib/domains/Examples/weapon/
nightmare3_fluffos_v2/lib/domains/Praxis/
nightmare3_fluffos_v2/lib/domains/Praxis/adm/
nightmare3_fluffos_v2/lib/domains/Praxis/attic/
nightmare3_fluffos_v2/lib/domains/Praxis/cemetary/
nightmare3_fluffos_v2/lib/domains/Praxis/cemetary/mon/
nightmare3_fluffos_v2/lib/domains/Praxis/data/
nightmare3_fluffos_v2/lib/domains/Praxis/death/
nightmare3_fluffos_v2/lib/domains/Praxis/mountains/
nightmare3_fluffos_v2/lib/domains/Praxis/obj/armour/
nightmare3_fluffos_v2/lib/domains/Praxis/obj/magic/
nightmare3_fluffos_v2/lib/domains/Praxis/obj/weapon/
nightmare3_fluffos_v2/lib/domains/Praxis/orc_valley/
nightmare3_fluffos_v2/lib/domains/Praxis/quests/
nightmare3_fluffos_v2/lib/domains/Praxis/standardOld/
nightmare3_fluffos_v2/lib/include/
nightmare3_fluffos_v2/lib/log/
nightmare3_fluffos_v2/lib/log/errors/
nightmare3_fluffos_v2/lib/log/reports/
nightmare3_fluffos_v2/lib/log/watch/
nightmare3_fluffos_v2/lib/news/
nightmare3_fluffos_v2/lib/secure/cfg/
nightmare3_fluffos_v2/lib/secure/cmds/ambassador/
nightmare3_fluffos_v2/lib/secure/cmds/mortal/
nightmare3_fluffos_v2/lib/secure/save/users/d/
nightmare3_fluffos_v2/lib/secure/std/
nightmare3_fluffos_v2/lib/std/hm/
nightmare3_fluffos_v2/lib/std/living/
nightmare3_fluffos_v2/lib/std/room/
nightmare3_fluffos_v2/lib/std/user/
nightmare3_fluffos_v2/lib/std/virtual/
nightmare3_fluffos_v2/lib/www/
nightmare3_fluffos_v2/lib/www/errors/
nightmare3_fluffos_v2/lib/www/gateways/
nightmare3_fluffos_v2/win32/
//      /adm/daemon/race_d.c
//      the daemon for setting up race info
//      from the Nightmare Mudlib
//      created by Descartes of Borg 10 june 1993

#include <cfg.h>

#define LIMB_DIR "/daemon/cfg/races/"
#define MON_DIR "/daemon/cfg/mon_races/"

mapping races, limbs;

int query_weight(string res, int con);
int query_fingers(string res);
int query_sight_bonus(string res);
string *query_wielding_limbs(string res);
int is_race(string res);
int query_max_dam(string limb, string res);
string *query_limbs(string res);
int is_limb(string limb, string res);

void create() {
    string *lines, *data, *w_limbs, *borg, *b_types;
    int i, j, tmp, tmp2;

    races = ([]);
    limbs = ([]);
    b_types = ({});
    for(i=0, tmp = sizeof(lines = read_database(CFG_RACES)); i<tmp; i++) {
        if(sizeof(data=explode(lines[i], ":")) != 12) continue;
        races[data[0]] =
          ([ "sight":to_int(data[1]), "weight":to_int(data[2]), "fingers":to_int(data[3]) ]);
        races[data[0]]["wielding"] = ({});
        for(j=0, tmp2=sizeof(w_limbs=explode(data[4], ";")); j<tmp2; j++) 
            races[data[0]]["wielding"] += ({ w_limbs[j] });
        races[data[0]]["str"] = to_int(data[5]);
        races[data[0]]["con"] = to_int(data[6]);
        races[data[0]]["int"] = to_int(data[7]);
        races[data[0]]["wis"] = to_int(data[8]);
        races[data[0]]["dex"] = to_int(data[9]);
        races[data[0]]["cha"] = to_int(data[10]);
	races[data[0]]["body type"] = data[11];
	if (member_array(data[11], b_types) == -1)
	  b_types += ({ data[11] });
    }
    for(i = 0, tmp = sizeof(b_types); i < tmp; i++) {
        if(!file_exists(LIMB_DIR+b_types[i])) {
            log_file("races", "Error: No such file "+LIMB_DIR+b_types[i]+"\n");
            map_delete(races, b_types[i]);
            continue;
        }
        limbs[b_types[i]] = ([]);
        for(j=0, tmp2=sizeof(lines=explode(read_file(LIMB_DIR+b_types[i]), "\n"));
          j<tmp2; j++) {
            if(lines[j][0] == '#')
	      continue;
            if(sizeof(data = explode(lines[j], ":")) != 4) 
	      continue;
            if(data[1] == "0") 
	      data[1] = "";
            limbs[b_types[i]][data[0]] =
              ([ "ref":data[1], "max":to_int(data[2]), "attach":data[3] ]);
        }
    }
}

int query_weight(string res, int con) {
    if(!res || !con || !races[res]) return 10000;
    else return ((con-10)*100 + races[res]["weight"]);
}

int query_fingers(string res) {
    if(!res || !races[res]) return 5;
    else return races[res]["fingers"];
}

int query_stat_adjustment(string stat, string res);
int query_sight_bonus(string res) { 
    if(!res || !races[res]) return 0;
    else return races[res]["sight"];
}

string *query_wielding_limbs(string res) {
    if(!res || !races[res])
        return ({ "right hand", "left hand" });
    else return races[res]["wielding"];
}

int is_race(string res) {
    return (member_array(res, keys(races)) != -1);
}

int query_max_dam(string limb, string res) {
    if(!limb || !res || !races[res] || !limbs[races[res]["body type"]]) 
      return 2;
    if(limb == "torso") return 1;
    else if(!limbs[races[res]["body type"]][limb]) return 0;
    else return limbs[races[res]["body type"]][limb]["max"];
}

string *query_limbs(string res) {
    if(!res || !limbs[races[res]["body type"]]) return query_limbs("human");
    else return keys(limbs[races[res]["body type"]]);
}

string *query_races() { return keys(races); }

int is_limb(string limb, string res) {
    if(!limb || !res || !limbs[races[res]["body type"]]) return 0;
    else 
      return (member_array(limb, keys(limbs[races[res]["body type"]])) != -1);
}

mapping body(object ob) {
    mapping borg;
    string res;
    string *what;
    int i, tmp, max;

    borg = ([]);
    res = (string)ob->query_race();
    if(!res) 
      res = "human";
    max = (int)ob->query_max_hp();
    borg["torso"] = 
      ([ "limb_ref": "FATAL", "max_dam": max+1, "damage":0, "ac":0 ]);
    for(i=0, tmp = sizeof(what = keys(limbs[races[res]["body type"]])); 
	i < tmp; i++)
      borg[what[i]] =
	(["limb_ref":limbs[races[res]["body type"]][what[i]]["ref"],
          "max_dam": max/limbs[races[res]["body type"]][what[i]]["max"],
          "damage":0, "ac":0
	]);
    return borg;
}

mapping do_rolls(string res) {
    mapping borg;
    string *stats;
    int tmp, i;

    if(!res || !races[res]) return 0;
    borg = ([
      "strength": random(10) + 7 + races[res]["str"],
      "constitution": random(10) + 7 + races[res]["con"],
      "intelligence": random(10) + 7 + races[res]["int"],
      "wisdom": random(10) + 7 + races[res]["wis"],
      "dexterity": random(10) + 7 + races[res]["dex"],
      "charisma": random(10) + 7 + races[res]["cha"]
    ]);
    for(i=0, tmp=(sizeof(stats=keys(borg))); i<tmp; i++) {
      if(borg[stats[i]] > 23) borg[stats[i]] = 23;
      else if(borg[stats[i]] < 2) borg[stats[i]] = 2;
    }
    return borg;
}

mapping query_limb_info(string limb, string res) {
    if(!res || !limbs[res]) res = "human";
    if(!limb || !limbs[res][limb]) return 0;
    return limbs[res][limb];
}

int query_stat_adjustment(string stat, string res) {
    if(!stat || !res || !races[res]) return 0;
    return races[res][stat];
}

// Monster Race related code
// by Valodin, June 28, 1993
int is_monster_race(string str)
{
  if(is_race(str))
    return 1;
  return (member_array(str, get_dir(MON_DIR)) != -1);
}

mapping monster_body(string mon_race, int max) 
{
    mapping borg;
    string *what, *lines, *data;
    int i, tmp;

    borg = ([]);
    if(!mon_race || !is_monster_race(mon_race)) mon_race = "human";
    borg["torso"] = 
      ([ "limb_ref": "FATAL", "max_dam": max+1, "damage":0, "ac":0 ]);
    if (is_race(mon_race))
      for(i=0, tmp = sizeof(what=keys(limbs[races[mon_race]["body type"]])); 
	  i < tmp; i++)
        borg[what[i]] =
	  (["limb_ref":limbs[races[mon_race]["body type"]][what[i]]["ref"],
	    "max_dam": max/limbs[races[mon_race]["body type"]][what[i]]["max"],
	    "damage":0, "ac":0
	    ]);
    else
    {      
      for(i = 1, tmp = sizeof(lines = explode(read_file(MON_DIR + mon_race),
					      "\n")); i < tmp; i++) {
	if(sizeof(data=explode(lines[i], ":")) != 4) continue;
	if(data[1] == "0") data[1] = "";
	borg[data[0]] =
          ([ "limb_ref": data[1], "max_dam": max/to_int(data[2]), "damage":0, "ac":0 ]);
      }
    }
    return borg;
}

string *query_monster_wielding_limbs(string race)
{
  string *lines;

  if(is_race(race))
    return query_wielding_limbs(race);
  else
  {
    if(file_size(MON_DIR + race) < 0)
      return query_wielding_limbs("human");
    lines = explode(read_file(MON_DIR + race), "\n");
    lines = explode(lines[0], ":");
    return (explode(lines[1],";"));
  }
}

int query_monster_fingers(string race)
{
  string *lines;

  if(is_race(race))
    return query_fingers(race);
  else
  {
    if(file_size(MON_DIR + race) < 0)
      return query_fingers("human");
    lines = explode(read_file(MON_DIR + race), "\n");
    lines = explode(lines[0], ":");
    return (to_int(lines[0]));
  }
}

int query_max_mon_dam(string limb, string b_type) {
  string *lines, *data;
  int i, tmp;

  if(!limb || !b_type)
    return 2;
  if(limb == "torso") return 1;
  else if(!limbs[b_type])
  {
    if(file_size(MON_DIR + b_type) < 0) return 2;
    for(i = 1, tmp = sizeof(lines = explode(read_file(MON_DIR + b_type),
					    "\n")); i < tmp; i++) {
      if(sizeof(data=explode(lines[i], ":")) != 4) continue;
      if(data[0] == limb) return to_int(data[2]);
    }
    return 2;
  }
  else if(!limbs[b_type][limb]) return 2;
  else return limbs[b_type][limb]["max"];
}