The Battle for Wesnoth  1.15.6+dev
terrain.hpp
Go to the documentation of this file.
1 /*
2  Copyright (C) 2003 - 2018 by David White <dave@whitevine.net>
3  Part of the Battle for Wesnoth Project https://www.wesnoth.org/
4 
5  This program is free software; you can redistribute it and/or modify
6  it under the terms of the GNU General Public License as published by
7  the Free Software Foundation; either version 2 of the License, or
8  (at your option) any later version.
9  This program is distributed in the hope that it will be useful,
10  but WITHOUT ANY WARRANTY.
11 
12  See the COPYING file for more details.
13 */
14 
15 #pragma once
16 
17 #include "config.hpp"
18 #include "terrain/translation.hpp"
19 #include "utils/math.hpp"
20 
22 {
23 public:
24 
25  /**
26  * Creates an instance for which is_nonnull() returns false. Used for the
27  * sentinel value when terrain_type_data::get_terrain_info() is called for
28  * an unknown terrain code.
29  */
30  explicit terrain_type();
31 
32  /**
33  * Constructor for terrains defined by a WML [terrain_type] tag.
34  */
35  explicit terrain_type(const config& cfg);
36 
37  /**
38  * Used when a terrain code which hasn't been defined with a [terrain_type]
39  * tag is used in a map, to build the terrain from already-defined terrains.
40  */
41  explicit terrain_type(const terrain_type& base, const terrain_type& overlay);
42 
43  const std::string& icon_image() const { return icon_image_; }
44  const std::string& minimap_image() const { return minimap_image_; }
46  const std::string& editor_image() const { return editor_image_; }
47  const t_string& name() const { return name_; }
48  const t_string& editor_name() const { return editor_name_.empty() ? description() : editor_name_; }
49  const t_string& description() const { return description_.empty() ? name_ : description_; }
50  const t_string& help_topic_text() const { return help_topic_text_; }
51  const std::string& id() const { return id_; }
52 
53  /**
54  * For instances created from a [terrain_type] tag, the value in the tag
55  * (with default false).
56  *
57  * Always true for instances generated by the terrain_type(base, overlay)
58  * constructor.
59  */
60  bool hide_help() const { return hide_help_; }
61  bool hide_in_editor() const { return hide_in_editor_; }
62  bool hide_if_impassable() const { return hide_if_impassable_; }
63 
64  //the character representing this terrain
66 
67  /**
68  * The underlying type of the terrain.
69  *
70  * Whether "underlying" means "only the types used in [movetype]" is determined
71  * by the terrain.cfg file, rather than the .cpp code - in 1.14, the terrain.cfg
72  * file uses only the [movetype] terrains in its alias lists.
73  */
74  const t_translation::ter_list& mvt_type() const { return mvt_type_; }
75  const t_translation::ter_list& def_type() const { return def_type_; }
77  const t_translation::ter_list& union_type() const { return union_type_; }
78 
79  /**
80  * Returns true if a terrain has no underlying types other than itself,
81  * in respect of either union, movement or defense.
82  *
83  * If this returns false, then @underlying must be non-empty.
84  *
85  * This function is to encapsulate the logic of whether such a terrain
86  * is represented by a empty list, or whether it's represented by a list
87  * including only itself; so that a refactor can switch between these two
88  * possible implementations.
89  *
90  * This is not related to whether the terrain has an overlay. For example,
91  * Gg^Uf (flat with old mushrooms) is indivisible (it's only Tt), although
92  * Gg^Tf (flat with new mushrooms) can be divided (in to Gt and Tt).
93  *
94  * \todo: should this document vision_type() too?
95  *
96  * @a id the terrain
97  * @a underlying the corresponding mvt_type(), def_type() or union_type()
98  */
100  return (underlying.empty()
101  || (underlying.size() == 1 && underlying.front() == id));
102  }
103 
104  /**
105  * Returns true if this terrain has no underlying types other than itself.
106  *
107  * \todo what about a terrain where is_mvt_indivisible() != is_def_indivisible()?
108  */
109  bool is_indivisible() const {
110  return (union_type_.empty()
111  || (union_type_.size() == 1 && union_type_.front() == number_));
112  }
113  bool is_mvt_indivisible() const {
114  return (mvt_type_.empty()
115  || (mvt_type_.size() == 1 && mvt_type_.front() == number_));
116  }
117 
118  /**
119  * True if this object represents some sentinel values.
120  *
121  * \todo number_ should never be NONE_TERRAIN
122  * \todo there's two different VOID_TERRAINS - see the comment attached to
123  * the definition of VOID_TERRAIN.
124  *
125  * \todo unclear what this should mean, so replace it with a clearly-named
126  * successor.
127  */
128  bool is_nonnull() const { return (number_ != t_translation::NONE_TERRAIN) &&
130  /// Returns the light (lawful) bonus for this terrain when the time of day
131  /// 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_; }
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 */
191 
192  /** The image used in the minimap */
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  */
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 
234 
236 
240 };
bool is_indivisible() const
Returns true if this terrain has no underlying types other than itself.
Definition: terrain.hpp:109
bool height_adjust_set_
Definition: terrain.hpp:218
std::string minimap_image_overlay_
Definition: terrain.hpp:194
bool is_mvt_indivisible() const
Definition: terrain.hpp:113
const t_translation::ter_list & mvt_type() const
The underlying type of the terrain.
Definition: terrain.hpp:74
bool is_castle() const
Definition: terrain.hpp:142
t_translation::terrain_code editor_default_base_
Definition: terrain.hpp:238
const terrain_code NONE_TERRAIN
Definition: translation.hpp:59
const t_string & description() const
Definition: terrain.hpp:49
t_translation::ter_list mvt_type_
Definition: terrain.hpp:212
bool is_overlay() const
Definition: terrain.hpp:155
t_translation::ter_list def_type_
Definition: terrain.hpp:214
t_string name_
Definition: terrain.hpp:202
std::string id_
Definition: terrain.hpp:201
bool hide_in_editor_
Definition: terrain.hpp:239
double unit_submerge() const
Definition: terrain.hpp:138
t_string income_description_
Definition: terrain.hpp:228
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
bool operator==(const terrain_type &other) const
Returns true if all most of the data matches.
Definition: terrain.cpp:303
bool combined_
Definition: terrain.hpp:237
bool hide_help_
Definition: terrain.hpp:239
A terrain string which is converted to a terrain is a string with 1 or 2 layers the layers are separa...
Definition: translation.hpp:50
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:99
const t_string & income_description() const
Definition: terrain.hpp:147
const std::string & editor_image() const
Definition: terrain.hpp:46
std::string str
Definition: statement.cpp:110
Definitions for the interface to Wesnoth Markup Language (WML).
t_string description_
Definition: terrain.hpp:204
bool hide_help() const
For instances created from a [terrain_type] tag, the value in the tag (with default false)...
Definition: terrain.hpp:60
t_string income_description_own_
Definition: terrain.hpp:231
std::string editor_group_
Definition: terrain.hpp:233
bool is_nonnull() const
True if this object represents some sentinel values.
Definition: terrain.hpp:128
const terrain_code VOID_TERRAIN
VOID_TERRAIN is used for shrouded hexes.
bool is_village() const
Definition: terrain.hpp:141
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
const t_string & editor_name() const
Definition: terrain.hpp:48
t_translation::terrain_code default_base() const
Definition: terrain.hpp:169
bool is_combined() const
True for instances created by the terrain_code(base, overlay) constructor.
Definition: terrain.hpp:167
t_string income_description_ally_
Definition: terrain.hpp:229
int unit_height_adjust() const
Definition: terrain.hpp:137
bool hide_if_impassable() const
Definition: terrain.hpp:62
bool submerge_set_
Definition: terrain.hpp:221
const t_translation::ter_list & vision_type() const
Definition: terrain.hpp:76
General math utility functions.
int gives_healing() const
Definition: terrain.hpp:140
int max_light_
Definition: terrain.hpp:224
double submerge_
Definition: terrain.hpp:220
int height_adjust_
Definition: terrain.hpp:217
bool is_keep() const
Definition: terrain.hpp:143
terrain_type()
Creates an instance for which is_nonnull() returns false.
Definition: terrain.cpp:35
t_translation::terrain_code number_
Definition: terrain.hpp:211
t_translation::ter_list union_type_
Definition: terrain.hpp:215
t_translation::ter_list vision_type_
Definition: terrain.hpp:213
t_translation::terrain_code terrain_with_default_base() const
Definition: terrain.cpp:296
t_translation::terrain_code number() const
Definition: terrain.hpp:65
const t_string & income_description_own() const
Definition: terrain.hpp:150
const t_string & income_description_enemy() const
Definition: terrain.hpp:149
bool hide_if_impassable_
Definition: terrain.hpp:239
const t_translation::ter_list & union_type() const
Definition: terrain.hpp:77
const std::string & minimap_image() const
Definition: terrain.hpp:44
std::string minimap_image_
The image used in the minimap.
Definition: terrain.hpp:193
bool castle_
Definition: terrain.hpp:235
bool hide_in_editor() const
Definition: terrain.hpp:61
bool village_
Definition: terrain.hpp:235
const t_string & name() const
Definition: terrain.hpp:47
t_string income_description_enemy_
Definition: terrain.hpp:230
int light_modification_
Definition: terrain.hpp:223
void set_editor_group(const std::string &str)
Definition: terrain.hpp:153
bool empty() const
Definition: tstring.hpp:182
bool overlay_
Definition: terrain.hpp:237
int min_light_
Definition: terrain.hpp:225
const t_translation::ter_list & def_type() const
Definition: terrain.hpp:75
const std::string & id() const
Definition: terrain.hpp:51
std::vector< terrain_code > ter_list
Definition: translation.hpp:78
const t_string & income_description_ally() const
Definition: terrain.hpp:148
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:47
t_string help_topic_text_
Definition: terrain.hpp:205
std::string icon_image_
The image used as symbol icon.
Definition: terrain.hpp:190
A config object defines a single node in a WML file, with access to child nodes.
Definition: config.hpp:68
const std::string & minimap_image_overlay() const
Definition: terrain.hpp:45
const t_string & help_topic_text() const
Definition: terrain.hpp:50
const std::string & editor_group() const
Definition: terrain.hpp:152
const std::string & icon_image() const
Definition: terrain.hpp:43
t_string editor_name_
Definition: terrain.hpp:203