The Battle for Wesnoth  1.19.5+dev
unit.hpp
Go to the documentation of this file.
1 /*
2  Copyright (C) 2003 - 2024
3  by David White <dave@whitevine.net>
4  Part of the Battle for Wesnoth Project https://www.wesnoth.org/
5 
6  This program is free software; you can redistribute it and/or modify
7  it under the terms of the GNU General Public License as published by
8  the Free Software Foundation; either version 2 of the License, or
9  (at your option) any later version.
10  This program is distributed in the hope that it will be useful,
11  but WITHOUT ANY WARRANTY.
12 
13  See the COPYING file for more details.
14 */
15 
16 #pragma once
17 
18 #include "movetype.hpp"
20 #include "units/id.hpp"
21 #include "units/ptr.hpp"
22 #include "units/attack_type.hpp"
23 #include "units/race.hpp"
24 #include "utils/optional_fwd.hpp"
25 #include "utils/variant.hpp"
26 
27 #include <bitset>
28 #include "utils/optional_fwd.hpp"
29 
30 class team;
33 class vconfig;
34 struct color_t;
35 
36 /** Data typedef for unit_ability_list. */
38 {
43  {
44  }
45 
46  /**
47  * Used by the formula in the ability.
48  * The REAL location of the student (not the 'we are assuming the student is at this position' location)
49  * once unit_ability_list can contain abilities from different 'students', as it contains abilities from
50  * a unit aswell from its opponents (abilities with apply_to= opponent)
51  */
53  /**
54  * The location of the teacher, that is the unit who owns the ability tags
55  * (different from student because of [affect_adjacent])
56  */
58  /** The contents of the ability tag, never nullptr. */
60 };
61 
63 {
64 public:
66 
67  // Implemented in unit_abilities.cpp
68  std::pair<int, map_location> highest(const std::string& key, int def=0) const
69  {
70  return get_extremum(key, def, std::less<int>());
71  }
72  std::pair<int, map_location> lowest(const std::string& key, int def=0) const
73  {
74  return get_extremum(key, def, std::greater<int>());
75  }
76 
77  template<typename TComp>
78  std::pair<int, map_location> get_extremum(const std::string& key, int def, const TComp& comp) const;
79 
80  // The following make this class usable with standard library algorithms and such
82  typedef std::vector<unit_ability>::const_iterator const_iterator;
83 
84  iterator begin() { return cfgs_.begin(); }
85  const_iterator begin() const { return cfgs_.begin(); }
86  iterator end() { return cfgs_.end(); }
87  const_iterator end() const { return cfgs_.end(); }
88 
89  // Vector access
90  bool empty() const { return cfgs_.empty(); }
91  unit_ability& front() { return cfgs_.front(); }
92  const unit_ability& front() const { return cfgs_.front(); }
93  unit_ability& back() { return cfgs_.back(); }
94  const unit_ability& back() const { return cfgs_.back(); }
95  std::size_t size() { return cfgs_.size(); }
96 
97  iterator erase(const iterator& erase_it) { return cfgs_.erase(erase_it); }
98  iterator erase(const iterator& first, const iterator& last) { return cfgs_.erase(first, last); }
99 
100  template<typename... T>
101  void emplace_back(T&&... args) { cfgs_.emplace_back(args...); }
102 
103  const map_location& loc() const { return loc_; }
104 
105  /** Appends the abilities from @a other to @a this, ignores other.loc() */
106  void append(const unit_ability_list& other)
107  {
108  std::copy(other.begin(), other.end(), std::back_inserter(cfgs_ ));
109  }
110 
111  /**
112  * Appends any abilities from @a other for which the given condition returns true to @a this, ignores other.loc().
113  *
114  * @param other where to copy the elements from
115  * @param predicate a single-argument function that takes a reference to an element and returns a bool
116  */
117  template<typename Predicate>
118  void append_if(const unit_ability_list& other, const Predicate& predicate)
119  {
120  std::copy_if(other.begin(), other.end(), std::back_inserter(cfgs_ ), predicate);
121  }
122 
123 private:
124  // Data
125  std::vector<unit_ability> cfgs_;
127 };
128 
129 /**
130  * This class represents a *single* unit of a specific type.
131  */
132 class unit : public std::enable_shared_from_this<unit>
133 {
134 public:
135  /**
136  * Clear this unit status cache for all units. Currently only the hidden
137  * status of units is cached this way.
138  */
139  static void clear_status_caches();
140 
141  /** The path to the leader crown overlay. */
142  static const std::string& leader_crown();
143 
144 private:
145  void init(const config& cfg, bool use_traits = false, const vconfig* vcfg = nullptr);
146 
147  void init(const unit_type& t, int side, bool real_unit, unit_race::GENDER gender = unit_race::NUM_GENDERS, const std::string& variation = "");
148 
149  // Copy constructor
150  unit(const unit& u);
151 
152  struct unit_ctor_t {};
153 
154 public:
155  //private default ctor, butusing constructor to allow calling make_shared<unit> in create().
156  unit(unit_ctor_t);
157  unit() = delete;
158 
159 private:
161  {
175  //note that UA_ATTACKS only tracks added/deleted attacks, not modified attacks.
182  UA_COUNT
183  };
184 
186  {
187  changed_attributes_[int(attr)] = true;
188  }
189 
190  bool get_attacks_changed() const;
191 
193  {
194  return changed_attributes_[int(attr)];
195  }
196 
198 
199 public:
200  /** Initializes a unit from a config */
201  static unit_ptr create(const config& cfg, bool use_traits = false, const vconfig* vcfg = nullptr)
202  {
203  unit_ptr res = std::make_shared<unit>(unit_ctor_t());
204  res->init(cfg, use_traits, vcfg);
205  return res;
206  }
207 
208  /**
209  * Initializes a unit from a unit type.
210  *
211  * Only real_unit-s should have random traits, name and gender (to prevent OOS caused by RNG calls)
212  */
213  static unit_ptr create(const unit_type& t, int side, bool real_unit, unit_race::GENDER gender = unit_race::NUM_GENDERS, const std::string& variation = "")
214  {
215  unit_ptr res = std::make_shared<unit>(unit_ctor_t());
216  res->init(t, side, real_unit, gender, variation);
217 
218  return res;
219  }
220 
221  unit_ptr clone() const
222  {
223  return std::shared_ptr<unit>(new unit(*this));
224  }
225 
226  virtual ~unit();
227 
228  unit& operator=(const unit&) = delete;
229 
230  /**
231  * @defgroup unit_advance Advancement functions
232  * @{
233  */
234 
235  /** Advances this unit to another type */
236  void advance_to(const unit_type& t, bool use_traits = false);
237 
238  using advances_to_t = std::vector<std::string>;
239  /**
240  * Gets the possible types this unit can advance to on level-up.
241  *
242  * @returns A list of type IDs this unit may advance to.
243  */
244  const advances_to_t& advances_to() const
245  {
246  return advances_to_;
247  }
248 
249  /**
250  * Gets the names of the possible types this unit can advance to on level-up.
251  *
252  * @returns A list of the names of the types this unit may advance to.
253  */
254  const std::vector<std::string> advances_to_translated() const;
255 
256  /**
257  * Sets this unit's advancement options.
258  *
259  * @param advances_to A list of new type IDs this unit may advance to.
260  */
261  void set_advances_to(const std::vector<std::string>& advances_to);
262 
263  /**
264  * Checks whether this unit has any options to advance to.
265  *
266  * This considers both whether it has types to advance to OR whether any modifications
267  * specify non-type advancement options.
268  *
269  * Note this does not consider unit experience at all, it only checks option availability.
270  * See @ref advances if an experience check is necessary.
271  */
272  bool can_advance() const
273  {
274  return !advances_to_.empty() || !get_modification_advances().empty();
275  }
276 
277  /**
278  * Checks whether this unit is eligible for level-up.
279  *
280  * @retval true This unit has sufficient experience to level up and has advancement
281  * options available.
282  */
283  bool advances() const
284  {
285  return experience_ >= max_experience() && can_advance();
286  }
287 
288  /**
289  * Gets and image path and and associated description for each advancement option.
290  *
291  * Covers both type and modification-based advancements.
292  *
293  * @returns A data map, in image/description format. If the option is a unit type,
294  * advancement, the key is the type's image and the value the type ID.
295  *
296  * If the option is a modification, the key and value are set from config data
297  * (see @ref get_modification_advances).
298  */
299  std::map<std::string, std::string> advancement_icons() const;
300 
301  /**
302  * Gets any non-typed advanced options set by modifications.
303  *
304  * These are usually used to give a unit special advancement options that don't invole transforming to a
305  * new type.
306  *
307  * Note this is not the raw option data. Parsing is performed to ensure each option appears only once.
308  * Use @ref modification_advancements is the raw data is needed.
309  *
310  * @returns A config list of options data. Each option is unique.
311  */
312  std::vector<config> get_modification_advances() const;
313 
314  /**
315  * Gets the image and description data for modification advancements.
316  *
317  * @returns A list of pairs of the image paths(first) and descriptions (second) for
318  * each advancement option.
319  */
320  std::vector<std::pair<std::string, std::string>> amla_icons() const;
321 
322  /** The raw, unparsed data for modification advancements. */
323  const std::vector<config>& modification_advancements() const
324  {
325  return advancements_;
326  }
327 
328  /** Sets the raw modification advancement option data */
329  void set_advancements(std::vector<config> advancements);
330 
331  /**
332  * @}
333  * @defgroup unit_access Basic data setters and getters
334  * @{
335  **/
336 
337 public:
338  /**
339  * The side this unit belongs to.
340  *
341  * Note that side numbers starts from 1, not 0, so be sure to subtract 1 if using as a container index.
342  */
343  int side() const
344  {
345  return side_;
346  }
347 
348  /** Sets the side this unit belongs to. */
349  void set_side(unsigned int new_side)
350  {
351  side_ = new_side;
352  }
353 
354  /** This unit's type, accounting for gender and variation. */
355  const unit_type& type() const
356  {
357  return *type_;
358  }
359 
360  /**
361  * The id of this unit's type.
362  *
363  * If you are dealing with creating units (e.g. recruitment), this is not what you want, as a
364  * variation can change this; use type().parent_id() instead.
365  */
366  const std::string& type_id() const;
367 
368  /** Gets the translatable name of this unit's type. */
369  const t_string& type_name() const
370  {
371  return type_name_;
372  }
373 
374  /**
375  * Gets this unit's id.
376  *
377  * This is a unique string usually set by WML. It should *not* be used for internal tracking in
378  * the unit_map. Use @ref underlying_id for that.
379  */
380  const std::string& id() const
381  {
382  return id_;
383  }
384 
385  /** Sets this unit's string ID. */
386  void set_id(const std::string& id)
387  {
388  id_ = id;
389  }
390 
391  /** This unit's unique internal ID. This should *not* be used for user-facing operations. */
392  std::size_t underlying_id() const
393  {
394  return underlying_id_.value;
395  }
396 
397 private:
398  /** Sets the internal ID. */
399  void set_underlying_id(n_unit::id_manager& id_manager);
400 
401 public:
402  /** Gets this unit's translatable display name. */
403  const t_string& name() const
404  {
405  return name_;
406  }
407 
408  /**
409  * Sets this unit's translatable display name.
410  *
411  * This should only be used internally since it ignores the 'unrenamable' flag.
412  */
413  void set_name(const t_string& name)
414  {
415  name_ = name;
416  }
417 
418  /**
419  * Attempts to rename this unit's translatable display name, taking the 'unrenamable' flag into account.
420  *
421  * If a direct rename is desired, use @ref set_name.
422  * @todo should this also take a t_string?
423  */
424  void rename(const std::string& name)
425  {
426  if(!unrenamable_) {
427  name_ = name;
428  }
429  }
430 
431  /**
432  * Whether this unit can be renamed.
433  *
434  * This flag is considered by @ref rename, but not @ref set_name.
435  */
436  bool unrenamable() const
437  {
438  return unrenamable_;
439  }
440 
441  /**
442  * Sets the 'unrenamable' flag. Usually used for scenario-specific units which should not be renamed.
443  */
445  {
447  }
448 
449  /** A detailed description of this unit. */
451  {
452  return description_;
453  }
454 
455  /** A detailed description of this unit. */
456  void set_unit_description(const t_string& new_desc)
457  {
458  description_ = new_desc;
459  }
460 
461  /** The unit's special notes. */
462  std::vector<t_string> unit_special_notes() const;
463 
464  /** The gender of this unit. */
466  {
467  return gender_;
468  }
469 
470  /**
471  * The alignment of this unit.
472  *
473  * This affects the time of day during which this unit's attacks do the most damage.
474  */
476  {
477  return alignment_;
478  }
479 
480  /** Sets the alignment of this unit. */
482  {
485  }
486 
487  /**
488  * Gets this unit's race.
489  *
490  * @returns A pointer to a unit_race object - never nullptr, but it may point
491  * to the null race.
492  */
493  const unit_race* race() const
494  {
495  return race_;
496  }
497 
498  /** The current number of hitpoints this unit has. */
499  int hitpoints() const
500  {
501  return hit_points_;
502  }
503 
504  /** The max number of hitpoints this unit can have. */
505  int max_hitpoints() const
506  {
507  return max_hit_points_;
508  }
509 
510  void set_max_hitpoints(int value)
511  {
513  max_hit_points_ = value;
514  }
515 
516  /** Sets the current hitpoint amount. */
517  void set_hitpoints(int hp)
518  {
519  hit_points_ = hp;
520  }
521 
522  /** The current number of experience points this unit has. */
523  int experience() const
524  {
525  return experience_;
526  }
527 
528  /** The max number of experience points this unit can have. */
529  int max_experience() const
530  {
531  return max_experience_;
532  }
533 
534  void set_max_experience(int value)
535  {
537  max_experience_ = value;
538  }
539 
540  /** The number of experience points this unit needs to level up, or 0 if current XP > max XP. */
541  unsigned int experience_to_advance() const
542  {
543  return std::max(0, max_experience_ - experience_);
544  }
545 
546  /** The number of experience points over max this unit has, or 0 if current XP < max XP. */
547  unsigned int experience_overflow() const
548  {
549  return std::max(0, experience_ - max_experience_);
550  }
551 
552  /** Sets the current experience point amount. */
553  void set_experience(int xp)
554  {
555  experience_ = xp;
556  }
557 
558  /** The current level of this unit. */
559  int level() const
560  {
561  return level_;
562  }
563 
564  /** Sets the current level of this unit. */
565  void set_level(int level)
566  {
568  level_ = level;
569  }
570 
571  /** The ID of the variation of this unit's type. */
572  const std::string& variation() const
573  {
574  return variation_;
575  }
576 
577  /** The ID of the undead variation (ie, dwarf, swimmer) of this unit. */
578  void set_undead_variation(const std::string& value)
579  {
581  undead_variation_ = value;
582  }
583  const std::string& undead_variation() const
584  {
585  return undead_variation_;
586  }
587 
588  /**
589  * An optional profile image to display in Help.
590  *
591  * @returns The specified image, this unit's type's sprite image if empty
592  * or 'unit_image' was set.
593  */
594  std::string small_profile() const;
595 
596  void set_small_profile(const std::string& value)
597  {
599  small_profile_ = value;
600  }
601  /**
602  * An optional profile image displays when this unit is 'speaking' via [message].
603  *
604  * @returns The specified image, this unit's type's sprite image if empty
605  * or 'unit_image' was set.
606  */
607  std::string big_profile() const;
608 
609  void set_big_profile(const std::string& value);
610 
611  /** Whether this unit can recruit other units - ie, are they a leader unit. */
612  bool can_recruit() const
613  {
614  return canrecruit_;
615  }
616 
617  /** Sets whether this unit can recruit other units. */
618  void set_can_recruit(bool canrecruit)
619  {
620  canrecruit_ = canrecruit;
621  }
622 
623  /** The type IDs of the other units this unit may recruit, if possible. */
624  const std::vector<std::string>& recruits() const
625  {
626  return recruit_list_;
627  }
628 
629  /** Sets the recruit list. */
630  void set_recruits(const std::vector<std::string>& recruits);
631 
632  /** How much gold is required to recruit this unit. */
633  int cost() const
634  {
635  return unit_value_;
636  }
637 
638  /** How much gold it costs to recall this unit, or -1 if the side's default
639  * recall cost is used. */
640  int recall_cost() const
641  {
642  return recall_cost_;
643  }
644 
645  /** Sets the cost of recalling this unit. */
647  {
649  }
650 
651  /** Gets the filter constraints upon which units this unit may recall, if able. */
652  const config& recall_filter() const
653  {
654  return filter_recall_;
655  }
656 
657  /** Sets the filter constraints upon which units this unit may recall, if able. */
658  void set_recall_filter(const config& filter)
659  {
660  filter_recall_ = filter;
661  }
662 
663  /**
664  * Gets this unit's role.
665  *
666  * A role is a special string flag usually used to represent a unit's purpose in a scenario.
667  * It can be filtered on.
668  */
669  const std::string& get_role() const
670  {
671  return role_;
672  }
673 
674  /** Sets a unit's role */
675  void set_role(const std::string& role)
676  {
677  role_ = role;
678  }
679 
680  /**
681  * Gets this unit's usage. This is relevant to the AI.
682  *
683  * Usage refers to how the AI may consider utilizing this unit in combat.
684  * @todo document further
685  */
686  std::string usage() const
687  {
688  return usage_.value_or("");
689  }
690 
691  /** Sets this unit's usage. */
692  void set_usage(const std::string& usage)
693  {
694  usage_ = usage;
695  }
696 
697  /**
698  * Gets any user-defined variables this unit 'owns'.
699  *
700  * These are accessible via WML if the unit's data is serialized to a variable. They're strictly
701  * user-facing; internal engine calculations shouldn't use this.
702  */
704  {
705  return variables_;
706  }
707 
708  /** Const overload of @ref variables. */
709  const config& variables() const
710  {
711  return variables_;
712  }
713 
714  /**
715  * Gets whether this unit is currently hidden on the map.
716  *
717  * Hidden units are not drawn on the main map or the minimap. They are
718  * an implementation detail. For the [hides] ability, see invisible().
719  */
720  bool get_hidden() const
721  {
722  return hidden_;
723  }
724 
725  /** Sets whether the unit is hidden on the map. */
726  void set_hidden(bool state) const;
727 
728  /**
729  * The factor by which the HP bar should be scaled.
730  * @todo: document further
731  */
732  double hp_bar_scaling() const
733  {
734  return hp_bar_scaling_;
735  }
736 
737  /**
738  * The factor by which the XP bar should be scaled.
739  * @todo: document further
740  */
741  double xp_bar_scaling() const
742  {
743  return xp_bar_scaling_;
744  }
745 
746  /**
747  * Whether the unit has been instructed to hold its position.
748  * This excludes it from the unit cycling function.
749  * @return true if it is holding position
750  */
751  bool hold_position() const
752  {
753  return hold_position_;
754  }
755 
756  /**
757  * Toggle the unit's hold position status.
758  */
760  {
762  if(hold_position_) {
763  end_turn_ = true;
764  }
765  }
766 
767  /**
768  * Set whether the user ended their turn
769  * @todo Verify meaning and explain better
770  */
771  void set_user_end_turn(bool value = true)
772  {
773  end_turn_ = value;
774  }
775 
776  /**
777  * Toggle whether the user ended their turn
778  * @todo Verify meaning and explain better
779  */
781  {
782  end_turn_ = !end_turn_;
783  if(!end_turn_) {
784  hold_position_ = false;
785  }
786  }
787 
788  /**
789  * Check whether the user ended their turn
790  * @todo Verify meaning and explain better
791  */
792  bool user_end_turn() const
793  {
794  return end_turn_;
795  }
796 
797  /**
798  * Refresh unit for the beginning of a turn
799  */
800  void new_turn();
801 
802  /**
803  * Refresh unit for the end of a turn
804  */
805  void end_turn();
806 
807  /**
808  * Refresh unit for the beginning of a new scenario
809  */
810  void new_scenario();
811 
812  /**
813  * Damage the unit.
814  * @returns true if the unit dies as a result
815  */
816  bool take_hit(int damage)
817  {
818  hit_points_ -= damage;
819  return hit_points_ <= 0;
820  }
821 
822  /**
823  * Heal the unit
824  * @param amount The number of hitpoints to gain
825  */
826  void heal(int amount);
827 
828  /**
829  * Fully heal the unit, restoring it to max hitpoints
830  */
831  void heal_fully()
832  {
834  }
835 
836  /**
837  * Get the status effects currently affecting the unit.
838  * @return A set of status keys
839  */
840  const std::set<std::string> get_states() const;
841 
842  /**
843  * Check if the unit is affected by a status effect
844  * @param state The status effect to check
845  * @returns true if the unit is affected by the status effect
846  */
847  bool get_state(const std::string& state) const;
848 
849  /**
850  * Set whether the unit is affected by a status effect
851  * @param state The status effect to change
852  * @param value Whether the unit should be affected by the status
853  */
854  void set_state(const std::string& state, bool value);
855 
856  /**
857  * Built-in status effects known to the engine
858  */
859  enum state_t {
860  STATE_SLOWED = 0, /** The unit is slowed - it moves slower and does less damage */
861  STATE_POISONED, /** The unit is poisoned - it loses health each turn */
862  STATE_PETRIFIED, /** The unit is petrified - it cannot move or be attacked */
863  STATE_UNCOVERED, /** The unit is uncovered - it was hiding but has been spotted */
864  STATE_NOT_MOVED, /** The unit has not moved @todo Explain better */
865  STATE_UNHEALABLE, /** The unit cannot be healed */
866  STATE_GUARDIAN, /** The unit is a guardian - it won't move unless a target is sighted */
867  STATE_INVULNERABLE, /** The unit is invulnerable - it cannot be hit by any attack */
868  NUMBER_OF_STATES, /** To set the size of known_boolean_states_ */
869  STATE_UNKNOWN = -1 /** A status effect not known to the engine */
870  };
871 
872  /**
873  * Set whether the unit is affected by a status effect
874  * @param state The status effect to change
875  * @param value Whether the unit should be affected by the status
876  */
877  void set_state(state_t state, bool value);
878 
879  /**
880  * Check if the unit is affected by a status effect
881  * @param state The status effect to check
882  * @returns true if the unit is affected by the status effect
883  */
884  bool get_state(state_t state) const;
885 
886  /**
887  * Convert a string status effect ID to a built-in status effect ID
888  * @returns the state_t representing the status, or STATE_UNKNOWN if it's not built-in
889  */
890  static state_t get_known_boolean_state_id(const std::string& state);
891 
892  /**
893  * Convert a built-in status effect ID to a string status effect ID
894  * @returns the string representing the status, or an empty string for STATE_UNKNOWN
895  */
896  static std::string get_known_boolean_state_name(state_t state);
897 
898  /**
899  * Check if the unit has been poisoned
900  * @returns true if it's poisoned
901  */
902  bool poisoned() const
903  {
904  return get_state(STATE_POISONED);
905  }
906 
907  /**
908  * Check if the unit has been petrified
909  * @returns true if it's petrified
910  */
911  bool incapacitated() const
912  {
913  return get_state(STATE_PETRIFIED);
914  }
915 
916  /**
917  * Check if the unit has been slowed
918  * @returns true if it's slowed
919  */
920  bool slowed() const
921  {
922  return get_state(STATE_SLOWED);
923  }
924 
925  /**
926  * @}
927  * @defgroup unit_atk Attack and resistance functions
928  * @{
929  */
930 
931 public:
932  /** Gets an iterator over this unit's attacks. */
934  {
935  return make_attack_itors(attacks_);
936  }
937 
938  /** Const overload of @ref attacks. */
940  {
941  return make_attack_itors(attacks_);
942  }
943 
944  /**
945  * Adds a new attack to the unit.
946  * @param position An iterator pointing to the attack before which to insert the new one.
947  * @param args The arguments for constructing the attack
948  */
949  template<typename... Args>
950  attack_ptr add_attack(attack_itors::iterator position, Args&&... args)
951  {
953  return *attacks_.emplace(position.base(), new attack_type(std::forward<Args>(args)...));
954  }
955 
956  /**
957  * Remove an attack from the unit
958  * @param atk A pointer to the attack to remove
959  * @return true if the attack was removed, false if it didn't exist on the unit
960  */
961  bool remove_attack(attack_ptr atk);
962 
963  /**
964  * Set the unit to have no attacks left for this turn.
965  */
966  void remove_attacks_ai();
967 
968  /**
969  * Calculates the damage this unit would take from a certain attack.
970  *
971  * @param attack The attack to consider.
972  * @param attacker Whether this unit should be considered the attacker.
973  * @param loc The unit's location (to resolve [resistance] abilities)
974  * @param weapon The weapon to check for any abilities or weapon specials
975  *
976  * @returns The expected damage.
977  */
978  int damage_from(const attack_type& attack, bool attacker, const map_location& loc, const_attack_ptr weapon = nullptr) const
979  {
980  return resistance_against(attack, attacker, loc, weapon);
981  }
982 
983  /** The maximum number of attacks this unit may perform per turn, usually 1. */
984  int max_attacks() const
985  {
986  return max_attacks_;
987  }
988 
989  void set_max_attacks(int value)
990  {
992  max_attacks_ = value;
993  }
994 
995  /**
996  * Gets the remaining number of attacks this unit can perform this turn.
997  *
998  * If the 'incapacitated' status is set, this will always be 0.
999  */
1000  int attacks_left() const
1001  {
1002  return (attacks_left_ == 0 || incapacitated()) ? 0 : attacks_left_;
1003  }
1004 
1005  /**
1006  * Gets the remaining number of attacks this unit can perform this turn.
1007  *
1008  * @param base_value If false, consider the `incapacitated` flag.
1009  *
1010  * @returns If @a base_value is true, the raw value is returned.
1011  */
1012  int attacks_left(bool base_value) const
1013  {
1014  return base_value ? attacks_left_ : attacks_left();
1015  }
1016 
1017  /**
1018  * Sets the number of attacks this unit has left this turn.
1019  * @param left The number of attacks left
1020  */
1021  void set_attacks(int left)
1022  {
1023  attacks_left_ = std::max<int>(0, left);
1024  }
1025 
1026  /**
1027  * The unit's defense on a given terrain
1028  * @param terrain The terrain to check
1029  */
1030  int defense_modifier(const t_translation::terrain_code& terrain) const;
1031 
1032  /**
1033  * For the provided list of resistance abilities, determine the damage resistance based on which are active and any max_value that's present.
1034  *
1035  * @param resistance_list A list of resistance abilities that the unit has.
1036  * @param damage_name The name of the damage type, for example "blade".
1037  * @return The resistance value for a unit with the provided resistance abilities to the provided damage type.
1038  */
1039  int resistance_value(unit_ability_list resistance_list, const std::string& damage_name) const;
1040 
1041  /**
1042  * The unit's resistance against a given damage type
1043  * @param damage_name The damage type
1044  * @param attacker True if this unit is on the offensive (to resolve [resistance] abilities)
1045  * @param loc The unit's location (to resolve [resistance] abilities)
1046  * @param weapon The weapon to check for any abilities or weapon specials
1047  * @param opp_weapon The opponent's weapon to check for any abilities or weapon specials
1048  */
1049  int resistance_against(const std::string& damage_name, bool attacker, const map_location& loc, const_attack_ptr weapon = nullptr, const_attack_ptr opp_weapon = nullptr) const;
1050 
1051  /**
1052  * The unit's resistance against a given attack
1053  * @param atk The attack
1054  * @param attacker True if this unit is on the offensive (to resolve [resistance] abilities)
1055  * @param loc The unit's location (to resolve [resistance] abilities)
1056  * @param weapon The weapon to check for any abilities or weapon specials
1057  */
1058  int resistance_against(const attack_type& atk, bool attacker, const map_location& loc, const_attack_ptr weapon = nullptr) const
1059  {
1060  return resistance_against(atk.type(), attacker, loc , weapon, atk.shared_from_this());
1061  }
1062 
1063  /** Gets resistances without any abilities applied. */
1065  {
1066  return movement_type_.damage_table();
1067  }
1068 
1069 private:
1070  bool resistance_filter_matches(const config& cfg, const std::string& damage_name, int res) const;
1071 
1072  /**
1073  * @}
1074  * @defgroup unit_trait Trait and upkeep functions
1075  * @{
1076  */
1077 public:
1078  /**
1079  * Applies mandatory traits (e.g. undead, mechanical) to a unit and then fills in the remaining traits
1080  * traits until no more are available (leaders have a restricted set of available traits) or the unit has
1081  * its maximum number of traits.
1082  *
1083  * This routine does not apply the effects of added traits to a unit; that must be done by the caller.
1084  *
1085  * Note that random numbers used in config files don't work in multiplayer, so leaders should be barred
1086  * from all random traits until that is fixed. Later the restrictions will be based on play balance.
1087  *
1088  * @param must_have_only Whether random or optional traits should be included or not. If false only
1089  * mandatory traits will be used.
1090  */
1091  void generate_traits(bool must_have_only = false);
1092 
1093  /**
1094  * Gets the names of the currently registered traits.
1095  *
1096  * @returns A list of translatable trait names.
1097  */
1098  const std::vector<t_string>& trait_names() const
1099  {
1100  return trait_names_;
1101  }
1102 
1103  /**
1104  * Gets the descriptions of the currently registered traits.
1105  *
1106  * @returns A list of translatable trait descriptions.
1107  */
1108  const std::vector<t_string>& trait_descriptions() const
1109  {
1110  return trait_descriptions_;
1111  }
1112 
1113  /**
1114  * Gets the ids of the traits corresponding to those returned by trait_names() and
1115  * trait_descriptions(). Omits hidden traits, which are those with an empty name.
1116  *
1117  * @returns A list of trait IDs.
1118  */
1119  std::vector<std::string> trait_nonhidden_ids() const
1120  {
1121  return trait_nonhidden_ids_;
1122  }
1123 
1124  /** Gets a list of the modification this unit currently has.
1125  * @param mod_type type of modification.
1126  * @returns A list of modification IDs.
1127  */
1128  std::vector<std::string> get_modifications_list(const std::string& mod_type) const;
1129 
1130  /**
1131  * Gets a list of the traits this unit currently has, including hidden traits.
1132  *
1133  * @returns A list of trait IDs.
1134  */
1135  std::vector<std::string> get_traits_list() const
1136  {
1137  return get_modifications_list("trait");
1138  }
1139 
1140  std::vector<std::string> get_objects_list() const
1141  {
1142  return get_modifications_list("object");
1143  }
1144 
1145  std::vector<std::string> get_advancements_list() const
1146  {
1147  return get_modifications_list("advancement");
1148  }
1149 
1150  /**
1151  * Register a trait's name and its description for the UI's use.
1152  *
1153  * The resulting data can be fetched with @ref trait_names and @ref trait_descriptions.
1154  *
1155  * @param trait A config containing the trait's attributes.
1156  * @param description The translatable description of the trait.
1157  */
1158  void add_trait_description(const config& trait, const t_string& description);
1159 
1160  /**
1161  * Gets the amount of gold this unit costs a side per turn.
1162  *
1163  * This fetches an actual numeric gold value:
1164  * - If can_recruit is true, no upkeep is paid (0 is returned).
1165  * - If a special upkeep flag is set, the associated gold amount is returned (see @ref upkeep_value_visitor).
1166  * - If a numeric value is already set, it is returned directly.
1167  *
1168  * @returns A gold value, evaluated based on the state of @ref upkeep_raw.
1169  */
1170  int upkeep() const;
1171 
1173  {
1174  static std::string type() { static std::string v = "full"; return v; }
1175  };
1176 
1178  {
1179  static std::string type() { static std::string v = "loyal"; return v; }
1180  };
1181 
1182  using upkeep_t = utils::variant<upkeep_full, upkeep_loyal, int>;
1183 
1184  /** Visitor helper class to fetch the appropriate upkeep value. */
1186 #ifdef USING_BOOST_VARIANT
1187  : public boost::static_visitor<int>
1188 #endif
1189  {
1190  public:
1191  explicit upkeep_value_visitor(const unit& unit) : u_(unit) {}
1192 
1193  /** Full upkeep equals the unit's level. */
1194  int operator()(const upkeep_full&) const
1195  {
1196  return u_.level();
1197  }
1198 
1199  /** Loyal units cost no upkeep. */
1200  int operator()(const upkeep_loyal&) const
1201  {
1202  return 0;
1203  }
1204 
1205  int operator()(int v) const
1206  {
1207  return v;
1208  }
1209 
1210  private:
1211  const unit& u_;
1212  };
1213 
1214  /** Visitor helper struct to fetch the upkeep type flag if applicable, or the the value otherwise. */
1216 #ifdef USING_BOOST_VARIANT
1217  : public boost::static_visitor<std::string>
1218 #endif
1219  {
1220  template<typename T>
1221  std::enable_if_t<!std::is_same_v<int, T>, std::string>
1222  operator()(T&) const
1223  {
1224  // Any special upkeep type should have an associated @ref type getter in its helper struct.
1225  return T::type();
1226  }
1227 
1228  std::string operator()(int v) const
1229  {
1230  return std::to_string(v);
1231  }
1232  };
1233 
1234  /** Visitor helper class to parse the upkeep value from a config. */
1236 #ifdef USING_BOOST_VARIANT
1237  : public boost::static_visitor<upkeep_t>
1238 #endif
1239  {
1240  public:
1241  template<typename N>
1242  std::enable_if_t<std::is_arithmetic_v<N>, upkeep_t>
1243  operator()(N n) const
1244  {
1245  if(n == 0) return upkeep_loyal();
1246  if(n < 0) throw std::invalid_argument(std::to_string(n));
1247  return static_cast<int>(n);
1248  }
1249 
1250  template<typename B>
1251  std::enable_if_t<std::is_convertible_v<B, bool> && !std::is_arithmetic_v<B>, upkeep_t>
1252  operator()(B b) const
1253  {
1254  throw std::invalid_argument(b.str());
1255  }
1256 
1257  upkeep_t operator()(utils::monostate) const
1258  {
1259  return upkeep_full();
1260  }
1261 
1262  upkeep_t operator()(const std::string& s) const
1263  {
1264  if(s == "loyal" || s == "free")
1265  return upkeep_loyal();
1266  if(s == "full")
1267  return upkeep_full();
1268  throw std::invalid_argument(s);
1269  }
1270  };
1271 
1272  /**
1273  * Gets the raw variant controlling the upkeep value.
1274  *
1275  * This should not usually be called directly. To get an actual numeric value of upkeep use @ref upkeep.
1276  */
1278  {
1279  return upkeep_;
1280  }
1281 
1282  /** Sets the upkeep value to a specific value value. Does not necessarily need to be numeric */
1284  {
1285  upkeep_ = v;
1286  }
1287 
1288  /** Gets whether this unit is loyal - ie, it costs no upkeep. */
1289  bool loyal() const;
1290 
1291  void set_loyal(bool loyal);
1292 
1293  /** Gets whether this unit is fearless - ie, unaffected by time of day. */
1294  bool is_fearless() const
1295  {
1296  return is_fearless_;
1297  }
1298 
1299  /** Gets whether this unit is healthy - ie, always rest heals. */
1300  bool is_healthy() const
1301  {
1302  return is_healthy_;
1303  }
1304 
1305  /**
1306  * @}
1307  * @defgroup unit_mvmt Movement and location functions
1308  * @{
1309  */
1310 
1311 public:
1312  /** The maximum moves this unit has. */
1313  int total_movement() const
1314  {
1315  return max_movement_;
1316  }
1317 
1318  void set_total_movement(int value)
1319  {
1321  max_movement_ = value;
1322  }
1323 
1324  /**
1325  * Gets how far a unit can move, considering the `incapacitated` flag.
1326  *
1327  * @returns The remaining movement, or zero if incapacitated.
1328  */
1329  int movement_left() const
1330  {
1331  return (movement_ == 0 || incapacitated()) ? 0 : movement_;
1332  }
1333 
1334  /**
1335  * Gets how far a unit can move.
1336  *
1337  * @param base_value If false, consider the `incapacitated` flag.
1338  *
1339  * @returns If @a base_value is true, the raw value is returned.
1340  */
1341  int movement_left(bool base_value) const
1342  {
1343  return base_value ? movement_ : movement_left();
1344  }
1345 
1346  /**
1347  * Set this unit's remaining movement to @a moves.
1348  *
1349  * This does not affect maximum movement.
1350  *
1351  * @param moves The new number of moves
1352  * @param unit_action If to true, the "end turn" and "hold position" flags will be cleared
1353  * (as they should be if a unit acts, as opposed to the movement being set
1354  * by the engine for other reasons).
1355  */
1356  void set_movement(int moves, bool unit_action = false);
1357 
1358  /** Checks if this unit has moved. */
1359  bool has_moved() const
1360  {
1361  return movement_left() != total_movement();
1362  }
1363 
1364  /** Sets the unit to have no moves left for this turn. */
1365  void remove_movement_ai();
1366 
1367  /**
1368  * Checks whether this unit is 'resting'.
1369  *
1370  * Resting refers to whether this unit has not moved yet this turn. Note that this can be true even
1371  * if @ref movement_left is not equal to @ref total_movement.
1372  */
1373  bool resting() const
1374  {
1375  return resting_;
1376  }
1377 
1378  /** Sets this unit's resting status. */
1379  void set_resting(bool rest)
1380  {
1381  resting_ = rest;
1382  }
1383 
1384  /** Tests whether the unit has a zone-of-control, considering @ref incapacitated. */
1385  bool emits_zoc() const
1386  {
1387  return emit_zoc_ && !incapacitated();
1388  }
1389 
1390  /** Gets the raw zone-of-control flag, disregarding @ref incapacitated. */
1391  bool get_emit_zoc() const
1392  {
1393  return emit_zoc_;
1394  }
1395 
1396  /** Sets the raw zone-of-control flag. */
1397  void set_emit_zoc(bool val)
1398  {
1400  emit_zoc_ = val;
1401  }
1402 
1403  /** The current map location this unit is at. */
1405  {
1406  return loc_;
1407  }
1408 
1409  /**
1410  * Sets this unit's map location.
1411  *
1412  * Note this should only be called by unit_map or for temporary units.
1413  */
1414  void set_location(const map_location& loc)
1415  {
1416  loc_ = loc;
1417  }
1418 
1419  /** The current direction this unit is facing within its hex. */
1421  {
1422  return facing_;
1423  }
1424 
1425  /** The this unit's facing. */
1426  void set_facing(map_location::direction dir) const;
1427 
1428  /** Gets whether this unit has a multi-turn destination set. */
1429  bool has_goto() const
1430  {
1431  return get_goto().valid();
1432  }
1433 
1434  /** The map location to which this unit is moving over multiple turns, if any. */
1435  const map_location& get_goto() const
1436  {
1437  return goto_;
1438  }
1439 
1440  /** Sets this unit's long term destination. */
1441  void set_goto(const map_location& new_goto)
1442  {
1443  goto_ = new_goto;
1444  }
1445 
1446  /** Gets the unit's vision points. */
1447  int vision() const
1448  {
1449  return vision_ < 0 ? max_movement_ : vision_;
1450  }
1451 
1452  /** Gets the unit's jamming points. */
1453  int jamming() const
1454  {
1455  return jamming_;
1456  }
1457 
1458  /** Check whether the unit's move has been interrupted. */
1459  bool move_interrupted() const
1460  {
1461  return movement_left() > 0 && interrupted_move_.x >= 0 && interrupted_move_.y >= 0;
1462  }
1463 
1464  /** Get the target location of the unit's interrupted move. */
1466  {
1467  return interrupted_move_;
1468  }
1469 
1470  /** Set the target location of the unit's interrupted move. */
1471  void set_interrupted_move(const map_location& interrupted_move)
1472  {
1473  interrupted_move_ = interrupted_move;
1474  }
1475 
1476  /** Get the unit's movement type. */
1477  const movetype& movement_type() const
1478  {
1479  return movement_type_;
1480  }
1481 
1482  /**
1483  * Get the unit's movement cost on a particular terrain
1484  * @param terrain The terrain to check
1485  * @returns the number of movement points to enter that terrain
1486  */
1487  int movement_cost(const t_translation::terrain_code& terrain) const
1488  {
1490  }
1491 
1492  /**
1493  * Get the unit's vision cost on a particular terrain
1494  * @param terrain The terrain to check
1495  * @returns the number of vision points to see into that terrain
1496  */
1497  int vision_cost(const t_translation::terrain_code& terrain) const
1498  {
1500  }
1501 
1502  /**
1503  * Get the unit's jamming cost on a particular terrain
1504  * @param terrain The terrain to check
1505  * @returns the number of jamming points to jam that terrain
1506  */
1507  int jamming_cost(const t_translation::terrain_code& terrain) const
1508  {
1510  }
1511 
1512  /** Check if the unit is a flying unit. */
1513  bool is_flying() const
1514  {
1515  return movement_type_.is_flying();
1516  }
1517 
1518  /**
1519  * @}
1520  * @defgroup unit_mod Modification functions
1521  * @{
1522  */
1523 
1524 public:
1525  /** Get the raw modifications. */
1527  {
1528  return modifications_;
1529  }
1530 
1531  /** Set the raw modifications. */
1532  const config& get_modifications() const
1533  {
1534  return modifications_;
1535  }
1536 
1537  /**
1538  * Count modifications of a particular type.
1539  * @param type The type of modification to count.
1540  * Valid values are "advancement", "trait", "object"
1541  * @param id The ID of the modification to count
1542  * @return The total number of modifications of that type and ID.
1543  */
1544  std::size_t modification_count(const std::string& type, const std::string& id) const;
1545 
1546  /**
1547  * Count modifications of a particular type.
1548  * @param type The type of modification to count.
1549  * Valid values are "advancement", "trait", "object"
1550  * @return The total number of modifications of that type.
1551  */
1552  std::size_t modification_count(const std::string& type) const;
1553 
1554  std::size_t traits_count() const
1555  {
1556  return modification_count("trait");
1557  }
1558 
1559  std::size_t objects_count() const
1560  {
1561  return modification_count("object");
1562  }
1563 
1564  std::size_t advancements_count() const
1565  {
1566  return modification_count("advancement");
1567  }
1568 
1569  /**
1570  * Add a new modification to the unit.
1571  * @param type The type of modification to add.
1572  * Valid values are "advancement", "trait", "object"
1573  * @param modification The details of the modification
1574  * @param no_add If true, apply the modification but don't save it for unit rebuild time.
1575  * Defaults to false.
1576  */
1577  void add_modification(const std::string& type, const config& modification, bool no_add = false);
1578 
1579  /**
1580  * Clears those modifications whose duration has expired.
1581  *
1582  * @param duration If empty, all temporary modifications (those not lasting forever) expire.
1583  * Otherwise, modifications whose duration equals @a duration expire.
1584  */
1585  void expire_modifications(const std::string& duration);
1586 
1587  static const std::set<std::string> builtin_effects;
1588 
1589  /**
1590  * Apply a builtin effect to the unit.
1591  * @param type The effect to apply. Must be one of the effects in @ref builtin_effects.
1592  * @param effect The details of the effect
1593  */
1594  void apply_builtin_effect(std::string type, const config& effect);
1595 
1596  /**
1597  * Construct a string describing a built-in effect.
1598  * @param type The effect to describe. Must be one of the effects in @ref builtin_effects.
1599  * @param effect The details of the effect
1600  */
1601  std::string describe_builtin_effect(std::string type, const config& effect);
1602 
1603  /** Re-apply all saved modifications. */
1604  void apply_modifications();
1605 
1606  /**
1607  * @}
1608  * @defgroup unit_img Image and animations functions
1609  * @{
1610  */
1611 
1612 public:
1613  /** @todo Document this */
1615  {
1616  return *anim_comp_;
1617  }
1618 
1619  /** The name of the file to game_display (used in menus). */
1620  std::string absolute_image() const;
1621 
1622  /** The default image to use for animation frames with no defined image. */
1623  std::string default_anim_image() const;
1624 
1625  /** Get the unit's halo image. */
1626  std::string image_halo() const
1627  {
1628  return halo_.value_or("");
1629  }
1630 
1631  std::vector<std::string> halo_or_icon_abilities(const std::string& image_type) const;
1632 
1633  /** Get the [halo] abilities halo image(s). */
1634  std::vector<std::string> halo_abilities() const
1635  {
1636  return halo_or_icon_abilities("halo");
1637  }
1638 
1639  /** Set the unit's halo image. */
1640  void set_image_halo(const std::string& halo);
1641 
1642  /** Get the unit's ellipse image. */
1643  std::string image_ellipse() const
1644  {
1645  return ellipse_.value_or("");
1646  }
1647 
1648  /** Set the unit's ellipse image. */
1649  void set_image_ellipse(const std::string& ellipse)
1650  {
1651  appearance_changed_ = true;
1652  ellipse_ = ellipse;
1653  }
1654 
1655  /**
1656  * Get the source color palette to use when recoloring the unit's image.
1657  */
1658  const std::string& flag_rgb() const;
1659 
1660  /** Constructs a recolor (RC) IPF string for this unit's team color. */
1661  std::string TC_image_mods() const;
1662 
1663  /** Gets any IPF image mods applied by effects. */
1664  const std::string& effect_image_mods() const
1665  {
1666  return image_mods_;
1667  }
1668 
1669  /**
1670  * Gets an IPF string containing all IPF image mods.
1671  *
1672  * @returns An amalgamation of @ref effect_image_mods followed by @ref TC_image_mods.
1673  */
1674  std::string image_mods() const;
1675 
1676  /** Get the unit's overlay images. */
1677  const std::vector<std::string>& overlays() const
1678  {
1679  return overlays_;
1680  }
1681 
1682  /** Get the [overlay] ability overlay images. */
1683  std::vector<std::string> overlays_abilities() const
1684  {
1685  return halo_or_icon_abilities("overlay");
1686  }
1687 
1688  /**
1689  * Color for this unit's *current* hitpoints.
1690  *
1691  * @returns A color between green and red representing how wounded this unit is.
1692  * The maximum_hitpoints are considered as base.
1693  */
1694  color_t hp_color() const;
1695  static color_t hp_color_max();
1696 
1697  /**
1698  * Color for this unit's hitpoints.
1699  *
1700  * @param hitpoints The number of hitpoints the color represents.
1701  * @returns The color considering the current hitpoints as base.
1702  */
1703  color_t hp_color(int hitpoints) const;
1704 
1705  /**
1706  * Color for this unit's XP. See also @ref hp_color
1707  */
1708  color_t xp_color() const;
1709  static color_t xp_color(int xp_to_advance, bool can_advance, bool has_amla);
1710 
1711  /**
1712  * @}
1713  * @defgroup unit_abil Ability functions
1714  * @{
1715  */
1716 
1717 public:
1718  /**
1719  * Checks whether this unit currently possesses or is affected by a given ability.
1720  *
1721  * This means that the ability could be owned by this unit itself or by an adjacent unit, should
1722  * the ability affect an AoE in which this unit happens to be.
1723  *
1724  * @param tag_name The name of the ability to check for.
1725  * @param loc The location around which to check for affected units. This may or
1726  * may not be the location of this unit.
1727  */
1728  bool get_ability_bool(const std::string& tag_name, const map_location& loc) const;
1729 
1730  /**
1731  * Checks whether this unit currently possesses or is affected by a given ability.
1732  *
1733  * This means that the ability could be owned by this unit itself or by an adjacent unit, should
1734  * the ability affect an AoE in which this unit happens to be.
1735  *
1736  * This overload uses the location of this unit for calculations.
1737  *
1738  * @param tag_name The name of the ability to check for.
1739  */
1740  bool get_ability_bool(const std::string& tag_name) const
1741  {
1742  return get_ability_bool(tag_name, loc_);
1743  }
1744 
1745  /** Checks whether this unit currently possesses a given ability, and that that ability is active.
1746  * @return True if the ability @a tag_name is active.
1747  * @param cfg the const config to one of abilities @a tag_name checked.
1748  * @param ability name of ability type checked.
1749  * @param loc location of the unit checked.
1750  */
1751  bool get_self_ability_bool(const config& cfg, const std::string& ability, const map_location& loc) const;
1752  /** Checks whether this unit currently possesses a given ability of leadership type
1753  * @return True if the ability @a tag_name is active.
1754  * @param special the const config to one of abilities @a tag_name checked.
1755  * @param tag_name name of ability type checked.
1756  * @param loc location of the unit checked.
1757  * @param weapon the attack used by unit checked in this function.
1758  * @param opp_weapon the attack used by opponent to unit checked.
1759  */
1760  bool get_self_ability_bool_weapon(const config& special, const std::string& tag_name, const map_location& loc, const_attack_ptr weapon = nullptr, const_attack_ptr opp_weapon = nullptr) const;
1761  /** Checks whether this unit is affected by a given ability, and that that ability is active.
1762  * @return True if the ability @a tag_name is active.
1763  * @param cfg the const config to one of abilities @a ability checked.
1764  * @param ability name of ability type checked.
1765  * @param loc location of the unit checked.
1766  * @param from unit adjacent to @a this is checked in case of [affect_adjacent] abilities.
1767  * @param dir direction to research a unit adjacent to @a this.
1768  */
1769  bool get_adj_ability_bool(const config& cfg, const std::string& ability, int dir, const map_location& loc, const unit& from) const;
1770  /** Checks whether this unit is affected by a given ability of leadership type
1771  * @return True if the ability @a tag_name is active.
1772  * @param special the const config to one of abilities @a tag_name checked.
1773  * @param tag_name name of ability type checked.
1774  * @param loc location of the unit checked.
1775  * @param from unit adjacent to @a this is checked in case of [affect_adjacent] abilities.
1776  * @param dir direction to research a unit adjacent to @a this.
1777  * @param weapon the attack used by unit checked in this function.
1778  * @param opp_weapon the attack used by opponent to unit checked.
1779  */
1780  bool get_adj_ability_bool_weapon(const config& special, const std::string& tag_name, int dir, const map_location& loc, const unit& from, const_attack_ptr weapon=nullptr, const_attack_ptr opp_weapon = nullptr) const;
1781 
1782  /**
1783  * Gets the unit's active abilities of a particular type if it were on a specified location.
1784  * @param tag_name The type of ability to check for
1785  * @param loc The location to use for resolving abilities
1786  * @return A list of active abilities, paired with the location they are active on
1787  */
1788  unit_ability_list get_abilities(const std::string& tag_name, const map_location& loc) const;
1789 
1790  /**
1791  * Gets the unit's active abilities of a particular type.
1792  * @param tag_name The type of ability to check for
1793  * @return A list of active abilities, paired with the location they are active on
1794  */
1795  unit_ability_list get_abilities(const std::string& tag_name) const
1796  {
1797  return get_abilities(tag_name, loc_);
1798  }
1799 
1800  unit_ability_list get_abilities_weapons(const std::string& tag_name, const map_location& loc, const_attack_ptr weapon = nullptr, const_attack_ptr opp_weapon = nullptr) const;
1801 
1802  unit_ability_list get_abilities_weapons(const std::string& tag_name, const_attack_ptr weapon = nullptr, const_attack_ptr opp_weapon = nullptr) const
1803  {
1804  return get_abilities_weapons(tag_name, loc_, weapon, opp_weapon);
1805  }
1806 
1807  const config &abilities() const { return abilities_; }
1808 
1809  const std::set<std::string>& checking_tags() const { return checking_tags_; };
1810 
1811  /**
1812  * Gets the names and descriptions of this unit's abilities. Location-independent variant
1813  * with all abilities shown as active.
1814  *
1815  * @returns A list of quadruples consisting of (in order) id, base name,
1816  * male or female name as appropriate for the unit, and description.
1817  */
1818  std::vector<std::tuple<std::string, t_string, t_string, t_string>>
1819  ability_tooltips() const;
1820 
1821  /**
1822  * Gets the names and descriptions of this unit's abilities.
1823  *
1824  * @param active_list This vector will be the same length as the returned one and will
1825  * indicate whether or not the corresponding ability is active.
1826  *
1827  * @param loc The location on which to resolve the ability.
1828  *
1829  * @returns A list of quadruples consisting of (in order) id, base name,
1830  * male or female name as appropriate for the unit, and description.
1831  */
1832  std::vector<std::tuple<std::string, t_string, t_string, t_string>>
1833  ability_tooltips(boost::dynamic_bitset<>& active_list, const map_location& loc) const;
1834 
1835  /** Get a list of all abilities by ID. */
1836  std::vector<std::string> get_ability_list() const;
1837 
1838  /**
1839  * Check if the unit has an ability of a specific type.
1840  * @param ability The type of ability (tag name) to check for.
1841  * @returns true if the ability is present
1842  */
1843  bool has_ability_type(const std::string& ability) const;
1844 
1845  /**
1846  * Check if the unit has an ability of a specific ID.
1847  * @param ability The ID of ability to check for.
1848  * @returns true if the ability is present
1849  */
1850  bool has_ability_by_id(const std::string& ability) const;
1851 
1852  /**
1853  * Removes a unit's abilities with a specific ID.
1854  * @param ability The type of ability (tag name) to remove.
1855  */
1856  void remove_ability_by_id(const std::string& ability);
1857 
1858  /**
1859  * Removes a unit's abilities with a specific ID or other attribute.
1860  * @param filter the config of ability to remove.
1861  */
1862  void remove_ability_by_attribute(const config& filter);
1863 
1864  /**
1865  * Verify what abilities attributes match with filter.
1866  * @param cfg the config of ability to check.
1867  * @param tag_name the tag name of ability to check.
1868  * @param filter the filter used for checking.
1869  */
1870  bool ability_matches_filter(const config & cfg, const std::string& tag_name, const config & filter) const;
1871 
1872 
1873 private:
1874 
1875  /**
1876  * Helper similar to std::unique_lock for detecting when calculations such as abilities
1877  * have entered infinite recursion.
1878  *
1879  * This assumes that there's only a single thread accessing the unit, it's a lightweight
1880  * increment/decrement counter rather than a mutex.
1881  */
1883  friend class unit;
1884  /**
1885  * Only expected to be called in update_variables_recursion(), which handles some of the checks.
1886  */
1887  explicit recursion_guard(const unit& u, const config& ability);
1888  public:
1889  /**
1890  * Construct an empty instance, only useful for extending the lifetime of a
1891  * recursion_guard returned from unit.update_variables_recursion() by
1892  * std::moving it to an instance declared in a larger scope.
1893  */
1894  explicit recursion_guard();
1895 
1896  /**
1897  * Returns true if a level of recursion was available at the time when update_variables_recursion()
1898  * created this object.
1899  */
1900  operator bool() const;
1901 
1903  recursion_guard(const recursion_guard& other) = delete;
1906  ~recursion_guard();
1907  private:
1908  std::shared_ptr<const unit> parent;
1909  };
1910 
1911  recursion_guard update_variables_recursion(const config& ability) const;
1912 
1913  const std::set<std::string> checking_tags_{"disable", "attacks", "damage", "chance_to_hit", "berserk", "swarm", "drains", "heal_on_hit", "plague", "slow", "petrifies", "firststrike", "poison", "damage_type"};
1914  /**
1915  * Check if an ability is active. Includes checks to prevent excessive recursion.
1916  * @param ability The type (tag name) of the ability
1917  * @param cfg an ability WML structure
1918  * @param loc The location on which to resolve the ability
1919  * @returns true if it is active
1920  */
1921  bool ability_active(const std::string& ability, const config& cfg, const map_location& loc) const;
1922  /**
1923  * Check if an ability is active. The caller is responsible for preventing excessive recursion, so must hold a recursion_guard.
1924  * @param ability The type (tag name) of the ability
1925  * @param cfg an ability WML structure
1926  * @param loc The location on which to resolve the ability
1927  * @returns true if it is active
1928  */
1929  bool ability_active_impl(const std::string& ability, const config& cfg, const map_location& loc) const;
1930 
1931  /**
1932  * Check if an ability affects adjacent units.
1933  * @param ability The type (tag name) of the ability
1934  * @param cfg an ability WML structure
1935  * @param loc The location on which to resolve the ability
1936  * @param from The "other unit" for filter matching
1937  * @param dir The direction the unit is facing
1938  */
1939  bool ability_affects_adjacent(const std::string& ability, const config& cfg, int dir, const map_location& loc, const unit& from) const;
1940 
1941  /**
1942  * Check if an ability affects the owning unit.
1943  * @param ability The type (tag name) of the ability
1944  * @param cfg an ability WML structure
1945  * @param loc The location on which to resolve the ability
1946  */
1947  bool ability_affects_self(const std::string& ability, const config& cfg, const map_location& loc) const;
1948 
1949  /**
1950  * filters the weapons that condition the use of abilities for combat ([resistance],[leadership] or abilities used like specials
1951  * (deprecated in two last cases)
1952  */
1953  bool ability_affects_weapon(const config& cfg, const_attack_ptr weapon, bool is_opp) const;
1954 
1955 public:
1956  /** Get the unit formula manager. */
1958  {
1959  return *formula_man_;
1960  }
1961 
1962  /** Generates a random race-appropriate name if one has not already been provided. */
1963  void generate_name();
1964 
1965  // Only see_all = true use caching
1966  bool invisible(const map_location& loc, bool see_all = true) const;
1967 
1968  bool is_visible_to_team(const team& team, bool const see_all = true) const;
1969  /** Return true if the unit would be visible to team if its location were loc. */
1970  bool is_visible_to_team(const map_location& loc, const team& team, bool const see_all = true) const;
1971 
1972  /**
1973  * Serializes the current unit metadata values.
1974  *
1975  * @param cfg The config to write to.
1976  * @param write_all set this to false to not write unchanged attributes.
1977  */
1978  void write(config& cfg, bool write_all = true) const;
1979 
1980  /**
1981  * Mark this unit as clone so it can be inserted to unit_map.
1982  *
1983  * @returns self (for convenience)
1984  */
1985  unit& mark_clone(bool is_temporary);
1986 
1987 
1988  void set_appearance_changed(bool value) { appearance_changed_ = value; }
1989  bool appearance_changed() const { return appearance_changed_; }
1990 
1991 protected:
1992 
1993 private:
1995 
1996  std::vector<std::string> advances_to_;
1997 
1998  /** Never nullptr. Adjusted for gender and variation. */
2000 
2001  /** The displayed name of this unit type. */
2003 
2004  /** Never nullptr, but may point to the null race. */
2006 
2007  std::string id_;
2010 
2011  std::string undead_variation_;
2012  std::string variation_;
2013 
2018 
2019  int level_;
2020 
2023  std::vector<std::string> recruit_list_;
2025 
2026  std::string flag_rgb_;
2027  std::string image_mods_;
2028 
2030 
2031  int side_;
2032 
2034 
2035  std::unique_ptr<unit_formula_manager> formula_man_;
2036 
2039  int vision_;
2041 
2043 
2046  bool resting_;
2047 
2050 
2051  std::set<std::string> states_;
2052 
2053  static const std::size_t num_bool_states = state_t::NUMBER_OF_STATES;
2054 
2055  std::bitset<num_bool_states> known_boolean_states_;
2056  static std::map<std::string, state_t> known_boolean_state_names_;
2057 
2061 
2063 
2064  std::vector<std::string> overlays_;
2065 
2066  std::string role_;
2068  /**
2069  * While processing a recursive match, all the filters that are currently being checked, oldest first.
2070  * Each will have an instance of recursion_guard that is currently allocated permission to recurse, and
2071  * which will pop the config off this stack when the recursion_guard is finalized.
2072  */
2073  mutable std::vector<const config*> open_queries_;
2074 
2075 protected:
2076  // TODO: I think we actually consider this to be part of the gamestate, so it might be better if it's not mutable,
2077  // but it's not easy to separate this guy from the animation code right now.
2079 
2080 private:
2081  std::vector<t_string> trait_names_;
2082  std::vector<t_string> trait_descriptions_;
2083  std::vector<std::string> trait_nonhidden_ids_;
2084 
2087 
2089 
2091 
2092  // Animations:
2094 
2095  std::unique_ptr<unit_animation_component> anim_comp_;
2096 
2097  mutable bool hidden_;
2099 
2102 
2103  std::vector<config> advancements_;
2104 
2106  std::vector<t_string> special_notes_;
2107 
2108  utils::optional<std::string> usage_;
2109  utils::optional<std::string> halo_;
2110  utils::optional<std::string> ellipse_;
2111 
2114 
2116 
2117  std::string profile_;
2118  std::string small_profile_;
2119 
2120  //Used to check whether the moving units during a move needs to be updated
2121  mutable bool appearance_changed_ = true;
2122  std::bitset<UA_COUNT> changed_attributes_;
2123 
2126 
2127  /**
2128  * Hold the visibility status cache for a unit, when not uncovered.
2129  * This is mutable since it is a cache.
2130  */
2131  mutable std::map<map_location, bool> invisibility_cache_;
2132 
2133  /**
2134  * Clears the cache.
2135  *
2136  * Since we don't change the state of the object we're marked const (also
2137  * required since the objects in the cache need to be marked const).
2138  */
2140  {
2141  invisibility_cache_.clear();
2142  }
2143 };
2144 
2145 /**
2146  * Object which temporarily resets a unit's movement.
2147  *
2148  * @warning A unit whose movement is reset may not be deleted while held in a
2149  * @ref unit_movement_resetter object, so it's best to use thus only in a small scope.
2150  */
2152 {
2155 
2156  unit_movement_resetter(const unit& u, bool operate = true);
2158 
2159 private:
2161  int moves_;
2162 };
2163 
2165 {
2166 /**
2167  * Optional parameter for get_checksum to use the algorithm of an older version of Wesnoth,
2168  * thus preventing spurious OOS warnings while watching old replays.
2169  */
2171  current,
2172  version_1_16_or_older /**< Included some of the flavortext from weapon specials. */
2173 };
2174 
2175 } // namespace backwards_compatibility
2176 
2177 /**
2178  * Gets a checksum for a unit.
2179  *
2180  * In MP games the descriptions are locally generated and might differ, so it
2181  * should be possible to discard them. Not sure whether replays suffer the
2182  * same problem.
2183  *
2184  * @param u this unit
2185  * @param version allows the checksum expected in older replays to be used
2186  *
2187  * @returns the checksum for a unit
2188  */
2189 std::string get_checksum(const unit& u,
double t
Definition: astarsearch.cpp:63
boost::iterator_range< boost::indirect_iterator< attack_list::iterator > > attack_itors
std::vector< attack_ptr > attack_list
boost::iterator_range< boost::indirect_iterator< attack_list::const_iterator > > const_attack_itors
attack_itors make_attack_itors(attack_list &atks)
const std::string & type() const
Definition: attack_type.hpp:44
Variant for storing WML attributes.
A config object defines a single node in a WML file, with access to child nodes.
Definition: config.hpp:172
The basic "size" of the unit - flying, small land, large land, etc.
Definition: movetype.hpp:44
int jamming_cost(const t_translation::terrain_code &terrain, bool slowed=false) const
Returns the cost to "jam" through the indicated terrain.
Definition: movetype.hpp:284
int vision_cost(const t_translation::terrain_code &terrain, bool slowed=false) const
Returns the cost to see through the indicated terrain.
Definition: movetype.hpp:281
int movement_cost(const t_translation::terrain_code &terrain, bool slowed=false) const
Returns the cost to move through the indicated terrain.
Definition: movetype.hpp:278
utils::string_map_res damage_table() const
Returns a map from damage types to resistances.
Definition: movetype.hpp:295
bool is_flying() const
Returns whether or not *this is flagged as a flying movement type.
Definition: movetype.hpp:273
This class stores all the data for a single 'side' (in game nomenclature).
Definition: team.hpp:75
Helper similar to std::unique_lock for detecting when calculations such as abilities have entered inf...
Definition: unit.hpp:1882
Visitor helper class to parse the upkeep value from a config.
Definition: unit.hpp:1239
Visitor helper class to fetch the appropriate upkeep value.
Definition: unit.hpp:1189
void append(const unit_ability_list &other)
Appends the abilities from other to this, ignores other.loc()
Definition: unit.hpp:106
iterator erase(const iterator &erase_it)
Definition: unit.hpp:97
unit_ability & back()
Definition: unit.hpp:93
iterator erase(const iterator &first, const iterator &last)
Definition: unit.hpp:98
std::pair< int, map_location > lowest(const std::string &key, int def=0) const
Definition: unit.hpp:72
const_iterator begin() const
Definition: unit.hpp:85
unit_ability & front()
Definition: unit.hpp:91
std::vector< unit_ability > cfgs_
Definition: unit.hpp:125
const unit_ability & back() const
Definition: unit.hpp:94
const unit_ability & front() const
Definition: unit.hpp:92
std::vector< unit_ability >::const_iterator const_iterator
Definition: unit.hpp:82
iterator begin()
Definition: unit.hpp:84
iterator end()
Definition: unit.hpp:86
const map_location & loc() const
Definition: unit.hpp:103
std::vector< unit_ability >::iterator iterator
Definition: unit.hpp:81
void emplace_back(T &&... args)
Definition: unit.hpp:101
std::pair< int, map_location > highest(const std::string &key, int def=0) const
Definition: unit.hpp:68
const_iterator end() const
Definition: unit.hpp:87
std::size_t size()
Definition: unit.hpp:95
bool empty() const
Definition: unit.hpp:90
unit_ability_list(const map_location &loc=map_location())
Definition: unit.hpp:65
map_location loc_
Definition: unit.hpp:126
void append_if(const unit_ability_list &other, const Predicate &predicate)
Appends any abilities from other for which the given condition returns true to this,...
Definition: unit.hpp:118
std::pair< int, map_location > get_extremum(const std::string &key, int def, const TComp &comp) const
Definition: abilities.cpp:687
@ NUM_GENDERS
Definition: race.hpp:28
A single unit type that the player may recruit.
Definition: types.hpp:43
This class represents a single unit of a specific type.
Definition: unit.hpp:133
unit_ptr clone() const
Definition: unit.hpp:221
unit & operator=(const unit &)=delete
UNIT_ATTRIBUTE
Definition: unit.hpp:161
static void clear_status_caches()
Clear this unit status cache for all units.
Definition: unit.cpp:740
void set_attr_changed(UNIT_ATTRIBUTE attr)
Definition: unit.hpp:185
virtual ~unit()
Definition: unit.cpp:774
bool get_attr_changed(UNIT_ATTRIBUTE attr) const
Definition: unit.hpp:192
void clear_changed_attributes()
Definition: unit.cpp:2815
void init(const config &cfg, bool use_traits=false, const vconfig *vcfg=nullptr)
Definition: unit.cpp:406
static unit_ptr create(const config &cfg, bool use_traits=false, const vconfig *vcfg=nullptr)
Initializes a unit from a config.
Definition: unit.hpp:201
static const std::string & leader_crown()
The path to the leader crown overlay.
Definition: unit.cpp:1140
bool get_attacks_changed() const
Definition: unit.cpp:1505
unit()=delete
static unit_ptr create(const unit_type &t, int side, bool real_unit, unit_race::GENDER gender=unit_race::NUM_GENDERS, const std::string &variation="")
Initializes a unit from a unit type.
Definition: unit.hpp:213
A variable-expanding proxy for the config class.
Definition: variable.hpp:45
int hit_points_
Definition: unit.hpp:2014
unit_ability_list get_abilities(const std::string &tag_name) const
Gets the unit's active abilities of a particular type.
Definition: unit.hpp:1795
int movement_
Definition: unit.hpp:2037
void generate_name()
Generates a random race-appropriate name if one has not already been provided.
Definition: unit.cpp:792
std::vector< t_string > trait_names_
Definition: unit.hpp:2081
bool get_self_ability_bool_weapon(const config &special, const std::string &tag_name, const map_location &loc, const_attack_ptr weapon=nullptr, const_attack_ptr opp_weapon=nullptr) const
Checks whether this unit currently possesses a given ability of leadership type.
Definition: abilities.cpp:1736
int unit_value_
Definition: unit.hpp:2085
int attacks_left_
Definition: unit.hpp:2048
bool generate_name_
Definition: unit.hpp:2113
void clear_visibility_cache() const
Clears the cache.
Definition: unit.hpp:2139
bool get_adj_ability_bool_weapon(const config &special, const std::string &tag_name, int dir, const map_location &loc, const unit &from, const_attack_ptr weapon=nullptr, const_attack_ptr opp_weapon=nullptr) const
Checks whether this unit is affected by a given ability of leadership type.
Definition: abilities.cpp:1741
movetype movement_type_
Definition: unit.hpp:2042
config variables_
Definition: unit.hpp:2058
bool unrenamable_
Definition: unit.hpp:2029
int experience_
Definition: unit.hpp:2016
int vision_
Definition: unit.hpp:2039
void remove_ability_by_attribute(const config &filter)
Removes a unit's abilities with a specific ID or other attribute.
Definition: unit.cpp:1492
std::string undead_variation_
Definition: unit.hpp:2011
bool ability_active(const std::string &ability, const config &cfg, const map_location &loc) const
Check if an ability is active.
Definition: abilities.cpp:420
t_string type_name_
The displayed name of this unit type.
Definition: unit.hpp:2002
map_location interrupted_move_
Definition: unit.hpp:2086
bool ability_affects_self(const std::string &ability, const config &cfg, const map_location &loc) const
Check if an ability affects the owning unit.
Definition: abilities.cpp:529
unit_movement_resetter(const unit_movement_resetter &)=delete
bool random_traits_
Definition: unit.hpp:2112
void write(config &cfg, bool write_all=true) const
Serializes the current unit metadata values.
Definition: unit.cpp:1516
std::bitset< UA_COUNT > changed_attributes_
Definition: unit.hpp:2122
std::vector< const config * > open_queries_
While processing a recursive match, all the filters that are currently being checked,...
Definition: unit.hpp:2073
std::string small_profile_
Definition: unit.hpp:2118
void write_upkeep(config::attribute_value &upkeep) const
Definition: unit.cpp:2810
bool get_ability_bool(const std::string &tag_name, const map_location &loc) const
Checks whether this unit currently possesses or is affected by a given ability.
Definition: abilities.cpp:181
std::string id_
Definition: unit.hpp:2007
std::vector< t_string > special_notes_
Definition: unit.hpp:2106
bool canrecruit_
Definition: unit.hpp:2022
std::string image_mods_
Definition: unit.hpp:2027
double hp_bar_scaling_
Definition: unit.hpp:2098
std::string flag_rgb_
Definition: unit.hpp:2026
bool ability_affects_adjacent(const std::string &ability, const config &cfg, int dir, const map_location &loc, const unit &from) const
Check if an ability affects adjacent units.
Definition: abilities.cpp:502
static std::map< std::string, state_t > known_boolean_state_names_
Definition: unit.hpp:2056
@ UA_IS_HEALTHY
Definition: unit.hpp:166
@ UA_SMALL_PROFILE
Definition: unit.hpp:179
@ UA_MAX_MP
Definition: unit.hpp:163
@ UA_ATTACKS
Definition: unit.hpp:176
@ UA_ZOC
Definition: unit.hpp:170
@ UA_MOVEMENT_TYPE
Definition: unit.hpp:169
@ UA_PROFILE
Definition: unit.hpp:178
@ UA_LEVEL
Definition: unit.hpp:168
@ UA_MAX_XP
Definition: unit.hpp:165
@ UA_IS_FEARLESS
Definition: unit.hpp:167
@ UA_ADVANCE_TO
Definition: unit.hpp:171
@ UA_MAX_AP
Definition: unit.hpp:164
@ UA_COUNT
Definition: unit.hpp:182
@ UA_ADVANCEMENTS
Definition: unit.hpp:172
@ UA_MAX_HP
Definition: unit.hpp:162
@ UA_ABILITIES
Definition: unit.hpp:180
@ UA_UNDEAD_VARIATION
Definition: unit.hpp:174
@ UA_UPKEEP
Definition: unit.hpp:181
@ UA_NOTES
Definition: unit.hpp:177
@ UA_ALIGNMENT
Definition: unit.hpp:173
void set_appearance_changed(bool value)
Definition: unit.hpp:1988
std::vector< std::tuple< std::string, t_string, t_string, t_string > > ability_tooltips() const
Gets the names and descriptions of this unit's abilities.
Definition: abilities.cpp:319
config events_
Definition: unit.hpp:2059
bool hidden_
Definition: unit.hpp:2097
bool is_healthy_
Definition: unit.hpp:2088
bool is_fearless_
Definition: unit.hpp:2088
config abilities_
Definition: unit.hpp:2101
utils::optional< std::string > ellipse_
Definition: unit.hpp:2110
unit_ability_list get_abilities_weapons(const std::string &tag_name, const map_location &loc, const_attack_ptr weapon=nullptr, const_attack_ptr opp_weapon=nullptr) const
Definition: abilities.cpp:253
const unit_type * type_
Never nullptr.
Definition: unit.hpp:1999
std::bitset< num_bool_states > known_boolean_states_
Definition: unit.hpp:2055
utils::optional< std::string > halo_
Definition: unit.hpp:2109
map_location::direction facing_
Definition: unit.hpp:2078
int side_
Definition: unit.hpp:2031
std::shared_ptr< const unit > parent
Definition: unit.hpp:1908
const unit_race * race_
Never nullptr, but may point to the null race.
Definition: unit.hpp:2005
bool appearance_changed_
Definition: unit.hpp:2121
int operator()(const upkeep_loyal &) const
Loyal units cost no upkeep.
Definition: unit.hpp:1200
double xp_bar_scaling_
Definition: unit.hpp:2098
bool appearance_changed() const
Definition: unit.hpp:1989
unit_alignments::type alignment_
Definition: unit.hpp:2024
bool get_ability_bool(const std::string &tag_name) const
Checks whether this unit currently possesses or is affected by a given ability.
Definition: unit.hpp:1740
bool ability_affects_weapon(const config &cfg, const_attack_ptr weapon, bool is_opp) const
filters the weapons that condition the use of abilities for combat ([resistance],[leadership] or abil...
Definition: abilities.cpp:537
bool invisible(const map_location &loc, bool see_all=true) const
Definition: unit.cpp:2579
bool is_visible_to_team(const team &team, bool const see_all=true) const
Definition: unit.cpp:2622
std::enable_if_t<!std::is_same_v< int, T >, std::string > operator()(T &) const
Definition: unit.hpp:1222
n_unit::unit_id underlying_id_
Definition: unit.hpp:2009
std::string variation_
Definition: unit.hpp:2012
unit & mark_clone(bool is_temporary)
Mark this unit as clone so it can be inserted to unit_map.
Definition: unit.cpp:2680
bool has_ability_type(const std::string &ability) const
Check if the unit has an ability of a specific type.
Definition: abilities.cpp:556
std::enable_if_t< std::is_convertible_v< B, bool > &&!std::is_arithmetic_v< B >, upkeep_t > operator()(B b) const
Definition: unit.hpp:1252
static const std::size_t num_bool_states
Definition: unit.hpp:2053
config filter_recall_
Definition: unit.hpp:2060
int max_experience_
Definition: unit.hpp:2017
unit_ability_list get_abilities(const std::string &tag_name, const map_location &loc) const
Gets the unit's active abilities of a particular type if it were on a specified location.
Definition: abilities.cpp:216
unit_race::GENDER gender_
Definition: unit.hpp:2033
int operator()(int v) const
Definition: unit.hpp:1205
t_string description_
Definition: unit.hpp:2105
int level_
Definition: unit.hpp:2019
std::string role_
Definition: unit.hpp:2066
std::map< map_location, bool > invisibility_cache_
Hold the visibility status cache for a unit, when not uncovered.
Definition: unit.hpp:2131
recursion_guard()
Construct an empty instance, only useful for extending the lifetime of a recursion_guard returned fro...
upkeep_t operator()(const std::string &s) const
Definition: unit.hpp:1262
bool end_turn_
Definition: unit.hpp:2045
std::vector< std::string > advances_to_
Definition: unit.hpp:1996
std::unique_ptr< unit_animation_component > anim_comp_
Definition: unit.hpp:2095
std::enable_if_t< std::is_arithmetic_v< N >, upkeep_t > operator()(N n) const
Definition: unit.hpp:1243
bool get_self_ability_bool(const config &cfg, const std::string &ability, const map_location &loc) const
Checks whether this unit currently possesses a given ability, and that that ability is active.
Definition: abilities.cpp:1715
int recall_cost_
Definition: unit.hpp:2021
static std::string type()
Definition: unit.hpp:1179
const std::set< std::string > checking_tags_
Definition: unit.hpp:1913
attack_list attacks_
Definition: unit.hpp:2067
std::vector< std::string > get_ability_list() const
Get a list of all abilities by ID.
Definition: abilities.cpp:262
bool ability_active_impl(const std::string &ability, const config &cfg, const map_location &loc) const
Check if an ability is active.
Definition: abilities.cpp:430
recursion_guard & operator=(const recursion_guard &)=delete
unit_ability_list get_abilities_weapons(const std::string &tag_name, const_attack_ptr weapon=nullptr, const_attack_ptr opp_weapon=nullptr) const
Definition: unit.hpp:1802
void remove_ability_by_id(const std::string &ability)
Removes a unit's abilities with a specific ID.
Definition: unit.cpp:1479
utils::optional< std::string > usage_
Definition: unit.hpp:2108
map_location loc_
Definition: unit.hpp:1994
static std::string type()
Definition: unit.hpp:1174
std::vector< std::string > overlays_
Definition: unit.hpp:2064
unit_formula_manager & formula_manager() const
Get the unit formula manager.
Definition: unit.hpp:1957
config modifications_
Definition: unit.hpp:2100
recursion_guard update_variables_recursion(const config &ability) const
Definition: abilities.cpp:379
bool has_ability_by_id(const std::string &ability) const
Check if the unit has an ability of a specific ID.
Definition: unit.cpp:1468
bool hold_position_
Definition: unit.hpp:2044
const config & abilities() const
Definition: unit.hpp:1807
upkeep_value_visitor(const unit &unit)
Definition: unit.hpp:1191
std::string operator()(int v) const
Definition: unit.hpp:1228
void parse_upkeep(const config::attribute_value &upkeep)
Definition: unit.cpp:2796
recursion_guard & operator=(recursion_guard &&)
Definition: abilities.cpp:404
std::vector< std::string > recruit_list_
Definition: unit.hpp:2023
const std::set< std::string > & checking_tags() const
Definition: unit.hpp:1809
recursion_guard(const recursion_guard &other)=delete
std::vector< config > advancements_
Definition: unit.hpp:2103
utils::string_map modification_descriptions_
Definition: unit.hpp:2090
upkeep_t operator()(utils::monostate) const
Definition: unit.hpp:1257
unit_checksum_version
Optional parameter for get_checksum to use the algorithm of an older version of Wesnoth,...
Definition: unit.hpp:2170
std::vector< std::string > trait_nonhidden_ids_
Definition: unit.hpp:2083
bool get_adj_ability_bool(const config &cfg, const std::string &ability, int dir, const map_location &loc, const unit &from) const
Checks whether this unit is affected by a given ability, and that that ability is active.
Definition: abilities.cpp:1725
upkeep_t upkeep_
Definition: unit.hpp:2115
int operator()(const upkeep_full &) const
Full upkeep equals the unit's level.
Definition: unit.hpp:1194
std::set< std::string > states_
Definition: unit.hpp:2051
std::string profile_
Definition: unit.hpp:2117
int jamming_
Definition: unit.hpp:2040
map_location goto_
Definition: unit.hpp:2086
t_string name_
Definition: unit.hpp:2008
int max_attacks_
Definition: unit.hpp:2049
bool ability_matches_filter(const config &cfg, const std::string &tag_name, const config &filter) const
Verify what abilities attributes match with filter.
Definition: abilities.cpp:2094
int max_hit_points_
Definition: unit.hpp:2015
std::unique_ptr< unit_formula_manager > formula_man_
Definition: unit.hpp:2035
int max_movement_
Definition: unit.hpp:2038
bool resting_
Definition: unit.hpp:2046
std::vector< t_string > trait_descriptions_
Definition: unit.hpp:2082
bool emit_zoc_
Definition: unit.hpp:2062
unit_movement_resetter & operator=(const unit_movement_resetter &)=delete
@ version_1_16_or_older
Included some of the flavortext from weapon specials.
void set_big_profile(const std::string &value)
Definition: unit.cpp:1937
int max_hitpoints() const
The max number of hitpoints this unit can have.
Definition: unit.hpp:505
void heal(int amount)
Heal the unit.
Definition: unit.cpp:1353
bool user_end_turn() const
Check whether the user ended their turn.
Definition: unit.hpp:792
void set_role(const std::string &role)
Sets a unit's role.
Definition: unit.hpp:675
unit_alignments::type alignment() const
The alignment of this unit.
Definition: unit.hpp:475
void toggle_user_end_turn()
Toggle whether the user ended their turn.
Definition: unit.hpp:780
bool incapacitated() const
Check if the unit has been petrified.
Definition: unit.hpp:911
void set_state(const std::string &state, bool value)
Set whether the unit is affected by a status effect.
Definition: unit.cpp:1445
int level() const
The current level of this unit.
Definition: unit.hpp:559
std::string usage() const
Gets this unit's usage.
Definition: unit.hpp:686
const std::string & get_role() const
Gets this unit's role.
Definition: unit.hpp:669
const t_string & type_name() const
Gets the translatable name of this unit's type.
Definition: unit.hpp:369
void new_turn()
Refresh unit for the beginning of a turn.
Definition: unit.cpp:1314
const std::vector< std::string > & recruits() const
The type IDs of the other units this unit may recruit, if possible.
Definition: unit.hpp:624
void set_max_experience(int value)
Definition: unit.hpp:534
void set_max_hitpoints(int value)
Definition: unit.hpp:510
void set_hitpoints(int hp)
Sets the current hitpoint amount.
Definition: unit.hpp:517
bool unrenamable() const
Whether this unit can be renamed.
Definition: unit.hpp:436
const config & recall_filter() const
Gets the filter constraints upon which units this unit may recall, if able.
Definition: unit.hpp:652
int recall_cost() const
How much gold it costs to recall this unit, or -1 if the side's default recall cost is used.
Definition: unit.hpp:640
std::string big_profile() const
An optional profile image displays when this unit is 'speaking' via [message].
Definition: unit.cpp:1118
static state_t get_known_boolean_state_id(const std::string &state)
Convert a string status effect ID to a built-in status effect ID.
Definition: unit.cpp:1414
void set_level(int level)
Sets the current level of this unit.
Definition: unit.hpp:565
void rename(const std::string &name)
Attempts to rename this unit's translatable display name, taking the 'unrenamable' flag into account.
Definition: unit.hpp:424
void set_hidden(bool state) const
Sets whether the unit is hidden on the map.
Definition: unit.cpp:2776
void set_recall_filter(const config &filter)
Sets the filter constraints upon which units this unit may recall, if able.
Definition: unit.hpp:658
const std::string & variation() const
The ID of the variation of this unit's type.
Definition: unit.hpp:572
int hitpoints() const
The current number of hitpoints this unit has.
Definition: unit.hpp:499
int cost() const
How much gold is required to recruit this unit.
Definition: unit.hpp:633
bool hold_position() const
Whether the unit has been instructed to hold its position.
Definition: unit.hpp:751
static std::string get_known_boolean_state_name(state_t state)
Convert a built-in status effect ID to a string status effect ID.
Definition: unit.cpp:1424
bool slowed() const
Check if the unit has been slowed.
Definition: unit.hpp:920
bool get_state(const std::string &state) const
Check if the unit is affected by a status effect.
Definition: unit.cpp:1386
unsigned int experience_overflow() const
The number of experience points over max this unit has, or 0 if current XP < max XP.
Definition: unit.hpp:547
std::string small_profile() const
An optional profile image to display in Help.
Definition: unit.cpp:1127
void heal_fully()
Fully heal the unit, restoring it to max hitpoints.
Definition: unit.hpp:831
void set_undead_variation(const std::string &value)
The ID of the undead variation (ie, dwarf, swimmer) of this unit.
Definition: unit.hpp:578
void toggle_hold_position()
Toggle the unit's hold position status.
Definition: unit.hpp:759
const std::string & type_id() const
The id of this unit's type.
Definition: unit.cpp:1932
void set_alignment(unit_alignments::type alignment)
Sets the alignment of this unit.
Definition: unit.hpp:481
bool get_hidden() const
Gets whether this unit is currently hidden on the map.
Definition: unit.hpp:720
void set_name(const t_string &name)
Sets this unit's translatable display name.
Definition: unit.hpp:413
void set_can_recruit(bool canrecruit)
Sets whether this unit can recruit other units.
Definition: unit.hpp:618
const std::set< std::string > get_states() const
Get the status effects currently affecting the unit.
Definition: unit.cpp:1369
void set_side(unsigned int new_side)
Sets the side this unit belongs to.
Definition: unit.hpp:349
void new_scenario()
Refresh unit for the beginning of a new scenario.
Definition: unit.cpp:1338
void end_turn()
Refresh unit for the end of a turn.
Definition: unit.cpp:1324
bool take_hit(int damage)
Damage the unit.
Definition: unit.hpp:816
const config & variables() const
Const overload of variables.
Definition: unit.hpp:709
const std::string & undead_variation() const
Definition: unit.hpp:583
const unit_race * race() const
Gets this unit's race.
Definition: unit.hpp:493
const unit_type & type() const
This unit's type, accounting for gender and variation.
Definition: unit.hpp:355
int experience() const
The current number of experience points this unit has.
Definition: unit.hpp:523
bool can_recruit() const
Whether this unit can recruit other units - ie, are they a leader unit.
Definition: unit.hpp:612
void set_experience(int xp)
Sets the current experience point amount.
Definition: unit.hpp:553
void set_user_end_turn(bool value=true)
Set whether the user ended their turn.
Definition: unit.hpp:771
const std::string & id() const
Gets this unit's id.
Definition: unit.hpp:380
void set_underlying_id(n_unit::id_manager &id_manager)
Sets the internal ID.
Definition: unit.cpp:2663
int side() const
The side this unit belongs to.
Definition: unit.hpp:343
bool poisoned() const
Check if the unit has been poisoned.
Definition: unit.hpp:902
unsigned int experience_to_advance() const
The number of experience points this unit needs to level up, or 0 if current XP > max XP.
Definition: unit.hpp:541
state_t
Built-in status effects known to the engine.
Definition: unit.hpp:859
double xp_bar_scaling() const
The factor by which the XP bar should be scaled.
Definition: unit.hpp:741
void set_unit_description(const t_string &new_desc)
A detailed description of this unit.
Definition: unit.hpp:456
void set_unrenamable(bool unrenamable)
Sets the 'unrenamable' flag.
Definition: unit.hpp:444
void set_recruits(const std::vector< std::string > &recruits)
Sets the recruit list.
Definition: unit.cpp:1227
std::vector< t_string > unit_special_notes() const
The unit's special notes.
Definition: unit.cpp:2823
void set_id(const std::string &id)
Sets this unit's string ID.
Definition: unit.hpp:386
config & variables()
Gets any user-defined variables this unit 'owns'.
Definition: unit.hpp:703
void set_recall_cost(int recall_cost)
Sets the cost of recalling this unit.
Definition: unit.hpp:646
std::size_t underlying_id() const
This unit's unique internal ID.
Definition: unit.hpp:392
double hp_bar_scaling() const
The factor by which the HP bar should be scaled.
Definition: unit.hpp:732
void set_usage(const std::string &usage)
Sets this unit's usage.
Definition: unit.hpp:692
int max_experience() const
The max number of experience points this unit can have.
Definition: unit.hpp:529
void set_small_profile(const std::string &value)
Definition: unit.hpp:596
unit_race::GENDER gender() const
The gender of this unit.
Definition: unit.hpp:465
const t_string & name() const
Gets this unit's translatable display name.
Definition: unit.hpp:403
t_string unit_description() const
A detailed description of this unit.
Definition: unit.hpp:450
@ STATE_SLOWED
Definition: unit.hpp:860
@ STATE_UNKNOWN
To set the size of known_boolean_states_.
Definition: unit.hpp:869
@ STATE_NOT_MOVED
The unit is uncovered - it was hiding but has been spotted.
Definition: unit.hpp:864
@ STATE_GUARDIAN
The unit cannot be healed.
Definition: unit.hpp:866
@ STATE_INVULNERABLE
The unit is a guardian - it won't move unless a target is sighted.
Definition: unit.hpp:867
@ STATE_PETRIFIED
The unit is poisoned - it loses health each turn.
Definition: unit.hpp:862
@ NUMBER_OF_STATES
The unit is invulnerable - it cannot be hit by any attack.
Definition: unit.hpp:868
@ STATE_UNHEALABLE
The unit has not moved.
Definition: unit.hpp:865
@ STATE_POISONED
The unit is slowed - it moves slower and does less damage.
Definition: unit.hpp:861
@ STATE_UNCOVERED
The unit is petrified - it cannot move or be attacked.
Definition: unit.hpp:863
std::vector< std::string > advances_to_t
Definition: unit.hpp:238
std::vector< config > get_modification_advances() const
Gets any non-typed advanced options set by modifications.
Definition: unit.cpp:1861
std::vector< std::pair< std::string, std::string > > amla_icons() const
Gets the image and description data for modification advancements.
Definition: unit.cpp:1844
const advances_to_t & advances_to() const
Gets the possible types this unit can advance to on level-up.
Definition: unit.hpp:244
bool can_advance() const
Checks whether this unit has any options to advance to.
Definition: unit.hpp:272
bool advances() const
Checks whether this unit is eligible for level-up.
Definition: unit.hpp:283
void set_advancements(std::vector< config > advancements)
Sets the raw modification advancement option data.
Definition: unit.cpp:1926
void set_advances_to(const std::vector< std::string > &advances_to)
Sets this unit's advancement options.
Definition: unit.cpp:1248
const std::vector< config > & modification_advancements() const
The raw, unparsed data for modification advancements.
Definition: unit.hpp:323
std::map< std::string, std::string > advancement_icons() const
Gets and image path and and associated description for each advancement option.
Definition: unit.cpp:1804
const std::vector< std::string > advances_to_translated() const
Gets the names of the possible types this unit can advance to on level-up.
Definition: unit.cpp:1233
void advance_to(const unit_type &t, bool use_traits=false)
Advances this unit to another type.
Definition: unit.cpp:969
void remove_attacks_ai()
Set the unit to have no attacks left for this turn.
Definition: unit.cpp:2758
attack_ptr add_attack(attack_itors::iterator position, Args &&... args)
Adds a new attack to the unit.
Definition: unit.hpp:950
int resistance_against(const attack_type &atk, bool attacker, const map_location &loc, const_attack_ptr weapon=nullptr) const
The unit's resistance against a given attack.
Definition: unit.hpp:1058
void set_max_attacks(int value)
Definition: unit.hpp:989
int attacks_left(bool base_value) const
Gets the remaining number of attacks this unit can perform this turn.
Definition: unit.hpp:1012
int damage_from(const attack_type &attack, bool attacker, const map_location &loc, const_attack_ptr weapon=nullptr) const
Calculates the damage this unit would take from a certain attack.
Definition: unit.hpp:978
int defense_modifier(const t_translation::terrain_code &terrain) const
The unit's defense on a given terrain.
Definition: unit.cpp:1716
bool resistance_filter_matches(const config &cfg, const std::string &damage_name, int res) const
Definition: unit.cpp:1731
bool remove_attack(attack_ptr atk)
Remove an attack from the unit.
Definition: unit.cpp:2747
attack_itors attacks()
Gets an iterator over this unit's attacks.
Definition: unit.hpp:933
utils::string_map_res get_base_resistances() const
Gets resistances without any abilities applied.
Definition: unit.hpp:1064
int max_attacks() const
The maximum number of attacks this unit may perform per turn, usually 1.
Definition: unit.hpp:984
int resistance_value(unit_ability_list resistance_list, const std::string &damage_name) const
For the provided list of resistance abilities, determine the damage resistance based on which are act...
Definition: unit.cpp:1755
int resistance_against(const std::string &damage_name, bool attacker, const map_location &loc, const_attack_ptr weapon=nullptr, const_attack_ptr opp_weapon=nullptr) const
The unit's resistance against a given damage type.
Definition: unit.cpp:1780
const_attack_itors attacks() const
Const overload of attacks.
Definition: unit.hpp:939
int attacks_left() const
Gets the remaining number of attacks this unit can perform this turn.
Definition: unit.hpp:1000
void set_attacks(int left)
Sets the number of attacks this unit has left this turn.
Definition: unit.hpp:1021
color_t xp_color() const
Color for this unit's XP.
Definition: unit.cpp:1215
unit_animation_component & anim_comp() const
Definition: unit.hpp:1614
const std::string & effect_image_mods() const
Gets any IPF image mods applied by effects.
Definition: unit.hpp:1664
std::vector< std::string > overlays_abilities() const
Get the [overlay] ability overlay images.
Definition: unit.hpp:1683
color_t hp_color() const
Color for this unit's current hitpoints.
Definition: unit.cpp:1171
std::vector< std::string > halo_abilities() const
Get the [halo] abilities halo image(s).
Definition: unit.hpp:1634
std::string TC_image_mods() const
Constructs a recolor (RC) IPF string for this unit's team color.
Definition: unit.cpp:2732
static color_t hp_color_max()
Definition: unit.cpp:1181
const std::string & flag_rgb() const
Get the source color palette to use when recoloring the unit's image.
Definition: unit.cpp:1145
std::string image_ellipse() const
Get the unit's ellipse image.
Definition: unit.hpp:1643
std::string image_mods() const
Gets an IPF string containing all IPF image mods.
Definition: unit.cpp:2737
std::string default_anim_image() const
The default image to use for animation frames with no defined image.
Definition: unit.cpp:2561
std::string image_halo() const
Get the unit's halo image.
Definition: unit.hpp:1626
const std::vector< std::string > & overlays() const
Get the unit's overlay images.
Definition: unit.hpp:1677
std::string absolute_image() const
The name of the file to game_display (used in menus).
Definition: unit.cpp:2556
void set_image_ellipse(const std::string &ellipse)
Set the unit's ellipse image.
Definition: unit.hpp:1649
std::vector< std::string > halo_or_icon_abilities(const std::string &image_type) const
Definition: abilities.cpp:571
void set_image_halo(const std::string &halo)
Set the unit's halo image.
Definition: unit.cpp:2789
std::size_t advancements_count() const
Definition: unit.hpp:1564
void apply_builtin_effect(std::string type, const config &effect)
Apply a builtin effect to the unit.
Definition: unit.cpp:2035
std::size_t traits_count() const
Definition: unit.hpp:1554
void add_modification(const std::string &type, const config &modification, bool no_add=false)
Add a new modification to the unit.
Definition: unit.cpp:2439
static const std::set< std::string > builtin_effects
Definition: unit.hpp:1587
const config & get_modifications() const
Set the raw modifications.
Definition: unit.hpp:1532
std::string describe_builtin_effect(std::string type, const config &effect)
Construct a string describing a built-in effect.
Definition: unit.cpp:1970
config & get_modifications()
Get the raw modifications.
Definition: unit.hpp:1526
void apply_modifications()
Re-apply all saved modifications.
Definition: unit.cpp:2566
void expire_modifications(const std::string &duration)
Clears those modifications whose duration has expired.
Definition: unit.cpp:1281
std::size_t objects_count() const
Definition: unit.hpp:1559
std::size_t modification_count(const std::string &type, const std::string &id) const
Count modifications of a particular type.
Definition: unit.cpp:1944
bool emits_zoc() const
Tests whether the unit has a zone-of-control, considering incapacitated.
Definition: unit.hpp:1385
bool get_emit_zoc() const
Gets the raw zone-of-control flag, disregarding incapacitated.
Definition: unit.hpp:1391
int jamming() const
Gets the unit's jamming points.
Definition: unit.hpp:1453
bool has_goto() const
Gets whether this unit has a multi-turn destination set.
Definition: unit.hpp:1429
const map_location & get_location() const
The current map location this unit is at.
Definition: unit.hpp:1404
bool has_moved() const
Checks if this unit has moved.
Definition: unit.hpp:1359
int movement_cost(const t_translation::terrain_code &terrain) const
Get the unit's movement cost on a particular terrain.
Definition: unit.hpp:1487
const movetype & movement_type() const
Get the unit's movement type.
Definition: unit.hpp:1477
void set_movement(int moves, bool unit_action=false)
Set this unit's remaining movement to moves.
Definition: unit.cpp:1255
const map_location & get_interrupted_move() const
Get the target location of the unit's interrupted move.
Definition: unit.hpp:1465
int vision_cost(const t_translation::terrain_code &terrain) const
Get the unit's vision cost on a particular terrain.
Definition: unit.hpp:1497
void set_resting(bool rest)
Sets this unit's resting status.
Definition: unit.hpp:1379
void set_facing(map_location::direction dir) const
The this unit's facing.
Definition: unit.cpp:1681
void set_total_movement(int value)
Definition: unit.hpp:1318
void set_emit_zoc(bool val)
Sets the raw zone-of-control flag.
Definition: unit.hpp:1397
void set_goto(const map_location &new_goto)
Sets this unit's long term destination.
Definition: unit.hpp:1441
int movement_left() const
Gets how far a unit can move, considering the incapacitated flag.
Definition: unit.hpp:1329
int movement_left(bool base_value) const
Gets how far a unit can move.
Definition: unit.hpp:1341
int total_movement() const
The maximum moves this unit has.
Definition: unit.hpp:1313
int jamming_cost(const t_translation::terrain_code &terrain) const
Get the unit's jamming cost on a particular terrain.
Definition: unit.hpp:1507
void set_location(const map_location &loc)
Sets this unit's map location.
Definition: unit.hpp:1414
void remove_movement_ai()
Sets the unit to have no moves left for this turn.
Definition: unit.cpp:2767
bool move_interrupted() const
Check whether the unit's move has been interrupted.
Definition: unit.hpp:1459
int vision() const
Gets the unit's vision points.
Definition: unit.hpp:1447
const map_location & get_goto() const
The map location to which this unit is moving over multiple turns, if any.
Definition: unit.hpp:1435
map_location::direction facing() const
The current direction this unit is facing within its hex.
Definition: unit.hpp:1420
bool resting() const
Checks whether this unit is 'resting'.
Definition: unit.hpp:1373
void set_interrupted_move(const map_location &interrupted_move)
Set the target location of the unit's interrupted move.
Definition: unit.hpp:1471
bool is_flying() const
Check if the unit is a flying unit.
Definition: unit.hpp:1513
std::vector< std::string > get_advancements_list() const
Definition: unit.hpp:1145
std::vector< std::string > get_objects_list() const
Definition: unit.hpp:1140
std::vector< std::string > get_modifications_list(const std::string &mod_type) const
Gets a list of the modification this unit currently has.
Definition: unit.cpp:934
int upkeep() const
Gets the amount of gold this unit costs a side per turn.
Definition: unit.cpp:1690
std::vector< std::string > trait_nonhidden_ids() const
Gets the ids of the traits corresponding to those returned by trait_names() and trait_descriptions().
Definition: unit.hpp:1119
void add_trait_description(const config &trait, const t_string &description)
Register a trait's name and its description for the UI's use.
Definition: unit.cpp:2542
bool is_healthy() const
Gets whether this unit is healthy - ie, always rest heals.
Definition: unit.hpp:1300
bool is_fearless() const
Gets whether this unit is fearless - ie, unaffected by time of day.
Definition: unit.hpp:1294
utils::variant< upkeep_full, upkeep_loyal, int > upkeep_t
Definition: unit.hpp:1182
const std::vector< t_string > & trait_descriptions() const
Gets the descriptions of the currently registered traits.
Definition: unit.hpp:1108
std::vector< std::string > get_traits_list() const
Gets a list of the traits this unit currently has, including hidden traits.
Definition: unit.hpp:1135
const std::vector< t_string > & trait_names() const
Gets the names of the currently registered traits.
Definition: unit.hpp:1098
void generate_traits(bool must_have_only=false)
Applies mandatory traits (e.g.
Definition: unit.cpp:801
upkeep_t upkeep_raw() const
Gets the raw variant controlling the upkeep value.
Definition: unit.hpp:1277
void set_loyal(bool loyal)
Definition: unit.cpp:1705
bool loyal() const
Gets whether this unit is loyal - ie, it costs no upkeep.
Definition: unit.cpp:1700
void set_upkeep(upkeep_t v)
Sets the upkeep value to a specific value value.
Definition: unit.hpp:1283
Definition: halo.cpp:39
std::map< std::string, t_string, res_compare > string_map_res
std::map< std::string, t_string > string_map
std::string::const_iterator iterator
Definition: tokenizer.hpp:25
std::shared_ptr< const attack_type > const_attack_ptr
Definition: ptr.hpp:34
std::shared_ptr< attack_type > attack_ptr
Definition: ptr.hpp:33
std::shared_ptr< unit > unit_ptr
Definition: ptr.hpp:26
The basic class for representing 8-bit RGB or RGBA colour values.
Definition: color.hpp:59
Encapsulates the map of the game.
Definition: location.hpp:45
bool valid() const
Definition: location.hpp:110
direction
Valid directions which can be moved in our hexagonal world.
Definition: location.hpp:47
std::size_t value
Definition: id.hpp:27
A terrain string which is converted to a terrain is a string with 1 or 2 layers the layers are separa...
Definition: translation.hpp:49
Visitor helper struct to fetch the upkeep type flag if applicable, or the the value otherwise.
Definition: unit.hpp:1219
Data typedef for unit_ability_list.
Definition: unit.hpp:38
map_location student_loc
Used by the formula in the ability.
Definition: unit.hpp:52
unit_ability(const config *ability_cfg, map_location student_loc, map_location teacher_loc)
Definition: unit.hpp:39
const config * ability_cfg
The contents of the ability tag, never nullptr.
Definition: unit.hpp:59
map_location teacher_loc
The location of the teacher, that is the unit who owns the ability tags (different from student becau...
Definition: unit.hpp:57
Object which temporarily resets a unit's movement.
Definition: unit.hpp:2152
static map_location::direction n
static map_location::direction s
std::string get_checksum(const unit &u, backwards_compatibility::unit_checksum_version version=backwards_compatibility::unit_checksum_version::current)
Gets a checksum for a unit.
Definition: unit.cpp:2829
MacOS doesn't support std::visit when targing MacOS < 10.14 (currently we target 10....
#define b