summaryrefslogtreecommitdiffstats
path: root/crawl-ref
diff options
context:
space:
mode:
authorRobert Vollmert <rvollmert@gmx.net>2009-10-19 16:12:04 +0200
committerRobert Vollmert <rvollmert@gmx.net>2009-10-21 14:42:01 +0200
commit36ac6df41458d10cf40fb837738b2f752bd05557 (patch)
treeab64c9b2f954ea3426aeafc6dff5068999ca9cab /crawl-ref
parent83d597313c41858a8f7e65bb32534a785cf7ed55 (diff)
downloadcrawl-ref-36ac6df41458d10cf40fb837738b2f752bd05557.tar.gz
crawl-ref-36ac6df41458d10cf40fb837738b2f752bd05557.zip
Split actors and env from externs.h.
Diffstat (limited to 'crawl-ref')
-rw-r--r--crawl-ref/source/actor.h211
-rw-r--r--crawl-ref/source/dgnevent.h1
-rw-r--r--crawl-ref/source/effects.h3
-rw-r--r--crawl-ref/source/env.h79
-rw-r--r--crawl-ref/source/externs.h1183
-rw-r--r--crawl-ref/source/l_dgnlvl.cc1
-rw-r--r--crawl-ref/source/los.cc1
-rw-r--r--crawl-ref/source/los.h2
-rw-r--r--crawl-ref/source/mon-util.h2
-rw-r--r--crawl-ref/source/monster.h390
-rw-r--r--crawl-ref/source/mtransit.h1
-rw-r--r--crawl-ref/source/place.cc3
-rw-r--r--crawl-ref/source/player.cc2
-rw-r--r--crawl-ref/source/player.h448
-rw-r--r--crawl-ref/source/religion.h3
-rw-r--r--crawl-ref/source/shopping.h4
-rw-r--r--crawl-ref/source/spl-mis.h1
-rw-r--r--crawl-ref/source/stash.h1
-rw-r--r--crawl-ref/source/state.h1
-rw-r--r--crawl-ref/source/stuff.h3
20 files changed, 1186 insertions, 1154 deletions
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<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;
+};
+
+#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 <list>
// 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<coord_def> & 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<std::vector<coord_def> > &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<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;
+
+#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<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.
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<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;
+};
+
+#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 <map>
#include <list>
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 <sstream>
#include <algorithm>
-#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<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;
+
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 <vector>
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 <map>
std::string make_time_string(time_t abs_time, bool terse = false);