/* back stab */ /* for some strange reason, players can bypass the heart beat of setting * their attackers, and hence get multiple backstabs IF they use DO * commands and other MACROs supplied by clients. The following use of * a flag and a call_out is NOT recommended as a permanent solution, * but rather a temporary one. * - Angel, Aug '96. */ static status done_backstab; #define <mudlib.h> #define NAME (string)this_player()->query_name() status backstab(string str) { object obj, primary, weapon; string type; int your_dex; int dam; int my_backstab; if(!str) { notify_fail("backstab who?\n"); return 0; } obj = present(lower_case(str), environment(this_player())); if(!obj) { notify_fail(capitalize(str)+" isn't here to backstab!\n"); return 0; } if(!living(obj)) { write("Well, it doesn't move. It hardly knows you are here.\n"); return 1; } if(done_backstab) { write("Not so fast, "+this_player()->query_name()+"!\n"); return 1; } if((primary = (object)this_player()->query_primary_attack())) { write("attacking check\n"); if(present(primary, environment(this_player()))) { write("You can't backstab someone while fighting!\n"); return 1; } } if(!this_player()->query_stealth_on()) { write("You must sneak up on your victim before you can backstab them!\n"); return 1; } your_dex = (int)obj->query_intelligence(); /* for surprising them...must beat their intelligence */ my_backstab = (int)this_player()->query_backstab(); if(random(your_dex) <= random(my_backstab)){ write("You sneak up on "+ obj->short() +"...\n"); write("You surprise "+ obj->short() +"!!\n"); say(NAME +" sneaks up on "+ obj->short() +"...\n"); say(NAME +" surprises "+ obj->short() +"!!\n"); dam = random(my_backstab) + (int)this_player()->query_wc(); dam = dam * ((int)this_player()->query_backstab()/5 + 1); weapon = (object)this_player()->query_right_weapon(); if(weapon) type = (string)weapon->query_type(); if(random(100) <= 1){ write("You PLUNGE your weapon into "+ obj->short() +"'s back!\n"); write("Your weapon RIPS through "+ obj->short() +"'s VITAL organs!\n"); say("You see "+ NAME + "'s weapon protrude " + obj->short() +"'s CHEST!\n"); say(NAME +" KILLED "+ obj->short() +" with a sneak attack!!\n"); obj->death(); } } else { write("You sneak up on "+ obj -> short() +"...\n"); write(obj->short() +" sees you coming, and dodges the attack!\n"); tell_object(obj,"You see "+ this_player()->query_name() +" sneaking up on you.\n"); say("You see "+ this_player()->query_name() +" sneaking up on "+ obj->query_name() +".\n", obj); this_player()->add_secondary_attacker(obj); /* get ready to attack */ done_backstab = 1; (int)obj->hit_player(); call_out("remove_flag", 1); this_player()->set_primary_attack(obj); /* make sure focus of attack */ this_player()->attack(); /* attack */ } return 1; } remove_flag() { done_backstab = 0; } /* Native Mode Move */ #include <move.h>