mud/lib/domains/Praxis/sheriff.c
2020-09-06 05:43:07 -07:00

723 lines
30 KiB
C

/*
// File : /domains/Praxis/sheriff.c
// Comment : handles law enforcement
// 94-08-15 : Descartes of Borg wrote original code
// 94-08-28 : Manny of Law executed it
// 94-09-02 : Pallando of Everywhere fixed it
*/
#include <lib.h>
#include <daemons.h>
#include <dirs.h>
inherit LIB_ROOM;
object *__Prisoners;
mapping Executions;
object *clone_guards(int num);
void create() {
object *obs;
int x,y, i, tot;
Executions = ([
"hanging" : "death_by_hanging",
"firing squad" : "death_by_firing_squad",
"torture" : "death_by_torture",
"the pit" : "death_by_the_pit",
// "stoning" : "death_by_stoning",
// "beheading" : "death_by_beheading",
]);
room::create();
SetNoClean(1);
SetProperties( ([ "light":2, "indoors":1, "no bump":1, "no kill":1,
"no steal":1 ]) );
SetShort("praxis sheriff's office");
SetLong(
"In the corner of this small, one room wooden building is "
"a barred off area indicating that you have entered the Praxis "
"sheriff's office. An old desk belonging to the sheriff occupies "
"the northeast corner of the room. Exits to court room and yard are "
"west and south respectively."
);
SetItems( ([ "desk":"A rickety wooden desk hardly ever used, as the "
"sheriff never does seem to be able to sit for any period of time.",
({ "building", "office", "room" }): "A wooden building constructed "
"long ago for a lawless era. There is a jail cell in one area.",
"area": "A jail cell.",
({ "cell", "jail cell", "jail" }): (: "la_jail" :),
"exits": "Boc La Road and Centre Path."]) );
SetSmell("default", "You can smell the residue of sweaty outlaws.");
SetExits( ([ "south":"/"+__DIR__+"yard",
"west":"/"+__DIR__+"court_room" ]) );
x = POLITICS_D->query_personnel("police");
y = POLITICS_D->query_spending("police");
//if(!(tot = (y/x)/currency_rate("gold"))) return;
for(i=0, obs = allocate(x); i<x; i++)
obs[i] = new("/"+__DIR__+"obj/mon/police");
obs->SetKeyName("deputy");
obs->SetId( ({ "law officer", "praxis police", "police", "deputy",
"officer" }) );
obs->SetShort("a Praxis deputy");
obs->SetLong("A law officer charged with preserving the peace in "
"Praxis. If you are hunted by this officer, type \"surrender\" "
"to surrender yourself and go to jail.");
obs->SetRace("klingon");
obs->SetRace("human");
obs->SetGender(random(2) ? "male" : "female");
obs->SetLevel(tot/1000+1);
obs->SetSkill("melee", (tot/1000)*7);
obs->SetSkill("attack", (tot/1000)*7);
obs->SetSkill("defense", (tot/1000)*7);
obs->SetSkill("stealth", (tot/1000)*5);
obs->SetStat("constitution", (tot/1000)*3 + 15);
obs->SetStat("dexterity", (tot/1000)*5 + 10);
obs->SetMorality(random(500));
obs->move(this_object());
__Prisoners = ({});
}
void init() {
room::init();
add_action("cmd_quit", "quit");
}
static int cmd_quit(string str) {
message("system", "You cannot quit from the sheriff's office.",
this_player());
return 1;
}
void rescue_me(object victim, object outlaw) {
object *obs;
int x, i;
if(!present("deputy")) return;
x = outlaw->query_level() - victim->query_level();
if(x < 5) x = 1;
else x = x/5;
i = sizeof(obs = all_inventory(this_object()));
while(i-- && x) {
if(obs[i]->id("deputy")) {
obs[i]->set_target(outlaw);
x--;
}
}
}
int release_objects(object ob) {
return (member_array(ob, __Prisoners) == -1);
}
void add_prisoner(object ob) { __Prisoners += ({ ob }); }
void remove_prisoner(object ob) { __Prisoners -= ({ ob }); }
object *query_prisoners() { return __Prisoners; }
string la_jail(string arg) {
string str;
int i;
if(!sizeof(__Prisoners)) return "There are no prisoners right now.";
str = "The following prisoners are in the cell: ";
i = sizeof(__Prisoners);
while(i--) str += __Prisoners[i]->query_cap_name()+" ";
return str;
}
object *clone_guards(int num) {
object *obs;
int y, x, i, tot;
y = POLITICS_D->query_spending("police");
x = POLITICS_D->query_personnel("police");
for(i=0, obs = allocate(num); i<num; i++)
obs[i] = new("/"+__DIR__+"obj/mon/guard");
tot = (y/x)/currency_rate("gold");
tell_object(find_player("manny"), "tot = "+tot);
obs->SetKeyName("guard");
obs->SetId( ({ "guard", "city guard", "officer", "praxis guard" }) );
obs->SetShort("a Praxis guard");
obs->SetRace("klingon");
obs->SetRace("human");
obs->SetGender(random(2) ? "male" : "female");
obs->SetLevel(tot/1000+1);
obs->SetSkill("melee", (tot/1000)*7);
obs->SetSkill("attack", (tot/1000)*7);
obs->SetSkill("defense", (tot/1000)*7);
obs->SetSkill("stealth", (tot/1000)*5);
obs->SetStat("constitution", (tot/1000)*3 + 15);
obs->SetStat("dexterity", (tot/1000)*5 + 10);
obs->SetMorality(random(500));
return obs;
}
string death_by_hanging(object who) {
if(member_array(who, __Prisoners) == -1)
return who->query_cap_name()+" is not a prisoner.";
message("say", "%^RED%^You hear the rythmic pounding of "
"the city guard approaching the door. Two large, burly "
"men in blue step through the door and, without emotion, "
"bind you hands tightly together with thick rope.",
who);
shout("%^BOLD%^%^RED%^Distant bells ring thrice, "
"signaling the pending execution of "+who->query_cap_name()+
".");
call_out("hanging_part_two", 2, who);
return "The execution has begun.";
}
void hanging_part_two(object who) {
message("say", "\n%^CYAN%^The guard whispers to you: "
"%^RESET%^Scumbag.", who);
call_out("hanging_part_three", 3, who);
}
void hanging_part_three(object who) {
int x, y;
object *obs;
message("say", "\n%^RED%^The two guards securely grasp your "
"arms and begin dragging you to the town square.", who);
(DIR_STANDARD_DOMAIN+"/square")->SetProperty("no bump", 1);
new("/"+__DIR__+"obj/misc/handcuffs")->move(who);
obs = clone_guards(2);
obs->set_target(who);
obs->move(DIR_STANDARD_DOMAIN+"/square");
obs[0] = new("/"+__DIR__+"obj/misc/gallows");
obs[0]->set_hangman(who);
obs[0]->move(DIR_STANDARD_DOMAIN+"/square");
who->eventMoveLiving(DIR_STANDARD_DOMAIN+"/square");
call_out("hanging_part_four", 4, who);
}
void hanging_part_four(object who) {
message("say", "\n%^RED%^Meanancing jeers from the gathering "
"bloodthirsty crowd fill your ears as one of the guards "
"covers your head with a black hood. Burned into your "
"mind is the last image of life you shall ever see, an "
"image filled with faces of hate and disgust. You are "
"overcome with a sincere regret for your crimes, a burning "
"emotion extinguished by the realization that it is "
"too late.", who);
message("say", who->query_cap_name()+" is dragged up the stairs onto "
"the wooden platform. Menacing jeers fill the crowd as "
"one of the more burly guards places a large black hood over "
"the paniced face of "+who->query_cap_name()+". Any mercy "
"for "+who->query_possessive()+" soul is quickly replaced "
"by hatred and disgust for such a lowly individual.",
environment(who), who);
call_out("hanging_part_five", 3, who);
}
void hanging_part_five(object who) {
message("say", "\n%^RED%^A tight grip upon your shaking "
"forarm leads you up a short set of stairs onto a wooden "
"platform. A heavy rope is placed around your neck, then "
"tightened. The rythmic beat of a nearby drum is all that "
"fills your conscience, as you do not dare fathom what awaits "
"you on the other side...", who);
message("say", "\nThe rythmic beat of the drum of death brings a "
"hush over the surrounding crowd.", environment(who), who);
call_out("hanging_part_six", 4, who);
}
void hanging_part_six(object who) {
message("say", "\n%^RED%^The drum's beat falls into a steady "
"roll...", who);
message("say", "\nThe drum's beat falls into a steady "
"roll...", environment(who), who);
call_out("hanging_part_seven", random(3) + 2, who);
}
void hanging_part_seven(object who) {
object here;
here = environment(who);
message("say", "\n%^RED%^The klunk of the floor falling beneath "
"you is the final sound to reach your ears.", who);
message("say", "\nSuddenly without warning, the floor beneath "+
who->query_cap_name()+"'s feet falls away, leaving "+
who->query_cap_name()+" suspended only by the rope attached "
"to "+who->query_possessive()+" neck. "+
who->query_cap_name()+" struggles for a moment, then falls "
"limp.", environment(who), who);
present("handcuffs", who)->destruct();
who->die();
call_out("hanging_part_eight", 3, here);
}
void hanging_part_eight(object where) {
object stuff;
message("say", "The guards dispurse, removing the gallows and cleaning up "
"the area before leaving.", where);
if(stuff = present("guard", where)) stuff->destruct();
if(stuff = present("guard", where)) stuff->destruct();
if(stuff = present("gallows", where)) stuff->destruct();
where->SetProperty("no bump", 0);
}
string death_by_firing_squad(object who) {
object *obs;
if(member_array(who, __Prisoners) == -1)
return who->query_cap_name()+" is not a prisoner.";
message("say", "%^RED%^A large, burly guard enters, accompanied by "
"a priest in black robes mumbling a prose from a small book "
"he carries.", who);
obs=clone_guards(2);
obs[1]->SetKeyName("priest");
obs[1]->SetShort("a priest");
obs->move(environment(who));
shout("%^RED%^Distant bells ring, signaling the execution "
"of "+who->query_cap_name()+" in the town square.");
call_out("squad_part_two", 2, who);
return "The execution has begun.";
}
void squad_part_two(object who) {
object pole, *obs;
int x;
message("say", "\n%^RED%^%^BOLD%^The guard tells you:%^RESET%^ Your "
"time has come.", who);
message("say", "\n%^RED%^Opening the cell, one of the guards ties "
"your hands behind your back with a thick rope. A guard then "
"places a tight grip upon your arm and drags you out of the "
"building and towards the town square.", who);
new("/"+__DIR__+"obj/misc/handcuffs")->move(who);
message("say", "A Praxis guard enters carrying a large bloodstained "
"pole. Walking to the far side of the square, he digs a small "
"hole and firmly plants the pole.", DIR_STANDARD_DOMAIN+"/square");
(DIR_STANDARD_DOMAIN+"/square")->SetProperty("no bump", 1);
clone_guards(1)->move(DIR_STANDARD_DOMAIN+"/square");
pole=new(LIB_ITEM);
pole->SetKeyName("pole");
pole->SetId( ({ "pole", "bloodstained pole", "large pole" }) );
pole->SetShort("a large, bloodstained pole");
pole->SetLong("A large pole firmly planted in the ground. Blood "
"spots are scattered in various places near the top half of "
"the pole.");
pole->SetPreventGet("The pole is firmly planted in the ground.");
pole->move(DIR_STANDARD_DOMAIN+"/square");
message("say", "A small set of guards enter and form a line opposite "
"of the pole.", DIR_STANDARD_DOMAIN+"/square");
clone_guards(5)->move(DIR_STANDARD_DOMAIN+"/square");
call_out("squad_part_three", 5, who);
}
void squad_part_three(object who) {
object thing;
if(thing=present("guard", environment(who)))
thing->move(DIR_STANDARD_DOMAIN+"/square");
else clone_guards(1)->move(DIR_STANDARD_DOMAIN+"/square");
if(thing=present("priest", environment(who)))
thing->move(DIR_STANDARD_DOMAIN+"/square");
else clone_guards(1)->move(DIR_STANDARD_DOMAIN+"/square");
who->eventMoveLiving(DIR_STANDARD_DOMAIN+"/square");
message("say", "\n%^RED%^In the once familar town square, a large "
"area has been cleared out, with one pole near a wall on the "
"far side of the square. This pole is in the direction you "
"and the ever stoic guard are headed.", who);
message("say", "\n%^RED%^The guard ties your hands securly behind the "
"rough blood-stained pole, facing a line of the town guards, "
"each wielding a large bow with a single arrow.", who);
message("say", "\n%^RED%^The guard pulls out a large black "
"hood which is placed over your head and steps away.", who);
new("/"+__DIR__+"obj/misc/hood")->move(who);
message("say", who->query_cap_name()+" is dragged towards a pole "
"on the far side of the square, where he is tied by one of "
"the guards. The guard places a large black hood over the "
"criminal's head and steps away.", environment(who), who);
message("say", "\nA nearby drum begins a steady, rythmic beat.",
environment(who));
call_out("squad_part_four", 4, who);
}
void squad_part_four(object who) {
message("say", "\n%^RED%^The drums' beat becomes a steady roll, and "
"you hear a guard shout a single, inaudiable word. You hear "
"the rustle of weapons being cocked.", who);
message("say", "\nA lead guard yells out a single inaudiable word "
"as the line of guards ready their weapons.", environment(who),
who);
call_out("squad_part_five", 4, who);
}
void squad_part_five(object who) {
message("say", "\n%^RED%^A guard yells a second word as the firing "
"squad prepare the arrows for launching.", who);
message("say", "\nThe lead guard yells a second word as the firing "
"line pull back their arrows in preparation.", environment(who),
who);
call_out("squad_part_six", 4, who);
}
void squad_part_six(object who) {
int x, dam;
message("say", "\n%^RED%^The guard yells a thrid and final word, and "
"dozens of arrows peirce your entire body. The darkness surrounding "
"you becomes even darker, and vague voices begin to cackle evily "
"within you mind..", who);
message("say", "\nThe guard yells out a third and final word, and "
"the entire squad releases their arrows into the helpless body "
"of "+who->query_cap_name()+". The body instantly falls limp.",
environment(who), who);
dam= (who->query_max_hp())/5;
present("hood", who)->destruct();
present("handcuffs", who)->destruct();
for(x=0; x<6; ++x)
who->do_damage("torso", dam + 10);
call_out("squad_part_seven", 4, environment(who));
who->die();
}
void squad_part_seven(object place) {
object thing;
message("say", "The guards begin marching away, one removing the pole "
"on his way out. He leaves the dead body on the "
"ground to rot away, just as it deserves.",
DIR_STANDARD_DOMAIN+"/square");
place->SetProperty("no bump", 0);
while(thing = present("guard", place))
thing->destruct();
if(thing=present("pole", place)) thing->destruct();
}
string death_by_torture(object who) {
if(member_array(who, __Prisoners) == -1)
return who->query_cap_name()+" is not a prisoner.";
message("say", "%^RED%^A large guard enters your cell and ties "
"your hands with a large rope. Saying nothing, he drags you "
"out of the room.", who);
new("/"+__DIR__+"obj/misc/handcuffs")->move(who);
call_out("torture_part_two", 3, who);
return "The execution has begun.";
}
void torture_part_two(object who) {
who->eventMoveLiving("/"+__DIR__+"torture_room");
message("say", "%^RED%^The guard brings you into a room of which "
"the likes you have only heard about. Your heart sinks at the "
"thought of parting with life in such a cruel way.", who);
message("say", "\n%^RED%^The guard forces you to lie down on a "
"small table in the middle of the room. Heavy straps are "
"placed over your legs, arms and forehead, making all "
"movement impossible. When you look up you finally see the "
"object of your death: a large, clean blade at the end of "
"a long pole.", who);
call_out("torture_part_three", 4, who);
}
void torture_part_three(object who) {
message("say", "\n%^RED%^%^BOLD%^The guard tells you: %^RESET%^Now "
"just sit tight and it will all be over in a few hours.", who);
message("say", "\nThe guard grins evilly.", who);
message("say", "\n%^RED%^The guard reaches up and grabs the blade, "
"swinging it like a pendulium.", who);
call_out("torture_part_four", 4, who);
}
void torture_part_four(object who) {
message("say", "\nThe guard ponders for a moment.", who);
call_out("torture_part_five", 4, who);
}
void torture_part_five(object who) {
message("say", "\n%^RED%^%^BOLD%^The guard tells you:%^RESET%^ Ya' "
"know, I respect yer kind. Nun too many pe'ple gots the balls "
"ta do wha' ya did.", who);
message("say", "\n%^RED%^%^BOLD%^The guard tells you:%^RESET%^ I's "
"gonna show ya a lit'le bit o' mercy, make it quiker fer ya.", who);
message("say", "\n%^RED%^The guard grabs the pole above the "
"bladed pendulium and pulls down upon it, bringing the blade "
"closer to your neck. He gives it a hardy shove, and it begins "
"it's steady swing again.", who);
call_out("torture_part_six", 3, who);
}
void torture_part_six(object who) {
message("say", "\n%^RED%^After a moment of careful examination, the "
"guard gives a satisfied smirk.", who);
message("say", "\n%^BOLD%^%^RED%^The guard tells you: %^RESET%^Have "
"a happy afterlife.", who);
message("say", "\n%^RED%^The guard grins evilly and stalks out of "
"the room, locking the door behind him.", who);
call_out("torture_part_seven", 6, ({ who, 1 }) );
}
void torture_part_seven(mixed *stuff) {
object who;
who = stuff[0];
switch(random(7)) {
case 0:
case 1:
case 2: tell_object(who, "\n%^RED%^You notice the swinging blade seems "
"to be getting closer"); break;
case 3: tell_object(who, "\n%^RED%^You feel a very strong urge to "
"use the restroom."); break;
case 4: tell_object(who, "\n%^RED%^Shivers run through your body.");
break;
case 5: tell_object(who, "\n%^RED%^A small rat scurries across the "
"floor");
case 6: tell_object(who, "\n%^RED%^With closer examination, the blade "
"swinging just above your neck seems remarkably clean. "
"You can't help but to wonder if you're the first life "
"to be claimed by this horrific device.");
}
if(++stuff[1] == 10)
call_out("torture_part_eight", 5, who);
else call_out("torture_part_seven", 6, stuff);
}
void torture_part_eight(object who) {
message("say", "\n%^RED%^The blade swings dangerously close to your "
"neck. By your best estimate, you have a single breath left...",
who);
call_out("torture_part_nine", 3, who);
}
void torture_part_nine(object who) {
message("say", "\n%^RED%^In one final swoop, the huge metal blade "
"places a clean cut into your throat. Your struggle for more "
"air only fills your mouth and lungs with your life blood.", who);
message("say", "\n%^BOLD%^%^BLACK%^The ever-persistant darkness "
"finally covers your eyes. Distant, evil voices cackle with "
"glee at thier newest victim...", who);
present("handcuffs", who)->destruct();
who->die();
}
string death_by_the_pit(object who) {
if(member_array(who, __Prisoners) == -1)
return who->query_cap_name()+" is not a prisoner.";
message("say", "%^RED%^A large, burly guard enters the cell and "
"securly ties your hands with a peice of rope.", who);
message("say", "\n%^RED%^%^BOLD%^The guard tells you:%^RESET%^ It's "
"to the pit with your sorry self. Hehehe.", who);
message("say", "\n%^RED%^The guard drags you out of the building "
"towards the dreaded pit...", who);
shout("%^RED%^Distant bells signal the pending death "
"of "+who->query_cap_name()+" in the dreaded Pit of Spiders.");
new("/"+__DIR__+"obj/misc/handcuffs")->move(who);
call_out("pit_part_two", 5, who);
return "The execution has begun.";
}
void pit_part_two(object who) {
string orig_long;
message("say", "Two guards enter and clear off an area "
"revealing a large stone covering. The guards lift the heavy "
"plate, opening a deep, black hole on the northeastern side of "
"the square.", DIR_STANDARD_DOMAIN+"/square");
(DIR_STANDARD_DOMAIN+"/square")->SetProperty("no bump", 1);
orig_long = (DIR_STANDARD_DOMAIN+"/square")->GetLong();
(DIR_STANDARD_DOMAIN+"/square")->AddExit("down",
DIR_STANDARD_DOMAIN+"/spider_pit", (: "prevent_down" :) );
(DIR_STANDARD_DOMAIN+"/square")->SetLong(
orig_long+"\n\nA large, deep pit has been uncovered in "
"the middle of the square.");
clone_guards(2)->move(DIR_STANDARD_DOMAIN+"/square");
call_out("pit_part_three", 3, ({ who, orig_long }));
}
void pit_part_three(mixed *stuff) {
stuff[0]->eventMoveLiving(DIR_STANDARD_DOMAIN+"/square");
message("say", "\n%^RED%^Upon the arrival of the all too familar "
"town square, two guards have already removed the cover from "
"the pit. Deep in the dark hole, the erie floor seems to "
"be crawling...", stuff[0]);
message("say", "\n"+stuff[0]->query_cap_name()+" enters, dragged by the "
"town guards.", environment(stuff[0]), stuff[0]);
call_out("pit_part_four", 4, stuff);
}
void pit_part_four(mixed *stuff) {
object here;
message("say", "\n%^RED%^%^BOLD%^A guard tells you:%^RESET%^ Say "
"hi to the Leaper for me!", stuff[0]);
message("say", "\n%^RED%^The guard cackles evilly as he shoves you "
"into the pit.", stuff[0]);
message("say", "\nThe guard cackles evilly as he shoves "+
stuff[0]->query_cap_name()+" into the pit", environment(stuff[0]),
stuff[0]);
here=environment(stuff[0]);
stuff[0]->eventMoveLiving("/"+__DIR__+"spider_pit",
"falls screaming into the pit!!");
(DIR_STANDARD_DOMAIN+"/square")->SetProperty("no bump", 0);
message("say", "\nThe guard pulls the protective covering over the "
"hole. Muffled screams of pain echo from within as you realize "
"the criminal's chances of a peacful death are zero.",
DIR_STANDARD_DOMAIN+"/square");
call_out("pit_part_five", 10, ({ here, stuff[1] }));
}
void pit_part_five(mixed *stuff) {
object thing;
message("say", "The guards, satisfied that this world is a better "
"place, replace the cover upon the pit of spiders and"
"walk off.", stuff[0]);
stuff[0]->RemoveExit("down");
stuff[0]->SetLong(stuff[1]);
if(thing = present("guard", stuff[0])) thing->destruct();
if(thing = present("guard", stuff[0])) thing->destruct();
}
int prevent_down() {
message("say", "A guard blocks your way, making it clear that "
"you really don't want to go down there.", this_player());
return 0;
}
string death_by_stoning(object who) {
if(member_array(who, __Prisoners) == -1)
return who->query_cap_name()+" is not a prisoner.";
message("say", "%^RED%^A guard enters and ties your hands together "
"with a thick rope.", who);
message("say", "\n%^BOLD%^%^RED%^A guard tells you:%^RESET%^ Right "
"this way, you scumbag.", who);
message("say", "\n%^RED%^The guard grabs you by the arm and drags you "
"towards the town square.", who);
// shout("%^RED%^Distant bells sound, signaling the execution "
// "of "+who->query_cap_name()+" by stoning in the town square.");
call_out("stoning_part_two", 5, who);
}
void stoning_part_two(object who) {
object *townsfolk, *homes;
string *wanted;
int x, y;
wanted = ({ "horace", "lars", "beggar", "knight", "waitress" });
townsfolk=({ });
homes = ({ });
for(x=0, y=0; y<sizeof(wanted); y++)
if(find_living(wanted[y])) {
homes[x]=environment(townsfolk[x]);
message("say", townsfolk[x]->query_cap_name()+" cheers in excitment "
"for the upcomming execution!", environment(townsfolk[x]));
x++;
}
townsfolk->eventMoveLiving(DIR_STANDARD_DOMAIN+"/square", "to join in the "
"stoning of "+who->query_cap_name());
call_out("control_townsfolk", 1, ({ who, townsfolk, homes }));
(DIR_STANDARD_DOMAIN+"/square")->SetProperty("no bump", 1);
new("/"+__DIR__+"obj/misc/stones")->move(DIR_STANDARD_DOMAIN+"/square");
who->eventMoveLiving(DIR_STANDARD_DOMAIN+"/square");
message("say", "\n%^RED%^Upon arrival to the town square, the guard "
"ties you to a wooden post, facing the jeering crowd. With a "
"grim smirk upon his face, he wishes you a good afterlife and "
"leaves you to die at the hands of the countless victims of "
"your crimes.", who);
message("say", "Upon arrival to the town square, the guard ties "+
who->query_cap_name()+" to the post, smirks, and leaves. "
"Immedately the towns people pick up their rocks and expend "
"thier frustration upon the criminal who caused them so much "
"grief.", environment(who), who);
}
void control_townsfolk(mixed *them) {
int x;
for(x=0; x<sizeof(them[1]); x++)
switch(random(5)) {
case 0 : message("saY", them[1][x]->query_cap_name()+" cheers "
"enthustically!", environment(them[1][x])); break;
case 1 : message("say", them[1][x]->query_cap_name()+"yells: "
"Scumbag!!", environment(them[1][x])); break;
case 2 : message("say", them[1][x]->query_cap_name()+" spits on " +
them[0]->query_cap_name()+"!", environment(them[1][x]));
break;
case 3 : message("say", them[1][x]->query_cap_name()+"boos "
"and hisses.", environment(them[1][x])); break;
case 4 : them[1][x]->command("get stone");
them[1][x]->command("throw stone at "+them[0]->query_name());
break;
}
if(them[0]->query_ghost()) {
them[1]->command("cheer");
call_out("stoning_part_three", 3, ({ them[1], them[2] }) );
} else call_out("control_townsfolk", 1, them);
}
void stoning_part_three(mixed *townsfolk) {
int x;
message("say", "The townsfolk head back to their respective "
"homes.", environment(townsfolk[0][0]));
present("stone pile", environment(townsfolk[0][0]))->destruct();
for(x=0; x < sizeof(townsfolk[0]); x++)
townsfolk[0][x]->eventMoveLiving(townsfolk[1][x]);
}
string death_by_beheading(object who) {
if(member_array(who, __Prisoners) == -1)
return who->query_cap_name()+" is not a prisoner.";
message("say", "%^RED%^A large, burly guard enters your cell and securly "
"ties your hands with a thick rope. He grabs your arm and pulls "
"you towards the exit of the prison, in the direction of the town "
"square.", who);
shout("%^RED%^Distant bells ring thrice, signaling the "
"public beheading of "+who->query_cap_name()+" at the town "
"square");
new("/"+__DIR__+"obj/misc/handcuffs")->move(who);
call_out("beheading_part_two", 2, who);
return "The execution has begun";
}
void beheading_part_two(object who) {
(DIR_STANDARD_DOMAIN+"/square")->SetProperty("no bump", 1);
clone_guards(4)->move(DIR_STANDARD_DOMAIN+"/square");
message("say", "A group of guards enter, bringing with them a large "
"platform with a thick round wooden stump covered with dried "
"blood.", DIR_STANDARD_DOMAIN+"/square");
who->eventMoveLiving(DIR_STANDARD_DOMAIN+"/square");
message("say", "\n%^RED%^Upon arrival to the town square, you notice "
"a large platform with a blood-stained wooden stump. Standing "
"atop the platform is a black-hooded man with a large axe. It "
"is upon this platform, next to the hooded man, where you are "
"lead by the guard and commanded to kneal.", who);
call_out("beheading_part_three", 3, who);
}
void beheading_part_three(object who) {
message("say", "\n%^RED%^From atop the platform you see the gathering "
"crowd, very unfriendly. A rope is placed around your neck, and "
"you are forced to place your head over the stump, you neck "
"fearfully exposed to the man in the black hood. A nearby drum "
"begins it's steady death beat...", who);
message("say", "\nA guard places a rope around "+who->query_cap_name()+
"'s neck and is forced to lie over the stump. There is a desparate "
"look on "+who->query_cap_name()+"'s face as a nearby drum begins "
"a steady beat...", environment(who), who);
call_out("beheading_part_four", 3, who);
}
void beheading_part_four(object who) {
message("say", "\n%^RED%^Without warning, the drum beat comes to a "
"sudden stop.", who);
message("say", "\nThe drum beat comes to a sudden end, and the black "
"hooded brings his axe down through "+who->query_cap_name()+"'s "
"neck without hesitation. "+who->query_cap_name()+"'s head drops "
"to the platform with a loud thunk, the expression of desparation "
"permanently affixed to "+who->query_possessive()+" face.",
environment(who), who);
(DIR_STANDARD_DOMAIN+"/square")->SetProperty("no bump", 0);
who->die();
}
varargs mapping valid_execution( string type )
{
if( type ) return Executions[type];
return Executions;
}
string execute( object who, string type )
{
return call_other( this_object(), Executions[type], who );
}