The Battle for Wesnoth  1.19.0-dev
terrain.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 "config.hpp"
19 #include "terrain/translation.hpp"
20 #include "utils/math.hpp"
21 
23 {
24 public:
25 
26  /**
27  * Creates an instance for which is_nonnull() returns false. Used for the
28  * sentinel value when terrain_type_data::get_terrain_info() is called for
29  * an unknown terrain code.
30  */
31  explicit terrain_type();
32 
33  /**
34  * Constructor for terrains defined by a WML [terrain_type] tag.
35  */
36  explicit terrain_type(const config& cfg);
37 
38  /**
39  * Used when a terrain code which hasn't been defined with a [terrain_type]
40  * tag is used in a map, to build the terrain from already-defined terrains.
41  */
42  explicit terrain_type(const terrain_type& base, const terrain_type& overlay);
43 
44  const std::string& icon_image() const { return icon_image_; }
45  const std::string& minimap_image() const { return minimap_image_; }
46  const std::string& minimap_image_overlay() const { return minimap_image_overlay_; }
47  const std::string& editor_image() const { return editor_image_; }
48  const t_string& name() const { return name_; }
49  const t_string& editor_name() const { return editor_name_.empty() ? description() : editor_name_; }
50  const t_string& description() const { return description_.empty() ? name_ : description_; }
51  const t_string& help_topic_text() const { return help_topic_text_; }
52  const std::string& id() const { return id_; }
53 
54  /**
55  * For instances created from a [terrain_type] tag, the value in the tag
56  * (with default false).
57  *
58  * Always true for instances generated by the terrain_type(base, overlay)
59  * constructor.
60  */
61  bool hide_help() const { return hide_help_; }
62  bool hide_in_editor() const { return hide_in_editor_; }
63  bool hide_if_impassable() const { return hide_if_impassable_; }
64 
65  //the character representing this terrain
67 
68  /**
69  * The underlying type of the terrain.
70  *
71  * Whether "underlying" means "only the types used in [movetype]" is determined
72  * by the terrain.cfg file, rather than the .cpp code - in 1.14, the terrain.cfg
73  * file uses only the [movetype] terrains in its alias lists.
74  */
75  const t_translation::ter_list& mvt_type() const { return mvt_type_; }
76  const t_translation::ter_list& def_type() const { return def_type_; }
78  const t_translation::ter_list& union_type() const { return union_type_; }
79 
80  /**
81  * Returns true if a terrain has no underlying types other than itself,
82  * in respect of either union, movement or defense.
83  *
84  * If this returns false, then @a underlying must be non-empty.
85  *
86  * This function is to encapsulate the logic of whether such a terrain
87  * is represented by a empty list, or whether it's represented by a list
88  * including only itself; so that a refactor can switch between these two
89  * possible implementations.
90  *
91  * This is not related to whether the terrain has an overlay. For example,
92  * Gg^Uf (flat with old mushrooms) is indivisible (it's only Tt), although
93  * Gg^Tf (flat with new mushrooms) can be divided (in to Gt and Tt).
94  *
95  * TODO: should this document vision_type() too?
96  *
97  * @param id the terrain
98  * @param underlying the corresponding mvt_type(), def_type() or union_type()
99  */
101  return (underlying.empty()
102  || (underlying.size() == 1 && underlying.front() == id));
103  }
104 
105  /**
106  * Returns true if this terrain has no underlying types other than itself.
107  *
108  * \todo what about a terrain where is_mvt_indivisible() != is_def_indivisible()?
109  */
110  bool is_indivisible() const {
111  return (union_type_.empty()
112  || (union_type_.size() == 1 && union_type_.front() == number_));
113  }
114  bool is_mvt_indivisible() const {
115  return (mvt_type_.empty()
116  || (mvt_type_.size() == 1 && mvt_type_.front() == number_));
117  }
118 
119  /**
120  * True if this object represents some sentinel values.
121  *
122  * \todo number_ should never be NONE_TERRAIN
123  * \todo there's two different VOID_TERRAINS - see the comment attached to
124  * the definition of VOID_TERRAIN.
125  *
126  * \todo unclear what this should mean, so replace it with a clearly-named
127  * successor.
128  */
129  bool is_nonnull() const { return (number_ != t_translation::NONE_TERRAIN) &&
131  /** Returns the light (lawful) bonus for this terrain when the time of day gives a @a base bonus. */
132  int light_bonus(int base) const
133  {
135  }
136 
137  int unit_height_adjust() const { return height_adjust_; }
138  double unit_submerge() const { return submerge_; }
139 
140  int gives_healing() const { return heals_; }
141  bool is_village() const { return village_; }
142  bool is_castle() const { return castle_; }
143  bool is_keep() const { return keep_; }
144 
145  //these descriptions are shown for the terrain in the mouse over
146  //depending on the owner or the village
151 
152  const std::string& editor_group() const { return editor_group_; }
153  void set_editor_group(const std::string& str) { editor_group_ = str; }
154 
155  bool is_overlay() const { return overlay_; }
156 
157  /**
158  * True for instances created by the terrain_code(base, overlay) constructor.
159  *
160  * False for instances created by the terrain_type(config) constructor,
161  * implying that they were created directly from a WML [terrain_type] tag.
162  *
163  * Note that this returns false for terrains such as Dd^Dc (crater) and
164  * Mm^Xm (regular impassible mountains), because there are [terrain_type]
165  * tags for those specific combinations of base^overlay.
166  */
167  bool is_combined() const { return combined_; }
168 
171 
172  /**
173  * Returns true if all most of the data matches. The ones that don't need to match:
174  * - editor_group_
175  * - icon_image_
176  * - description_
177  * - help_topic_text_
178  * - income_description_ , ~ally_ , ~enemy_, ~own_
179  * - hide_if_impassable_
180  *
181  * The intention seems to be to allow additional [terrain_type] tags to add
182  * compatible definitions to multiple addon-specific editor groups. For
183  * this purpose the description strings aren't too important, and
184  * hide_if_impassable_ seems trivial.
185  */
186  bool operator==(const terrain_type& other) const;
187 private:
188 
189  /** The image used as symbol icon */
190  std::string icon_image_;
191 
192  /** The image used in the minimap */
193  std::string minimap_image_;
195 
196  /**
197  * The image used in the editor palette if not defined in WML it will be
198  * initialized with the value of minimap_image_
199  */
200  std::string editor_image_;
201  std::string id_;
206 
207  //the 'number' is the number that represents this
208  //terrain type. The 'type' is a list of the 'underlying types'
209  //of the terrain. This may simply be the same as the number.
210  //This is the internal number used, WML still uses character strings.
216 
219 
220  double submerge_;
222 
226  int heals_;
227 
232 
233  std::string editor_group_;
234 
236 
240 };
A config object defines a single node in a WML file, with access to child nodes.
Definition: config.hpp:159
bool empty() const
Definition: tstring.hpp:186
const std::string & editor_group() const
Definition: terrain.hpp:152
bool castle_
Definition: terrain.hpp:235
bool submerge_set_
Definition: terrain.hpp:221
int light_modification_
Definition: terrain.hpp:223
bool hide_help() const
For instances created from a [terrain_type] tag, the value in the tag (with default false).
Definition: terrain.hpp:61
const t_string & income_description_enemy() const
Definition: terrain.hpp:149
std::string id_
Definition: terrain.hpp:201
const std::string & minimap_image() const
Definition: terrain.hpp:45
const std::string & icon_image() const
Definition: terrain.hpp:44
t_string income_description_
Definition: terrain.hpp:228
const t_translation::ter_list & vision_type() const
Definition: terrain.hpp:77
const t_string & income_description() const
Definition: terrain.hpp:147
const t_string & name() const
Definition: terrain.hpp:48
bool overlay_
Definition: terrain.hpp:237
std::string editor_image_
The image used in the editor palette if not defined in WML it will be initialized with the value of m...
Definition: terrain.hpp:200
t_translation::terrain_code editor_default_base_
Definition: terrain.hpp:238
bool is_combined() const
True for instances created by the terrain_code(base, overlay) constructor.
Definition: terrain.hpp:167
int unit_height_adjust() const
Definition: terrain.hpp:137
t_translation::terrain_code terrain_with_default_base() const
Definition: terrain.cpp:295
int height_adjust_
Definition: terrain.hpp:217
const std::string & editor_image() const
Definition: terrain.hpp:47
t_translation::ter_list mvt_type_
Definition: terrain.hpp:212
bool is_nonnull() const
True if this object represents some sentinel values.
Definition: terrain.hpp:129
bool is_keep() const
Definition: terrain.hpp:143
t_string editor_name_
Definition: terrain.hpp:203
bool is_castle() const
Definition: terrain.hpp:142
std::string minimap_image_overlay_
Definition: terrain.hpp:194
int max_light_
Definition: terrain.hpp:224
const t_string & income_description_ally() const
Definition: terrain.hpp:148
t_string help_topic_text_
Definition: terrain.hpp:205
t_translation::terrain_code number_
Definition: terrain.hpp:211
t_string income_description_ally_
Definition: terrain.hpp:229
std::string icon_image_
The image used as symbol icon.
Definition: terrain.hpp:190
const std::string & id() const
Definition: terrain.hpp:52
bool is_mvt_indivisible() const
Definition: terrain.hpp:114
t_translation::ter_list union_type_
Definition: terrain.hpp:215
bool combined_
Definition: terrain.hpp:237
bool hide_help_
Definition: terrain.hpp:239
t_translation::ter_list def_type_
Definition: terrain.hpp:214
t_string description_
Definition: terrain.hpp:204
void set_editor_group(const std::string &str)
Definition: terrain.hpp:153
const t_string & description() const
Definition: terrain.hpp:50
std::string minimap_image_
The image used in the minimap.
Definition: terrain.hpp:193
terrain_type()
Creates an instance for which is_nonnull() returns false.
Definition: terrain.cpp:34
const t_string & help_topic_text() const
Definition: terrain.hpp:51
std::string editor_group_
Definition: terrain.hpp:233
bool is_village() const
Definition: terrain.hpp:141
const t_translation::ter_list & def_type() const
Definition: terrain.hpp:76
const t_translation::ter_list & mvt_type() const
The underlying type of the terrain.
Definition: terrain.hpp:75
double submerge_
Definition: terrain.hpp:220
double unit_submerge() const
Definition: terrain.hpp:138
int light_bonus(int base) const
Returns the light (lawful) bonus for this terrain when the time of day gives a base bonus.
Definition: terrain.hpp:132
t_string income_description_own_
Definition: terrain.hpp:231
bool hide_if_impassable() const
Definition: terrain.hpp:63
t_translation::ter_list vision_type_
Definition: terrain.hpp:213
const t_translation::ter_list & union_type() const
Definition: terrain.hpp:78
int min_light_
Definition: terrain.hpp:225
bool is_overlay() const
Definition: terrain.hpp:155
bool hide_if_impassable_
Definition: terrain.hpp:239
bool village_
Definition: terrain.hpp:235
bool hide_in_editor_
Definition: terrain.hpp:239
static bool is_indivisible(t_translation::terrain_code id, const t_translation::ter_list &underlying)
Returns true if a terrain has no underlying types other than itself, in respect of either union,...
Definition: terrain.hpp:100
const t_string & editor_name() const
Definition: terrain.hpp:49
int gives_healing() const
Definition: terrain.hpp:140
t_translation::terrain_code default_base() const
Definition: terrain.hpp:169
t_string name_
Definition: terrain.hpp:202
const t_string & income_description_own() const
Definition: terrain.hpp:150
bool height_adjust_set_
Definition: terrain.hpp:218
bool hide_in_editor() const
Definition: terrain.hpp:62
t_string income_description_enemy_
Definition: terrain.hpp:230
const std::string & minimap_image_overlay() const
Definition: terrain.hpp:46
bool is_indivisible() const
Returns true if this terrain has no underlying types other than itself.
Definition: terrain.hpp:110
t_translation::terrain_code number() const
Definition: terrain.hpp:66
bool operator==(const terrain_type &other) const
Returns true if all most of the data matches.
Definition: terrain.cpp:302
General math utility functions.
constexpr int bounded_add(int base, int increment, int max_sum, int min_sum=0)
Returns base + increment, but will not increase base above max_sum, nor decrease it below min_sum.
Definition: math.hpp:48
const terrain_code VOID_TERRAIN
VOID_TERRAIN is used for shrouded hexes.
std::vector< terrain_code > ter_list
Definition: translation.hpp:77
const terrain_code NONE_TERRAIN
Definition: translation.hpp:58
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