OpenTTD Source 20250218-master-g53dd1258a7
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
43static void ShowBuildDockStationPicker(Window *parent);
44static void ShowBuildDocksDepotPicker(Window *parent);
45
46static Axis _ship_depot_direction;
47
48void CcBuildDocks(Commands, const CommandCost &result, TileIndex tile)
49{
50 if (result.Failed()) return;
51
54}
55
56void 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
68static 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
128 this->SetWidgetsDisabledState(!can_build,
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. */
143 } else {
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 if (_game_mode == GM_EDITOR) {
156 HandlePlacePushButton(this, WID_DT_CANAL, SPR_CURSOR_CANAL, HT_RECT);
157 } else {
158 HandlePlacePushButton(this, WID_DT_CANAL, SPR_CURSOR_CANAL, HT_RECT | HT_DIAGONAL);
159 }
160 break;
161
162 case WID_DT_LOCK: // Build lock button
163 HandlePlacePushButton(this, WID_DT_LOCK, SPR_CURSOR_LOCK, HT_SPECIAL);
164 break;
165
166 case WID_DT_DEMOLISH: // Demolish aka dynamite button
168 break;
169
170 case WID_DT_DEPOT: // Build depot button
171 if (HandlePlacePushButton(this, WID_DT_DEPOT, SPR_CURSOR_SHIP_DEPOT, HT_RECT)) ShowBuildDocksDepotPicker(this);
172 break;
173
174 case WID_DT_STATION: // Build station button
175 if (HandlePlacePushButton(this, WID_DT_STATION, SPR_CURSOR_DOCK, HT_SPECIAL)) ShowBuildDockStationPicker(this);
176 break;
177
178 case WID_DT_BUOY: // Build buoy button
179 HandlePlacePushButton(this, WID_DT_BUOY, SPR_CURSOR_BUOY, HT_RECT);
180 break;
181
182 case WID_DT_RIVER: // Build river button (in scenario editor)
183 if (_game_mode != GM_EDITOR) return;
184 HandlePlacePushButton(this, WID_DT_RIVER, SPR_CURSOR_RIVER, HT_RECT | HT_DIAGONAL);
185 break;
186
187 case WID_DT_BUILD_AQUEDUCT: // Build aqueduct button
188 HandlePlacePushButton(this, WID_DT_BUILD_AQUEDUCT, SPR_CURSOR_AQUEDUCT, HT_SPECIAL);
189 break;
190
191 default: return;
192 }
193 this->last_clicked_widget = (DockToolbarWidgets)widget;
194 }
195
196 void OnPlaceObject([[maybe_unused]] Point pt, TileIndex tile) override
197 {
198 switch (this->last_clicked_widget) {
199 case WID_DT_CANAL: // Build canal button
201 break;
202
203 case WID_DT_LOCK: // Build lock button
205 break;
206
207 case WID_DT_DEMOLISH: // Demolish aka dynamite button
209 break;
210
211 case WID_DT_DEPOT: // Build depot button
212 Command<CMD_BUILD_SHIP_DEPOT>::Post(STR_ERROR_CAN_T_BUILD_SHIP_DEPOT, CcBuildDocks, tile, _ship_depot_direction);
213 break;
214
215 case WID_DT_STATION: { // Build station button
216 /* Determine the watery part of the dock. */
218 TileIndex tile_to = (dir != INVALID_DIAGDIR ? TileAddByDiagDir(tile, ReverseDiagDir(dir)) : tile);
219
220 bool adjacent = _ctrl_pressed;
221 auto proc = [=](bool test, StationID to_join) -> bool {
222 if (test) {
223 return Command<CMD_BUILD_DOCK>::Do(CommandFlagsToDCFlags(GetCommandFlags<CMD_BUILD_DOCK>()), tile, StationID::Invalid(), adjacent).Succeeded();
224 } else {
226 }
227 };
228
230 break;
231 }
232
233 case WID_DT_BUOY: // Build buoy button
235 break;
236
237 case WID_DT_RIVER: // Build river button (in scenario editor)
239 break;
240
241 case WID_DT_BUILD_AQUEDUCT: // Build aqueduct button
243 break;
244
245 default: NOT_REACHED();
246 }
247 }
248
250 {
251 VpSelectTilesWithMethod(pt.x, pt.y, select_method);
252 }
253
254 void OnPlaceMouseUp([[maybe_unused]] ViewportPlaceMethod select_method, ViewportDragDropSelectionProcess select_proc, [[maybe_unused]] Point pt, TileIndex start_tile, TileIndex end_tile) override
255 {
256 if (pt.x != -1) {
257 switch (select_proc) {
259 GUIPlaceProcDragXY(select_proc, start_tile, end_tile);
260 break;
262 if (_game_mode == GM_EDITOR) {
263 Command<CMD_BUILD_CANAL>::Post(STR_ERROR_CAN_T_BUILD_CANALS, CcPlaySound_CONSTRUCTION_WATER, end_tile, start_tile, _ctrl_pressed ? WATER_CLASS_SEA : WATER_CLASS_CANAL, false);
264 } else {
265 Command<CMD_BUILD_CANAL>::Post(STR_ERROR_CAN_T_BUILD_CANALS, CcPlaySound_CONSTRUCTION_WATER, end_tile, start_tile, WATER_CLASS_CANAL, _ctrl_pressed);
266 }
267 break;
269 Command<CMD_BUILD_CANAL>::Post(STR_ERROR_CAN_T_PLACE_RIVERS, CcPlaySound_CONSTRUCTION_WATER, end_tile, start_tile, WATER_CLASS_RIVER, _ctrl_pressed);
270 break;
271
272 default: break;
273 }
274 }
275 }
276
288
290 {
292
293 if (this->last_clicked_widget == WID_DT_BUILD_AQUEDUCT) {
295 } else {
297 if (IsValidDiagDirection(dir)) {
298 /* Locks and docks always select the tile "down" the slope. */
300 /* Locks also select the tile "up" the slope. */
301 if (this->last_clicked_widget == WID_DT_LOCK) tile_from = TileAddByDiagDir(tile_from, dir);
302 }
303 }
304
306 }
307
314 {
315 if (_game_mode != GM_NORMAL) return ES_NOT_HANDLED;
317 if (w == nullptr) return ES_NOT_HANDLED;
318 return w->OnHotkey(hotkey);
319 }
320
321 static inline HotkeyList hotkeys{"dockstoolbar", {
322 Hotkey('1', "canal", WID_DT_CANAL),
323 Hotkey('2', "lock", WID_DT_LOCK),
324 Hotkey('3', "demolish", WID_DT_DEMOLISH),
325 Hotkey('4', "depot", WID_DT_DEPOT),
326 Hotkey('5', "dock", WID_DT_STATION),
327 Hotkey('6', "buoy", WID_DT_BUOY),
328 Hotkey('7', "river", WID_DT_RIVER),
329 Hotkey({'B', '8'}, "aqueduct", WID_DT_BUILD_AQUEDUCT),
331};
332
339 NWidget(WWT_CLOSEBOX, COLOUR_DARK_GREEN),
340 NWidget(WWT_CAPTION, COLOUR_DARK_GREEN), SetStringTip(STR_WATERWAYS_TOOLBAR_CAPTION, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS),
341 NWidget(WWT_STICKYBOX, COLOUR_DARK_GREEN),
342 EndContainer(),
344 NWidget(WWT_IMGBTN, COLOUR_DARK_GREEN, WID_DT_CANAL), SetMinimalSize(22, 22), SetFill(0, 1), SetSpriteTip(SPR_IMG_BUILD_CANAL, STR_WATERWAYS_TOOLBAR_BUILD_CANALS_TOOLTIP),
345 NWidget(WWT_IMGBTN, COLOUR_DARK_GREEN, WID_DT_LOCK), SetMinimalSize(22, 22), SetFill(0, 1), SetSpriteTip(SPR_IMG_BUILD_LOCK, STR_WATERWAYS_TOOLBAR_BUILD_LOCKS_TOOLTIP),
346 NWidget(WWT_PANEL, COLOUR_DARK_GREEN), SetMinimalSize(5, 22), SetFill(1, 1), EndContainer(),
347 NWidget(WWT_IMGBTN, COLOUR_DARK_GREEN, WID_DT_DEMOLISH), SetMinimalSize(22, 22), SetFill(0, 1), SetSpriteTip(SPR_IMG_DYNAMITE, STR_TOOLTIP_DEMOLISH_BUILDINGS_ETC),
348 NWidget(WWT_IMGBTN, COLOUR_DARK_GREEN, WID_DT_DEPOT), SetMinimalSize(22, 22), SetFill(0, 1), SetSpriteTip(SPR_IMG_SHIP_DEPOT, STR_WATERWAYS_TOOLBAR_BUILD_DEPOT_TOOLTIP),
349 NWidget(WWT_IMGBTN, COLOUR_DARK_GREEN, WID_DT_STATION), SetMinimalSize(22, 22), SetFill(0, 1), SetSpriteTip(SPR_IMG_SHIP_DOCK, STR_WATERWAYS_TOOLBAR_BUILD_DOCK_TOOLTIP),
350 NWidget(WWT_IMGBTN, COLOUR_DARK_GREEN, WID_DT_BUOY), SetMinimalSize(22, 22), SetFill(0, 1), SetSpriteTip(SPR_IMG_BUOY, STR_WATERWAYS_TOOLBAR_BUOY_TOOLTIP),
351 NWidget(WWT_IMGBTN, COLOUR_DARK_GREEN, WID_DT_BUILD_AQUEDUCT), SetMinimalSize(23, 22), SetFill(0, 1), SetSpriteTip(SPR_IMG_AQUEDUCT, STR_WATERWAYS_TOOLBAR_BUILD_AQUEDUCT_TOOLTIP),
352 EndContainer(),
353};
354
355static WindowDesc _build_docks_toolbar_desc(
356 WDP_ALIGN_TOOLBAR, "toolbar_water", 0, 0,
360 &BuildDocksToolbarWindow::hotkeys
361);
362
371{
372 if (!Company::IsValidID(_local_company)) return nullptr;
373
375 return AllocateWindowDescFront<BuildDocksToolbarWindow>(_build_docks_toolbar_desc, TRANSPORT_WATER);
376}
377
384 NWidget(WWT_CLOSEBOX, COLOUR_DARK_GREEN),
385 NWidget(WWT_CAPTION, COLOUR_DARK_GREEN), SetStringTip(STR_WATERWAYS_TOOLBAR_CAPTION_SE, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS),
386 NWidget(WWT_STICKYBOX, COLOUR_DARK_GREEN),
387 EndContainer(),
389 NWidget(WWT_IMGBTN, COLOUR_DARK_GREEN, WID_DT_CANAL), SetMinimalSize(22, 22), SetFill(0, 1), SetSpriteTip(SPR_IMG_BUILD_CANAL, STR_WATERWAYS_TOOLBAR_CREATE_LAKE_TOOLTIP),
390 NWidget(WWT_IMGBTN, COLOUR_DARK_GREEN, WID_DT_LOCK), SetMinimalSize(22, 22), SetFill(0, 1), SetSpriteTip(SPR_IMG_BUILD_LOCK, STR_WATERWAYS_TOOLBAR_BUILD_LOCKS_TOOLTIP),
391 NWidget(WWT_PANEL, COLOUR_DARK_GREEN), SetMinimalSize(5, 22), SetFill(1, 1), EndContainer(),
392 NWidget(WWT_IMGBTN, COLOUR_DARK_GREEN, WID_DT_DEMOLISH), SetMinimalSize(22, 22), SetFill(0, 1), SetSpriteTip(SPR_IMG_DYNAMITE, STR_TOOLTIP_DEMOLISH_BUILDINGS_ETC),
393 NWidget(WWT_IMGBTN, COLOUR_DARK_GREEN, WID_DT_RIVER), SetMinimalSize(22, 22), SetFill(0, 1), SetSpriteTip(SPR_IMG_BUILD_RIVER, STR_WATERWAYS_TOOLBAR_CREATE_RIVER_TOOLTIP),
394 NWidget(WWT_IMGBTN, COLOUR_DARK_GREEN, WID_DT_BUILD_AQUEDUCT), SetMinimalSize(22, 22), SetFill(0, 1), SetSpriteTip(SPR_IMG_AQUEDUCT, STR_WATERWAYS_TOOLBAR_BUILD_AQUEDUCT_TOOLTIP),
395 EndContainer(),
396};
397
400 WDP_AUTO, "toolbar_water_scen", 0, 0,
404);
405
412{
413 return AllocateWindowDescFront<BuildDocksToolbarWindow>(_build_docks_scen_toolbar_desc, TRANSPORT_WATER);
414}
415
424
426public:
428 {
431 }
432
433 void Close([[maybe_unused]] int data = 0) override
434 {
437 }
438
439 void OnPaint() override
440 {
442
443 this->DrawWidgets();
444
446 SetTileSelectBigSize(-rad, -rad, 2 * rad, 2 * rad);
447 } else {
448 SetTileSelectSize(1, 1);
449 }
450
451 /* strings such as 'Size' and 'Coverage Area' */
452 Rect r = this->GetWidget<NWidgetBase>(BDSW_ACCEPTANCE)->GetCurrentRect();
453 const int bottom = r.bottom;
454 r.bottom = INT_MAX; // Allow overflow as we want to know the required height.
456 r.top = DrawStationCoverageAreaText(r, SCT_ALL, rad, true);
457 /* Resize background if the window is too small.
458 * Never make the window smaller to avoid oscillating if the size change affects the acceptance.
459 * (This is the case, if making the window bigger moves the mouse into the window.) */
460 if (r.top > bottom) {
461 ResizeWindow(this, 0, r.top - bottom, false);
462 }
463 }
464
465 void OnClick([[maybe_unused]] Point pt, WidgetID widget, [[maybe_unused]] int click_count) override
466 {
467 switch (widget) {
468 case BDSW_LT_OFF:
469 case BDSW_LT_ON:
474 this->SetDirty();
475 SetViewportCatchmentStation(nullptr, true);
476 break;
477 }
478 }
479
480 void OnRealtimeTick([[maybe_unused]] uint delta_ms) override
481 {
483 }
484
485 IntervalTimer<TimerGameCalendar> yearly_interval = {{TimerGameCalendar::YEAR, TimerGameCalendar::Priority::NONE}, [this](auto) {
486 this->InvalidateData();
487 }};
488};
489
493 NWidget(WWT_CLOSEBOX, COLOUR_DARK_GREEN),
494 NWidget(WWT_CAPTION, COLOUR_DARK_GREEN), SetStringTip(STR_STATION_BUILD_DOCK_CAPTION, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS),
495 EndContainer(),
496 NWidget(WWT_PANEL, COLOUR_DARK_GREEN, BDSW_BACKGROUND),
499 NWidget(WWT_LABEL, INVALID_COLOUR, BDSW_INFO), SetStringTip(STR_STATION_BUILD_COVERAGE_AREA_TITLE), SetFill(1, 0),
501 NWidget(WWT_TEXTBTN, COLOUR_GREY, BDSW_LT_OFF), SetMinimalSize(60, 12), SetFill(1, 0), SetStringTip(STR_STATION_BUILD_COVERAGE_OFF, STR_STATION_BUILD_COVERAGE_AREA_OFF_TOOLTIP),
502 NWidget(WWT_TEXTBTN, COLOUR_GREY, BDSW_LT_ON), SetMinimalSize(60, 12), SetFill(1, 0), SetStringTip(STR_STATION_BUILD_COVERAGE_ON, STR_STATION_BUILD_COVERAGE_AREA_ON_TOOLTIP),
503 EndContainer(),
504 EndContainer(),
506 EndContainer(),
507 EndContainer(),
508};
509
510static WindowDesc _build_dock_station_desc(
511 WDP_AUTO, nullptr, 0, 0,
515);
516
517static void ShowBuildDockStationPicker(Window *parent)
518{
519 new BuildDocksStationWindow(_build_dock_station_desc, parent);
520}
521
523private:
524 static void UpdateDocksDirection()
525 {
526 if (_ship_depot_direction != AXIS_X) {
527 SetTileSelectSize(1, 2);
528 } else {
529 SetTileSelectSize(2, 1);
530 }
531 }
532
533public:
535 {
537 this->LowerWidget(WID_BDD_X + _ship_depot_direction);
538 UpdateDocksDirection();
539 }
540
542 {
543 switch (widget) {
544 case WID_BDD_X:
545 case WID_BDD_Y:
548 break;
549 }
550 }
551
552 void DrawWidget(const Rect &r, WidgetID widget) const override
553 {
555
556 switch (widget) {
557 case WID_BDD_X:
558 case WID_BDD_Y: {
559 Axis axis = widget == WID_BDD_X ? AXIS_X : AXIS_Y;
560
564 int x = (ir.Width() - ScaleSpriteTrad(96)) / 2;
565 int y = (ir.Height() - ScaleSpriteTrad(64)) / 2;
566 int x1 = ScaleSpriteTrad(63);
567 int x2 = ScaleSpriteTrad(31);
568 DrawShipDepotSprite(x + (axis == AXIS_X ? x1 : x2), y + ScaleSpriteTrad(17), axis, DEPOT_PART_NORTH);
569 DrawShipDepotSprite(x + (axis == AXIS_X ? x2 : x1), y + ScaleSpriteTrad(33), axis, DEPOT_PART_SOUTH);
570 }
571 break;
572 }
573 }
574 }
575
576 void OnClick([[maybe_unused]] Point pt, WidgetID widget, [[maybe_unused]] int click_count) override
577 {
578 switch (widget) {
579 case WID_BDD_X:
580 case WID_BDD_Y:
581 this->RaiseWidget(WID_BDD_X + _ship_depot_direction);
582 _ship_depot_direction = (widget == WID_BDD_X ? AXIS_X : AXIS_Y);
583 this->LowerWidget(WID_BDD_X + _ship_depot_direction);
585 UpdateDocksDirection();
586 this->SetDirty();
587 break;
588 }
589 }
590};
591
592static constexpr NWidgetPart _nested_build_docks_depot_widgets[] = {
594 NWidget(WWT_CLOSEBOX, COLOUR_DARK_GREEN),
595 NWidget(WWT_CAPTION, COLOUR_DARK_GREEN), SetStringTip(STR_DEPOT_BUILD_SHIP_CAPTION, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS),
596 EndContainer(),
597 NWidget(WWT_PANEL, COLOUR_DARK_GREEN, WID_BDD_BACKGROUND),
599 NWidget(WWT_TEXTBTN, COLOUR_GREY, WID_BDD_X), SetToolTip(STR_DEPOT_BUILD_SHIP_ORIENTATION_TOOLTIP),
600 NWidget(WWT_TEXTBTN, COLOUR_GREY, WID_BDD_Y), SetToolTip(STR_DEPOT_BUILD_SHIP_ORIENTATION_TOOLTIP),
601 EndContainer(),
602 EndContainer(),
603};
604
605static WindowDesc _build_docks_depot_desc(
606 WDP_AUTO, nullptr, 0, 0,
609 _nested_build_docks_depot_widgets
610);
611
612
613static void ShowBuildDocksDepotPicker(Window *parent)
614{
615 new BuildDocksDepotWindow(_build_docks_depot_desc, parent);
616}
617
618
619void InitializeDockGui()
620{
621 _ship_depot_direction = AXIS_X;
622}
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.
Common return value for all commands.
bool Succeeded() const
Did this command succeed?
bool Failed() const
Did this command fail?
An interval timer will fire every interval, and will continue to fire until it is deleted.
Definition timer.h:76
Base class for windows opened from a toolbar.
Definition window_gui.h:978
void Close(int data=0) override
Hide the window and all its child windows, and mark them for a later deletion.
Definition window.cpp:3522
static WidgetDimensions scaled
Widget dimensions scaled for current zoom level.
Definition window_gui.h:28
int vsep_normal
Normal vertical spacing.
Definition window_gui.h:58
RectPadding fullbevel
Always-scaled bevel thickness.
Definition window_gui.h:39
static const WidgetDimensions unscaled
Unscaled widget dimensions.
Definition window_gui.h:94
Functions related to commands.
static constexpr DoCommandFlags CommandFlagsToDCFlags(CommandFlags cmd_flags)
Extracts the DC flags needed for DoCommand from the flags returned by GetCommandFlags.
Commands
List of commands.
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.
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:417
@ BDSW_LT_OFF
'Off' button of coverage high light.
Definition dock_gui.cpp:419
@ BDSW_BACKGROUND
Background panel.
Definition dock_gui.cpp:418
@ BDSW_INFO
'Coverage highlight' label.
Definition dock_gui.cpp:421
@ BDSW_ACCEPTANCE
Acceptance info.
Definition dock_gui.cpp:422
@ BDSW_LT_ON
'On' button of coverage high light.
Definition dock_gui.cpp:420
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:411
Window * ShowBuildDocksToolbar()
Open the build water toolbar window.
Definition dock_gui.cpp:370
static constexpr NWidgetPart _nested_build_docks_scen_toolbar_widgets[]
Nested widget parts of docks toolbar, scenario editor version.
Definition dock_gui.cpp:382
static constexpr NWidgetPart _nested_build_docks_toolbar_widgets[]
Nested widget parts of docks toolbar, game version.
Definition dock_gui.cpp:337
static constexpr NWidgetPart _nested_build_dock_station_widgets[]
Nested widget parts of a build dock station window.
Definition dock_gui.cpp:491
static WindowDesc _build_docks_scen_toolbar_desc(WDP_AUTO, "toolbar_water_scen", 0, 0, WC_SCEN_BUILD_TOOLBAR, WC_NONE, WindowDefaultFlag::Construction, _nested_build_docks_scen_toolbar_widgets)
Window definition for the build docks in scenario editor window.
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.
constexpr NWidgetPart SetSpriteTip(SpriteID sprite, StringID tip={})
Widget part function for setting the sprite and tooltip.
constexpr NWidgetPart SetPIP(uint8_t pre, uint8_t inter, uint8_t post)
Widget part function for setting a pre/inter/post spaces.
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.
constexpr NWidgetPart SetStringTip(StringID string, StringID tip={})
Widget part function for setting the string and tooltip.
constexpr NWidgetPart SetMinimalSize(int16_t x, int16_t y)
Widget part function for setting the minimal size.
constexpr NWidgetPart NWidget(WidgetType tp, Colours col, WidgetID idx=-1)
Widget part function for starting a new 'real' widget.
constexpr NWidgetPart SetToolTip(StringID tip)
Widget part function for setting tooltip and clearing the widget data.
constexpr NWidgetPart EndContainer()
Widget part function for denoting the end of a container (horizontal, vertical, WWT_FRAME,...
constexpr NWidgetPart SetMinimalTextLines(uint8_t lines, uint8_t spacing, FontSize size=FS_NORMAL)
Widget part function for setting the minimal text lines.
constexpr NWidgetPart SetResize(int16_t dx, int16_t dy)
Widget part function for setting the resize step.
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.
void SetDirty() const
Mark entire window as dirty (in need of re-paint)
Definition window.cpp:937
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:220
TileIndex TileAddXY(TileIndex tile, int x, int y)
Adds a given offset to a tile.
Definition map_func.h:469
TileIndex TileAddByDiagDir(TileIndex tile, DiagDirection dir)
Adds a DiagDir to a tile.
Definition map_func.h:610
constexpr TileIndex TileAdd(TileIndex tile, TileIndexDiff offset)
Adds a given offset to a tile.
Definition map_func.h:456
static debug_inline uint TileY(TileIndex tile)
Get the Y component of a tile.
Definition map_func.h:424
static debug_inline uint TileX(TileIndex tile)
Get the X component of a tile.
Definition map_func.h:414
TileIndexDiff TileOffsByDiagDir(DiagDirection dir)
Convert a DiagDirection to a TileIndexDiff.
Definition map_func.h:569
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:58
ClientSettings _settings_client
The current settings for this game.
Definition settings.cpp:57
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:47
@ SND_15_BEEP
19 == 0x13 GUI button click
Definition sound_type.h:66
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.
int DrawStationCoverageAreaText(const Rect &r, StationCoverageType sct, int rad, bool supplies)
Calculates and draws the accepted or supplied cargo around the selected tile(s)
void CheckRedrawStationCoverage(const Window *w)
Check whether we need to redraw the station coverage text.
Contains enums and function declarations connected with stations GUI.
@ SCT_ALL
Draw all cargoes.
Definition station_gui.h:24
static constexpr uint CA_DOCK
Catchment for docks with "modified catchment" enabled.
static constexpr uint CA_UNMODIFIED
Catchment for all stations with "modified catchment" disabled.
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 DrawWidget(const Rect &r, WidgetID widget) const override
Draw the contents of a nested widget.
Definition dock_gui.cpp:552
void OnClick(Point pt, WidgetID widget, int click_count) override
A click with the left mouse button has been made on the window.
Definition dock_gui.cpp:576
void UpdateWidgetSize(WidgetID widget, Dimension &size, const Dimension &padding, Dimension &fill, Dimension &resize) override
Update size and resize step of a widget in the window.
Definition dock_gui.cpp:541
void OnClick(Point pt, WidgetID widget, int click_count) override
A click with the left mouse button has been made on the window.
Definition dock_gui.cpp:465
void OnPaint() override
The window must be repainted.
Definition dock_gui.cpp:439
void OnRealtimeTick(uint delta_ms) override
Called periodically.
Definition dock_gui.cpp:480
void Close(int data=0) override
Hide the window and all its child windows, and mark them for a later deletion.
Definition dock_gui.cpp:433
Toolbar window for constructing water infrastructure.
Definition dock_gui.cpp:100
void OnPlacePresize(Point pt, TileIndex tile_from) override
The user moves over the map when a tile highlight mode has been set when the special mouse mode has b...
Definition dock_gui.cpp:289
void OnClick(Point pt, WidgetID widget, int click_count) override
A click with the left mouse button has been made on the window.
Definition dock_gui.cpp:151
void OnPlaceObjectAbort() override
The user cancelled a tile highlight mode that has been set.
Definition dock_gui.cpp:277
static EventState DockToolbarGlobalHotkeys(int hotkey)
Handler for global hotkeys of the BuildDocksToolbarWindow.
Definition dock_gui.cpp:313
void OnPlaceDrag(ViewportPlaceMethod select_method, ViewportDragDropSelectionProcess select_proc, Point pt) override
The user is dragging over the map when the tile highlight mode has been set.
Definition dock_gui.cpp:249
void OnPlaceObject(Point pt, TileIndex tile) override
The user clicked some place on the map when a tile highlight mode has been set.
Definition dock_gui.cpp:196
void OnPlaceMouseUp(ViewportPlaceMethod select_method, ViewportDragDropSelectionProcess select_proc, Point pt, TileIndex start_tile, TileIndex end_tile) override
The user has dragged over the map when the tile highlight mode has been set.
Definition dock_gui.cpp:254
void OnInvalidateData(int data=0, bool gui_scope=true) override
Some data on this window has become invalid.
Definition dock_gui.cpp:123
void Close(int data=0) override
Hide the window and all its child windows, and mark them for a later deletion.
Definition dock_gui.cpp:111
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:156
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.
Coordinates of a point in 2D.
static bool IsValidID(auto index)
Tests whether given index can be used to get valid (non-nullptr) Titem.
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.
Rect Shrink(int s) const
Copy and shrink Rect by s pixels.
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:168
Number to differentiate different windows of the same class.
Data structure for an opened window.
Definition window_gui.h:272
virtual void Close(int data=0)
Hide the window and all its child windows, and mark them for a later deletion.
Definition window.cpp:1044
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:3157
Window * parent
Parent window.
Definition window_gui.h:327
void RaiseWidget(WidgetID widget_index)
Marks a widget as raised.
Definition window_gui.h:468
ResizeInfo resize
Resize information.
Definition window_gui.h:313
void SetWidgetsDisabledState(bool disab_stat, Args... widgets)
Sets the enabled/disabled status of a list of widgets.
Definition window_gui.h:514
bool IsWidgetLowered(WidgetID widget_index) const
Gets the lowered state of a widget.
Definition window_gui.h:490
void RaiseButtons(bool autoraise=false)
Raise the buttons of the window.
Definition window.cpp:522
const NWID * GetWidget(WidgetID widnum) const
Get the nested widget with number widnum from the nested widget tree.
Definition window_gui.h:969
void LowerWidget(WidgetID widget_index)
Marks a widget as lowered.
Definition window_gui.h:459
void InitNested(WindowNumber number=0)
Perform complete initialization of the Window with nested widgets, to allow use.
Definition window.cpp:1743
virtual EventState OnHotkey(int hotkey)
A hotkey has been pressed.
Definition window.cpp:562
WindowNumber window_number
Window number within the window class.
Definition window_gui.h:301
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).
void VpSetPresizeRange(TileIndex from, TileIndex to)
Highlights all tiles between a set of two tiles.
void VpSelectTilesWithMethod(int x, int y, ViewportPlaceMethod method)
Selects tiles while dragging.
void VpStartPlaceSizing(TileIndex tile, ViewportPlaceMethod method, ViewportDragDropSelectionProcess process)
highlighting tiles while only going over them with the mouse
@ 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:1919
Functions related to vehicles.
@ VEH_SHIP
Ship vehicle type.
void SetTileSelectSize(int w, int h)
Highlight w by h tiles at the cursor.
void SetViewportCatchmentStation(const Station *st, bool sel)
Select or deselect station for coverage area highlight.
Functions related to (drawing on) viewports.
ViewportPlaceMethod
Viewport place method (type of highlighted area and placed objects)
@ VPM_X_AND_Y
area of land in X and Y directions
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.
Functions related to water (management)
Command definitions related to water tiles.
@ 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
@ 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
Command definitions related to waypoints.
static RectPadding ScaleGUITrad(const RectPadding &r)
Scale a RectPadding to GUI zoom level.
Definition widget.cpp:35
@ WWT_IMGBTN
(Toggle) Button with image
Definition widget_type.h:43
@ WWT_LABEL
Centered label.
Definition widget_type.h:48
@ NWID_HORIZONTAL
Horizontal container.
Definition widget_type.h:66
@ WWT_TEXTBTN
(Toggle) Button with text
Definition widget_type.h:46
@ WWT_PANEL
Simple depressed panel.
Definition widget_type.h:41
@ WWT_STICKYBOX
Sticky box (at top-right of a window, after WWT_DEFSIZEBOX)
Definition widget_type.h:57
@ WWT_CAPTION
Window caption (window title between closebox and stickybox)
Definition widget_type.h:52
@ NWID_VERTICAL
Vertical container.
Definition widget_type.h:68
@ WWT_CLOSEBOX
Close box (at top-left of a window)
Definition widget_type.h:60
@ WWT_EMPTY
Empty widget, place holder to reserve space in widget tree.
Definition widget_type.h:39
@ NWID_HORIZONTAL_LTR
Horizontal container that doesn't change the order of the widgets for RTL languages.
Definition widget_type.h:67
@ EqualSize
Containers should keep all their (resizing) children equally large.
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:1137
void ResizeWindow(Window *w, int delta_x, int delta_y, bool clamp_to_screen, bool schedule_resize)
Resize the window.
Definition window.cpp:2019
void CloseWindowByClass(WindowClass cls, int data)
Close all windows of a given class.
Definition window.cpp:1149
Window functions not directly related to making/drawing windows.
Functions, definitions and such used only by the GUI.
@ Construction
This window is used for construction; close it whenever changing company.
@ WDP_AUTO
Find a place automatically.
Definition window_gui.h:145
@ WDP_ALIGN_TOOLBAR
Align toward the toolbar.
Definition window_gui.h:147
int WidgetID
Widget ID.
Definition window_type.h:20
EventState
State of handling an event.
@ ES_NOT_HANDLED
The passed event is not handled.
@ WC_BUILD_STATION
Build station; Window numbers:
@ WC_SCEN_BUILD_TOOLBAR
Scenario build toolbar; Window numbers:
Definition window_type.h:82
@ WC_BUILD_TOOLBAR
Build toolbar; Window numbers:
Definition window_type.h:75
@ WC_NONE
No window, redirects to WC_MAIN_WINDOW.
Definition window_type.h:47
@ WC_SCEN_LAND_GEN
Landscape generation (in Scenario Editor); Window numbers:
@ WC_SELECT_STATION
Select station (when joining stations); Window numbers:
@ WC_BUILD_DEPOT
Build depot; Window numbers:
@ WC_BUILD_BRIDGE
Build bridge; Window numbers:
Functions related to zooming.
int ScaleSpriteTrad(int value)
Scale traditional pixel dimensions to GUI zoom level, for drawing sprites.
Definition zoom_func.h:107