The Battle for Wesnoth  1.19.8+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. */
659  {
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  * Convenience wrapper around the unit_type value.
731  */
732  double hp_bar_scaling() const;
733  /**
734  * The factor by which the XP bar should be scaled.
735  * Convenience wrapper around the unit_type value.
736  */
737  double xp_bar_scaling() const;
738 
739  /**
740  * Whether the unit has been instructed to hold its position.
741  * This excludes it from the unit cycling function.
742  * @return true if it is holding position
743  */
744  bool hold_position() const
745  {
746  return hold_position_;
747  }
748 
749  /**
750  * Toggle the unit's hold position status.
751  */
753  {
755  if(hold_position_) {
756  end_turn_ = true;
757  }
758  }
759 
760  /**
761  * Set whether the user ended their turn
762  * @todo Verify meaning and explain better
763  */
764  void set_user_end_turn(bool value = true)
765  {
766  end_turn_ = value;
767  }
768 
769  /**
770  * Toggle whether the user ended their turn
771  * @todo Verify meaning and explain better
772  */
774  {
775  end_turn_ = !end_turn_;
776  if(!end_turn_) {
777  hold_position_ = false;
778  }
779  }
780 
781  /**
782  * Check whether the user ended their turn
783  * @todo Verify meaning and explain better
784  */
785  bool user_end_turn() const
786  {
787  return end_turn_;
788  }
789 
790  /**
791  * Refresh unit for the beginning of a turn
792  */
793  void new_turn();
794 
795  /**
796  * Refresh unit for the end of a turn
797  */
798  void end_turn();
799 
800  /**
801  * Refresh unit for the beginning of a new scenario
802  */
803  void new_scenario();
804 
805  /**
806  * Damage the unit.
807  * @returns true if the unit dies as a result
808  */
809  bool take_hit(int damage)
810  {
811  hit_points_ -= damage;
812  return hit_points_ <= 0;
813  }
814 
815  /**
816  * Heal the unit
817  * @param amount The number of hitpoints to gain
818  */
819  void heal(int amount);
820 
821  /**
822  * Fully heal the unit, restoring it to max hitpoints
823  */
824  void heal_fully()
825  {
827  }
828 
829  /**
830  * Get the status effects currently affecting the unit.
831  * @return A set of status keys
832  */
833  const std::set<std::string> get_states() const;
834 
835  /**
836  * Check if the unit is affected by a status effect
837  * @param state The status effect to check
838  * @returns true if the unit is affected by the status effect
839  */
840  bool get_state(const std::string& state) const;
841 
842  /**
843  * Set whether the unit is affected by a status effect
844  * @param state The status effect to change
845  * @param value Whether the unit should be affected by the status
846  */
847  void set_state(const std::string& state, bool value);
848 
849  /**
850  * Built-in status effects known to the engine
851  */
852  enum state_t {
853  STATE_SLOWED = 0, /** The unit is slowed - it moves slower and does less damage */
854  STATE_POISONED, /** The unit is poisoned - it loses health each turn */
855  STATE_PETRIFIED, /** The unit is petrified - it cannot move or be attacked */
856  STATE_UNCOVERED, /** The unit is uncovered - it was hiding but has been spotted */
857  STATE_NOT_MOVED, /** The unit has not moved @todo Explain better */
858  STATE_UNHEALABLE, /** The unit cannot be healed */
859  STATE_GUARDIAN, /** The unit is a guardian - it won't move unless a target is sighted */
860  STATE_INVULNERABLE, /** The unit is invulnerable - it cannot be hit by any attack */
861  NUMBER_OF_STATES, /** To set the size of known_boolean_states_ */
862  STATE_UNKNOWN = -1 /** A status effect not known to the engine */
863  };
864 
865  /**
866  * Set whether the unit is affected by a status effect
867  * @param state The status effect to change
868  * @param value Whether the unit should be affected by the status
869  */
870  void set_state(state_t state, bool value);
871 
872  /**
873  * Check if the unit is affected by a status effect
874  * @param state The status effect to check
875  * @returns true if the unit is affected by the status effect
876  */
877  bool get_state(state_t state) const;
878 
879  /**
880  * Convert a string status effect ID to a built-in status effect ID
881  * @returns the state_t representing the status, or STATE_UNKNOWN if it's not built-in
882  */
883  static state_t get_known_boolean_state_id(const std::string& state);
884 
885  /**
886  * Convert a built-in status effect ID to a string status effect ID
887  * @returns the string representing the status, or an empty string for STATE_UNKNOWN
888  */
889  static std::string get_known_boolean_state_name(state_t state);
890 
891  /**
892  * Check if the unit has been poisoned
893  * @returns true if it's poisoned
894  */
895  bool poisoned() const
896  {
897  return get_state(STATE_POISONED);
898  }
899 
900  /**
901  * Check if the unit has been petrified
902  * @returns true if it's petrified
903  */
904  bool incapacitated() const
905  {
906  return get_state(STATE_PETRIFIED);
907  }
908 
909  /**
910  * Check if the unit has been slowed
911  * @returns true if it's slowed
912  */
913  bool slowed() const
914  {
915  return get_state(STATE_SLOWED);
916  }
917 
918  /**
919  * @}
920  * @defgroup unit_atk Attack and resistance functions
921  * @{
922  */
923 
924 public:
925  /** Gets an iterator over this unit's attacks. */
927  {
928  return make_attack_itors(attacks_);
929  }
930 
931  /** Const overload of @ref attacks. */
933  {
934  return make_attack_itors(attacks_);
935  }
936 
937  /**
938  * Adds a new attack to the unit.
939  * @param position An iterator pointing to the attack before which to insert the new one.
940  * @param args The arguments for constructing the attack
941  */
942  template<typename... Args>
943  attack_ptr add_attack(attack_itors::iterator position, Args&&... args)
944  {
946  return *attacks_.emplace(position.base(), new attack_type(std::forward<Args>(args)...));
947  }
948 
949  /**
950  * Remove an attack from the unit
951  * @param atk A pointer to the attack to remove
952  * @return true if the attack was removed, false if it didn't exist on the unit
953  */
954  bool remove_attack(const attack_ptr& atk);
955 
956  /**
957  * Set the unit to have no attacks left for this turn.
958  */
959  void remove_attacks_ai();
960 
961  /**
962  * Calculates the damage this unit would take from a certain attack.
963  *
964  * @param attack The attack to consider.
965  * @param attacker Whether this unit should be considered the attacker.
966  * @param loc The unit's location (to resolve [resistance] abilities)
967  * @param weapon The weapon to check for any abilities or weapon specials
968  *
969  * @returns The expected damage.
970  */
971  int damage_from(const attack_type& attack, bool attacker, const map_location& loc, const_attack_ptr weapon = nullptr) const
972  {
973  return resistance_against(attack, attacker, loc, weapon);
974  }
975 
976  /** The maximum number of attacks this unit may perform per turn, usually 1. */
977  int max_attacks() const
978  {
979  return max_attacks_;
980  }
981 
982  void set_max_attacks(int value)
983  {
985  max_attacks_ = value;
986  }
987 
988  /**
989  * Gets the remaining number of attacks this unit can perform this turn.
990  *
991  * If the 'incapacitated' status is set, this will always be 0.
992  */
993  int attacks_left() const
994  {
995  return (attacks_left_ == 0 || incapacitated()) ? 0 : attacks_left_;
996  }
997 
998  /**
999  * Gets the remaining number of attacks this unit can perform this turn.
1000  *
1001  * @param base_value If false, consider the `incapacitated` flag.
1002  *
1003  * @returns If @a base_value is true, the raw value is returned.
1004  */
1005  int attacks_left(bool base_value) const
1006  {
1007  return base_value ? attacks_left_ : attacks_left();
1008  }
1009 
1010  /**
1011  * Sets the number of attacks this unit has left this turn.
1012  * @param left The number of attacks left
1013  */
1014  void set_attacks(int left)
1015  {
1016  attacks_left_ = std::max<int>(0, left);
1017  }
1018 
1019  /**
1020  * The unit's defense on a given terrain
1021  * @param terrain The terrain to check
1022  */
1023  int defense_modifier(const t_translation::terrain_code& terrain) const;
1024 
1025  /**
1026  * For the provided list of resistance abilities, determine the damage resistance based on which are active and any max_value that's present.
1027  *
1028  * @param resistance_list A list of resistance abilities that the unit has.
1029  * @param damage_name The name of the damage type, for example "blade".
1030  * @return The resistance value for a unit with the provided resistance abilities to the provided damage type.
1031  */
1032  int resistance_value(unit_ability_list resistance_list, const std::string& damage_name) const;
1033 
1034  /**
1035  * The unit's resistance against a given damage type
1036  * @param damage_name The damage type
1037  * @param attacker True if this unit is on the offensive (to resolve [resistance] abilities)
1038  * @param loc The unit's location (to resolve [resistance] abilities)
1039  * @param weapon The weapon to check for any abilities or weapon specials
1040  * @param opp_weapon The opponent's weapon to check for any abilities or weapon specials
1041  */
1042  int resistance_against(const std::string& damage_name, bool attacker, const map_location& loc, const_attack_ptr weapon = nullptr, const const_attack_ptr& opp_weapon = nullptr) const;
1043 
1044  /**
1045  * The unit's resistance against a given attack
1046  * @param atk The attack
1047  * @param attacker True if this unit is on the offensive (to resolve [resistance] abilities)
1048  * @param loc The unit's location (to resolve [resistance] abilities)
1049  * @param weapon The weapon to check for any abilities or weapon specials
1050  */
1051  int resistance_against(const attack_type& atk, bool attacker, const map_location& loc, const_attack_ptr weapon = nullptr) const
1052  {
1053  return resistance_against(atk.type(), attacker, loc , weapon, atk.shared_from_this());
1054  }
1055 
1056  /** Gets resistances without any abilities applied. */
1058  {
1059  return movement_type_.damage_table();
1060  }
1061 
1062 private:
1063  bool resistance_filter_matches(const config& cfg, const std::string& damage_name, int res) const;
1064 
1065  /**
1066  * @}
1067  * @defgroup unit_trait Trait and upkeep functions
1068  * @{
1069  */
1070 public:
1071  /**
1072  * Applies mandatory traits (e.g. undead, mechanical) to a unit and then fills in the remaining traits
1073  * traits until no more are available (leaders have a restricted set of available traits) or the unit has
1074  * its maximum number of traits.
1075  *
1076  * This routine does not apply the effects of added traits to a unit; that must be done by the caller.
1077  *
1078  * Note that random numbers used in config files don't work in multiplayer, so leaders should be barred
1079  * from all random traits until that is fixed. Later the restrictions will be based on play balance.
1080  *
1081  * @param must_have_only Whether random or optional traits should be included or not. If false only
1082  * mandatory traits will be used.
1083  */
1084  void generate_traits(bool must_have_only = false);
1085 
1086  /**
1087  * Gets the names of the currently registered traits.
1088  *
1089  * @returns A list of translatable trait names.
1090  */
1091  const std::vector<t_string>& trait_names() const
1092  {
1093  return trait_names_;
1094  }
1095 
1096  /**
1097  * Gets the descriptions of the currently registered traits.
1098  *
1099  * @returns A list of translatable trait descriptions.
1100  */
1101  const std::vector<t_string>& trait_descriptions() const
1102  {
1103  return trait_descriptions_;
1104  }
1105 
1106  /**
1107  * Gets the ids of the traits corresponding to those returned by trait_names() and
1108  * trait_descriptions(). Omits hidden traits, which are those with an empty name.
1109  *
1110  * @returns A list of trait IDs.
1111  */
1112  std::vector<std::string> trait_nonhidden_ids() const
1113  {
1114  return trait_nonhidden_ids_;
1115  }
1116 
1117  /** Gets a list of the modification this unit currently has.
1118  * @param mod_type type of modification.
1119  * @returns A list of modification IDs.
1120  */
1121  std::vector<std::string> get_modifications_list(const std::string& mod_type) const;
1122 
1123  /**
1124  * Gets a list of the traits this unit currently has, including hidden traits.
1125  *
1126  * @returns A list of trait IDs.
1127  */
1128  std::vector<std::string> get_traits_list() const
1129  {
1130  return get_modifications_list("trait");
1131  }
1132 
1133  std::vector<std::string> get_objects_list() const
1134  {
1135  return get_modifications_list("object");
1136  }
1137 
1138  std::vector<std::string> get_advancements_list() const
1139  {
1140  return get_modifications_list("advancement");
1141  }
1142 
1143  /**
1144  * Register a trait's name and its description for the UI's use.
1145  *
1146  * The resulting data can be fetched with @ref trait_names and @ref trait_descriptions.
1147  *
1148  * @param trait A config containing the trait's attributes.
1149  * @param description The translatable description of the trait.
1150  */
1151  void add_trait_description(const config& trait, const t_string& description);
1152 
1153  /**
1154  * Gets the amount of gold this unit costs a side per turn.
1155  *
1156  * This fetches an actual numeric gold value:
1157  * - If can_recruit is true, no upkeep is paid (0 is returned).
1158  * - If a special upkeep flag is set, the associated gold amount is returned (see @ref upkeep_value_visitor).
1159  * - If a numeric value is already set, it is returned directly.
1160  *
1161  * @returns A gold value, evaluated based on the state of @ref upkeep_raw.
1162  */
1163  int upkeep() const;
1164 
1166  {
1167  static std::string type() { static std::string v = "full"; return v; }
1168  };
1169 
1171  {
1172  static std::string type() { static std::string v = "loyal"; return v; }
1173  };
1174 
1175  using upkeep_t = utils::variant<upkeep_full, upkeep_loyal, int>;
1176 
1177  /** Visitor helper class to fetch the appropriate upkeep value. */
1179 #ifdef USING_BOOST_VARIANT
1180  : public boost::static_visitor<int>
1181 #endif
1182  {
1183  public:
1184  explicit upkeep_value_visitor(const unit& unit) : u_(unit) {}
1185 
1186  /** Full upkeep equals the unit's level. */
1187  int operator()(const upkeep_full&) const
1188  {
1189  return u_.level();
1190  }
1191 
1192  /** Loyal units cost no upkeep. */
1193  int operator()(const upkeep_loyal&) const
1194  {
1195  return 0;
1196  }
1197 
1198  int operator()(int v) const
1199  {
1200  return v;
1201  }
1202 
1203  private:
1204  const unit& u_;
1205  };
1206 
1207  /** Visitor helper struct to fetch the upkeep type flag if applicable, or the the value otherwise. */
1209 #ifdef USING_BOOST_VARIANT
1210  : public boost::static_visitor<std::string>
1211 #endif
1212  {
1213  template<typename T>
1214  std::enable_if_t<!std::is_same_v<int, T>, std::string>
1215  operator()(T&) const
1216  {
1217  // Any special upkeep type should have an associated @ref type getter in its helper struct.
1218  return T::type();
1219  }
1220 
1221  std::string operator()(int v) const
1222  {
1223  return std::to_string(v);
1224  }
1225  };
1226 
1227  /** Visitor helper class to parse the upkeep value from a config. */
1229 #ifdef USING_BOOST_VARIANT
1230  : public boost::static_visitor<upkeep_t>
1231 #endif
1232  {
1233  public:
1234  template<typename N>
1235  std::enable_if_t<std::is_arithmetic_v<N>, upkeep_t>
1236  operator()(N n) const
1237  {
1238  if(n == 0) return upkeep_loyal();
1239  if(n < 0) throw std::invalid_argument(std::to_string(n));
1240  return static_cast<int>(n);
1241  }
1242 
1243  template<typename B>
1244  std::enable_if_t<std::is_convertible_v<B, bool> && !std::is_arithmetic_v<B>, upkeep_t>
1245  operator()(B b) const
1246  {
1247  throw std::invalid_argument(b.str());
1248  }
1249 
1250  upkeep_t operator()(utils::monostate) const
1251  {
1252  return upkeep_full();
1253  }
1254 
1255  upkeep_t operator()(const std::string& s) const
1256  {
1257  if(s == "loyal" || s == "free")
1258  return upkeep_loyal();
1259  if(s == "full")
1260  return upkeep_full();
1261  throw std::invalid_argument(s);
1262  }
1263  };
1264 
1265  /**
1266  * Gets the raw variant controlling the upkeep value.
1267  *
1268  * This should not usually be called directly. To get an actual numeric value of upkeep use @ref upkeep.
1269  */
1271  {
1272  return upkeep_;
1273  }
1274 
1275  /** Sets the upkeep value to a specific value value. Does not necessarily need to be numeric */
1277  {
1278  upkeep_ = v;
1279  }
1280 
1281  /** Gets whether this unit is loyal - ie, it costs no upkeep. */
1282  bool loyal() const;
1283 
1284  void set_loyal(bool loyal);
1285 
1286  /** Gets whether this unit is fearless - ie, unaffected by time of day. */
1287  bool is_fearless() const
1288  {
1289  return is_fearless_;
1290  }
1291 
1292  /** Gets whether this unit is healthy - ie, always rest heals. */
1293  bool is_healthy() const
1294  {
1295  return is_healthy_;
1296  }
1297 
1298  /**
1299  * @}
1300  * @defgroup unit_mvmt Movement and location functions
1301  * @{
1302  */
1303 
1304 public:
1305  /** The maximum moves this unit has. */
1306  int total_movement() const
1307  {
1308  return max_movement_;
1309  }
1310 
1311  void set_total_movement(int value)
1312  {
1314  max_movement_ = value;
1315  }
1316 
1317  /**
1318  * Gets how far a unit can move, considering the `incapacitated` flag.
1319  *
1320  * @returns The remaining movement, or zero if incapacitated.
1321  */
1322  int movement_left() const
1323  {
1324  return (movement_ == 0 || incapacitated()) ? 0 : movement_;
1325  }
1326 
1327  /**
1328  * Gets how far a unit can move.
1329  *
1330  * @param base_value If false, consider the `incapacitated` flag.
1331  *
1332  * @returns If @a base_value is true, the raw value is returned.
1333  */
1334  int movement_left(bool base_value) const
1335  {
1336  return base_value ? movement_ : movement_left();
1337  }
1338 
1339  /**
1340  * Set this unit's remaining movement to @a moves.
1341  *
1342  * This does not affect maximum movement.
1343  *
1344  * @param moves The new number of moves
1345  * @param unit_action If to true, the "end turn" and "hold position" flags will be cleared
1346  * (as they should be if a unit acts, as opposed to the movement being set
1347  * by the engine for other reasons).
1348  */
1349  void set_movement(int moves, bool unit_action = false);
1350 
1351  /** Checks if this unit has moved. */
1352  bool has_moved() const
1353  {
1354  return movement_left() != total_movement();
1355  }
1356 
1357  /** Sets the unit to have no moves left for this turn. */
1358  void remove_movement_ai();
1359 
1360  /**
1361  * Checks whether this unit is 'resting'.
1362  *
1363  * Resting refers to whether this unit has not moved yet this turn. Note that this can be true even
1364  * if @ref movement_left is not equal to @ref total_movement.
1365  */
1366  bool resting() const
1367  {
1368  return resting_;
1369  }
1370 
1371  /** Sets this unit's resting status. */
1372  void set_resting(bool rest)
1373  {
1374  resting_ = rest;
1375  }
1376 
1377  /** Tests whether the unit has a zone-of-control, considering @ref incapacitated. */
1378  bool emits_zoc() const
1379  {
1380  return emit_zoc_ && !incapacitated();
1381  }
1382 
1383  /** Gets the raw zone-of-control flag, disregarding @ref incapacitated. */
1384  bool get_emit_zoc() const
1385  {
1386  return emit_zoc_;
1387  }
1388 
1389  /** Sets the raw zone-of-control flag. */
1390  void set_emit_zoc(bool val)
1391  {
1393  emit_zoc_ = val;
1394  }
1395 
1396  /** The current map location this unit is at. */
1398  {
1399  return loc_;
1400  }
1401 
1402  /**
1403  * Sets this unit's map location.
1404  *
1405  * Note this should only be called by unit_map or for temporary units.
1406  */
1408  {
1409  loc_ = loc;
1410  }
1411 
1412  /** The current direction this unit is facing within its hex. */
1414  {
1415  return facing_;
1416  }
1417 
1418  /** The this unit's facing. */
1419  void set_facing(map_location::direction dir) const;
1420 
1421  /** Gets whether this unit has a multi-turn destination set. */
1422  bool has_goto() const
1423  {
1424  return get_goto().valid();
1425  }
1426 
1427  /** The map location to which this unit is moving over multiple turns, if any. */
1428  const map_location& get_goto() const
1429  {
1430  return goto_;
1431  }
1432 
1433  /** Sets this unit's long term destination. */
1434  void set_goto(const map_location& new_goto)
1435  {
1436  goto_ = new_goto;
1437  }
1438 
1439  /** Gets the unit's vision points. */
1440  int vision() const
1441  {
1442  return vision_ < 0 ? max_movement_ : vision_;
1443  }
1444 
1445  /** Gets the unit's jamming points. */
1446  int jamming() const
1447  {
1448  return jamming_;
1449  }
1450 
1451  /** Check whether the unit's move has been interrupted. */
1452  bool move_interrupted() const
1453  {
1454  return movement_left() > 0 && interrupted_move_.x >= 0 && interrupted_move_.y >= 0;
1455  }
1456 
1457  /** Get the target location of the unit's interrupted move. */
1459  {
1460  return interrupted_move_;
1461  }
1462 
1463  /** Set the target location of the unit's interrupted move. */
1464  void set_interrupted_move(const map_location& interrupted_move)
1465  {
1466  interrupted_move_ = interrupted_move;
1467  }
1468 
1469  /** Get the unit's movement type. */
1470  const movetype& movement_type() const
1471  {
1472  return movement_type_;
1473  }
1474 
1475  /**
1476  * Get the unit's movement cost on a particular terrain
1477  * @param terrain The terrain to check
1478  * @returns the number of movement points to enter that terrain
1479  */
1480  int movement_cost(const t_translation::terrain_code& terrain) const
1481  {
1483  }
1484 
1485  /**
1486  * Get the unit's vision cost on a particular terrain
1487  * @param terrain The terrain to check
1488  * @returns the number of vision points to see into that terrain
1489  */
1490  int vision_cost(const t_translation::terrain_code& terrain) const
1491  {
1493  }
1494 
1495  /**
1496  * Get the unit's jamming cost on a particular terrain
1497  * @param terrain The terrain to check
1498  * @returns the number of jamming points to jam that terrain
1499  */
1500  int jamming_cost(const t_translation::terrain_code& terrain) const
1501  {
1503  }
1504 
1505  /** Check if the unit is a flying unit. */
1506  bool is_flying() const
1507  {
1508  return movement_type_.is_flying();
1509  }
1510 
1511  /**
1512  * @}
1513  * @defgroup unit_mod Modification functions
1514  * @{
1515  */
1516 
1517 public:
1518  /** Get the raw modifications. */
1520  {
1521  return modifications_;
1522  }
1523 
1524  /** Set the raw modifications. */
1525  const config& get_modifications() const
1526  {
1527  return modifications_;
1528  }
1529 
1530  /**
1531  * Count modifications of a particular type.
1532  * @param type The type of modification to count.
1533  * Valid values are "advancement", "trait", "object"
1534  * @param id The ID of the modification to count
1535  * @return The total number of modifications of that type and ID.
1536  */
1537  std::size_t modification_count(const std::string& type, const std::string& id) const;
1538 
1539  /**
1540  * Count modifications of a particular type.
1541  * @param type The type of modification to count.
1542  * Valid values are "advancement", "trait", "object"
1543  * @return The total number of modifications of that type.
1544  */
1545  std::size_t modification_count(const std::string& type) const;
1546 
1547  std::size_t traits_count() const
1548  {
1549  return modification_count("trait");
1550  }
1551 
1552  std::size_t objects_count() const
1553  {
1554  return modification_count("object");
1555  }
1556 
1557  std::size_t advancements_count() const
1558  {
1559  return modification_count("advancement");
1560  }
1561 
1562  /**
1563  * Add a new modification to the unit.
1564  * @param type The type of modification to add.
1565  * Valid values are "advancement", "trait", "object"
1566  * @param modification The details of the modification
1567  * @param no_add If true, apply the modification but don't save it for unit rebuild time.
1568  * Defaults to false.
1569  */
1570  void add_modification(const std::string& type, const config& modification, bool no_add = false);
1571 
1572  /**
1573  * Clears those modifications whose duration has expired.
1574  *
1575  * @param duration If empty, all temporary modifications (those not lasting forever) expire.
1576  * Otherwise, modifications whose duration equals @a duration expire.
1577  */
1578  void expire_modifications(const std::string& duration);
1579 
1580  static const std::set<std::string> builtin_effects;
1581 
1582  /**
1583  * Apply a builtin effect to the unit.
1584  * @param type The effect to apply. Must be one of the effects in @ref builtin_effects.
1585  * @param effect The details of the effect
1586  */
1587  void apply_builtin_effect(const std::string& type, const config& effect);
1588 
1589  /**
1590  * Construct a string describing a built-in effect.
1591  * @param type The effect to describe. Must be one of the effects in @ref builtin_effects.
1592  * @param effect The details of the effect
1593  */
1594  std::string describe_builtin_effect(const std::string& type, const config& effect);
1595 
1596  /** Re-apply all saved modifications. */
1597  void apply_modifications();
1598 
1599  /**
1600  * @}
1601  * @defgroup unit_img Image and animations functions
1602  * @{
1603  */
1604 
1605 public:
1606  /** @todo Document this */
1608  {
1609  return *anim_comp_;
1610  }
1611 
1612  /** The name of the file to game_display (used in menus). */
1613  std::string absolute_image() const;
1614 
1615  /** The default image to use for animation frames with no defined image. */
1616  std::string default_anim_image() const;
1617 
1618  /** Get the unit's halo image. */
1619  std::string image_halo() const
1620  {
1621  return halo_.value_or("");
1622  }
1623 
1624  std::vector<std::string> halo_or_icon_abilities(const std::string& image_type) const;
1625 
1626  /** Get the [halo] abilities halo image(s). */
1627  std::vector<std::string> halo_abilities() const
1628  {
1629  return halo_or_icon_abilities("halo");
1630  }
1631 
1632  /** Set the unit's halo image. */
1633  void set_image_halo(const std::string& halo);
1634 
1635  /** Get the unit's ellipse image. */
1636  std::string image_ellipse() const
1637  {
1638  return ellipse_.value_or("");
1639  }
1640 
1641  /** Set the unit's ellipse image. */
1642  void set_image_ellipse(const std::string& ellipse)
1643  {
1644  appearance_changed_ = true;
1645  ellipse_ = ellipse;
1646  }
1647 
1648  /**
1649  * Get the source color palette to use when recoloring the unit's image.
1650  */
1651  const std::string& flag_rgb() const;
1652 
1653  /** Constructs a recolor (RC) IPF string for this unit's team color. */
1654  std::string TC_image_mods() const;
1655 
1656  /** Gets any IPF image mods applied by effects. */
1657  const std::string& effect_image_mods() const
1658  {
1659  return image_mods_;
1660  }
1661 
1662  /**
1663  * Gets an IPF string containing all IPF image mods.
1664  *
1665  * @returns An amalgamation of @ref effect_image_mods followed by @ref TC_image_mods.
1666  */
1667  std::string image_mods() const;
1668 
1669  /** Get the unit's overlay images. */
1670  const std::vector<std::string>& overlays() const
1671  {
1672  return overlays_;
1673  }
1674 
1675  /** Get the [overlay] ability overlay images. */
1676  std::vector<std::string> overlays_abilities() const
1677  {
1678  return halo_or_icon_abilities("overlay");
1679  }
1680 
1681  /**
1682  * Color for this unit's *current* hitpoints.
1683  *
1684  * @returns A color between green and red representing how wounded this unit is.
1685  * The maximum_hitpoints are considered as base.
1686  */
1687  color_t hp_color() const;
1688  static color_t hp_color_max();
1689 
1690  /**
1691  * Color for this unit's hitpoints.
1692  *
1693  * @param hitpoints The number of hitpoints the color represents.
1694  * @returns The color considering the current hitpoints as base.
1695  */
1696  color_t hp_color(int hitpoints) const;
1697 
1698  /**
1699  * Color for this unit's XP. See also @ref hp_color
1700  */
1701  color_t xp_color() const;
1702  static color_t xp_color(int xp_to_advance, bool can_advance, bool has_amla);
1703 
1704  /**
1705  * @}
1706  * @defgroup unit_abil Ability functions
1707  * @{
1708  */
1709 
1710 public:
1711  /**
1712  * Checks whether this unit currently possesses or is affected by a given ability.
1713  *
1714  * This means that the ability could be owned by this unit itself or by an adjacent unit, should
1715  * the ability affect an AoE in which this unit happens to be.
1716  *
1717  * @param tag_name The name of the ability to check for.
1718  * @param loc The location around which to check for affected units. This may or
1719  * may not be the location of this unit.
1720  */
1721  bool get_ability_bool(const std::string& tag_name, const map_location& loc) const;
1722 
1723  /**
1724  * Checks whether this unit currently possesses or is affected by a given ability.
1725  *
1726  * This means that the ability could be owned by this unit itself or by an adjacent unit, should
1727  * the ability affect an AoE in which this unit happens to be.
1728  *
1729  * This overload uses the location of this unit for calculations.
1730  *
1731  * @param tag_name The name of the ability to check for.
1732  */
1733  bool get_ability_bool(const std::string& tag_name) const
1734  {
1735  return get_ability_bool(tag_name, loc_);
1736  }
1737 
1738  /** Checks whether this unit currently possesses a given ability, and that that ability is active.
1739  * @return True if the ability @a tag_name is active.
1740  * @param cfg the const config to one of abilities @a tag_name checked.
1741  * @param ability name of ability type checked.
1742  * @param loc location of the unit checked.
1743  */
1744  bool get_self_ability_bool(const config& cfg, const std::string& ability, const map_location& loc) const;
1745  /** Checks whether this unit currently possesses a given ability of leadership type
1746  * @return True if the ability @a tag_name is active.
1747  * @param special the const config to one of abilities @a tag_name checked.
1748  * @param tag_name name of ability type checked.
1749  * @param loc location of the unit checked.
1750  * @param weapon the attack used by unit checked in this function.
1751  * @param opp_weapon the attack used by opponent to unit checked.
1752  */
1753  bool get_self_ability_bool_weapon(const config& special, const std::string& tag_name, const map_location& loc, const const_attack_ptr& weapon = nullptr, const const_attack_ptr& opp_weapon = nullptr) const;
1754  /** Checks whether this unit is affected by a given ability, and that that ability is active.
1755  * @return True if the ability @a tag_name is active.
1756  * @param cfg the const config to one of abilities @a ability checked.
1757  * @param ability name of ability type checked.
1758  * @param loc location of the unit checked.
1759  * @param from unit adjacent to @a this is checked in case of [affect_adjacent] abilities.
1760  * @param dir direction to research a unit adjacent to @a this.
1761  */
1762  bool get_adj_ability_bool(const config& cfg, const std::string& ability, int dir, const map_location& loc, const unit& from) const;
1763  /** Checks whether this unit is affected by a given ability of leadership type
1764  * @return True if the ability @a tag_name is active.
1765  * @param special the const config to one of abilities @a tag_name checked.
1766  * @param tag_name name of ability type checked.
1767  * @param loc location of the unit checked.
1768  * @param from unit adjacent to @a this is checked in case of [affect_adjacent] abilities.
1769  * @param dir direction to research a unit adjacent to @a this.
1770  * @param weapon the attack used by unit checked in this function.
1771  * @param opp_weapon the attack used by opponent to unit checked.
1772  */
1773  bool get_adj_ability_bool_weapon(const config& special, const std::string& tag_name, int dir, const map_location& loc, const unit& from, const const_attack_ptr& weapon=nullptr, const const_attack_ptr& opp_weapon = nullptr) const;
1774 
1775  /**
1776  * Gets the unit's active abilities of a particular type if it were on a specified location.
1777  * @param tag_name The type of ability to check for
1778  * @param loc The location to use for resolving abilities
1779  * @return A list of active abilities, paired with the location they are active on
1780  */
1781  unit_ability_list get_abilities(const std::string& tag_name, const map_location& loc) const;
1782 
1783  /**
1784  * Gets the unit's active abilities of a particular type.
1785  * @param tag_name The type of ability to check for
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
1789  {
1790  return get_abilities(tag_name, loc_);
1791  }
1792 
1793  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;
1794 
1795  unit_ability_list get_abilities_weapons(const std::string& tag_name, const_attack_ptr weapon = nullptr, const_attack_ptr opp_weapon = nullptr) const
1796  {
1797  return get_abilities_weapons(tag_name, loc_, weapon, opp_weapon);
1798  }
1799 
1800  const config &abilities() const { return abilities_; }
1801 
1802  const std::set<std::string>& checking_tags() const { return checking_tags_; };
1803 
1804  /**
1805  * Gets the names and descriptions of this unit's abilities. Location-independent variant
1806  * with all abilities shown as active.
1807  *
1808  * @returns A list of quadruples consisting of (in order) id, base name,
1809  * male or female name as appropriate for the unit, and description.
1810  */
1811  std::vector<std::tuple<std::string, t_string, t_string, t_string>>
1812  ability_tooltips() const;
1813 
1814  /**
1815  * Gets the names and descriptions of this unit's abilities.
1816  *
1817  * @param active_list This vector will be the same length as the returned one and will
1818  * indicate whether or not the corresponding ability is active.
1819  *
1820  * @param loc The location on which to resolve the ability.
1821  *
1822  * @returns A list of quadruples consisting of (in order) id, base name,
1823  * male or female name as appropriate for the unit, and description.
1824  */
1825  std::vector<std::tuple<std::string, t_string, t_string, t_string>>
1826  ability_tooltips(boost::dynamic_bitset<>& active_list, const map_location& loc) const;
1827 
1828  /** Get a list of all abilities by ID. */
1829  std::vector<std::string> get_ability_list() const;
1830 
1831  /**
1832  * Check if the unit has an ability of a specific type.
1833  * @param ability The type of ability (tag name) to check for.
1834  * @returns true if the ability is present
1835  */
1836  bool has_ability_type(const std::string& ability) const;
1837 
1838  /**
1839  * Check if the unit has an ability of a specific ID.
1840  * @param ability The ID of ability to check for.
1841  * @returns true if the ability is present
1842  */
1843  bool has_ability_by_id(const std::string& ability) const;
1844 
1845  /**
1846  * Removes a unit's abilities with a specific ID.
1847  * @param ability The type of ability (tag name) to remove.
1848  */
1849  void remove_ability_by_id(const std::string& ability);
1850 
1851  /**
1852  * Removes a unit's abilities with a specific ID or other attribute.
1853  * @param filter the config of ability to remove.
1854  */
1856 
1857  /**
1858  * Verify what abilities attributes match with filter.
1859  * @param cfg the config of ability to check.
1860  * @param tag_name the tag name of ability to check.
1861  * @param filter the filter used for checking.
1862  */
1863  bool ability_matches_filter(const config & cfg, const std::string& tag_name, const config & filter) const;
1864 
1865 
1866 private:
1867 
1868  /**
1869  * Helper similar to std::unique_lock for detecting when calculations such as abilities
1870  * have entered infinite recursion.
1871  *
1872  * This assumes that there's only a single thread accessing the unit, it's a lightweight
1873  * increment/decrement counter rather than a mutex.
1874  */
1876  friend class unit;
1877  /**
1878  * Only expected to be called in update_variables_recursion(), which handles some of the checks.
1879  */
1880  explicit recursion_guard(const unit& u, const config& ability);
1881  public:
1882  /**
1883  * Construct an empty instance, only useful for extending the lifetime of a
1884  * recursion_guard returned from unit.update_variables_recursion() by
1885  * std::moving it to an instance declared in a larger scope.
1886  */
1887  explicit recursion_guard();
1888 
1889  /**
1890  * Returns true if a level of recursion was available at the time when update_variables_recursion()
1891  * created this object.
1892  */
1893  operator bool() const;
1894 
1896  recursion_guard(const recursion_guard& other) = delete;
1899  ~recursion_guard();
1900  private:
1901  std::shared_ptr<const unit> parent;
1902  };
1903 
1904  recursion_guard update_variables_recursion(const config& ability) const;
1905 
1906  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"};
1907  /**
1908  * Check if an ability is active. Includes checks to prevent excessive recursion.
1909  * @param ability The type (tag name) of the ability
1910  * @param cfg an ability WML structure
1911  * @param loc The location on which to resolve the ability
1912  * @returns true if it is active
1913  */
1914  bool ability_active(const std::string& ability, const config& cfg, const map_location& loc) const;
1915  /**
1916  * Check if an ability is active. The caller is responsible for preventing excessive recursion, so must hold a recursion_guard.
1917  * @param ability The type (tag name) of the ability
1918  * @param cfg an ability WML structure
1919  * @param loc The location on which to resolve the ability
1920  * @returns true if it is active
1921  */
1922  bool ability_active_impl(const std::string& ability, const config& cfg, const map_location& loc) const;
1923 
1924  /**
1925  * Check if an ability affects adjacent units.
1926  * @param ability The type (tag name) of the ability
1927  * @param cfg an ability WML structure
1928  * @param loc The location on which to resolve the ability
1929  * @param from The "other unit" for filter matching
1930  * @param dir The direction the unit is facing
1931  */
1932  bool ability_affects_adjacent(const std::string& ability, const config& cfg, int dir, const map_location& loc, const unit& from) const;
1933 
1934  /**
1935  * Check if an ability affects the owning unit.
1936  * @param ability The type (tag name) of the ability
1937  * @param cfg an ability WML structure
1938  * @param loc The location on which to resolve the ability
1939  */
1940  bool ability_affects_self(const std::string& ability, const config& cfg, const map_location& loc) const;
1941 
1942  /**
1943  * filters the weapons that condition the use of abilities for combat ([resistance],[leadership] or abilities used like specials
1944  * (deprecated in two last cases)
1945  */
1946  bool ability_affects_weapon(const config& cfg, const const_attack_ptr& weapon, bool is_opp) const;
1947 
1948 public:
1949  /** Get the unit formula manager. */
1951  {
1952  return *formula_man_;
1953  }
1954 
1955  /** Generates a random race-appropriate name if one has not already been provided. */
1956  void generate_name();
1957 
1958  // Only see_all = true use caching
1959  bool invisible(const map_location& loc, bool see_all = true) const;
1960 
1961  bool is_visible_to_team(const team& team, bool const see_all = true) const;
1962  /** Return true if the unit would be visible to team if its location were loc. */
1963  bool is_visible_to_team(const map_location& loc, const team& team, bool const see_all = true) const;
1964 
1965  /**
1966  * Serializes the current unit metadata values.
1967  *
1968  * @param cfg The config to write to.
1969  * @param write_all set this to false to not write unchanged attributes.
1970  */
1971  void write(config& cfg, bool write_all = true) const;
1972 
1973  /**
1974  * Mark this unit as clone so it can be inserted to unit_map.
1975  *
1976  * @returns self (for convenience)
1977  */
1978  unit& mark_clone(bool is_temporary);
1979 
1980 
1981  void set_appearance_changed(bool value) { appearance_changed_ = value; }
1982  bool appearance_changed() const { return appearance_changed_; }
1983 
1984 protected:
1985 
1986 private:
1988 
1989  std::vector<std::string> advances_to_;
1990 
1991  /** Never nullptr. Adjusted for gender and variation. */
1993 
1994  /** The displayed name of this unit type. */
1996 
1997  /** Never nullptr, but may point to the null race. */
1999 
2000  std::string id_;
2003 
2004  std::string undead_variation_;
2005  std::string variation_;
2006 
2011 
2012  int level_;
2013 
2016  std::vector<std::string> recruit_list_;
2018 
2019  std::string flag_rgb_;
2020  std::string image_mods_;
2021 
2023 
2024  int side_;
2025 
2027 
2028  std::unique_ptr<unit_formula_manager> formula_man_;
2029 
2032  int vision_;
2034 
2036 
2039  bool resting_;
2040 
2043 
2044  std::set<std::string> states_;
2045 
2046  static const std::size_t num_bool_states = state_t::NUMBER_OF_STATES;
2047 
2048  std::bitset<num_bool_states> known_boolean_states_;
2049  static std::map<std::string, state_t> known_boolean_state_names_;
2050 
2054 
2056 
2057  std::vector<std::string> overlays_;
2058 
2059  std::string role_;
2061  /**
2062  * While processing a recursive match, all the filters that are currently being checked, oldest first.
2063  * Each will have an instance of recursion_guard that is currently allocated permission to recurse, and
2064  * which will pop the config off this stack when the recursion_guard is finalized.
2065  */
2066  mutable std::vector<const config*> open_queries_;
2067 
2068 protected:
2069  // TODO: I think we actually consider this to be part of the gamestate, so it might be better if it's not mutable,
2070  // but it's not easy to separate this guy from the animation code right now.
2072 
2073 private:
2074  std::vector<t_string> trait_names_;
2075  std::vector<t_string> trait_descriptions_;
2076  std::vector<std::string> trait_nonhidden_ids_;
2077 
2080 
2082 
2084 
2085  // Animations:
2087 
2088  std::unique_ptr<unit_animation_component> anim_comp_;
2089 
2090  mutable bool hidden_;
2091 
2094 
2095  std::vector<config> advancements_;
2096 
2098  std::vector<t_string> special_notes_;
2099 
2100  utils::optional<std::string> usage_;
2101  utils::optional<std::string> halo_;
2102  utils::optional<std::string> ellipse_;
2103 
2106 
2108 
2109  std::string profile_;
2110  std::string small_profile_;
2111 
2112  //Used to check whether the moving units during a move needs to be updated
2113  mutable bool appearance_changed_ = true;
2114  std::bitset<UA_COUNT> changed_attributes_;
2115 
2118 
2119  /**
2120  * Hold the visibility status cache for a unit, when not uncovered.
2121  * This is mutable since it is a cache.
2122  */
2123  mutable std::map<map_location, bool> invisibility_cache_;
2124 
2125  /**
2126  * Clears the cache.
2127  *
2128  * Since we don't change the state of the object we're marked const (also
2129  * required since the objects in the cache need to be marked const).
2130  */
2132  {
2133  invisibility_cache_.clear();
2134  }
2135 };
2136 
2137 /**
2138  * Object which temporarily resets a unit's movement.
2139  *
2140  * @warning A unit whose movement is reset may not be deleted while held in a
2141  * @ref unit_movement_resetter object, so it's best to use thus only in a small scope.
2142  */
2144 {
2147 
2148  unit_movement_resetter(const unit& u, bool operate = true);
2150 
2151 private:
2153  int moves_;
2154 };
2155 
2157 {
2158 /**
2159  * Optional parameter for get_checksum to use the algorithm of an older version of Wesnoth,
2160  * thus preventing spurious OOS warnings while watching old replays.
2161  */
2163  current,
2164  version_1_16_or_older /**< Included some of the flavortext from weapon specials. */
2165 };
2166 
2167 } // namespace backwards_compatibility
2168 
2169 /**
2170  * Gets a checksum for a unit.
2171  *
2172  * In MP games the descriptions are locally generated and might differ, so it
2173  * should be possible to discard them. Not sure whether replays suffer the
2174  * same problem.
2175  *
2176  * @param u this unit
2177  * @param version allows the checksum expected in older replays to be used
2178  *
2179  * @returns the checksum for a unit
2180  */
2181 std::string get_checksum(const unit& u,
map_location loc
Definition: move.cpp:172
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:158
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:1875
Visitor helper class to parse the upkeep value from a config.
Definition: unit.hpp:1232
Visitor helper class to fetch the appropriate upkeep value.
Definition: unit.hpp:1182
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:689
@ 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:735
void set_attr_changed(UNIT_ATTRIBUTE attr)
Definition: unit.hpp:185
virtual ~unit()
Definition: unit.cpp:769
bool get_attr_changed(UNIT_ATTRIBUTE attr) const
Definition: unit.hpp:192
void clear_changed_attributes()
Definition: unit.cpp:2805
void init(const config &cfg, bool use_traits=false, const vconfig *vcfg=nullptr)
Definition: unit.cpp:403
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:1133
bool get_attacks_changed() const
Definition: unit.cpp:1498
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:2007
unit_ability_list get_abilities(const std::string &tag_name) const
Gets the unit's active abilities of a particular type.
Definition: unit.hpp:1788
int movement_
Definition: unit.hpp:2030
void generate_name()
Generates a random race-appropriate name if one has not already been provided.
Definition: unit.cpp:787
std::vector< t_string > trait_names_
Definition: unit.hpp:2074
int unit_value_
Definition: unit.hpp:2078
int attacks_left_
Definition: unit.hpp:2041
bool generate_name_
Definition: unit.hpp:2105
void clear_visibility_cache() const
Clears the cache.
Definition: unit.hpp:2131
movetype movement_type_
Definition: unit.hpp:2035
config variables_
Definition: unit.hpp:2051
bool unrenamable_
Definition: unit.hpp:2022
int experience_
Definition: unit.hpp:2009
int vision_
Definition: unit.hpp:2032
void remove_ability_by_attribute(const config &filter)
Removes a unit's abilities with a specific ID or other attribute.
Definition: unit.cpp:1485
std::string undead_variation_
Definition: unit.hpp:2004
bool ability_active(const std::string &ability, const config &cfg, const map_location &loc) const
Check if an ability is active.
Definition: abilities.cpp:422
t_string type_name_
The displayed name of this unit type.
Definition: unit.hpp:1995
map_location interrupted_move_
Definition: unit.hpp:2079
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:531
unit_movement_resetter(const unit_movement_resetter &)=delete
bool random_traits_
Definition: unit.hpp:2104
void write(config &cfg, bool write_all=true) const
Serializes the current unit metadata values.
Definition: unit.cpp:1509
std::bitset< UA_COUNT > changed_attributes_
Definition: unit.hpp:2114
std::vector< const config * > open_queries_
While processing a recursive match, all the filters that are currently being checked,...
Definition: unit.hpp:2066
std::string small_profile_
Definition: unit.hpp:2110
void write_upkeep(config::attribute_value &upkeep) const
Definition: unit.cpp:2800
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:183
std::string id_
Definition: unit.hpp:2000
std::vector< t_string > special_notes_
Definition: unit.hpp:2098
bool canrecruit_
Definition: unit.hpp:2015
std::string image_mods_
Definition: unit.hpp:2020
std::string flag_rgb_
Definition: unit.hpp:2019
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:504
static std::map< std::string, state_t > known_boolean_state_names_
Definition: unit.hpp:2049
@ 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:1981
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:321
config events_
Definition: unit.hpp:2052
bool hidden_
Definition: unit.hpp:2090
bool is_healthy_
Definition: unit.hpp:2081
bool is_fearless_
Definition: unit.hpp:2081
config abilities_
Definition: unit.hpp:2093
utils::optional< std::string > ellipse_
Definition: unit.hpp:2102
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:255
const unit_type * type_
Never nullptr.
Definition: unit.hpp:1992
std::bitset< num_bool_states > known_boolean_states_
Definition: unit.hpp:2048
utils::optional< std::string > halo_
Definition: unit.hpp:2101
map_location::direction facing_
Definition: unit.hpp:2071
int side_
Definition: unit.hpp:2024
std::shared_ptr< const unit > parent
Definition: unit.hpp:1901
const unit_race * race_
Never nullptr, but may point to the null race.
Definition: unit.hpp:1998
bool appearance_changed_
Definition: unit.hpp:2113
int operator()(const upkeep_loyal &) const
Loyal units cost no upkeep.
Definition: unit.hpp:1193
bool appearance_changed() const
Definition: unit.hpp:1982
unit_alignments::type alignment_
Definition: unit.hpp:2017
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:1733
bool invisible(const map_location &loc, bool see_all=true) const
Definition: unit.cpp:2560
bool is_visible_to_team(const team &team, bool const see_all=true) const
Definition: unit.cpp:2603
std::enable_if_t<!std::is_same_v< int, T >, std::string > operator()(T &) const
Definition: unit.hpp:1215
n_unit::unit_id underlying_id_
Definition: unit.hpp:2002
std::string variation_
Definition: unit.hpp:2005
unit & mark_clone(bool is_temporary)
Mark this unit as clone so it can be inserted to unit_map.
Definition: unit.cpp:2661
bool has_ability_type(const std::string &ability) const
Check if the unit has an ability of a specific type.
Definition: abilities.cpp:558
std::enable_if_t< std::is_convertible_v< B, bool > &&!std::is_arithmetic_v< B >, upkeep_t > operator()(B b) const
Definition: unit.hpp:1245
static const std::size_t num_bool_states
Definition: unit.hpp:2046
config filter_recall_
Definition: unit.hpp:2053
int max_experience_
Definition: unit.hpp:2010
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:218
unit_race::GENDER gender_
Definition: unit.hpp:2026
int operator()(int v) const
Definition: unit.hpp:1198
bool get_self_ability_bool_weapon(const config &special, const std::string &tag_name, const map_location &loc, const const_attack_ptr &weapon=nullptr, const const_attack_ptr &opp_weapon=nullptr) const
Checks whether this unit currently possesses a given ability of leadership type.
Definition: abilities.cpp:1737
t_string description_
Definition: unit.hpp:2097
int level_
Definition: unit.hpp:2012
std::string role_
Definition: unit.hpp:2059
std::map< map_location, bool > invisibility_cache_
Hold the visibility status cache for a unit, when not uncovered.
Definition: unit.hpp:2123
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:1255
bool end_turn_
Definition: unit.hpp:2038
std::vector< std::string > advances_to_
Definition: unit.hpp:1989
std::unique_ptr< unit_animation_component > anim_comp_
Definition: unit.hpp:2088
std::enable_if_t< std::is_arithmetic_v< N >, upkeep_t > operator()(N n) const
Definition: unit.hpp:1236
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:1716
int recall_cost_
Definition: unit.hpp:2014
static std::string type()
Definition: unit.hpp:1172
const std::set< std::string > checking_tags_
Definition: unit.hpp:1906
attack_list attacks_
Definition: unit.hpp:2060
std::vector< std::string > get_ability_list() const
Get a list of all abilities by ID.
Definition: abilities.cpp:264
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:432
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:1795
void remove_ability_by_id(const std::string &ability)
Removes a unit's abilities with a specific ID.
Definition: unit.cpp:1472
bool get_adj_ability_bool_weapon(const config &special, const std::string &tag_name, int dir, const map_location &loc, const unit &from, const const_attack_ptr &weapon=nullptr, const const_attack_ptr &opp_weapon=nullptr) const
Checks whether this unit is affected by a given ability of leadership type.
Definition: abilities.cpp:1742
utils::optional< std::string > usage_
Definition: unit.hpp:2100
map_location loc_
Definition: unit.hpp:1987
static std::string type()
Definition: unit.hpp:1167
std::vector< std::string > overlays_
Definition: unit.hpp:2057
unit_formula_manager & formula_manager() const
Get the unit formula manager.
Definition: unit.hpp:1950
config modifications_
Definition: unit.hpp:2092
recursion_guard update_variables_recursion(const config &ability) const
Definition: abilities.cpp:381
bool has_ability_by_id(const std::string &ability) const
Check if the unit has an ability of a specific ID.
Definition: unit.cpp:1461
bool hold_position_
Definition: unit.hpp:2037
const config & abilities() const
Definition: unit.hpp:1800
upkeep_value_visitor(const unit &unit)
Definition: unit.hpp:1184
std::string operator()(int v) const
Definition: unit.hpp:1221
void parse_upkeep(const config::attribute_value &upkeep)
Definition: unit.cpp:2786
recursion_guard & operator=(recursion_guard &&)
Definition: abilities.cpp:406
std::vector< std::string > recruit_list_
Definition: unit.hpp:2016
const std::set< std::string > & checking_tags() const
Definition: unit.hpp:1802
recursion_guard(const recursion_guard &other)=delete
std::vector< config > advancements_
Definition: unit.hpp:2095
utils::string_map modification_descriptions_
Definition: unit.hpp:2083
upkeep_t operator()(utils::monostate) const
Definition: unit.hpp:1250
unit_checksum_version
Optional parameter for get_checksum to use the algorithm of an older version of Wesnoth,...
Definition: unit.hpp:2162
std::vector< std::string > trait_nonhidden_ids_
Definition: unit.hpp:2076
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:1726
upkeep_t upkeep_
Definition: unit.hpp:2107
int operator()(const upkeep_full &) const
Full upkeep equals the unit's level.
Definition: unit.hpp:1187
std::set< std::string > states_
Definition: unit.hpp:2044
std::string profile_
Definition: unit.hpp:2109
int jamming_
Definition: unit.hpp:2033
map_location goto_
Definition: unit.hpp:2079
t_string name_
Definition: unit.hpp:2001
int max_attacks_
Definition: unit.hpp:2042
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:2095
bool ability_affects_weapon(const config &cfg, const 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:539
int max_hit_points_
Definition: unit.hpp:2008
std::unique_ptr< unit_formula_manager > formula_man_
Definition: unit.hpp:2028
int max_movement_
Definition: unit.hpp:2031
bool resting_
Definition: unit.hpp:2039
std::vector< t_string > trait_descriptions_
Definition: unit.hpp:2075
bool emit_zoc_
Definition: unit.hpp:2055
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:1918
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:1346
bool user_end_turn() const
Check whether the user ended their turn.
Definition: unit.hpp:785
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:773
bool incapacitated() const
Check if the unit has been petrified.
Definition: unit.hpp:904
void set_state(const std::string &state, bool value)
Set whether the unit is affected by a status effect.
Definition: unit.cpp:1438
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:1307
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:1111
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:1407
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:2757
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:744
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:1417
bool slowed() const
Check if the unit has been slowed.
Definition: unit.hpp:913
bool get_state(const std::string &state) const
Check if the unit is affected by a status effect.
Definition: unit.cpp:1379
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:1120
void heal_fully()
Fully heal the unit, restoring it to max hitpoints.
Definition: unit.hpp:824
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:752
const std::string & type_id() const
The id of this unit's type.
Definition: unit.cpp:1913
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:1362
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:1331
void end_turn()
Refresh unit for the end of a turn.
Definition: unit.cpp:1317
bool take_hit(int damage)
Damage the unit.
Definition: unit.hpp:809
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:764
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:2644
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:895
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:852
double xp_bar_scaling() const
The factor by which the XP bar should be scaled.
Definition: unit.cpp:2774
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:1220
std::vector< t_string > unit_special_notes() const
The unit's special notes.
Definition: unit.cpp:2813
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.cpp:2770
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:853
@ STATE_UNKNOWN
To set the size of known_boolean_states_.
Definition: unit.hpp:862
@ STATE_NOT_MOVED
The unit is uncovered - it was hiding but has been spotted.
Definition: unit.hpp:857
@ STATE_GUARDIAN
The unit cannot be healed.
Definition: unit.hpp:859
@ STATE_INVULNERABLE
The unit is a guardian - it won't move unless a target is sighted.
Definition: unit.hpp:860
@ STATE_PETRIFIED
The unit is poisoned - it loses health each turn.
Definition: unit.hpp:855
@ NUMBER_OF_STATES
The unit is invulnerable - it cannot be hit by any attack.
Definition: unit.hpp:861
@ STATE_UNHEALABLE
The unit has not moved.
Definition: unit.hpp:858
@ STATE_POISONED
The unit is slowed - it moves slower and does less damage.
Definition: unit.hpp:854
@ STATE_UNCOVERED
The unit is petrified - it cannot move or be attacked.
Definition: unit.hpp:856
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:1842
std::vector< std::pair< std::string, std::string > > amla_icons() const
Gets the image and description data for modification advancements.
Definition: unit.cpp:1825
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:1907
void set_advances_to(const std::vector< std::string > &advances_to)
Sets this unit's advancement options.
Definition: unit.cpp:1241
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:1785
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:1226
void advance_to(const unit_type &t, bool use_traits=false)
Advances this unit to another type.
Definition: unit.cpp:964
void remove_attacks_ai()
Set the unit to have no attacks left for this turn.
Definition: unit.cpp:2739
attack_ptr add_attack(attack_itors::iterator position, Args &&... args)
Adds a new attack to the unit.
Definition: unit.hpp:943
bool remove_attack(const attack_ptr &atk)
Remove an attack from the unit.
Definition: unit.cpp:2728
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:1051
void set_max_attacks(int value)
Definition: unit.hpp:982
int attacks_left(bool base_value) const
Gets the remaining number of attacks this unit can perform this turn.
Definition: unit.hpp:1005
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:971
int defense_modifier(const t_translation::terrain_code &terrain) const
The unit's defense on a given terrain.
Definition: unit.cpp:1709
bool resistance_filter_matches(const config &cfg, const std::string &damage_name, int res) const
Definition: unit.cpp:1724
attack_itors attacks()
Gets an iterator over this unit's attacks.
Definition: unit.hpp:926
int resistance_against(const std::string &damage_name, bool attacker, const map_location &loc, const_attack_ptr weapon=nullptr, const const_attack_ptr &opp_weapon=nullptr) const
The unit's resistance against a given damage type.
Definition: unit.cpp:1773
utils::string_map_res get_base_resistances() const
Gets resistances without any abilities applied.
Definition: unit.hpp:1057
int max_attacks() const
The maximum number of attacks this unit may perform per turn, usually 1.
Definition: unit.hpp:977
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:1748
const_attack_itors attacks() const
Const overload of attacks.
Definition: unit.hpp:932
int attacks_left() const
Gets the remaining number of attacks this unit can perform this turn.
Definition: unit.hpp:993
void set_attacks(int left)
Sets the number of attacks this unit has left this turn.
Definition: unit.hpp:1014
color_t xp_color() const
Color for this unit's XP.
Definition: unit.cpp:1208
unit_animation_component & anim_comp() const
Definition: unit.hpp:1607
const std::string & effect_image_mods() const
Gets any IPF image mods applied by effects.
Definition: unit.hpp:1657
std::vector< std::string > overlays_abilities() const
Get the [overlay] ability overlay images.
Definition: unit.hpp:1676
color_t hp_color() const
Color for this unit's current hitpoints.
Definition: unit.cpp:1164
std::vector< std::string > halo_abilities() const
Get the [halo] abilities halo image(s).
Definition: unit.hpp:1627
std::string TC_image_mods() const
Constructs a recolor (RC) IPF string for this unit's team color.
Definition: unit.cpp:2713
static color_t hp_color_max()
Definition: unit.cpp:1174
const std::string & flag_rgb() const
Get the source color palette to use when recoloring the unit's image.
Definition: unit.cpp:1138
std::string image_ellipse() const
Get the unit's ellipse image.
Definition: unit.hpp:1636
std::string image_mods() const
Gets an IPF string containing all IPF image mods.
Definition: unit.cpp:2718
std::string default_anim_image() const
The default image to use for animation frames with no defined image.
Definition: unit.cpp:2542
std::string image_halo() const
Get the unit's halo image.
Definition: unit.hpp:1619
const std::vector< std::string > & overlays() const
Get the unit's overlay images.
Definition: unit.hpp:1670
std::string absolute_image() const
The name of the file to game_display (used in menus).
Definition: unit.cpp:2537
void set_image_ellipse(const std::string &ellipse)
Set the unit's ellipse image.
Definition: unit.hpp:1642
std::vector< std::string > halo_or_icon_abilities(const std::string &image_type) const
Definition: abilities.cpp:573
void set_image_halo(const std::string &halo)
Set the unit's halo image.
Definition: unit.cpp:2779
std::size_t advancements_count() const
Definition: unit.hpp:1557
std::size_t traits_count() const
Definition: unit.hpp:1547
void add_modification(const std::string &type, const config &modification, bool no_add=false)
Add a new modification to the unit.
Definition: unit.cpp:2420
static const std::set< std::string > builtin_effects
Definition: unit.hpp:1580
std::string describe_builtin_effect(const std::string &type, const config &effect)
Construct a string describing a built-in effect.
Definition: unit.cpp:1951
const config & get_modifications() const
Set the raw modifications.
Definition: unit.hpp:1525
config & get_modifications()
Get the raw modifications.
Definition: unit.hpp:1519
void apply_modifications()
Re-apply all saved modifications.
Definition: unit.cpp:2547
void expire_modifications(const std::string &duration)
Clears those modifications whose duration has expired.
Definition: unit.cpp:1274
std::size_t objects_count() const
Definition: unit.hpp:1552
void apply_builtin_effect(const std::string &type, const config &effect)
Apply a builtin effect to the unit.
Definition: unit.cpp:2016
std::size_t modification_count(const std::string &type, const std::string &id) const
Count modifications of a particular type.
Definition: unit.cpp:1925
bool emits_zoc() const
Tests whether the unit has a zone-of-control, considering incapacitated.
Definition: unit.hpp:1378
bool get_emit_zoc() const
Gets the raw zone-of-control flag, disregarding incapacitated.
Definition: unit.hpp:1384
int jamming() const
Gets the unit's jamming points.
Definition: unit.hpp:1446
bool has_goto() const
Gets whether this unit has a multi-turn destination set.
Definition: unit.hpp:1422
const map_location & get_location() const
The current map location this unit is at.
Definition: unit.hpp:1397
bool has_moved() const
Checks if this unit has moved.
Definition: unit.hpp:1352
int movement_cost(const t_translation::terrain_code &terrain) const
Get the unit's movement cost on a particular terrain.
Definition: unit.hpp:1480
const movetype & movement_type() const
Get the unit's movement type.
Definition: unit.hpp:1470
void set_movement(int moves, bool unit_action=false)
Set this unit's remaining movement to moves.
Definition: unit.cpp:1248
const map_location & get_interrupted_move() const
Get the target location of the unit's interrupted move.
Definition: unit.hpp:1458
int vision_cost(const t_translation::terrain_code &terrain) const
Get the unit's vision cost on a particular terrain.
Definition: unit.hpp:1490
void set_resting(bool rest)
Sets this unit's resting status.
Definition: unit.hpp:1372
void set_facing(map_location::direction dir) const
The this unit's facing.
Definition: unit.cpp:1674
void set_total_movement(int value)
Definition: unit.hpp:1311
void set_emit_zoc(bool val)
Sets the raw zone-of-control flag.
Definition: unit.hpp:1390
void set_goto(const map_location &new_goto)
Sets this unit's long term destination.
Definition: unit.hpp:1434
int movement_left() const
Gets how far a unit can move, considering the incapacitated flag.
Definition: unit.hpp:1322
int movement_left(bool base_value) const
Gets how far a unit can move.
Definition: unit.hpp:1334
int total_movement() const
The maximum moves this unit has.
Definition: unit.hpp:1306
int jamming_cost(const t_translation::terrain_code &terrain) const
Get the unit's jamming cost on a particular terrain.
Definition: unit.hpp:1500
void set_location(const map_location &loc)
Sets this unit's map location.
Definition: unit.hpp:1407
void remove_movement_ai()
Sets the unit to have no moves left for this turn.
Definition: unit.cpp:2748
bool move_interrupted() const
Check whether the unit's move has been interrupted.
Definition: unit.hpp:1452
int vision() const
Gets the unit's vision points.
Definition: unit.hpp:1440
const map_location & get_goto() const
The map location to which this unit is moving over multiple turns, if any.
Definition: unit.hpp:1428
map_location::direction facing() const
The current direction this unit is facing within its hex.
Definition: unit.hpp:1413
bool resting() const
Checks whether this unit is 'resting'.
Definition: unit.hpp:1366
void set_interrupted_move(const map_location &interrupted_move)
Set the target location of the unit's interrupted move.
Definition: unit.hpp:1464
bool is_flying() const
Check if the unit is a flying unit.
Definition: unit.hpp:1506
std::vector< std::string > get_advancements_list() const
Definition: unit.hpp:1138
std::vector< std::string > get_objects_list() const
Definition: unit.hpp:1133
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:929
int upkeep() const
Gets the amount of gold this unit costs a side per turn.
Definition: unit.cpp:1683
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:1112
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:2523
bool is_healthy() const
Gets whether this unit is healthy - ie, always rest heals.
Definition: unit.hpp:1293
bool is_fearless() const
Gets whether this unit is fearless - ie, unaffected by time of day.
Definition: unit.hpp:1287
utils::variant< upkeep_full, upkeep_loyal, int > upkeep_t
Definition: unit.hpp:1175
const std::vector< t_string > & trait_descriptions() const
Gets the descriptions of the currently registered traits.
Definition: unit.hpp:1101
std::vector< std::string > get_traits_list() const
Gets a list of the traits this unit currently has, including hidden traits.
Definition: unit.hpp:1128
const std::vector< t_string > & trait_names() const
Gets the names of the currently registered traits.
Definition: unit.hpp:1091
void generate_traits(bool must_have_only=false)
Applies mandatory traits (e.g.
Definition: unit.cpp:796
upkeep_t upkeep_raw() const
Gets the raw variant controlling the upkeep value.
Definition: unit.hpp:1270
void set_loyal(bool loyal)
Definition: unit.cpp:1698
bool loyal() const
Gets whether this unit is loyal - ie, it costs no upkeep.
Definition: unit.cpp:1693
void set_upkeep(upkeep_t v)
Sets the upkeep value to a specific value value.
Definition: unit.hpp:1276
Definition: halo.cpp:39
constexpr auto filter
Definition: ranges.hpp:38
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:1212
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:2144
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:2819
MacOS doesn't support std::visit when targing MacOS < 10.14 (currently we target 10....
#define b