diff options
author | Robert Vollmert <rvollmert@gmx.net> | 2009-10-19 16:12:04 +0200 |
---|---|---|
committer | Robert Vollmert <rvollmert@gmx.net> | 2009-10-21 14:42:01 +0200 |
commit | 36ac6df41458d10cf40fb837738b2f752bd05557 (patch) | |
tree | ab64c9b2f954ea3426aeafc6dff5068999ca9cab /crawl-ref/source/externs.h | |
parent | 83d597313c41858a8f7e65bb32534a785cf7ed55 (diff) | |
download | crawl-ref-36ac6df41458d10cf40fb837738b2f752bd05557.tar.gz crawl-ref-36ac6df41458d10cf40fb837738b2f752bd05557.zip |
Split actors and env from externs.h.
Diffstat (limited to 'crawl-ref/source/externs.h')
-rw-r--r-- | crawl-ref/source/externs.h | 1183 |
1 files changed, 39 insertions, 1144 deletions
diff --git a/crawl-ref/source/externs.h b/crawl-ref/source/externs.h index e040da7450..3b9ae64d08 100644 --- a/crawl-ref/source/externs.h +++ b/crawl-ref/source/externs.h @@ -75,6 +75,10 @@ const int kPathLen = 256; // penalty (Xom's granted or from a deck of cards). #define NO_BERSERK_PENALTY -1 +typedef FixedArray<dungeon_feature_type, GXM, GYM> feature_grid; +typedef FixedArray<unsigned, ENV_SHOW_DIAMETER, ENV_SHOW_DIAMETER> + env_show_grid; + struct item_def; class melee_attack; struct coord_def; @@ -225,213 +229,6 @@ struct coord_def } }; -class actor -{ -public: - virtual ~actor(); - - virtual int id() const = 0; - virtual int mindex() const = 0; - virtual actor_type atype() const = 0; - - virtual kill_category kill_alignment() const = 0; - virtual god_type deity() const = 0; - - virtual bool alive() const = 0; - - virtual bool is_summoned(int* duration = NULL, - int* summon_type = NULL) const = 0; - - virtual void moveto(const coord_def &c) = 0; - virtual const coord_def& pos() const { return position; } - virtual coord_def& pos() { return position; } - - virtual bool swimming() const = 0; - virtual bool submerged() const = 0; - virtual bool floundering() const = 0; - - // Returns true if the actor is exceptionally well balanced. - virtual bool extra_balanced() const = 0; - - virtual int get_experience_level() const = 0; - - virtual bool can_pass_through_feat(dungeon_feature_type grid) const = 0; - virtual bool can_pass_through(int x, int y) const; - virtual bool can_pass_through(const coord_def &c) const; - - virtual bool is_habitable_feat(dungeon_feature_type actual_grid) const = 0; - bool is_habitable(const coord_def &pos) const; - - virtual size_type body_size(int psize = PSIZE_TORSO, - bool base = false) const = 0; - virtual int body_weight() const = 0; - virtual int total_weight() const = 0; - - virtual int damage_brand(int which_attack = -1) = 0; - virtual int damage_type(int which_attack = -1) = 0; - virtual item_def *weapon(int which_attack = -1) = 0; - virtual item_def *shield() = 0; - virtual item_def *slot_item(equipment_type eq) = 0; - // Just a wrapper; not to be overridden - const item_def *slot_item(equipment_type eq) const - { - return const_cast<actor*>(this)->slot_item(eq); - } - virtual bool has_equipped(equipment_type eq, int sub_type) const; - - bool can_wield(const item_def* item, - bool ignore_curse = false, - bool ignore_brand = false, - bool ignore_shield = false, - bool ignore_transform = false) const; - virtual bool can_wield(const item_def &item, - bool ignore_curse = false, - bool ignore_brand = false, - bool ignore_shield = false, - bool ignore_transform = false) const = 0; - virtual bool could_wield(const item_def &item, - bool ignore_brand = false, - bool ignore_transform = false) const = 0; - - virtual int hunger_level() const { return HS_ENGORGED; } - virtual void make_hungry(int nutrition, bool silent = true) - { - } - - // Need not be implemented for the player - player action costs - // are explicitly calculated. - virtual void lose_energy(energy_use_type, int div = 1, int mult = 1) - { - } - - virtual std::string name(description_level_type type, - bool force_visible = false) const = 0; - virtual std::string pronoun(pronoun_type which_pronoun, - bool force_visible = false) const = 0; - virtual std::string conj_verb(const std::string &verb) const = 0; - virtual std::string hand_name(bool plural, - bool *can_plural = NULL) const = 0; - virtual std::string foot_name(bool plural, - bool *can_plural = NULL) const = 0; - virtual std::string arm_name(bool plural, - bool *can_plural = NULL) const = 0; - - virtual bool fumbles_attack(bool verbose = true) = 0; - - // Returns true if the actor has no way to attack (plants, statues). - // (statues have only indirect attacks). - virtual bool cannot_fight() const = 0; - virtual void attacking(actor *other) = 0; - virtual bool can_go_berserk() const = 0; - virtual bool can_see_invisible() const = 0; - virtual bool invisible() const = 0; - virtual bool visible_to(const actor *looker) const = 0; - virtual bool can_see(const actor *target) const = 0; - virtual bool is_icy() const = 0; - virtual bool is_fiery() const = 0; - virtual void go_berserk(bool intentional) = 0; - virtual bool can_mutate() const = 0; - virtual bool can_safely_mutate() const = 0; - virtual bool can_bleed() const = 0; - virtual bool mutate() = 0; - virtual bool drain_exp(actor *agent, bool quiet = false, int pow = 3) = 0; - virtual bool rot(actor *agent, int amount, int immediate = 0, - bool quiet = false) = 0; - virtual int hurt(const actor *attacker, int amount, - beam_type flavour = BEAM_MISSILE, - bool cleanup_dead = true) = 0; - virtual void heal(int amount, bool max_too = false) = 0; - virtual void banish(const std::string &who = "") = 0; - virtual void blink(bool allow_partial_control = true) = 0; - virtual void teleport(bool right_now = false, bool abyss_shift = false) = 0; - virtual void poison(actor *attacker, int amount = 1) = 0; - virtual bool sicken(int amount) = 0; - virtual void paralyse(actor *attacker, int strength) = 0; - virtual void petrify(actor *attacker, int strength) = 0; - virtual void slow_down(actor *attacker, int strength) = 0; - virtual void confuse(actor *attacker, int strength) = 0; - virtual void expose_to_element(beam_type element, int strength = 0) = 0; - virtual void drain_stat(int stat, int amount, actor* attacker) { } - virtual void put_to_sleep(int power = 0) { }; - virtual void check_awaken(int disturbance) = 0; - - virtual bool wearing_light_armour(bool = false) const { return (true); } - virtual int skill(skill_type sk, bool skill_bump = false) const - { - return (0); - } - - virtual void exercise(skill_type sk, int qty) { } - - virtual int stat_hp() const = 0; - virtual int stat_maxhp() const = 0; - - virtual bool can_throw_large_rocks() const = 0; - - virtual int armour_class() const = 0; - virtual int melee_evasion(const actor *attacker) const = 0; - virtual int shield_bonus() const = 0; - virtual int shield_block_penalty() const = 0; - virtual int shield_bypass_ability(int tohit) const = 0; - - virtual void shield_block_succeeded() { } - - virtual int mons_species() const = 0; - - virtual mon_holy_type holiness() const = 0; - virtual int res_fire() const = 0; - virtual int res_steam() const = 0; - virtual int res_cold() const = 0; - virtual int res_elec() const = 0; - virtual int res_poison() const = 0; - virtual int res_rotting() const = 0; - virtual int res_asphyx() const = 0; - virtual int res_sticky_flame() const = 0; - virtual int res_holy_energy(const actor *attacker) const = 0; - virtual int res_negative_energy() const = 0; - virtual int res_torment() const = 0; - - virtual flight_type flight_mode() const = 0; - virtual bool is_levitating() const = 0; - virtual bool airborne() const; - - virtual bool paralysed() const = 0; - virtual bool cannot_move() const = 0; - virtual bool cannot_act() const = 0; - virtual bool confused() const = 0; - virtual bool caught() const = 0; - virtual bool asleep() const { return (false); } - virtual bool backlit(bool check_haloed = true) const = 0; - virtual bool haloed() const = 0; - - virtual bool handle_trap(); - - virtual void god_conduct(conduct_type thing_done, int level) { } - - virtual bool incapacitated() const - { - return cannot_move() || asleep() || confused() || caught(); - } - - virtual int warding() const - { - return (0); - } - - virtual bool visible() const - { - return (true); - } - - virtual bool has_spell(spell_type spell) const = 0; - - virtual bool will_trigger_shaft() const; - virtual level_id shaft_dest() const; - virtual bool do_shaft() = 0; - - coord_def position; -}; - typedef bool (*coord_predicate)(const coord_def &c); struct dice_def @@ -449,6 +246,38 @@ struct run_check_dir coord_def delta; }; +struct cloud_struct +{ + coord_def pos; + cloud_type type; + int decay; + unsigned char spread_rate; + kill_category whose; + killer_type killer; + + cloud_struct() : pos(), type(CLOUD_NONE), decay(0), spread_rate(0), + whose(KC_OTHER), killer(KILL_NONE) + { + } + + void set_whose(kill_category _whose); + void set_killer(killer_type _killer); + + static kill_category killer_to_whose(killer_type killer); + static killer_type whose_to_killer(kill_category whose); + +}; + +struct shop_struct +{ + coord_def pos; + unsigned char greed; + shop_type type; + unsigned char level; + + FixedVector<unsigned char, 3> keeper_name; +}; + struct delay_queue_item { @@ -571,6 +400,7 @@ public: void load(reader&); }; + struct item_def { object_class_type base_type; // basic class (ie OBJ_WEAPON) @@ -732,451 +562,6 @@ class KillMaster; -class player : public actor -{ -public: - bool turn_is_over; // flag signaling that player has performed a timed action - - // If true, player is headed to the Abyss. - bool banished; - std::string banished_by; - - std::vector<int> mesmerised_by; // monsters mesmerising player - - int friendly_pickup; // pickup setting for allies - - unsigned short prev_targ; - coord_def prev_grd_targ; - char your_name[kNameLen]; - - species_type species; - job_type char_class; - - // Coordinates of last travel target; note that this is never used by - // travel itself, only by the level-map to remember the last travel target. - short travel_x, travel_y; - - runrest running; // Nonzero if running/traveling. - - unsigned short unrand_reacts; - - double elapsed_time; // total amount of elapsed time in the game - - unsigned char synch_time; // amount to wait before calling handle_time() - - unsigned char disease; - - char max_level; - - coord_def youpos; - - coord_def prev_move; - - int hunger; - FixedVector<char, NUM_EQUIP> equip; - - int hp; - int hp_max; - int base_hp; // temporary max HP loss (rotting) - int base_hp2; // base HPs from levels (and permanent loss) - - int magic_points; - int max_magic_points; - int base_magic_points; // temporary max MP loss? (currently unused) - int base_magic_points2; // base MPs from levels and potions of magic - - char strength; - char intel; - char dex; - char max_strength; - char max_intel; - char max_dex; - stat_type last_chosen; - - char hunger_state; - - bool wield_change; // redraw weapon - bool redraw_quiver; // redraw quiver - bool received_weapon_warning; - - unsigned long redraw_status_flags; - - // PC's symbol (usually @) and colour. - int symbol; - int colour; - - bool redraw_hit_points; - bool redraw_magic_points; - bool redraw_strength; - bool redraw_intelligence; - bool redraw_dexterity; - bool redraw_experience; - bool redraw_armour_class; - bool redraw_evasion; - - unsigned char flash_colour; - - unsigned char hit_points_regeneration; - unsigned char magic_points_regeneration; - - unsigned long experience; - int experience_level; - int gold; - char class_name[30]; - int time_taken; - - int shield_blocks; // number of shield blocks since last action - - FixedVector< item_def, ENDOFPACK > inv; - - int burden; - burden_state_type burden_state; - FixedVector<spell_type, 25> spells; - char spell_no; - game_direction_type char_direction; - bool opened_zot; - bool royal_jelly_dead; - bool transform_cancellable; - - unsigned short pet_target; - - int your_level; // offset by one (-1 == 0, 0 == 1, etc.) for display - - // durational things - FixedVector<int, NUM_DURATIONS> duration; - - int rotting; - - int berserk_penalty; // penalty for moving while berserk - - FixedVector<unsigned long, NUM_ATTRIBUTES> attribute; - FixedVector<unsigned char, NUM_QUIVER> quiver; // default items for quiver - FixedVector<long, NUM_OBJECT_CLASSES> sacrifice_value; - - undead_state_type is_undead; - - delay_queue_type delay_queue; // pending actions - - FixedVector<unsigned char, 50> skills; - FixedVector<bool, 50> practise_skill; - FixedVector<unsigned int, 50> skill_points; - FixedVector<unsigned char, 50> skill_order; - - skill_type sage_bonus_skill; // If Sage is in effect, which skill it affects. - int sage_bonus_degree; // How much bonus XP to give in that skill. - - int skill_cost_level; - int total_skill_points; - int exp_available; - - FixedArray<unsigned char, 6, 50> item_description; - FixedVector<unique_item_status_type, MAX_UNRANDARTS> unique_items; - FixedVector<bool, NUM_MONSTERS> unique_creatures; - - // NOTE: The kills member is a pointer to a KillMaster object, - // rather than the object itself, so that we can get away with - // just a foward declare of the KillMaster class, rather than - // having to #include kills.h and thus make every single .cc file - // dependant on kills.h. Having a pointer means that we have - // to do our own implementations of copying the player object, - // since the default implementations will lead to the kills member - // pointing to freed memory, or worse yet lead to the same piece of - // memory being freed twice. - KillMaster* kills; - - level_area_type level_type; - - // Human-readable name for portal vault. Will be set to level_type_tag - // if not explicitly set by the entry portal. - std::string level_type_name; - - // Three-letter extension for portal vault bones files. Will be set - // to first three letters of level_type_tag if not explicitly set by - // the entry portal. - std::string level_type_ext; - - // Abbreviation of portal vault name, for use in notes. If not - // explicitly set by the portal vault, will be set from level_type_name - // or level_type_tag if either is short enough, or the shorter of the - // two will be truncated if neither is short enough. - std::string level_type_name_abbrev; - - // Item origin string for items from portal vaults, so that dumps - // can have origins like "You found it in on level 2 of a ziggurat". - // Will be set relative to level_type_name if not explicitly set. - std::string level_type_origin; - - // .des file tag for portal vault - std::string level_type_tag; - - entry_cause_type entry_cause; - god_type entry_cause_god; - - branch_type where_are_you; - - FixedVector<unsigned char, 30> branch_stairs; - - god_type religion; - std::string second_god_name; // Random second name of Jiyva - unsigned char piety; - unsigned char piety_hysteresis; // amount of stored-up docking - unsigned char gift_timeout; - FixedVector<unsigned char, MAX_NUM_GODS> penance; - FixedVector<unsigned char, MAX_NUM_GODS> worshipped; - FixedVector<short, MAX_NUM_GODS> num_gifts; - - - FixedVector<unsigned char, NUM_MUTATIONS> mutation; - FixedVector<unsigned char, NUM_MUTATIONS> demon_pow; - unsigned char magic_contamination; - - FixedVector<bool, NUM_FIXED_BOOKS> had_book; - FixedVector<bool, NUM_SPELLS> seen_spell; - - unsigned char normal_vision; // how far the species gets to see - unsigned char current_vision; // current sight radius (cells) - - unsigned char hell_exit; // which level plyr goes to on hell exit. - - // This field is here even in non-WIZARD compiles, since the - // player might have been playing previously under wiz mode. - bool wizard; // true if player has entered wiz mode. - time_t birth_time; // start time of game - - time_t start_time; // start time of session - long real_time; // real time played (in seconds) - long num_turns; // number of turns taken - - long last_view_update; // what turn was the view last updated? - - int old_hunger; // used for hunger delta-meter (see output.cc) - - // Set when the character is going to a new level, to guard against levgen - // failures - dungeon_feature_type transit_stair; - bool entering_level; - int lava_in_sight; // Is there lava in LoS? - int water_in_sight; // Is there deep water in LoS? -#ifdef USE_TILE - coord_def last_clicked_grid; // The map position the player last clicked on. - int last_clicked_item; // The inventory cell the player last clicked on. -#endif - - // Warning: these two are quite different. - // - // The spell table is an index to a specific spell slot (you.spells). - // The ability table lists the ability (ABIL_*) which prefers that letter. - // - // In other words, the spell table contains hard links and the ability - // table contains soft links. - FixedVector<int, 52> spell_letter_table; // ref to spell by slot - FixedVector<ability_type, 52> ability_letter_table; // ref to abil by enum - - std::set<std::string> uniq_map_tags; - std::set<std::string> uniq_map_names; - - PlaceInfo global_info; - player_quiver* m_quiver; - - int escaped_death_cause; - std::string escaped_death_aux; - -protected: - FixedVector<PlaceInfo, NUM_BRANCHES> branch_info; - FixedVector<PlaceInfo, NUM_LEVEL_AREA_TYPES - 1> non_branch_info; - -public: - player(); - player(const player &other); - ~player(); - - void copy_from(const player &other); - - void init(); - - // Low-level move the player. Use this instead of changing pos directly. - void moveto(const coord_def &c); - // Move the player during an abyss shift. - void shiftto(const coord_def &c); - - void reset_prev_move(); - - bool in_water() const; - bool can_swim() const; - bool is_levitating() const; - bool cannot_speak() const; - bool invisible() const; - bool can_see_invisible() const; - bool visible_to(const actor *looker) const; - bool can_see(const actor *target) const; - bool is_icy() const; - bool is_fiery() const; - - bool light_flight() const; - bool travelling_light() const; - - kill_category kill_alignment() const; - - bool has_spell(spell_type spell) const; - - size_type transform_size(int psize = PSIZE_TORSO) const; - std::string shout_verb() const; - - item_def *slot_item(equipment_type eq); - - // actor - int id() const; - int mindex() const; - int get_experience_level() const; - actor_type atype() const { return ACT_PLAYER; } - - god_type deity() const; - bool alive() const; - bool is_summoned(int* duration = NULL, int* summon_type = NULL) const; - - bool swimming() const; - bool submerged() const; - bool floundering() const; - bool extra_balanced() const; - bool can_pass_through_feat(dungeon_feature_type grid) const; - bool is_habitable_feat(dungeon_feature_type actual_grid) const; - size_type body_size(int psize = PSIZE_TORSO, bool base = false) const; - int body_weight() const; - int total_weight() const; - int damage_brand(int which_attack = -1); - int damage_type(int which_attack = -1); - int has_claws(bool allow_tran = true) const; - bool has_usable_claws(bool allow_tran = true) const; - item_def *weapon(int which_attack = -1); - item_def *shield(); - - bool can_wield(const item_def &item, - bool ignore_curse = false, - bool ignore_brand = false, - bool ignore_shield = false, - bool ignore_transform = false) const; - bool could_wield(const item_def &item, - bool ignore_brand = false, - bool ignore_transform = false) const; - - std::string name(description_level_type type, - bool force_visible = false) const; - std::string pronoun(pronoun_type pro, bool force_visible = false) const; - std::string conj_verb(const std::string &verb) const; - std::string hand_name(bool plural, bool *can_plural = NULL) const; - std::string foot_name(bool plural, bool *can_plural = NULL) const; - std::string arm_name(bool plural, bool *can_plural = NULL) const; - - bool fumbles_attack(bool verbose = true); - bool cannot_fight() const; - - void attacking(actor *other); - bool can_go_berserk() const; - bool can_go_berserk(bool verbose) const; - void go_berserk(bool intentional); - bool can_mutate() const; - bool can_safely_mutate() const; - bool can_bleed() const; - bool mutate(); - void backlight(); - void banish(const std::string &who = ""); - void blink(bool allow_partial_control = true); - void teleport(bool right_now = false, bool abyss_shift = false); - void drain_stat(int stat, int amount, actor* attacker); - - void expose_to_element(beam_type element, int strength = 0); - void god_conduct(conduct_type thing_done, int level); - - int hunger_level() const { return hunger_state; } - void make_hungry(int nutrition, bool silent = true); - void poison(actor *agent, int amount = 1); - bool sicken(int amount); - void paralyse(actor *, int str); - void petrify(actor *, int str); - void slow_down(actor *, int str); - void confuse(actor *, int strength); - void heal(int amount, bool max_too = false); - bool drain_exp(actor *, bool quiet = false, int pow = 3); - bool rot(actor *, int amount, int immediate = 0, bool quiet = false); - int hurt(const actor *attacker, int amount, - beam_type flavour = BEAM_MISSILE, - bool cleanup_dead = true); - - int warding() const; - - int mons_species() const; - - mon_holy_type holiness() const; - int res_fire() const; - int res_steam() const; - int res_cold() const; - int res_elec() const; - int res_poison() const; - int res_rotting() const; - int res_asphyx() const; - int res_sticky_flame() const; - int res_holy_energy(const actor *) const; - int res_negative_energy() const; - int res_torment() const; - bool confusable() const; - bool slowable() const; - - flight_type flight_mode() const; - bool permanent_levitation() const; - bool permanent_flight() const; - - bool paralysed() const; - bool cannot_move() const; - bool cannot_act() const; - bool confused() const; - bool caught() const; - bool backlit(bool check_haloed = true) const; - bool haloed() const; - - bool asleep() const; - void put_to_sleep(int power = 0); - void awake(); - void check_awaken(int disturbance); - - bool can_throw_large_rocks() const; - - int armour_class() const; - int melee_evasion(const actor *attacker) const; - - int stat_hp() const { return hp; } - int stat_maxhp() const { return hp_max; } - - int shield_bonus() const; - int shield_block_penalty() const; - int shield_bypass_ability(int tohit) const; - - void shield_block_succeeded(); - - bool wearing_light_armour(bool with_skill = false) const; - void exercise(skill_type skill, int qty); - int skill(skill_type skill, bool skill_bump = false) const; - - PlaceInfo& get_place_info() const ; // Current place info - PlaceInfo& get_place_info(branch_type branch, - level_area_type level_type2) const; - PlaceInfo& get_place_info(branch_type branch) const; - PlaceInfo& get_place_info(level_area_type level_type2) const; - - void set_place_info(PlaceInfo info); - // Returns copies of the PlaceInfo; modifying the vector won't - // modify the player object. - std::vector<PlaceInfo> get_all_place_info(bool visited_only = false, - bool dungeon_only = false) const; - - bool do_shaft(); - - bool did_escape_death() const; - void reset_escaped_death(); -protected: - void base_moveto(const coord_def &c); -}; - -extern player you; class monster_spells : public FixedVector<spell_type, NUM_MONSTER_SPELL_SLOTS> { @@ -1188,422 +573,8 @@ public: }; class ghost_demon; - -class mon_enchant -{ -public: - enchant_type ench; - int degree; - int duration, maxduration; - kill_category who; // Who set this enchantment? - -public: - mon_enchant(enchant_type e = ENCH_NONE, int deg = 0, - kill_category whose = KC_OTHER, - int dur = 0); - - killer_type killer() const; - int kill_agent() const; - - operator std::string () const; - const char *kill_category_desc(kill_category) const; - void merge_killer(kill_category who); - void cap_degree(); - - void set_duration(const monsters *mons, const mon_enchant *exist); - - bool operator < (const mon_enchant &other) const - { - return (ench < other.ench); - } - - bool operator == (const mon_enchant &other) const - { - // NOTE: This does *not* check who/degree. - return (ench == other.ench); - } - - mon_enchant &operator += (const mon_enchant &other); - mon_enchant operator + (const mon_enchant &other) const; - -private: - int modded_speed(const monsters *mons, int hdplus) const; - int calc_duration(const monsters *mons, const mon_enchant *added) const; -}; - -typedef std::map<enchant_type, mon_enchant> mon_enchant_list; - -struct monsterentry; - -class monsters : public actor -{ -public: - monsters(); - monsters(const monsters &other); - ~monsters(); - - monsters &operator = (const monsters &other); - void reset(); - -public: - std::string mname; - - int type; - int hit_points; - int max_hit_points; - int hit_dice; - int ac; - int ev; - int speed; - int speed_increment; - - coord_def target; - coord_def patrol_point; - mutable montravel_target_type travel_target; - std::vector<coord_def> travel_path; - FixedVector<short, NUM_MONSTER_SLOTS> inv; - monster_spells spells; - mon_attitude_type attitude; - beh_type behaviour; - unsigned short foe; - char ench_countdown; - mon_enchant_list enchantments; - unsigned long flags; // bitfield of boolean flags - - unsigned long experience; - monster_type base_monster; // zombie base monster, draconian colour - unsigned int number; // #heads (hydra), etc. - int colour; - - int foe_memory; // how long to 'remember' foe x,y - // once they go out of sight. - - int shield_blocks; // Count of shield blocks this round. - - god_type god; // What god the monster worships, if - // any. - - std::auto_ptr<ghost_demon> ghost; // Ghost information. - - std::string seen_context; // Non-standard context for - // AI_SEE_MONSTER - -public: - mon_attitude_type temp_attitude() const; - - // Returns true if the monster is named with a proper name, or is - // a player ghost. - bool is_named() const; - - // Does this monster have a base name, i.e. is base_name() != name(). - // See base_name() for details. - bool has_base_name() const; - - const monsterentry *find_monsterentry() const; - - void init_experience(); - - void mark_summoned(int longevity, bool mark_items_summoned, - int summon_type = 0); - bool is_summoned(int* duration = NULL, int* summon_type = NULL) const; - bool has_action_energy() const; - void check_redraw(const coord_def &oldpos) const; - void apply_location_effects(const coord_def &oldpos); - - void moveto(const coord_def& c); - bool move_to_pos(const coord_def &newpos); - - kill_category kill_alignment() const; - - int foe_distance() const; - bool needs_berserk(bool check_spells = true) const; - - // Has a hydra-like variable number of attacks based on mons->number. - bool has_hydra_multi_attack() const; - bool has_multitargeting() const; - - bool has_ench(enchant_type ench) const; - bool has_ench(enchant_type ench, enchant_type ench2) const; - mon_enchant get_ench(enchant_type ench, - enchant_type ench2 = ENCH_NONE) const; - bool add_ench(const mon_enchant &); - void update_ench(const mon_enchant &); - bool del_ench(enchant_type ench, bool quiet = false, bool effect = true); - bool lose_ench_duration(const mon_enchant &e, int levels); - bool lose_ench_levels(const mon_enchant &e, int lev); - void lose_energy(energy_use_type et, int div = 1, int mult = 1); - - void scale_hp(int num, int den); - bool gain_exp(int exp); - - void react_to_damage(int damage, beam_type flavour, kill_category whose); - - void forget_random_spell(); - - void add_enchantment_effect(const mon_enchant &me, bool quiet = false); - void remove_enchantment_effect(const mon_enchant &me, bool quiet = false); - void apply_enchantments(); - void apply_enchantment(const mon_enchant &me); - - bool can_drink_potion(potion_type ptype) const; - bool should_drink_potion(potion_type ptype) const; - item_type_id_state_type drink_potion_effect(potion_type ptype); - - void timeout_enchantments(int levels); - - bool is_travelling() const; - bool is_patrolling() const; - bool needs_transit() const; - void set_transit(const level_id &destination); - bool find_place_to_live(bool near_player = false); - bool find_home_near_place(const coord_def &c); - bool find_home_near_player(); - bool find_home_around(const coord_def &c, int radius); - bool find_home_anywhere(); - - void set_ghost(const ghost_demon &ghost, bool has_name = true); - void ghost_init(); - void pandemon_init(); - void uglything_init(bool only_mutate = false); - void uglything_mutate(); - void uglything_upgrade(); - void destroy_inventory(); - void load_spells(mon_spellbook_type spellbook); - - actor *get_foe() const; - - // actor interface - int id() const; - int mindex() const; - int get_experience_level() const; - god_type deity() const; - bool alive() const; - bool swimming() const; - bool wants_submerge() const; - - bool submerged() const; - bool can_drown() const; - bool floundering() const; - bool extra_balanced() const; - bool can_pass_through_feat(dungeon_feature_type grid) const; - bool is_habitable_feat(dungeon_feature_type actual_grid) const; - size_type body_size(int psize = PSIZE_TORSO, bool base = false) const; - int body_weight() const; - int total_weight() const; - int damage_brand(int which_attack = -1); - int damage_type(int which_attack = -1); - - item_def *slot_item(equipment_type eq); - item_def *mslot_item(mon_inv_type sl) const; - item_def *weapon(int which_attack = -1); - item_def *launcher(); - item_def *missiles(); - item_def *shield(); - - bool can_wield(const item_def &item, - bool ignore_curse = false, - bool ignore_brand = false, - bool ignore_shield = false, - bool ignore_transform = false) const; - bool could_wield(const item_def &item, - bool ignore_brand = false, - bool ignore_transform = false) const; - - int missile_count(); - void wield_melee_weapon(int near = -1); - void swap_weapons(int near = -1); - - bool pickup_item(item_def &item, int near = -1, bool force = false); - void pickup_message(const item_def &item, int near); - bool pickup_wand(item_def &item, int near); - bool pickup_scroll(item_def &item, int near); - bool pickup_potion(item_def &item, int near); - bool pickup_gold(item_def &item, int near); - bool pickup_launcher(item_def &launcher, int near); - bool pickup_melee_weapon(item_def &item, int near); - bool pickup_throwable_weapon(item_def &item, int near); - bool pickup_weapon(item_def &item, int near, bool force); - bool pickup_armour(item_def &item, int near, bool force); - bool pickup_misc(item_def &item, int near); - bool pickup_missile(item_def &item, int near, bool force); - void equip(item_def &item, int slot, int near = -1); - bool unequip(item_def &item, int slot, int near = -1, - bool force = false); - - bool can_use_missile(const item_def &item) const; - - std::string name(description_level_type type, - bool force_visible = false) const; - - // Base name of the monster, bypassing any mname setting. For an orc priest - // named Arbolt, name() will return "Arbolt", but base_name() will return - // "orc priest". - std::string base_name(description_level_type type, - bool force_visible = false) const; - // Full name of the monster. For an orc priest named Arbolt, full_name() - // will return "Arbolt the orc priest". - std::string full_name(description_level_type type, - bool use_comma = false) const; - std::string pronoun(pronoun_type pro, bool force_visible = false) const; - std::string conj_verb(const std::string &verb) const; - std::string hand_name(bool plural, bool *can_plural = NULL) const; - std::string foot_name(bool plural, bool *can_plural = NULL) const; - std::string arm_name(bool plural, bool *can_plural = NULL) const; - - bool fumbles_attack(bool verbose = true); - bool cannot_fight() const; - - int skill(skill_type skill, bool skill_bump = false) const; - - void attacking(actor *other); - bool can_go_berserk() const; - void go_berserk(bool intentional); - bool can_mutate() const; - bool can_safely_mutate() const; - bool can_bleed() const; - bool mutate(); - void banish(const std::string &who = ""); - void expose_to_element(beam_type element, int strength = 0); - bool visible() const; - - int mons_species() const; - - mon_holy_type holiness() const; - int res_fire() const; - int res_steam() const; - int res_cold() const; - int res_elec() const; - int res_poison() const; - int res_rotting() const; - int res_asphyx() const; - int res_sticky_flame() const; - int res_holy_energy(const actor *) const; - int res_negative_energy() const; - int res_torment() const; - - flight_type flight_mode() const; - bool is_levitating() const; - bool invisible() const; - bool can_see_invisible() const; - bool visible_to(const actor *looker) const; - bool mon_see_cell(const coord_def& pos, bool reach = false) const; - bool can_see(const actor *target) const; - bool is_icy() const; - bool is_fiery() const; - bool paralysed() const; - bool cannot_move() const; - bool cannot_act() const; - bool confused() const; - bool confused_by_you() const; - bool caught() const; - bool asleep() const; - bool backlit(bool check_haloed = true) const; - bool haloed() const; - - bool has_spell(spell_type spell) const; - - bool has_attack_flavour(int flavour) const; - bool has_damage_type(int dam_type); - - bool can_throw_large_rocks() const; - - int armour_class() const; - int melee_evasion(const actor *attacker) const; - - void poison(actor *agent, int amount = 1); - bool sicken(int strength); - void paralyse(actor *, int str); - void petrify(actor *, int str); - void slow_down(actor *, int str); - void confuse(actor *, int strength); - bool drain_exp(actor *, bool quiet = false, int pow = 3); - bool rot(actor *, int amount, int immediate = 0, bool quiet = false); - int hurt(const actor *attacker, int amount, - beam_type flavour = BEAM_MISSILE, - bool cleanup_dead = true); - void heal(int amount, bool max_too = false); - void blink(bool allow_partial_control = true); - void teleport(bool right_now = false, bool abyss_shift = false); - - void put_to_sleep(int power = 0); - void check_awaken(int disturbance); - - int stat_hp() const { return hit_points; } - int stat_maxhp() const { return max_hit_points; } - - int shield_bonus() const; - int shield_block_penalty() const; - void shield_block_succeeded(); - int shield_bypass_ability(int tohit) const; - - actor_type atype() const { return ACT_MONSTER; } - - // Hacks, with a capital H. - void fix_speed(); - void check_speed(); - void upgrade_type(monster_type after, bool adjust_hd, bool adjust_hp); - - std::string describe_enchantments() const; - - int action_energy(energy_use_type et) const; - - bool do_shaft(); - bool has_spell_of_type(unsigned) const; - -private: - void init_with(const monsters &mons); - void swap_slots(mon_inv_type a, mon_inv_type b); - bool need_message(int &near) const; - bool level_up(); - bool level_up_change(); - bool pickup(item_def &item, int slot, int near, bool force_merge = false); - void equip_weapon(item_def &item, int near, bool msg = true); - void equip_armour(item_def &item, int near); - void unequip_weapon(item_def &item, int near, bool msg = true); - void unequip_armour(item_def &item, int near); - - bool decay_enchantment(const mon_enchant &me, bool decay_degree = true); - - bool drop_item(int eslot, int near); - bool wants_weapon(const item_def &item) const; - bool wants_armour(const item_def &item) const; - void lose_pickup_energy(); - bool check_set_valid_home(const coord_def &place, - coord_def &chosen, - int &nvalid) const; -}; - -struct cloud_struct -{ - coord_def pos; - cloud_type type; - int decay; - unsigned char spread_rate; - kill_category whose; - killer_type killer; - - cloud_struct() : pos(), type(CLOUD_NONE), decay(0), spread_rate(0), - whose(KC_OTHER), killer(KILL_NONE) - { - } - - void set_whose(kill_category _whose); - void set_killer(killer_type _killer); - - static kill_category killer_to_whose(killer_type killer); - static killer_type whose_to_killer(kill_category whose); - -}; - -struct shop_struct -{ - coord_def pos; - unsigned char greed; - shop_type type; - unsigned char level; - - FixedVector<unsigned char, 3> keeper_name; -}; +class actor; +class monsters; struct trap_def { @@ -1686,82 +657,6 @@ private: dgn_marker_map markers; }; -typedef FixedArray<dungeon_feature_type, GXM, GYM> feature_grid; -typedef FixedArray<unsigned, ENV_SHOW_DIAMETER, ENV_SHOW_DIAMETER> - env_show_grid; -class crawl_exit_hook; - -struct crawl_environment -{ -public: - unsigned char rock_colour; - unsigned char floor_colour; - - FixedVector< item_def, MAX_ITEMS > item; // item list - FixedVector< monsters, MAX_MONSTERS > mons; // monster list - - feature_grid grid; // terrain grid - FixedArray< unsigned short, GXM, GYM > mgrid; // monster grid - FixedArray< int, GXM, GYM > igrid; // item grid - FixedArray< unsigned short, GXM, GYM > cgrid; // cloud grid - FixedArray< unsigned short, GXM, GYM > grid_colours; // colour overrides - - FixedArray< map_cell, GXM, GYM > map; // discovered terrain - - // Glyphs of squares that are in LOS. - env_show_grid show; - - // What would be visible, if all of the translucent wall were - // made opaque. - env_show_grid no_trans_show; - - FixedArray<unsigned short, ENV_SHOW_DIAMETER, ENV_SHOW_DIAMETER> - show_col; // view window colour - -#ifdef USE_TILE - // indexed by grid coords - FixedArray<tile_fg_store, GXM, GYM> tile_bk_fg; - FixedArray<unsigned int, GXM, GYM> tile_bk_bg; - FixedArray<tile_flavour, GXM, GYM> tile_flv; - // indexed by (show-1) coords - FixedArray<unsigned int, ENV_SHOW_DIAMETER, ENV_SHOW_DIAMETER> tile_fg; - FixedArray<unsigned int, ENV_SHOW_DIAMETER, ENV_SHOW_DIAMETER> tile_bg; - tile_flavour tile_default; -#endif - - FixedVector< cloud_struct, MAX_CLOUDS > cloud; // cloud list - unsigned char cloud_no; - - FixedVector< shop_struct, MAX_SHOPS > shop; // shop list - FixedVector< trap_def, MAX_TRAPS > trap; // trap list - - FixedVector< monster_type, 20 > mons_alloc; - map_markers markers; - - // Place to associate arbitrary data with a particular level. - // Sort of like player::attribute - CrawlHashTable properties; - - // Rate at which random monsters spawn, with lower numbers making - // them spawn more often (5 or less causes one to spawn about every - // 5 turns). Set to 0 to stop random generation. - int spawn_random_rate; - - double elapsed_time; // used during level load - - // Number of turns the player has spent on this level. - int turns_on_level; - - // Flags for things like preventing teleport control; see - // level_flag_type in enum.h - unsigned long level_flags; - - coord_def sanctuary_pos; - int sanctuary_time; -}; - -extern struct crawl_environment env; - struct message_filter { int channel; // Use -1 to match any channel. |