nightmare4_fluffos_v1/
nightmare4_fluffos_v1/bin/
nightmare4_fluffos_v1/fluffos-2.9-ds2.14/
nightmare4_fluffos_v1/fluffos-2.9-ds2.14/ChangeLog.old/
nightmare4_fluffos_v1/fluffos-2.9-ds2.14/Win32/
nightmare4_fluffos_v1/fluffos-2.9-ds2.14/compat/
nightmare4_fluffos_v1/fluffos-2.9-ds2.14/compat/simuls/
nightmare4_fluffos_v1/fluffos-2.9-ds2.14/include/
nightmare4_fluffos_v1/fluffos-2.9-ds2.14/testsuite/
nightmare4_fluffos_v1/fluffos-2.9-ds2.14/testsuite/clone/
nightmare4_fluffos_v1/fluffos-2.9-ds2.14/testsuite/command/
nightmare4_fluffos_v1/fluffos-2.9-ds2.14/testsuite/data/
nightmare4_fluffos_v1/fluffos-2.9-ds2.14/testsuite/etc/
nightmare4_fluffos_v1/fluffos-2.9-ds2.14/testsuite/include/
nightmare4_fluffos_v1/fluffos-2.9-ds2.14/testsuite/inherit/
nightmare4_fluffos_v1/fluffos-2.9-ds2.14/testsuite/inherit/master/
nightmare4_fluffos_v1/fluffos-2.9-ds2.14/testsuite/log/
nightmare4_fluffos_v1/fluffos-2.9-ds2.14/testsuite/single/
nightmare4_fluffos_v1/fluffos-2.9-ds2.14/testsuite/single/tests/compiler/
nightmare4_fluffos_v1/fluffos-2.9-ds2.14/testsuite/single/tests/efuns/
nightmare4_fluffos_v1/fluffos-2.9-ds2.14/testsuite/single/tests/operators/
nightmare4_fluffos_v1/fluffos-2.9-ds2.14/testsuite/u/
nightmare4_fluffos_v1/fluffos-2.9-ds2.14/tmp/
nightmare4_fluffos_v1/fluffos-2.9-ds2.14/windows/
nightmare4_fluffos_v1/lib/cfg/
nightmare4_fluffos_v1/lib/cmds/admins/
nightmare4_fluffos_v1/lib/cmds/common/
nightmare4_fluffos_v1/lib/cmds/creators/include/
nightmare4_fluffos_v1/lib/cmds/creators/include/SCCS/
nightmare4_fluffos_v1/lib/cmds/hm/
nightmare4_fluffos_v1/lib/daemon/services/
nightmare4_fluffos_v1/lib/doc/
nightmare4_fluffos_v1/lib/doc/faq/
nightmare4_fluffos_v1/lib/doc/help/classes/
nightmare4_fluffos_v1/lib/doc/help/creators/
nightmare4_fluffos_v1/lib/doc/help/hm/
nightmare4_fluffos_v1/lib/doc/help/players/
nightmare4_fluffos_v1/lib/doc/help/races/
nightmare4_fluffos_v1/lib/doc/help/religion/
nightmare4_fluffos_v1/lib/doc/mudlib/
nightmare4_fluffos_v1/lib/doc/mudlib/cfg/
nightmare4_fluffos_v1/lib/domains/Ylsrim/
nightmare4_fluffos_v1/lib/domains/Ylsrim/adm/
nightmare4_fluffos_v1/lib/domains/Ylsrim/armour/
nightmare4_fluffos_v1/lib/domains/Ylsrim/fish/
nightmare4_fluffos_v1/lib/domains/Ylsrim/meal/
nightmare4_fluffos_v1/lib/domains/Ylsrim/npc/
nightmare4_fluffos_v1/lib/domains/Ylsrim/virtual/
nightmare4_fluffos_v1/lib/domains/Ylsrim/weapon/
nightmare4_fluffos_v1/lib/domains/Ylsrim/xtra/
nightmare4_fluffos_v1/lib/lib/comp/
nightmare4_fluffos_v1/lib/lib/lvs/
nightmare4_fluffos_v1/lib/lib/std/
nightmare4_fluffos_v1/lib/lib/user/
nightmare4_fluffos_v1/lib/news/
nightmare4_fluffos_v1/lib/obj/
nightmare4_fluffos_v1/lib/obj/include/
nightmare4_fluffos_v1/lib/save/
nightmare4_fluffos_v1/lib/save/kills/a/
nightmare4_fluffos_v1/lib/save/kills/b/
nightmare4_fluffos_v1/lib/save/kills/f/
nightmare4_fluffos_v1/lib/save/kills/m/
nightmare4_fluffos_v1/lib/save/kills/q/
nightmare4_fluffos_v1/lib/save/kills/r/
nightmare4_fluffos_v1/lib/secure/cfg/
nightmare4_fluffos_v1/lib/secure/cfg/classes/
nightmare4_fluffos_v1/lib/secure/cfg/races/SCCS/
nightmare4_fluffos_v1/lib/secure/cmds/creators/include/
nightmare4_fluffos_v1/lib/secure/cmds/players/
nightmare4_fluffos_v1/lib/secure/cmds/players/include/
nightmare4_fluffos_v1/lib/secure/daemon/include/
nightmare4_fluffos_v1/lib/secure/lib/
nightmare4_fluffos_v1/lib/secure/lib/include/
nightmare4_fluffos_v1/lib/secure/lib/net/
nightmare4_fluffos_v1/lib/secure/lib/std/
nightmare4_fluffos_v1/lib/secure/obj/
nightmare4_fluffos_v1/lib/secure/obj/include/
nightmare4_fluffos_v1/lib/secure/save/
nightmare4_fluffos_v1/lib/secure/save/boards/
nightmare4_fluffos_v1/lib/secure/save/votes/
nightmare4_fluffos_v1/lib/spells/
nightmare4_fluffos_v1/lib/verbs/admins/include/
nightmare4_fluffos_v1/lib/verbs/common/
nightmare4_fluffos_v1/lib/verbs/common/include/
nightmare4_fluffos_v1/lib/verbs/creators/
nightmare4_fluffos_v1/lib/verbs/creators/include/
nightmare4_fluffos_v1/lib/verbs/players/include/SCCS/
nightmare4_fluffos_v1/lib/verbs/rooms/
nightmare4_fluffos_v1/lib/verbs/rooms/include/
nightmare4_fluffos_v1/lib/www/
nightmare4_fluffos_v1/old/
nightmare4_fluffos_v1/old/tools/
nightmare4_fluffos_v1/win32/
/*    /lib/trainer.c
 *    from the Nightmare IVr4 Library
 *    created 960320 by Blitz@Nightmare
 *    Version: @(#) trainer.c 1.3@(#)
 *    Last modified: 96/10/28
 */
 
