The Battle for Wesnoth  1.15.12+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_; }
45  const std::string& minimap_image_overlay() const { return minimap_image_overlay_; }
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 @a 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  * @param id the terrain
97  * @param 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 gives a @a base bonus. */
131  int light_bonus(int base) const
132  {
134  }
135 
136  int unit_height_adjust() const { return height_adjust_; }
137  double unit_submerge() const { return submerge_; }
138 
139  int gives_healing() const { return heals_; }
140  bool is_village() const { return village_; }
141  bool is_castle() const { return castle_; }
142  bool is_keep() const { return keep_; }
143 
144  //these descriptions are shown for the terrain in the mouse over
145  //depending on the owner or the village
150 
151  const std::string& editor_group() const { return editor_group_; }
152  void set_editor_group(const std::string& str) { editor_group_ = str; }
153 
154  bool is_overlay() const { return overlay_; }
155 
156  /**
157  * True for instances created by the terrain_code(base, overlay) constructor.
158  *
159  * False for instances created by the terrain_type(config) constructor,
160  * implying that they were created directly from a WML [terrain_type] tag.
161  *
162  * Note that this returns false for terrains such as Dd^Dc (crater) and
163  * Mm^Xm (regular impassible mountains), because there are [terrain_type]
164  * tags for those specific combinations of base^overlay.
165  */
166  bool is_combined() const { return combined_; }
167 
170 
171  /**
172  * Returns true if all most of the data matches. The ones that don't need to match:
173  * - editor_group_
174  * - icon_image_
175  * - description_
176  * - help_topic_text_
177  * - income_description_ , ~ally_ , ~enemy_, ~own_
178  * - hide_if_impassable_
179  *
180  * The intention seems to be to allow additional [terrain_type] tags to add
181  * compatible definitions to multiple addon-specific editor groups. For
182  * this purpose the description strings aren't too important, and
183  * hide_if_impassable_ seems trivial.
184  */
185  bool operator==(const terrain_type& other) const;
186 private:
187 
188  /** The image used as symbol icon */
189  std::string icon_image_;
190 
191  /** The image used in the minimap */
192  std::string minimap_image_;
194 
195  /**
196  * The image used in the editor palette if not defined in WML it will be
197  * initialized with the value of minimap_image_
198  */
199  std::string editor_image_;
200  std::string id_;
205 
206  //the 'number' is the number that represents this
207  //terrain type. The 'type' is a list of the 'underlying types'
208  //of the terrain. This may simply be the same as the number.
209  //This is the internal number used, WML still uses character strings.
215 
218 
219  double submerge_;
221 
225  int heals_;
226 
231 
232  std::string editor_group_;
233 
235 
239 };
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:217
std::string minimap_image_overlay_
Definition: terrain.hpp:193
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:141
t_translation::terrain_code editor_default_base_
Definition: terrain.hpp:237
const terrain_code NONE_TERRAIN
Definition: translation.hpp:58
const t_string & description() const
Definition: terrain.hpp:49
t_translation::ter_list mvt_type_
Definition: terrain.hpp:211
bool is_overlay() const
Definition: terrain.hpp:154
t_translation::ter_list def_type_
Definition: terrain.hpp:213
t_string name_
Definition: terrain.hpp:201
std::string id_
Definition: terrain.hpp:200
bool hide_in_editor_
Definition: terrain.hpp:238
double unit_submerge() const
Definition: terrain.hpp:137
t_string income_description_
Definition: terrain.hpp:227
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:199
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:236
bool hide_help_
Definition: terrain.hpp:238
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
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:146
const std::string & editor_image() const
Definition: terrain.hpp:46
Definitions for the interface to Wesnoth Markup Language (WML).
t_string description_
Definition: terrain.hpp:203
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:230
std::string editor_group_
Definition: terrain.hpp:232
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:140
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:131
const t_string & editor_name() const
Definition: terrain.hpp:48
t_translation::terrain_code default_base() const
Definition: terrain.hpp:168
bool is_combined() const
True for instances created by the terrain_code(base, overlay) constructor.
Definition: terrain.hpp:166
t_string income_description_ally_
Definition: terrain.hpp:228
int unit_height_adjust() const
Definition: terrain.hpp:136
bool hide_if_impassable() const
Definition: terrain.hpp:62
bool submerge_set_
Definition: terrain.hpp:220
const t_translation::ter_list & vision_type() const
Definition: terrain.hpp:76
General math utility functions.
int gives_healing() const
Definition: terrain.hpp:139
int max_light_
Definition: terrain.hpp:223
double submerge_
Definition: terrain.hpp:219
int height_adjust_
Definition: terrain.hpp:216
bool is_keep() const
Definition: terrain.hpp:142
terrain_type()
Creates an instance for which is_nonnull() returns false.
Definition: terrain.cpp:35
t_translation::terrain_code number_
Definition: terrain.hpp:210
t_translation::ter_list union_type_
Definition: terrain.hpp:214
t_translation::ter_list vision_type_
Definition: terrain.hpp:212
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:149
const t_string & income_description_enemy() const
Definition: terrain.hpp:148
bool hide_if_impassable_
Definition: terrain.hpp:238
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:192
bool castle_
Definition: terrain.hpp:234
bool hide_in_editor() const
Definition: terrain.hpp:61
bool village_
Definition: terrain.hpp:234
const t_string & name() const
Definition: terrain.hpp:47
t_string income_description_enemy_
Definition: terrain.hpp:229
int light_modification_
Definition: terrain.hpp:222
void set_editor_group(const std::string &str)
Definition: terrain.hpp:152
bool empty() const
Definition: tstring.hpp:186
bool overlay_
Definition: terrain.hpp:236
int min_light_
Definition: terrain.hpp:224
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:77
const t_string & income_description_ally() const
Definition: terrain.hpp:147
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:204
std::string icon_image_
The image used as symbol icon.
Definition: terrain.hpp:189
A config object defines a single node in a WML file, with access to child nodes.
Definition: config.hpp:59
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:151
const std::string & icon_image() const
Definition: terrain.hpp:43
t_string editor_name_
Definition: terrain.hpp:202