OpenTTD Source  20241120-master-g6d3adc6169
dock_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 "terraform_gui.h"
12 #include "window_gui.h"
13 #include "station_gui.h"
14 #include "command_func.h"
15 #include "water.h"
16 #include "window_func.h"
17 #include "vehicle_func.h"
18 #include "sound_func.h"
19 #include "viewport_func.h"
20 #include "gfx_func.h"
21 #include "company_func.h"
22 #include "slope_func.h"
23 #include "tilehighlight_func.h"
24 #include "company_base.h"
25 #include "hotkeys.h"
26 #include "gui.h"
27 #include "zoom_func.h"
28 #include "tunnelbridge_cmd.h"
29 #include "dock_cmd.h"
30 #include "station_cmd.h"
31 #include "water_cmd.h"
32 #include "waypoint_cmd.h"
33 #include "timer/timer.h"
35 
36 #include "widgets/dock_widget.h"
37 
38 #include "table/sprites.h"
39 #include "table/strings.h"
40 
41 #include "safeguards.h"
42 
43 static void ShowBuildDockStationPicker(Window *parent);
44 static void ShowBuildDocksDepotPicker(Window *parent);
45 
46 static Axis _ship_depot_direction;
47 
48 void CcBuildDocks(Commands, const CommandCost &result, TileIndex tile)
49 {
50  if (result.Failed()) return;
51 
52  if (_settings_client.sound.confirm) SndPlayTileFx(SND_02_CONSTRUCTION_WATER, tile);
54 }
55 
56 void CcPlaySound_CONSTRUCTION_WATER(Commands, const CommandCost &result, TileIndex tile)
57 {
58  if (result.Succeeded() && _settings_client.sound.confirm) SndPlayTileFx(SND_02_CONSTRUCTION_WATER, tile);
59 }
60 
61 
68 static TileIndex GetOtherAqueductEnd(TileIndex tile_from, TileIndex *tile_to = nullptr)
69 {
70  auto [slope, z] = GetTileSlopeZ(tile_from);
72 
73  /* If the direction isn't right, just return the next tile so the command
74  * complains about the wrong slope instead of the ends not matching up.
75  * Make sure the coordinate is always a valid tile within the map, so we
76  * don't go "off" the map. That would cause the wrong error message. */
77  if (!IsValidDiagDirection(dir)) return TileAddXY(tile_from, TileX(tile_from) > 2 ? -1 : 1, 0);
78 
79  /* Direction the aqueduct is built to. */
81  /* The maximum length of the aqueduct. */
82  int max_length = std::min<int>(_settings_game.construction.max_bridge_length, DistanceFromEdgeDir(tile_from, ReverseDiagDir(dir)) - 1);
83 
84  TileIndex endtile = tile_from;
85  for (int length = 0; IsValidTile(endtile) && TileX(endtile) != 0 && TileY(endtile) != 0; length++) {
86  endtile = TileAdd(endtile, offset);
87 
88  if (length > max_length) break;
89 
90  if (GetTileMaxZ(endtile) > z) {
91  if (tile_to != nullptr) *tile_to = endtile;
92  break;
93  }
94  }
95 
96  return endtile;
97 }
98 
102 
104  {
105  this->last_clicked_widget = WID_DT_INVALID;
106  this->InitNested(window_number);
107  this->OnInvalidateData();
109  }
110 
111  void Close([[maybe_unused]] int data = 0) override
112  {
113  if (_game_mode == GM_NORMAL && this->IsWidgetLowered(WID_DT_STATION)) SetViewportCatchmentStation(nullptr, true);
115  this->Window::Close();
116  }
117 
123  void OnInvalidateData([[maybe_unused]] int data = 0, [[maybe_unused]] bool gui_scope = true) override
124  {
125  if (!gui_scope) return;
126 
127  bool can_build = CanBuildVehicleInfrastructure(VEH_SHIP);
128  this->SetWidgetsDisabledState(!can_build,
129  WID_DT_DEPOT,
131  WID_DT_BUOY);
132  if (!can_build) {
135  }
136 
137  if (_game_mode != GM_EDITOR) {
138  if (!can_build) {
139  /* Show in the tooltip why this button is disabled. */
140  this->GetWidget<NWidgetCore>(WID_DT_DEPOT)->SetToolTip(STR_TOOLBAR_DISABLED_NO_VEHICLE_AVAILABLE);
141  this->GetWidget<NWidgetCore>(WID_DT_STATION)->SetToolTip(STR_TOOLBAR_DISABLED_NO_VEHICLE_AVAILABLE);
142  this->GetWidget<NWidgetCore>(WID_DT_BUOY)->SetToolTip(STR_TOOLBAR_DISABLED_NO_VEHICLE_AVAILABLE);
143  } else {
144  this->GetWidget<NWidgetCore>(WID_DT_DEPOT)->SetToolTip(STR_WATERWAYS_TOOLBAR_BUILD_DEPOT_TOOLTIP);
145  this->GetWidget<NWidgetCore>(WID_DT_STATION)->SetToolTip(STR_WATERWAYS_TOOLBAR_BUILD_DOCK_TOOLTIP);
146  this->GetWidget<NWidgetCore>(WID_DT_BUOY)->SetToolTip(STR_WATERWAYS_TOOLBAR_BUOY_TOOLTIP);
147  }
148  }
149  }
150 
151  void OnClick([[maybe_unused]] Point pt, WidgetID widget, [[maybe_unused]] int click_count) override
152  {
153  switch (widget) {
154  case WID_DT_CANAL: // Build canal button
155  HandlePlacePushButton(this, WID_DT_CANAL, SPR_CURSOR_CANAL, HT_RECT);
156  break;
157 
158  case WID_DT_LOCK: // Build lock button
159  HandlePlacePushButton(this, WID_DT_LOCK, SPR_CURSOR_LOCK, HT_SPECIAL);
160  break;
161 
162  case WID_DT_DEMOLISH: // Demolish aka dynamite button
164  break;
165 
166  case WID_DT_DEPOT: // Build depot button
167  if (HandlePlacePushButton(this, WID_DT_DEPOT, SPR_CURSOR_SHIP_DEPOT, HT_RECT)) ShowBuildDocksDepotPicker(this);
168  break;
169 
170  case WID_DT_STATION: // Build station button
171  if (HandlePlacePushButton(this, WID_DT_STATION, SPR_CURSOR_DOCK, HT_SPECIAL)) ShowBuildDockStationPicker(this);
172  break;
173 
174  case WID_DT_BUOY: // Build buoy button
175  HandlePlacePushButton(this, WID_DT_BUOY, SPR_CURSOR_BUOY, HT_RECT);
176  break;
177 
178  case WID_DT_RIVER: // Build river button (in scenario editor)
179  if (_game_mode != GM_EDITOR) return;
180  HandlePlacePushButton(this, WID_DT_RIVER, SPR_CURSOR_RIVER, HT_RECT | HT_DIAGONAL);
181  break;
182 
183  case WID_DT_BUILD_AQUEDUCT: // Build aqueduct button
184  HandlePlacePushButton(this, WID_DT_BUILD_AQUEDUCT, SPR_CURSOR_AQUEDUCT, HT_SPECIAL);
185  break;
186 
187  default: return;
188  }
189  this->last_clicked_widget = (DockToolbarWidgets)widget;
190  }
191 
192  void OnPlaceObject([[maybe_unused]] Point pt, TileIndex tile) override
193  {
194  switch (this->last_clicked_widget) {
195  case WID_DT_CANAL: // Build canal button
197  break;
198 
199  case WID_DT_LOCK: // Build lock button
200  Command<CMD_BUILD_LOCK>::Post(STR_ERROR_CAN_T_BUILD_LOCKS, CcBuildDocks, tile);
201  break;
202 
203  case WID_DT_DEMOLISH: // Demolish aka dynamite button
205  break;
206 
207  case WID_DT_DEPOT: // Build depot button
208  Command<CMD_BUILD_SHIP_DEPOT>::Post(STR_ERROR_CAN_T_BUILD_SHIP_DEPOT, CcBuildDocks, tile, _ship_depot_direction);
209  break;
210 
211  case WID_DT_STATION: { // Build station button
212  /* Determine the watery part of the dock. */
214  TileIndex tile_to = (dir != INVALID_DIAGDIR ? TileAddByDiagDir(tile, ReverseDiagDir(dir)) : tile);
215 
216  bool adjacent = _ctrl_pressed;
217  auto proc = [=](bool test, StationID to_join) -> bool {
218  if (test) {
219  return Command<CMD_BUILD_DOCK>::Do(CommandFlagsToDCFlags(GetCommandFlags<CMD_BUILD_DOCK>()), tile, INVALID_STATION, adjacent).Succeeded();
220  } else {
221  return Command<CMD_BUILD_DOCK>::Post(STR_ERROR_CAN_T_BUILD_DOCK_HERE, CcBuildDocks, tile, to_join, adjacent);
222  }
223  };
224 
225  ShowSelectStationIfNeeded(TileArea(tile, tile_to), proc);
226  break;
227  }
228 
229  case WID_DT_BUOY: // Build buoy button
230  Command<CMD_BUILD_BUOY>::Post(STR_ERROR_CAN_T_POSITION_BUOY_HERE, CcBuildDocks, tile);
231  break;
232 
233  case WID_DT_RIVER: // Build river button (in scenario editor)
235  break;
236 
237  case WID_DT_BUILD_AQUEDUCT: // Build aqueduct button
238  Command<CMD_BUILD_BRIDGE>::Post(STR_ERROR_CAN_T_BUILD_AQUEDUCT_HERE, CcBuildBridge, tile, GetOtherAqueductEnd(tile), TRANSPORT_WATER, 0, 0);
239  break;
240 
241  default: NOT_REACHED();
242  }
243  }
244 
245  void OnPlaceDrag(ViewportPlaceMethod select_method, [[maybe_unused]] ViewportDragDropSelectionProcess select_proc, [[maybe_unused]] Point pt) override
246  {
247  VpSelectTilesWithMethod(pt.x, pt.y, select_method);
248  }
249 
250  void OnPlaceMouseUp([[maybe_unused]] ViewportPlaceMethod select_method, ViewportDragDropSelectionProcess select_proc, [[maybe_unused]] Point pt, TileIndex start_tile, TileIndex end_tile) override
251  {
252  if (pt.x != -1) {
253  switch (select_proc) {
254  case DDSP_DEMOLISH_AREA:
255  GUIPlaceProcDragXY(select_proc, start_tile, end_tile);
256  break;
257  case DDSP_CREATE_WATER:
258  Command<CMD_BUILD_CANAL>::Post(STR_ERROR_CAN_T_BUILD_CANALS, CcPlaySound_CONSTRUCTION_WATER, end_tile, start_tile, (_game_mode == GM_EDITOR && _ctrl_pressed) ? WATER_CLASS_SEA : WATER_CLASS_CANAL, false);
259  break;
260  case DDSP_CREATE_RIVER:
261  Command<CMD_BUILD_CANAL>::Post(STR_ERROR_CAN_T_PLACE_RIVERS, CcPlaySound_CONSTRUCTION_WATER, end_tile, start_tile, WATER_CLASS_RIVER, _ctrl_pressed);
262  break;
263 
264  default: break;
265  }
266  }
267  }
268 
269  void OnPlaceObjectAbort() override
270  {
271  if (_game_mode != GM_EDITOR && this->IsWidgetLowered(WID_DT_STATION)) SetViewportCatchmentStation(nullptr, true);
272 
273  this->RaiseButtons();
274 
279  }
280 
281  void OnPlacePresize([[maybe_unused]] Point pt, TileIndex tile_from) override
282  {
283  TileIndex tile_to = tile_from;
284 
285  if (this->last_clicked_widget == WID_DT_BUILD_AQUEDUCT) {
286  GetOtherAqueductEnd(tile_from, &tile_to);
287  } else {
289  if (IsValidDiagDirection(dir)) {
290  /* Locks and docks always select the tile "down" the slope. */
291  tile_to = TileAddByDiagDir(tile_from, ReverseDiagDir(dir));
292  /* Locks also select the tile "up" the slope. */
293  if (this->last_clicked_widget == WID_DT_LOCK) tile_from = TileAddByDiagDir(tile_from, dir);
294  }
295  }
296 
297  VpSetPresizeRange(tile_from, tile_to);
298  }
299 
306  {
307  if (_game_mode != GM_NORMAL) return ES_NOT_HANDLED;
309  if (w == nullptr) return ES_NOT_HANDLED;
310  return w->OnHotkey(hotkey);
311  }
312 
313  static inline HotkeyList hotkeys{"dockstoolbar", {
314  Hotkey('1', "canal", WID_DT_CANAL),
315  Hotkey('2', "lock", WID_DT_LOCK),
316  Hotkey('3', "demolish", WID_DT_DEMOLISH),
317  Hotkey('4', "depot", WID_DT_DEPOT),
318  Hotkey('5', "dock", WID_DT_STATION),
319  Hotkey('6', "buoy", WID_DT_BUOY),
320  Hotkey('7', "river", WID_DT_RIVER),
321  Hotkey({'B', '8'}, "aqueduct", WID_DT_BUILD_AQUEDUCT),
323 };
324 
331  NWidget(WWT_CLOSEBOX, COLOUR_DARK_GREEN),
332  NWidget(WWT_CAPTION, COLOUR_DARK_GREEN), SetDataTip(STR_WATERWAYS_TOOLBAR_CAPTION, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS),
333  NWidget(WWT_STICKYBOX, COLOUR_DARK_GREEN),
334  EndContainer(),
336  NWidget(WWT_IMGBTN, COLOUR_DARK_GREEN, WID_DT_CANAL), SetMinimalSize(22, 22), SetFill(0, 1), SetDataTip(SPR_IMG_BUILD_CANAL, STR_WATERWAYS_TOOLBAR_BUILD_CANALS_TOOLTIP),
337  NWidget(WWT_IMGBTN, COLOUR_DARK_GREEN, WID_DT_LOCK), SetMinimalSize(22, 22), SetFill(0, 1), SetDataTip(SPR_IMG_BUILD_LOCK, STR_WATERWAYS_TOOLBAR_BUILD_LOCKS_TOOLTIP),
338  NWidget(WWT_PANEL, COLOUR_DARK_GREEN), SetMinimalSize(5, 22), SetFill(1, 1), EndContainer(),
339  NWidget(WWT_IMGBTN, COLOUR_DARK_GREEN, WID_DT_DEMOLISH), SetMinimalSize(22, 22), SetFill(0, 1), SetDataTip(SPR_IMG_DYNAMITE, STR_TOOLTIP_DEMOLISH_BUILDINGS_ETC),
340  NWidget(WWT_IMGBTN, COLOUR_DARK_GREEN, WID_DT_DEPOT), SetMinimalSize(22, 22), SetFill(0, 1), SetDataTip(SPR_IMG_SHIP_DEPOT, STR_WATERWAYS_TOOLBAR_BUILD_DEPOT_TOOLTIP),
341  NWidget(WWT_IMGBTN, COLOUR_DARK_GREEN, WID_DT_STATION), SetMinimalSize(22, 22), SetFill(0, 1), SetDataTip(SPR_IMG_SHIP_DOCK, STR_WATERWAYS_TOOLBAR_BUILD_DOCK_TOOLTIP),
342  NWidget(WWT_IMGBTN, COLOUR_DARK_GREEN, WID_DT_BUOY), SetMinimalSize(22, 22), SetFill(0, 1), SetDataTip(SPR_IMG_BUOY, STR_WATERWAYS_TOOLBAR_BUOY_TOOLTIP),
343  NWidget(WWT_IMGBTN, COLOUR_DARK_GREEN, WID_DT_BUILD_AQUEDUCT), SetMinimalSize(23, 22), SetFill(0, 1), SetDataTip(SPR_IMG_AQUEDUCT, STR_WATERWAYS_TOOLBAR_BUILD_AQUEDUCT_TOOLTIP),
344  EndContainer(),
345 };
346 
347 static WindowDesc _build_docks_toolbar_desc(
348  WDP_ALIGN_TOOLBAR, "toolbar_water", 0, 0,
352  &BuildDocksToolbarWindow::hotkeys
353 );
354 
363 {
364  if (!Company::IsValidID(_local_company)) return nullptr;
365 
367  return AllocateWindowDescFront<BuildDocksToolbarWindow>(_build_docks_toolbar_desc, TRANSPORT_WATER);
368 }
369 
376  NWidget(WWT_CLOSEBOX, COLOUR_DARK_GREEN),
377  NWidget(WWT_CAPTION, COLOUR_DARK_GREEN), SetDataTip(STR_WATERWAYS_TOOLBAR_CAPTION_SE, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS),
378  NWidget(WWT_STICKYBOX, COLOUR_DARK_GREEN),
379  EndContainer(),
381  NWidget(WWT_IMGBTN, COLOUR_DARK_GREEN, WID_DT_CANAL), SetMinimalSize(22, 22), SetFill(0, 1), SetDataTip(SPR_IMG_BUILD_CANAL, STR_WATERWAYS_TOOLBAR_CREATE_LAKE_TOOLTIP),
382  NWidget(WWT_IMGBTN, COLOUR_DARK_GREEN, WID_DT_LOCK), SetMinimalSize(22, 22), SetFill(0, 1), SetDataTip(SPR_IMG_BUILD_LOCK, STR_WATERWAYS_TOOLBAR_BUILD_LOCKS_TOOLTIP),
383  NWidget(WWT_PANEL, COLOUR_DARK_GREEN), SetMinimalSize(5, 22), SetFill(1, 1), EndContainer(),
384  NWidget(WWT_IMGBTN, COLOUR_DARK_GREEN, WID_DT_DEMOLISH), SetMinimalSize(22, 22), SetFill(0, 1), SetDataTip(SPR_IMG_DYNAMITE, STR_TOOLTIP_DEMOLISH_BUILDINGS_ETC),
385  NWidget(WWT_IMGBTN, COLOUR_DARK_GREEN, WID_DT_RIVER), SetMinimalSize(22, 22), SetFill(0, 1), SetDataTip(SPR_IMG_BUILD_RIVER, STR_WATERWAYS_TOOLBAR_CREATE_RIVER_TOOLTIP),
386  NWidget(WWT_IMGBTN, COLOUR_DARK_GREEN, WID_DT_BUILD_AQUEDUCT), SetMinimalSize(22, 22), SetFill(0, 1), SetDataTip(SPR_IMG_AQUEDUCT, STR_WATERWAYS_TOOLBAR_BUILD_AQUEDUCT_TOOLTIP),
387  EndContainer(),
388 };
389 
392  WDP_AUTO, "toolbar_water_scen", 0, 0,
396 );
397 
404 {
405  return AllocateWindowDescFront<BuildDocksToolbarWindow>(_build_docks_scen_toolbar_desc, TRANSPORT_WATER);
406 }
407 
415 };
416 
418 public:
420  {
423  }
424 
425  void Close([[maybe_unused]] int data = 0) override
426  {
428  this->PickerWindowBase::Close();
429  }
430 
431  void OnPaint() override
432  {
434 
435  this->DrawWidgets();
436 
438  SetTileSelectBigSize(-rad, -rad, 2 * rad, 2 * rad);
439  } else {
440  SetTileSelectSize(1, 1);
441  }
442 
443  /* strings such as 'Size' and 'Coverage Area' */
444  Rect r = this->GetWidget<NWidgetBase>(BDSW_ACCEPTANCE)->GetCurrentRect();
445  int top = r.top;
447  top = DrawStationCoverageAreaText(r.left, r.right, top, SCT_ALL, rad, true);
448  /* Resize background if the window is too small.
449  * Never make the window smaller to avoid oscillating if the size change affects the acceptance.
450  * (This is the case, if making the window bigger moves the mouse into the window.) */
451  if (top > r.bottom) {
452  ResizeWindow(this, 0, top - r.bottom, false);
453  }
454  }
455 
456  void OnClick([[maybe_unused]] Point pt, WidgetID widget, [[maybe_unused]] int click_count) override
457  {
458  switch (widget) {
459  case BDSW_LT_OFF:
460  case BDSW_LT_ON:
465  this->SetDirty();
466  SetViewportCatchmentStation(nullptr, true);
467  break;
468  }
469  }
470 
471  void OnRealtimeTick([[maybe_unused]] uint delta_ms) override
472  {
474  }
475 
476  IntervalTimer<TimerGameCalendar> yearly_interval = {{TimerGameCalendar::YEAR, TimerGameCalendar::Priority::NONE}, [this](auto) {
477  this->InvalidateData();
478  }};
479 };
480 
484  NWidget(WWT_CLOSEBOX, COLOUR_DARK_GREEN),
485  NWidget(WWT_CAPTION, COLOUR_DARK_GREEN), SetDataTip(STR_STATION_BUILD_DOCK_CAPTION, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS),
486  EndContainer(),
487  NWidget(WWT_PANEL, COLOUR_DARK_GREEN, BDSW_BACKGROUND),
490  NWidget(WWT_LABEL, COLOUR_DARK_GREEN, BDSW_INFO), SetDataTip(STR_STATION_BUILD_COVERAGE_AREA_TITLE, STR_NULL), SetFill(1, 0),
492  NWidget(WWT_TEXTBTN, COLOUR_GREY, BDSW_LT_OFF), SetMinimalSize(60, 12), SetFill(1, 0), SetDataTip(STR_STATION_BUILD_COVERAGE_OFF, STR_STATION_BUILD_COVERAGE_AREA_OFF_TOOLTIP),
493  NWidget(WWT_TEXTBTN, COLOUR_GREY, BDSW_LT_ON), SetMinimalSize(60, 12), SetFill(1, 0), SetDataTip(STR_STATION_BUILD_COVERAGE_ON, STR_STATION_BUILD_COVERAGE_AREA_ON_TOOLTIP),
494  EndContainer(),
495  EndContainer(),
497  EndContainer(),
498  EndContainer(),
499 };
500 
501 static WindowDesc _build_dock_station_desc(
502  WDP_AUTO, nullptr, 0, 0,
506 );
507 
508 static void ShowBuildDockStationPicker(Window *parent)
509 {
510  new BuildDocksStationWindow(_build_dock_station_desc, parent);
511 }
512 
514 private:
515  static void UpdateDocksDirection()
516  {
517  if (_ship_depot_direction != AXIS_X) {
518  SetTileSelectSize(1, 2);
519  } else {
520  SetTileSelectSize(2, 1);
521  }
522  }
523 
524 public:
526  {
528  this->LowerWidget(WID_BDD_X + _ship_depot_direction);
529  UpdateDocksDirection();
530  }
531 
532  void UpdateWidgetSize(WidgetID widget, Dimension &size, [[maybe_unused]] const Dimension &padding, [[maybe_unused]] Dimension &fill, [[maybe_unused]] Dimension &resize) override
533  {
534  switch (widget) {
535  case WID_BDD_X:
536  case WID_BDD_Y:
539  break;
540  }
541  }
542 
543  void DrawWidget(const Rect &r, WidgetID widget) const override
544  {
545  DrawPixelInfo tmp_dpi;
546 
547  switch (widget) {
548  case WID_BDD_X:
549  case WID_BDD_Y: {
550  Axis axis = widget == WID_BDD_X ? AXIS_X : AXIS_Y;
551 
552  Rect ir = r.Shrink(WidgetDimensions::scaled.bevel);
553  if (FillDrawPixelInfo(&tmp_dpi, ir)) {
554  AutoRestoreBackup dpi_backup(_cur_dpi, &tmp_dpi);
555  int x = (ir.Width() - ScaleSpriteTrad(96)) / 2;
556  int y = (ir.Height() - ScaleSpriteTrad(64)) / 2;
557  int x1 = ScaleSpriteTrad(63);
558  int x2 = ScaleSpriteTrad(31);
559  DrawShipDepotSprite(x + (axis == AXIS_X ? x1 : x2), y + ScaleSpriteTrad(17), axis, DEPOT_PART_NORTH);
560  DrawShipDepotSprite(x + (axis == AXIS_X ? x2 : x1), y + ScaleSpriteTrad(33), axis, DEPOT_PART_SOUTH);
561  }
562  break;
563  }
564  }
565  }
566 
567  void OnClick([[maybe_unused]] Point pt, WidgetID widget, [[maybe_unused]] int click_count) override
568  {
569  switch (widget) {
570  case WID_BDD_X:
571  case WID_BDD_Y:
572  this->RaiseWidget(WID_BDD_X + _ship_depot_direction);
573  _ship_depot_direction = (widget == WID_BDD_X ? AXIS_X : AXIS_Y);
574  this->LowerWidget(WID_BDD_X + _ship_depot_direction);
576  UpdateDocksDirection();
577  this->SetDirty();
578  break;
579  }
580  }
581 };
582 
583 static constexpr NWidgetPart _nested_build_docks_depot_widgets[] = {
585  NWidget(WWT_CLOSEBOX, COLOUR_DARK_GREEN),
586  NWidget(WWT_CAPTION, COLOUR_DARK_GREEN), SetDataTip(STR_DEPOT_BUILD_SHIP_CAPTION, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS),
587  EndContainer(),
588  NWidget(WWT_PANEL, COLOUR_DARK_GREEN, WID_BDD_BACKGROUND),
590  NWidget(WWT_TEXTBTN, COLOUR_GREY, WID_BDD_X), SetDataTip(0x0, STR_DEPOT_BUILD_SHIP_ORIENTATION_TOOLTIP),
591  NWidget(WWT_TEXTBTN, COLOUR_GREY, WID_BDD_Y), SetDataTip(0x0, STR_DEPOT_BUILD_SHIP_ORIENTATION_TOOLTIP),
592  EndContainer(),
593  EndContainer(),
594 };
595 
596 static WindowDesc _build_docks_depot_desc(
597  WDP_AUTO, nullptr, 0, 0,
600  _nested_build_docks_depot_widgets
601 );
602 
603 
604 static void ShowBuildDocksDepotPicker(Window *parent)
605 {
606  new BuildDocksDepotWindow(_build_docks_depot_desc, parent);
607 }
608 
609 
610 void InitializeDockGui()
611 {
612  _ship_depot_direction = AXIS_X;
613 }
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
Common return value for all commands.
Definition: command_type.h:23
bool Succeeded() const
Did this command succeed?
Definition: command_type.h:162
bool Failed() const
Did this command fail?
Definition: command_type.h:171
Base class for windows opened from a toolbar.
Definition: window_gui.h:986
void Close([[maybe_unused]] int data=0) override
Hide the window and all its child windows, and mark them for a later deletion.
Definition: window.cpp:3516
static WidgetDimensions scaled
Widget dimensions scaled for current zoom level.
Definition: window_gui.h:68
int vsep_normal
Normal vertical spacing.
Definition: window_gui.h:60
RectPadding fullbevel
Always-scaled bevel thickness.
Definition: window_gui.h:41
static const WidgetDimensions unscaled
Unscaled widget dimensions.
Definition: window_gui.h:67
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
Commands
List of commands.
Definition: command_type.h:187
Definition of stuff that is very close to a company, like the company struct itself.
CompanyID _local_company
Company controlled by the human player at this client. Can also be COMPANY_SPECTATOR.
Definition: company_cmd.cpp:52
Functions related to companies.
DiagDirection ReverseDiagDir(DiagDirection d)
Returns the reverse direction of the given DiagDirection.
bool IsValidDiagDirection(DiagDirection d)
Checks if an integer value is a valid DiagDirection.
Axis
Allow incrementing of DiagDirDiff variables.
@ AXIS_X
The X axis.
@ AXIS_Y
The y axis.
DiagDirection
Enumeration for diagonal directions.
@ INVALID_DIAGDIR
Flag for an invalid DiagDirection.
Command definitions related to docks.
BuildDockStationWidgets
Widget numbers of the build-dock GUI.
Definition: dock_gui.cpp:409
@ BDSW_LT_OFF
'Off' button of coverage high light.
Definition: dock_gui.cpp:411
@ BDSW_BACKGROUND
Background panel.
Definition: dock_gui.cpp:410
@ BDSW_INFO
'Coverage highlight' label.
Definition: dock_gui.cpp:413
@ BDSW_ACCEPTANCE
Acceptance info.
Definition: dock_gui.cpp:414
@ BDSW_LT_ON
'On' button of coverage high light.
Definition: dock_gui.cpp:412
static WindowDesc _build_docks_scen_toolbar_desc(WDP_AUTO, "toolbar_water_scen", 0, 0, WC_SCEN_BUILD_TOOLBAR, WC_NONE, WDF_CONSTRUCTION, _nested_build_docks_scen_toolbar_widgets)
Window definition for the build docks in scenario editor window.
static TileIndex GetOtherAqueductEnd(TileIndex tile_from, TileIndex *tile_to=nullptr)
Gets the other end of the aqueduct, if possible.
Definition: dock_gui.cpp:68
Window * ShowBuildDocksScenToolbar()
Open the build water toolbar window for the scenario editor.
Definition: dock_gui.cpp:403
static constexpr NWidgetPart _nested_build_docks_scen_toolbar_widgets[]
Nested widget parts of docks toolbar, scenario editor version.
Definition: dock_gui.cpp:374
static constexpr NWidgetPart _nested_build_docks_toolbar_widgets[]
Nested widget parts of docks toolbar, game version.
Definition: dock_gui.cpp:329
static constexpr NWidgetPart _nested_build_dock_station_widgets[]
Nested widget parts of a build dock station window.
Definition: dock_gui.cpp:482
Window * ShowBuildDocksToolbar()
Open the build water toolbar window.
Definition: dock_gui.cpp:362
Types related to the dock widgets.
DockToolbarWidgets
Widgets of the BuildDocksToolbarWindow class.
Definition: dock_widget.h:21
@ WID_DT_CANAL
Build canal button.
Definition: dock_widget.h:22
@ WID_DT_DEMOLISH
Demolish aka dynamite button.
Definition: dock_widget.h:24
@ WID_DT_STATION
Build station button.
Definition: dock_widget.h:26
@ WID_DT_RIVER
Build river button (in scenario editor).
Definition: dock_widget.h:28
@ WID_DT_LOCK
Build lock button.
Definition: dock_widget.h:23
@ WID_DT_DEPOT
Build depot button.
Definition: dock_widget.h:25
@ WID_DT_INVALID
Used to initialize a variable.
Definition: dock_widget.h:31
@ WID_DT_BUOY
Build buoy button.
Definition: dock_widget.h:27
@ WID_DT_BUILD_AQUEDUCT
Build aqueduct button.
Definition: dock_widget.h:29
@ WID_BDD_X
X-direction button.
Definition: dock_widget.h:16
@ WID_BDD_Y
Y-direction button.
Definition: dock_widget.h:17
@ WID_BDD_BACKGROUND
Background of the window.
Definition: dock_widget.h:15
bool _ctrl_pressed
Is Ctrl pressed?
Definition: gfx.cpp:38
bool FillDrawPixelInfo(DrawPixelInfo *n, int left, int top, int width, int height)
Set up a clipping area for only drawing into a certain area.
Definition: gfx.cpp:1548
Functions related to the gfx engine.
constexpr NWidgetPart SetFill(uint16_t fill_x, uint16_t fill_y)
Widget part function for setting filling.
Definition: widget_type.h:1181
constexpr NWidgetPart SetPIP(uint8_t pre, uint8_t inter, uint8_t post)
Widget part function for setting a pre/inter/post spaces.
Definition: widget_type.h:1260
constexpr NWidgetPart SetPadding(uint8_t top, uint8_t right, uint8_t bottom, uint8_t left)
Widget part function for setting additional space around a widget.
Definition: widget_type.h:1228
constexpr NWidgetPart SetDataTip(uint32_t data, StringID tip)
Widget part function for setting the data and tooltip.
Definition: widget_type.h:1202
constexpr NWidgetPart SetMinimalSize(int16_t x, int16_t y)
Widget part function for setting the minimal size.
Definition: widget_type.h:1137
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 EndContainer()
Widget part function for denoting the end of a container (horizontal, vertical, WWT_FRAME,...
Definition: widget_type.h:1191
constexpr NWidgetPart SetMinimalTextLines(uint8_t lines, uint8_t spacing, FontSize size=FS_NORMAL)
Widget part function for setting the minimal text lines.
Definition: widget_type.h:1149
constexpr NWidgetPart SetResize(int16_t dx, int16_t dy)
Widget part function for setting the resize step.
Definition: widget_type.h:1126
constexpr NWidgetPart SetPIPRatio(uint8_t ratio_pre, uint8_t ratio_inter, uint8_t ratio_post)
Widget part function for setting a pre/inter/post ratio.
Definition: widget_type.h:1272
void SetDirty() const
Mark entire window as dirty (in need of re-paint)
Definition: window.cpp:940
GUI functions that shouldn't be here.
Hotkey related functions.
bool HandlePlacePushButton(Window *w, WidgetID widget, CursorID cursor, HighLightStyle mode)
This code is shared for the majority of the pushbuttons.
Definition: main_gui.cpp:63
uint DistanceFromEdgeDir(TileIndex tile, DiagDirection dir)
Gets the distance to the edge of the map in given direction.
Definition: map.cpp:223
TileIndex TileAddXY(TileIndex tile, int x, int y)
Adds a given offset to a tile.
Definition: map_func.h:467
TileIndex TileAddByDiagDir(TileIndex tile, DiagDirection dir)
Adds a DiagDir to a tile.
Definition: map_func.h:608
constexpr TileIndex TileAdd(TileIndex tile, TileIndexDiff offset)
Adds a given offset to a tile.
Definition: map_func.h:454
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
TileIndexDiff TileOffsByDiagDir(DiagDirection dir)
Convert a DiagDirection to a TileIndexDiff.
Definition: map_func.h:567
int32_t TileIndexDiff
An offset value between two tiles.
Definition: map_type.h:23
A number of safeguards to prevent using unsafe methods.
GameSettings _settings_game
Game settings of a running game or the scenario editor.
Definition: settings.cpp:57
ClientSettings _settings_client
The current settings for this game.
Definition: settings.cpp:56
Functions related to slopes.
DiagDirection GetInclinedSlopeDirection(Slope s)
Returns the direction of an inclined slope.
Definition: slope_func.h:239
Functions related to sound.
@ SND_02_CONSTRUCTION_WATER
0 == 0x00 Construction: water infrastructure
Definition: sound_type.h:39
@ SND_15_BEEP
19 == 0x13 GUI button click
Definition: sound_type.h:58
This file contains all sprite-related enums and defines.
static const CursorID ANIMCURSOR_DEMOLISH
704 - 707 - demolish dynamite
Definition: sprites.h:1508
Command definitions related to stations.
void ShowSelectStationIfNeeded(TileArea ta, StationPickerCmdProc proc)
Show the station selection window when needed.
void CheckRedrawStationCoverage(const Window *w)
Check whether we need to redraw the station coverage text.
int DrawStationCoverageAreaText(int left, int right, int top, StationCoverageType sct, int rad, bool supplies)
Calculates and draws the accepted or supplied cargo around the selected tile(s)
Definition: station_gui.cpp:77
Contains enums and function declarations connected with stations GUI.
@ SCT_ALL
Draw all cargoes.
Definition: station_gui.h:23
static constexpr uint CA_DOCK
Catchment for docks with "modified catchment" enabled.
Definition: station_type.h:81
static constexpr uint CA_UNMODIFIED
Catchment for all stations with "modified catchment" disabled.
Definition: station_type.h:83
Definition of base types and functions in a cross-platform compatible way.
Class to backup a specific variable and restore it upon destruction of this object to prevent stack v...
void OnPaint() override
The window must be repainted.
Definition: dock_gui.cpp:431
void OnRealtimeTick([[maybe_unused]] uint delta_ms) override
Called periodically.
Definition: dock_gui.cpp:471
Toolbar window for constructing water infrastructure.
Definition: dock_gui.cpp:100
void OnInvalidateData([[maybe_unused]] int data=0, [[maybe_unused]] bool gui_scope=true) override
Some data on this window has become invalid.
Definition: dock_gui.cpp:123
void OnPlaceObjectAbort() override
The user cancelled a tile highlight mode that has been set.
Definition: dock_gui.cpp:269
static EventState DockToolbarGlobalHotkeys(int hotkey)
Handler for global hotkeys of the BuildDocksToolbarWindow.
Definition: dock_gui.cpp:305
DockToolbarWidgets last_clicked_widget
Contains the last widget that has been clicked on this toolbar.
Definition: dock_gui.cpp:101
SoundSettings sound
sound effect settings
GUISettings gui
settings related to the GUI
uint16_t max_bridge_length
maximum length of bridges
Dimensions (a width and height) of a rectangle in 2D.
Data about how and where to blit pixels.
Definition: gfx_type.h:157
bool persistent_buildingtools
keep the building tools active after usage
bool station_show_coverage
whether to highlight coverage area
bool link_terraform_toolbar
display terraform toolbar when displaying rail, road, water and airport toolbars
ConstructionSettings construction
construction of things in-game
StationSettings station
settings related to station management
List of hotkeys for a window.
Definition: hotkeys.h:37
All data for a single hotkey.
Definition: hotkeys.h:21
Partial widget specification to allow NWidgets to be written nested.
Definition: widget_type.h:1075
Coordinates of a point in 2D.
static bool IsValidID(size_t index)
Tests whether given index can be used to get valid (non-nullptr) Titem.
Definition: pool_type.hpp:328
constexpr uint Horizontal() const
Get total horizontal padding of RectPadding.
constexpr uint Vertical() const
Get total vertical padding of RectPadding.
Specification of a rectangle with absolute coordinates of all edges.
int Width() const
Get width of Rect.
Rect Shrink(int s) const
Copy and shrink Rect by s pixels.
int Height() const
Get height of Rect.
bool click_beep
Beep on a random selection of buttons.
bool confirm
Play sound effect on successful constructions or other actions.
bool modified_catchment
different-size catchment areas
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
void DrawWidgets() const
Paint all widgets of a window.
Definition: widget.cpp:731
void InvalidateData(int data=0, bool gui_scope=true)
Mark this window's data as invalid (in need of re-computing)
Definition: window.cpp:3151
Window * parent
Parent window.
Definition: window_gui.h:328
void RaiseWidget(WidgetID widget_index)
Marks a widget as raised.
Definition: window_gui.h:475
ResizeInfo resize
Resize information.
Definition: window_gui.h:314
void SetWidgetsDisabledState(bool disab_stat, Args... widgets)
Sets the enabled/disabled status of a list of widgets.
Definition: window_gui.h:521
bool IsWidgetLowered(WidgetID widget_index) const
Gets the lowered state of a widget.
Definition: window_gui.h:497
void RaiseButtons(bool autoraise=false)
Raise the buttons of the window.
Definition: window.cpp:525
int top
y position of top edge of the window
Definition: window_gui.h:310
void LowerWidget(WidgetID widget_index)
Marks a widget as lowered.
Definition: window_gui.h:466
void InitNested(WindowNumber number=0)
Perform complete initialization of the Window with nested widgets, to allow use.
Definition: window.cpp:1746
virtual EventState OnHotkey(int hotkey)
A hotkey has been pressed.
Definition: window.cpp:565
WindowNumber window_number
Window number within the window class.
Definition: window_gui.h:302
bool GUIPlaceProcDragXY(ViewportDragDropSelectionProcess proc, TileIndex start_tile, TileIndex end_tile)
A central place to handle all X_AND_Y dragged GUI functions.
void PlaceProc_DemolishArea(TileIndex tile)
Start a drag for demolishing an area.
Window * ShowTerraformToolbar(Window *link)
Show the toolbar for terraforming in the game.
GUI stuff related to terraforming.
std::tuple< Slope, int > GetTileSlopeZ(TileIndex tile)
Return the slope of a given tile inside the map.
Definition: tile_map.cpp:55
int GetTileMaxZ(TileIndex t)
Get top height of the tile inside the map.
Definition: tile_map.cpp:136
bool IsValidTile(Tile tile)
Checks if a tile is valid.
Definition: tile_map.h:161
Slope GetTileSlope(TileIndex tile)
Return the slope of a given tile inside the map.
Definition: tile_map.h:279
OrthogonalTileArea TileArea
Shorthand for the much more common orthogonal tile area.
Functions related to tile highlights.
void ResetObjectToPlace()
Reset the cursor and mouse mode handling back to default (normal cursor, only clicking in windows).
Definition: viewport.cpp:3498
void VpSetPresizeRange(TileIndex from, TileIndex to)
Highlights all tiles between a set of two tiles.
Definition: viewport.cpp:2777
void VpSelectTilesWithMethod(int x, int y, ViewportPlaceMethod method)
Selects tiles while dragging.
Definition: viewport.cpp:3216
void VpStartPlaceSizing(TileIndex tile, ViewportPlaceMethod method, ViewportDragDropSelectionProcess process)
highlighting tiles while only going over them with the mouse
Definition: viewport.cpp:2722
@ HT_DIAGONAL
Also allow 'diagonal rectangles'. Only usable in combination with HT_RECT or HT_POINT.
@ HT_RECT
rectangle (stations, depots, ...)
@ HT_SPECIAL
special mode used for highlighting while dragging (and for tunnels/docks)
Definition of Interval and OneShot timers.
Definition of the game-calendar-timer.
@ TRANSPORT_WATER
Transport over water.
Command definitions related to tunnels and bridges.
bool CanBuildVehicleInfrastructure(VehicleType type, uint8_t subtype)
Check whether we can build infrastructure for the given vehicle type.
Definition: vehicle.cpp:1922
Functions related to vehicles.
@ VEH_SHIP
Ship vehicle type.
Definition: vehicle_type.h:26
void SetTileSelectSize(int w, int h)
Highlight w by h tiles at the cursor.
Definition: viewport.cpp:2542
void SetViewportCatchmentStation(const Station *st, bool sel)
Select or deselect station for coverage area highlight.
Definition: viewport.cpp:3618
Functions related to (drawing on) viewports.
ViewportDragDropSelectionProcess
Drag and drop selection process, or, what to do with an area of land when you've selected it.
@ DDSP_DEMOLISH_AREA
Clear area.
@ DDSP_CREATE_WATER
Create a canal.
@ DDSP_CREATE_RIVER
Create rivers.
ViewportPlaceMethod
Viewport place method (type of highlighted area and placed objects)
Definition: viewport_type.h:92
@ VPM_X_AND_Y
area of land in X and Y directions
Definition: viewport_type.h:96
Functions related to water (management)
Command definitions related to water tiles.
@ DEPOT_PART_NORTH
Northern part of a depot.
Definition: water_map.h:59
@ DEPOT_PART_SOUTH
Southern part of a depot.
Definition: water_map.h:60
@ WATER_CLASS_SEA
Sea.
Definition: water_map.h:40
@ WATER_CLASS_CANAL
Canal.
Definition: water_map.h:41
@ WATER_CLASS_RIVER
River.
Definition: water_map.h:42
Command definitions related to waypoints.
@ NC_EQUALSIZE
Value of the NCB_EQUALSIZE flag.
Definition: widget_type.h:524
@ WWT_IMGBTN
(Toggle) Button with image
Definition: widget_type.h:52
@ WWT_LABEL
Centered label.
Definition: widget_type.h:57
@ NWID_HORIZONTAL
Horizontal container.
Definition: widget_type.h:75
@ WWT_TEXTBTN
(Toggle) Button with text
Definition: widget_type.h:55
@ WWT_PANEL
Simple depressed panel.
Definition: widget_type.h:50
@ WWT_STICKYBOX
Sticky box (at top-right of a window, after WWT_DEFSIZEBOX)
Definition: widget_type.h:66
@ WWT_CAPTION
Window caption (window title between closebox and stickybox)
Definition: widget_type.h:61
@ 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_EMPTY
Empty widget, place holder to reserve space in widget tree.
Definition: widget_type.h:48
@ NWID_HORIZONTAL_LTR
Horizontal container that doesn't change the order of the widgets for RTL languages.
Definition: widget_type.h:76
void CloseWindowById(WindowClass cls, WindowNumber number, bool force, int data)
Close a window by its class and window number (if it is open).
Definition: window.cpp:1140
void ResizeWindow(Window *w, int delta_x, int delta_y, bool clamp_to_screen, bool schedule_resize)
Resize the window.
Definition: window.cpp:2022
void CloseWindowByClass(WindowClass cls, int data)
Close all windows of a given class.
Definition: window.cpp:1152
Window functions not directly related to making/drawing windows.
Functions, definitions and such used only by the GUI.
@ 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
@ WDP_ALIGN_TOOLBAR
Align toward the toolbar.
Definition: window_gui.h:149
int WidgetID
Widget ID.
Definition: window_type.h:18
int32_t WindowNumber
Number to differentiate different windows of the same class.
Definition: window_type.h:737
EventState
State of handling an event.
Definition: window_type.h:743
@ ES_NOT_HANDLED
The passed event is not handled.
Definition: window_type.h:745
@ WC_BUILD_STATION
Build station; Window numbers:
Definition: window_type.h:403
@ WC_SCEN_BUILD_TOOLBAR
Scenario build toolbar; Window numbers:
Definition: window_type.h:80
@ WC_BUILD_TOOLBAR
Build toolbar; Window numbers:
Definition: window_type.h:73
@ WC_NONE
No window, redirects to WC_MAIN_WINDOW.
Definition: window_type.h:45
@ WC_SCEN_LAND_GEN
Landscape generation (in Scenario Editor); Window numbers:
Definition: window_type.h:455
@ WC_SELECT_STATION
Select station (when joining stations); Window numbers:
Definition: window_type.h:242
@ WC_BUILD_DEPOT
Build depot; Window numbers:
Definition: window_type.h:423
@ WC_BUILD_BRIDGE
Build bridge; Window numbers:
Definition: window_type.h:395
Functions related to zooming.
int ScaleSpriteTrad(int value)
Scale traditional pixel dimensions to GUI zoom level, for drawing sprites.
Definition: zoom_func.h:107
int ScaleGUITrad(int value)
Scale traditional pixel dimensions to GUI zoom level.
Definition: zoom_func.h:117