#include <lib.h>
#include <daemons.h>
#include "include/trainer.h"
 
inherit LIB_SENTIENT;
 
private string array TrainingSkills;
private mapping Students;
 
/**** driver applies ****/
 
static void create() {
    sentient::create();
    TrainingSkills = ({});   
    Students = ([]);
    SetNoClean(1);
    SetCommandResponses( ([
      ({ "train", "teach" }) : (: eventTrain :),
      "default" : (: eventHelp :),
    ]) );
}
 
static void init() {
    string str;
    ::init();
    if( !living(this_player()) ) return;
    str = (string)this_player()->GetKeyName();
    if( Students[str] ) {
        eventForce("speak You will have to start your "             
                   "studies anew, "+(string)this_player()->GetName());
        map_delete(Students, str);
    }
}
 
/**** data manipulation ****/
 
mixed AddTrainingSkills(string *args...) {
    if( !args || !arrayp(args) ) 
        error("Bad argument 1 to AddTrainingSkills.");
    return (TrainingSkills = distinct_array(TrainingSkills + args));
}
 
mixed RemoveTrainingSkills(string *args...) {
    if( !args || !arrayp(args) ) 
        error("Bad argument 1 to RemoveTrainingSkills.");
    TrainingSkills -= args;
    return TrainingSkills;
}
 
