mud/lib/domains/town/npc/clepius.c
2020-09-06 05:43:07 -07:00

220 lines
6.2 KiB
C

#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;
SetPolyglot(1);
SetLanguage("common", 100);
SetDefaultLanguage("common");
SetCustomXP(10);
}
void init(){
::init();
}
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 firearms_wounds, wounds;
person = present(dude,environment(this_object()));
slug=present("firearms_wound",person);
wounds=0;
wounds=person->GetLead();
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.");
slug=new("/domains/town/obj/spent");
if(wounds > 0) {
person->AddLead("firearms_wounds", -1);
slug->SetShort("a spent firearm slug");
--wounds;
slug->eventMove(this_object());
if(person->GetLead() < 1){
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;
}
int DiagPatient(string dude, string problem){
if(!present(dude,environment())) {
NextPatient();
return 1;
}
ejectRabble(dude);
if(problem == "regenerate") {
PerformRegenerate(dude);
NextPatient();
}
if(problem == "heal"){
PerformHeal(dude);
NextPatient();
}
if(problem == "excise"){
PerformExcision(dude);
NextPatient();
}
return 1;
}