dsI/bin/
dsI/extra/creremote/
dsI/extra/mingw/
dsI/extra/wolfpaw/
dsI/fluffos-2.7-ds2.018/
dsI/fluffos-2.7-ds2.018/ChangeLog.old/
dsI/fluffos-2.7-ds2.018/Win32/
dsI/fluffos-2.7-ds2.018/compat/
dsI/fluffos-2.7-ds2.018/compat/simuls/
dsI/fluffos-2.7-ds2.018/testsuite/
dsI/fluffos-2.7-ds2.018/testsuite/clone/
dsI/fluffos-2.7-ds2.018/testsuite/command/
dsI/fluffos-2.7-ds2.018/testsuite/data/
dsI/fluffos-2.7-ds2.018/testsuite/etc/
dsI/fluffos-2.7-ds2.018/testsuite/include/
dsI/fluffos-2.7-ds2.018/testsuite/inherit/
dsI/fluffos-2.7-ds2.018/testsuite/inherit/master/
dsI/fluffos-2.7-ds2.018/testsuite/log/
dsI/fluffos-2.7-ds2.018/testsuite/single/
dsI/fluffos-2.7-ds2.018/testsuite/single/tests/compiler/
dsI/fluffos-2.7-ds2.018/testsuite/single/tests/efuns/
dsI/fluffos-2.7-ds2.018/testsuite/single/tests/operators/
dsI/fluffos-2.7-ds2.018/testsuite/u/
dsI/fluffos-2.7-ds2.018/tmp/
dsI/lib/cfg/
dsI/lib/cmds/common/
dsI/lib/cmds/creators/include/
dsI/lib/cmds/creators/include/SCCS/
dsI/lib/daemon/services/
dsI/lib/doc/
dsI/lib/domains/Ylsrim/
dsI/lib/domains/Ylsrim/adm/
dsI/lib/domains/Ylsrim/armour/
dsI/lib/domains/Ylsrim/broken/
dsI/lib/domains/Ylsrim/fish/
dsI/lib/domains/Ylsrim/meal/
dsI/lib/domains/Ylsrim/npc/
dsI/lib/domains/Ylsrim/virtual/
dsI/lib/domains/Ylsrim/weapon/
dsI/lib/domains/default/creator/
dsI/lib/domains/default/etc/
dsI/lib/domains/default/room/
dsI/lib/lib/comp/
dsI/lib/lib/lvs/
dsI/lib/lib/user/
dsI/lib/lib/virtual/
dsI/lib/obj/
dsI/lib/obj/include/
dsI/lib/realms/
dsI/lib/save/kills/a/
dsI/lib/save/kills/b/
dsI/lib/save/kills/f/
dsI/lib/save/kills/m/
dsI/lib/save/kills/q/
dsI/lib/save/kills/r/
dsI/lib/secure/cfg/
dsI/lib/secure/cfg/classes/
dsI/lib/secure/cfg/races/SCCS/
dsI/lib/secure/cmds/creators/include/
dsI/lib/secure/cmds/players/
dsI/lib/secure/cmds/players/include/
dsI/lib/secure/daemon/include/
dsI/lib/secure/lib/
dsI/lib/secure/lib/include/
dsI/lib/secure/lib/net/
dsI/lib/secure/lib/net/include/
dsI/lib/secure/lib/std/
dsI/lib/secure/obj/
dsI/lib/secure/obj/include/
dsI/lib/secure/save/
dsI/lib/spells/
dsI/lib/verbs/admins/include/
dsI/lib/verbs/common/
dsI/lib/verbs/common/include/
dsI/lib/verbs/creators/
dsI/lib/verbs/creators/include/
dsI/lib/verbs/players/include/SCCS/
dsI/lib/verbs/rooms/
dsI/lib/verbs/rooms/include/
dsI/lib/www/
dsI/v22.2b14/
dsI/win32/
/*    /lib/classes.c
 *    from the Dead Souls LPC Library
 *    classes and guild handling object
 *    created by Descartes of Borg 950123
 *    Version: @(#) classes.c 1.4@(#)
 *    Last modified: 96/12/13
 */

