OpenTTD Source  20241124-master-g9399a92a4f
bridge_gui.cpp
Go to the documentation of this file.
1 /*
2  * This file is part of OpenTTD.
3  * OpenTTD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2.
4  * OpenTTD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
5  * See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see <http://www.gnu.org/licenses/>.
6  */
7 
10 #include "stdafx.h"
11 #include "error.h"
12 #include "command_func.h"
13 #include "rail.h"
14 #include "road.h"
15 #include "strings_func.h"
16 #include "window_func.h"
17 #include "sound_func.h"
18 #include "gfx_func.h"
19 #include "tunnelbridge.h"
20 #include "sortlist_type.h"
21 #include "dropdown_func.h"
22 #include "core/geometry_func.hpp"
23 #include "tunnelbridge_map.h"
24 #include "road_gui.h"
25 #include "tunnelbridge_cmd.h"
26 
27 #include "widgets/bridge_widget.h"
28 
29 #include "table/strings.h"
30 
31 #include "safeguards.h"
32 
37 
42  BridgeType index;
43  const BridgeSpec *spec;
44  Money cost;
45 };
46 
48 
57 void CcBuildBridge(Commands, const CommandCost &result, TileIndex end_tile, TileIndex tile_start, TransportType transport_type, BridgeType, uint8_t)
58 {
59  if (result.Failed()) return;
60  if (_settings_client.sound.confirm) SndPlayTileFx(SND_27_CONSTRUCTION_BRIDGE, end_tile);
61 
62  if (transport_type == TRANSPORT_ROAD) {
63  DiagDirection end_direction = ReverseDiagDir(GetTunnelBridgeDirection(end_tile));
64  ConnectRoadToStructure(end_tile, end_direction);
65 
66  DiagDirection start_direction = ReverseDiagDir(GetTunnelBridgeDirection(tile_start));
67  ConnectRoadToStructure(tile_start, start_direction);
68  }
69 }
70 
72 class BuildBridgeWindow : public Window {
73 private:
74  /* Runtime saved values */
76 
77  /* Constants for sorting the bridges */
78  static inline const StringID sorter_names[] = {
79  STR_SORT_BY_NUMBER,
80  STR_SORT_BY_COST,
81  STR_SORT_BY_MAX_SPEED,
82  };
83  static const std::initializer_list<GUIBridgeList::SortFunction * const> sorter_funcs;
84 
85  /* Internal variables */
86  TileIndex start_tile;
87  TileIndex end_tile;
88  TransportType transport_type;
89  uint8_t road_rail_type;
90  GUIBridgeList bridges;
91  int icon_width;
92  Scrollbar *vscroll;
93 
95  static bool BridgeIndexSorter(const BuildBridgeData &a, const BuildBridgeData &b)
96  {
97  return a.index < b.index;
98  }
99 
101  static bool BridgePriceSorter(const BuildBridgeData &a, const BuildBridgeData &b)
102  {
103  return a.cost < b.cost;
104  }
105 
107  static bool BridgeSpeedSorter(const BuildBridgeData &a, const BuildBridgeData &b)
108  {
109  return a.spec->speed < b.spec->speed;
110  }
111 
112  void BuildBridge(BridgeType type)
113  {
114  switch (this->transport_type) {
115  case TRANSPORT_RAIL: _last_railbridge_type = type; break;
116  case TRANSPORT_ROAD: _last_roadbridge_type = type; break;
117  default: break;
118  }
119  Command<CMD_BUILD_BRIDGE>::Post(STR_ERROR_CAN_T_BUILD_BRIDGE_HERE, CcBuildBridge,
120  this->end_tile, this->start_tile, this->transport_type, type, this->road_rail_type);
121  }
122 
125  {
126  this->bridges.Sort();
127 
128  /* Display the current sort variant */
129  this->GetWidget<NWidgetCore>(WID_BBS_DROPDOWN_CRITERIA)->widget_data = BuildBridgeWindow::sorter_names[this->bridges.SortType()];
130 
131  /* Set the modified widgets dirty */
134  }
135 
142  {
143  SetDParam(0, bridge_data.spec->material);
144  SetDParam(1, PackVelocity(bridge_data.spec->speed, static_cast<VehicleType>(this->transport_type)));
145  SetDParam(2, bridge_data.cost);
146  /* If the bridge has no meaningful speed limit, don't display it. */
147  if (bridge_data.spec->speed == UINT16_MAX) {
148  return _game_mode == GM_EDITOR ? STR_SELECT_BRIDGE_INFO_NAME : STR_SELECT_BRIDGE_INFO_NAME_COST;
149  }
150  return _game_mode == GM_EDITOR ? STR_SELECT_BRIDGE_INFO_NAME_MAX_SPEED : STR_SELECT_BRIDGE_INFO_NAME_MAX_SPEED_COST;
151  }
152 
153 public:
154  BuildBridgeWindow(WindowDesc &desc, TileIndex start, TileIndex end, TransportType transport_type, uint8_t road_rail_type, GUIBridgeList &&bl) : Window(desc),
155  start_tile(start),
156  end_tile(end),
157  transport_type(transport_type),
158  road_rail_type(road_rail_type),
159  bridges(std::move(bl))
160  {
161  this->CreateNestedTree();
162  this->vscroll = this->GetScrollbar(WID_BBS_SCROLLBAR);
163  /* Change the data, or the caption of the gui. Set it to road or rail, accordingly. */
164  this->GetWidget<NWidgetCore>(WID_BBS_CAPTION)->widget_data = (transport_type == TRANSPORT_ROAD) ? STR_SELECT_ROAD_BRIDGE_CAPTION : STR_SELECT_RAIL_BRIDGE_CAPTION;
165  this->FinishInitNested(transport_type); // Initializes 'this->icon_width'.
166 
167  this->parent = FindWindowById(WC_BUILD_TOOLBAR, transport_type);
170  this->bridges.NeedResort();
171  this->SortBridgeList();
172 
173  this->vscroll->SetCount(this->bridges.size());
174  }
175 
177  {
179  }
180 
181  void UpdateWidgetSize(WidgetID widget, Dimension &size, [[maybe_unused]] const Dimension &padding, [[maybe_unused]] Dimension &fill, [[maybe_unused]] Dimension &resize) override
182  {
183  switch (widget) {
184  case WID_BBS_DROPDOWN_ORDER: {
185  Dimension d = GetStringBoundingBox(this->GetWidget<NWidgetCore>(widget)->widget_data);
186  d.width += padding.width + Window::SortButtonWidth() * 2; // Doubled since the string is centred and it also looks better.
187  d.height += padding.height;
188  size = maxdim(size, d);
189  break;
190  }
192  Dimension d = GetStringListBoundingBox(BuildBridgeWindow::sorter_names);
193  d.width += padding.width;
194  d.height += padding.height;
195  size = maxdim(size, d);
196  break;
197  }
198  case WID_BBS_BRIDGE_LIST: {
199  Dimension sprite_dim = {0, 0}; // Biggest bridge sprite dimension
200  Dimension text_dim = {0, 0}; // Biggest text dimension
201  for (const BuildBridgeData &bridge_data : this->bridges) {
202  sprite_dim = maxdim(sprite_dim, GetScaledSpriteSize(bridge_data.spec->sprite));
203  text_dim = maxdim(text_dim, GetStringBoundingBox(GetBridgeSelectString(bridge_data)));
204  }
205  resize.height = std::max(sprite_dim.height, text_dim.height) + padding.height; // Max of both sizes + account for matrix edges.
206 
207  this->icon_width = sprite_dim.width; // Width of bridge icon.
208  size.width = this->icon_width + WidgetDimensions::scaled.hsep_normal + text_dim.width + padding.width;
209  size.height = 4 * resize.height; // Smallest bridge gui is 4 entries high in the matrix.
210  break;
211  }
212  }
213  }
214 
215  Point OnInitialPosition([[maybe_unused]] int16_t sm_width, [[maybe_unused]] int16_t sm_height, [[maybe_unused]] int window_number) override
216  {
217  /* Position the window so hopefully the first bridge from the list is under the mouse pointer. */
218  NWidgetBase *list = this->GetWidget<NWidgetBase>(WID_BBS_BRIDGE_LIST);
219  Point corner; // point of the top left corner of the window.
220  corner.y = Clamp(_cursor.pos.y - list->pos_y - 5, GetMainViewTop(), GetMainViewBottom() - sm_height);
221  corner.x = Clamp(_cursor.pos.x - list->pos_x - 5, 0, _screen.width - sm_width);
222  return corner;
223  }
224 
225  void DrawWidget(const Rect &r, WidgetID widget) const override
226  {
227  switch (widget) {
229  this->DrawSortButtonState(widget, this->bridges.IsDescSortOrder() ? SBS_DOWN : SBS_UP);
230  break;
231 
232  case WID_BBS_BRIDGE_LIST: {
233  Rect tr = r.WithHeight(this->resize.step_height).Shrink(WidgetDimensions::scaled.matrix);
234  bool rtl = _current_text_dir == TD_RTL;
235  auto [first, last] = this->vscroll->GetVisibleRangeIterators(this->bridges);
236  for (auto it = first; it != last; ++it) {
237  const BridgeSpec *b = it->spec;
238  DrawSpriteIgnorePadding(b->sprite, b->pal, tr.WithWidth(this->icon_width, rtl), SA_HOR_CENTER | SA_BOTTOM);
240  tr = tr.Translate(0, this->resize.step_height);
241  }
242  break;
243  }
244  }
245  }
246 
247  EventState OnKeyPress([[maybe_unused]] char32_t key, uint16_t keycode) override
248  {
249  const uint8_t i = keycode - '1';
250  if (i < 9 && i < this->bridges.size()) {
251  /* Build the requested bridge */
252  this->BuildBridge(this->bridges[i].index);
253  this->Close();
254  return ES_HANDLED;
255  }
256  return ES_NOT_HANDLED;
257  }
258 
259  void OnClick([[maybe_unused]] Point pt, WidgetID widget, [[maybe_unused]] int click_count) override
260  {
261  switch (widget) {
262  default: break;
263  case WID_BBS_BRIDGE_LIST: {
264  auto it = this->vscroll->GetScrolledItemFromWidget(this->bridges, pt.y, this, WID_BBS_BRIDGE_LIST);
265  if (it != this->bridges.end()) {
266  this->BuildBridge(it->index);
267  this->Close();
268  }
269  break;
270  }
271 
273  this->bridges.ToggleSortOrder();
274  this->SetDirty();
275  break;
276 
278  ShowDropDownMenu(this, BuildBridgeWindow::sorter_names, this->bridges.SortType(), WID_BBS_DROPDOWN_CRITERIA, 0, 0);
279  break;
280  }
281  }
282 
283  void OnDropdownSelect(WidgetID widget, int index) override
284  {
285  if (widget == WID_BBS_DROPDOWN_CRITERIA && this->bridges.SortType() != index) {
286  this->bridges.SetSortType(index);
287 
288  this->SortBridgeList();
289  }
290  }
291 
292  void OnResize() override
293  {
294  this->vscroll->SetCapacityFromWidget(this, WID_BBS_BRIDGE_LIST);
295  }
296 };
297 
300 
302 const std::initializer_list<GUIBridgeList::SortFunction * const> BuildBridgeWindow::sorter_funcs = {
303  &BridgeIndexSorter,
304  &BridgePriceSorter,
305  &BridgeSpeedSorter
306 };
307 
310  /* Header */
312  NWidget(WWT_CLOSEBOX, COLOUR_DARK_GREEN),
313  NWidget(WWT_CAPTION, COLOUR_DARK_GREEN, WID_BBS_CAPTION), SetDataTip(STR_SELECT_RAIL_BRIDGE_CAPTION, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS),
314  NWidget(WWT_DEFSIZEBOX, COLOUR_DARK_GREEN),
315  EndContainer(),
316 
319  /* Sort order + criteria buttons */
321  NWidget(WWT_TEXTBTN, COLOUR_DARK_GREEN, WID_BBS_DROPDOWN_ORDER), SetFill(1, 0), SetDataTip(STR_BUTTON_SORT_BY, STR_TOOLTIP_SORT_ORDER),
322  NWidget(WWT_DROPDOWN, COLOUR_DARK_GREEN, WID_BBS_DROPDOWN_CRITERIA), SetFill(1, 0), SetDataTip(0x0, STR_TOOLTIP_SORT_CRITERIA),
323  EndContainer(),
324  /* Matrix. */
325  NWidget(WWT_MATRIX, COLOUR_DARK_GREEN, WID_BBS_BRIDGE_LIST), SetFill(1, 0), SetResize(0, 22), SetMatrixDataTip(1, 0, STR_SELECT_BRIDGE_SELECTION_TOOLTIP), SetScrollbar(WID_BBS_SCROLLBAR),
326  EndContainer(),
327 
328  /* scrollbar + resize button */
330  NWidget(NWID_VSCROLLBAR, COLOUR_DARK_GREEN, WID_BBS_SCROLLBAR),
331  NWidget(WWT_RESIZEBOX, COLOUR_DARK_GREEN),
332  EndContainer(),
333  EndContainer(),
334 };
335 
338  WDP_AUTO, "build_bridge", 200, 114,
342 );
343 
354 void ShowBuildBridgeWindow(TileIndex start, TileIndex end, TransportType transport_type, uint8_t road_rail_type)
355 {
357 
358  /* The bridge length without ramps. */
359  const uint bridge_len = GetTunnelBridgeLength(start, end);
360 
361  /* If Ctrl is being pressed, check whether the last bridge built is available
362  * If so, return this bridge type. Otherwise continue normally.
363  * We store bridge types for each transport type, so we have to check for
364  * the transport type beforehand.
365  */
366  BridgeType last_bridge_type = 0;
367  switch (transport_type) {
368  case TRANSPORT_ROAD: last_bridge_type = _last_roadbridge_type; break;
369  case TRANSPORT_RAIL: last_bridge_type = _last_railbridge_type; break;
370  default: break; // water ways and air routes don't have bridge types
371  }
372  if (_ctrl_pressed && CheckBridgeAvailability(last_bridge_type, bridge_len).Succeeded()) {
373  Command<CMD_BUILD_BRIDGE>::Post(STR_ERROR_CAN_T_BUILD_BRIDGE_HERE, CcBuildBridge, end, start, transport_type, last_bridge_type, road_rail_type);
374  return;
375  }
376 
377  /* only query bridge building possibility once, result is the same for all bridges!
378  * returns CMD_ERROR on failure, and price on success */
379  StringID errmsg = INVALID_STRING_ID;
380  CommandCost ret = Command<CMD_BUILD_BRIDGE>::Do(CommandFlagsToDCFlags(GetCommandFlags<CMD_BUILD_BRIDGE>()) | DC_QUERY_COST, end, start, transport_type, 0, road_rail_type);
381 
382  GUIBridgeList bl;
383  if (ret.Failed()) {
384  errmsg = ret.GetErrorMessage();
385  } else {
386  /* check which bridges can be built */
387  const uint tot_bridgedata_len = CalcBridgeLenCostFactor(bridge_len + 2);
388 
389  Money infra_cost = 0;
390  switch (transport_type) {
391  case TRANSPORT_ROAD: {
392  /* In case we add a new road type as well, we must be aware of those costs. */
393  RoadType road_rt = INVALID_ROADTYPE;
394  RoadType tram_rt = INVALID_ROADTYPE;
395  if (IsBridgeTile(start)) {
396  road_rt = GetRoadTypeRoad(start);
397  tram_rt = GetRoadTypeTram(start);
398  }
399  if (RoadTypeIsRoad((RoadType)road_rail_type)) {
400  road_rt = (RoadType)road_rail_type;
401  } else {
402  tram_rt = (RoadType)road_rail_type;
403  }
404 
405  if (road_rt != INVALID_ROADTYPE) infra_cost += (bridge_len + 2) * 2 * RoadBuildCost(road_rt);
406  if (tram_rt != INVALID_ROADTYPE) infra_cost += (bridge_len + 2) * 2 * RoadBuildCost(tram_rt);
407 
408  break;
409  }
410  case TRANSPORT_RAIL: infra_cost = (bridge_len + 2) * RailBuildCost((RailType)road_rail_type); break;
411  default: break;
412  }
413 
414  bool any_available = false;
415  CommandCost type_check;
416  /* loop for all bridgetypes */
417  for (BridgeType brd_type = 0; brd_type != MAX_BRIDGES; brd_type++) {
418  type_check = CheckBridgeAvailability(brd_type, bridge_len);
419  if (type_check.Succeeded()) {
420  /* bridge is accepted, add to list */
421  BuildBridgeData &item = bl.emplace_back();
422  item.index = brd_type;
423  item.spec = GetBridgeSpec(brd_type);
424  /* Add to terraforming & bulldozing costs the cost of the
425  * bridge itself (not computed with DC_QUERY_COST) */
426  item.cost = ret.GetCost() + (((int64_t)tot_bridgedata_len * _price[PR_BUILD_BRIDGE] * item.spec->price) >> 8) + infra_cost;
427  any_available = true;
428  }
429  }
430  /* give error cause if no bridges available here*/
431  if (!any_available)
432  {
433  errmsg = type_check.GetErrorMessage();
434  }
435  }
436 
437  if (!bl.empty()) {
438  new BuildBridgeWindow(_build_bridge_desc, start, end, transport_type, road_rail_type, std::move(bl));
439  } else {
440  ShowErrorMessage(STR_ERROR_CAN_T_BUILD_BRIDGE_HERE, errmsg, WL_INFO, TileX(end) * TILE_SIZE, TileY(end) * TILE_SIZE);
441  }
442 }
int CalcBridgeLenCostFactor(int x)
Calculate the price factor for building a long bridge.
uint BridgeType
Bridge spec number.
Definition: bridge.h:37
static const uint MAX_BRIDGES
Maximal number of available bridge specs.
Definition: bridge.h:35
const BridgeSpec * GetBridgeSpec(BridgeType i)
Get the specification of a bridge type.
Definition: bridge.h:66
CommandCost CheckBridgeAvailability(BridgeType bridge_type, uint bridge_len, DoCommandFlag flags=DC_NONE)
Is a bridge of the specified type and length available?
void ShowBuildBridgeWindow(TileIndex start, TileIndex end, TransportType transport_type, uint8_t road_rail_type)
Prepare the data for the build a bridge window.
Definition: bridge_gui.cpp:354
static WindowDesc _build_bridge_desc(WDP_AUTO, "build_bridge", 200, 114, WC_BUILD_BRIDGE, WC_BUILD_TOOLBAR, WDF_CONSTRUCTION, _nested_build_bridge_widgets)
Window definition for the rail bridge selection window.
void CcBuildBridge(Commands, const CommandCost &result, TileIndex end_tile, TileIndex tile_start, TransportType transport_type, BridgeType, uint8_t)
Callback executed after a build Bridge CMD has been called.
Definition: bridge_gui.cpp:57
GUIList< BuildBridgeData > GUIBridgeList
List of bridges, used in BuildBridgeWindow.
Definition: bridge_gui.cpp:47
static BridgeType _last_railbridge_type
The type of the last built rail bridge.
Definition: bridge_gui.cpp:34
static constexpr NWidgetPart _nested_build_bridge_widgets[]
Widgets of the bridge gui.
Definition: bridge_gui.cpp:309
static BridgeType _last_roadbridge_type
The type of the last built road bridge.
Definition: bridge_gui.cpp:36
bool IsBridgeTile(Tile t)
checks if there is a bridge on this tile
Definition: bridge_map.h:35
Types related to the bridge widgets.
@ WID_BBS_DROPDOWN_CRITERIA
Criteria of sort dropdown.
Definition: bridge_widget.h:17
@ WID_BBS_BRIDGE_LIST
List of bridges.
Definition: bridge_widget.h:18
@ WID_BBS_DROPDOWN_ORDER
Direction of sort dropdown.
Definition: bridge_widget.h:16
@ WID_BBS_SCROLLBAR
Scrollbar of the list.
Definition: bridge_widget.h:19
@ WID_BBS_CAPTION
Caption of the window.
Definition: bridge_widget.h:15
Window class for handling the bridge-build GUI.
Definition: bridge_gui.cpp:72
void OnResize() override
Called after the window got resized.
Definition: bridge_gui.cpp:292
void SortBridgeList()
Sort the builable bridges.
Definition: bridge_gui.cpp:124
static bool BridgePriceSorter(const BuildBridgeData &a, const BuildBridgeData &b)
Sort the bridges by their price.
Definition: bridge_gui.cpp:101
StringID GetBridgeSelectString(const BuildBridgeData &bridge_data) const
Get the StringID to draw in the selection list and set the appropriate DParams.
Definition: bridge_gui.cpp:141
static bool BridgeSpeedSorter(const BuildBridgeData &a, const BuildBridgeData &b)
Sort the bridges by their maximum speed.
Definition: bridge_gui.cpp:107
static bool BridgeIndexSorter(const BuildBridgeData &a, const BuildBridgeData &b)
Sort the bridges by their index.
Definition: bridge_gui.cpp:95
static const std::initializer_list< GUIBridgeList::SortFunction *const > sorter_funcs
Available bridge sorting functions.
Definition: bridge_gui.cpp:83
static Listing last_sorting
Last setting of the sort.
Definition: bridge_gui.cpp:75
int icon_width
Scaled width of the the bridge icon sprite.
Definition: bridge_gui.cpp:91
Common return value for all commands.
Definition: command_type.h:23
bool Succeeded() const
Did this command succeed?
Definition: command_type.h:162
Money GetCost() const
The costs as made up to this moment.
Definition: command_type.h:83
bool Failed() const
Did this command fail?
Definition: command_type.h:171
StringID GetErrorMessage() const
Returns the error message of a command.
Definition: command_type.h:142
void SetListing(Listing l)
Import sort conditions.
bool Sort(Comp compare)
Sort the list.
uint8_t SortType() const
Get the sorttype of the list.
Listing GetListing() const
Export current sort conditions.
void SetSortFuncs(std::span< SortFunction *const > n_funcs)
Hand the sort function pointers to the GUIList.
bool NeedResort()
Check if a resort is needed next loop If used the resort timer will decrease every call till 0.
Baseclass for nested widgets.
Definition: widget_type.h:144
int pos_y
Vertical position of top-left corner of the widget in the window.
Definition: widget_type.h:249
int pos_x
Horizontal position of top-left corner of the widget in the window.
Definition: widget_type.h:248
Scrollbar data structure.
Definition: widget_type.h:694
void SetCount(size_t num)
Sets the number of elements in the list.
Definition: widget_type.h:780
auto GetScrolledItemFromWidget(Tcontainer &container, int clickpos, const Window *const w, WidgetID widget, int padding=0, int line_height=-1) const
Return an iterator pointing to the element of a scrolled widget that a user clicked in.
Definition: widget_type.h:879
void SetCapacityFromWidget(Window *w, WidgetID widget, int padding=0)
Set capacity of visible elements from the size and resize properties of a widget.
Definition: widget.cpp:2394
auto GetVisibleRangeIterators(Tcontainer &container) const
Get a pair of iterators for the range of visible elements in a container.
Definition: widget_type.h:860
static WidgetDimensions scaled
Widget dimensions scaled for current zoom level.
Definition: window_gui.h:68
int hsep_normal
Normal horizontal spacing.
Definition: window_gui.h:63
Functions related to commands.
static constexpr DoCommandFlag CommandFlagsToDCFlags(CommandFlags cmd_flags)
Extracts the DC flags needed for DoCommand from the flags returned by GetCommandFlags.
Definition: command_func.h:58
@ DC_QUERY_COST
query cost only, don't build.
Definition: command_type.h:378
Commands
List of commands.
Definition: command_type.h:187
DiagDirection ReverseDiagDir(DiagDirection d)
Returns the reverse direction of the given DiagDirection.
DiagDirection
Enumeration for diagonal directions.
void ShowDropDownMenu(Window *w, std::span< const StringID > strings, int selected, WidgetID button, uint32_t disabled_mask, uint32_t hidden_mask, uint width)
Show a dropdown menu window near a widget of the parent window.
Definition: dropdown.cpp:441
Functions related to the drop down widget.
Functions related to errors.
void ShowErrorMessage(StringID summary_msg, int x, int y, CommandCost cc)
Display an error message in a window.
Definition: error_gui.cpp:367
@ WL_INFO
Used for DoCommand-like (and some non-fatal AI GUI) errors/information.
Definition: error.h:24
Dimension maxdim(const Dimension &d1, const Dimension &d2)
Compute bounding box of both dimensions.
Geometry functions.
Dimension GetStringBoundingBox(std::string_view str, FontSize start_fontsize)
Return the string dimension in pixels.
Definition: gfx.cpp:851
Dimension GetStringListBoundingBox(std::span< const StringID > list, FontSize fontsize)
Get maximum dimension of a list of strings.
Definition: gfx.cpp:889
bool _ctrl_pressed
Is Ctrl pressed?
Definition: gfx.cpp:38
int DrawStringMultiLine(int left, int right, int top, int bottom, std::string_view str, TextColour colour, StringAlignment align, bool underline, FontSize fontsize)
Draw string, possibly over multiple lines.
Definition: gfx.cpp:774
Functions related to the gfx engine.
Dimension GetScaledSpriteSize(SpriteID sprid)
Scale sprite size for GUI.
Definition: widget.cpp:54
@ SA_HOR_CENTER
Horizontally center the text.
Definition: gfx_type.h:344
@ SA_BOTTOM
Bottom align the text.
Definition: gfx_type.h:350
constexpr NWidgetPart SetFill(uint16_t fill_x, uint16_t fill_y)
Widget part function for setting filling.
Definition: widget_type.h:1181
constexpr NWidgetPart SetScrollbar(WidgetID index)
Attach a scrollbar to a widget.
Definition: widget_type.h:1284
constexpr NWidgetPart SetDataTip(uint32_t data, StringID tip)
Widget part function for setting the data and tooltip.
Definition: widget_type.h:1202
constexpr NWidgetPart NWidget(WidgetType tp, Colours col, WidgetID idx=-1)
Widget part function for starting a new 'real' widget.
Definition: widget_type.h:1309
constexpr NWidgetPart SetMatrixDataTip(uint8_t cols, uint8_t rows, StringID tip)
Widget part function for setting the data and tooltip of WWT_MATRIX widgets.
Definition: widget_type.h:1214
constexpr NWidgetPart EndContainer()
Widget part function for denoting the end of a container (horizontal, vertical, WWT_FRAME,...
Definition: widget_type.h:1191
constexpr NWidgetPart SetResize(int16_t dx, int16_t dy)
Widget part function for setting the resize step.
Definition: widget_type.h:1126
void SetDirty() const
Mark entire window as dirty (in need of re-paint)
Definition: window.cpp:940
static debug_inline uint TileY(TileIndex tile)
Get the Y component of a tile.
Definition: map_func.h:425
static debug_inline uint TileX(TileIndex tile)
Get the X component of a tile.
Definition: map_func.h:415
constexpr T Clamp(const T a, const T min, const T max)
Clamp a value between an interval.
Definition: math_func.hpp:79
Rail specific functions.
Money RailBuildCost(RailType railtype)
Returns the cost of building the specified railtype.
Definition: rail.h:375
RailType
Enumeration for all possible railtypes.
Definition: rail_type.h:27
Road specific functions.
Money RoadBuildCost(RoadType roadtype)
Returns the cost of building the specified roadtype.
Definition: road.h:252
void ConnectRoadToStructure(TileIndex tile, DiagDirection direction)
If required, connects a new structure to an existing road or tram by building the missing roadbit.
Definition: road_gui.cpp:162
Functions/types related to the road GUIs.
RoadType
The different roadtypes we support.
Definition: road_type.h:25
@ INVALID_ROADTYPE
flag for invalid roadtype
Definition: road_type.h:30
A number of safeguards to prevent using unsafe methods.
ClientSettings _settings_client
The current settings for this game.
Definition: settings.cpp:56
Base types for having sorted lists in GUIs.
Functions related to sound.
@ SND_27_CONSTRUCTION_BRIDGE
37 == 0x25 Construction: bridge
Definition: sound_type.h:76
Definition of base types and functions in a cross-platform compatible way.
void SetDParam(size_t n, uint64_t v)
Set a string parameter v at index n in the global string parameter array.
Definition: strings.cpp:104
TextDirection _current_text_dir
Text direction of the currently selected language.
Definition: strings.cpp:56
Functions related to OTTD's strings.
int64_t PackVelocity(uint speed, VehicleType type)
Pack velocity and vehicle type for use with SCC_VELOCITY string parameter.
Definition: strings_func.h:75
@ TD_RTL
Text is written right-to-left by default.
Definition: strings_type.h:24
uint32_t StringID
Numeric value that represents a string, independent of the selected language.
Definition: strings_type.h:16
static const StringID INVALID_STRING_ID
Constant representing an invalid string (16bit in case it is used in savegames)
Definition: strings_type.h:17
Struct containing information about a single bridge type.
Definition: bridge.h:42
uint16_t price
the price multiplier
Definition: bridge.h:46
PaletteID pal
the palette which is used in the GUI
Definition: bridge.h:49
StringID material
the string that contains the bridge description
Definition: bridge.h:50
SpriteID sprite
the sprite which is used in the GUI
Definition: bridge.h:48
uint16_t speed
maximum travel speed (1 unit = 1/1.6 mph = 1 km-ish/h)
Definition: bridge.h:47
Carriage for the data we need if we want to build a bridge.
Definition: bridge_gui.cpp:41
SoundSettings sound
sound effect settings
Point pos
logical mouse position
Definition: gfx_type.h:125
Dimensions (a width and height) of a rectangle in 2D.
Data structure describing how to show the list (what sort direction and criteria).
Definition: sortlist_type.h:30
Partial widget specification to allow NWidgets to be written nested.
Definition: widget_type.h:1075
Coordinates of a point in 2D.
Specification of a rectangle with absolute coordinates of all edges.
Rect WithWidth(int width, bool end) const
Copy Rect and set its width.
Rect Shrink(int s) const
Copy and shrink Rect by s pixels.
Rect WithHeight(int height, bool end=false) const
Copy Rect and set its height.
Rect Indent(int indent, bool end) const
Copy Rect and indent it from its position.
Rect Translate(int x, int y) const
Copy and translate Rect by x,y pixels.
bool confirm
Play sound effect on successful constructions or other actions.
High level window description.
Definition: window_gui.h:159
Data structure for an opened window.
Definition: window_gui.h:273
virtual void Close(int data=0)
Hide the window and all its child windows, and mark them for a later deletion.
Definition: window.cpp:1047
static int SortButtonWidth()
Get width of up/down arrow of sort button state.
Definition: widget.cpp:780
void FinishInitNested(WindowNumber window_number=0)
Perform the second part of the initialization of a nested widget tree.
Definition: window.cpp:1733
Window * parent
Parent window.
Definition: window_gui.h:328
void SetWidgetDirty(WidgetID widget_index) const
Invalidate a widget, i.e.
Definition: window.cpp:551
void DrawSortButtonState(WidgetID widget, SortButtonState state) const
Draw a sort button's up or down arrow symbol.
Definition: widget.cpp:763
ResizeInfo resize
Resize information.
Definition: window_gui.h:314
void CreateNestedTree()
Perform the first part of the initialization of a nested widget tree.
Definition: window.cpp:1723
const Scrollbar * GetScrollbar(WidgetID widnum) const
Return the Scrollbar to a widget index.
Definition: window.cpp:314
WindowNumber window_number
Window number within the window class.
Definition: window_gui.h:302
static const uint TILE_SIZE
Tile size in world coordinates.
Definition: tile_type.h:15
TransportType
Available types of transport.
@ TRANSPORT_RAIL
Transport by train.
@ TRANSPORT_ROAD
Transport by road vehicle.
Header file for things common for tunnels and bridges.
uint GetTunnelBridgeLength(TileIndex begin, TileIndex end)
Calculates the length of a tunnel or a bridge (without end tiles)
Definition: tunnelbridge.h:25
Command definitions related to tunnels and bridges.
Functions that have tunnels and bridges in common.
DiagDirection GetTunnelBridgeDirection(Tile t)
Get the direction pointing to the other end.
VehicleType
Available vehicle types.
Definition: vehicle_type.h:21
@ NWID_HORIZONTAL
Horizontal container.
Definition: widget_type.h:75
@ WWT_TEXTBTN
(Toggle) Button with text
Definition: widget_type.h:55
@ WWT_MATRIX
Grid of rows and columns.
Definition: widget_type.h:59
@ WWT_CAPTION
Window caption (window title between closebox and stickybox)
Definition: widget_type.h:61
@ NWID_VSCROLLBAR
Vertical scrollbar.
Definition: widget_type.h:84
@ NWID_VERTICAL
Vertical container.
Definition: widget_type.h:77
@ WWT_CLOSEBOX
Close box (at top-left of a window)
Definition: widget_type.h:69
@ WWT_RESIZEBOX
Resize box (normally at bottom-right of a window)
Definition: widget_type.h:68
@ WWT_DEFSIZEBOX
Default window size box (at top-right of a window, between WWT_SHADEBOX and WWT_STICKYBOX)
Definition: widget_type.h:65
@ WWT_DROPDOWN
Drop down list.
Definition: widget_type.h:70
Window * FindWindowById(WindowClass cls, WindowNumber number)
Find a window by its class and window number.
Definition: window.cpp:1098
int GetMainViewTop()
Return the top of the main view available for general use.
Definition: window.cpp:2062
void CloseWindowByClass(WindowClass cls, int data)
Close all windows of a given class.
Definition: window.cpp:1152
int GetMainViewBottom()
Return the bottom of the main view available for general use.
Definition: window.cpp:2073
Window functions not directly related to making/drawing windows.
@ SBS_DOWN
Sort ascending.
Definition: window_gui.h:220
@ SBS_UP
Sort descending.
Definition: window_gui.h:221
@ WDF_CONSTRUCTION
This window is used for construction; close it whenever changing company.
Definition: window_gui.h:203
@ WDP_AUTO
Find a place automatically.
Definition: window_gui.h:147
int WidgetID
Widget ID.
Definition: window_type.h:18
EventState
State of handling an event.
Definition: window_type.h:743
@ ES_HANDLED
The passed event is handled.
Definition: window_type.h:744
@ ES_NOT_HANDLED
The passed event is not handled.
Definition: window_type.h:745
@ WC_BUILD_TOOLBAR
Build toolbar; Window numbers:
Definition: window_type.h:73
@ WC_BUILD_BRIDGE
Build bridge; Window numbers:
Definition: window_type.h:395