string array GetTrainingSkills() { return copy(TrainingSkills); }
 
mapping GetStudents() { return copy(Students); }
 
/**** high-level events ****/
 
int eventHelp(object who, string unused) {
    eventForce("speak I am not sure of what you are "
               "asking " + (string)who->GetName() + ".");
    eventForce("speak My area of expertise covers " +
               conjunction(TrainingSkills) + ".");
    eventForce("speak You can \"ask "+GetKeyName()+" to teach "
               "<SKILL>\" if you have training points.");
    return 1;
}
 
int eventTrain(object who, string verb, string skill) {
    if( !who || environment(who) != environment() ) {
	return 0;
    }
    if( !sizeof(skill) || !sizeof(verb) ) return eventHelp(who, 0);
    if( verb == "train" ) {
	object ob = SPELLS_D->GetSpell(skill);

	if( ob ) {
	    foreach(string sk in ob->GetSkills()) {
		if( GetSkillLevel(sk) < ob->GetRequiredSkill(sk) ) {
		    eventForce("speak I don't know " + skill + ".");
		    return 0;
		}
	    }
	    if( !who->eventLearnSpell(skill) ) {
		eventForce("speak You are no prepared for that spell!");
		return 0;
	    }
	    who->eventPrint(GetName() + " touches your forehead and gives "
			    "you knowledge of " + skill + ".");
	    environment()->eventPrint(GetName() + " touches " +
				      possessive_noun(who) +
				      " forehead and gives " +
				      objective(who) + " knowledge of " +
				      skill + ".", who);
	    return 1;
	}
    }
    skill = lower_case(skill);
    if( creatorp(who) ) {
        who->eventPrint("Creators do not have skills, get a life.");
        return 1;
    }
    if( Students[ (string)who->GetKeyName() ] ) {
        eventForce("speak I am already training you!");
        return 0;
    }
    if( member_array(skill, TrainingSkills) == -1 ) {
        eventForce("speak I know nothing about the art of " +
                   skill + ".");
        return 0;
    }
    if( member_array(skill, 
           (string *)this_player()->GetSkills() ) == -1 ) {
        eventForce("speak You do not appear to be the type "
                   "who would be skilled in " + skill + "!");
        return 0;
    }
    if( (int)this_player()->GetTrainingPoints() < 1 ) {
        eventForce("speak Fool! You need training points for that!");        
        return 0;
    }
    Students[ (string)who->GetKeyName() ] = skill;
    eventStart(who, skill);
    call_out((: ContinueTraining, who, skill, 0 :), TRAINING_WAIT);
    return 1;
}
 
static int ContinueTraining(object who, string skill, int x) {
    if( !present(who, environment()) ) return 0;
    if( !Students[(string)who->GetKeyName()] ) return 0;
    if( x > 4 ) {
        map_delete(Students, (string)who->GetKeyName());
        eventComplete(who, skill);
        who->eventTrain(skill, 1);
        return 1;
    } else {
        eventContinue(who, skill, ++x);
        call_out((: ContinueTraining, who, skill, x :), TRAINING_WAIT);
        return 1;
    }
}
 
/**** message handling events ****/
 
/*  The three following events are purely *aesthetic*,
 *  Hopefully prolific coders will override them for  
 *  more interesting training techniques. :) 
 */
 
int eventStart(object who, string skill) {
    who->eventPrint(GetName() + " begins teaching you "
                   "about the skill of " + skill + ".");
    environment()->eventPrint(GetName() + " begins teaching " +
                             (string)who->GetName() + "...", who);
    return 1;
}
 
int eventContinue(object who, string skill, int x) {
    who->eventPrint("You listen intently as " + GetName()
                    + " continues " + possessive(this_object())
                    + " dissertation on " + skill + ".");
    return 1;
}
 
int eventComplete(object who, string skill) {
    who->eventPrint("You feel more adept with your " + skill + ".");
    eventForce("speak I can teach you no more for now, " +
              (string)who->GetName() + ".");
    return 1;
}