// _freeze.c // Mage ability // Written 14194 by Bohemund #include <std.h> inherit DAEMON; int cmd_freeze(string str) { object tp, ob; int attack, wisdom, skip, which, i, frozen, level; string what, *strengths, *weaknesses; object *inv; this_player()->set_magic_round(); tp = this_player(); level = (int)tp->query_level(); if(tp->query_ghost()) { notify_fail("Your voice is hollow.\n"); return 0; } if((string)tp->query_class() != "mage") { write("You mumble in confusion."); say(tp->query_cap_name()+" mumbles in confusion.", tp); return 1; } if(level < 10) { notify_fail("You are not sufficiently trained in the " "magical arts to cast this spell.\n"); return 0; } if(environment(tp)->query_property("no magic")) { notify_fail("Something seems to be blocking your concentration.\n"); return 0; } if(tp->query_casting()) return 1; if((int)tp->query_mp() < 20) { notify_fail("Too low on magic power.\n"); return 0; } if(!str) { ob = (object)tp->query_current_attacker(); if(!ob) { notify_fail("Cast cone of cold at what?\n"); return 0; } } else { ob = present(str, environment(tp)); if(!ob) { sscanf(str, "%s %d", what, which); inv = all_inventory(environment(tp)); for(i=0, skip = 0; i<sizeof(inv) && !ob; i++) { if(inv[i]->id(what)) { skip++; if(skip == which) ob = inv[i]; } } if(!ob) { notify_fail("No "+str+" here!\n"); return 0; } } } if(!living(ob)) { notify_fail(ob->query_cap_name()+" is not alive!\n"); return 0; } if(ob == tp) { notify_fail("Not a very intelligent thing to do.\n"); return 0; } if(ob->is_player() && !interactive(ob)) { notify_fail("You cannot attack link-dead players.\n"); return 0; } if(ob->query_property("no cold")) { notify_fail(sprintf("%s is immune to cold attacks.\n", ob->query_cap_name())); return 0; } if(!ob->kill_ob(tp, 0)) return 1; attack = (int)tp->query_skill("magic attack"); wisdom = (int)ob->query_stats("wisdom"); attack -= wisdom; weaknesses = (string *)ob->query_property("weakness"); if (!pointerp(weaknesses)) weaknesses = ({ }); strengths = (string *)ob->query_property("strengths"); if (!pointerp(strengths)) strengths = ({ }); if(member_array("cold", weaknesses) != -1) attack += random( (attack/2)+2 ); else { if(member_array("cold", strengths) != -1) attack -= random(wisdom +5); } if(member_array("magic", weaknesses) != -1) attack += random( (attack/2) + 2 ); else { if(member_array("magic", strengths) != -1) attack -= random(wisdom + 5); } if(!ob->query_property("no paralyze")) frozen = random(10); if(attack < 1) attack = 0; if((string)tp->query_class() == "mage") attack++; write("%^BOLD%^%^CYAN%^You cast a cone of cold!"); tell_room(environment(tp), "%^CYAN%^%^BOLD%^"+tp->query_cap_name()+ " casts a cone of cold at "+(string)ob->query_cap_name()+".", ({ ob, tp })); tell_object(ob, "%^CYAN%^%^BOLD%^"+tp->query_cap_name()+ " casts a cone of cold at you."); tp->set_casting( ((attack + attack)/50 + attack/20) * 6 ); if(frozen == 1) { ob->set_paralyzed(random(level)+ 20); tell_room(environment(tp), "%^CYAN%^%^BOLD%^"+ob->query_cap_name()+ " is frozen solid!", ({ob, tp}) ); tell_object(ob, "%^CYAN%^%^BOLD%^You are frozen solid!"); write("%^BOLD%^%^CYAN%^"+ob->query_cap_name()+" is frozen solid!"); tp->add_mp(-(random(level))); } tp->add_skill_points( "magic attack",((attack + attack)/50 + attack/20) * 5 ); tp->add_mp(-(20 + random(25)) ); return 1; } void help() { write("Syntax: <freeze [(living)]>\n" "This incantation casts a frigid cone of cold at the living " "object named, or, if in " "battle and no arguments are used, at your current opponent.\n"); }