From 36ac6df41458d10cf40fb837738b2f752bd05557 Mon Sep 17 00:00:00 2001 From: Robert Vollmert Date: Mon, 19 Oct 2009 16:12:04 +0200 Subject: Split actors and env from externs.h. --- crawl-ref/source/actor.h | 211 ++++++++ crawl-ref/source/dgnevent.h | 1 + crawl-ref/source/effects.h | 3 +- crawl-ref/source/env.h | 79 +++ crawl-ref/source/externs.h | 1183 ++---------------------------------------- crawl-ref/source/l_dgnlvl.cc | 1 + crawl-ref/source/los.cc | 1 + crawl-ref/source/los.h | 2 +- crawl-ref/source/mon-util.h | 2 + crawl-ref/source/monster.h | 390 ++++++++++++++ crawl-ref/source/mtransit.h | 1 + crawl-ref/source/place.cc | 3 +- crawl-ref/source/player.cc | 2 - crawl-ref/source/player.h | 448 +++++++++++++++- crawl-ref/source/religion.h | 3 +- crawl-ref/source/shopping.h | 4 +- crawl-ref/source/spl-mis.h | 1 + crawl-ref/source/stash.h | 1 + crawl-ref/source/state.h | 1 + crawl-ref/source/stuff.h | 3 +- 20 files changed, 1186 insertions(+), 1154 deletions(-) create mode 100644 crawl-ref/source/actor.h create mode 100644 crawl-ref/source/env.h create mode 100644 crawl-ref/source/monster.h (limited to 'crawl-ref/source') diff --git a/crawl-ref/source/actor.h b/crawl-ref/source/actor.h new file mode 100644 index 0000000000..a760742786 --- /dev/null +++ b/crawl-ref/source/actor.h @@ -0,0 +1,211 @@ +#ifndef ACTOR_H +#define ACTOR_H + +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(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; +}; + +#endif diff --git a/crawl-ref/source/dgnevent.h b/crawl-ref/source/dgnevent.h index c9eea419b1..6b37744583 100644 --- a/crawl-ref/source/dgnevent.h +++ b/crawl-ref/source/dgnevent.h @@ -8,6 +8,7 @@ #define __DGNEVENT_H__ #include "externs.h" +#include "player.h" #include // Keep event names in l_dgn.cc in sync. diff --git a/crawl-ref/source/effects.h b/crawl-ref/source/effects.h index 0cf479c84d..9cc9be9072 100644 --- a/crawl-ref/source/effects.h +++ b/crawl-ref/source/effects.h @@ -8,6 +8,7 @@ #ifndef EFFECTS_H #define EFFECTS_H +#include "env.h" #include "externs.h" struct bolt; @@ -64,7 +65,7 @@ int place_ring(std::vector & ring_points, int arc_occupancy, int & seen_count); -// Collect lists of points that are within LOS (under the given env map), +// Collect lists of points that are within LOS (under the given losgrid), // unoccupied, and not solid (walls/statues). void collect_radius_points(std::vector > &radius_points, coord_def & origin, env_show_grid & losgrid); diff --git a/crawl-ref/source/env.h b/crawl-ref/source/env.h new file mode 100644 index 0000000000..d4c70f74eb --- /dev/null +++ b/crawl-ref/source/env.h @@ -0,0 +1,79 @@ +#ifndef ENV_H +#define ENV_H + +#include "monster.h" + +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 + show_col; // view window colour + +#ifdef USE_TILE + // indexed by grid coords + FixedArray tile_bk_fg; + FixedArray tile_bk_bg; + FixedArray tile_flv; + // indexed by (show-1) coords + FixedArray tile_fg; + FixedArray 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; + +#endif 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 feature_grid; +typedef FixedArray + 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(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 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 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 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 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 duration; - - int rotting; - - int berserk_penalty; // penalty for moving while berserk - - FixedVector attribute; - FixedVector quiver; // default items for quiver - FixedVector sacrifice_value; - - undead_state_type is_undead; - - delay_queue_type delay_queue; // pending actions - - FixedVector skills; - FixedVector practise_skill; - FixedVector skill_points; - FixedVector 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 item_description; - FixedVector unique_items; - FixedVector 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 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 penance; - FixedVector worshipped; - FixedVector num_gifts; - - - FixedVector mutation; - FixedVector demon_pow; - unsigned char magic_contamination; - - FixedVector had_book; - FixedVector 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 spell_letter_table; // ref to spell by slot - FixedVector ability_letter_table; // ref to abil by enum - - std::set uniq_map_tags; - std::set uniq_map_names; - - PlaceInfo global_info; - player_quiver* m_quiver; - - int escaped_death_cause; - std::string escaped_death_aux; - -protected: - FixedVector branch_info; - FixedVector 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 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 { @@ -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 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 travel_path; - FixedVector 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; // 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 keeper_name; -}; +class actor; +class monsters; struct trap_def { @@ -1686,82 +657,6 @@ private: dgn_marker_map markers; }; -typedef FixedArray feature_grid; -typedef FixedArray - 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 - show_col; // view window colour - -#ifdef USE_TILE - // indexed by grid coords - FixedArray tile_bk_fg; - FixedArray tile_bk_bg; - FixedArray tile_flv; - // indexed by (show-1) coords - FixedArray tile_fg; - FixedArray 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. diff --git a/crawl-ref/source/l_dgnlvl.cc b/crawl-ref/source/l_dgnlvl.cc index c09a86023a..89250fd692 100644 --- a/crawl-ref/source/l_dgnlvl.cc +++ b/crawl-ref/source/l_dgnlvl.cc @@ -9,6 +9,7 @@ #include "l_libs.h" #include "branch.h" +#include "player.h" #define BRANCH(br, pos) \ const char *branch_name = luaL_checkstring(ls, pos); \ diff --git a/crawl-ref/source/los.cc b/crawl-ref/source/los.cc index 235eed5943..8213e825a4 100644 --- a/crawl-ref/source/los.cc +++ b/crawl-ref/source/los.cc @@ -52,6 +52,7 @@ #include "directn.h" #include "externs.h" #include "losparam.h" +#include "player.h" #include "ray.h" #include "state.h" #include "stuff.h" diff --git a/crawl-ref/source/los.h b/crawl-ref/source/los.h index a9e74a23ff..f7750e93e1 100644 --- a/crawl-ref/source/los.h +++ b/crawl-ref/source/los.h @@ -6,7 +6,7 @@ #ifndef LOS_H #define LOS_H -#include "externs.h" +#include "env.h" #include "losparam.h" #define EPSILON_VALUE 0.00001 diff --git a/crawl-ref/source/mon-util.h b/crawl-ref/source/mon-util.h index b10f48312c..afc4aace5a 100644 --- a/crawl-ref/source/mon-util.h +++ b/crawl-ref/source/mon-util.h @@ -10,6 +10,8 @@ #include "externs.h" #include "enum.h" +#include "player.h" +#include "monster.h" enum corpse_effect_type { diff --git a/crawl-ref/source/monster.h b/crawl-ref/source/monster.h new file mode 100644 index 0000000000..b942b2d91e --- /dev/null +++ b/crawl-ref/source/monster.h @@ -0,0 +1,390 @@ +#ifndef MONSTER_H +#define MONSTER_H + +#include "actor.h" + +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 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 travel_path; + FixedVector 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; // 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; +}; + +#endif diff --git a/crawl-ref/source/mtransit.h b/crawl-ref/source/mtransit.h index ef7a113553..0685db598c 100644 --- a/crawl-ref/source/mtransit.h +++ b/crawl-ref/source/mtransit.h @@ -7,6 +7,7 @@ #ifndef MTRANSIT_H #define MTRANSIT_H +#include "monster.h" #include "travel.h" #include #include diff --git a/crawl-ref/source/place.cc b/crawl-ref/source/place.cc index 0e64253394..9322716835 100644 --- a/crawl-ref/source/place.cc +++ b/crawl-ref/source/place.cc @@ -7,9 +7,10 @@ #include "AppHdr.h" #include "externs.h" -#include "place.h" #include "branch.h" +#include "place.h" +#include "player.h" #include "travel.h" // Do not attempt to use level_id if level_type != LEVEL_DUNGEON diff --git a/crawl-ref/source/player.cc b/crawl-ref/source/player.cc index fdd088790e..0db294e57e 100644 --- a/crawl-ref/source/player.cc +++ b/crawl-ref/source/player.cc @@ -20,8 +20,6 @@ #include #include -#include "externs.h" - #include "artefact.h" #include "branch.h" #include "cloud.h" diff --git a/crawl-ref/source/player.h b/crawl-ref/source/player.h index ae164cbef1..6aefbcb3b2 100644 --- a/crawl-ref/source/player.h +++ b/crawl-ref/source/player.h @@ -8,7 +8,7 @@ #ifndef PLAYER_H #define PLAYER_H -#include "externs.h" +#include "actor.h" #include "itemprop.h" #ifdef USE_TILE @@ -25,6 +25,452 @@ struct dolls_data }; #endif +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 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 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 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 duration; + + int rotting; + + int berserk_penalty; // penalty for moving while berserk + + FixedVector attribute; + FixedVector quiver; // default items for quiver + FixedVector sacrifice_value; + + undead_state_type is_undead; + + delay_queue_type delay_queue; // pending actions + + FixedVector skills; + FixedVector practise_skill; + FixedVector skill_points; + FixedVector 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 item_description; + FixedVector unique_items; + FixedVector 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 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 penance; + FixedVector worshipped; + FixedVector num_gifts; + + + FixedVector mutation; + FixedVector demon_pow; + unsigned char magic_contamination; + + FixedVector had_book; + FixedVector 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 spell_letter_table; // ref to spell by slot + FixedVector ability_letter_table; // ref to abil by enum + + std::set uniq_map_tags; + std::set uniq_map_names; + + PlaceInfo global_info; + player_quiver* m_quiver; + + int escaped_death_cause; + std::string escaped_death_aux; + +protected: + FixedVector branch_info; + FixedVector 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 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; + struct player_save_info { std::string name; diff --git a/crawl-ref/source/religion.h b/crawl-ref/source/religion.h index 971be5d3cd..9445a4fbe6 100644 --- a/crawl-ref/source/religion.h +++ b/crawl-ref/source/religion.h @@ -9,8 +9,9 @@ #define RELIGION_H #include "enum.h" -#include "ouch.h" #include "externs.h" +#include "ouch.h" +#include "player.h" #define MAX_PIETY 200 #define HALF_MAX_PIETY (MAX_PIETY / 2) diff --git a/crawl-ref/source/shopping.h b/crawl-ref/source/shopping.h index d577f67a13..0bbaae8457 100644 --- a/crawl-ref/source/shopping.h +++ b/crawl-ref/source/shopping.h @@ -11,11 +11,11 @@ #include "externs.h" #include "itemname.h" -int artefact_value( const item_def &item ); +int artefact_value(const item_def &item); // ident == true overrides the item ident level and gives the price // as if the item was fully id'd -unsigned int item_value( item_def item, bool ident = false ); +unsigned int item_value(item_def item, bool ident = false); void shop(); shop_struct *get_shop(const coord_def& where); diff --git a/crawl-ref/source/spl-mis.h b/crawl-ref/source/spl-mis.h index 43867f2540..d322db75a0 100644 --- a/crawl-ref/source/spl-mis.h +++ b/crawl-ref/source/spl-mis.h @@ -17,6 +17,7 @@ #include "enum.h" #include "beam.h" +#include "monster.h" #include "mpr.h" #include "spl-util.h" diff --git a/crawl-ref/source/stash.h b/crawl-ref/source/stash.h index 8a50b0d77f..e35ce2b591 100644 --- a/crawl-ref/source/stash.h +++ b/crawl-ref/source/stash.h @@ -16,6 +16,7 @@ #include "externs.h" #include "travel.h" +#include "player.h" class input_history; class reader; diff --git a/crawl-ref/source/state.h b/crawl-ref/source/state.h index e1d887f966..74376b3b24 100644 --- a/crawl-ref/source/state.h +++ b/crawl-ref/source/state.h @@ -8,6 +8,7 @@ #define STATE_H #include "enum.h" +#include "player.h" #include class monsters; diff --git a/crawl-ref/source/stuff.h b/crawl-ref/source/stuff.h index 0591c07688..67b9e1178e 100644 --- a/crawl-ref/source/stuff.h +++ b/crawl-ref/source/stuff.h @@ -8,7 +8,8 @@ #ifndef STUFF_H #define STUFF_H -#include "externs.h" +#include "env.h" +#include "player.h" #include std::string make_time_string(time_t abs_time, bool terse = false); -- cgit v1.2.3-54-g00ecf