#ifndef MONSTUFF_H
#define MONSTUFF_H
#include "mon-util.h"
enum mon_dam_level_type
{
MDAM_OKAY,
MDAM_LIGHTLY_DAMAGED,
MDAM_MODERATELY_DAMAGED,
MDAM_HEAVILY_DAMAGED,
MDAM_SEVERELY_DAMAGED,
MDAM_ALMOST_DEAD,
MDAM_DEAD
};
enum mon_desc_type {
MDSC_LEAVES_HIDE, MDSC_REGENERATES,
MDSC_NOMSG_WOUNDS
};
struct level_exit
{
coord_def target;
bool unreachable;
public:
level_exit(coord_def t = coord_def(-1, -1),
bool u = true)
: target(t), unreachable(u)
{
}
};
#define FRESHEST_CORPSE 210
#define YOU_KILL(x) ((x) == KILL_YOU || (x) == KILL_YOU_MISSILE \
|| (x) == KILL_YOU_CONF)
#define MON_KILL(x) ((x) == KILL_MON || (x) == KILL_MON_MISSILE)
#define SAME_ATTITUDE(x) (mons_friendly_real(x) ? BEH_FRIENDLY : \
mons_good_neutral(x) ? BEH_GOOD_NEUTRAL : \
mons_strict_neutral(x) ? BEH_STRICT_NEUTRAL : \
mons_neutral(x) ? BEH_NEUTRAL \
: BEH_HOSTILE)
#define MONST_INTERESTING(x) (x->flags & MF_INTERESTING)
#include "externs.h"
void get_mimic_item( const monsters *mimic, item_def & item );
int get_mimic_colour( const monsters *mimic );
void alert_nearby_monsters(void);
enum poly_power_type {
PPT_LESS,
PPT_MORE,
PPT_SAME
};
bool monster_polymorph(monsters *monster, monster_type targetc,
poly_power_type power = PPT_SAME,
bool force_beh = false);
int monster_die(monsters *monster, killer_type killer,
int killer_index, bool silent = false, bool wizard = false);
monster_type fill_out_corpse(const monsters* monster, item_def& corpse,
bool allow_weightless = false);
int place_monster_corpse(const monsters *monster, bool silent,
bool force = false);
void slime_vault_change(bool glass);
void slimify_monster(monsters *monster, bool hostile = false);
bool mon_can_be_slimified(monsters *monster);
void mons_check_pool(monsters *monster, const coord_def &oldpos,
killer_type killer = KILL_NONE, int killnum = -1);
void monster_cleanup(monsters *monster);
int dismiss_monsters(std::string pattern);
void behaviour_event(monsters *mon, mon_event_type event_type,
int src = MHITNOT, coord_def src_pos = coord_def(),
bool allow_shout = true);
bool curse_an_item(bool decay_potions, bool quiet = false);
void monster_drop_ething(monsters *monster, bool mark_item_origins = false,
int owner_id = NON_ITEM);
bool monster_blink(monsters *monster, bool quiet = false);
bool random_near_space(const coord_def& origin, coord_def& target,
bool allow_adjacent = false, bool restrict_LOS = true,
bool forbid_dangerous = true,
bool forbid_sanctuary = false);
bool simple_monster_message(const monsters *monster, const char *event,
msg_channel_type channel = MSGCH_PLAIN,
int param = 0,
description_level_type descrip = DESC_CAP_THE);
void make_mons_leave_level(monsters *mon);
bool choose_any_monster(const monsters* mon);
monsters *choose_random_nearby_monster(
int weight,
bool (*suitable)(const monsters* mon) =
choose_any_monster,
bool in_sight = true,
bool prefer_named = false, bool prefer_priest = false);
monsters *choose_random_monster_on_level(
int weight,
bool (*suitable)(const monsters* mon) =
choose_any_monster,
bool in_sight = true, bool near_by = false,
bool prefer_named = false, bool prefer_priest = false);
bool swap_places(monsters *monster);
bool swap_places(monsters *monster, const coord_def &loc);
bool swap_check(monsters *monster, coord_def &loc, bool quiet = false);
std::string get_wounds_description(const monsters *monster);
void print_wounds(const monsters *monster);
void handle_monsters(void);
bool monster_descriptor(int which_class, mon_desc_type which_descriptor);
bool message_current_target(void);
unsigned int monster_index(const monsters *monster);
bool monster_can_hit_monster(monsters *monster, const monsters *targ);
void mons_get_damage_level(const monsters*, std::string& desc,
mon_dam_level_type&);
bool heal_monster(monsters *patient, int health_boost, bool permit_growth);
void seen_monster(monsters *monster);
bool shift_monster(monsters *mon, coord_def p = coord_def(0, 0));
int mons_weapon_damage_rating(const item_def &launcher);
int mons_missile_damage(monsters *mons, const item_def *launch,
const item_def *missile);
int mons_pick_best_missile(monsters *mons, item_def **launcher,
bool ignore_melee = false);
int mons_thrown_weapon_damage(const item_def *weap);
int mons_natural_regen_rate(monsters *monster);
bool mons_avoids_cloud(const monsters *monster, cloud_type cl_type,
bool placement = false);
bool mons_avoids_cloud(const monsters *monster, int cloud_num,
cloud_type *cl_type = NULL, bool placement = false);
void mons_relocated(monsters *mons);
bool can_go_straight(const coord_def& p1, const coord_def& p2,
dungeon_feature_type allowed);
#endif