Add two new Ru sacrifices: resistance and eye
[crawl.git] / crawl-ref / source / player.h
1 /**
2  * @file
3  * @brief Player related functions.
4 **/
5
6
7 #ifndef PLAYER_H
8 #define PLAYER_H
9
10 #include <list>
11 #include <vector>
12
13 #include "actor.h"
14 #include "beam.h"
15 #include "bitary.h"
16 #include "place-info.h"
17 #include "quiver.h"
18 #include "religion-enum.h"
19 #include "species.h"
20 #ifdef USE_TILE
21 #include "tiledoll.h"
22 #endif
23
24 #define CONDENSATION_SHIELD_KEY "condensation_shield_pow"
25 #define ICY_ARMOUR_KEY "ozocubu's_armour_pow"
26 #define STONESKIN_KEY "stoneskin_pow"
27 #define TRANSFORM_POW_KEY "transform_pow"
28 #define BARBS_MOVE_KEY "moved_with_barbs_status"
29 #define HORROR_PENALTY_KEY "horror_penalty"
30
31
32 // display/messaging breakpoints for penalties from Ru's MUT_HORROR
33 #define HORROR_LVL_EXTREME  3
34 #define HORROR_LVL_OVERWHELMING  5
35
36 /// The standard unit of regen; one level in artifact inscriptions
37 static const int REGEN_PIP = 40;
38 /// The standard unit of MR; one level in %/@ screens
39 static const int MR_PIP = 40;
40 /// The standard unit of stealth; one level in %/@ screens
41 static const int STEALTH_PIP = 50;
42
43 /// The rough number of aut getting hit takes off your bone armour
44 static const int BONE_ARMOUR_HIT_RATIO = 50;
45
46 /// The minimum aut cost for a player move (before haste)
47 static const int FASTEST_PLAYER_MOVE_SPEED = 6;
48 // relevant for swiftness, etc
49
50 class targetter;
51
52 int check_stealth();
53
54 // needed for assert in is_player()
55 #ifdef DEBUG_GLOBALS
56 #define you (*real_you)
57 #endif
58 extern player you;
59
60 typedef FixedVector<int, NUM_DURATIONS> durations_t;
61 class player : public actor
62 {
63 public:
64   // ---------------
65   // Character save chunk data:
66   // None of this is really necessary, except for some complicated
67   // hacks with player_save_info. Should only be used in tags.cc or
68   // player_save_info::operator=(player).
69   // ---------------
70   string chr_species_name;
71   string chr_class_name;
72   string chr_god_name;
73
74   // ---------------
75   // Permanent data:
76   // ---------------
77   string your_name;
78   species_type species;
79   job_type char_class;
80
81   // This field is here even in non-WIZARD compiles, since the
82   // player might have been playing previously under wiz mode.
83   bool          wizard;            // true if player has entered wiz mode.
84   bool          explore;           // true if player has entered explore mode.
85   time_t        birth_time;        // start time of game
86
87
88   // ----------------
89   // Long-term state:
90   // ----------------
91   int elapsed_time;        // total amount of elapsed time in the game
92   int elapsed_time_at_last_input; // used for elapsed_time delta display
93
94   int hp;
95   int hp_max;
96   int hp_max_adj_temp;        // temporary max HP loss (rotting)
97   int hp_max_adj_perm;        // base HPs from background (and permanent loss)
98
99   int magic_points;
100   int max_magic_points;
101   int mp_max_adj;             // max MP loss (ability costs, tutorial bonus)
102
103   FixedVector<int8_t, NUM_STATS> stat_loss;
104   FixedVector<int8_t, NUM_STATS> base_stats;
105
106   int hunger;
107   int disease;
108   hunger_state_t hunger_state;
109   uint8_t max_level;
110   int hit_points_regeneration;
111   int magic_points_regeneration;
112   unsigned int experience;
113   unsigned int total_experience; // Unaffected by draining. Used for skill cost.
114   int experience_level;
115   int gold;
116   int zigs_completed, zig_max;
117
118   FixedVector<int8_t, NUM_EQUIP> equip;
119   FixedBitVector<NUM_EQUIP> melded;
120   // Whether these are unrands that we should run the _*_world_reacts func for
121   FixedBitVector<NUM_EQUIP> unrand_reacts;
122
123   FixedArray<int, NUM_OBJECT_CLASSES, MAX_SUBTYPES> force_autopickup;
124
125   // PC's symbol (usually @) and colour.
126   monster_type symbol;
127   transformation_type form;
128
129   FixedVector< item_def, ENDOFPACK > inv;
130   FixedBitVector<NUM_RUNE_TYPES> runes;
131   int obtainable_runes; // can be != 15 in Sprint
132
133   FixedVector<spell_type, MAX_KNOWN_SPELLS> spells;
134   set<spell_type> old_vehumet_gifts, vehumet_gifts;
135
136   uint8_t spell_no;
137   game_direction_type char_direction;
138   bool royal_jelly_dead;
139   bool transform_uncancellable;
140   bool fishtail; // Merfolk fishtail transformation
141
142   unsigned short pet_target;
143
144   durations_t duration;
145   int rotting;
146   bool apply_berserk_penalty;         // Whether to apply the berserk penalty at
147                                       // end of the turn.
148   int berserk_penalty;                // The penalty for moving while berserk
149
150   FixedVector<int, NUM_ATTRIBUTES> attribute;
151   FixedVector<uint8_t, NUM_AMMO> quiver; // default items for quiver
152   FixedVector<int, NUM_TIMERS> last_timer_effect;
153   FixedVector<int, NUM_TIMERS> next_timer_effect;
154
155   bool dead; // ... but pending revival
156   int lives;
157   int deaths;
158 #if TAG_MAJOR_VERSION == 34
159   float temperature; // For lava orcs.
160   float temperature_last;
161 #endif
162
163   FixedVector<uint8_t, NUM_SKILLS> skills; ///< skill level
164   FixedVector<int8_t, NUM_SKILLS>  train;  ///< 0: disabled, 1: normal, 2: focus
165   FixedVector<int8_t, NUM_SKILLS>  train_alt;      ///< config of the other mode
166   FixedVector<unsigned int, NUM_SKILLS>  training; ///< percentage of XP used
167   FixedBitVector<NUM_SKILLS> can_train; ///< Is training this skill allowed?
168   FixedVector<unsigned int, NUM_SKILLS> skill_points;
169   FixedVector<unsigned int, NUM_SKILLS> ct_skill_points;///<track skill points
170                                                     ///<gained by crosstraining
171   FixedVector<uint8_t, NUM_SKILLS>  skill_order;
172
173   bool auto_training;
174   list<skill_type> exercises;     ///< recent practise events
175   list<skill_type> exercises_all; ///< also include events for disabled skills
176   set<skill_type> stop_train;     ///< need to check if we can still train
177   set<skill_type> start_train;    ///< we can resume training
178
179   // Skill menu states
180   skill_menu_state skill_menu_do;
181   skill_menu_state skill_menu_view;
182
183   //Ashenzari transfer knowledge
184   skill_type    transfer_from_skill;
185   skill_type    transfer_to_skill;
186   unsigned int  transfer_skill_points;
187   unsigned int  transfer_total_skill_points;
188
189   int  skill_cost_level;
190   int  exp_available;
191   int  zot_points; // ZotDef currency
192
193   FixedVector<int, NUM_GODS> exp_docked;
194   FixedVector<int, NUM_GODS> exp_docked_total; // XP-based wrath
195
196   FixedArray<uint32_t, 6, MAX_SUBTYPES> item_description;
197   FixedVector<unique_item_status_type, MAX_UNRANDARTS> unique_items;
198   FixedBitVector<NUM_MONSTERS> unique_creatures;
199
200   // NOTE: The kills member is a pointer to a KillMaster object,
201   // rather than the object itself, so that we can get away with
202   // just a forward declare of the KillMaster class, rather than
203   // having to #include kills.h and thus make every single .cc file
204   // dependent on kills.h. Having a pointer means that we have
205   // to do our own implementations of copying the player object,
206   // since the default implementations will lead to the kills member
207   // pointing to freed memory, or worse yet lead to the same piece of
208   // memory being freed twice.
209   KillMaster* kills;
210
211   branch_type where_are_you;
212   int depth;
213
214   FixedVector<uint8_t, 30> branch_stairs;
215
216   god_type religion;
217   string jiyva_second_name;       // Random second name of Jiyva
218   uint8_t piety;
219   uint8_t piety_hysteresis;       // amount of stored-up docking
220   uint8_t gift_timeout;
221   FixedVector<uint8_t, NUM_GODS>  penance;
222   FixedVector<uint8_t, NUM_GODS>  worshipped;
223   FixedVector<short,   NUM_GODS>  num_current_gifts;
224   FixedVector<short,   NUM_GODS>  num_total_gifts;
225   FixedBitVector<      NUM_GODS>  one_time_ability_used;
226   FixedVector<uint8_t, NUM_GODS>  piety_max;
227
228   FixedVector<uint8_t, NUM_MUTATIONS> mutation;
229   FixedVector<uint8_t, NUM_MUTATIONS> innate_mutation;
230   FixedVector<uint8_t, NUM_MUTATIONS> temp_mutation;
231   FixedVector<uint8_t, NUM_MUTATIONS> sacrifices;
232
233   struct demon_trait
234   {
235       int           level_gained;
236       mutation_type mutation;
237   };
238
239   vector<demon_trait> demonic_traits;
240
241   int magic_contamination;
242
243   FixedBitVector<NUM_FIXED_BOOKS> had_book;
244   FixedBitVector<NUM_SPELLS>      seen_spell;
245   FixedVector<uint32_t, NUM_WEAPONS> seen_weapon;
246   FixedVector<uint32_t, NUM_ARMOURS> seen_armour;
247   FixedBitVector<NUM_MISCELLANY>     seen_misc;
248   uint8_t                            octopus_king_rings;
249
250   uint8_t normal_vision;        // how far the species gets to see
251   uint8_t current_vision;       // current sight radius (cells)
252
253   int           real_time;            // real time played (in seconds)
254   int           num_turns;            // number of turns taken
255   int           exploration;          // levels explored (16.16 bit real number)
256
257   int           last_view_update;     // what turn was the view last updated?
258
259   // Warning: these two are quite different.
260   //
261   // The spell table is an index to a specific spell slot (you.spells).
262   // The ability table lists the ability (ABIL_*) which prefers that letter.
263   //
264   // In other words, the spell table contains hard links and the ability
265   // table contains soft links.
266   FixedVector<int, 52>           spell_letter_table;   // ref to spell by slot
267   FixedVector<ability_type, 52>  ability_letter_table; // ref to abil by enum
268
269   // Maps without allow_dup that have been already used.
270   set<string> uniq_map_tags;
271   set<string> uniq_map_names;
272   // All maps, by level.
273   map<level_id, vector<string> > vault_list;
274
275   PlaceInfo global_info;
276   player_quiver* m_quiver;
277
278   // monsters mesmerising player; should be protected, but needs to be saved
279   // and restored.
280   vector<mid_t> beholders;
281
282   // monsters causing fear to the player; see above
283   vector<mid_t> fearmongers;
284
285   // Delayed level actions. This array is never trimmed, as usually D:1 won't
286   // be loaded again until the very end.
287   vector<daction_type> dactions;
288
289   // Path back from portal levels.
290   vector<level_pos> level_stack;
291
292   // The player's knowledge about item types.
293   id_arr type_ids;
294   // Additional information, about tried unidentified items.
295   // (e.g. name of item, for scrolls of RC, ID, EA)
296   CrawlHashTable type_id_props;
297
298   // The version the save was last played with.
299   string prev_save_version;
300
301   // The type of a zotdef wave, if any.
302   string zotdef_wave_name;
303   // The biggest assigned monster id so far.
304   mid_t last_mid;
305
306   // Count of various types of actions made.
307   map<pair<caction_type, int>, FixedVector<int, 27> > action_count;
308
309   // Which branches have been noted to have been left during this game.
310   FixedBitVector<NUM_BRANCHES> branches_left;
311
312   // For now, only control the speed of abyss morphing.
313   int abyss_speed;
314
315   // Prompts or actions the player must answer before continuing.
316   // A stack -- back() is the first to go.
317   vector<pair<uncancellable_type, int> > uncancel;
318
319   // A list of allies awaiting an active recall
320   vector<mid_t> recall_list;
321
322   // Hash seeds for deterministic stuff.
323   FixedVector<uint32_t, NUM_SEEDS> game_seeds;
324
325   // -------------------
326   // Non-saved UI state:
327   // -------------------
328   unsigned short prev_targ;
329   coord_def      prev_grd_targ;
330   coord_def      prev_move;
331
332   // Coordinates of last travel target; note that this is never used by
333   // travel itself, only by the level-map to remember the last travel target.
334   short travel_x, travel_y;
335   level_id travel_z;
336
337   runrest running;                    // Nonzero if running/traveling.
338   bool travel_ally_pace;
339
340   bool received_weapon_warning;
341   bool received_noskill_warning;
342   bool wizmode_teleported_into_rock;
343
344   delay_queue_type delay_queue;       // pending actions
345
346   time_t last_keypress_time;
347   bool xray_vision;
348   int8_t bondage_level;  // how much an Ash worshipper is into bondage
349   int8_t bondage[NUM_ET];
350   map<skill_type, int8_t> skill_boost; // Skill bonuses.
351   bool digging;
352
353   // The last spell cast by the player.
354   spell_type last_cast_spell;
355   map<int,int> last_pickup;
356
357
358   // ---------------------------
359   // Volatile (same-turn) state:
360   // ---------------------------
361   bool turn_is_over; // flag signaling that player has performed a timed action
362
363   // If true, player is headed to the Abyss.
364   bool banished;
365   string banished_by;
366
367   bool wield_change;          // redraw weapon
368   bool redraw_quiver;         // redraw quiver
369   uint64_t redraw_status_flags;
370
371   bool redraw_title;
372   bool redraw_hit_points;
373   bool redraw_magic_points;
374 #if TAG_MAJOR_VERSION == 34
375   bool redraw_temperature;
376 #endif
377   FixedVector<bool, NUM_STATS> redraw_stats;
378   bool redraw_experience;
379   bool redraw_armour_class;
380   bool redraw_evasion;
381
382   colour_t flash_colour;
383   targetter *flash_where;
384
385   int time_taken;
386
387   int old_hunger;            // used for hunger delta-meter (see output.cc)
388
389   // Set when the character is going to a new level, to guard against levgen
390   // failures
391   dungeon_feature_type transit_stair;
392   bool entering_level;
393
394   int    escaped_death_cause;
395   string escaped_death_aux;
396
397   int turn_damage;   // cumulative damage per turn
398   mid_t damage_source; // death source of last damage done to player
399   int source_damage; // cumulative damage for you.damage_source
400
401   // When other levels are loaded (e.g. viewing), is the player on this level?
402   bool on_current_level;
403
404   // View code clears and needs new data in places where we can't announce the
405   // portal right away; delay the announcements then.
406   int seen_portals;
407   // Same with invisible monsters, for ring auto-id.
408   bool seen_invis;
409
410   // Number of viewport refreshes.
411   unsigned int frame_no;
412
413
414   // ---------------------
415   // The save file itself.
416   // ---------------------
417   package *save;
418
419 protected:
420     FixedVector<PlaceInfo, NUM_BRANCHES> branch_info;
421
422 public:
423     player();
424     player(const player &other);
425     ~player();
426
427     void copy_from(const player &other);
428
429     void init();
430     void init_skills();
431
432     // Set player position without updating view geometry.
433     void set_position(const coord_def &c);
434     // Low-level move the player. Use this instead of changing pos directly.
435     void moveto(const coord_def &c, bool clear_net = true);
436     bool move_to_pos(const coord_def &c, bool clear_net = true,
437                      bool /*force*/ = false);
438     // Move the player during an abyss shift.
439     void shiftto(const coord_def &c);
440     bool blink_to(const coord_def& c, bool quiet = false);
441
442     void reset_prev_move();
443
444     int stat(stat_type stat, bool nonneg = true) const;
445     int strength(bool nonneg = true) const;
446     int intel(bool nonneg = true) const;
447     int dex(bool nonneg = true) const;
448     int max_stat(stat_type stat, bool base = false) const;
449     int max_strength() const;
450     int max_intel() const;
451     int max_dex() const;
452
453     bool in_water() const;
454     bool in_lava() const;
455     bool in_liquid() const;
456     bool can_swim(bool permanently = false) const;
457     int visible_igrd(const coord_def&) const;
458     bool can_cling_to_walls() const;
459     bool is_banished() const;
460     bool is_web_immune() const;
461     bool cannot_speak() const;
462     bool invisible() const;
463     bool can_see_invisible() const;
464     bool can_see_invisible(bool unid, bool items = true) const;
465     bool visible_to(const actor *looker) const;
466     bool can_see(const actor* a) const;
467     undead_state_type undead_state(bool temp = true) const;
468     bool nightvision() const;
469     reach_type reach_range() const;
470     bool see_cell(const coord_def& p) const;
471
472     // Is c in view but behind a transparent wall?
473     bool trans_wall_blocking(const coord_def &c) const;
474
475     bool is_icy() const;
476     bool is_fiery() const;
477     bool is_skeletal() const;
478
479     bool tengu_flight() const;
480     int heads() const;
481
482     int spell_hp_cost() const;
483     bool spellcasting_unholy() const;
484
485     // Dealing with beholders. Implemented in behold.cc.
486     void add_beholder(const monster* mon, bool axe = false);
487     bool beheld() const;
488     bool beheld_by(const monster* mon) const;
489     monster* get_beholder(const coord_def &pos) const;
490     monster* get_any_beholder() const;
491     void remove_beholder(const monster* mon);
492     void clear_beholders();
493     void beholders_check_noise(int loudness, bool axe = false);
494     void update_beholders();
495     void update_beholder(const monster* mon);
496     bool possible_beholder(const monster* mon) const;
497
498     // Dealing with fearmongers. Implemented in fearmonger.cc.
499     bool add_fearmonger(const monster* mon);
500     bool afraid() const;
501     bool afraid_of(const monster* mon) const;
502     monster* get_fearmonger(const coord_def &pos) const;
503     monster* get_any_fearmonger() const;
504     void remove_fearmonger(const monster* mon);
505     void clear_fearmongers();
506     void fearmongers_check_noise(int loudness, bool axe = false);
507     void update_fearmongers();
508     void update_fearmonger(const monster* mon);
509
510     bool made_nervous_by(const coord_def &pos);
511
512     kill_category kill_alignment() const;
513
514     bool has_spell(spell_type spell) const;
515
516     string shout_verb(bool directed = false) const;
517     int shout_volume() const;
518
519     item_def *slot_item(equipment_type eq, bool include_melded=false) const;
520
521     int base_ac_from(const item_def &armour, int scale = 1) const;
522     void maybe_degrade_bone_armour(int mult);
523
524     int inaccuracy() const;
525
526     // actor
527     int mindex() const;
528     int get_hit_dice() const;
529     int get_experience_level() const;
530     int get_max_xl() const;
531     bool is_player() const
532     {
533 #ifndef DEBUG_GLOBALS
534         ASSERT(this == (actor*)&you); // there can be only one
535 #endif
536         return true;
537     }
538     monster* as_monster() { return nullptr; }
539     player* as_player() { return this; }
540     const monster* as_monster() const { return nullptr; }
541     const player* as_player() const { return this; }
542
543     god_type  deity() const;
544     bool      alive() const;
545     bool      is_summoned(int* duration = nullptr,
546                           int* summon_type = nullptr) const;
547     bool      is_perm_summoned() const { return false; };
548
549     bool        swimming() const;
550     bool        submerged() const;
551     bool        floundering() const;
552     bool        extra_balanced() const;
553     bool        shove(const char* feat_name = "");
554     bool        can_pass_through_feat(dungeon_feature_type grid) const;
555     bool        is_habitable_feat(dungeon_feature_type actual_grid) const;
556     size_type   body_size(size_part_type psize = PSIZE_TORSO, bool base = false) const;
557     brand_type  damage_brand(int which_attack = -1);
558     int         damage_type(int which_attack = -1);
559     random_var  attack_delay(const item_def *weapon, const
560                              item_def *projectile = nullptr,
561                              bool random = true, bool scaled = true,
562                              bool do_shield = true) const;
563     int         constriction_damage() const;
564
565     int       has_claws(bool allow_tran = true) const;
566     bool      has_usable_claws(bool allow_tran = true) const;
567     int       has_talons(bool allow_tran = true) const;
568     bool      has_usable_talons(bool allow_tran = true) const;
569     int       has_hooves(bool allow_tran = true) const;
570     bool      has_usable_hooves(bool allow_tran = true) const;
571     int       has_fangs(bool allow_tran = true) const;
572     int       has_usable_fangs(bool allow_tran = true) const;
573     int       has_tail(bool allow_tran = true) const;
574     int       has_usable_tail(bool allow_tran = true) const;
575     bool      has_usable_offhand() const;
576     int       has_pseudopods(bool allow_tran = true) const;
577     int       has_usable_pseudopods(bool allow_tran = true) const;
578     int       has_tentacles(bool allow_tran = true) const;
579     int       has_usable_tentacles(bool allow_tran = true) const;
580
581     int wearing(equipment_type slot, int sub_type, bool calc_unid = true) const;
582     int wearing_ego(equipment_type slot, int type, bool calc_unid = true) const;
583     int scan_artefacts(artefact_prop_type which_property,
584                        bool calc_unid = true,
585                        vector<item_def> *matches = nullptr) const;
586
587     item_def *weapon(int which_attack = -1) const;
588     item_def *shield() const;
589
590     hands_reqd_type hands_reqd(const item_def &item) const;
591
592     bool      can_wield(const item_def &item,
593                         bool ignore_curse = false,
594                         bool ignore_brand = false,
595                         bool ignore_shield = false,
596                         bool ignore_transform = false) const;
597     bool      could_wield(const item_def &item,
598                           bool ignore_brand = false,
599                           bool ignore_transform = false,
600                           bool quiet = true) const;
601
602     string name(description_level_type type, bool force_visible = false,
603                 bool force_article = false) const;
604     string pronoun(pronoun_type pro, bool force_visible = false) const;
605     string conj_verb(const string &verb) const;
606     string hand_name(bool plural, bool *can_plural = nullptr) const;
607     string hands_verb(const string &plural_verb) const;
608     string hands_act(const string &plural_verb, const string &object) const;
609     string foot_name(bool plural, bool *can_plural = nullptr) const;
610     string arm_name(bool plural, bool *can_plural = nullptr) const;
611     string unarmed_attack_name() const;
612
613     bool fumbles_attack();
614     bool cannot_fight() const;
615     bool fights_well_unarmed(int heavy_armour_penalty);
616
617     void attacking(actor *other, bool ranged = false);
618     bool can_go_berserk() const;
619     bool can_go_berserk(bool intentional, bool potion = false,
620                         bool quiet = false) const;
621     bool go_berserk(bool intentional, bool potion = false);
622     bool berserk() const;
623     bool can_mutate() const;
624     bool can_safely_mutate(bool temp = true) const;
625     bool is_lifeless_undead(bool temp = true) const;
626     bool can_polymorph() const;
627     bool can_bleed(bool allow_tran = true) const;
628     bool is_stationary() const;
629     bool malmutate(const string &reason);
630     bool polymorph(int pow);
631     void backlight();
632     void banish(actor* /*agent*/, const string &who = "");
633     void blink(bool allow_partial_control = true);
634     void teleport(bool right_now = false,
635                   bool wizard_tele = false);
636     void drain_stat(stat_type stat, int amount);
637
638     void expose_to_element(beam_type element, int strength = 0,
639                            bool slow_cold_blood = true);
640     void god_conduct(conduct_type thing_done, int level);
641
642     void make_hungry(int nutrition, bool silent = true);
643     bool poison(actor *agent, int amount = 1, bool force = false);
644     bool sicken(int amount);
645     void paralyse(actor *, int str, string source = "");
646     void petrify(actor *, bool force = false);
647     bool fully_petrify(actor *foe, bool quiet = false);
648     void slow_down(actor *, int str);
649     void confuse(actor *, int strength);
650     void weaken(actor *attacker, int pow);
651     bool heal(int amount, bool max_too = false);
652     bool drain_exp(actor *, bool quiet = false, int pow = 3);
653     bool rot(actor *, int amount, bool quiet = false);
654     void splash_with_acid(const actor* evildoer, int acid_strength,
655                           bool allow_corrosion = true,
656                           const char* hurt_msg = nullptr);
657     void corrode_equipment(const char* corrosion_source = "the acid",
658                            int degree = 1);
659     void sentinel_mark(bool trap = false);
660     int hurt(const actor *attacker, int amount,
661              beam_type flavour = BEAM_MISSILE,
662              kill_method_type kill_type = KILLED_BY_MONSTER,
663              string source = "",
664              string aux = "",
665              bool cleanup_dead = true,
666              bool attacker_effects = true);
667
668     bool wont_attack() const { return true; };
669     mon_attitude_type temp_attitude() const { return ATT_FRIENDLY; };
670
671     monster_type mons_species(bool zombie_base = false) const;
672
673     mon_holy_type holiness(bool temp = true) const;
674     bool undead_or_demonic() const;
675     bool holy_wrath_susceptible() const;
676     bool is_holy(bool spells = true) const;
677     bool is_unholy(bool spells = true) const;
678     bool is_evil(bool spells = true) const;
679     int how_chaotic(bool check_spells_god) const;
680     bool is_artificial(bool temp = true) const;
681     bool is_unbreathing() const;
682     bool is_insubstantial() const;
683     int res_acid(bool calc_unid = true) const;
684     bool res_hellfire() const { return false; };
685     int res_fire() const;
686     int res_steam() const;
687     int res_cold() const;
688     int res_elec() const;
689     int res_poison(bool temp = true) const;
690     int res_rotting(bool temp = true) const;
691     int res_water_drowning() const;
692     bool res_sticky_flame() const;
693     int res_holy_energy(const actor *) const;
694     int res_negative_energy(bool intrinsic_only = false) const;
695     bool res_torment() const;
696     bool res_wind() const;
697     bool res_petrify(bool temp = true) const;
698     int res_constrict() const;
699     int res_magic() const;
700     bool no_tele(bool calc_unid = true, bool /*permit_id*/ = true,
701                  bool blink = false) const;
702     string no_tele_reason(bool calc_unid = true, bool blink = false) const;
703     bool no_tele_print_reason(bool calc_unid = true, bool blink = false) const;
704     bool antimagic_susceptible() const;
705
706     bool gourmand(bool calc_unid = true, bool items = true) const;
707     bool res_corr(bool calc_unid = true, bool items = true) const;
708     bool clarity(bool calc_unid = true, bool items = true) const;
709     bool stasis(bool calc_unid = true, bool items = true) const;
710
711     bool airborne() const;
712     bool cancellable_flight() const;
713     bool permanent_flight() const;
714     bool racial_permanent_flight() const;
715
716     bool paralysed() const;
717     bool cannot_move() const;
718     bool cannot_act() const;
719     bool confused() const;
720     bool caught() const;
721     bool backlit(bool self_halo = true) const;
722     bool umbra() const;
723     int halo_radius2() const;
724     int silence_radius2() const;
725     int liquefying_radius2() const;
726     int umbra_radius2() const;
727 #if TAG_MAJOR_VERSION == 34
728     int heat_radius2() const;
729 #endif
730     bool glows_naturally() const;
731     bool petrifying() const;
732     bool petrified() const;
733     bool liquefied_ground() const;
734     bool incapacitated() const
735     {
736         return actor::incapacitated() || duration[DUR_CLUMSY];
737     }
738
739     bool asleep() const;
740     void put_to_sleep(actor *, int power = 0, bool hibernate = false);
741     void awake();
742     void check_awaken(int disturbance);
743     int beam_resists(bolt &beam, int hurted, bool doEffects, string source);
744
745     bool can_throw_large_rocks() const;
746     bool can_smell() const;
747
748     int racial_ac(bool temp) const;
749     int armour_class(bool /*calc_unid*/ = true) const;
750     int gdr_perc() const;
751     int evasion(ev_ignore_type evit = EV_IGNORE_NONE,
752                 const actor *attacker = nullptr) const;
753
754     int stat_hp() const     { return hp; }
755     int stat_maxhp() const  { return hp_max; }
756     int stealth() const     { return check_stealth(); }
757
758     bool shielded() const;
759     int shield_bonus() const;
760     int shield_block_penalty() const;
761     int shield_bypass_ability(int tohit) const;
762     void shield_block_succeeded(actor *foe);
763     int missile_deflection() const;
764     void ablate_deflection();
765
766     // Combat-related adjusted penalty calculation methods
767     int unadjusted_body_armour_penalty() const;
768     int adjusted_body_armour_penalty(int scale = 1) const;
769     int adjusted_shield_penalty(int scale = 1) const;
770     float get_shield_skill_to_offset_penalty(const item_def &item);
771     int armour_tohit_penalty(bool random_factor, int scale = 1) const;
772     int shield_tohit_penalty(bool random_factor, int scale = 1) const;
773
774     bool wearing_light_armour(bool with_skill = false) const;
775     int  skill(skill_type skill, int scale =1,
776                bool real = false, bool drained = true) const;
777
778     bool do_shaft();
779
780     bool can_do_shaft_ability(bool quiet = false) const;
781     bool do_shaft_ability();
782
783     bool can_device_heal();
784
785     void apply_location_effects(const coord_def &oldpos,
786                                 killer_type killer = KILL_NONE,
787                                 int killernum = -1);
788
789     ////////////////////////////////////////////////////////////////
790
791     PlaceInfo& get_place_info() const ; // Current place info
792     PlaceInfo& get_place_info(branch_type branch) const;
793     void clear_place_info();
794
795     void goto_place(const level_id &level);
796
797     void set_place_info(PlaceInfo info);
798     // Returns copies of the PlaceInfo; modifying the vector won't
799     // modify the player object.
800     vector<PlaceInfo> get_all_place_info(bool visited_only = false,
801                                          bool dungeon_only = false) const;
802
803     bool did_escape_death() const;
804     void reset_escaped_death();
805
806     void add_gold(int delta);
807     void del_gold(int delta);
808     void set_gold(int amount);
809
810     void increase_duration(duration_type dur, int turns, int cap = 0,
811                            const char* msg = nullptr);
812     void set_duration(duration_type dur, int turns, int cap = 0,
813                       const char *msg = nullptr);
814
815     bool attempt_escape(int attempts = 1);
816     int usable_tentacles() const;
817     bool has_usable_tentacle() const;
818
819     bool form_uses_xl() const;
820
821     bool clear_far_engulf();
822
823 protected:
824     void _removed_beholder(bool quiet = false);
825     bool _possible_beholder(const monster* mon) const;
826
827     void _removed_fearmonger(bool quiet = false);
828     bool _possible_fearmonger(const monster* mon) const;
829 };
830
831 struct player_save_info
832 {
833     string name;
834     unsigned int experience;
835     int experience_level;
836     bool wizard;
837     species_type species;
838     string species_name;
839     string class_name;
840     god_type religion;
841     string god_name;
842     string jiyva_second_name;
843     game_type saved_game_type;
844
845 #ifdef USE_TILE
846     dolls_data doll;
847 #endif
848
849     bool save_loadable;
850     string filename;
851
852     player_save_info& operator=(const player& rhs);
853     bool operator<(const player_save_info& rhs) const;
854     string short_desc() const;
855 };
856
857 class monster;
858 struct item_def;
859
860 // Helper. Use move_player_to_grid or player::apply_location_effects instead.
861 void moveto_location_effects(dungeon_feature_type old_feat,
862                              bool stepped=false, const coord_def& old_pos=coord_def());
863
864 bool check_moveto(const coord_def& p, const string &move_verb = "step",
865                   const string &msg = "");
866 bool check_moveto_terrain(const coord_def& p, const string &move_verb,
867                           const string &msg = "", bool *prompted = nullptr);
868 bool check_moveto_cloud(const coord_def& p, const string &move_verb = "step",
869                         bool *prompted = nullptr);
870 bool check_moveto_exclusion(const coord_def& p,
871                             const string &move_verb = "step",
872                             bool *prompted = nullptr);
873 bool check_moveto_trap(const coord_def& p, const string &move_verb = "step",
874         bool *prompted = nullptr);
875
876 bool swap_check(monster* mons, coord_def &loc, bool quiet = false);
877
878 void move_player_to_grid(const coord_def& p, bool stepped);
879
880 bool is_map_persistent();
881 bool player_in_connected_branch();
882 bool player_in_hell();
883 bool player_in_starting_abyss();
884
885 static inline bool player_in_branch(int branch)
886 {
887     return you.where_are_you == branch;
888 }
889
890 bool berserk_check_wielded_weapon();
891 bool player_equip_unrand(int unrand_index);
892 bool player_can_hit_monster(const monster* mon);
893 bool player_can_hear(const coord_def& p, int hear_distance = 999);
894
895 bool player_is_shapechanged();
896
897 bool is_effectively_light_armour(const item_def *item);
898 bool player_effectively_in_light_armour();
899
900 int player_energy();
901
902 int player_shield_racial_factor();
903 int player_armour_shield_spell_penalty();
904
905 int player_movement_speed();
906
907 int player_hunger_rate(bool temp = true);
908
909 int calc_hunger(int food_cost);
910
911 int player_icemail_armour_class();
912
913 bool player_stoneskin();
914
915 int player_wizardry(spell_type spell);
916
917 int player_prot_life(bool calc_unid = true, bool temp = true,
918                      bool items = true);
919
920 int player_regen();
921
922 int player_res_cold(bool calc_unid = true, bool temp = true,
923                     bool items = true);
924 int player_res_acid(bool calc_unid = true, bool items = true);
925
926 bool player_res_torment(bool random = true);
927 bool player_kiku_res_torment();
928
929 int player_likes_chunks(bool permanently = false);
930 bool player_likes_water(bool permanently = false);
931 bool player_likes_lava(bool permanently = false);
932
933 int player_mutation_level(mutation_type mut, bool temp = true);
934
935 int player_res_electricity(bool calc_unid = true, bool temp = true,
936                            bool items = true);
937
938 int player_res_fire(bool calc_unid = true, bool temp = true,
939                     bool items = true);
940 int player_res_sticky_flame(bool calc_unid = true, bool temp = true,
941                             bool items = true);
942 int player_res_steam(bool calc_unid = true, bool temp = true,
943                      bool items = true);
944
945 int player_res_poison(bool calc_unid = true, bool temp = true,
946                       bool items = true);
947 int player_res_magic(bool calc_unid = true, bool temp = true);
948
949 bool player_control_teleport(bool temp = true);
950
951 int player_shield_class();
952 int player_displayed_shield_class();
953
954 int player_spec_air();
955 int player_spec_cold();
956 int player_spec_conj();
957 int player_spec_death();
958 int player_spec_earth();
959 int player_spec_fire();
960 int player_spec_hex();
961 int player_spec_charm();
962 int player_spec_poison();
963 int player_spec_summ();
964
965 int player_speed();
966
967 int player_spell_levels();
968
969 bool player_sust_abil(bool calc_unid = true);
970
971 int player_teleport(bool calc_unid = true);
972
973 int player_monster_detect_radius();
974
975 int slaying_bonus(bool ranged = false);
976
977 unsigned int exp_needed(int lev, int exp_apt = -99);
978 bool will_gain_life(int lev);
979
980 int get_expiration_threshold(duration_type dur);
981 bool dur_expiring(duration_type dur);
982 void display_char_status();
983
984 void forget_map(bool rot = false);
985
986 int get_exp_progress();
987 void gain_exp(unsigned int exp_gained, unsigned int* actual_gain = nullptr);
988
989 bool player_can_open_doors();
990
991 void level_change(bool skip_attribute_increase = false);
992 void adjust_level(int diff, bool just_xp = false);
993
994 bool is_player_same_genus(const monster_type mon);
995 monster_type player_mons(bool transform = true);
996 void update_player_symbol();
997 void update_vision_range();
998
999 maybe_bool you_can_wear(equipment_type eq, bool temp = false);
1000 bool player_has_feet(bool temp = true);
1001
1002 bool enough_hp(int minimum, bool suppress_msg, bool abort_macros = true);
1003 bool enough_mp(int minimum, bool suppress_msg, bool abort_macros = true);
1004 bool enough_zp(int minimum, bool suppress_msg);
1005
1006 void calc_hp();
1007 void calc_mp();
1008
1009 void dec_hp(int hp_loss, bool fatal, const char *aux = nullptr);
1010 void dec_mp(int mp_loss, bool silent = false);
1011 void drain_mp(int mp_loss);
1012
1013 void inc_mp(int mp_gain, bool silent = false);
1014 void inc_hp(int hp_gain);
1015 void flush_mp();
1016
1017 void rot_hp(int hp_loss);
1018 // Unrot the player and return excess HP if any.
1019 int unrot_hp(int hp_recovered);
1020 int player_rotted();
1021 void rot_mp(int mp_loss);
1022
1023 void inc_max_hp(int hp_gain);
1024 void dec_max_hp(int hp_loss);
1025
1026 void deflate_hp(int new_level, bool floor);
1027 void set_hp(int new_amount);
1028
1029 int get_real_hp(bool trans, bool rotted = false);
1030 int get_real_mp(bool include_items);
1031
1032 int get_contamination_level();
1033 string describe_contamination(int level);
1034
1035 void set_mp(int new_amount);
1036
1037 void contaminate_player(int change, bool controlled = false, bool msg = true);
1038
1039 bool confuse_player(int amount, bool quiet = false);
1040
1041 bool poison_player(int amount, string source, string source_aux = "",
1042                    bool force = false);
1043 void paralyse_player(string source, int amount = 0);
1044 void handle_player_poison(int delay);
1045 void reduce_player_poison(int amount);
1046 int get_player_poisoning();
1047 bool poison_is_lethal();
1048 int poison_survival();
1049
1050 bool miasma_player(actor *who, string source_aux = "");
1051
1052 bool napalm_player(int amount, string source, string source_aux = "");
1053 void dec_napalm_player(int delay);
1054
1055 bool spell_slow_player(int pow);
1056 bool slow_player(int turns);
1057 void dec_slow_player(int delay);
1058 void dec_exhaust_player(int delay);
1059
1060 bool haste_player(int turns, bool rageext = false);
1061 void dec_haste_player(int delay);
1062 void dec_elixir_player(int delay);
1063 void dec_ambrosia_player(int delay);
1064 bool flight_allowed(bool quiet = false);
1065 void fly_player(int pow, bool already_flying = false);
1066 void float_player();
1067 bool land_player(bool quiet = false);
1068 void player_open_door(coord_def doorpos);
1069 void player_close_door(coord_def doorpos);
1070
1071 void dec_disease_player(int delay);
1072
1073 void handle_player_drowning(int delay);
1074
1075 // Determines if the given grid is dangerous for the player to enter.
1076 bool is_feat_dangerous(dungeon_feature_type feat, bool permanently = false,
1077                        bool ignore_flight = false);
1078
1079 int count_worn_ego(int which_ego);
1080 bool need_expiration_warning(duration_type dur, dungeon_feature_type feat);
1081 bool need_expiration_warning(dungeon_feature_type feat);
1082 bool need_expiration_warning(duration_type dur, coord_def p = you.pos());
1083 bool need_expiration_warning(coord_def p = you.pos());
1084
1085 void count_action(caction_type type, int subtype = 0);
1086 bool player_has_orb();
1087
1088 #if TAG_MAJOR_VERSION == 34
1089 enum temperature_level
1090 {
1091     TEMP_MIN = 1, // Minimum (and starting) temperature. Not any warmer than bare rock.
1092     TEMP_COLD = 3,
1093     TEMP_COOL = 5,
1094     TEMP_ROOM = 7,
1095     TEMP_WARM = 9, // Warmer than most creatures.
1096     TEMP_HOT = 11,
1097     TEMP_FIRE = 13, // Hot enough to ignite paper around you.
1098     TEMP_MAX = 15, // Maximum temperature. As hot as lava!
1099 };
1100
1101 enum temperature_effect
1102 {
1103     LORC_LAVA_BOOST,
1104     LORC_FIRE_BOOST,
1105     LORC_STONESKIN,
1106     LORC_COLD_VULN,
1107     LORC_PASSIVE_HEAT,
1108     LORC_HEAT_AURA,
1109     LORC_NO_SCROLLS,
1110     LORC_FIRE_RES_I,
1111     LORC_FIRE_RES_II,
1112     LORC_FIRE_RES_III,
1113 };
1114
1115 int temperature();
1116 int temperature_last();
1117 void temperature_check();
1118 void temperature_increment(float degree);
1119 void temperature_decrement(float degree);
1120 void temperature_changed(float change);
1121 void temperature_decay();
1122 bool temperature_tier(int which);
1123 bool temperature_effect(int which);
1124 int temperature_colour(int temp);
1125 string temperature_string(int temp);
1126 string temperature_text(int temp);
1127 #endif
1128
1129 #endif