/* /daemon/classes.c * from the Dead Souls Object Library * handles race configuration and administration * created by Descartes of Borg 960929 * Version: @(#) classes.c 1.4@(#) * Last modified: 96/10/17 */ #include <lib.h> #include <save.h> #include <privs.h> #include "include/classes.h" inherit LIB_DAEMON; private mapping Classes = ([]); static void create() { daemon::create(); if( unguarded((: file_size(SAVE_CLASSES __SAVE_EXTENSION__) :)) > 0 ) unguarded((: restore_object(SAVE_CLASSES) :)); if( !Classes ) Classes = ([]); } static private void validate() { if( !((int)master()->valid_apply(({ PRIV_ASSIST }))) ) error("Illegal attempt to modify class data"); } int ClassMember(string my_class, string query_class) { class Class cls; if( my_class == query_class ) { return 1; } cls = Classes[query_class]; if( !cls ) { // query class is a multi-class, thus must be equal to mine return 0; // This should change for triple classing } return (member_array(my_class, values(cls->Multis)) != -1); } void AddClass(string file) { class Class cls; string array lines, tmp; string class_name; validate(); if( !file_exists(file) ) error("No such file: " + file); lines = explode(read_file(file), "\n"); lines = filter(lines, function(string str) { if( strlen(str) == 0 ) { return 0; } if( str[0] == '#' ) { return 0; } if( str[0] == ' ' || str[0] == '\t' ) { return 0; } return 1; }); class_name = lines[0]; if( Classes[class_name] ) error("Class already exists"); cls = new(class Class); Classes[class_name] = cls; lines = lines[1..]; cls->Multis = ([]); while( sizeof(tmp = explode(lines[0], ":")) == 2 ) { cls->Multis[tmp[0]] = tmp[1]; lines = lines[1..]; } cls->Skills = ([]); while(sizeof(tmp = explode(lines[0], ":")) == 3) { class Skill s = new (class Skill); s->Average = to_int(tmp[1]); s->SkillClass = to_int(tmp[2]); cls->Skills[tmp[0]] = s; if( sizeof(lines) == 1 ) { lines = ({}); break; } else { lines = lines[1..]; } } cls->Complete = 1; save_object(SAVE_CLASSES); } void RemoveClass(string class_name) { validate(); map_delete(Classes, class_name); save_object(SAVE_CLASSES); } void SetClass(string class_name, mixed array args) { class Class cls = Classes[class_name]; mixed array primes, ots; if( !cls || !cls->Complete || sizeof(args) != 3 ) return; args[0] = cls->Multis; primes = ({}); ots = ({}); foreach(string key, class Skill skill in cls->Skills) { if( skill->SkillClass == 1 ) { primes = ({ primes..., ({ key, skill->Average, 1 }) }); } else { ots = ({ ots..., ({ key, skill->Average, skill->SkillClass }) }); } } args[1] = primes; args[2] = ots; } void SetComplete(string class_name) { class Class cls; validate(); if( !Classes[class_name] ) error("No such class"); else cls = Classes[class_name]; cls->Complete = 1; save_object(SAVE_CLASSES); } varargs string array GetClasses() { return filter(keys(Classes), (: ((class Class)Classes[$1])->Complete :)); } string GetHelp(string class_name) { class Class cls = Classes[class_name]; string help = "Class: " + class_name + "\n\n"; if( !cls ) return 0; if( !sizeof(cls->Multis) ) { help += capitalize(class_name) + " cannot multi-class.\n"; } else { help += capitalize(pluralize(class_name)) + " can multi-class with " + "the following primary classes:\n"; foreach(string prime, string other in cls->Multis) { help += "\t" + capitalize(class_name) + " + " + prime + " = " + other + "\n"; } } help += "\n" + capitalize(pluralize(class_name)) + " has the following " + "primary skills:\n"; foreach(string skill, class Skill s in cls->Skills) { if( s->SkillClass == 1 ) { help += "\t" + skill + "\n"; } } return help + "\n"; }