/* death_room.c */ /* Mrpr 901119 */ #include <mudlib.h> inherit ROOM; #define WRITE(x) tell_object(players[j], x) #define SPEAK(x) tell_object(players[j], "Death says: " + x) int players; init() { object death; ::init(); death = find_living("moot"); add_action("filter", "", 1); if (this_player() != death) { if(this_player()->query_ghost() != 1) { write("Death says: WHAT ARE YOU DOING HERE? YOUR TIME HAS NOT COME YET. BEGONE!\n"); move_object(this_player(), "/room/city/cleric/hall4"); return; } } } /* * Function name: reset * Description: Reset the room */ reset(arg) { if (arg) return; create_death(); players = 0; set_light(1); short_desc = "death's workroom"; long_desc = "A dark room lighted with a dark light that seems to defy darkness not so much\n" + "by actually illuminating the room as by being a darkpoint in less dark\n" + "surroundings. In the strange light (dark?) you can see a centrally placed desk\n" + "covered with books and diagrams. The walls are covered with bookshelves\n" + "filled with dark tomes bound in leather that gleam with strange runes.\n\n"; dest_dir = 0; } /* * Function name: create_death * Description: Create death. */ create_death() { object death; death = clone_object("/room/death/death"); move_object(death, "/room/death/death_room"); } /* * Function name: heart_beat * Description: Let the actions be governed by time. */ heart_beat() { int align, j, nr; if (!players) { set_heart_beat(0); return; } nr = sizeof(players); for (j = 0 ; j < nr ; j += 2) { players[j + 1]++; if (players[j + 1] == 5) { SPEAK("IT IS TIME\n"); WRITE("\nDeath lifts his right arm and makes beckoning motion.\n" + "You feel quite certain that if you had been alive you would have died from\n" + "fear on the spot. Strangely enough you don't feel anything like that at all.\n" + "Just a mild curiosity.\n\n"); } if (players[j + 1] == 10) { SPEAK("NO GLANDS, THAT'S WHY.\n"); WRITE("\nDeath seems to smile a bit. On the other hand that's a bit hard to tell.\n" + "It might very well be that that is his normal expression....\n\n"); } if (players[j + 1] == 15) { SPEAK("WITHOUT GLANDS YOU FEEL NOTHING, NOTHING AT ALL.\n"); WRITE("\nWell, he seems to be right. Instead of being mad with fear you're getting\n" + "a little bored. You wish for something to happen real soon.\n\n"); } if (players[j + 1] == 20) { SPEAK("COME HERE, I MUST READ YOUR SOUL.\n"); WRITE("\nDeath steps closer, reaches out a bony hand straight into your chest,\n" + "grabbing something that is within! You feel a strange internal yank as\n" + "your very soul is removed for examination...Suddenly Death collects your\n" + "bodyless essence with great sweeping motions of his skeletal hands and\n" + "puts you in a small glass orb that he inserts into his right eye socket!\n" + "You feel a strange blue light from within his eyeless orb penetrate you\n" + "as he leans over the chart.\n\n"); } if (players[j + 1] == 30) { align = players[j]->query_alignment(); if(align < -1000) { SPEAK("YOUR SINS ARE AS MANY AS THE GRAINS OF SAND IN THE DESERT.\n" + "MAYBE YOU'RE WORSE A MONSTER THAN I! HAHAHAHAHA!\n\n"); continue; } if(align < -500) { SPEAK("OH WHAT A DESPISABLE BUG WE HAVE HERE. STEALING CANDY FROM\n" + "BABIES AND BEATING OLD LADIES NO DOUBT. WELL NOW THEY CAN DANCE\n" + "ON YOUR GRAVE. HAHAHA!\n\n"); continue; } if(align < -200) { SPEAK("HAVE YOU EVER BEEN TOLD ABOUT REPENTANCE AND ATONEMENT? NO?\n" + "DIDN'T THINK SO EITHER. YOU WILL BE TOLD NOW HOWEVER,\n" + "FOR ETERNITY! HAHAHA!\n\n"); continue; } if(align < 0) { SPEAK("SHAME ON YOU MORTAL ONE! STEALING AND KILLING, IS THAT ALL\n" + "YOU CAN THINK OF? WELL NOW YOU WILL BE GIVEN TIME TO REGRET YOUR\n" + "DEEDS. FOR EVER, HAHA!\n\n"); continue; } if(align == 0) { SPEAK("WHAT A FENCE-CLIMBER WE HAVE HERE! NEVER MADE UP YOUR MIND\n" + "IN ALL YOUR LIFE, DID YOU? WELL, DON'T WORRY. YOU WON'T HAVE TO\n" + "NOW EITHER! HAHAHA!\n\n"); continue; } if(align < 200) { SPEAK("OH WHAT A NICE FELLOW WE HAVE HERE. ALWAYS WALKING THE NARROW\n" + "ROAD, DID YOU? WELL, YOU'LL NEVER KNOW WHAT THE OTHER ROAD IS LIKE\n" + "NOW! HAHAHA!\n\n"); continue; } if(align < 500) { SPEAK("NEVER SAID A DIRTY WORD IN YOUR LIFE DID YOU? WELL, IT'S TOO\n" + "LATE TO CHANGE YOUR MIND ABOUT THAT NOW. HAHAHA! NO MR NICE-GUY YOU\n" + "ARE WHAT YOU WERE. HAHAHA!\n\n"); continue; } if(align < 1000) { SPEAK("I HEARD THEY WERE OUT OF ARCHANGELS IN HEAVEN. PERHAPS YOU\n" + "SHOULD APPLY FOR THE JOB? I HOPE YOU KNOW HOW TO PLAY THE HARP,\n" + "OR THEY'LL GIVE THE JOB TO SOMEONE ELSE! HAHAHA!\n\n"); continue; } SPEAK("TRYING TO TAKE THE JOB AWAY FROM GOD, ARE YOU? HAHAHA! LET ME TELL\n" + "YOU A BIT ABOUT IT BEFORE YOU SIGN ANY PAPERS THOUGH. BAD HOURS AND NO\n" + "VACATION. BELIEVE ME, YOU DON'T WANT IT!\n\n"); } if (players[j + 1] == 35) { SPEAK("WELL, I GUESS YOU HAVE DONE YOURS FOR THIS TIME, SEE YOU ON\n" + "ARMAGEDDON DAY! HAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHA!\n\n"); WRITE("Death removes the orb from his eye and stands up. Suddenly he turns and walks\n" + "out of the room through the nearest wall, still holding you in his skeletal\n" + "hand! He walks rapidly through a dark winding corridor, down a staircase to\n" + "the innermost room in the bottom of the cellar. Finally he stops in front of a\n" + "door bearing the words 'ETERNITY' in black letters. On the door you can see a\n" + "small hatch which Death opens with a flick of his hand. From the open hatch\n" + "you can hear the moaning murmurs of a million souls. Slowly he lifts you to\n" + "the gaping maw of the hatch.\n\n"); } if (players[j + 1] == 40) WRITE("Lars arrives through a rift in the fabric of space.\n"); if (players[j + 1] == 45) { WRITE("Lars smiles at you.\n"); } if (players[j + 1] == 47) { WRITE("Lars whispers something to Death.\n"); } if (players[j + 1] == 54) { SPEAK("WHAT? OUT OF THE QUESTION! YOU KNOW THAT!\n\n"); } if (players[j + 1] == 56) { WRITE("Lars sighs deeply.\n"); } if (players[j + 1] == 58) { WRITE("Lars whispers something to Death.\n"); } if (players[j + 1] == 60) { SPEAK("REINCARNATION? FOR THIS ONE? HE IS NOT WORTHY OF THAT!\n" + "PLEASE BE SENSIBLE LARS!\n\n"); } if (players[j + 1] == 62) { WRITE("Lars sulks in the corner.\n"); WRITE("Lars leaves through a rift in the fabric of space.\n"); WRITE("Death looks at you with something that must be disgust even if it's hard to\n" + "say. His face is not the best suited face for showing expressions, but\n" + "you feel fairly confident about this one.\n\n"); } if (players[j + 1] == 70) { SPEAK("OH ALL RIGHT THEN! I CAN WAIT. ONE DAY YOU WILL BE MINE ANYWAY!\n\n"); WRITE("Suddenly Death hurles you up in the air, you feel a strange sensation as you\n" + "pass through the very walls of the building, out in the open air, through some\n" + "other walls and fairly surprised horses before you finally stop inside another\n" + "building. It seems vaguely familiar...\n"); } } do_remove(); } /* * Function name: do_remove * Description: Removes players that's finished */ do_remove() { int j, nr; if (!players) return; nr = sizeof(players); for (j = 0 ; j < nr ; j += 2) { if (players[j + 1] == 70) { remove_death_obj(players[j]); move_object(players[j], "/room/city/cleric/hall4"); /* Note that move_object() will call exit() */ /* remove_player(players[j]); */ do_remove(); return; } } } /* * Function name: remove_death_obj * Description: Remove the "death_mark"-object. */ remove_death_obj(player) { object plobj; plobj = present("death_mark", player); while (plobj = present("death_mark", player)) destruct(plobj); } /* * Function name: add_player * Description: Adds a player to the list */ add_player(plobj) { int i, j, oldlist; oldlist = players; i = 0; if (players) { i = sizeof(players); players = allocate(i + 2); for (j = 0 ; j < i ; j ++) { players[j] = oldlist[j]; } } else players = allocate(2); players[i] = plobj; players[i + 1] = 0; } /* * Function name: remove_player * Description: Removes a player from the list */ remove_player(plobj) { int i, j, x, oldlist; if(!players) return; i = sizeof(players); if (i == 2) { if (players[0] == plobj) { players = 0; set_heart_beat(0); return; } return; } x = 0; oldlist = players; players = allocate(i - 2); for (j = 0 ; j < i - 2 ; j += 2) { if (oldlist[j] == plobj) x = 2; players[j] = oldlist[j + x]; players[j + 1] = oldlist[j + x + 1]; } } /* * Function name: exit * Description: Remove players if they leave the room prematurly */ exit(ob) { remove_player(ob); } /* * Function name: filter * Description: Filter out relevant commands. */ filter(str) { string verb; verb = query_verb(); if (verb == "quit") { write("Death says: YOU CAN NOT ESCAPE DEATH!\n"); return 0; } if(this_player()->query_security_level()) { return 0; } if (verb == "look") return 0; if (verb == "take") return 0; write("That is impossible in your immaterial state.\n"); return 1; } long(str) { int i; ::long(str); if (str) return; if (!pointerp(players)) return; for (i=0; i < sizeof(players); i += 2) { if (players[i] == this_player()) { if (players[i+1] >= 40 && players[i+1] < 62) { write("Lars The Implementor.\n"); return; } } } }