mud/lib/domains/default/armor/arbitersuit.c
2020-09-06 05:43:07 -07:00

183 lines
5.2 KiB
C

#include <lib.h>
#include <armor_types.h>
#include <damage_types.h>
inherit LIB_BANE;
inherit LIB_WORN_STORAGE;
object arbitershadow;
int active = 1;
int charge = 20000;
int maxcharge = 20000;
int disguised = 0;
varargs mixed GetSuitHelp(mixed who, string where);
static void create(){
::create();
SetKeyName("arbiter suit");
SetId(({"suit", "armor"}));
SetAdjectives(({"arbiter","suit of","powered","formidable", "formidable looking"}));
SetShort("a suit of powered arbiter armor");
SetLong("A formidable looking suit of powered armor used by "+
"forces of the Extant Authority. This one appears to be one of "+
"the arbiter variety.");
SetMass(7000);
SetMatching(0);
SetBaseCost("silver",50000);
SetArmorType(A_CUSTOM);
SetRestrictLimbs( ({
"torso", "head", "neck",
"right arm", "left arm",
"right leg", "left leg",
"right hand", "left hand",
"right foot", "left foot",
}) );
AddSave( ({ "charge", "disguised" }) );
SetMaxCarry(5000);
SetWear((: GetSuitHelp :));
}
void init(){
::init();
add_action("GetSuitHelp", "help");
}
varargs mixed GetSuitHelp(mixed who, string where){
string ret, str;
object env;
if(!who) return 0;
if(stringp(who)){
str = who;
who = this_player();
}
else str = GetKeyName();
env = environment(who);
if(query_verb() == "wear" || (str && answers_to(str, this_object()))){
if(environment() == who && charge){
ret = "The suit's Heads Up Display crackles to life and reads:\n ";
ret += "%^GREEN%^This suit allows you, mighty Arbiter, to travel in hazardous terrain "+
"with a minimum of inconvenience. In the interest of fulfilling the exigencies "+
"of your duties to the Extant Authority, this suit provides the following "+
"improvements to your abilities:\n\n"+
"* Good vision in all light conditions.\n"+
"* A constant supply of breathable air.\n"+
"* Substantial enhancement of strength, coordination, agility, and durability.\n"+
"* Substantial enhancement of unarmed combat capability.\n"+
"* Heads Up Display of key environmental information.\n"+
"* Grid coordinate information where available.\n"+
"* Protection from all forms of external damage.\n"+
"* Immunity from disease.\n"+
"\nNote that once the power level of the suit reaches zero, all enhancements "+
"become unavailable.%^RESET%^";
who->eventPrint("You wear "+GetShort()+".");
if(env) tell_room(env, who->GetName()+" wears "+
GetShort()+".", ({who}));
return 1;
}
}
return 0;
}
mixed eventEquip(object who, string array limbs){
mixed success = ::eventEquip(who, limbs);
arbitershadow = new("/shadows/arbiter");
if(arbitershadow) arbitershadow->SetDisguised(disguised);
if(success){
if(arbitershadow) arbitershadow->eventShadow(who);
}
else if(arbitershadow) destruct(arbitershadow);
return success;
}
varargs mixed eventUnequip(object who) {
mixed success;
if(!who) who = this_player();
success = ::eventUnequip(who);
if(success){
if(arbitershadow) who->unarbitershadow();
}
return success;
}
int GetActive(){
if(!charge) return 0;
return active;
}
int SetActive(int i){
if(i) active = 1;
else active = 0;
return active;
}
int eventDecrementCharge(int i){
int perc;
object env = environment();
if(!env) return 0;
if(!GetWorn()) return 0;
if(previous_object() != arbitershadow) return 0;
if(charge < 1) charge = 0;
else {
if(!i) charge--;
else charge -= i;
if(charge < 0) charge = 0;
}
perc = to_int(percent(charge, maxcharge));
if(perc < 10){
if(living(env) && creatorp(env)){
env->eventPrint("Your creator powers magically recharge the "+
remove_article(GetShort())+".");
charge = maxcharge;
return charge;
}
tell_object(env,"The "+remove_article(GetShort())+" beeps loudly!");
return charge;
}
if(perc < 20){
if(living(env) && creatorp(env)){
env->eventPrint("Your creator powers magically recharge the "+
remove_article(GetShort())+".");
charge = maxcharge;
return charge;
}
tell_object(env,"The "+remove_article(GetShort())+" beeps softly.");
return charge;
}
return charge;
}
int GetRemainingCharge(){
if(!charge || !GetWorn()){
if(arbitershadow) arbitershadow->eventUnshadow();
return 0;
}
return charge;
}
int GetMaxCharge(){
return maxcharge;
}
int SetCharge(int i){
charge = i;
return charge;
}
int SetMaxCharge(int i){
maxcharge = i;
return maxcharge;
}
string array GetBane(){
if(GetActive()) return ({ "all" });
else return ({});
}
string array QueryBane(){
if(GetActive()) return ({ "all" });
else return ({});
}