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/
//	/std/living/skills.c
//	from the Nightmare mudlib
//	code for the Nightmare skill system
//	created by Descartes of Borg 1september 1992
//	recoded 14 february 1993

#include <daemons.h>

string str_class;
mapping skills;
static mapping skill_bonus;

void init_skills(string cl);
void add_skill_points(string skill, int amount);
void reduce_skill_points(string skill, int amount);
void set_skill(string str, int x);
int skill_exists(string str);
int query_max_skill(string str);
int query_skill(string str);
void set_class(string str);
string query_class();

void init_skills(string cl) {
    skills = (mapping)SKILLS_D->init_skills(cl);
}

void add_skill_points(string skill, int amount) {
    int x, max, borg, lvl;
 
    if(!skills[skill]) return;
    if(amount<1) return;
    x = skills[skill]["points"];
    lvl = skills[skill]["level"];
    x += amount;
    max = ((skills[skill]["max"])*((int)this_object()->query_level()))/20;
    while( x > (borg = (int)SKILLS_D->training_formula(str_class, lvl, skill)) ) {
	x -= borg;
	if(max > lvl) lvl ++;
	else break;
    }
    skills[skill]["points"] = x;
    if(lvl != skills[skill]["level"]) {
      log_file("skills", (string)this_object()->query_name()+" advanced "+
        skill+" from "+skills[skill]["level"]+" to "+lvl+" ("+
        ctime(time())+")\n"
      );
    }
    skills[skill]["level"] = lvl;
}

void reduce_skill_points(string skill, int amount) {
    int x, lev;

    if(skills[skill]) x = skills[skill]["points"];
    else return;
    if(amount < 1) return;
    x -= amount;
    lev = skills[skill]["level"];
    while(x<0) {
	x += (int)SKILLS_D->training_formula(str_class,skills[skill]["level"]-1, skill);
	skills[skill]["level"] --;
    }
    skills[skill]["points"] = x;
    if(skills[skill]["level"] != lev)
      log_file("skills", (string)this_object()->query_name()+" reduced "+
        skill+" from "+skills[skill]["level"]+" to "+lev+" ("+
        ctime(time())+")\n"
      );
}

int query_max_skill(string skill) {
    if(!skills[skill]) return 0;
    else return skills[skill]["max"];
}

int skill_exists(string str) {
    string *vars;

    vars = keys(skills);
    if(str == "picking") return 0;
    if(member_array(str, vars) == -1) return 0;
    else return 1;
}

int query_skill(string skill) {
    int x;

    if(skill_bonus) x= skill_bonus[skill];
    else x = 0;
    if(skills[skill]) x+= skills[skill]["level"];
    else x+= 0;
    return x;
}

int query_base_skill(string skill) {
    if(!skills || !skills[skill]) return 0;
    else return skills[skill]["level"];
}

void set_skill(string str, int x) {
    if(!skills[str]) skills[str] = ([ "level":0 ]);
    skills[str]["level"] = x;
    if(!this_object()->is_player() || creatorp(this_object())) return;
    log_file("illegal", (string)this_object()->query_name()+
      " was advanced in "+str+" artificially by "+
      (this_player() ? this_player()->query_name() : previous_object()->query_name())+"\n");
    log_file("illegal", "file: "+file_name(previous_object())+" ("+
      query_privs(previous_object())+") "+ctime(time())+"\n");
}

void set_class(string str) { str_class = str; }

string query_class() { return str_class; }

static void reduce_skills() {
    string *ind;
    int x;
    int i;

    ind = keys(skills);
    for(i=0; i<sizeof(ind); i++) {
        if(!skills[ind[i]]) continue;
	if(query_skill(ind[i]) < 5) continue;
        if(random(101) > 50) {
            log_file("skills", this_object()->query_name()+" lost "+
              ind[i]+" through reduce_skills() "+ctime(time())+"\n");
            skills[ind[i]]["level"] -= random(5)+1;
            skills[ind[i]]["points"] = 0;
        }
    }
}

int add_skill(string type, int level, int max)
{
     if(skill_exists(type)) return 0;
     skills[type] = (["level" : level, "points": 0, "max": max]);
     return 1;
}

int delete_skill(string type)
{
     if(!skill_exists(type)) return 0;
     map_delete(skills, type);
     return 1;
}

string *query_all_skills() { return keys(skills); }

void add_skill_bonus(string skill, int amount) {
    if(!skill_bonus) skill_bonus = ([]);
    if(!skill_bonus[skill]) skill_bonus[skill] = amount;
    else skill_bonus[skill] += amount;
    if(!skill_bonus[skill]) map_delete(skill_bonus, skill);
}

int query_skill_bonus(string skill) {
    if(!skill_bonus) return 0;
    if(!skill_bonus[skill]) return 0;
    return skill_bonus[skill];
}