/* poison */ inherit "inherit/base/base_obj"; #define MAX_HP (int)environment()->query_max_hp() int poison_penalty; /* amount subtracted from max_hp */ int poison_rate; int poison_dmg; int counter; void poison(); void reset(status arg) { if(arg) return; set_name("Poison"); set_alt_name("poison"); set_alt_extra_long("You are Poisoned!\n"); set_extra_long("@@query_name:$environment()$@@ is Poisoned!\n"); poison_rate = 60; /* once per minute */ } /* poison max hp penalty */ void set_poison_penalty(int amt) { poison_penalty = amt; } int query_poison_penalty() { if(poison_penalty > MAX_HP/2) poison_penalty = MAX_HP/2; return poison_penalty; } /* poison damage */ void set_poison_dmg(int amt) { poison_dmg = amt; } int query_poison_dmg() { return poison_dmg; } /* poison rate */ void set_poison_rate(int amt) { poison_rate = amt; } int query_poison_rate() { return poison_rate; } void init() { if(!poison_penalty && !poison_dmg) return; if(environment()) environment()->adj_constitution(0); /* reset max_hp */ poison(); } void poison() { remove_call_out("poison"); if(!environment()) return; if(!living(environment())) { destruct(this_object()); return; } if(poison_dmg && environment()) { if(poison_dmg < (int)environment()->query_hp()) { environment()->adj_hp(random(poison_dmg) * (-1)); tell_object(environment(),"You stagger as poison coarses "+ "through your body.\n"); tell_room(environment(),environment()->query_name() +" staggers as poison coarses "+ "through "+ environment()->query_possessive() +" body.\n"); } else { tell_object(environment(),"The poison overcomes you!\n"); environment()->death(); } } if(++counter > 10) return; if(poison_rate) call_out("poison", poison_rate); } status drop(status quit) { if(quit) { remove_call_out("poison"); destruct(this_object()); } return 1; } mixed query_auto_load() { int i; string file; file = file_name(this_object()); sscanf(file,"%s#%d",file,i); return ({ file, ({poison_penalty, poison_dmg, poison_rate, counter,}), }); } void init_arg(int *arg) { poison_penalty = arg[0]; poison_dmg = arg[1]; poison_rate = arg[2]; counter = arg[3]; init(); } status cast_spell(object caster,object target,object prev,int level) { if(present("Poison 2", target)) { write(target->query_name() +" is already poisoned.\n"); destruct(this_object()); return 1; } poison_penalty = level * 2; poison_dmg = level; init(); return 1; }