#include <lib.h>

inherit LIB_NPC;

object *slips;
int busy;

static void create() {
    npc::create();
    SetKeyName("clepius");
    SetId(({"clepius","doctor","healer"}));
    SetAdjectives(({"a.s.", "A.S.", "doctor","dr","Dr.","dr."}));
    SetShort("Clepius the healer");
    SetLong("Clepius is a kindly old man, legendary for his "
      "nearly superhuman powers of healing. He is even "
      "rumored capable of resurrecting the dead. He runs "
      "a medical care service in town, and can be asked to "
      "help when needed, though his help is not free.");
    SetLevel(50);
    SetRace("human");
    SetClass("mage");
    SetGender("male");
    SetInventory(([
	"/domains/town/weap/rod":1,
	"/domains/town/obj/medbag":1,
	"/domains/town/armor/toga":"wear toga",
      ]) );
    slips = ({});
    busy=0;
}

int CanReceive() {
    if(present("healer token", this_object())){
	return 0;
    }

    eventForce("nod");
    set_heart_beat(1);
    return 1;
}

int CheckBag(){
    object bag,slip;
    string player, problem;
    slip = present("healer token", this_object());
    if(!slip && busy == 1) {
	eventForce("say That's a bit odd...\n\n");
	eventForce("I'm sorry but I must have misplaced your slip. Do you have another one?");
	busy = 0;
	return 1;
    }
    if(slip){
	busy = 1;
	eventForce("say mmhmmm...");
	problem = slip->GetProperty("problem");
	player = slip->GetPatient();
	this_object()->DiagPatient(player,problem);
    }
    return 1;
}

void heart_beat(){
    if(busy == 0 && present("healer token", this_object())){
    }

    this_object()->CheckBag();
}

int ejectRabble(string str){
    object *riffraff,patient;
    environment()->SetProperty("busy",1);
    riffraff = get_livings(environment(this_object()));
    if(! patient = present(str,environment(this_object())) ){
	patient = find_player(str);
    }
    foreach(object bum in riffraff){
	if( bum->GetKeyName() != patient->GetKeyName() &&
	  bum->GetKeyName() != "clepius" ){
	    tell_object(bum,"The doctor ejects you from his office in order to "+
	      "treat "+patient->GetName()+".\n\n");
	    bum->eventMoveLiving("/domains/town/room/healer");
	    tell_object(patient,"The doctor ejects "+bum->GetName()+" from "+
	      "his office in order to treat you.");
	}
    }
    return 1;
}

int NextPatient(){
    eventForce("put my first slip in bin");
    environment()->SetProperty("busy",0);
    tell_room(load_object("/domains/town/room/healer"),"From the back room "+
      "you hear the doctor holler: \"%^BOLD%^CYAN%^NEXT!%^RESET%^\"");
    tell_room(environment(),"The doctor leans into the east doorway "+
      "and hollers: \"%^BOLD%^CYAN%^NEXT!%^RESET%^\"");
    busy = 0;
    environment()->SetProperty("busy",0);
    return 1;

}

int PerformHeal(string dude){
    object person;
    int hp,mhp;
    person = present(dude,environment());
    if(!person) {
	eventForce("look");
	eventForce("shrug");
	return 1;
    }
    eventForce("say All right...let's take a look at you.");
    hp = person->GetHealthPoints();
    mhp = person->GetMaxHealthPoints()-10;
    if(hp > mhp){
	eventForce("say You look fine to me. Take back your slip and save it for when you really need it.");
	eventForce("give my first slip to "+dude);
	return 1;
    }
    if(present("clepius mojo",person)){
	eventForce("say You already have salve on you. Give it a chance to work, then come back later.");
	eventForce("give my first slip to "+dude);
	return 1;
    }
    eventForce("say Yes, you can use a little help.");
    tell_room(environment(),"Clepius vigorously rubs a healing salve onto your body. You can feel it enhancing your body's recovery.");
    new("/secure/obj/mojo")->eventMove(person);
    return 1;
}

int PerformRegenerate(string dude){
    int i;
    mapping stumps;
    object person;
    person = present(dude,environment());
    stumps=person->GetMissingLimbs();

    eventForce("say Let's count limbs, then. Hmmmm...");

    if(!sizeof(stumps)) {
	eventForce("say You are not missing any limbs. Go sell this slip back to James.");
	eventForce("give my first slip to "+dude);
	return 1;
    }
    for(i=0;i<sizeof(stumps);i++){
	person->RestoreLimb(stumps[i]);
	tell_object(person,"The doctor regenerates your "+stumps[i]+".");
	return 1;
    }
}

int PerformExcision(string dude){
    string what,whom;
    object person,thing,slug;
    int rifleshot_wounds,firearms_wounds,wounds;

    person = present(dude,environment(this_object()));
    slug=present("firearms_wound",person);
    wounds=0;
    wounds=person->GetLead("gunshot_wounds");
    wounds+=person->GetLead("rifleshot_wounds");
    if(!slug){
	eventForce("say You have no foreign bodies.");
	eventForce("give my first slip to "+dude);
	return 1;
    }

    tell_room(environment(this_object()),"Clepius deftly extracts a lead slug from "+ dude+".", ({person}));
    tell_object(person,"Clepius deftly extracts a lead slug from your body.");
    firearms_wounds=person->GetLead("firearms_wounds");
    rifleshot_wounds=person->GetLead("rifleshot_wounds");
    firearms_wounds=person->GetLead("firearms_wounds");
    rifleshot_wounds=person->GetLead("rifleshot_wounds");
    slug=new("/domains/town/obj/spent");
    if(person->GetLead("gunshot_wounds") > 0) {
	person->AddLead("gunshot_wounds", -1);
	slug->SetShort("a spent pistol slug");
	--wounds;
	slug->eventMove(this_object());
	if(person->GetLead() < 1){                                         
	    slug=present("firearms_wound",person);
	    if(slug) slug->eventDestruct();
	    return 1;
	}
	return 1;
    }
    if(person->GetLead("rifleshot_wounds") > 0){                                 
	person->AddLead("rifleshot_wounds", -1);
	slug->SetShort("a spent rifle slug");                                 
	--wounds;
	slug->eventMove(this_object());                                 
	if(person->GetLead() < 1){
	    if(slug) slug->eventDestruct();
	    slug=present("firearms_wound",person);
	    if(slug) slug->eventDestruct();
	    return 1;
	}
    }
    slug->eventMove(this_object());
    slug=present("firearms_wound",person);
    if(wounds < 1 && slug){                                 
	slug->eventDestruct();
	return 1;                         
    }

    return 1;
}

int DiagPatient(string dude, string problem){
    if(!present(dude,environment())) {
	NextPatient();
	return 1;
    }

    ejectRabble(dude);

    if(problem == "regenerate") {
	PerformRegenerate(dude);
	NextPatient();
	return 1;
    }

    if(problem == "heal"){
	PerformHeal(dude);
	NextPatient();
	return 1;
    }

    if(problem == "excision"){
	PerformExcision(dude);
	NextPatient();
	return 1;
    }

}


