/* Do not remove the headers from this file! see /USAGE for more info. */
// 04-98: Iizuka updated to conform to the new adversary code.
// 05-98: Iizuka added support for multiple resistances.
inherit CLASS_EVENT_INFO;
private mapping resistances = ([]);
private mapping weaknesses = ([]);
private int armor_class;
//:FUNCTION set_armor_class
//Set the protection of the particular damage sink. random(class) points
//of damage will be prevented.
void set_armor_class(int x){ armor_class = x; }
//:FUNCTION query_armor_class
//Query the current armor class of an object. Higher is better.
int query_armor_class(){ return armor_class; }
class event_info sink_modify_event(class event_info evt)
{
if(stringp(evt->data))
return evt;
#if BLOW_STYLE == BLOW_TYPES
if(member_array(evt->data[0], keys(weaknesses)) != -1)
evt->data[1] += random(weaknesses[evt->data[0]]);
if(member_array(evt->data[0], keys(resistances)) != -1)
evt->data[1] -= random(resistances[evt->data[0]] + armor_class);
else
#endif
evt->data[1] -= random(armor_class);
if(evt->data[1] < 0)
evt->data[1] = 0;
return evt;
}
//:FUNCTION set_resist
//set_resist(type, amt) specifies that for damage of type 'type', the armor
//class should be increased by 'amt'
void set_resist(string type, int amt)
{
if(DAMAGE_D->query_valid_damage_type(type))
resistances[type] = amt;
else
error(sprintf("Invalid damage type %s in %O\n",type, this_object()));
}
//:FUNCTION set_resistances
//void set_resistances(mapping) - Set all the resistances an armor
//possesses.
void set_resistances(mapping x)
{
string array exclude = keys(x) - DAMAGE_D->query_damage_types();
if(sizeof(exclude))
error("Invalid damage type(s) : " + implode(exclude,","));
resistances = x;
}
//:FUNCTION set_weakness
//set_weakness(type, amt) specifies that for damage of type 'type', the armor
//class should be decreased by 'amt'
void set_weakness(string type, int amt)
{
if(DAMAGE_D->query_valid_damage_type(type))
weaknesses[type] = amt;
else
error(sprintf("Invalid damage type %s in %O\n",type, this_object()));
}
//:FUNCTION set_weaknesses
//void set_weaknesses(mapping) - Set all the weaknesses an armor
//possesses.
void set_weaknesses(mapping weak)
{
string array exclude = keys(weak) - DAMAGE_D->query_damage_types();
if(sizeof(exclude))
error("Invalid damage type(s) : " + implode(exclude,","));
weaknesses = weak;
}
//:FUNCTION is_armor
//Returns 1 if the object is a damage_sink.
int is_armor(){ return 1; }
mapping lpscript_attributes()
{
return
([
"armor_class" : ({ LPSCRIPT_INT, "setup", "set_armor_class" }),
]);
}