OpenTTD
bridge_gui.cpp
Go to the documentation of this file.
1 /* $Id$ */
2 
3 /*
4  * This file is part of OpenTTD.
5  * 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.
6  * 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.
7  * 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/>.
8  */
9 
12 #include "stdafx.h"
13 #include "error.h"
14 #include "command_func.h"
15 #include "rail.h"
16 #include "road.h"
17 #include "strings_func.h"
18 #include "window_func.h"
19 #include "sound_func.h"
20 #include "gfx_func.h"
21 #include "tunnelbridge.h"
22 #include "sortlist_type.h"
23 #include "widgets/dropdown_func.h"
24 #include "core/geometry_func.hpp"
25 #include "cmd_helper.h"
26 #include "tunnelbridge_map.h"
27 #include "road_gui.h"
28 
29 #include "widgets/bridge_widget.h"
30 
31 #include "table/strings.h"
32 
33 #include "safeguards.h"
34 
39 
44  BridgeType index;
45  const BridgeSpec *spec;
46  Money cost;
47 };
48 
50 
63 void CcBuildBridge(const CommandCost &result, TileIndex end_tile, uint32 p1, uint32 p2, uint32 cmd)
64 {
65  if (result.Failed()) return;
66  if (_settings_client.sound.confirm) SndPlayTileFx(SND_27_BLACKSMITH_ANVIL, end_tile);
67 
68  TransportType transport_type = Extract<TransportType, 15, 2>(p2);
69 
70  if (transport_type == TRANSPORT_ROAD) {
71  DiagDirection end_direction = ReverseDiagDir(GetTunnelBridgeDirection(end_tile));
72  ConnectRoadToStructure(end_tile, end_direction);
73 
75  ConnectRoadToStructure(p1, start_direction);
76  }
77 }
78 
80 class BuildBridgeWindow : public Window {
81 private:
82  /* Runtime saved values */
84 
85  /* Constants for sorting the bridges */
86  static const StringID sorter_names[];
87  static GUIBridgeList::SortFunction * const sorter_funcs[];
88 
89  /* Internal variables */
90  TileIndex start_tile;
91  TileIndex end_tile;
92  uint32 type;
93  GUIBridgeList *bridges;
95  Scrollbar *vscroll;
96 
98  static bool BridgeIndexSorter(const BuildBridgeData &a, const BuildBridgeData &b)
99  {
100  return a.index < b.index;
101  }
102 
104  static bool BridgePriceSorter(const BuildBridgeData &a, const BuildBridgeData &b)
105  {
106  return a.cost < b.cost;
107  }
108 
110  static bool BridgeSpeedSorter(const BuildBridgeData &a, const BuildBridgeData &b)
111  {
112  return a.spec->speed < b.spec->speed;
113  }
114 
115  void BuildBridge(uint8 i)
116  {
117  switch ((TransportType)(this->type >> 15)) {
118  case TRANSPORT_RAIL: _last_railbridge_type = this->bridges->at(i).index; break;
119  case TRANSPORT_ROAD: _last_roadbridge_type = this->bridges->at(i).index; break;
120  default: break;
121  }
122  DoCommandP(this->end_tile, this->start_tile, this->type | this->bridges->at(i).index,
123  CMD_BUILD_BRIDGE | CMD_MSG(STR_ERROR_CAN_T_BUILD_BRIDGE_HERE), CcBuildBridge);
124  }
125 
128  {
129  this->bridges->Sort();
130 
131  /* Display the current sort variant */
132  this->GetWidget<NWidgetCore>(WID_BBS_DROPDOWN_CRITERIA)->widget_data = this->sorter_names[this->bridges->SortType()];
133 
134  /* Set the modified widgets dirty */
135  this->SetWidgetDirty(WID_BBS_DROPDOWN_CRITERIA);
136  this->SetWidgetDirty(WID_BBS_BRIDGE_LIST);
137  }
138 
139 public:
140  BuildBridgeWindow(WindowDesc *desc, TileIndex start, TileIndex end, uint32 br_type, GUIBridgeList *bl) : Window(desc),
141  start_tile(start),
142  end_tile(end),
143  type(br_type),
144  bridges(bl)
145  {
146  this->CreateNestedTree();
147  this->vscroll = this->GetScrollbar(WID_BBS_SCROLLBAR);
148  /* Change the data, or the caption of the gui. Set it to road or rail, accordingly. */
149  this->GetWidget<NWidgetCore>(WID_BBS_CAPTION)->widget_data = (GB(this->type, 15, 2) == TRANSPORT_ROAD) ? STR_SELECT_ROAD_BRIDGE_CAPTION : STR_SELECT_RAIL_BRIDGE_CAPTION;
150  this->FinishInitNested(GB(br_type, 15, 2)); // Initializes 'this->bridgetext_offset'.
151 
152  this->parent = FindWindowById(WC_BUILD_TOOLBAR, GB(this->type, 15, 2));
153  this->bridges->SetListing(this->last_sorting);
154  this->bridges->SetSortFuncs(this->sorter_funcs);
155  this->bridges->NeedResort();
156  this->SortBridgeList();
157 
158  this->vscroll->SetCount((uint)bl->size());
159  }
160 
162  {
163  this->last_sorting = this->bridges->GetListing();
164 
165  delete bridges;
166  }
167 
168  void UpdateWidgetSize(int widget, Dimension *size, const Dimension &padding, Dimension *fill, Dimension *resize) override
169  {
170  switch (widget) {
171  case WID_BBS_DROPDOWN_ORDER: {
172  Dimension d = GetStringBoundingBox(this->GetWidget<NWidgetCore>(widget)->widget_data);
173  d.width += padding.width + Window::SortButtonWidth() * 2; // Doubled since the string is centred and it also looks better.
174  d.height += padding.height;
175  *size = maxdim(*size, d);
176  break;
177  }
179  Dimension d = {0, 0};
180  for (const StringID *str = this->sorter_names; *str != INVALID_STRING_ID; str++) {
181  d = maxdim(d, GetStringBoundingBox(*str));
182  }
183  d.width += padding.width;
184  d.height += padding.height;
185  *size = maxdim(*size, d);
186  break;
187  }
188  case WID_BBS_BRIDGE_LIST: {
189  Dimension sprite_dim = {0, 0}; // Biggest bridge sprite dimension
190  Dimension text_dim = {0, 0}; // Biggest text dimension
191  for (int i = 0; i < (int)this->bridges->size(); i++) {
192  const BridgeSpec *b = this->bridges->at(i).spec;
193  sprite_dim = maxdim(sprite_dim, GetSpriteSize(b->sprite));
194 
195  SetDParam(2, this->bridges->at(i).cost);
196  SetDParam(1, b->speed);
197  SetDParam(0, b->material);
198  text_dim = maxdim(text_dim, GetStringBoundingBox(_game_mode == GM_EDITOR ? STR_SELECT_BRIDGE_SCENEDIT_INFO : STR_SELECT_BRIDGE_INFO));
199  }
200  sprite_dim.height++; // Sprite is rendered one pixel down in the matrix field.
201  text_dim.height++; // Allowing the bottom row pixels to be rendered on the edge of the matrix field.
202  resize->height = max(sprite_dim.height, text_dim.height) + 2; // Max of both sizes + account for matrix edges.
203 
204  this->bridgetext_offset = WD_MATRIX_LEFT + sprite_dim.width + 1; // Left edge of text, 1 pixel distance from the sprite.
205  size->width = this->bridgetext_offset + text_dim.width + WD_MATRIX_RIGHT;
206  size->height = 4 * resize->height; // Smallest bridge gui is 4 entries high in the matrix.
207  break;
208  }
209  }
210  }
211 
212  Point OnInitialPosition(int16 sm_width, int16 sm_height, int window_number) override
213  {
214  /* Position the window so hopefully the first bridge from the list is under the mouse pointer. */
215  NWidgetBase *list = this->GetWidget<NWidgetBase>(WID_BBS_BRIDGE_LIST);
216  Point corner; // point of the top left corner of the window.
217  corner.y = Clamp(_cursor.pos.y - list->pos_y - 5, GetMainViewTop(), GetMainViewBottom() - sm_height);
218  corner.x = Clamp(_cursor.pos.x - list->pos_x - 5, 0, _screen.width - sm_width);
219  return corner;
220  }
221 
222  void DrawWidget(const Rect &r, int widget) const override
223  {
224  switch (widget) {
226  this->DrawSortButtonState(widget, this->bridges->IsDescSortOrder() ? SBS_DOWN : SBS_UP);
227  break;
228 
229  case WID_BBS_BRIDGE_LIST: {
230  uint y = r.top;
231  for (int i = this->vscroll->GetPosition(); this->vscroll->IsVisible(i) && i < (int)this->bridges->size(); i++) {
232  const BridgeSpec *b = this->bridges->at(i).spec;
233 
234  SetDParam(2, this->bridges->at(i).cost);
235  SetDParam(1, b->speed);
236  SetDParam(0, b->material);
237 
238  DrawSprite(b->sprite, b->pal, r.left + WD_MATRIX_LEFT, y + this->resize.step_height - 1 - GetSpriteSize(b->sprite).height);
239  DrawStringMultiLine(r.left + this->bridgetext_offset, r.right, y + 2, y + this->resize.step_height,
240  _game_mode == GM_EDITOR ? STR_SELECT_BRIDGE_SCENEDIT_INFO : STR_SELECT_BRIDGE_INFO);
241  y += this->resize.step_height;
242  }
243  break;
244  }
245  }
246  }
247 
248  EventState OnKeyPress(WChar key, uint16 keycode) override
249  {
250  const uint8 i = keycode - '1';
251  if (i < 9 && i < this->bridges->size()) {
252  /* Build the requested bridge */
253  this->BuildBridge(i);
254  delete this;
255  return ES_HANDLED;
256  }
257  return ES_NOT_HANDLED;
258  }
259 
260  void OnClick(Point pt, int widget, int click_count) override
261  {
262  switch (widget) {
263  default: break;
264  case WID_BBS_BRIDGE_LIST: {
265  uint i = this->vscroll->GetScrolledRowFromWidget(pt.y, this, WID_BBS_BRIDGE_LIST);
266  if (i < this->bridges->size()) {
267  this->BuildBridge(i);
268  delete this;
269  }
270  break;
271  }
272 
274  this->bridges->ToggleSortOrder();
275  this->SetDirty();
276  break;
277 
279  ShowDropDownMenu(this, this->sorter_names, this->bridges->SortType(), WID_BBS_DROPDOWN_CRITERIA, 0, 0);
280  break;
281  }
282  }
283 
284  void OnDropdownSelect(int widget, int index) override
285  {
286  if (widget == WID_BBS_DROPDOWN_CRITERIA && this->bridges->SortType() != index) {
287  this->bridges->SetSortType(index);
288 
289  this->SortBridgeList();
290  }
291  }
292 
293  void OnResize() override
294  {
295  this->vscroll->SetCapacityFromWidget(this, WID_BBS_BRIDGE_LIST);
296  }
297 };
298 
301 
304  &BridgeIndexSorter,
305  &BridgePriceSorter,
306  &BridgeSpeedSorter
307 };
308 
311  STR_SORT_BY_NUMBER,
312  STR_SORT_BY_COST,
313  STR_SORT_BY_MAX_SPEED,
315 };
316 
319  /* Header */
321  NWidget(WWT_CLOSEBOX, COLOUR_DARK_GREEN),
322  NWidget(WWT_CAPTION, COLOUR_DARK_GREEN, WID_BBS_CAPTION), SetDataTip(STR_SELECT_RAIL_BRIDGE_CAPTION, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS),
323  NWidget(WWT_DEFSIZEBOX, COLOUR_DARK_GREEN),
324  EndContainer(),
325 
328  /* Sort order + criteria buttons */
330  NWidget(WWT_TEXTBTN, COLOUR_DARK_GREEN, WID_BBS_DROPDOWN_ORDER), SetFill(1, 0), SetDataTip(STR_BUTTON_SORT_BY, STR_TOOLTIP_SORT_ORDER),
331  NWidget(WWT_DROPDOWN, COLOUR_DARK_GREEN, WID_BBS_DROPDOWN_CRITERIA), SetFill(1, 0), SetDataTip(0x0, STR_TOOLTIP_SORT_CRITERIA),
332  EndContainer(),
333  /* Matrix. */
334  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),
335  EndContainer(),
336 
337  /* scrollbar + resize button */
339  NWidget(NWID_VSCROLLBAR, COLOUR_DARK_GREEN, WID_BBS_SCROLLBAR),
340  NWidget(WWT_RESIZEBOX, COLOUR_DARK_GREEN),
341  EndContainer(),
342  EndContainer(),
343 };
344 
347  WDP_AUTO, "build_bridge", 200, 114,
350  _nested_build_bridge_widgets, lengthof(_nested_build_bridge_widgets)
351 );
352 
363 void ShowBuildBridgeWindow(TileIndex start, TileIndex end, TransportType transport_type, byte road_rail_type)
364 {
366 
367  /* Data type for the bridge.
368  * Bit 16,15 = transport type,
369  * 14..8 = road/rail types,
370  * 7..0 = type of bridge */
371  uint32 type = (transport_type << 15) | (road_rail_type << 8);
372 
373  /* The bridge length without ramps. */
374  const uint bridge_len = GetTunnelBridgeLength(start, end);
375 
376  /* If Ctrl is being pressed, check whether the last bridge built is available
377  * If so, return this bridge type. Otherwise continue normally.
378  * We store bridge types for each transport type, so we have to check for
379  * the transport type beforehand.
380  */
381  BridgeType last_bridge_type = 0;
382  switch (transport_type) {
383  case TRANSPORT_ROAD: last_bridge_type = _last_roadbridge_type; break;
384  case TRANSPORT_RAIL: last_bridge_type = _last_railbridge_type; break;
385  default: break; // water ways and air routes don't have bridge types
386  }
387  if (_ctrl_pressed && CheckBridgeAvailability(last_bridge_type, bridge_len).Succeeded()) {
388  DoCommandP(end, start, type | last_bridge_type, CMD_BUILD_BRIDGE | CMD_MSG(STR_ERROR_CAN_T_BUILD_BRIDGE_HERE), CcBuildBridge);
389  return;
390  }
391 
392  /* only query bridge building possibility once, result is the same for all bridges!
393  * returns CMD_ERROR on failure, and price on success */
394  StringID errmsg = INVALID_STRING_ID;
396 
397  GUIBridgeList *bl = nullptr;
398  if (ret.Failed()) {
399  errmsg = ret.GetErrorMessage();
400  } else {
401  /* check which bridges can be built */
402  const uint tot_bridgedata_len = CalcBridgeLenCostFactor(bridge_len + 2);
403 
404  bl = new GUIBridgeList();
405 
406  Money infra_cost = 0;
407  switch (transport_type) {
408  case TRANSPORT_ROAD: {
409  /* In case we add a new road type as well, we must be aware of those costs. */
410  RoadType road_rt = INVALID_ROADTYPE;
411  RoadType tram_rt = INVALID_ROADTYPE;
412  if (IsBridgeTile(start)) {
413  road_rt = GetRoadTypeRoad(start);
414  tram_rt = GetRoadTypeTram(start);
415  }
416  if (RoadTypeIsRoad((RoadType)road_rail_type)) {
417  road_rt = (RoadType)road_rail_type;
418  } else {
419  tram_rt = (RoadType)road_rail_type;
420  }
421 
422  if (road_rt != INVALID_ROADTYPE) infra_cost += (bridge_len + 2) * 2 * RoadBuildCost(road_rt);
423  if (tram_rt != INVALID_ROADTYPE) infra_cost += (bridge_len + 2) * 2 * RoadBuildCost(tram_rt);
424 
425  break;
426  }
427  case TRANSPORT_RAIL: infra_cost = (bridge_len + 2) * RailBuildCost((RailType)road_rail_type); break;
428  default: break;
429  }
430 
431  /* loop for all bridgetypes */
432  for (BridgeType brd_type = 0; brd_type != MAX_BRIDGES; brd_type++) {
433  if (CheckBridgeAvailability(brd_type, bridge_len).Succeeded()) {
434  /* bridge is accepted, add to list */
435  /*C++17: BuildBridgeData &item = */ bl->emplace_back();
436  BuildBridgeData &item = bl->back();
437  item.index = brd_type;
438  item.spec = GetBridgeSpec(brd_type);
439  /* Add to terraforming & bulldozing costs the cost of the
440  * bridge itself (not computed with DC_QUERY_COST) */
441  item.cost = ret.GetCost() + (((int64)tot_bridgedata_len * _price[PR_BUILD_BRIDGE] * item.spec->price) >> 8) + infra_cost;
442  }
443  }
444  }
445 
446  if (bl != nullptr && bl->size() != 0) {
447  new BuildBridgeWindow(&_build_bridge_desc, start, end, type, bl);
448  } else {
449  delete bl;
450  ShowErrorMessage(STR_ERROR_CAN_T_BUILD_BRIDGE_HERE, errmsg, WL_INFO, TileX(end) * TILE_SIZE, TileY(end) * TILE_SIZE);
451  }
452 }
EventState
State of handling an event.
Definition: window_type.h:713
static GUIBridgeList::SortFunction *const sorter_funcs[]
Available bridge sorting functions.
Definition: bridge_gui.cpp:87
Functions related to OTTD&#39;s strings.
Base types for having sorted lists in GUIs.
List template of &#39;things&#39; T to sort in a GUI.
Definition: sortlist_type.h:49
Direction of sort dropdown.
Definition: bridge_widget.h:18
GUIList< BuildBridgeData > GUIBridgeList
List of bridges, used in BuildBridgeWindow.
Definition: bridge_gui.cpp:49
static BridgeType _last_roadbridge_type
The type of the last built road bridge.
Definition: bridge_gui.cpp:38
int CalcBridgeLenCostFactor(int x)
Calculate the price factor for building a long bridge.
static NWidgetPart SetResize(int16 dx, int16 dy)
Widget part function for setting the resize step.
Definition: widget_type.h:930
Offset at right of a matrix cell.
Definition: window_gui.h:79
Point pos
logical mouse position
Definition: gfx_type.h:119
void OnDropdownSelect(int widget, int index) override
A dropdown option associated to this window has been selected.
Definition: bridge_gui.cpp:284
High level window description.
Definition: window_gui.h:168
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:123
void OnResize() override
Called after the window got resized.
Definition: bridge_gui.cpp:293
static bool IsBridgeTile(TileIndex t)
checks if there is a bridge on this tile
Definition: bridge_map.h:37
Scrollbar data structure.
Definition: widget_type.h:589
EventState OnKeyPress(WChar key, uint16 keycode) override
A key has been pressed.
Definition: bridge_gui.cpp:248
Horizontal container.
Definition: widget_type.h:75
Functions/types related to the road GUIs.
Window * FindWindowById(WindowClass cls, WindowNumber number)
Find a window by its class and window number.
Definition: window.cpp:1114
The passed event is not handled.
Definition: window_type.h:715
query cost only, don&#39;t build.
Definition: command_type.h:348
void SetSortFuncs(SortFunction *const *n_funcs)
Hand the array of sort function pointers to the sort list.
Rail specific functions.
Road specific functions.
static const StringID sorter_names[]
Names of the sorting functions.
Definition: bridge_gui.cpp:86
Resize box (normally at bottom-right of a window)
Definition: widget_type.h:68
static bool BridgePriceSorter(const BuildBridgeData &a, const BuildBridgeData &b)
Sort the bridges by their price.
Definition: bridge_gui.cpp:104
static uint TileX(TileIndex tile)
Get the X component of a tile.
Definition: map_func.h:207
flag for invalid roadtype
Definition: road_type.h:32
void ShowErrorMessage(StringID summary_msg, StringID detailed_msg, WarningLevel wl, int x=0, int y=0, const GRFFile *textref_stack_grffile=nullptr, uint textref_stack_size=0, const uint32 *textref_stack=nullptr)
Display an error message in a window.
Definition: error_gui.cpp:382
Close box (at top-left of a window)
Definition: widget_type.h:69
uint16 speed
maximum travel speed (1 unit = 1/1.6 mph = 1 km-ish/h)
Definition: bridge.h:48
Helper functions to extract data from command parameters.
bool NeedResort()
Check if a resort is needed next loop If used the resort timer will decrease every call till 0...
Money GetCost() const
The costs as made up to this moment.
Definition: command_type.h:84
Common return value for all commands.
Definition: command_type.h:25
void CcBuildBridge(const CommandCost &result, TileIndex end_tile, uint32 p1, uint32 p2, uint32 cmd)
Callback executed after a build Bridge CMD has been called.
Definition: bridge_gui.cpp:63
CommandFlags GetCommandFlags(uint32 cmd)
Definition: command.cpp:386
RoadType
The different roadtypes we support.
Definition: road_type.h:27
static T max(const T a, const T b)
Returns the maximum of two values.
Definition: math_func.hpp:26
Window class for handling the bridge-build GUI.
Definition: bridge_gui.cpp:80
Struct containing information about a single bridge type.
Definition: bridge.h:43
Caption of the window.
Definition: bridge_widget.h:17
void SetListing(Listing l)
Import sort conditions.
static const uint TILE_SIZE
Tile size in world coordinates.
Definition: tile_type.h:15
void SetCount(int num)
Sets the number of elements in the list.
Definition: widget_type.h:670
int GetMainViewBottom()
Return the bottom of the main view available for general use.
Definition: window.cpp:2173
Partial widget specification to allow NWidgets to be written nested.
Definition: widget_type.h:910
static bool BridgeIndexSorter(const BuildBridgeData &a, const BuildBridgeData &b)
Sort the bridges by their index.
Definition: bridge_gui.cpp:98
Data structure for an opened window.
Definition: window_gui.h:278
bool _ctrl_pressed
Is Ctrl pressed?
Definition: gfx.cpp:37
static NWidgetPart SetMatrixDataTip(uint8 cols, uint8 rows, StringID tip)
Widget part function for setting the data and tooltip of WWT_MATRIX widgets.
Definition: widget_type.h:1032
static Listing last_sorting
Last setting of the sort.
Definition: bridge_gui.cpp:83
Functions related to errors.
CommandCost DoCommand(const CommandContainer *container, DoCommandFlag flags)
Shorthand for calling the long DoCommand with a container.
Definition: command.cpp:443
static BridgeType _last_railbridge_type
The type of the last built rail bridge.
Definition: bridge_gui.cpp:36
Default window size box (at top-right of a window, between WWT_SHADEBOX and WWT_STICKYBOX) ...
Definition: widget_type.h:65
int GetScrolledRowFromWidget(int clickpos, const Window *const w, int widget, int padding=0, int line_height=-1) const
Compute the row of a scrolled widget that a user clicked in.
Definition: widget.cpp:1959
This window is used for construction; close it whenever changing company.
Definition: window_gui.h:210
SoundSettings sound
sound effect settings
Header file for things common for tunnels and bridges.
static const NWidgetPart _nested_build_bridge_widgets[]
Widgets of the bridge gui.
Definition: bridge_gui.cpp:318
Listing GetListing() const
Export current sort conditions.
Sort descending.
Definition: window_gui.h:227
StringID GetErrorMessage() const
Returns the error message of a command.
Definition: command_type.h:142
static DiagDirection ReverseDiagDir(DiagDirection d)
Returns the reverse direction of the given DiagDirection.
static uint GetTunnelBridgeLength(TileIndex begin, TileIndex end)
Calculates the length of a tunnel or a bridge (without end tiles)
Definition: tunnelbridge.h:27
static NWidgetPart SetDataTip(uint32 data, StringID tip)
Widget part function for setting the data and tooltip.
Definition: widget_type.h:1014
Functions related to the gfx engine.
ClientSettings _settings_client
The current settings for this game.
Definition: settings.cpp:80
bool Succeeded() const
Did this command succeed?
Definition: command_type.h:152
Definition of base types and functions in a cross-platform compatible way.
int GetMainViewTop()
Return the top of the main view available for general use.
Definition: window.cpp:2162
static const BridgeSpec * GetBridgeSpec(BridgeType i)
Get the specification of a bridge type.
Definition: bridge.h:67
A number of safeguards to prevent using unsafe methods.
Geometry functions.
void SortBridgeList()
Sort the builable bridges.
Definition: bridge_gui.cpp:127
int pos_x
Horizontal position of top-left corner of the widget in the window.
Definition: widget_type.h:177
Offset at left of a matrix cell.
Definition: window_gui.h:78
SpriteID sprite
the sprite which is used in the GUI
Definition: bridge.h:49
Carriage for the data we need if we want to build a bridge.
Definition: bridge_gui.cpp:43
static Money RoadBuildCost(RoadType roadtype)
Returns the cost of building the specified roadtype.
Definition: road.h:251
PaletteID pal
the palette which is used in the GUI
Definition: bridge.h:50
static NWidgetPart NWidget(WidgetType tp, Colours col, int16 idx=-1)
Widget part function for starting a new &#39;real&#39; widget.
Definition: widget_type.h:1114
static DoCommandFlag CommandFlagsToDCFlags(CommandFlags cmd_flags)
Extracts the DC flags needed for DoCommand from the flags returned by GetCommandFlags.
Definition: command_func.h:60
Baseclass for nested widgets.
Definition: widget_type.h:126
bool DoCommandP(const CommandContainer *container, bool my_cmd)
Shortcut for the long DoCommandP when having a container with the data.
Definition: command.cpp:534
#define lengthof(x)
Return the length of an fixed size array.
Definition: depend.cpp:42
void ShowBuildBridgeWindow(TileIndex start, TileIndex end, TransportType transport_type, byte road_rail_type)
Prepare the data for the build a bridge window.
Definition: bridge_gui.cpp:363
Build bridge; Window numbers:
Definition: window_type.h:384
Grid of rows and columns.
Definition: widget_type.h:59
CommandCost CheckBridgeAvailability(BridgeType bridge_type, uint bridge_len, DoCommandFlag flags=DC_NONE)
Is a bridge of the specified type and length available?
Functions related to sound.
void SetSortType(uint8 n_type)
Set the sorttype of the list.
bool Sort(SortFunction *compare)
Sort the list.
static bool BridgeSpeedSorter(const BuildBridgeData &a, const BuildBridgeData &b)
Sort the bridges by their maximum speed.
Definition: bridge_gui.cpp:110
static int SortButtonWidth()
Get width of up/down arrow of sort button state.
Definition: widget.cpp:658
static DiagDirection GetTunnelBridgeDirection(TileIndex t)
Get the direction pointing to the other end.
uint32 StringID
Numeric value that represents a string, independent of the selected language.
Definition: strings_type.h:18
void DeleteWindowByClass(WindowClass cls)
Delete all windows of a given class.
Definition: window.cpp:1159
bool Failed() const
Did this command fail?
Definition: command_type.h:161
List of bridges.
Definition: bridge_widget.h:20
uint16 price
the price multiplier
Definition: bridge.h:47
static T Clamp(const T a, const T min, const T max)
Clamp a value between an interval.
Definition: math_func.hpp:139
bool IsVisible(uint16 item) const
Checks whether given current item is visible in the list.
Definition: widget_type.h:641
Build toolbar; Window numbers:
Definition: window_type.h:68
static WindowDesc _build_bridge_desc(WDP_AUTO, "build_bridge", 200, 114, WC_BUILD_BRIDGE, WC_BUILD_TOOLBAR, WDF_CONSTRUCTION, _nested_build_bridge_widgets, lengthof(_nested_build_bridge_widgets))
Window definition for the rail bridge selection window.
Dimension GetStringBoundingBox(const char *str, FontSize start_fontsize)
Return the string dimension in pixels.
Definition: gfx.cpp:698
Dimension maxdim(const Dimension &d1, const Dimension &d2)
Compute bounding box of both dimensions.
Transport by train.
StringID material
the string that contains the bridge description
Definition: bridge.h:51
void UpdateWidgetSize(int widget, Dimension *size, const Dimension &padding, Dimension *fill, Dimension *resize) override
Update size and resize step of a widget in the window.
Definition: bridge_gui.cpp:168
RailType
Enumeration for all possible railtypes.
Definition: rail_type.h:29
Window caption (window title between closebox and stickybox)
Definition: widget_type.h:61
uint32 TileIndex
The index/ID of a Tile.
Definition: tile_type.h:80
void ToggleSortOrder()
Toggle the sort order Since that is the worst condition for the sort function reverse the list here...
static Money RailBuildCost(RailType railtype)
Returns the cost of building the specified railtype.
Definition: rail.h:374
Sort ascending.
Definition: window_gui.h:226
static uint TileY(TileIndex tile)
Get the Y component of a tile.
Definition: map_func.h:217
Scrollbar of the list.
Definition: bridge_widget.h:21
Vertical container.
Definition: widget_type.h:77
static NWidgetPart EndContainer()
Widget part function for denoting the end of a container (horizontal, vertical, WWT_FRAME, WWT_INSET, or WWT_PANEL).
Definition: widget_type.h:999
static const uint MAX_BRIDGES
Maximal number of available bridge specs.
Definition: bridge.h:36
TransportType
Available types of transport.
static uint GB(const T x, const uint8 s, const uint8 n)
Fetch n bits from x, started at bit s.
Transport by road vehicle.
bool confirm
Play sound effect on successful constructions or other actions.
Functions related to commands.
Coordinates of a point in 2D.
Types related to the bridge widgets.
Dimension GetSpriteSize(SpriteID sprid, Point *offset, ZoomLevel zoom)
Get the size of a sprite.
Definition: gfx.cpp:767
uint BridgeType
Bridge spec number.
Definition: bridge.h:38
Data structure describing how to show the list (what sort direction and criteria).
Definition: sortlist_type.h:33
Drop down list.
Definition: widget_type.h:70
void OnClick(Point pt, int widget, int click_count) override
A click with the left mouse button has been made on the window.
Definition: bridge_gui.cpp:260
build a bridge
Definition: command_type.h:183
static const StringID INVALID_STRING_ID
Constant representing an invalid string (16bit in case it is used in savegames)
Definition: strings_type.h:19
Functions that have tunnels and bridges in common.
Used for DoCommand-like (and some non-fatal AI GUI) errors/information.
Definition: error.h:23
Point OnInitialPosition(int16 sm_width, int16 sm_height, int window_number) override
Compute the initial position of the window.
Definition: bridge_gui.cpp:212
static NWidgetPart SetFill(uint fill_x, uint fill_y)
Widget part function for setting filling.
Definition: widget_type.h:983
DiagDirection
Enumeration for diagonal directions.
bool IsDescSortOrder() const
Check if the sort order is descending.
#define CMD_MSG(x)
Used to combine a StringID with the command.
Definition: command_type.h:370
void SetCapacityFromWidget(Window *w, int widget, int padding=0)
Set capacity of visible elements from the size and resize properties of a widget. ...
Definition: widget.cpp:1973
Specification of a rectangle with absolute coordinates of all edges.
Vertical scrollbar.
Definition: widget_type.h:84
The passed event is handled.
Definition: window_type.h:714
Window functions not directly related to making/drawing windows.
Find a place automatically.
Definition: window_gui.h:156
void DrawWidget(const Rect &r, int widget) const override
Draw the contents of a nested widget.
Definition: bridge_gui.cpp:222
bool SortFunction(const T &, const T &)
Signature of sort function.
Definition: sortlist_type.h:51
uint32 WChar
Type for wide characters, i.e.
Definition: string_type.h:37
int bridgetext_offset
Horizontal offset of the text describing the bridge properties in WID_BBS_BRIDGE_LIST relative to the...
Definition: bridge_gui.cpp:94
static NWidgetPart SetScrollbar(int index)
Attach a scrollbar to a widget.
Definition: widget_type.h:1095
Dimensions (a width and height) of a rectangle in 2D.
void DrawSprite(SpriteID img, PaletteID pal, int x, int y, const SubSprite *sub, ZoomLevel zoom)
Draw a sprite, not in a viewport.
Definition: gfx.cpp:832
int pos_y
Vertical position of top-left corner of the widget in the window.
Definition: widget_type.h:178
Criteria of sort dropdown.
Definition: bridge_widget.h:19
int DrawStringMultiLine(int left, int right, int top, int bottom, const char *str, TextColour colour, StringAlignment align, bool underline, FontSize fontsize)
Draw string, possibly over multiple lines.
Definition: gfx.cpp:620
(Toggle) Button with text
Definition: widget_type.h:55
uint16 GetPosition() const
Gets the position of the first visible element in the list.
Definition: widget_type.h:631
uint8 SortType() const
Get the sorttype of the list.
Definition: sortlist_type.h:96
static void SetDParam(uint n, uint64 v)
Set a string parameter v at index n in the global string parameter array.
Definition: strings_func.h:201