The Battle for Wesnoth  1.19.5+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 
169  /**
170  * Overlay terrains defined by a [terrain_type] can declare a fallback base
171  * terrain, for use when the overlay is selected in the editor, or when the
172  * overlay is placed on the map using [terrain]replace_if_failed=true.
173  *
174  * If there's no default, returns a sentinel value; see has_default_base().
175  */
178 
179  /**
180  * Return the overlay part of this terrain, on the default_base(). Might
181  * return an unknown terrain, if there's a typo in the default base.
182  *
183  * If this terrain has no overlay, it returns the terrain itself, ignoring
184  * the default_base() even if the terrain has a default_base().
185  *
186  * This is intended for the editor's single-layer placement, or for
187  * replacing terrains via ActionWML, where the user or WML author intends
188  * to only use one layer of the current terrain.
189  */
191 
192  /**
193  * Returns true if most of the data matches. The ones that don't need to match:
194  * - editor_group_
195  * - icon_image_
196  * - description_
197  * - help_topic_text_
198  * - income_description_ , ~ally_ , ~enemy_, ~own_
199  * - hide_if_impassable_
200  *
201  * The intention seems to be to allow additional [terrain_type] tags to add
202  * compatible definitions to multiple addon-specific editor groups. For
203  * this purpose the description strings aren't too important, and
204  * hide_if_impassable_ seems trivial.
205  */
206  bool operator==(const terrain_type& other) const;
207 private:
208 
209  /** The image used as symbol icon */
210  std::string icon_image_;
211 
212  /** The image used in the minimap */
213  std::string minimap_image_;
215 
216  /**
217  * The image used in the editor palette if not defined in WML it will be
218  * initialized with the value of minimap_image_
219  */
220  std::string editor_image_;
221  std::string id_;
226 
227  //the 'number' is the number that represents this
228  //terrain type. The 'type' is a list of the 'underlying types'
229  //of the terrain. This may simply be the same as the number.
230  //This is the internal number used, WML still uses character strings.
236 
239 
240  double submerge_;
242 
246  int heals_;
247 
252 
253  std::string editor_group_;
254 
256 
260 };
A config object defines a single node in a WML file, with access to child nodes.
Definition: config.hpp:172
bool empty() const
Definition: tstring.hpp:194
const std::string & editor_group() const
Definition: terrain.hpp:152
bool has_default_base() const
Definition: terrain.hpp:177
bool castle_
Definition: terrain.hpp:255
bool submerge_set_
Definition: terrain.hpp:241
int light_modification_
Definition: terrain.hpp:243
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:221
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:248
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:257
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:220
t_translation::terrain_code editor_default_base_
Definition: terrain.hpp:258
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
Return the overlay part of this terrain, on the default_base().
Definition: terrain.cpp:291
int height_adjust_
Definition: terrain.hpp:237
const std::string & editor_image() const
Definition: terrain.hpp:47
t_translation::ter_list mvt_type_
Definition: terrain.hpp:232
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:223
bool is_castle() const
Definition: terrain.hpp:142
std::string minimap_image_overlay_
Definition: terrain.hpp:214
int max_light_
Definition: terrain.hpp:244
const t_string & income_description_ally() const
Definition: terrain.hpp:148
t_string help_topic_text_
Definition: terrain.hpp:225
t_translation::terrain_code number_
Definition: terrain.hpp:231
t_string income_description_ally_
Definition: terrain.hpp:249
std::string icon_image_
The image used as symbol icon.
Definition: terrain.hpp:210
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:235
bool combined_
Definition: terrain.hpp:257
bool hide_help_
Definition: terrain.hpp:259
t_translation::ter_list def_type_
Definition: terrain.hpp:234
t_string description_
Definition: terrain.hpp:224
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:213
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:253
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:240
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:251
bool hide_if_impassable() const
Definition: terrain.hpp:63
t_translation::ter_list vision_type_
Definition: terrain.hpp:233
const t_translation::ter_list & union_type() const
Definition: terrain.hpp:78
int min_light_
Definition: terrain.hpp:245
bool is_overlay() const
Definition: terrain.hpp:155
bool hide_if_impassable_
Definition: terrain.hpp:259
bool village_
Definition: terrain.hpp:255
bool hide_in_editor_
Definition: terrain.hpp:259
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
Overlay terrains defined by a [terrain_type] can declare a fallback base terrain, for use when the ov...
Definition: terrain.hpp:176
t_string name_
Definition: terrain.hpp:222
const t_string & income_description_own() const
Definition: terrain.hpp:150
bool height_adjust_set_
Definition: terrain.hpp:238
bool hide_in_editor() const
Definition: terrain.hpp:62
t_string income_description_enemy_
Definition: terrain.hpp:250
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 most of the data matches.
Definition: terrain.cpp:298
Definitions for the interface to Wesnoth Markup Language (WML).
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