/*
* $Locker: $
* $Id: althea.c,v 1.8 2000/10/27 02:13:48 twiggy Exp $
*
* $Log: althea.c,v $
* Revision 1.8 2000/10/27 02:13:48 twiggy
* Adjusted her to use queue_command instead of do_command when she drops or fumbles her flail, to make her a little more realistic.
*
* Revision 1.7 2000/10/17 05:57:39 taffyd
* Whatever changes Taffyd made in 1999.
*
* Revision 1.6 1999/07/13 05:42:56 furcifer
* fixed typo.
*
* Revision 1.5 1999/05/16 17:47:26 taffyd
* Fixes!
*
* Revision 1.1 1998/02/08 08:44:56 terano
* Initial revision
*
*/
#define CREATOR "Ceres"
/*
* This is Althea, the Archcardinal of Pishe. Another attempt by me to
* create an interesting female npc.
*/
#include <armoury.h>
inherit "/obj/monster";
#define HEAL_COST 30
object flail;
int dickens_warned;
void do_heal(object);
void check_injured();
void maintain_self(object, object);
void fighting_stuff(object, object);
void ritual_stuff(object, object);
void setup() {
set_name("althea");
set_short("Althea of Pishe");
set_main_plural("Altheas of Pishe");
set_long("This is Althea, an Archcardinal of Pishe. She is a beautiful, "
"middle-aged woman with a kind face. She almost seems to glow "
"with a gentle power.\n");
add_adjective(({"arch", "cardinal", "of", "pishe"}));
add_alias(({"priestess", "archcardinal", "cardinal"}));
add_property("determinate","");
add_property("unique", 1);
set_gender("female");
set_race("human");
set_guild("priest");
set_deity("pishe");
set_level(400);
set_height(140);
set_weight(1000);
set_al(-2000 - random(501)); /* Max alignment is -2500 */
set_con(15);
set_dex(13);
set_int(12);
set_str(15);
set_wis(20);
add_skill_level("fighting", 300, 0);
add_skill_level("fighting.combat.melee.blunt", 150, 0);
add_skill_level("faith", 200);
add_skill_level("faith.rituals.misc.area", 300);
add_skill_level("other.perception", 400, 0);
add_skill_level("other.health", 200, 0);
add_known_command("strike");
add_known_command("crush");
add_spell("cure light wounds", "/obj/rituals/curelight", "cast_spell");
add_spell("cure serious wounds", "/obj/rituals/cureserious", "cast_spell");
add_spell("cure critical wounds", "/obj/rituals/curecritical", "cast_spell");
add_spell("minor shield", "/obj/rituals/minorshield", "cast_spell");
add_spell("dust devil", "/obj/rituals/dustdevil", "cast_spell");
add_combat_action(100, "maintenance", (: maintain_self :)) ;
add_combat_action(70, "fighting_stuff", (: fighting_stuff :));
add_combat_action(50, "ritual_stuff", (: ritual_stuff :));
ARMOURY->request_item("white cotton tunic", 100)->move(this_object());
ARMOURY->request_item("rope belt", 100)->move(this_object());
ARMOURY->request_item("soft leather shoes", 100)->move(this_object());
clone_object("/obj/faith/pishe_symbol.ob")->move(this_object());
do_command("tactics response parry");
do_command("tactics attitude defensive");
load_chat(20, ({ 2, ":smiles kindly.",
1, "'May the countenance of Pishe rain upon you.",
2, ":smiles serenely." }));
load_a_chat(20, ({ 1, "'Do you know who I am?",
1, "'May the power of Pishe strike you down.",
1, "'Die unbeliever!",
1, "'You fight me, you fight Pishe herself",
1, "'Pishe! Aid your loyal servant!" }));
set_virtual_move(1);
set_move_after(30, 120);
add_move_zone("Ankh-Morpork");
add_move_zone("Temple");
set_wimpy(10);
add_respond_to_with(({ "@say",
({ ({ "heal", "healing" }), "please" }) }), (: do_heal :));
add_respond_to_with(({ "@say",
({ "please", "heal", "me" }) }), (: do_heal :));
add_respond_to_with(({ "@smile", "althea" }), "smile $hname$");
add_respond_to_with(({ ({ "@bow", "@curtsey" }), "althea" }),
"curtsey $hname$");
add_enter_commands((: check_injured :));
flail = ARMOURY->request_item("cleric rod", 100);
flail->set_enchant(flail->query_max_enchant() / 2);
flail->whichone(7);
flail->move(this_object());
call_out((: init_equip :), 2);
move("/d/guilds/priests/Ankh-Morpork/small-gods/old/PriestGardenStatue", "$N walk$s into the "
"room, smiling serenely.");
} /* setup() */
// A couple of things Althea does during fights just to spice her up a bit
void maintain_self(object thing1, object thing2) {
if (thing2 != this_object())
return;
/* Try and pick up our flail if we've been disarmed. */
if (member_array(flail, query_holding()) == -1) {
queue_command("get flail");
queue_command("hold flail");
}
/* Althea always has enough guild points to cast her healing and
defensive rituals */
if (query_gp() < 200)
adjust_gp(200);
if (query_hp() < query_max_hp() / 2) {
do_command("cast cure serious wounds on althea");
}
/*
if (query_hp() < query_max_hp() / 4) {
do_command("use flail to cast sanctuary");
} */
if(query_hp() < query_max_hp() - 1000) {
do_command("cast dust devil on althea");
}
if (query_hp() < query_max_hp() - 500) {
do_command("cast minor shield on althea");
}
if (query_hp() < query_max_hp() - 250) {
do_command("cast cure light wounds on althea");
}
} /* maintain_self() */
void fighting_stuff(object thing1, object thing2) {
if (thing2 != this_object())
return;
if ( random( 10 ) )
return;
do_command("concentrate " + thing1->query_name());
do_command("tactics attitude offensive" );
do_command("crush "+ thing1->query_name() + " with flail");
}
void ritual_stuff(object thing1, object thing2) {
if (thing2 != this_object())
return;
switch (random(6)) {
case 0..1:
do_command( "cast minor shield on althea" );
break;
/* case 2 :
do_command( "use flail to cast barrier" );
break; */
case 2 .. 4 :
do_command("cast dust devil on althea");
do_command("cast dust devil on althea");
do_command("cast dust devil on althea");
break;
case 5 :
do_command("use flail to cast fear on " + thing1->query_name());
break;
}
do_command("tactics attitude defensive");
} /* ritual_stuff() */
void do_heal(object victim) {
if (member_array(victim, query_attacker_list()) != -1) {
do_command("say I'm not going to heal you!");
return;
}
if (victim->query_hp() > (victim->query_max_hp() / 2)) {
do_command("say You don't need healing from me, " +
victim->short()+".");
return;
}
if (victim->query_gp() < HEAL_COST) {
do_command("say Sorry you're not strong enough for me to "
"heal at the moment.\n");
return;
}
if (victim->query_guild_ob() == "/std/guilds/wizard") {
do_command("say I thought wizards didn't believe in gods?");
do_command("smirk");
return;
}
if (victim->query_al() > random(300)) {
do_command("say You are far too wicked for Pishe's healing.");
return;
}
do_command("say May the power of Pishe heal you.");
tell_room(environment(), "Althea places her hands upon " +
victim->the_short() + " and starts to pray softly.\n");
tell_room(environment(), "As she does so her hands start to glow with a "
"gentle silver light.\nThe light gradually intensifies until "
"everything is bathed in it.\n");
tell_object(victim, "As Althea prays you feel warmth spreading from her "
"hands throughout your body.\n");
tell_room(environment(), "Gradually the light fades.\n");
tell_object(victim, "You feel much better.\n");
tell_room(environment(), victim->the_short()+" looks much better.\n",
victim);
victim->set_hp(victim->query_max_hp());
victim->adjust_gp(-HEAL_COST);
} /* do_heal() */
void check_injured() {
object *people, person;
people = filter(all_inventory(environment()), (: living($1) &&
($1->query_hp() < ($1->query_max_hp() / 2)) &&
$1->query_al() < -300 :));
people -= ({ this_object() });
if (!sizeof(people))
return;
person = people[random(sizeof(people))];
do_command("say Oh my, " + person->short()+ " you don't look so good.");
do_command("say Allow me to heal you.");
call_out((: do_heal($1) :), 1, person);
} /* check_injured() */
void event_fight_in_progress(object attacker, object victim) {
if ( attacker != this_object() && victim->query_name() == "dickens" ) {
if ( !dickens_warned ) {
do_command( "say Fear not, Dickens, Pishe"
" shall protect you!" );
dickens_warned = 1;
do_command( "protect dickens" );
attack_ob( attacker );
}
}
::event_fight_in_progress( attacker, victim );
} /* event_fight_in_progress() */
int adjust_hp(int hp, object attacker) {
int result;
result = ::adjust_hp(hp, attacker);
if(hp < -1500)
call_out("eek", 0);
return result;
} /* adjust_hp() */
void eek() {
init_command("use flail to cast sanctuary", 1);
init_command("cast cure critical wounds on althea", 2);
run_away();
} /* eek() */
void check_fumble( object ob ) {
if ( environment( ob ) == environment() ) {
do_command( "say Whoops, I must have dropped my precious flail!" );
do_command( "get " + file_name( ob ) );
do_command( "hold " + file_name( ob ) );
}
} /* check_fumble() */
void event_enter( object ob, string mess, object from ) {
::event_enter( ob, mess, from );
if ( environment( ob ) == environment() &&
ob->id( "flail" ) && ob->query_cloned_by() == "althea" ) {
call_out( (: check_fumble :), 1, ob );
}
} /* event_enter() */