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

214 lines
6.5 KiB
C

#include <lib.h>
#include ROOMS_H
#include <vendor_types.h>
#include <damage_types.h>
#define PLAYER_INFECTABLE 0
inherit LIB_GERM;
int damage1();
int damage2();
int damage3();
int damage4();
int damage5();
int DangerLevel();
object global_ob,victim,where;
string victimname;
int MakeHostile(object ob){
object *meat = get_livings(environment(ob));
global_ob = ob;
meat = filter(meat, (: !(base_name($1) == base_name(global_ob)) :));
meat = filter(meat, (: !($1->GetInvis()) :));
foreach(object new_meat in meat){
ob->AddEnemy(new_meat);
}
return 1;
}
int InfectMess(object ob){
victim=ob;
victimname=victim->GetName();
if(interactive(victim) && !PLAYER_INFECTABLE) {
eventDestruct();
return 1;
}
tell_room(environment(victim), "%^BOLD%^RED%^"+victimname+" suddenly lets out a bloodcurdling scream!%^RESET%^",({victim}) );
tell_object(victim, "%^BOLD%^RED%^You scream as you are suddenly possessed by an uncontrollable rage!%^RESET%^");
ob->SetEncounter(100);
ob->SetMelee(1);
if(ob->GetRace() != "human" && ob->GetRace() != "orc") MakeHostile(ob);
return 1;
}
void create(){
germ::create();
SetKeyName("rage virus");
SetGermName("rage virus");
SetId(({"rv2"}));
SetLong("Rage Virus v2");
SetCure(20);
SetCommunicable(30);
SetLifeSpan(999);
SetType("viral");
SetInfect((: InfectMess :));
}
void bonuses(){
if(!this_object()) return;
if(victim && environment(this_object()) == victim){
victim->AddStatBonus("intelligence", -25);
victim->AddStatBonus("strength", 35);
victim->AddStatBonus("charisma", -35);
victim->AddStatBonus("durability", 35);
victim->AddStatBonus("agility", 35);
victim->AddStatBonus("coordination", 35);
victim->AddStatBonus("speed", 35);
victim->AddStatBonus("wisdom", -25);
}
else if(victim) {
foreach( string stat in ({"intelligence", "strength",
"charisma", "durability", "agility", "coordination", "speed", "wisdom"})){
victim->RemoveStatBonus(stat);
}
}
return;
}
void init(){
if(!this_object()) return;
germ::init();
bonuses();
}
int eventDestruct(){
this_object()->eventMove(ROOM_FURNACE);
return ::eventDestruct();
}
int eventMove(mixed dest){
int ret = germ::eventMove(dest);
if(this_object() && environment() && !living(environment())) victim = 0;
bonuses();
return ret;
}
int eventSuffer(object ob){
int x;
if(!ob) return;
x=random(50);
if(x < 5) damage1();
else if(x < 10) damage2();
else if(x < 15) damage3();
else if(x < 20) damage4();
else if(x < 2) damage5();
return 1;
}
int DangerLevel(){
if(victim && victim->GetHealthPoints() < 2) return 100;
return 1;
}
int FatigueLevel() {
if(victim && victim->GetStaminaPoints() < 11) return 10;
return 11;
}
string GetAffectLong(object ob) {
if(!ob || !living(ob)) return 0;
return "%^BOLD%^RED%^"+ob->GetName() + " looks crazed and violently insane!%^RESET%^";
}
int damage1(){
if(victim){
tell_object(victim,"%^BOLD%^RED%^You feel blinded by hatred and madness!%^RESET%^");
tell_room(environment(victim),victimname+" looks maniacally insane and drools uncontrollably.", ({victim}) );
victim->AddStaminaPoints(random(50)+10);
victim->AddStatBonus("strength", 10);
victim->AddStatBonus("durability", 10);
victim->AddStatBonus("agility", 10);
victim->AddStatBonus("coordination", 10);
victim->AddStatBonus("speed", 10);
MakeHostile(victim);
}
return 1;
}
int damage2(){
if(victim){
tell_object(victim,"%^BOLD%^RED%^You feel your body exploding with rage!%^RESET%^");
tell_room(environment(victim),victimname+" is shaking with fury.", ({victim}) );
victim->AddStaminaPoints(random(50)+20);
victim->AddStatBonus("strength", 20);
victim->AddStatBonus("durability", 20);
victim->AddStatBonus("agility", 20);
victim->AddStatBonus("coordination", 20);
victim->AddStatBonus("speed", 20);
MakeHostile(victim);
victim->AddHP(-(random(50)+10));
}
return 1;
}
int damage3(){
if(victim){
tell_room(environment(victim),victimname+" lets out a horrific roar!", ({victim}) );
tell_object(victim,"%^BOLD%^RED%^You let out a horrific roar as a spasm of fury rips through you!%^RESET%^");
victim->AddStaminaPoints(random(60)+30);
victim->AddStatBonus("strength", 30);
victim->AddStatBonus("durability", 30);
victim->AddStatBonus("agility", 30);
victim->AddStatBonus("coordination", 30);
victim->AddStatBonus("speed", 30);
MakeHostile(victim);
victim->AddHP(-(random(60)+30));
}
return 1;
}
int damage4(){
if(victim){
tell_room(environment(victim),victimname+"'s entire body vibrates madly, throwing off hot blood drops, sweat, and saliva.", ({victim}) );
tell_object(victim,"%^BOLD%^RED%^Your entire body vibrates uncontrollably, spraying blood, sweat, and spit everywhere.%^RESET%^");
victim->AddStaminaPoints(random(70)+40);
victim->AddStatBonus("strength", 40);
victim->AddStatBonus("durability", 40);
victim->AddStatBonus("agility", 40);
victim->AddStatBonus("coordination", 40);
victim->AddStatBonus("speed", 40);
MakeHostile(victim);
victim->AddHP(-(random(70)+40));
foreach(object bystander in get_livings(environment(victim))){
if(bystander && random(100) > 50 && this_object())
eventInfect(bystander);
}
}
return 1;
}
int damage5(){
if(victim){
tell_room(environment(victim),victimname+" makes a horrible, gurgling, coughing noise and hacks up "+
"a huge glob of phlegm.", ({victim}) );
tell_object(victim,"You cough up a huge glob of phlegm, accidentally inhale it, and choke while coughing it "+
"back up.");
//Fix below courtesy of Jonez
victim->AddStaminaPoints(random(80)+50);
victim->AddStatBonus("strength", 50);
victim->AddStatBonus("durability", 50);
victim->AddStatBonus("agility", 50);
victim->AddStatBonus("coordination", 50);
victim->AddStatBonus("speed", 50);
MakeHostile(victim);
victim->AddHP(-(random(80)+50));
}
return 1;
}
mixed CanGet(object ob) { return "Your fingers slip on your runny snot.";}
mixed CanDrop(object ob) { return "Your fingers slip on your runny snot.";}