/* Filename : voiceamulet.c
* Description : a special eq - amulet
*
* written : 04-10-1996 - Gunner
* last modified : 28-05-1998 - Gunner
* HTML-Version : 06-02-2000 - Ghorwin
*/
#include <mudlib.h>
inherit I_ARMOUR;
#define FUNC "/doc/crashcourse/course09/voicefuncs"
create()
{
::create();
set_name("glass amulet");
add_id(({"amulet","amulet of glass","glass","voice_amulet"}));
set_short("A glass amulet");
set_long("The amulet is made out of glass. You can see right through "
"it. It must be very fragile.\n");
add_item("glass",(:call_other,FUNC,"amulet_glass",this_object():));
set_weight(1);
set_value(300+random(200));
set_type("amulet");
set_info("The amulet feeds upon souls and will use it to help its "
"owner.\n");
add_hook("__wear",(:call_other,FUNC,"wear_amulet",this_object():));
add_hook("__remove",(:call_other,FUNC,"remove_amulet",this_object():));
add_property(({"hidden","magic","fragile"})); // Drop = break ;-)
replace_program(I_ARMOUR);
}
/* Filename : voicefuncs.c
* Description : the functionfile for voiceamulet.c
*
* written : 04-10-1996 - Gunner
* last modified : 28-05-1998 - Gunner
* HTML-Version : 06-02-2000 - Ghorwin
*/
#include <mudlib.h>
#include <colours.h>
#include "/doc/crashcourse/defs.h"
inherit I_DAEMON;
#define TIMER 60*5+random(60*5)
string* voices = ({"You think you hear a scream coming from the amulet.\n",
"The amulet shivers slightly.\n",
"You hear a voice inside your head crying: 'KILL! KILL!'\n",
"A voice comes out from nowhere: 'KILL...KILL...'\n",
"The amulet seems to fade away for a moment.\n",
"The glass seems to cry out some strange words at you.\n",
"A whisper is heard: 'Help me.. Help me..'\n"});
/*
* wear_amulet : Called by the __wear hook in voiceamulet.c
*/
void
wear_amulet(object amulet)
{
object wearer, room;
wearer = ENV(amulet);
if (!wearer) return;
room = ENV(wearer);
if (!room) return;
tell_object(wearer,"The amulet fills you with a strange cold.\n");
wearer->add_tmp_prop("vuln_fire",10);
wearer->add_hook("__kill",(:call_other,TO,"player_kills",wearer:));
amulet->add_property("player_kills",0);
remove_call_out("amulet_tick"); // Just to be sure
call_out("amulet_tick",TIMER,amulet);
}
/*
* amulet_tick : Time to do something...
*/
void
amulet_tick(object amulet)
{
object wearer;
int kills, spend;
if (!amulet) return; // Where did the amulet go? *sob*
wearer = amulet->query_worn_by();
if (!wearer) return; // Where did the wearer go? *sob*
call_out("amulet_tick",TIMER,amulet); // A new call_out
kills = amulet->_query_property("player_kills");
if (kills < 1) return; // No fun this one.. KILL SOMETHING!
if (query_idle(wearer) > 60*2) // DON'T IDLE, YOU.. YOU...
{
tell_object(wearer,voices[random(sizeof(voices))]);
return;
}
spend = random(kills);
kills -= spend; // Update the kills property
amulet->add_property("player_kills",kills);
switch (random(5))
{
case 0..1 : wearer->reduce_hit_point(-spend*2); break;
case 2..3 : wearer->reduce_spell_point(-spend*2); break;
case 4 : wearer->heal_self(spend*2); break;
}
tell_object(wearer,C_BOLD + "The amulet shines brightly for a short "
"while.\n" + C_END);
}
/*
* remove_amulet : Called by the __remove hook in voiceamulet.c
*/
void
remove_amulet(object amulet)
{
object wearer, room;
wearer = ENV(amulet);
if (!wearer) return;
room = ENV(wearer);
if (!room) return;
tell_object(wearer,"As you remove the amulet, the strange cold leaves "
"your body.\n");
wearer->add_tmp_prop("vuln_fire",-10);
wearer->remove_hook("__kill");
amulet->remove_property("player_kills");
amulet->remove_item(({"soul","souls"}));
remove_call_out("amulet_tick");
}
/*
* amulet_glass : Displays a message when the player looks at the glass
*/
string
amulet_glass(object amulet)
{
string message;
switch (amulet->_query_property("player_kills"))
{
case 0 : message = "right through the glass"; break;
case 1..5 : message = "a couple of souls captured inside it"; break;
case 6..10 : message = "a few souls captured inside it"; break;
case 11..30 : message = "quite a few souls inside it"; break;
case 31..60 : message = "a whole bunch of souls inside it"; break;
case 61..100: message = "a lot of souls inside it"; break;
default : message = "what appears to be hundreds of souls "
"captured inside the glass"; break;
}
message = "You can see " + message + ".\n";
return message;
}
/*
* player_kills : Called whenever the player kills something
*/
void
player_kills(object wearer)
{
int kills;
object amulet = present("voice_amulet",wearer);
if (!amulet) return; // Paranoia check.
tell_object(wearer,"The amulet shines briefly.\n");
kills = amulet->_query_property("player_kills") + 1;
if (kills == 1)
amulet->add_item("soul","It's a soul captured inside the amulet.\n");
if (kills > 1)
amulet->add_item(({"soul","souls"}),
"They're souls captured inside the glass.\n");
amulet->add_property("player_kills",kills);
}