#include <lib.h>
#include <daemons.h>
#include "include/classes.h"

inherit LIB_ABILITIES;

private int Morality;
private string Class, Guild;
private mapping SkillModifiers;
private string *Religion;

static void create() {
    abilities::create();
    SkillModifiers = ([]);
    Religion = allocate(2);
    Class = 0;
    Guild = 0;
    Morality = 0;
}

int eventMoralAct(int degree) {
    if( degree > 10 ) {
	degree = 10;
    }
    else if( degree < -10 ) {
	degree = -10;
    }
    Morality += degree;
    if( Morality > 2500 ) Morality = 2500;
    else if( Morality < -2500 ) Morality = -2500;
    return Morality;
}

int AddSkillPoints(string skill, int x) {
    if( SkillModifiers[skill] ) {
	int stat_level; 
	stat_level = GetBaseStatLevel(SkillModifiers[skill]);
	if( stat_level < 20 ) x = x - x/2;
	else if( stat_level < 40 ) x = x - x/3;
	else if( stat_level > 70 && x < 100 ) x = x + x/3;
	else if( stat_level > 99 ) x = x + x/2;
    }
    return abilities::AddSkillPoints(skill, x);
}

static string SetSkillModifier(string skill, string stat) {
    if(!GetSkill(skill)) return 0;
    else return (SkillModifiers[skill] = stat);
}

string GetSkillModifier(string skill) { return SkillModifiers[skill]; }

string SetClass(string class_name) {
    mixed array args = allocate(3);
    mixed array tmp;
    
    CLASSES_D->SetClass(class_name, args);
    if( Class ) {
	string multi;

	if( !high_mortalp() ) { // Not high mortal
	    return Class;
	}
	if( !args[0] ) { // No such secondary class
	    return Class;
        }
        multi = args[0][Class];
	if( !multi ) { // Can't multi-class in this combo
	    return Class;
	}
	class_name = multi;
    }
    else {
	if( !args[0] ) { // No such class
	    return Class;
	}
	foreach(tmp in args[2]) {
	    SetSkill(tmp...);
	}
    }
    foreach(tmp in args[1]) {
	SetSkill(tmp...);
    }
    return (Class = class_name);
}

string ChangeClass(string class_name)  {
    mixed array args = allocate(3);
    mixed array tmp;
    string cl;
    foreach(cl in GetSkills())  {
        RemoveSkill(cl);
    }
    Class = 0;
    return SetClass(class_name);
}

string GetClass() { return Class; }

int ClassMember(string class_name) {
    return (int)CLASSES_D->ClassMember(Class, class_name);
}

string SetGuild(string guild) { return (Guild = guild); }

string GetGuild() { return Guild; }

int GetBaseStatLevel(string stat) { return 0; }

int SetMorality(int x) { return (Morality = x); }

int GetMorality() { return Morality; }
 
string GetMoralityDescription() {
    string str;
    int x;

    x = GetMorality();
    if( x > 2000 ) str = "saintly";
    else if( x > 1500 ) str = "pious";
    else if( x > 1000 ) str = "benevolent";
    else if( x > 700 ) str = "good";
    else if( x > 450 ) str = "friendly";
    else if( x >= 200 ) str = "nice";
    else if( x > -200 ) str = "neutral";
    else if( x > -450 ) str = "mean";
    else if( x > -700 ) str = "cruel";
    else if( x > -1000 ) str = "wicked";
    else if( x > -1500 ) str = "malevolent";
    else if( x > -2000 ) str = "dastardly";
    else str = "demonic";
    return str;
}

string *SetReligion(string adj, string noun) {
    Religion[0] = adj;
    Religion[1] = noun;
    return Religion;
}

varargs string GetReligion(int flag) { return Religion[flag]; }