/* Do not remove the headers from this file! see /USAGE for more info. */
// aggressive.c
// Inheritable for aggressive monsters
// Onyx@Red Dragon
// NOTE: Someone who understands Lima vanilla combat should edit the
// line I indicated to make this compat.
//
// 12 May, 1998: Iizuka updated to support the new adversary code.
void add_hook(string tag, function hook);
void remove_hook(string tag, function hook);
void start_fight(object who);
private void agro_func(object who);
void i_moved();
private object my_loc;
private int aggression_chance = 100;
private nosave function agro_fn = (: agro_func :);
private nosave function moved_fn = (: i_moved :);
//:FUNCTION handle_attack
// By default, this compares a random number to aggression_chance
// and starts attacking based upon them. This function might be
// overloaded to perform racial checks or something though.
protected void handle_attack(object who)
{
if(random(100) < aggression_chance)
start_fight(who);
}
// It checks to see which objects in the room are players and attacks them.
private void agro_func(object who)
{
object item;
if(who == this_object())
foreach(item in all_inventory(environment()))
{
if(item->attackable() && item != this_object())
handle_attack(item);
}
else handle_attack(who);
}
// It moves the "object_arrived" hook (which is associated with a room)
// when the aggressive monster moves
void i_moved()
{
if(my_loc)
my_loc->remove_hook("object_arrived", agro_fn );
my_loc = environment();
my_loc->add_hook("object_arrived", agro_fn );
}
//:FUNCTION set_aggressive
// This function is used to set the aggression chance of a monster in the
// range 0 (never aggressive) to 100 (completely aggressive).
void set_aggressive(int a)
{
if(!a)
{
if(my_loc)
my_loc->remove_hook("object_arrived", agro_fn );
if(aggression_chance)
remove_hook("move", moved_fn);
}
else
{
if(my_loc)
my_loc->add_hook("object_arrived", agro_fn );
if(!aggression_chance)
add_hook("move", moved_fn);
}
aggression_chance = a;
}
//:FUNCTION query_aggressive
// This function returns 0 for unaggressive monsters, or the chance of
// aggression for aggressive monsters.
int query_aggressive()
{
return aggression_chance;
}
void mudlib_setup()
{
add_hook("move", moved_fn);
}
mapping lpscript_attributes()
{
return ([
"aggressive" : ({ LPSCRIPT_INT, "setup", "set_aggressive" }),
]);
}