113 lines
4.0 KiB
C
113 lines
4.0 KiB
C
// /domains/Praxis/obj/misc/stone.c
|
|
// Stone for throwing at criminals and stuff.
|
|
// For the Nightmare mortal law system
|
|
// Created by Manny@Nightmare 940901
|
|
|
|
#include <lib.h>
|
|
|
|
inherit LIB_ITEM;
|
|
|
|
object target;
|
|
void set_target(object who);
|
|
|
|
create() {
|
|
::create();
|
|
SetKeyName("stone");
|
|
SetId( ({ "stone", "throwing stone" }) );
|
|
SetShort("a throwing stone");
|
|
SetLong( (: "long_func" :) );
|
|
SetMass(2);
|
|
SetValue(0);
|
|
}
|
|
|
|
void long_func() {
|
|
if(target) {
|
|
message("say", "A throwing stone just waiting to be thrown at "+
|
|
target->query_cap_name()+"'s forehead.", this_player());
|
|
} else {
|
|
message("say", "A throwing stone whithout direction.",
|
|
this_player());
|
|
}
|
|
}
|
|
|
|
void init() {
|
|
::init();
|
|
add_action("throw_stone", "throw");
|
|
}
|
|
|
|
int throw_stone(string str) {
|
|
string what, who;
|
|
string limb;
|
|
|
|
if(!str) {
|
|
notify_fail("Throw what?\n");
|
|
return 0;
|
|
}
|
|
if(!sscanf(str, "%s at %s", what, who) == 2) {
|
|
notify_fail("Throw what at whom?\n");
|
|
return 0;
|
|
}
|
|
if(!id(what)) {
|
|
notify_fail("Throw what?\n");
|
|
return 0;
|
|
}
|
|
if(who != target->query_name()) {
|
|
message("say", "The stone misses completely.", this_player());
|
|
message("say", this_player()->query_cap_name()+" throws a "
|
|
"stone in some random direction.", environment(this_player()),
|
|
this_player());
|
|
return 1;
|
|
}
|
|
switch(random(4)) {
|
|
case 0:
|
|
message("say", "You hit "+target->query_cap_name()+" square "
|
|
"in the forehead!!", this_player());
|
|
message("say", this_player()->query_cap_name()+" hits "+
|
|
target->query_cap_name()+" in the forehead with a stone.",
|
|
environment(this_player()), ({ this_player(), target }) );
|
|
message("say", this_player()->query_cap_name()+" hits "
|
|
"you squarely in the head with a small stone!!", target);
|
|
limb = "head";
|
|
break;
|
|
case 1:
|
|
message("say", target->query_cap_name()+" screams in agony "
|
|
"as you hit "+target->query_possessive()+" squarely in "
|
|
"the nose!", this_player());
|
|
message("say", target->query_cap_name()+" screams in agony "
|
|
"as "+this_player()->query_cap_name()+" hits "
|
|
+target->query_possessive()+" squarely in "
|
|
"the nose!", environment(this_player()),
|
|
({ this_player(), target }) );
|
|
message("say", "You scream in agony as a stone plows into your "
|
|
"nose!!", target);
|
|
limb = "head";
|
|
break;
|
|
case 2:
|
|
message("say", "OUCH! You stone lands right on "+
|
|
target->query_possessive()+" nards!!", this_player());
|
|
message("say", this_player()->query_cap_name()+" is quite "
|
|
"a good shot with those stones...",
|
|
environment(this_player()), ({ this_player(), target }));
|
|
message("say", this_player()->query_cap_name()+" pegs you "
|
|
"right in the nards!! OUCH!", target);
|
|
limb = "torso";
|
|
break;
|
|
case 3:
|
|
message("say", "You plant a stone right in "+
|
|
target->query_possessive()+" stomach.", this_player());
|
|
message("say", this_player()->query_cap_name()+" mercilessly "
|
|
"beats on "+target->query_cap_name()+" with the stones.",
|
|
environment(this_player()), ({ this_player(), target }));
|
|
message("say", this_player()->query_cap_name()+" plugs a stone "
|
|
"into your stomach, knocking your breath from you.", target);
|
|
limb = "torso";
|
|
break;
|
|
}
|
|
target->do_damage(limb, random(50)+10);
|
|
if((target->check_on_limb(limb) == 2) || (target->query_hp() < 0))
|
|
target->die();
|
|
return 1;
|
|
}
|
|
|
|
void set_target(object who) { target = who; }
|