mud/lib/shadows/ring.c
2020-09-06 05:43:07 -07:00

133 lines
4.4 KiB
C

#include <daemons.h>
#include <damage_types.h>
inherit LIB_SHADOW;
int reporting = 1;
int protecting = 1;
varargs int eventReceiveDamage(mixed agent, int type, int x, int internal, mixed limbs) {
int stamina, fatigue, hp, damage, damdiff;
object ob = GetShadowedObject();
string evidence, limb_string;
if(reporting){
string *damtypes = TYPES_D->eventCalculateTypes("damage", type);
evidence = "%^BOLD%^%^RED%^";
if(objectp(agent)) evidence += "You receive damage from "+agent->GetKeyName();
else if(stringp(agent)) evidence += "You receive damage from "+agent;
evidence +=".";
if(type && sizeof(damtypes)) {
string verboid;
if(sizeof(damtypes) > 1) verboid = "s are ";
else verboid = " is ";
evidence += " Damage type"+verboid;
evidence += lower_case(implode(damtypes,", "));
}
else evidence += " Damage type is UNKNOWN";
if(x) evidence += ", raw damage is "+x;
if(internal) evidence += ", internal variable is "+internal;
if(limbs) {
if(stringp(limbs)) limb_string = limbs;
else if(arrayp(limbs)) {
if(stringp(limbs[0])) limb_string = implode(limbs,", ");
else if(objectp(limbs[0])){
foreach(object limb in limbs){
limb_string += limb->GetKeyName()+", ";
}
}
}
}
else limb_string = ", and you can't tell where you're hit. ";
if(limbs) {
evidence += ", body part(s) affected: ";
evidence += limb_string + ".";
}
this_object()->eventPrint(evidence+"%^RESET%^");
hp = this_object()->GetHealthPoints();
stamina = this_object()->GetStaminaPoints();
if(!agent) agent = this_object();
if(!type) type = 0;
if(!x) x = 0;
if(!internal) internal = 0;
if(!limbs) limbs = "";
if(x > this_object()->GetHealthPoints() &&
!(this_object()->GetGodMode()) ){
this_object()->eventPrint("%^RED%^This could have been a fatal hit. "+
"The ring's safety protocol prevents \"actual damage\" calculation "+
"from proceeding.%^RESET%^");
return 1;
}
if(ob) ob->eventReceiveDamage(agent, type, x, internal, limbs);
damage = this_object()->GetHealthPoints();
fatigue = stamina - this_object()->GetStaminaPoints();
damdiff = hp - damage;
this_object()->eventPrint("%^RED%^Actual damage done: "+damdiff+"%^RESET%^");
this_object()->eventPrint("%^YELLOW%^Stamina sapped: "+fatigue+"%^RESET%^");
if(protecting && ob){
ob->AddHP(damdiff+1);
this_object()->AddStaminaPoints(fatigue+1);
}
}
else if(!protecting && ob)
return ob->eventReceiveDamage(agent, type, x, internal, limbs);
return 1;
}
int RemoveLimb(string limb, object agent){
object ob = GetShadowedObject();
if(!ob) return 0;
if(protecting){
this_object()->eventPrint("you have received enough damage to sever it. "+
"However, The ring's protection prevents that.");
return 1;
}
else return ob->RemoveLimb(limb, agent);
}
int AddHP(int hp){
object ob = GetShadowedObject();
if(protecting && hp < 0){
if(reporting)
this_object()->eventPrint(identify(previous_object())+" tried to "+
"deduct "+abs(hp)+" health. The ring's protection prevents it.");
return 1;
}
if(reporting){
string operation = "add";
if(hp < 0) operation = "subtract";
this_object()->eventPrint(identify(previous_object())+" tried to "+
operation+" "+abs(hp)+" health.");
}
if(ob) return ob->AddHP(hp);
else return 1;
}
int JadeProtection(int i){
object ob = GetShadowedObject();
if(!this_player()) return 0;
if(!ob || !(this_player() == ob )) return 0;
protecting = i;
return protecting;
}
int JadeReporting(int i){
object ob = GetShadowedObject();
if(!this_player()) return 0;
if(!ob || !(this_player() == ob )) return 0;
reporting = i;
return reporting;
}
int eventUnshadow(){
object ob = GetShadowedObject();
if(!this_player()) return 0;
if(!ob || !(this_player() == ob )) return 0;
return ::eventUnshadow();
}