/** fire ball, fire shield **/ inherit "inherit/base/base_obj"; inherit "inherit/timer"; #define NAME "@@query_name:$this_player()$@@" /* gives greater flexibilty */ #define TARG "@@query_name:$this_object()$@@" status fire(string spell_type, mixed alt_type) { int dam; string targ; string file; int i; if(!spell_type) { notify_fail("fire ball, fire shield?\n"); return 0; } sscanf(spell_type,"%s %s", spell_type, targ); spell_type = lower_case(spell_type); switch(spell_type) { case "ball": if(!alt_type) alt_type = "evocation"; dam = (objectp(alt_type)) ? (int)alt_type->query_cast_level() : (int)call_other(this_player(),"query_"+alt_type); dam *= (random(4) + 1); this_player()->load_spell(({ "target", targ, "name", "Fire Ball", "sphere", alt_type, "cost", 10, "damage", dam, "immune", "fire", "level", 10, "cast time", 2, "casting msg", "A small red dot forms from your fingertip...\n", "casting msg room", "A small red dot forms at "+ NAME +"'s fingertip...\n", "msg target", "A ball of hot flame sears you.\n", })); break; case "shield": if(!alt_type) alt_type = "evocation"; file = file_name(this_object()); sscanf(file,"%s#%d",file,i); this_player()->load_spell(({ "target", this_player(), "name", "Fire Shield", "sphere", alt_type, "cost", 12, "level", 12, "cast time", 2, "spell object", file, "passive", "casting msg", "You start to feel cold flames spring up around "+ "you.\n", "casting msg room", "You start to see flaes spring up about "+ NAME+".\n", })); break; default: notify_fail("fire ball, fire shield?\n"); return 0; break; } return 1; } status cast_spell(object caster,object target,object prev,int dmg) { object shield; shield = present("fireshield 2",target); if(shield) { tell_object(caster,"You extend the time of your fireshield...\n"); shield->adj_time(dmg); destruct(this_object()); return 1; } write("A cold flame encirlces you.\n"); say("A cold flame encircles "+(string)target->query_name()+".\n"); set_name("fireshield"); set_alt_name("spell"); set_listen("You hear the crackling of flames.\n"); set_smell("You smell the pungent odor of burning flesh.\n"); set_alt_extra_long("A red fireshield crackles around you.\n"); set_extra_long("A red fireshield crackles around "+ (string)target->query_name()+".\n"); set_long("The red shield of fire harms all who touch it.\n"); set_examine("Although surrounded by crackling red flame,\n"+ "you feel rather cool.\n"); set_info("The fireshield makes the caster immune to fire.\n"+ "This shield has only @@query_approx_time:"+ file_name(this_object())+"@@ left before it expires.\n"); target->add_spell_immunity("fire"); set_heart_beat(1); adj_time(60); return 1; } void time_out() { object env; env = environment(); env->remove_spell_immunity("fire"); tell_object(env,"Your fire shield fades...\n"); ::time_out(); } void dispel_magic() { time_out(); } int oldhp; void heart_beat() { object monster, env; int hp, dmg; env = environment(); if(!(monster = (object)env->query_attack())) return; if(environment(monster) != environment(env)) return; if(monster->query_spell_immunity("fire")) return; if(random((int)monster->query_magic_resist()+1) > random(100)) return; hp = (int)env->query_hp(); dmg = oldhp - hp; oldhp = hp; if(dmg > 0 && dmg <= (int)monster->query_right_wc() * 2) { tell_object(env,"Flames from your shield burn "+ monster->query_name() +" as "+ monster->query_pronoun() + " attacks you!\n"); say("Flames from "+ env -> query_name() +"'s fire shield "+ " burn "+ monster -> query_name() +" as "+ monster -> query_pronoun() + " attacks "+ env -> query_objective() +"\n", env); if((int)monster->query_hp() > 2 * dmg) { dmg *= 2; monster->adj_hp(-dmg); } } } status drop(status quit) { if(quit) time_out(); return 1; } /* Native Mode Move */ #include <move.h>