/* an undead monster with necessary checks for level drain, disease, and chill touch attacks */ #include <mudlib.h> inherit MONSTER; int drain_chance; int disease_chance; int chill_dam, chill_chance; void reset(status arg) { ::reset(arg); if(arg) return; #ifdef NATIVE_MODE } void create() { ::create(); #endif /* native */ set_spell_immune(({ "fear", "charm", "cold", "draining", "darkness", })); } status id(string str) { return str == "undead" || ::id(str); } void attack() { object att; ::attack(); if(!(att = query_primary_attack()) || !present(att, environment())) { return; } /* level draining */ if(random(100) < drain_chance) { if(att->query_spell_immunity("draining")) { tell_object(att, "Sparks fly off you at the touch of "+ query_name() +"\n"); say("Sparks fly off "+ att->query_name() +" at the touch of "+ query_name() +"\n", att); } else { att->drain_level(); tell_object(att, query_name() +" touches you, and you feel your "+ "life slipping away...\n"); say(att->query_name() +" visibly staggers, weakened by "+ query_name()+"'s touch.\n",att); } return; } /* disease contagion */ if(random(100) < disease_chance) { if(att->query_spell_immunity("disease")) { tell_object(att,"You sniff, but make a quick recovery.\n"); } else { if(!present("Disease", att)) { #ifdef NATIVE_MODE clone_object("objects/disease")->move(att); #else move_object(clone_object("objects/disease"), att); #endif /* NATIVE_MODE */ } } return; } /* chill touch */ if(random(100) < chill_chance) { if(att->query_spell_immunity("cold")) { tell_object(att, query_name() +"'s chill touch does not effect you.\n"); } else { tell_object(att, query_name()+"'s touch is deadly cold.\n"); att->hit_player(random(chill_dam)); } return; } } /* Sets for chance to happen */ int set_chill_chance(int c) { return chill_chance = c; } int set_drain_chance(int c) { return drain_chance = c; } int set_disease(int d) { return disease_chance = d; } int set_disease_chance(int d) { return disease_chance = d; } int disease_chance(int d) { return disease_chance = d; } /* Sets for damage */ int set_chill_dam(int c) { return chill_dam = c; } /* Queries for chance to happen */ int query_drain_chance() { return drain_chance; } int query_chill_chance() { return chill_chance; } int query_disease() { return disease_chance; } /* Queries for damage */ int query_chill_dam() { return chill_dam; }