dsIIr4/bin/
dsIIr4/extra/creremote/
dsIIr4/extra/wolfpaw/
dsIIr4/lib/cmds/admins/
dsIIr4/lib/cmds/common/
dsIIr4/lib/cmds/creators/include/
dsIIr4/lib/cmds/creators/include/SCCS/
dsIIr4/lib/daemon/services/
dsIIr4/lib/doc/
dsIIr4/lib/domains/Ylsrim/
dsIIr4/lib/domains/Ylsrim/adm/
dsIIr4/lib/domains/Ylsrim/armor/
dsIIr4/lib/domains/Ylsrim/broken/
dsIIr4/lib/domains/Ylsrim/fish/
dsIIr4/lib/domains/Ylsrim/meal/
dsIIr4/lib/domains/Ylsrim/npc/
dsIIr4/lib/domains/Ylsrim/virtual/
dsIIr4/lib/domains/Ylsrim/weapon/
dsIIr4/lib/domains/campus/adm/
dsIIr4/lib/domains/campus/etc/
dsIIr4/lib/domains/campus/meals/
dsIIr4/lib/domains/campus/npc/
dsIIr4/lib/domains/campus/save/
dsIIr4/lib/domains/campus/txt/
dsIIr4/lib/domains/campus/txt/ai/charles/
dsIIr4/lib/domains/campus/txt/ai/charles/bak2/
dsIIr4/lib/domains/campus/txt/ai/charles/bak2/bak1/
dsIIr4/lib/domains/campus/txt/ai/charly/
dsIIr4/lib/domains/campus/txt/ai/charly/bak/
dsIIr4/lib/domains/campus/txt/jenny/
dsIIr4/lib/domains/default/creator/
dsIIr4/lib/domains/default/doors/
dsIIr4/lib/domains/default/etc/
dsIIr4/lib/domains/default/virtual/
dsIIr4/lib/domains/default/weap/
dsIIr4/lib/domains/town/virtual/
dsIIr4/lib/lib/comp/
dsIIr4/lib/lib/lvs/
dsIIr4/lib/lib/user/
dsIIr4/lib/lib/virtual/
dsIIr4/lib/log/
dsIIr4/lib/obj/book_source/
dsIIr4/lib/obj/include/
dsIIr4/lib/realms/template/
dsIIr4/lib/realms/template/adm/
dsIIr4/lib/realms/template/area/armor/
dsIIr4/lib/realms/template/area/npc/
dsIIr4/lib/realms/template/area/obj/
dsIIr4/lib/realms/template/area/room/
dsIIr4/lib/realms/template/area/weap/
dsIIr4/lib/realms/template/bak/
dsIIr4/lib/realms/template/cmds/
dsIIr4/lib/save/
dsIIr4/lib/save/kills/o/
dsIIr4/lib/secure/cfg/classes/
dsIIr4/lib/secure/cmds/creators/include/
dsIIr4/lib/secure/cmds/players/
dsIIr4/lib/secure/cmds/players/include/
dsIIr4/lib/secure/daemon/include/
dsIIr4/lib/secure/lib/
dsIIr4/lib/secure/lib/include/
dsIIr4/lib/secure/lib/net/include/
dsIIr4/lib/secure/lib/std/
dsIIr4/lib/secure/modules/
dsIIr4/lib/secure/npc/
dsIIr4/lib/secure/obj/include/
dsIIr4/lib/secure/room/
dsIIr4/lib/secure/save/
dsIIr4/lib/secure/save/boards/
dsIIr4/lib/secure/save/players/g/
dsIIr4/lib/secure/tmp/
dsIIr4/lib/secure/verbs/creators/
dsIIr4/lib/shadows/
dsIIr4/lib/spells/
dsIIr4/lib/std/board/
dsIIr4/lib/std/lib/
dsIIr4/lib/tmp/
dsIIr4/lib/verbs/admins/include/
dsIIr4/lib/verbs/common/
dsIIr4/lib/verbs/common/include/
dsIIr4/lib/verbs/creators/include/
dsIIr4/lib/verbs/players/include/SCCS/
dsIIr4/lib/verbs/rooms/
dsIIr4/lib/verbs/rooms/include/
dsIIr4/lib/www/
dsIIr4/v22.2b14-dsouls2/
dsIIr4/v22.2b14-dsouls2/ChangeLog.old/
dsIIr4/v22.2b14-dsouls2/Win32/
dsIIr4/v22.2b14-dsouls2/compat/
dsIIr4/v22.2b14-dsouls2/compat/simuls/
dsIIr4/v22.2b14-dsouls2/include/
dsIIr4/v22.2b14-dsouls2/mudlib/
dsIIr4/v22.2b14-dsouls2/testsuite/
dsIIr4/v22.2b14-dsouls2/testsuite/clone/
dsIIr4/v22.2b14-dsouls2/testsuite/command/
dsIIr4/v22.2b14-dsouls2/testsuite/data/
dsIIr4/v22.2b14-dsouls2/testsuite/etc/
dsIIr4/v22.2b14-dsouls2/testsuite/include/
dsIIr4/v22.2b14-dsouls2/testsuite/inherit/
dsIIr4/v22.2b14-dsouls2/testsuite/inherit/master/
dsIIr4/v22.2b14-dsouls2/testsuite/log/
dsIIr4/v22.2b14-dsouls2/testsuite/single/
dsIIr4/v22.2b14-dsouls2/testsuite/single/tests/compiler/
dsIIr4/v22.2b14-dsouls2/testsuite/single/tests/efuns/
dsIIr4/v22.2b14-dsouls2/testsuite/single/tests/operators/
dsIIr4/v22.2b14-dsouls2/testsuite/u/
dsIIr4/v22.2b14-dsouls2/tmp/
dsIIr4/win32/
/*    /lib/classes.c
 *    from the Dead Souls LPC Library
 *    classes and clan 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, Clan;
private mapping SkillModifiers;
private string *Religion;

static void create() {
    abilities::create();
    SkillModifiers = ([]);
    Religion = allocate(2);
    Class = 0;
    Clan = 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)  {
    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 SetClan(string clan) { return (Clan = clan); }

string GetClan() { return Clan; }

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