/* Do not remove the headers from this file! see /USAGE for more info. */

/*
 * The concept is a bit abstract, so the name isn't entirely correct.  This
 * is an abstraction of the concept of something that one attacks with;
 * either a weapon or one's self.  It controls the combat messages, and
 * modifies the result based on the target, etc.
 *
 * This means that when you fight with a weapon, the _weapon_ is really
 * attacking, not you.  Some of the names in this are a bit backwards compat,
 * though.
 *
 * April, 1998: Iizuka made significant changes and updated for adversary.
 */


inherit CLASS_EVENT_INFO;

private int weapon_class = 1;
private int to_hit_bonus;
private string array damage_type = ({ "blow" });
private nosave mapping def_combat_messages = ([]);
private mapping combat_messages = ([]);

mixed adjust_my_result(mixed result){ return result; }

int query_to_hit_bonus(object target){ return to_hit_bonus; }

void set_to_hit_bonus(int x){ to_hit_bonus = x; }

string array query_damage_type(){ return damage_type; }

void set_damage_type(string array str...)
{
  string array exclude = str - DAMAGE_D->query_damage_types();
  if(sizeof(exclude))
    error("Invalid damage type(s) : " + implode(exclude,","));
  damage_type = str;
}

int is_weapon(){ return 1; }

//:FUNCTION set_combat_messages
//Set the set of combat messages which are used by default
void set_combat_messages(string type)
{
  if(!(def_combat_messages = MESSAGES_D->get_messages(type)))
    error("No messages of that type.\n");
}

//:FUNCTION set_combat_message
//Set a single combat message, removing the existing one(s)
void set_combat_message(string type, string msg)
{
  combat_messages[type] = msg;
}

//:FUNCTION query_combat_message
//Returns the combat message for a given type
mixed query_combat_message(string type)
{
  return combat_messages[type] || def_combat_messages[type];
}

private mixed merge_lists(mixed list, mixed item, mixed def)
{
  if(arrayp(list))
    return list + ({ item });
  else if(list)
    return ({ list, item });
  else if (def)
    return merge_lists(def, item, 0);
  else
    return item;
}

void add_combat_message(string type, string msg)
{
  combat_messages[type] = merge_lists(combat_messages[type], msg, 
                                      def_combat_messages[type]);
}

void set_weapon_class(int x){ weapon_class = x; }

int query_weapon_class(){ return weapon_class; }

#ifdef USE_SKILLS
private string skill_used = "combat/unarmed";

string query_skill_used(){ return skill_used; }

void set_skill_used(string new_skill_used){ skill_used = new_skill_used; }
#endif

mapping lpscript_attributes()
{
  return ([
    "weapon_class" : ({ LPSCRIPT_INT, "setup", "set_weapon_class" }),
    "skill_used" : ({ LPSCRIPT_STRING, "setup", "set_skill_used" }),
    "combat_messages" : ({ LPSCRIPT_STRING, "setup", "set_combat_messages" }),
    ]);
}

class event_info source_modify_event(class event_info evt){ return evt; }
