OpenTTD Source 20260129-master-g2bb01bd0e4
rail_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 <https://www.gnu.org/licenses/old-licenses/gpl-2.0>.
6 */
7
10#include "stdafx.h"
11#include "gui.h"
12#include "station_base.h"
13#include "waypoint_base.h"
14#include "window_gui.h"
15#include "station_gui.h"
16#include "terraform_gui.h"
17#include "viewport_func.h"
18#include "command_func.h"
19#include "waypoint_func.h"
20#include "newgrf_badge.h"
21#include "newgrf_badge_gui.h"
22#include "newgrf_station.h"
23#include "company_base.h"
24#include "strings_func.h"
25#include "window_func.h"
26#include "sound_func.h"
27#include "company_func.h"
28#include "dropdown_type.h"
29#include "dropdown_func.h"
30#include "tunnelbridge.h"
31#include "tilehighlight_func.h"
33#include "hotkeys.h"
34#include "engine_base.h"
35#include "vehicle_func.h"
36#include "zoom_func.h"
37#include "rail_gui.h"
38#include "station_cmd.h"
39#include "tunnelbridge_cmd.h"
40#include "waypoint_cmd.h"
41#include "rail_cmd.h"
42#include "timer/timer.h"
44#include "picker_gui.h"
45
46#include "station_map.h"
47#include "tunnelbridge_map.h"
48
49#include "widgets/rail_widget.h"
50
51#include "table/strings.h"
52
53#include "safeguards.h"
54
55
62
68
75
76
77static void HandleStationPlacement(TileIndex start, TileIndex end);
78static void ShowBuildTrainDepotPicker(Window *parent);
79static void ShowBuildWaypointPicker(Window *parent);
80static Window *ShowStationBuilder(Window *parent);
81static void ShowSignalBuilder(Window *parent);
82
87static bool IsStationAvailable(const StationSpec *statspec)
88{
89 if (statspec == nullptr || !statspec->callback_mask.Test(StationCallbackMask::Avail)) return true;
90
91 uint16_t cb_res = GetStationCallback(CBID_STATION_AVAILABILITY, 0, 0, statspec, nullptr, INVALID_TILE);
92 if (cb_res == CALLBACK_FAILED) return true;
93
95}
96
97void CcPlaySound_CONSTRUCTION_RAIL(Commands, const CommandCost &result, TileIndex tile)
98{
99 if (result.Succeeded() && _settings_client.sound.confirm) SndPlayTileFx(SND_20_CONSTRUCTION_RAIL, tile);
100}
101
102static void GenericPlaceRail(TileIndex tile, Track track)
103{
105 Command<Commands::RemoveRail>::Post(STR_ERROR_CAN_T_REMOVE_RAILROAD_TRACK, CcPlaySound_CONSTRUCTION_RAIL,
106 tile, track);
107 } else {
108 Command<Commands::BuildRail>::Post(STR_ERROR_CAN_T_BUILD_RAILROAD_TRACK, CcPlaySound_CONSTRUCTION_RAIL,
110 }
111}
112
128
130static const Track _place_depot_extra_track[12] = {
131 TRACK_LEFT, TRACK_UPPER, TRACK_UPPER, TRACK_RIGHT, // First additional track for directions 0..3
132 TRACK_X, TRACK_Y, TRACK_X, TRACK_Y, // Second additional track
133 TRACK_LOWER, TRACK_LEFT, TRACK_RIGHT, TRACK_LOWER, // Third additional track
134};
135
142
143void CcRailDepot(Commands, const CommandCost &result, TileIndex tile, RailType, DiagDirection dir)
144{
145 if (result.Failed()) return;
146
147 if (_settings_client.sound.confirm) SndPlayTileFx(SND_20_CONSTRUCTION_RAIL, tile);
149
150 tile += TileOffsByDiagDir(dir);
151
152 if (IsTileType(tile, TileType::Railway)) {
154
155 /* Don't place the rail straight out of the depot of there is another depot across from it. */
156 Tile double_depot_tile = tile + TileOffsByDiagDir(dir);
157 bool is_double_depot = IsValidTile(double_depot_tile) && IsRailDepotTile(double_depot_tile);
158 if (!is_double_depot) PlaceExtraDepotRail(tile, _place_depot_extra_dir[dir + 4], _place_depot_extra_track[dir + 4]);
159
161 }
162}
163
169{
172 return;
173 }
174
175 Axis axis = GetAxisForNewRailWaypoint(tile);
176 if (IsValidAxis(axis)) {
177 /* Valid tile for waypoints */
179 VpSetPlaceSizingLimit(_settings_game.station.station_spread);
180 } else {
181 /* Tile where we can't build rail waypoints. This is always going to fail,
182 * but provides the user with a proper error message. */
183 Command<Commands::BuildRailWaypoint>::Post(STR_ERROR_CAN_T_BUILD_RAIL_WAYPOINT , tile, AXIS_X, 1, 1, STAT_CLASS_WAYP, 0, StationID::Invalid(), false);
184 }
185}
186
187void CcStation(Commands, const CommandCost &result, TileIndex tile)
188{
189 if (result.Failed()) return;
190
191 if (_settings_client.sound.confirm) SndPlayTileFx(SND_20_CONSTRUCTION_RAIL, tile);
192 /* Only close the station builder window if the default station and non persistent building is chosen. */
194}
195
201{
204 VpSetPlaceSizingLimit(-1);
207 VpSetPlaceSizingLimit(_settings_game.station.station_spread);
208 } else {
211 if (!_station_gui.axis) std::swap(w, h);
212
215 uint8_t numtracks = _settings_client.gui.station_numtracks;
216 uint8_t platlength = _settings_client.gui.station_platlength;
217 bool adjacent = _ctrl_pressed;
218
219 auto proc = [=](bool test, StationID to_join) -> bool {
220 if (test) {
221 return Command<Commands::BuildRailStation>::Do(CommandFlagsToDCFlags(GetCommandFlags<Commands::BuildRailStation>()), tile, rt, params.axis, numtracks, platlength, params.sel_class, params.sel_type, StationID::Invalid(), adjacent).Succeeded();
222 } else {
223 return Command<Commands::BuildRailStation>::Post(STR_ERROR_CAN_T_BUILD_RAILROAD_STATION, CcStation, tile, rt, params.axis, numtracks, platlength, params.sel_class, params.sel_type, to_join, adjacent);
224 }
225 };
226
227 ShowSelectStationIfNeeded(TileArea(tile, w, h), proc);
228 }
229}
230
237{
239
240 if (trackbits & TRACK_BIT_VERT) { // N-S direction
241 trackbits = (_tile_fract_coords.x <= _tile_fract_coords.y) ? TRACK_BIT_RIGHT : TRACK_BIT_LEFT;
242 }
243
244 if (trackbits & TRACK_BIT_HORZ) { // E-W direction
245 trackbits = (_tile_fract_coords.x + _tile_fract_coords.y <= 15) ? TRACK_BIT_UPPER : TRACK_BIT_LOWER;
246 }
247
248 Track track = FindFirstTrack(trackbits);
249
251 Command<Commands::RemoveSignal>::Post(STR_ERROR_CAN_T_REMOVE_SIGNALS_FROM, CcPlaySound_CONSTRUCTION_RAIL, tile, track);
252 } else {
253 /* Which signals should we cycle through? */
254 bool tile_has_signal = IsPlainRailTile(tile) && IsValidTrack(track) && HasSignalOnTrack(tile, track);
255 SignalType cur_signal_on_tile = tile_has_signal ? GetSignalType(tile, track) : _cur_signal_type;
256 SignalType cycle_start;
257 SignalType cycle_end;
258
259 /* Start with the least restrictive case: the player wants to cycle through all signals they can see. */
262 cycle_end = SIGTYPE_LAST;
263 } else {
264 /* Only cycle through signals of the same group (block or path) as the current signal on the tile. */
265 if (cur_signal_on_tile <= SIGTYPE_LAST_NOPBS) {
266 /* Block signals only. */
267 cycle_start = SIGTYPE_BLOCK;
268 cycle_end = SIGTYPE_LAST_NOPBS;
269 } else {
270 /* Path signals only. */
271 cycle_start = SIGTYPE_PBS;
272 cycle_end = SIGTYPE_LAST;
273 }
274 }
275
276 if (FindWindowById(WC_BUILD_SIGNAL, 0) != nullptr) {
277 /* signal GUI is used */
278 Command<Commands::BuildSignal>::Post(_convert_signal_button ? STR_ERROR_SIGNAL_CAN_T_CONVERT_SIGNALS_HERE : STR_ERROR_CAN_T_BUILD_SIGNALS_HERE, CcPlaySound_CONSTRUCTION_RAIL,
279 tile, track, _cur_signal_type, _cur_signal_variant, _convert_signal_button, false, _ctrl_pressed, cycle_start, cycle_end, 0, 0);
280 } else {
282 Command<Commands::BuildSignal>::Post(STR_ERROR_CAN_T_BUILD_SIGNALS_HERE, CcPlaySound_CONSTRUCTION_RAIL,
283 tile, track, _settings_client.gui.default_signal_type, sigvar, false, false, _ctrl_pressed, cycle_start, cycle_end, 0, 0);
284
285 }
286 }
287}
288
294static void PlaceRail_Bridge(TileIndex tile, Window *w)
295{
296 if (IsBridgeTile(tile)) {
297 TileIndex other_tile = GetOtherTunnelBridgeEnd(tile);
298 Point pt = {0, 0};
299 w->OnPlaceMouseUp(VPM_X_OR_Y, DDSP_BUILD_BRIDGE, pt, other_tile, tile);
300 } else {
302 }
303}
304
306void CcBuildRailTunnel(Commands, const CommandCost &result, TileIndex tile)
307{
308 if (result.Succeeded()) {
309 if (_settings_client.sound.confirm) SndPlayTileFx(SND_20_CONSTRUCTION_RAIL, tile);
311 } else {
313 }
314}
315
328
335{
336 if (w->IsWidgetDisabled(WID_RAT_REMOVE)) return false;
337
338 /* allow ctrl to switch remove mode only for these widgets */
339 for (WidgetID i = WID_RAT_BUILD_NS; i <= WID_RAT_BUILD_STATION; i++) {
340 if ((i <= WID_RAT_AUTORAIL || i >= WID_RAT_BUILD_WAYPOINT) && w->IsWidgetLowered(i)) {
342 return true;
343 }
344 }
345
346 return false;
347}
348
349
356{
357 if (w->IsWidgetDisabled(WID_RAT_REMOVE)) return;
359 SndClickBeep();
360
361 /* handle station builder */
364 /* starting drag & drop remove */
366 SetTileSelectSize(1, 1);
367 } else {
368 VpSetPlaceSizingLimit(-1);
369 }
370 } else {
371 /* starting station build mode */
375 if (_station_gui.axis == 0) std::swap(x, y);
376 SetTileSelectSize(x, y);
377 } else {
378 VpSetPlaceSizingLimit(_settings_game.station.station_spread);
379 }
380 }
381 }
382}
383
384static void DoRailroadTrack(Track track)
385{
387 Command<Commands::RemoveRailLong>::Post(STR_ERROR_CAN_T_REMOVE_RAILROAD_TRACK, CcPlaySound_CONSTRUCTION_RAIL,
388 TileVirtXY(_thd.selend.x, _thd.selend.y), TileVirtXY(_thd.selstart.x, _thd.selstart.y), track);
389 } else {
390 Command<Commands::BuildRailLong>::Post(STR_ERROR_CAN_T_BUILD_RAILROAD_TRACK, CcPlaySound_CONSTRUCTION_RAIL,
392 }
393}
394
395static void HandleAutodirPlacement()
396{
397 Track trackstat = static_cast<Track>( _thd.drawstyle & HT_DIR_MASK); // 0..5
398
399 if (_thd.drawstyle & HT_RAIL) { // one tile case
400 GenericPlaceRail(TileVirtXY(_thd.selend.x, _thd.selend.y), trackstat);
401 return;
402 }
403
404 DoRailroadTrack(trackstat);
405}
406
414{
415 Track track = (Track)GB(_thd.drawstyle, 0, 3); // 0..5
416
417 if ((_thd.drawstyle & HT_DRAG_MASK) == HT_RECT) { // one tile case
419 return;
420 }
421
422 /* _settings_client.gui.drag_signals_density is given as a parameter such that each user
423 * in a network game can specify their own signal density */
425 Command<Commands::RemoveSignalLong>::Post(STR_ERROR_CAN_T_REMOVE_SIGNALS_FROM, CcPlaySound_CONSTRUCTION_RAIL,
426 TileVirtXY(_thd.selstart.x, _thd.selstart.y), TileVirtXY(_thd.selend.x, _thd.selend.y), track, _ctrl_pressed);
427 } else {
428 bool sig_gui = FindWindowById(WC_BUILD_SIGNAL, 0) != nullptr;
431 Command<Commands::BuildSignalLong>::Post(STR_ERROR_CAN_T_BUILD_SIGNALS_HERE, CcPlaySound_CONSTRUCTION_RAIL,
433 }
434}
435
436
441
443 {
444 this->CreateNestedTree();
447 this->OnInvalidateData();
448
450 }
451
452 void Close([[maybe_unused]] int data = 0) override
453 {
458 this->Window::Close();
459 }
460
467
468 void OnInvalidateData([[maybe_unused]] int data = 0, [[maybe_unused]] bool gui_scope = true) override
469 {
470 if (!gui_scope) return;
471
472 if (!ValParamRailType(this->railtype)) {
473 /* Close toolbar if rail type is not available. */
474 this->Close();
475 return;
476 }
477
479 for (const WidgetID widget : can_build_widgets) this->SetWidgetDisabledState(widget, !can_build);
480 if (!can_build) {
486 }
487 }
488
489 bool OnTooltip([[maybe_unused]] Point pt, WidgetID widget, TooltipCloseCondition close_cond) override
490 {
492 if (can_build) return false;
493
494 if (std::ranges::find(can_build_widgets, widget) == std::end(can_build_widgets)) return false;
495
496 GuiShowTooltips(this, GetEncodedString(STR_TOOLBAR_DISABLED_NO_VEHICLE_AVAILABLE), close_cond);
497 return true;
498 }
499
500 void OnInit() override
501 {
502 /* Configure the rail toolbar for the railtype. */
503 const RailTypeInfo *rti = GetRailTypeInfo(this->railtype);
504 this->GetWidget<NWidgetCore>(WID_RAT_BUILD_NS)->SetSprite(rti->gui_sprites.build_ns_rail);
505 this->GetWidget<NWidgetCore>(WID_RAT_BUILD_X)->SetSprite(rti->gui_sprites.build_x_rail);
506 this->GetWidget<NWidgetCore>(WID_RAT_BUILD_EW)->SetSprite(rti->gui_sprites.build_ew_rail);
507 this->GetWidget<NWidgetCore>(WID_RAT_BUILD_Y)->SetSprite(rti->gui_sprites.build_y_rail);
508 this->GetWidget<NWidgetCore>(WID_RAT_AUTORAIL)->SetSprite(rti->gui_sprites.auto_rail);
509 this->GetWidget<NWidgetCore>(WID_RAT_BUILD_DEPOT)->SetSprite(rti->gui_sprites.build_depot);
510 this->GetWidget<NWidgetCore>(WID_RAT_CONVERT_RAIL)->SetSprite(rti->gui_sprites.convert_rail);
511 this->GetWidget<NWidgetCore>(WID_RAT_BUILD_TUNNEL)->SetSprite(rti->gui_sprites.build_tunnel);
512 }
513
519 {
520 this->railtype = railtype;
521 this->ReInit();
522 }
523
524 void UpdateRemoveWidgetStatus(WidgetID clicked_widget)
525 {
526 switch (clicked_widget) {
527 case WID_RAT_REMOVE:
528 /* If it is the removal button that has been clicked, do nothing,
529 * as it is up to the other buttons to drive removal status */
530 return;
531
532 case WID_RAT_BUILD_NS:
533 case WID_RAT_BUILD_X:
534 case WID_RAT_BUILD_EW:
535 case WID_RAT_BUILD_Y:
536 case WID_RAT_AUTORAIL:
540 /* Removal button is enabled only if the rail/signal/waypoint/station
541 * button is still lowered. Once raised, it has to be disabled */
542 this->SetWidgetDisabledState(WID_RAT_REMOVE, !this->IsWidgetLowered(clicked_widget));
543 break;
544
545 default:
546 /* When any other buttons than rail/signal/waypoint/station, raise and
547 * disable the removal button */
550 break;
551 }
552 }
553
554 std::string GetWidgetString(WidgetID widget, StringID stringid) const override
555 {
556 if (widget == WID_RAT_CAPTION) {
557 const RailTypeInfo *rti = GetRailTypeInfo(this->railtype);
558 if (rti->max_speed > 0) {
559 return GetString(STR_TOOLBAR_RAILTYPE_VELOCITY, rti->strings.toolbar_caption, PackVelocity(rti->max_speed, VEH_TRAIN));
560 }
561 return GetString(rti->strings.toolbar_caption);
562 }
563
564 return this->Window::GetWidgetString(widget, stringid);
565 }
566
567 void OnClick([[maybe_unused]] Point pt, WidgetID widget, [[maybe_unused]] int click_count) override
568 {
569 if (widget < WID_RAT_BUILD_NS) return;
570
572 switch (widget) {
573 case WID_RAT_BUILD_NS:
575 this->last_user_action = widget;
576 break;
577
578 case WID_RAT_BUILD_X:
580 this->last_user_action = widget;
581 break;
582
583 case WID_RAT_BUILD_EW:
585 this->last_user_action = widget;
586 break;
587
588 case WID_RAT_BUILD_Y:
590 this->last_user_action = widget;
591 break;
592
593 case WID_RAT_AUTORAIL:
595 this->last_user_action = widget;
596 break;
597
598 case WID_RAT_DEMOLISH:
600 this->last_user_action = widget;
601 break;
602
605 ShowBuildTrainDepotPicker(this);
606 this->last_user_action = widget;
607 }
608 break;
609
611 this->last_user_action = widget;
612 if (HandlePlacePushButton(this, WID_RAT_BUILD_WAYPOINT, SPR_CURSOR_WAYPOINT, HT_RECT)) {
613 ShowBuildWaypointPicker(this);
614 }
615 break;
616
618 if (HandlePlacePushButton(this, WID_RAT_BUILD_STATION, SPR_CURSOR_RAIL_STATION, HT_RECT)) {
619 ShowStationBuilder(this);
620 this->last_user_action = widget;
621 }
622 break;
623
625 this->last_user_action = widget;
627 if (started != _ctrl_pressed) {
628 ShowSignalBuilder(this);
629 }
630 break;
631 }
632
634 HandlePlacePushButton(this, WID_RAT_BUILD_BRIDGE, SPR_CURSOR_BRIDGE, HT_RECT);
635 this->last_user_action = widget;
636 break;
637
640 this->last_user_action = widget;
641 break;
642
643 case WID_RAT_REMOVE:
645 break;
646
649 this->last_user_action = widget;
650 break;
651
652 default: NOT_REACHED();
653 }
654 this->UpdateRemoveWidgetStatus(widget);
656 }
657
658 EventState OnHotkey(int hotkey) override
659 {
660 MarkTileDirtyByTile(TileVirtXY(_thd.pos.x, _thd.pos.y)); // redraw tile selection
661 return Window::OnHotkey(hotkey);
662 }
663
664 void OnPlaceObject([[maybe_unused]] Point pt, TileIndex tile) override
665 {
666 switch (this->last_user_action) {
667 case WID_RAT_BUILD_NS:
669 break;
670
671 case WID_RAT_BUILD_X:
673 break;
674
675 case WID_RAT_BUILD_EW:
677 break;
678
679 case WID_RAT_BUILD_Y:
681 break;
682
683 case WID_RAT_AUTORAIL:
685 break;
686
687 case WID_RAT_DEMOLISH:
689 break;
690
692 Command<Commands::BuildRailDepot>::Post(STR_ERROR_CAN_T_BUILD_TRAIN_DEPOT, CcRailDepot, tile, _cur_railtype, _build_depot_direction);
693 break;
694
696 PlaceRail_Waypoint(tile);
697 break;
698
700 PlaceRail_Station(tile);
701 break;
702
705 break;
706
708 PlaceRail_Bridge(tile, this);
709 break;
710
712 Command<Commands::BuildTunnel>::Post(STR_ERROR_CAN_T_BUILD_TUNNEL_HERE, CcBuildRailTunnel, tile, TRANSPORT_RAIL, _cur_railtype);
713 break;
714
717 break;
718
719 default: NOT_REACHED();
720 }
721 }
722
723 void OnPlaceDrag(ViewportPlaceMethod select_method, [[maybe_unused]] ViewportDragDropSelectionProcess select_proc, [[maybe_unused]] Point pt) override
724 {
725 /* no dragging if you have pressed the convert button */
727
728 VpSelectTilesWithMethod(pt.x, pt.y, select_method);
729 }
730
731 Point OnInitialPosition(int16_t sm_width, [[maybe_unused]] int16_t sm_height, [[maybe_unused]] int window_number) override
732 {
733 return AlignInitialConstructionToolbar(sm_width);
734 }
735
736 void OnPlaceMouseUp([[maybe_unused]] ViewportPlaceMethod select_method, ViewportDragDropSelectionProcess select_proc, [[maybe_unused]] Point pt, TileIndex start_tile, TileIndex end_tile) override
737 {
738 if (pt.x != -1) {
739 switch (select_proc) {
740 default: NOT_REACHED();
743 ShowBuildBridgeWindow(start_tile, end_tile, TRANSPORT_RAIL, _cur_railtype);
744 break;
745
746 case DDSP_PLACE_RAIL:
747 HandleAutodirPlacement();
748 break;
749
752 break;
753
755 GUIPlaceProcDragXY(select_proc, start_tile, end_tile);
756 break;
757
759 Command<Commands::ConvertRail>::Post(STR_ERROR_CAN_T_CONVERT_RAIL, CcPlaySound_CONSTRUCTION_RAIL, end_tile, start_tile, _cur_railtype, _ctrl_pressed);
760 break;
761
765 /* Station */
767 bool keep_rail = !_ctrl_pressed;
768 Command<Commands::RemoveFromRailStation>::Post(STR_ERROR_CAN_T_REMOVE_PART_OF_STATION, CcPlaySound_CONSTRUCTION_RAIL, end_tile, start_tile, keep_rail);
769 } else {
770 HandleStationPlacement(start_tile, end_tile);
771 }
772 } else {
773 /* Waypoint */
775 bool keep_rail = !_ctrl_pressed;
776 Command<Commands::RemoveFromRailWaypoint>::Post(STR_ERROR_CAN_T_REMOVE_RAIL_WAYPOINT , CcPlaySound_CONSTRUCTION_RAIL, end_tile, start_tile, keep_rail);
777 } else {
778 TileArea ta(start_tile, end_tile);
779 Axis axis = select_method == VPM_X_LIMITED ? AXIS_X : AXIS_Y;
780 bool adjacent = _ctrl_pressed;
781
782 auto proc = [=](bool test, StationID to_join) -> bool {
783 if (test) {
784 return Command<Commands::BuildRailWaypoint>::Do(CommandFlagsToDCFlags(GetCommandFlags<Commands::BuildRailWaypoint>()), ta.tile, axis, ta.w, ta.h, _waypoint_gui.sel_class, _waypoint_gui.sel_type, StationID::Invalid(), adjacent).Succeeded();
785 } else {
786 return Command<Commands::BuildRailWaypoint>::Post(STR_ERROR_CAN_T_BUILD_RAIL_WAYPOINT , CcPlaySound_CONSTRUCTION_RAIL, ta.tile, axis, ta.w, ta.h, _waypoint_gui.sel_class, _waypoint_gui.sel_type, to_join, adjacent);
787 }
788 };
789
791 }
792 }
793 break;
794 }
795 }
796 }
797
814
820
822 {
823 /* do not toggle Remove button by Ctrl when placing station */
825 return ES_NOT_HANDLED;
826 }
827
828 void OnRealtimeTick([[maybe_unused]] uint delta_ms) override
829 {
830 if (this->IsWidgetLowered(WID_RAT_BUILD_WAYPOINT)) CheckRedrawRailWaypointCoverage(this);
831 }
832
839 {
840 if (_game_mode != GM_NORMAL) return ES_NOT_HANDLED;
841 extern RailType _last_built_railtype;
842 Window *w = ShowBuildRailToolbar(_last_built_railtype);
843 if (w == nullptr) return ES_NOT_HANDLED;
844 return w->OnHotkey(hotkey);
845 }
846
847 static inline HotkeyList hotkeys{"railtoolbar", {
848 Hotkey('1', "build_ns", WID_RAT_BUILD_NS),
849 Hotkey('2', "build_x", WID_RAT_BUILD_X),
850 Hotkey('3', "build_ew", WID_RAT_BUILD_EW),
851 Hotkey('4', "build_y", WID_RAT_BUILD_Y),
852 Hotkey({'5', 'A' | WKC_GLOBAL_HOTKEY}, "autorail", WID_RAT_AUTORAIL),
853 Hotkey('6', "demolish", WID_RAT_DEMOLISH),
854 Hotkey('7', "depot", WID_RAT_BUILD_DEPOT),
855 Hotkey('8', "waypoint", WID_RAT_BUILD_WAYPOINT),
856 Hotkey('9', "station", WID_RAT_BUILD_STATION),
857 Hotkey('S', "signal", WID_RAT_BUILD_SIGNALS),
858 Hotkey('B', "bridge", WID_RAT_BUILD_BRIDGE),
859 Hotkey('T', "tunnel", WID_RAT_BUILD_TUNNEL),
860 Hotkey('R', "remove", WID_RAT_REMOVE),
861 Hotkey('C', "convert", WID_RAT_CONVERT_RAIL),
863};
864
865static constexpr std::initializer_list<NWidgetPart> _nested_build_rail_widgets = {
867 NWidget(WWT_CLOSEBOX, COLOUR_DARK_GREEN),
868 NWidget(WWT_CAPTION, COLOUR_DARK_GREEN, WID_RAT_CAPTION), SetTextStyle(TC_WHITE),
869 NWidget(WWT_STICKYBOX, COLOUR_DARK_GREEN),
870 EndContainer(),
872 NWidget(WWT_IMGBTN, COLOUR_DARK_GREEN, WID_RAT_BUILD_NS),
873 SetFill(0, 1), SetToolbarMinimalSize(1), SetSpriteTip(SPR_IMG_RAIL_NS, STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_TRACK),
874 NWidget(WWT_IMGBTN, COLOUR_DARK_GREEN, WID_RAT_BUILD_X),
875 SetFill(0, 1), SetToolbarMinimalSize(1), SetSpriteTip(SPR_IMG_RAIL_NE, STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_TRACK),
876 NWidget(WWT_IMGBTN, COLOUR_DARK_GREEN, WID_RAT_BUILD_EW),
877 SetFill(0, 1), SetToolbarMinimalSize(1), SetSpriteTip(SPR_IMG_RAIL_EW, STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_TRACK),
878 NWidget(WWT_IMGBTN, COLOUR_DARK_GREEN, WID_RAT_BUILD_Y),
879 SetFill(0, 1), SetToolbarMinimalSize(1), SetSpriteTip(SPR_IMG_RAIL_NW, STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_TRACK),
880 NWidget(WWT_IMGBTN, COLOUR_DARK_GREEN, WID_RAT_AUTORAIL),
881 SetFill(0, 1), SetToolbarMinimalSize(1), SetSpriteTip(SPR_IMG_AUTORAIL, STR_RAIL_TOOLBAR_TOOLTIP_BUILD_AUTORAIL),
882
884
885 NWidget(WWT_IMGBTN, COLOUR_DARK_GREEN, WID_RAT_DEMOLISH),
886 SetFill(0, 1), SetToolbarMinimalSize(1), SetSpriteTip(SPR_IMG_DYNAMITE, STR_TOOLTIP_DEMOLISH_BUILDINGS_ETC),
887 NWidget(WWT_IMGBTN, COLOUR_DARK_GREEN, WID_RAT_BUILD_DEPOT),
888 SetFill(0, 1), SetToolbarMinimalSize(1), SetSpriteTip(SPR_IMG_DEPOT_RAIL, STR_RAIL_TOOLBAR_TOOLTIP_BUILD_TRAIN_DEPOT_FOR_BUILDING),
889 NWidget(WWT_IMGBTN, COLOUR_DARK_GREEN, WID_RAT_BUILD_WAYPOINT),
890 SetFill(0, 1), SetToolbarMinimalSize(1), SetSpriteTip(SPR_IMG_WAYPOINT, STR_RAIL_TOOLBAR_TOOLTIP_CONVERT_RAIL_TO_WAYPOINT),
891 NWidget(WWT_IMGBTN, COLOUR_DARK_GREEN, WID_RAT_BUILD_STATION),
892 SetFill(0, 1), SetToolbarMinimalSize(2), SetSpriteTip(SPR_IMG_RAIL_STATION, STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_STATION),
893 NWidget(WWT_IMGBTN, COLOUR_DARK_GREEN, WID_RAT_BUILD_SIGNALS),
894 SetFill(0, 1), SetToolbarMinimalSize(1), SetSpriteTip(SPR_IMG_RAIL_SIGNALS, STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_SIGNALS),
895 NWidget(WWT_IMGBTN, COLOUR_DARK_GREEN, WID_RAT_BUILD_BRIDGE),
896 SetFill(0, 1), SetToolbarMinimalSize(2), SetSpriteTip(SPR_IMG_BRIDGE, STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_BRIDGE),
897 NWidget(WWT_IMGBTN, COLOUR_DARK_GREEN, WID_RAT_BUILD_TUNNEL),
898 SetFill(0, 1), SetToolbarMinimalSize(1), SetSpriteTip(SPR_IMG_TUNNEL_RAIL, STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_TUNNEL),
899 NWidget(WWT_IMGBTN, COLOUR_DARK_GREEN, WID_RAT_REMOVE),
900 SetFill(0, 1), SetToolbarMinimalSize(1), SetSpriteTip(SPR_IMG_REMOVE, STR_RAIL_TOOLBAR_TOOLTIP_TOGGLE_BUILD_REMOVE_FOR),
901 NWidget(WWT_IMGBTN, COLOUR_DARK_GREEN, WID_RAT_CONVERT_RAIL),
902 SetFill(0, 1), SetToolbarMinimalSize(1), SetSpriteTip(SPR_IMG_CONVERT_RAIL, STR_RAIL_TOOLBAR_TOOLTIP_CONVERT_RAIL),
903 EndContainer(),
904};
905
906static WindowDesc _build_rail_desc(
907 WDP_MANUAL, "toolbar_rail", 0, 0,
910 _nested_build_rail_widgets,
911 &BuildRailToolbarWindow::hotkeys
912);
913
914
924{
925 if (!Company::IsValidID(_local_company)) return nullptr;
926 if (!ValParamRailType(railtype)) return nullptr;
927
929 _cur_railtype = railtype;
931 return new BuildRailToolbarWindow(_build_rail_desc, railtype);
932}
933
934/* TODO: For custom stations, respect their allowed platforms/lengths bitmasks!
935 * --pasky */
936
937static void HandleStationPlacement(TileIndex start, TileIndex end)
938{
939 TileArea ta(start, end);
940 uint numtracks = ta.w;
941 uint platlength = ta.h;
942
943 if (_station_gui.axis == AXIS_X) std::swap(numtracks, platlength);
944
947 bool adjacent = _ctrl_pressed;
948
949 auto proc = [=](bool test, StationID to_join) -> bool {
950 if (test) {
951 return Command<Commands::BuildRailStation>::Do(CommandFlagsToDCFlags(GetCommandFlags<Commands::BuildRailStation>()), ta.tile, rt, params.axis, numtracks, platlength, params.sel_class, params.sel_type, StationID::Invalid(), adjacent).Succeeded();
952 } else {
953 return Command<Commands::BuildRailStation>::Post(STR_ERROR_CAN_T_BUILD_RAILROAD_STATION, CcStation, ta.tile, rt, params.axis, numtracks, platlength, params.sel_class, params.sel_type, to_join, adjacent);
954 }
955 };
956
958}
959
965static bool StationUsesDefaultType(const BaseStation *bst)
966{
967 for (TileIndex t : bst->train_station) {
968 if (bst->TileBelongsToRailStation(t) && HasStationRail(t) && GetCustomStationSpecIndex(t) == 0) return true;
969 }
970 return false;
971}
972
974public:
976
977 GrfSpecFeature GetFeature() const override { return GSF_STATIONS; }
978
979 StringID GetClassTooltip() const override { return STR_PICKER_STATION_CLASS_TOOLTIP; }
980 StringID GetTypeTooltip() const override { return STR_PICKER_STATION_TYPE_TOOLTIP; }
981 StringID GetCollectionTooltip() const override { return STR_PICKER_STATION_COLLECTION_TOOLTIP; }
982
983 bool IsActive() const override
984 {
985 for (const auto &cls : StationClass::Classes()) {
986 if (IsWaypointClass(cls)) continue;
987 for (const auto *spec : cls.Specs()) {
988 if (spec != nullptr) return true;
989 }
990 }
991 return false;
992 }
993
994 bool HasClassChoice() const override
995 {
996 return std::ranges::count_if(StationClass::Classes(), std::not_fn(IsWaypointClass)) > 1;
997 }
998
999 int GetSelectedClass() const override { return _station_gui.sel_class; }
1000 void SetSelectedClass(int id) const override { _station_gui.sel_class = this->GetClassIndex(id); }
1001
1002 StringID GetClassName(int id) const override
1003 {
1004 const auto *sc = GetClass(id);
1005 if (IsWaypointClass(*sc)) return INVALID_STRING_ID;
1006 return sc->name;
1007 }
1008
1009 int GetSelectedType() const override { return _station_gui.sel_type; }
1010 void SetSelectedType(int id) const override { _station_gui.sel_type = id; }
1011
1012 StringID GetTypeName(int cls_id, int id) const override
1013 {
1014 const auto *spec = this->GetSpec(cls_id, id);
1015 return (spec == nullptr) ? STR_STATION_CLASS_DFLT_STATION : spec->name;
1016 }
1017
1018 std::span<const BadgeID> GetTypeBadges(int cls_id, int id) const override
1019 {
1020 const auto *spec = this->GetSpec(cls_id, id);
1021 if (spec == nullptr) return {};
1022 return spec->badges;
1023 }
1024
1025 bool IsTypeAvailable(int cls_id, int id) const override
1026 {
1027 return IsStationAvailable(this->GetSpec(cls_id, id));
1028 }
1029
1030 void DrawType(int x, int y, int cls_id, int id) const override
1031 {
1032 if (!DrawStationTile(x, y, _cur_railtype, _station_gui.axis, this->GetClassIndex(cls_id), id)) {
1033 StationPickerDrawSprite(x, y, StationType::Rail, _cur_railtype, INVALID_ROADTYPE, 2 + _station_gui.axis);
1034 }
1035 }
1036
1037 void FillUsedItems(std::set<PickerItem> &items) override
1038 {
1039 bool default_added = false;
1040 for (const Station *st : Station::Iterate()) {
1041 if (st->owner != _local_company) continue;
1042 if (!default_added && StationUsesDefaultType(st)) {
1043 items.insert({0, 0, STAT_CLASS_DFLT, 0});
1044 default_added = true;
1045 }
1046 for (const auto &sm : st->speclist) {
1047 if (sm.spec == nullptr) continue;
1048 items.insert({sm.grfid, sm.localidx, sm.spec->class_index, sm.spec->index});
1049 }
1050 }
1051 }
1052
1053 static StationPickerCallbacks instance;
1054};
1055/* static */ StationPickerCallbacks StationPickerCallbacks::instance;
1056
1058private:
1060
1066 void CheckSelectedSize(const StationSpec *statspec)
1067 {
1068 if (statspec == nullptr || _settings_client.gui.station_dragdrop) return;
1069
1070 /* If current number of tracks is not allowed, make it as big as possible */
1074 if (statspec->disallowed_platforms != UINT8_MAX) {
1077 }
1079 }
1080 }
1081
1085 if (statspec->disallowed_lengths != UINT8_MAX) {
1088 }
1090 }
1091 }
1092 }
1093
1094public:
1096 {
1098 this->ConstructWindow();
1099 }
1100
1115
1116 void Close([[maybe_unused]] int data = 0) override
1117 {
1119 this->PickerWindow::Close();
1120 }
1121
1122 void OnInvalidateData([[maybe_unused]] int data = 0, [[maybe_unused]] bool gui_scope = true) override
1123 {
1124 if (gui_scope) {
1126 this->CheckSelectedSize(statspec);
1127 }
1128
1129 this->PickerWindow::OnInvalidateData(data, gui_scope);
1130 }
1131
1132 void OnPaint() override
1133 {
1135
1137 SetTileSelectSize(1, 1);
1138 } else {
1141 if (_station_gui.axis == AXIS_X) std::swap(x, y);
1143 SetTileSelectSize(x, y);
1144 }
1145 }
1146
1148
1149 if (_settings_client.gui.station_show_coverage) SetTileSelectBigSize(-rad, -rad, 2 * rad, 2 * rad);
1150
1151 for (uint bits = 0; bits < 7; bits++) {
1152 bool disable = bits >= _settings_game.station.station_spread;
1153 if (statspec == nullptr) {
1154 this->SetWidgetDisabledState(bits + WID_BRAS_PLATFORM_NUM_1, disable);
1155 this->SetWidgetDisabledState(bits + WID_BRAS_PLATFORM_LEN_1, disable);
1156 } else {
1157 this->SetWidgetDisabledState(bits + WID_BRAS_PLATFORM_NUM_1, HasBit(statspec->disallowed_platforms, bits) || disable);
1158 this->SetWidgetDisabledState(bits + WID_BRAS_PLATFORM_LEN_1, HasBit(statspec->disallowed_lengths, bits) || disable);
1159 }
1160 }
1161
1162 this->DrawWidgets();
1163
1164 if (this->IsShaded()) return;
1165 /* 'Accepts' and 'Supplies' texts. */
1166 Rect r = this->GetWidget<NWidgetBase>(WID_BRAS_COVERAGE_TEXTS)->GetCurrentRect();
1167 const int bottom = r.bottom;
1168 r.bottom = INT_MAX; // Allow overflow as we want to know the required height.
1169 if (statspec != nullptr) r.top = DrawBadgeNameList(r, statspec->badges, GSF_STATIONS);
1171 r.top = DrawStationCoverageAreaText(r, SCT_ALL, rad, true);
1172 /* Resize background if the window is too small.
1173 * Never make the window smaller to avoid oscillating if the size change affects the acceptance.
1174 * (This is the case, if making the window bigger moves the mouse into the window.) */
1175 if (r.top > bottom) {
1176 this->coverage_height += r.top - bottom;
1177 this->ReInit();
1178 }
1179 }
1180
1181 void UpdateWidgetSize(WidgetID widget, Dimension &size, [[maybe_unused]] const Dimension &padding, [[maybe_unused]] Dimension &fill, [[maybe_unused]] Dimension &resize) override
1182 {
1183 switch (widget) {
1188 break;
1189
1191 size.height = this->coverage_height;
1192 break;
1193
1194 default:
1195 this->PickerWindow::UpdateWidgetSize(widget, size, padding, fill, resize);
1196 break;
1197 }
1198 }
1199
1200 void DrawWidget(const Rect &r, WidgetID widget) const override
1201 {
1202 DrawPixelInfo tmp_dpi;
1203
1204 switch (widget) {
1206 /* Set up a clipping area for the '/' station preview */
1207 Rect ir = r.Shrink(WidgetDimensions::scaled.bevel);
1208 if (FillDrawPixelInfo(&tmp_dpi, ir)) {
1209 AutoRestoreBackup dpi_backup(_cur_dpi, &tmp_dpi);
1213 StationPickerDrawSprite(x, y, StationType::Rail, _cur_railtype, INVALID_ROADTYPE, 2);
1214 }
1215 }
1216 break;
1217 }
1218
1220 /* Set up a clipping area for the '\' station preview */
1221 Rect ir = r.Shrink(WidgetDimensions::scaled.bevel);
1222 if (FillDrawPixelInfo(&tmp_dpi, ir)) {
1223 AutoRestoreBackup dpi_backup(_cur_dpi, &tmp_dpi);
1227 StationPickerDrawSprite(x, y, StationType::Rail, _cur_railtype, INVALID_ROADTYPE, 3);
1228 }
1229 }
1230 break;
1231 }
1232
1233 default:
1234 this->PickerWindow::DrawWidget(r, widget);
1235 break;
1236 }
1237 }
1238
1239 void OnClick([[maybe_unused]] Point pt, WidgetID widget, [[maybe_unused]] int click_count) override
1240 {
1241 switch (widget) {
1244 this->RaiseWidget(WID_BRAS_PLATFORM_DIR_X + _station_gui.axis);
1246 this->LowerWidget(WID_BRAS_PLATFORM_DIR_X + _station_gui.axis);
1247 SndClickBeep();
1248 this->SetDirty();
1250 break;
1251
1261
1264
1266 if (statspec != nullptr && HasBit(statspec->disallowed_lengths, _settings_client.gui.station_platlength - 1)) {
1267 /* The previously selected number of platforms in invalid */
1268 for (uint i = 0; i < 7; i++) {
1269 if (!HasBit(statspec->disallowed_lengths, i)) {
1272 break;
1273 }
1274 }
1275 }
1276
1277 this->LowerWidget(_settings_client.gui.station_numtracks + WID_BRAS_PLATFORM_NUM_BEGIN);
1279 SndClickBeep();
1280 this->SetDirty();
1282 break;
1283 }
1284
1294
1297
1299 if (statspec != nullptr && HasBit(statspec->disallowed_platforms, _settings_client.gui.station_numtracks - 1)) {
1300 /* The previously selected number of tracks in invalid */
1301 for (uint i = 0; i < 7; i++) {
1302 if (!HasBit(statspec->disallowed_platforms, i)) {
1305 break;
1306 }
1307 }
1308 }
1309
1311 this->LowerWidget(_settings_client.gui.station_platlength + WID_BRAS_PLATFORM_LEN_BEGIN);
1312 SndClickBeep();
1313 this->SetDirty();
1315 break;
1316 }
1317
1320
1322
1323 /* get the first allowed length/number of platforms */
1325 if (statspec != nullptr && HasBit(statspec->disallowed_lengths, _settings_client.gui.station_platlength - 1)) {
1326 for (uint i = 0; i < 7; i++) {
1327 if (!HasBit(statspec->disallowed_lengths, i)) {
1330 break;
1331 }
1332 }
1333 }
1334 if (statspec != nullptr && HasBit(statspec->disallowed_platforms, _settings_client.gui.station_numtracks - 1)) {
1335 for (uint i = 0; i < 7; i++) {
1336 if (!HasBit(statspec->disallowed_platforms, i)) {
1339 break;
1340 }
1341 }
1342 }
1343
1346 SndClickBeep();
1347 this->SetDirty();
1349 break;
1350 }
1351
1355
1358 SndClickBeep();
1359 this->SetDirty();
1360 SetViewportCatchmentStation(nullptr, true);
1361 break;
1362
1363 default:
1364 this->PickerWindow::OnClick(pt, widget, click_count);
1365 break;
1366 }
1367 }
1368
1369 void OnRealtimeTick([[maybe_unused]] uint delta_ms) override
1370 {
1372 }
1373
1380 {
1381 if (_game_mode == GM_MENU) return ES_NOT_HANDLED;
1383 if (w == nullptr) return ES_NOT_HANDLED;
1384 return w->OnHotkey(hotkey);
1385 }
1386
1387 static inline HotkeyList hotkeys{"buildrailstation", {
1388 Hotkey('F', "focus_filter_box", PCWHK_FOCUS_FILTER_BOX),
1390};
1391
1392static constexpr std::initializer_list<NWidgetPart> _nested_station_builder_widgets = {
1394 NWidget(WWT_CLOSEBOX, COLOUR_DARK_GREEN),
1395 NWidget(WWT_CAPTION, COLOUR_DARK_GREEN), SetStringTip(STR_STATION_BUILD_RAIL_CAPTION, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS),
1396 NWidget(WWT_SHADEBOX, COLOUR_DARK_GREEN),
1397 NWidget(WWT_DEFSIZEBOX, COLOUR_DARK_GREEN),
1398 EndContainer(),
1402 NWidget(WWT_PANEL, COLOUR_DARK_GREEN),
1404 NWidget(WWT_LABEL, INVALID_COLOUR), SetMinimalSize(144, 11), SetFill(1, 0), SetStringTip(STR_STATION_BUILD_ORIENTATION),
1406 NWidget(WWT_PANEL, COLOUR_GREY, WID_BRAS_PLATFORM_DIR_X), SetFill(0, 0), SetToolTip(STR_STATION_BUILD_RAILROAD_ORIENTATION_TOOLTIP), EndContainer(),
1407 NWidget(WWT_PANEL, COLOUR_GREY, WID_BRAS_PLATFORM_DIR_Y), SetFill(0, 0), SetToolTip(STR_STATION_BUILD_RAILROAD_ORIENTATION_TOOLTIP), EndContainer(),
1408 EndContainer(),
1409 NWidget(WWT_LABEL, INVALID_COLOUR), SetMinimalSize(144, 11), SetFill(1, 0), SetStringTip(STR_STATION_BUILD_NUMBER_OF_TRACKS),
1411 NWidget(WWT_TEXTBTN, COLOUR_GREY, WID_BRAS_PLATFORM_NUM_1), SetAspect(1.25f), SetStringTip(STR_BLACK_1, STR_STATION_BUILD_NUMBER_OF_TRACKS_TOOLTIP),
1412 NWidget(WWT_TEXTBTN, COLOUR_GREY, WID_BRAS_PLATFORM_NUM_2), SetAspect(1.25f), SetStringTip(STR_BLACK_2, STR_STATION_BUILD_NUMBER_OF_TRACKS_TOOLTIP),
1413 NWidget(WWT_TEXTBTN, COLOUR_GREY, WID_BRAS_PLATFORM_NUM_3), SetAspect(1.25f), SetStringTip(STR_BLACK_3, STR_STATION_BUILD_NUMBER_OF_TRACKS_TOOLTIP),
1414 NWidget(WWT_TEXTBTN, COLOUR_GREY, WID_BRAS_PLATFORM_NUM_4), SetAspect(1.25f), SetStringTip(STR_BLACK_4, STR_STATION_BUILD_NUMBER_OF_TRACKS_TOOLTIP),
1415 NWidget(WWT_TEXTBTN, COLOUR_GREY, WID_BRAS_PLATFORM_NUM_5), SetAspect(1.25f), SetStringTip(STR_BLACK_5, STR_STATION_BUILD_NUMBER_OF_TRACKS_TOOLTIP),
1416 NWidget(WWT_TEXTBTN, COLOUR_GREY, WID_BRAS_PLATFORM_NUM_6), SetAspect(1.25f), SetStringTip(STR_BLACK_6, STR_STATION_BUILD_NUMBER_OF_TRACKS_TOOLTIP),
1417 NWidget(WWT_TEXTBTN, COLOUR_GREY, WID_BRAS_PLATFORM_NUM_7), SetAspect(1.25f), SetStringTip(STR_BLACK_7, STR_STATION_BUILD_NUMBER_OF_TRACKS_TOOLTIP),
1418 EndContainer(),
1419 NWidget(WWT_LABEL, INVALID_COLOUR), SetMinimalSize(144, 11), SetFill(1, 0), SetStringTip(STR_STATION_BUILD_PLATFORM_LENGTH),
1421 NWidget(WWT_TEXTBTN, COLOUR_GREY, WID_BRAS_PLATFORM_LEN_1), SetAspect(1.25f), SetStringTip(STR_BLACK_1, STR_STATION_BUILD_PLATFORM_LENGTH_TOOLTIP),
1422 NWidget(WWT_TEXTBTN, COLOUR_GREY, WID_BRAS_PLATFORM_LEN_2), SetAspect(1.25f), SetStringTip(STR_BLACK_2, STR_STATION_BUILD_PLATFORM_LENGTH_TOOLTIP),
1423 NWidget(WWT_TEXTBTN, COLOUR_GREY, WID_BRAS_PLATFORM_LEN_3), SetAspect(1.25f), SetStringTip(STR_BLACK_3, STR_STATION_BUILD_PLATFORM_LENGTH_TOOLTIP),
1424 NWidget(WWT_TEXTBTN, COLOUR_GREY, WID_BRAS_PLATFORM_LEN_4), SetAspect(1.25f), SetStringTip(STR_BLACK_4, STR_STATION_BUILD_PLATFORM_LENGTH_TOOLTIP),
1425 NWidget(WWT_TEXTBTN, COLOUR_GREY, WID_BRAS_PLATFORM_LEN_5), SetAspect(1.25f), SetStringTip(STR_BLACK_5, STR_STATION_BUILD_PLATFORM_LENGTH_TOOLTIP),
1426 NWidget(WWT_TEXTBTN, COLOUR_GREY, WID_BRAS_PLATFORM_LEN_6), SetAspect(1.25f), SetStringTip(STR_BLACK_6, STR_STATION_BUILD_PLATFORM_LENGTH_TOOLTIP),
1427 NWidget(WWT_TEXTBTN, COLOUR_GREY, WID_BRAS_PLATFORM_LEN_7), SetAspect(1.25f), SetStringTip(STR_BLACK_7, STR_STATION_BUILD_PLATFORM_LENGTH_TOOLTIP),
1428 EndContainer(),
1430 NWidget(WWT_TEXTBTN, COLOUR_GREY, WID_BRAS_PLATFORM_DRAG_N_DROP), SetMinimalSize(75, 12), SetStringTip(STR_STATION_BUILD_DRAG_DROP, STR_STATION_BUILD_DRAG_DROP_TOOLTIP),
1431 EndContainer(),
1432 NWidget(WWT_LABEL, INVALID_COLOUR), SetStringTip(STR_STATION_BUILD_COVERAGE_AREA_TITLE), SetFill(1, 0),
1434 NWidget(WWT_TEXTBTN, COLOUR_GREY, WID_BRAS_HIGHLIGHT_OFF), SetMinimalSize(60, 12), SetStringTip(STR_STATION_BUILD_COVERAGE_OFF, STR_STATION_BUILD_COVERAGE_AREA_OFF_TOOLTIP),
1435 NWidget(WWT_TEXTBTN, COLOUR_GREY, WID_BRAS_HIGHLIGHT_ON), SetMinimalSize(60, 12), SetStringTip(STR_STATION_BUILD_COVERAGE_ON, STR_STATION_BUILD_COVERAGE_AREA_ON_TOOLTIP),
1436 EndContainer(),
1437 NWidget(WWT_EMPTY, INVALID_COLOUR, WID_BRAS_COVERAGE_TEXTS), SetFill(1, 1), SetResize(1, 0), SetMinimalTextLines(2, 0),
1438 EndContainer(),
1439 EndContainer(),
1440 EndContainer(),
1442 EndContainer(),
1443};
1444
1447 WDP_AUTO, "build_station_rail", 0, 0,
1450 _nested_station_builder_widgets,
1451 &BuildRailStationWindow::hotkeys
1452);
1453
1456{
1458}
1459
1461private:
1464
1469 void DrawSignalSprite(const Rect &r, SpriteID image) const
1470 {
1471 Point offset;
1472 Dimension sprite_size = GetSpriteSize(image, &offset);
1473 Rect ir = r.Shrink(WidgetDimensions::scaled.imgbtn);
1474 int x = CentreBounds(ir.left, ir.right, sprite_size.width - offset.x) - offset.x; // centered
1475 int y = ir.top - sig_sprite_bottom_offset +
1476 (ir.Height() + sig_sprite_size.height) / 2; // aligned to bottom
1477
1478 DrawSprite(image, PAL_NONE, x, y);
1479 }
1480
1483 {
1484 bool show_non_path_signals = (_settings_client.gui.signal_gui_mode == SIGNAL_GUI_ALL);
1485
1486 this->GetWidget<NWidgetStacked>(WID_BS_BLOCK_SEL)->SetDisplayedPlane(show_non_path_signals ? 0 : SZSP_NONE);
1487 this->GetWidget<NWidgetStacked>(WID_BS_BLOCK_SPACER_SEL)->SetDisplayedPlane(show_non_path_signals ? 0 : SZSP_NONE);
1488 }
1489
1490public:
1492 {
1493 this->CreateNestedTree();
1494 this->SetSignalUIMode();
1496 this->OnInvalidateData();
1497 }
1498
1499 void Close([[maybe_unused]] int data = 0) override
1500 {
1501 _convert_signal_button = false;
1503 }
1504
1505 void OnInit() override
1506 {
1507 /* Calculate maximum signal sprite size. */
1508 this->sig_sprite_size.width = 0;
1509 this->sig_sprite_size.height = 0;
1510 this->sig_sprite_bottom_offset = 0;
1512 for (uint type = SIGTYPE_BLOCK; type < SIGTYPE_END; type++) {
1513 for (uint variant = SIG_ELECTRIC; variant <= SIG_SEMAPHORE; variant++) {
1514 for (uint lowered = 0; lowered < 2; lowered++) {
1515 Point offset;
1516 Dimension sprite_size = GetSpriteSize(rti->gui_sprites.signals[type][variant][lowered], &offset);
1517 this->sig_sprite_bottom_offset = std::max<int>(this->sig_sprite_bottom_offset, sprite_size.height);
1518 this->sig_sprite_size.width = std::max<int>(this->sig_sprite_size.width, sprite_size.width - offset.x);
1519 this->sig_sprite_size.height = std::max<int>(this->sig_sprite_size.height, sprite_size.height - offset.y);
1520 }
1521 }
1522 }
1523 }
1524
1525 void UpdateWidgetSize(WidgetID widget, Dimension &size, [[maybe_unused]] const Dimension &padding, [[maybe_unused]] Dimension &fill, [[maybe_unused]] Dimension &resize) override
1526 {
1527 if (widget == WID_BS_DRAG_SIGNALS_DENSITY_LABEL) {
1528 /* Two digits for signals density. */
1529 size.width = std::max(size.width, 2 * GetDigitWidth() + padding.width + WidgetDimensions::scaled.framerect.Horizontal());
1531 size.width = std::max(size.width, this->sig_sprite_size.width + padding.width);
1532 size.height = std::max(size.height, this->sig_sprite_size.height + padding.height);
1533 }
1534 }
1535
1536 std::string GetWidgetString(WidgetID widget, StringID stringid) const override
1537 {
1538 switch (widget) {
1540 return GetString(STR_JUST_INT, _settings_client.gui.drag_signals_density);
1541
1542 default:
1543 return this->Window::GetWidgetString(widget, stringid);
1544 }
1545 }
1546
1547 void DrawWidget(const Rect &r, WidgetID widget) const override
1548 {
1550 /* Extract signal from widget number. */
1551 int type = (widget - WID_BS_SEMAPHORE_NORM) % SIGTYPE_END;
1552 int var = SIG_SEMAPHORE - (widget - WID_BS_SEMAPHORE_NORM) / SIGTYPE_END; // SignalVariant order is reversed compared to the widgets.
1553 SpriteID sprite = GetRailTypeInfo(_cur_railtype)->gui_sprites.signals[type][var][this->IsWidgetLowered(widget)];
1554
1555 this->DrawSignalSprite(r, sprite);
1556 }
1557 }
1558
1559 void OnClick([[maybe_unused]] Point pt, WidgetID widget, [[maybe_unused]] int click_count) override
1560 {
1561 switch (widget) {
1575
1576 _cur_signal_type = (SignalType)((uint)((widget - WID_BS_SEMAPHORE_NORM) % (SIGTYPE_LAST + 1)));
1578
1579 /* Update default (last-used) signal type in config file. */
1581
1582 /* If 'remove' button of rail build toolbar is active, disable it. */
1585 if (w != nullptr) ToggleRailButton_Remove(w);
1586 }
1587
1588 SndClickBeep();
1589 break;
1590
1591 case WID_BS_CONVERT:
1593 SndClickBeep();
1594 break;
1595
1600 }
1601 break;
1602
1607 }
1608 break;
1609
1610 default: break;
1611 }
1612
1613 this->InvalidateData();
1614 }
1615
1631};
1632
1634static constexpr std::initializer_list<NWidgetPart> _nested_signal_builder_widgets = {
1635 /* Title bar and buttons. */
1637 NWidget(WWT_CLOSEBOX, COLOUR_DARK_GREEN),
1638 NWidget(WWT_CAPTION, COLOUR_DARK_GREEN, WID_BS_CAPTION), SetStringTip(STR_BUILD_SIGNAL_CAPTION, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS),
1639 EndContainer(),
1640
1641 /* Container for both signal groups, spacers, and convert/autofill buttons. */
1643 /* Block signals (can be hidden). */
1644 NWidget(NWID_SELECTION, INVALID_COLOUR, WID_BS_BLOCK_SEL),
1646 /* Semaphore block signals. */
1648 NWidget(WWT_PANEL, COLOUR_DARK_GREEN, WID_BS_SEMAPHORE_NORM), SetToolTip(STR_BUILD_SIGNAL_SEMAPHORE_NORM_TOOLTIP), SetToolbarMinimalSize(1), EndContainer(),
1649 NWidget(WWT_PANEL, COLOUR_DARK_GREEN, WID_BS_SEMAPHORE_ENTRY), SetToolTip(STR_BUILD_SIGNAL_SEMAPHORE_ENTRY_TOOLTIP), SetToolbarMinimalSize(1), EndContainer(),
1650 NWidget(WWT_PANEL, COLOUR_DARK_GREEN, WID_BS_SEMAPHORE_EXIT), SetToolTip(STR_BUILD_SIGNAL_SEMAPHORE_EXIT_TOOLTIP), SetToolbarMinimalSize(1), EndContainer(),
1651 NWidget(WWT_PANEL, COLOUR_DARK_GREEN, WID_BS_SEMAPHORE_COMBO), SetToolTip(STR_BUILD_SIGNAL_SEMAPHORE_COMBO_TOOLTIP), SetToolbarMinimalSize(1), EndContainer(),
1652 EndContainer(),
1653 /* Electric block signals. */
1655 NWidget(WWT_PANEL, COLOUR_DARK_GREEN, WID_BS_ELECTRIC_NORM), SetToolTip(STR_BUILD_SIGNAL_ELECTRIC_NORM_TOOLTIP), SetToolbarMinimalSize(1), EndContainer(),
1656 NWidget(WWT_PANEL, COLOUR_DARK_GREEN, WID_BS_ELECTRIC_ENTRY), SetToolTip(STR_BUILD_SIGNAL_ELECTRIC_ENTRY_TOOLTIP), SetToolbarMinimalSize(1), EndContainer(),
1657 NWidget(WWT_PANEL, COLOUR_DARK_GREEN, WID_BS_ELECTRIC_EXIT), SetToolTip(STR_BUILD_SIGNAL_ELECTRIC_EXIT_TOOLTIP), SetToolbarMinimalSize(1), EndContainer(),
1658 NWidget(WWT_PANEL, COLOUR_DARK_GREEN, WID_BS_ELECTRIC_COMBO), SetToolTip(STR_BUILD_SIGNAL_ELECTRIC_COMBO_TOOLTIP), SetToolbarMinimalSize(1), EndContainer(),
1659 EndContainer(),
1660 EndContainer(),
1661 EndContainer(),
1662
1663 /* Divider (only shown if block signals visible). */
1665 NWidget(WWT_PANEL, COLOUR_DARK_GREEN), SetFill(0, 0), SetToolbarSpacerMinimalSize(), EndContainer(),
1666 EndContainer(),
1667
1668 /* Path signals. */
1670 /* Semaphore path signals. */
1672 NWidget(WWT_PANEL, COLOUR_DARK_GREEN, WID_BS_SEMAPHORE_PBS), SetToolTip(STR_BUILD_SIGNAL_SEMAPHORE_PBS_TOOLTIP), SetToolbarMinimalSize(1), EndContainer(),
1673 NWidget(WWT_PANEL, COLOUR_DARK_GREEN, WID_BS_SEMAPHORE_PBS_OWAY), SetToolTip(STR_BUILD_SIGNAL_SEMAPHORE_PBS_OWAY_TOOLTIP), SetToolbarMinimalSize(1), EndContainer(),
1674 EndContainer(),
1675 /* Electric path signals. */
1677 NWidget(WWT_PANEL, COLOUR_DARK_GREEN, WID_BS_ELECTRIC_PBS), SetToolTip(STR_BUILD_SIGNAL_ELECTRIC_PBS_TOOLTIP), SetToolbarMinimalSize(1), EndContainer(),
1678 NWidget(WWT_PANEL, COLOUR_DARK_GREEN, WID_BS_ELECTRIC_PBS_OWAY), SetToolTip(STR_BUILD_SIGNAL_ELECTRIC_PBS_OWAY_TOOLTIP), SetToolbarMinimalSize(1), EndContainer(),
1679 EndContainer(),
1680 EndContainer(),
1681
1682 /* Convert/autofill buttons. */
1684 NWidget(WWT_IMGBTN, COLOUR_DARK_GREEN, WID_BS_CONVERT), SetSpriteTip(SPR_IMG_SIGNAL_CONVERT, STR_BUILD_SIGNAL_CONVERT_TOOLTIP), SetFill(0, 1),
1685 NWidget(WWT_PANEL, COLOUR_DARK_GREEN), SetToolTip(STR_BUILD_SIGNAL_DRAG_SIGNALS_DENSITY_TOOLTIP), SetFill(0, 1),
1687 NWidget(WWT_LABEL, INVALID_COLOUR, WID_BS_DRAG_SIGNALS_DENSITY_LABEL), SetToolTip(STR_BUILD_SIGNAL_DRAG_SIGNALS_DENSITY_TOOLTIP), SetTextStyle(TC_ORANGE), SetFill(1, 1),
1689 NWidget(WWT_PUSHARROWBTN, COLOUR_GREY, WID_BS_DRAG_SIGNALS_DENSITY_DECREASE), SetMinimalSize(9, 12), SetArrowWidgetTypeTip(AWV_DECREASE, STR_BUILD_SIGNAL_DRAG_SIGNALS_DENSITY_DECREASE_TOOLTIP),
1690 NWidget(WWT_PUSHARROWBTN, COLOUR_GREY, WID_BS_DRAG_SIGNALS_DENSITY_INCREASE), SetMinimalSize(9, 12), SetArrowWidgetTypeTip(AWV_INCREASE, STR_BUILD_SIGNAL_DRAG_SIGNALS_DENSITY_INCREASE_TOOLTIP),
1691 EndContainer(),
1692 EndContainer(),
1693 EndContainer(),
1694 EndContainer(),
1695 EndContainer(),
1696};
1697
1700 WDP_AUTO, {}, 0, 0,
1704);
1705
1709static void ShowSignalBuilder(Window *parent)
1710{
1712}
1713
1716 {
1719 }
1720
1721 void UpdateWidgetSize(WidgetID widget, Dimension &size, [[maybe_unused]] const Dimension &padding, [[maybe_unused]] Dimension &fill, [[maybe_unused]] Dimension &resize) override
1722 {
1723 if (!IsInsideMM(widget, WID_BRAD_DEPOT_NE, WID_BRAD_DEPOT_NW + 1)) return;
1724
1727 }
1728
1729 void DrawWidget(const Rect &r, WidgetID widget) const override
1730 {
1731 if (!IsInsideMM(widget, WID_BRAD_DEPOT_NE, WID_BRAD_DEPOT_NW + 1)) return;
1732
1733 DrawPixelInfo tmp_dpi;
1734 Rect ir = r.Shrink(WidgetDimensions::scaled.bevel);
1735 if (FillDrawPixelInfo(&tmp_dpi, ir)) {
1736 AutoRestoreBackup dpi_backup(_cur_dpi, &tmp_dpi);
1737 int x = (ir.Width() - ScaleSpriteTrad(64)) / 2 + ScaleSpriteTrad(31);
1738 int y = (ir.Height() + ScaleSpriteTrad(48)) / 2 - ScaleSpriteTrad(31);
1739 DrawTrainDepotSprite(x, y, widget - WID_BRAD_DEPOT_NE + DIAGDIR_NE, _cur_railtype);
1740 }
1741 }
1742
1743 void OnClick([[maybe_unused]] Point pt, WidgetID widget, [[maybe_unused]] int click_count) override
1744 {
1745 switch (widget) {
1746 case WID_BRAD_DEPOT_NE:
1747 case WID_BRAD_DEPOT_SE:
1748 case WID_BRAD_DEPOT_SW:
1749 case WID_BRAD_DEPOT_NW:
1753 SndClickBeep();
1754 this->SetDirty();
1755 break;
1756 }
1757 }
1758};
1759
1761static constexpr std::initializer_list<NWidgetPart> _nested_build_depot_widgets = {
1763 NWidget(WWT_CLOSEBOX, COLOUR_DARK_GREEN),
1764 NWidget(WWT_CAPTION, COLOUR_DARK_GREEN), SetStringTip(STR_BUILD_DEPOT_TRAIN_ORIENTATION_CAPTION, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS),
1765 EndContainer(),
1766 NWidget(WWT_PANEL, COLOUR_DARK_GREEN),
1769 NWidget(WWT_TEXTBTN, COLOUR_GREY, WID_BRAD_DEPOT_NW), SetToolTip(STR_BUILD_DEPOT_TRAIN_ORIENTATION_TOOLTIP),
1770 NWidget(WWT_TEXTBTN, COLOUR_GREY, WID_BRAD_DEPOT_SW), SetToolTip(STR_BUILD_DEPOT_TRAIN_ORIENTATION_TOOLTIP),
1771 EndContainer(),
1773 NWidget(WWT_TEXTBTN, COLOUR_GREY, WID_BRAD_DEPOT_NE), SetToolTip(STR_BUILD_DEPOT_TRAIN_ORIENTATION_TOOLTIP),
1774 NWidget(WWT_TEXTBTN, COLOUR_GREY, WID_BRAD_DEPOT_SE), SetToolTip(STR_BUILD_DEPOT_TRAIN_ORIENTATION_TOOLTIP),
1775 EndContainer(),
1776 EndContainer(),
1777 EndContainer(),
1778};
1779
1780static WindowDesc _build_depot_desc(
1781 WDP_AUTO, {}, 0, 0,
1785);
1786
1787static void ShowBuildTrainDepotPicker(Window *parent)
1788{
1789 new BuildRailDepotWindow(_build_depot_desc, parent);
1790}
1791
1793public:
1795
1796 GrfSpecFeature GetFeature() const override { return GSF_STATIONS; }
1797
1798 StringID GetClassTooltip() const override { return STR_PICKER_WAYPOINT_CLASS_TOOLTIP; }
1799 StringID GetTypeTooltip() const override { return STR_PICKER_WAYPOINT_TYPE_TOOLTIP; }
1800 StringID GetCollectionTooltip() const override { return STR_PICKER_WAYPOINT_COLLECTION_TOOLTIP; }
1801
1802 bool IsActive() const override
1803 {
1804 for (const auto &cls : StationClass::Classes()) {
1805 if (!IsWaypointClass(cls)) continue;
1806 for (const auto *spec : cls.Specs()) {
1807 if (spec != nullptr) return true;
1808 }
1809 }
1810 return false;
1811 }
1812
1813 bool HasClassChoice() const override
1814 {
1815 return std::ranges::count_if(StationClass::Classes(), IsWaypointClass) > 1;
1816 }
1817
1818 void Close(int) override { ResetObjectToPlace(); }
1819 int GetSelectedClass() const override { return _waypoint_gui.sel_class; }
1820 void SetSelectedClass(int id) const override { _waypoint_gui.sel_class = this->GetClassIndex(id); }
1821
1822 StringID GetClassName(int id) const override
1823 {
1824 const auto *sc = GetClass(id);
1825 if (!IsWaypointClass(*sc)) return INVALID_STRING_ID;
1826 return sc->name;
1827 }
1828
1829 int GetSelectedType() const override { return _waypoint_gui.sel_type; }
1830 void SetSelectedType(int id) const override { _waypoint_gui.sel_type = id; }
1831
1832 StringID GetTypeName(int cls_id, int id) const override
1833 {
1834 const auto *spec = this->GetSpec(cls_id, id);
1835 return (spec == nullptr) ? STR_STATION_CLASS_WAYP_WAYPOINT : spec->name;
1836 }
1837
1838 std::span<const BadgeID> GetTypeBadges(int cls_id, int id) const override
1839 {
1840 const auto *spec = this->GetSpec(cls_id, id);
1841 if (spec == nullptr) return {};
1842 return spec->badges;
1843 }
1844
1845 bool IsTypeAvailable(int cls_id, int id) const override
1846 {
1847 return IsStationAvailable(this->GetSpec(cls_id, id));
1848 }
1849
1850 void DrawType(int x, int y, int cls_id, int id) const override
1851 {
1852 DrawWaypointSprite(x, y, this->GetClassIndex(cls_id), id, _cur_railtype);
1853 }
1854
1855 void FillUsedItems(std::set<PickerItem> &items) override
1856 {
1857 bool default_added = false;
1858 for (const Waypoint *wp : Waypoint::Iterate()) {
1859 if (wp->owner != _local_company || HasBit(wp->waypoint_flags, WPF_ROAD)) continue;
1860 if (!default_added && StationUsesDefaultType(wp)) {
1861 items.insert({0, 0, STAT_CLASS_WAYP, 0});
1862 default_added = true;
1863 }
1864 for (const auto &sm : wp->speclist) {
1865 if (sm.spec == nullptr) continue;
1866 items.insert({sm.grfid, sm.localidx, sm.spec->class_index, sm.spec->index});
1867 }
1868 }
1869 }
1870
1871 static WaypointPickerCallbacks instance;
1872};
1873/* static */ WaypointPickerCallbacks WaypointPickerCallbacks::instance;
1874
1876 BuildRailWaypointWindow(WindowDesc &desc, Window *parent) : PickerWindow(desc, parent, TRANSPORT_RAIL, WaypointPickerCallbacks::instance)
1877 {
1878 this->ConstructWindow();
1879 }
1880
1881 static inline HotkeyList hotkeys{"buildrailwaypoint", {
1882 Hotkey('F', "focus_filter_box", PCWHK_FOCUS_FILTER_BOX),
1883 }};
1884};
1885
1887static constexpr std::initializer_list<NWidgetPart> _nested_build_waypoint_widgets = {
1889 NWidget(WWT_CLOSEBOX, COLOUR_DARK_GREEN),
1890 NWidget(WWT_CAPTION, COLOUR_DARK_GREEN), SetStringTip(STR_WAYPOINT_CAPTION, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS),
1891 NWidget(WWT_SHADEBOX, COLOUR_DARK_GREEN),
1892 NWidget(WWT_DEFSIZEBOX, COLOUR_DARK_GREEN),
1893 EndContainer(),
1897 EndContainer(),
1898};
1899
1900static WindowDesc _build_waypoint_desc(
1901 WDP_AUTO, "build_waypoint", 0, 0,
1905 &BuildRailWaypointWindow::hotkeys
1906);
1907
1908static void ShowBuildWaypointPicker(Window *parent)
1909{
1910 if (!WaypointPickerCallbacks::instance.IsActive()) return;
1911 new BuildRailWaypointWindow(_build_waypoint_desc, parent);
1912}
1913
1925
1931{
1932 extern RailType _last_built_railtype;
1933 if (disable && _last_built_railtype == RAILTYPE_ELECTRIC) {
1934 _last_built_railtype = _cur_railtype = RAILTYPE_RAIL;
1936 if (w != nullptr) w->ModifyRailType(_cur_railtype);
1937 }
1939}
1940
1943{
1945
1946 extern RailType _last_built_railtype;
1947 RailType rt;
1949 case 2: {
1950 /* Find the most used rail type */
1951 std::array<uint, RAILTYPE_END> count{};
1952 for (const auto t : Map::Iterate()) {
1955 count[GetRailType(t)]++;
1956 }
1957 }
1958
1959 rt = static_cast<RailType>(std::distance(std::begin(count), std::ranges::max_element(count)));
1960 if (count[rt] > 0) break;
1961
1962 /* No rail, just get the first available one */
1963 [[fallthrough]];
1964 }
1965 case 0: {
1966 /* Use first available type */
1967 std::vector<RailType>::const_iterator it = std::find_if(_sorted_railtypes.begin(), _sorted_railtypes.end(),
1968 [](RailType r) { return HasRailTypeAvail(_local_company, r); });
1969 rt = it != _sorted_railtypes.end() ? *it : RAILTYPE_BEGIN;
1970 break;
1971 }
1972 case 1: {
1973 /* Use last available type */
1974 std::vector<RailType>::const_reverse_iterator it = std::find_if(_sorted_railtypes.rbegin(), _sorted_railtypes.rend(),
1975 [](RailType r){ return HasRailTypeAvail(_local_company, r); });
1976 rt = it != _sorted_railtypes.rend() ? *it : RAILTYPE_BEGIN;
1977 break;
1978 }
1979 default:
1980 NOT_REACHED();
1981 }
1982
1983 _last_built_railtype = _cur_railtype = rt;
1985 if (w != nullptr) w->ModifyRailType(_cur_railtype);
1986}
1987
1993{
1995
1996 if (new_variant != _cur_signal_variant) {
1998 if (w != nullptr) {
1999 w->SetDirty();
2001 }
2002 _cur_signal_variant = new_variant;
2003 }
2004}
2005
2006static const IntervalTimer<TimerGameCalendar> _check_reset_signal({TimerGameCalendar::YEAR, TimerGameCalendar::Priority::NONE}, [](auto)
2007{
2009
2011});
2012
2025
2032DropDownList GetRailTypeDropDownList(bool for_replacement, bool all_option)
2033{
2034 RailTypes used_railtypes;
2035 RailTypes avail_railtypes;
2036
2038
2039 /* Find the used railtypes. */
2040 if (for_replacement) {
2041 avail_railtypes = GetCompanyRailTypes(c->index, false);
2042 used_railtypes = GetRailTypes(false);
2043 } else {
2044 avail_railtypes = c->avail_railtypes;
2045 used_railtypes = GetRailTypes(true);
2046 }
2047
2048 DropDownList list;
2049
2050 if (all_option) {
2051 list.push_back(MakeDropDownListStringItem(STR_REPLACE_ALL_RAILTYPE, INVALID_RAILTYPE));
2052 }
2053
2054 Dimension d = { 0, 0 };
2055 /* Get largest icon size, to ensure text is aligned on each menu item. */
2056 if (!for_replacement) {
2057 used_railtypes.Reset(_railtypes_hidden_mask);
2058 for (const auto &rt : _sorted_railtypes) {
2059 if (!used_railtypes.Test(rt)) continue;
2060 const RailTypeInfo *rti = GetRailTypeInfo(rt);
2062 }
2063 }
2064
2065 /* Shared list so that each item can take ownership. */
2066 auto badge_class_list = std::make_shared<GUIBadgeClasses>(GSF_RAILTYPES);
2067
2068 for (const auto &rt : _sorted_railtypes) {
2069 /* If it's not used ever, don't show it to the user. */
2070 if (!used_railtypes.Test(rt)) continue;
2071
2072 const RailTypeInfo *rti = GetRailTypeInfo(rt);
2073
2074 if (for_replacement) {
2075 list.push_back(MakeDropDownListBadgeItem(badge_class_list, rti->badges, GSF_RAILTYPES, rti->introduction_date, GetString(rti->strings.replace_text), rt, !avail_railtypes.Test(rt)));
2076 } else {
2077 std::string str = rti->max_speed > 0
2078 ? GetString(STR_TOOLBAR_RAILTYPE_VELOCITY, rti->strings.menu_text, rti->max_speed)
2079 : GetString(rti->strings.menu_text);
2080 list.push_back(MakeDropDownListBadgeIconItem(badge_class_list, rti->badges, GSF_RAILTYPES, rti->introduction_date, RailBuildCost(rt), d, rti->gui_sprites.build_x_rail, PAL_NONE, std::move(str), rt, !avail_railtypes.Test(rt)));
2081 }
2082 }
2083
2084 if (list.empty()) {
2085 /* Empty dropdowns are not allowed */
2086 list.push_back(MakeDropDownListStringItem(STR_NONE, INVALID_RAILTYPE, true));
2087 }
2088
2089 return list;
2090}
static constexpr uint GB(const T x, const uint8_t s, const uint8_t n)
Fetch n bits from x, started at bit s.
constexpr bool HasBit(const T x, const uint8_t y)
Checks if a bit in a value is set.
void ShowBuildBridgeWindow(TileIndex start, TileIndex end, TransportType transport_type, uint8_t road_rail_type)
Prepare the data for the build a bridge window.
bool IsBridgeTile(Tile t)
checks if there is a bridge on this tile
Definition bridge_map.h:35
constexpr bool Test(Tvalue_type value) const
Test if the value-th bit is set.
constexpr Timpl & Reset()
Reset all bits.
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
static std::span< NewGRFClass< Tspec, Tindex, Tmax > const > Classes()
Get read-only span of all classes of this type.
static NewGRFClass * Get(Tindex class_index)
Get a particular class.
const Tspec * GetSpec(uint index) const
Get a spec from the class at a given index.
Helper for PickerCallbacks when the class system is based on NewGRFClass.
Definition picker_gui.h:140
Base class for windows opened from a toolbar.
Definition window_gui.h:993
void Close(int data=0) override
Hide the window and all its child windows, and mark them for a later deletion.
Definition window.cpp:3606
static constexpr int PREVIEW_WIDTH
Width of each preview button.
Definition picker_gui.h:219
void Close(int data=0) override
Hide the window and all its child windows, and mark them for a later deletion.
static constexpr int PREVIEW_HEIGHT
Height of each preview button.
Definition picker_gui.h:220
void DrawWidget(const Rect &r, WidgetID widget) const override
Draw the contents of a nested widget.
static constexpr int PREVIEW_LEFT
Offset from left edge to draw preview.
Definition picker_gui.h:221
static constexpr int PREVIEW_BOTTOM
Offset from bottom edge to draw preview.
Definition picker_gui.h:222
@ PCWHK_FOCUS_FILTER_BOX
Focus the edit box for editing the filter string.
Definition picker_gui.h:253
void OnClick(Point pt, WidgetID widget, int click_count) override
A click with the left mouse button has been made on the window.
void OnInvalidateData(int data=0, bool gui_scope=true) override
Some data on this window has become invalid.
void OnInit() override
Notification that the nested widget tree gets initialized.
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.
This struct contains all the info that is needed to draw and construct tracks.
Definition rail.h:115
uint16_t max_speed
Maximum speed for vehicles travelling on this rail type.
Definition rail.h:220
SpriteID build_tunnel
button for building a tunnel
Definition rail.h:148
CursorID rail_swne
Cursor for building rail in X direction.
Definition rail.h:155
SpriteID convert_rail
button for converting rail
Definition rail.h:149
CursorID convert
Cursor for converting track.
Definition rail.h:161
CursorID depot
Cursor for building a depot.
Definition rail.h:159
TimerGameCalendar::Date introduction_date
Introduction date.
Definition rail.h:244
struct RailTypeInfo::@19 gui_sprites
struct containing the sprites for the rail GUI.
CursorID rail_nwse
Cursor for building rail in Y direction.
Definition rail.h:157
SpriteID build_x_rail
button for building single rail in X direction
Definition rail.h:143
CursorID rail_ew
Cursor for building rail in E-W direction.
Definition rail.h:156
SpriteID auto_rail
button for the autorail construction
Definition rail.h:146
CursorID autorail
Cursor for autorail tool.
Definition rail.h:158
StringID menu_text
Name of this rail type in the main toolbar dropdown.
Definition rail.h:167
StringID toolbar_caption
Caption in the construction toolbar GUI for this rail type.
Definition rail.h:166
SpriteID signals[SIGTYPE_END][2][2]
signal GUI sprites (type, variant, state)
Definition rail.h:150
SpriteID build_ew_rail
button for building single rail in E-W direction
Definition rail.h:144
SpriteID build_y_rail
button for building single rail in Y direction
Definition rail.h:145
struct RailTypeInfo::@21 strings
Strings associated with the rail type.
StringID replace_text
Text used in the autoreplace GUI.
Definition rail.h:169
SpriteID build_depot
button for building depots
Definition rail.h:147
SpriteID build_ns_rail
button for building single rail in N-S direction
Definition rail.h:142
CursorID rail_ns
Cursor for building rail in N-S direction.
Definition rail.h:154
SpriteID tunnel
tunnel sprites base
Definition rail.h:133
bool IsActive() const override
Should picker class/type selection be enabled?
Definition rail_gui.cpp:983
StringID GetCollectionTooltip() const override
Get the tooltip string for the collection list.
Definition rail_gui.cpp:981
bool HasClassChoice() const override
Are there multiple classes to chose from?
Definition rail_gui.cpp:994
std::span< const BadgeID > GetTypeBadges(int cls_id, int id) const override
Get the item of a type.
StringID GetTypeName(int cls_id, int id) const override
Get the item of a type.
StringID GetClassTooltip() const override
Get the tooltip string for the class list.
Definition rail_gui.cpp:979
void SetSelectedType(int id) const override
Set the selected type.
void DrawType(int x, int y, int cls_id, int id) const override
Draw preview image of an item.
StringID GetClassName(int id) const override
Get the name of a class.
StringID GetTypeTooltip() const override
Get the tooltip string for the type grid.
Definition rail_gui.cpp:980
int GetSelectedClass() const override
Get the index of the selected class.
Definition rail_gui.cpp:999
void SetSelectedClass(int id) const override
Set the selected class.
bool IsTypeAvailable(int cls_id, int id) const override
Test if an item is currently buildable.
int GetSelectedType() const override
Get the selected type.
void FillUsedItems(std::set< PickerItem > &items) override
Fill a set with all items that are used by the current player.
Wrapper class to abstract away the way the tiles are stored.
Definition map_func.h:25
static Year year
Current year, starting at 0.
int GetSelectedType() const override
Get the selected type.
void SetSelectedClass(int id) const override
Set the selected class.
StringID GetTypeTooltip() const override
Get the tooltip string for the type grid.
void DrawType(int x, int y, int cls_id, int id) const override
Draw preview image of an item.
StringID GetCollectionTooltip() const override
Get the tooltip string for the collection list.
bool IsTypeAvailable(int cls_id, int id) const override
Test if an item is currently buildable.
std::span< const BadgeID > GetTypeBadges(int cls_id, int id) const override
Get the item of a type.
int GetSelectedClass() const override
Get the index of the selected class.
StringID GetTypeName(int cls_id, int id) const override
Get the item of a type.
bool IsActive() const override
Should picker class/type selection be enabled?
void SetSelectedType(int id) const override
Set the selected type.
StringID GetClassName(int id) const override
Get the name of a class.
StringID GetClassTooltip() const override
Get the tooltip string for the class list.
void FillUsedItems(std::set< PickerItem > &items) override
Fill a set with all items that are used by the current player.
bool HasClassChoice() const override
Are there multiple classes to chose from?
RectPadding framerect
Standard padding inside many panels.
Definition window_gui.h:40
static WidgetDimensions scaled
Widget dimensions scaled for current zoom level.
Definition window_gui.h:30
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:93
Functions related to commands.
static constexpr DoCommandFlags CommandFlagsToDCFlags(CommandFlags cmd_flags)
Extracts the DC flags needed for DoCommand from the flags returned by GetCommandFlags.
@ Auto
don't allow building on structures
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.
static constexpr CompanyID COMPANY_SPECTATOR
The client is spectating.
bool IsValidAxis(Axis d)
Checks if an integer value is a valid Axis.
Axis
Allow incrementing of DiagDirDiff variables.
@ AXIS_X
The X axis.
@ AXIS_Y
The y axis.
DiagDirection
Enumeration for diagonal directions.
@ DIAGDIR_NE
Northeast, upper right on your monitor.
@ DIAGDIR_NW
Northwest.
@ DIAGDIR_SE
Southeast.
@ DIAGDIR_SW
Southwest.
Functions related to the drop down widget.
Types related to the drop down widget.
std::vector< std::unique_ptr< const DropDownListItem > > DropDownList
A drop down list is a collection of drop down list items.
Base class for engines.
int GetCharacterHeight(FontSize size)
Get height of a character for a given font size.
Definition fontcache.cpp:87
Dimension maxdim(const Dimension &d1, const Dimension &d2)
Compute bounding box of both dimensions.
Geometry functions.
int CentreBounds(int min, int max, int size)
Determine where to position a centred object.
Dimension GetSpriteSize(SpriteID sprid, Point *offset, ZoomLevel zoom)
Get the size of a sprite.
Definition gfx.cpp:968
bool _ctrl_pressed
Is Ctrl pressed?
Definition gfx.cpp:38
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:1034
uint8_t GetDigitWidth(FontSize size)
Return the maximum width of single digit.
Definition gfx.cpp:1286
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:1568
uint32_t SpriteID
The number of a sprite, without mapping bits and colourtables.
Definition gfx_type.h:17
@ FS_NORMAL
Index of the normal font in the font tables.
Definition gfx_type.h:249
@ WKC_GLOBAL_HOTKEY
Fake keycode bit to indicate global hotkeys.
Definition gfx_type.h:35
constexpr NWidgetPart NWidgetFunction(NWidgetFunctionType *func_ptr)
Obtain a nested widget (sub)tree from an external source.
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 SetToolbarMinimalSize(int width)
Widget part function to setting the minimal size for a toolbar button.
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 SetAspect(float ratio, AspectFlags flags=AspectFlag::ResizeX)
Widget part function for setting the aspect ratio.
constexpr NWidgetPart SetTextStyle(TextColour colour, FontSize size=FS_NORMAL)
Widget part function for setting the text style.
constexpr NWidgetPart SetToolbarSpacerMinimalSize()
Widget part function to setting the minimal size for a toolbar spacer.
constexpr NWidgetPart SetMinimalSize(int16_t x, int16_t y)
Widget part function for setting the minimal size.
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 SetArrowWidgetTypeTip(ArrowWidgetValues widget_type, StringID tip={})
Widget part function for setting the arrow widget type and tooltip.
constexpr NWidgetPart NWidget(WidgetType tp, Colours col, WidgetID idx=INVALID_WIDGET)
Widget part function for starting a new 'real' widget.
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:968
void MarkWholeScreenDirty()
This function mark the whole screen as dirty.
Definition gfx.cpp:1549
void MarkTileDirtyByTile(TileIndex tile, int bridge_level_offset, int tile_height_override)
Mark a tile given by its index dirty for repaint.
GUI functions that shouldn't be here.
Hotkey related functions.
TrackStatus GetTileTrackStatus(TileIndex tile, TransportType mode, uint sub_mode, DiagDirection side)
Returns information about trackdirs and signal states.
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
static TileIndex TileVirtXY(uint x, uint y)
Get a tile from the virtual XY-coordinate.
Definition map_func.h:416
TileIndexDiff TileOffsByDiagDir(DiagDirection dir)
Convert a DiagDirection to a TileIndexDiff.
Definition map_func.h:582
constexpr bool IsInsideMM(const size_t x, const size_t min, const size_t max) noexcept
Checks if a value is in an interval.
void GuiShowTooltips(Window *parent, EncodedString &&text, TooltipCloseCondition close_tooltip)
Shows a tooltip.
Definition misc_gui.cpp:693
GrfSpecFeature
Definition newgrf.h:69
Functions related to NewGRF badges.
int DrawBadgeNameList(Rect r, std::span< const BadgeID > badges, GrfSpecFeature)
Draw names for a list of badge labels.
GUI functions related to NewGRF badges.
@ Avail
Availability of station in construction window.
@ CBID_STATION_AVAILABILITY
Determine whether a newstation should be made available to build.
static const uint CALLBACK_FAILED
Different values for Callback result evaluations.
bool Convert8bitBooleanCallback(const GRFFile *grffile, uint16_t cbid, uint16_t cb_res)
Converts a callback result into a boolean.
bool IsWaypointClass(const RoadStopClass &cls)
Test if a RoadStopClass is the waypoint class.
bool DrawStationTile(int x, int y, RailType railtype, Axis axis, StationClassID sclass, uint station)
Draw representation of a station tile for GUI purposes.
Header file for NewGRF stations.
StationClassID
@ STAT_CLASS_DFLT
Default station class.
@ STAT_CLASS_WAYP
Waypoint class.
std::unique_ptr< NWidgetBase > MakePickerClassWidgets()
Create nested widgets for the class picker widgets.
std::unique_ptr< NWidgetBase > MakePickerTypeWidgets()
Create nested widgets for the type picker widgets.
Functions/types etc.
RailTypes GetCompanyRailTypes(CompanyID company, bool introduces)
Get the rail types the given company can build.
Definition rail.cpp:135
RailTypes GetRailTypes(bool introduces)
Get list of rail types, regardless of company availability.
Definition rail.cpp:166
bool ValParamRailType(const RailType rail)
Validate functions for rail building.
Definition rail.cpp:90
Money RailBuildCost(RailType railtype)
Returns the cost of building the specified railtype.
Definition rail.h:428
std::vector< RailType > _sorted_railtypes
Sorted list of rail types.
Definition rail_cmd.cpp:47
const RailTypeInfo * GetRailTypeInfo(RailType railtype)
Returns a pointer to the Railtype information for a given railtype.
Definition rail.h:300
Command definitions for rail.
static constexpr std::initializer_list< NWidgetPart > _nested_signal_builder_widgets
Nested widget definition of the build signal window.
Window * ShowBuildRailToolbar(RailType railtype)
Open the build rail toolbar window for a specific rail type.
Definition rail_gui.cpp:923
static bool RailToolbar_CtrlChanged(Window *w)
Updates the Remove button because of Ctrl state change.
Definition rail_gui.cpp:334
void ResetSignalVariant(int32_t)
Updates the current signal variant used in the signal GUI to the one adequate to current year.
static void PlaceRail_Waypoint(TileIndex tile)
Place a rail waypoint.
Definition rail_gui.cpp:168
static void SetDefaultRailGui()
Set the initial (default) railtype to use.
static RailType _cur_railtype
Rail type of the current build-rail toolbar.
Definition rail_gui.cpp:56
static void HandleAutoSignalPlacement()
Build new signals or remove signals or (if only one tile marked) edit a signal.
Definition rail_gui.cpp:413
static SignalVariant _cur_signal_variant
set the signal variant (for signal GUI)
Definition rail_gui.cpp:60
static void PlaceExtraDepotRail(TileIndex tile, DiagDirection dir, Track track)
Try to add an additional rail-track at the entrance of a depot.
Definition rail_gui.cpp:120
static void PlaceRail_Bridge(TileIndex tile, Window *w)
Start placing a rail bridge.
Definition rail_gui.cpp:294
static void PlaceRail_Station(TileIndex tile)
Place a rail station.
Definition rail_gui.cpp:200
static StationPickerSelection _station_gui
Settings of the station picker.
Definition rail_gui.cpp:74
static SignalType _cur_signal_type
set the signal type (for signal GUI)
Definition rail_gui.cpp:61
static void ToggleRailButton_Remove(Window *w)
Toggles state of the Remove button of Build rail toolbar.
Definition rail_gui.cpp:320
DropDownList GetRailTypeDropDownList(bool for_replacement, bool all_option)
Create a drop down list for all the rail types of the local company.
static WindowDesc _station_builder_desc(WDP_AUTO, "build_station_rail", 0, 0, WC_BUILD_STATION, WC_BUILD_TOOLBAR, WindowDefaultFlag::Construction, _nested_station_builder_widgets, &BuildRailStationWindow::hotkeys)
High level window description of the station-build window (default & newGRF)
static void BuildRailClick_Remove(Window *w)
The "remove"-button click proc of the build-rail toolbar.
Definition rail_gui.cpp:355
static WindowDesc _signal_builder_desc(WDP_AUTO, {}, 0, 0, WC_BUILD_SIGNAL, WC_BUILD_TOOLBAR, WindowDefaultFlag::Construction, _nested_signal_builder_widgets)
Signal selection window description.
static constexpr std::initializer_list< NWidgetPart > _nested_build_depot_widgets
Nested widget definition of the build rail depot window.
static bool IsStationAvailable(const StationSpec *statspec)
Check whether a station type can be build.
Definition rail_gui.cpp:87
static Window * ShowStationBuilder(Window *parent)
Open station build window.
static bool StationUsesDefaultType(const BaseStation *bst)
Test if a station/waypoint uses the default graphics.
Definition rail_gui.cpp:965
static const Track _place_depot_extra_track[12]
Additional pieces of track to add at the entrance of a depot.
Definition rail_gui.cpp:130
static DiagDirection _build_depot_direction
Currently selected depot direction.
Definition rail_gui.cpp:58
void InitializeRailGui()
Initialize rail building GUI settings.
static void ShowSignalBuilder(Window *parent)
Open the signal selection window.
static constexpr std::initializer_list< NWidgetPart > _nested_build_waypoint_widgets
Nested widget definition for the build NewGRF rail waypoint window.
static bool _remove_button_clicked
Flag whether 'remove' toggle-button is currently enabled.
Definition rail_gui.cpp:57
void ReinitGuiAfterToggleElrail(bool disable)
Re-initialize rail-build toolbar after toggling support for electric trains.
static const DiagDirection _place_depot_extra_dir[12]
Direction to check for existing track pieces.
Definition rail_gui.cpp:137
void InitializeRailGUI()
Resets the rail GUI - sets default railtype to build and resets the signal GUI.
static bool _convert_signal_button
convert signal button in the signal GUI pressed
Definition rail_gui.cpp:59
static void GenericPlaceSignals(TileIndex tile)
Build a new signal or edit/remove a present signal, use CmdBuildSingleSignal() or CmdRemoveSingleSign...
Definition rail_gui.cpp:236
static WaypointPickerSelection _waypoint_gui
Settings of the waypoint picker.
Definition rail_gui.cpp:67
Functions/types etc.
@ SIGNAL_GUI_ALL
Show all signals, including block and presignals.
Definition rail_gui.h:25
@ SIGNAL_CYCLE_ALL
Cycle through all signals visible to the player.
Definition rail_gui.h:31
static RailTileType GetRailTileType(Tile t)
Returns the RailTileType (normal with or without signals, waypoint or depot).
Definition rail_map.h:36
RailType GetRailType(Tile t)
Gets the rail type of the given tile.
Definition rail_map.h:115
TrackBits GetTrackBits(Tile tile)
Gets the track bits of the given tile.
Definition rail_map.h:136
static bool IsPlainRailTile(Tile t)
Checks whether the tile is a rail tile or rail tile with signals.
Definition rail_map.h:60
@ Depot
Depot (one entrance)
@ Signals
Normal rail tile with signals.
bool HasSignalOnTrack(Tile tile, Track track)
Checks for the presence of signals (either way) on the given track on the given rail tile.
Definition rail_map.h:412
static bool IsRailDepotTile(Tile t)
Is this tile rail tile and a rail depot?
Definition rail_map.h:105
RailType
Enumeration for all possible railtypes.
Definition rail_type.h:25
@ RAILTYPE_BEGIN
Used for iterations.
Definition rail_type.h:26
@ INVALID_RAILTYPE
Flag for invalid railtype.
Definition rail_type.h:32
@ RAILTYPE_ELECTRIC
Electric rails.
Definition rail_type.h:28
@ RAILTYPE_RAIL
Standard non-electric rails.
Definition rail_type.h:27
Types related to the rail widgets.
@ WID_RAT_BUILD_SIGNALS
Build signals.
Definition rail_widget.h:26
@ WID_RAT_BUILD_NS
Build rail along the game view Y axis.
Definition rail_widget.h:17
@ WID_RAT_CONVERT_RAIL
Convert other rail to this type.
Definition rail_widget.h:30
@ WID_RAT_BUILD_Y
Build rail along the game grid Y axis.
Definition rail_widget.h:20
@ WID_RAT_BUILD_EW
Build rail along the game view X axis.
Definition rail_widget.h:19
@ WID_RAT_BUILD_BRIDGE
Build a bridge.
Definition rail_widget.h:27
@ WID_RAT_REMOVE
Bulldozer to remove rail.
Definition rail_widget.h:29
@ WID_RAT_CAPTION
Caption of the window.
Definition rail_widget.h:16
@ WID_RAT_BUILD_WAYPOINT
Build a waypoint.
Definition rail_widget.h:24
@ WID_RAT_BUILD_DEPOT
Build a depot.
Definition rail_widget.h:23
@ WID_RAT_DEMOLISH
Destroy something with dynamite!
Definition rail_widget.h:22
@ WID_RAT_BUILD_STATION
Build a station.
Definition rail_widget.h:25
@ WID_RAT_BUILD_X
Build rail along the game grid X axis.
Definition rail_widget.h:18
@ WID_RAT_BUILD_TUNNEL
Build a tunnel.
Definition rail_widget.h:28
@ WID_RAT_AUTORAIL
Autorail tool.
Definition rail_widget.h:21
@ WID_BRAS_HIGHLIGHT_OFF
Button for turning coverage highlighting off.
Definition rail_widget.h:57
@ WID_BRAS_PLATFORM_NUM_4
Button to select stations with 4 platforms.
Definition rail_widget.h:42
@ WID_BRAS_PLATFORM_NUM_7
Button to select stations with 7 platforms.
Definition rail_widget.h:45
@ WID_BRAS_PLATFORM_DIR_X
Button to select '/' view.
Definition rail_widget.h:36
@ WID_BRAS_PLATFORM_LEN_BEGIN
Helper for determining the chosen platform length.
Definition rail_widget.h:62
@ WID_BRAS_PLATFORM_LEN_3
Button to select 3 tiles length station platforms.
Definition rail_widget.h:49
@ WID_BRAS_PLATFORM_DIR_Y
Button to select '\' view.
Definition rail_widget.h:37
@ WID_BRAS_PLATFORM_LEN_6
Button to select 6 tiles length station platforms.
Definition rail_widget.h:52
@ WID_BRAS_PLATFORM_NUM_1
Button to select stations with a single platform.
Definition rail_widget.h:39
@ WID_BRAS_PLATFORM_NUM_BEGIN
Helper for determining the chosen platform width.
Definition rail_widget.h:61
@ WID_BRAS_PLATFORM_NUM_3
Button to select stations with 3 platforms.
Definition rail_widget.h:41
@ WID_BRAS_PLATFORM_LEN_5
Button to select 5 tiles length station platforms.
Definition rail_widget.h:51
@ WID_BRAS_PLATFORM_NUM_5
Button to select stations with 5 platforms.
Definition rail_widget.h:43
@ WID_BRAS_COVERAGE_TEXTS
Empty space for the coverage texts.
Definition rail_widget.h:59
@ WID_BRAS_PLATFORM_LEN_1
Button to select single tile length station platforms.
Definition rail_widget.h:47
@ WID_BRAS_HIGHLIGHT_ON
Button for turning coverage highlighting on.
Definition rail_widget.h:58
@ WID_BRAS_PLATFORM_DRAG_N_DROP
Button to enable drag and drop type station placement.
Definition rail_widget.h:55
@ WID_BRAS_PLATFORM_LEN_7
Button to select 7 tiles length station platforms.
Definition rail_widget.h:53
@ WID_BRAS_PLATFORM_NUM_6
Button to select stations with 6 platforms.
Definition rail_widget.h:44
@ WID_BRAS_PLATFORM_NUM_2
Button to select stations with 2 platforms.
Definition rail_widget.h:40
@ WID_BRAS_PLATFORM_LEN_4
Button to select 4 tiles length station platforms.
Definition rail_widget.h:50
@ WID_BRAS_PLATFORM_LEN_2
Button to select 2 tiles length station platforms.
Definition rail_widget.h:48
@ WID_BRAD_DEPOT_SE
Build a depot with the entrance in the south east.
Definition rail_widget.h:92
@ WID_BRAD_DEPOT_NE
Build a depot with the entrance in the north east.
Definition rail_widget.h:91
@ WID_BRAD_DEPOT_SW
Build a depot with the entrance in the south west.
Definition rail_widget.h:93
@ WID_BRAD_DEPOT_NW
Build a depot with the entrance in the north west.
Definition rail_widget.h:94
@ WID_BS_DRAG_SIGNALS_DENSITY_DECREASE
Decrease the signal density.
Definition rail_widget.h:82
@ WID_BS_ELECTRIC_PBS
Build an electric path signal.
Definition rail_widget.h:78
@ WID_BS_SEMAPHORE_NORM
Build a semaphore normal block signal.
Definition rail_widget.h:68
@ WID_BS_ELECTRIC_NORM
Build an electric normal block signal.
Definition rail_widget.h:74
@ WID_BS_ELECTRIC_EXIT
Build an electric exit block signal.
Definition rail_widget.h:76
@ WID_BS_ELECTRIC_ENTRY
Build an electric entry block signal.
Definition rail_widget.h:75
@ WID_BS_SEMAPHORE_ENTRY
Build a semaphore entry block signal.
Definition rail_widget.h:69
@ WID_BS_BLOCK_SEL
Container for the block signal group, which can be hidden.
Definition rail_widget.h:84
@ WID_BS_CAPTION
Caption for the Signal Selection window.
Definition rail_widget.h:67
@ WID_BS_SEMAPHORE_COMBO
Build a semaphore combo block signal.
Definition rail_widget.h:71
@ WID_BS_BLOCK_SPACER_SEL
Container for the spacer between block and path signal groups, which can be hidden.
Definition rail_widget.h:85
@ WID_BS_SEMAPHORE_PBS
Build a semaphore path signal.
Definition rail_widget.h:72
@ WID_BS_DRAG_SIGNALS_DENSITY_LABEL
The current signal density.
Definition rail_widget.h:81
@ WID_BS_SEMAPHORE_EXIT
Build a semaphore exit block signal.
Definition rail_widget.h:70
@ WID_BS_SEMAPHORE_PBS_OWAY
Build a semaphore one way path signal.
Definition rail_widget.h:73
@ WID_BS_DRAG_SIGNALS_DENSITY_INCREASE
Increase the signal density.
Definition rail_widget.h:83
@ WID_BS_CONVERT
Convert the signal.
Definition rail_widget.h:80
@ WID_BS_ELECTRIC_COMBO
Build an electric combo block signal.
Definition rail_widget.h:77
@ WID_BS_ELECTRIC_PBS_OWAY
Build an electric one way path signal.
Definition rail_widget.h:79
bool IsLevelCrossingTile(Tile t)
Return whether a tile is a level crossing tile.
Definition road_map.h:79
@ INVALID_ROADTYPE
flag for invalid roadtype
Definition road_type.h:28
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:61
ClientSettings _settings_client
The current settings for this game.
Definition settings.cpp:60
SignalType
Type of signal, i.e.
Definition signal_type.h:23
@ SIGTYPE_PBS
normal pbs signal
Definition signal_type.h:28
@ SIGTYPE_BLOCK
block signal
Definition signal_type.h:24
SignalVariant
Variant of the signal, i.e.
Definition signal_type.h:16
@ SIG_SEMAPHORE
Old-fashioned semaphore signal.
Definition signal_type.h:18
@ SIG_ELECTRIC
Light signal.
Definition signal_type.h:17
void SndClickBeep()
Play a beep sound for a click event if enabled in settings.
Definition sound.cpp:253
Functions related to sound.
@ SND_20_CONSTRUCTION_RAIL
30 == 0x1E Construction: rail infrastructure
Definition sound_type.h:78
static const CursorID ANIMCURSOR_BUILDSIGNALS
1292 - 1293 - build signal
Definition sprites.h:1526
static const CursorID ANIMCURSOR_DEMOLISH
704 - 707 - demolish dynamite
Definition sprites.h:1522
Base classes/functions for stations.
Command definitions related to stations.
void ShowSelectStationIfNeeded(TileArea ta, StationPickerCmdProc proc)
Show the station selection window when needed.
void ShowSelectRailWaypointIfNeeded(TileArea ta, StationPickerCmdProc proc)
Show the rail waypoint 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
Maps accessors for stations.
bool HasStationTileRail(Tile t)
Has this station tile a rail? In other words, is this station tile a rail station or rail waypoint?
uint GetCustomStationSpecIndex(Tile t)
Get the custom station spec for this tile.
bool HasStationRail(Tile t)
Has this station tile a rail? In other words, is this station tile a rail station or rail waypoint?
static constexpr uint CA_TRAIN
Catchment for train stations with "modified catchment" enabled.
@ Rail
Railways/train station.
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.
EncodedString GetEncodedString(StringID str)
Encode a string with no parameters into an encoded string.
Definition strings.cpp:90
std::string GetString(StringID string)
Resolve the given StringID into a std::string with formatting but no parameters.
Definition strings.cpp:424
Functions related to OTTD's strings.
int64_t PackVelocity(uint speed, VehicleType type)
Pack velocity and vehicle type for use with SCC_VELOCITY string parameter.
uint32_t StringID
Numeric value that represents a string, independent of the selected language.
static const StringID INVALID_STRING_ID
Constant representing an invalid string (16bit in case it is used in savegames)
Class to backup a specific variable and restore it upon destruction of this object to prevent stack v...
Base class for all station-ish types.
TileArea train_station
Tile area the train 'station' part covers.
virtual bool TileBelongsToRailStation(TileIndex tile) const =0
Check whether a specific tile belongs to this station.
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.
void OnClick(Point pt, WidgetID widget, int click_count) override
A click with the left mouse button has been made on the window.
void DrawWidget(const Rect &r, WidgetID widget) const override
Draw the contents of a nested widget.
void OnRealtimeTick(uint delta_ms) override
Called periodically.
void OnPaint() override
The window must be repainted.
void OnClick(Point pt, WidgetID widget, int click_count) override
A click with the left mouse button has been made on the window.
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.
static EventState BuildRailStationGlobalHotkeys(int hotkey)
Handler for global hotkeys of the BuildRailStationWindow.
void DrawWidget(const Rect &r, WidgetID widget) const override
Draw the contents of a nested widget.
void Close(int data=0) override
Hide the window and all its child windows, and mark them for a later deletion.
uint coverage_height
Height of the coverage texts.
void CheckSelectedSize(const StationSpec *statspec)
Verify whether the currently selected station size is allowed after selecting a new station class/typ...
void OnInit() override
Notification that the nested widget tree gets initialized.
void OnInvalidateData(int data=0, bool gui_scope=true) override
Some data on this window has become invalid.
Rail toolbar management class.
Definition rail_gui.cpp:438
void OnPlacePresize(Point pt, TileIndex tile) override
The user moves over the map when a tile highlight mode has been set when the special mouse mode has b...
Definition rail_gui.cpp:815
RailType railtype
Rail type to build.
Definition rail_gui.cpp:439
void OnRealtimeTick(uint delta_ms) override
Called periodically.
Definition rail_gui.cpp:828
void OnInvalidateData(int data=0, bool gui_scope=true) override
Some data on this window has become invalid.
Definition rail_gui.cpp:468
WidgetID last_user_action
Last started user action.
Definition rail_gui.cpp:440
void ModifyRailType(RailType railtype)
Switch to another rail type.
Definition rail_gui.cpp:518
void OnInit() override
Notification that the nested widget tree gets initialized.
Definition rail_gui.cpp:500
bool OnTooltip(Point pt, WidgetID widget, TooltipCloseCondition close_cond) override
Event to display a custom tooltip.
Definition rail_gui.cpp:489
void OnClick(Point pt, WidgetID widget, int click_count) override
A click with the left mouse button has been made on the window.
Definition rail_gui.cpp:567
EventState OnCTRLStateChange() override
The state of the control key has changed.
Definition rail_gui.cpp:821
std::string GetWidgetString(WidgetID widget, StringID stringid) const override
Get the raw string for a widget.
Definition rail_gui.cpp:554
void OnPlaceObjectAbort() override
The user cancelled a tile highlight mode that has been set.
Definition rail_gui.cpp:798
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 rail_gui.cpp:723
static EventState RailToolbarGlobalHotkeys(int hotkey)
Handler for global hotkeys of the BuildRailToolbarWindow.
Definition rail_gui.cpp:838
void OnPlaceObject(Point pt, TileIndex tile) override
The user clicked some place on the map when a tile highlight mode has been set.
Definition rail_gui.cpp:664
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 rail_gui.cpp:736
static const std::initializer_list< WidgetID > can_build_widgets
List of widgets to be disabled if infrastructure limit prevents building.
Definition rail_gui.cpp:462
Point OnInitialPosition(int16_t sm_width, int16_t sm_height, int window_number) override
Compute the initial position of the window.
Definition rail_gui.cpp:731
EventState OnHotkey(int hotkey) override
A hotkey has been pressed.
Definition rail_gui.cpp:658
void Close(int data=0) override
Hide the window and all its child windows, and mark them for a later deletion.
Definition rail_gui.cpp:452
Dimension sig_sprite_size
Maximum size of signal GUI sprites.
void DrawSignalSprite(const Rect &r, SpriteID image) const
Draw dynamic a signal-sprite in a button in the signal GUI.
void SetSignalUIMode()
Show or hide buttons for non-path signals in the signal GUI.
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.
std::string GetWidgetString(WidgetID widget, StringID stringid) const override
Get the raw string for a widget.
void OnInit() override
Notification that the nested widget tree gets initialized.
void OnInvalidateData(int data=0, bool gui_scope=true) override
Some data on this window has become invalid.
void DrawWidget(const Rect &r, WidgetID widget) const override
Draw the contents of a nested widget.
int sig_sprite_bottom_offset
Maximum extent of signal GUI sprite from reference point towards bottom.
void Close(int data=0) override
Hide the window and all its child windows, and mark them for a later deletion.
void OnClick(Point pt, WidgetID widget, int click_count) override
A click with the left mouse button has been made on the window.
SoundSettings sound
sound effect settings
GUISettings gui
settings related to the GUI
RailTypes avail_railtypes
Rail types available to this company.
T y
Y coordinate.
T x
X coordinate.
Dimensions (a width and height) of a rectangle in 2D.
Data about how and where to blit pixels.
Definition gfx_type.h:157
const struct GRFFile * grffile
grf file that introduced this entity
bool persistent_buildingtools
keep the building tools active after usage
SignalCycleSettings cycle_signal_types
Which signal types to cycle with the build signal tool.
uint8_t station_platlength
the platform length, in tiles, for rail stations
bool auto_remove_signals
automatically remove signals when in the way during rail construction
bool station_dragdrop
whether drag and drop is enabled for stations
bool station_show_coverage
whether to highlight coverage area
uint8_t default_rail_type
the default rail type for the rail GUI
uint8_t drag_signals_density
many signals density
uint8_t station_numtracks
the number of platforms to default on for rail stations
TimerGameCalendar::Year semaphore_build_before
build semaphore signals automatically before this year
SignalGUISettings signal_gui_mode
select which signal types are shown in the signal GUI
bool drag_signals_fixed_distance
keep fixed distance between signals when dragging
SignalType default_signal_type
The default signal type, which is set automatically by the last signal used. Not available in Setting...
bool link_terraform_toolbar
display terraform toolbar when displaying rail, road, water and airport toolbars
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
static IterateWrapper Iterate()
Returns an iterable ensemble of all Tiles.
Definition map_func.h:375
Represents the covered area of e.g.
uint16_t w
The width of the area.
TileIndex tile
The base tile of the area.
uint16_t h
The height of the area.
static Titem * Get(auto index)
Returns Titem with given index.
static bool IsValidID(auto index)
Tests whether given index can be used to get valid (non-nullptr) Titem.
const Tindex index
Index of this pool item.
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 confirm
Play sound effect on successful constructions or other actions.
static Pool::IterateWrapper< Station > Iterate(size_t from=0)
Returns an iterable ensemble of all valid stations of type T.
StationClassID sel_class
Selected station class.
Definition rail_gui.cpp:70
uint16_t sel_type
Selected station type within the class.
Definition rail_gui.cpp:71
Axis axis
Selected orientation of the station.
Definition rail_gui.cpp:72
uint8_t station_spread
amount a station may spread
bool modified_catchment
different-size catchment areas
Station specification.
uint8_t disallowed_lengths
Bitmask of platform lengths available for the station.
uint8_t disallowed_platforms
Bitmask of number of platforms available for the station.
CargoGRFFileProps grf_prop
Link to NewGRF.
StationCallbackMasks callback_mask
Bitmask of station callbacks that have to be called.
Station data structure.
Point selstart
The location where the dragging started.
HighLightStyle drawstyle
Lower bits 0-3 are reserved for detailed highlight information.
Point pos
Location, in tile "units", of the northern tile of the selected area.
Point selend
The location where the drag currently ends.
StationClassID sel_class
Selected station class.
Definition rail_gui.cpp:64
uint16_t sel_type
Selected station type within the class.
Definition rail_gui.cpp:65
Representation of a waypoint.
High level window description.
Definition window_gui.h:168
Data structure for an opened window.
Definition window_gui.h:274
void ReInit(int rx=0, int ry=0, bool reposition=false)
Re-initialize a window, and optionally change its size.
Definition window.cpp:980
virtual void Close(int data=0)
Hide the window and all its child windows, and mark them for a later deletion.
Definition window.cpp:1104
void FinishInitNested(WindowNumber window_number=0)
Perform the second part of the initialization of a nested widget tree.
Definition window.cpp:1809
void DrawWidgets() const
Paint all widgets of a window.
Definition widget.cpp:766
void InvalidateData(int data=0, bool gui_scope=true)
Mark this window's data as invalid (in need of re-computing)
Definition window.cpp:3240
Window * parent
Parent window.
Definition window_gui.h:329
void RaiseWidget(WidgetID widget_index)
Marks a widget as raised.
Definition window_gui.h:470
void SetWidgetDirty(WidgetID widget_index) const
Invalidate a widget, i.e.
Definition window.cpp:558
virtual std::string GetWidgetString(WidgetID widget, StringID stringid) const
Get the raw string for a widget.
Definition window.cpp:506
ResizeInfo resize
Resize information.
Definition window_gui.h:315
void DisableWidget(WidgetID widget_index)
Sets a widget to disabled.
Definition window_gui.h:392
void CreateNestedTree()
Perform the first part of the initialization of a nested widget tree.
Definition window.cpp:1799
bool IsWidgetLowered(WidgetID widget_index) const
Gets the lowered state of a widget.
Definition window_gui.h:492
bool IsWidgetDisabled(WidgetID widget_index) const
Gets the enabled/disabled status of a widget.
Definition window_gui.h:411
void RaiseButtons(bool autoraise=false)
Raise the buttons of the window.
Definition window.cpp:532
void SetWidgetLoweredState(WidgetID widget_index, bool lowered_stat)
Sets the lowered/raised status of a widget.
Definition window_gui.h:442
bool IsShaded() const
Is window shaded currently?
Definition window_gui.h:560
virtual void OnPlaceMouseUp(ViewportPlaceMethod select_method, ViewportDragDropSelectionProcess select_proc, Point pt, TileIndex start_tile, TileIndex end_tile)
The user has dragged over the map when the tile highlight mode has been set.
Definition window_gui.h:844
void LowerWidget(WidgetID widget_index)
Marks a widget as lowered.
Definition window_gui.h:461
void InitNested(WindowNumber number=0)
Perform complete initialization of the Window with nested widgets, to allow use.
Definition window.cpp:1822
virtual EventState OnHotkey(int hotkey)
A hotkey has been pressed.
Definition window.cpp:572
void SetWidgetDisabledState(WidgetID widget_index, bool disab_stat)
Sets the enabled/disabled status of a widget.
Definition window_gui.h:382
void ToggleWidgetLoweredState(WidgetID widget_index)
Invert the lowered/raised status of a widget.
Definition window_gui.h:451
WindowNumber window_number
Window number within the window class.
Definition window_gui.h:303
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.
static bool IsTileType(Tile tile, TileType type)
Checks if a tile is a given tiletype.
Definition tile_map.h:150
bool IsValidTile(Tile tile)
Checks if a tile is valid.
Definition tile_map.h:161
constexpr TileIndex INVALID_TILE
The very nice invalid tile marker.
Definition tile_type.h:100
@ TunnelBridge
Tunnel entry/exit and bridge heads.
@ Railway
A tile with railway.
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_LINE
used for autorail highlighting (longer stretches), lower bits: direction
@ HT_DIR_HL
horizontal lower
@ HT_DIR_X
X direction.
@ HT_DIAGONAL
Also allow 'diagonal rectangles'. Only usable in combination with HT_RECT or HT_POINT.
@ HT_RECT
rectangle (stations, depots, ...)
@ HT_DIR_MASK
masks the drag-direction
@ HT_RAIL
autorail (one piece), lower bits: direction
@ HT_DRAG_MASK
Mask for the tile drag-type modes.
@ HT_DIR_VL
vertical left
@ HT_SPECIAL
special mode used for highlighting while dragging (and for tunnels/docks)
@ HT_DIR_Y
Y direction.
Definition of Interval and OneShot timers.
Definition of the game-calendar-timer.
bool IsValidTrack(Track track)
Checks if a Track is valid.
Definition track_func.h:28
Track FindFirstTrack(TrackBits tracks)
Returns first Track from TrackBits or INVALID_TRACK.
Definition track_func.h:177
TrackBits DiagdirReachesTracks(DiagDirection diagdir)
Returns all tracks that can be reached when entering a tile from a given (diagonal) direction.
Definition track_func.h:573
TrackBits TrackStatusToTrackBits(TrackStatus ts)
Returns the present-track-information of a TrackStatus.
Definition track_func.h:363
TrackBits
Allow incrementing of Track variables.
Definition track_type.h:35
@ TRACK_BIT_UPPER
Upper track.
Definition track_type.h:39
@ TRACK_BIT_LEFT
Left track.
Definition track_type.h:41
@ TRACK_BIT_HORZ
Upper and lower track.
Definition track_type.h:44
@ TRACK_BIT_LOWER
Lower track.
Definition track_type.h:40
@ TRACK_BIT_RIGHT
Right track.
Definition track_type.h:42
@ TRACK_BIT_VERT
Left and right track.
Definition track_type.h:45
Track
These are used to specify a single track.
Definition track_type.h:19
@ TRACK_Y
Track along the y-axis (north-west to south-east)
Definition track_type.h:22
@ TRACK_LOWER
Track in the lower corner of the tile (south)
Definition track_type.h:24
@ TRACK_LEFT
Track in the left corner of the tile (west)
Definition track_type.h:25
@ TRACK_RIGHT
Track in the right corner of the tile (east)
Definition track_type.h:26
@ TRACK_X
Track along the x-axis (north-east to south-west)
Definition track_type.h:21
@ TRACK_UPPER
Track in the upper corner of the tile (north)
Definition track_type.h:23
@ TRANSPORT_RAIL
Transport by train.
Header file for things common for tunnels and bridges.
TileIndex _build_tunnel_endtile
The end of a tunnel; as hidden return from the tunnel build command for GUI purposes.
Command definitions related to tunnels and bridges.
Functions that have tunnels and bridges in common.
TransportType GetTunnelBridgeTransportType(Tile t)
Tunnel: Get the transport type of the tunnel (road or rail) Bridge: Get the transport type of the bri...
TileIndex GetOtherTunnelBridgeEnd(Tile t)
Determines type of the wormhole and returns its other end.
bool CanBuildVehicleInfrastructure(VehicleType type, uint8_t subtype)
Check whether we can build infrastructure for the given vehicle type.
Definition vehicle.cpp:1915
Functions related to vehicles.
@ VEH_TRAIN
Train vehicle type.
void SetTileSelectSize(int w, int h)
Highlight w by h tiles at the cursor.
void SetViewportCatchmentWaypoint(const Waypoint *wp, bool sel)
Select or deselect waypoint for coverage area highlight.
void SetRedErrorSquare(TileIndex tile)
Set a tile to display a red error square.
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_FIX_Y
drag only in Y axis
@ VPM_Y_LIMITED
Drag only in Y axis with limited size.
@ VPM_X_AND_Y_LIMITED
area of land of limited size
@ VPM_FIX_VERTICAL
drag only in vertical direction
@ VPM_X_LIMITED
Drag only in X axis with limited size.
@ VPM_X_AND_Y
area of land in X and Y directions
@ VPM_FIX_HORIZONTAL
drag only in horizontal direction
@ VPM_FIX_X
drag only in X axis
@ VPM_SIGNALDIRS
similar to VMP_RAILDIRS, but with different cursor
@ VPM_X_OR_Y
drag in X or Y direction
@ VPM_RAILDIRS
all rail directions
ViewportDragDropSelectionProcess
Drag and drop selection process, or, what to do with an area of land when you've selected it.
@ DDSP_CONVERT_RAIL
Rail conversion.
@ DDSP_DEMOLISH_AREA
Clear area.
@ DDSP_BUILD_SIGNALS
Signal placement.
@ DDSP_REMOVE_STATION
Station removal.
@ DDSP_BUILD_STATION
Station placement.
@ DDSP_BUILD_BRIDGE
Bridge placement.
@ DDSP_PLACE_RAIL
Rail placement.
void DrawWaypointSprite(int x, int y, StationClassID station_class, uint16_t station_type, RailType railtype)
Draw a waypoint.
Definition waypoint.cpp:28
Base of waypoints.
@ WPF_ROAD
This is a road waypoint.
Axis GetAxisForNewRailWaypoint(TileIndex tile)
Get the axis for a new rail waypoint.
Command definitions related to waypoints.
Functions related to waypoints.
static RectPadding ScaleGUITrad(const RectPadding &r)
Scale a RectPadding to GUI zoom level.
Definition widget.cpp:49
@ WWT_IMGBTN
(Toggle) Button with image
Definition widget_type.h:41
@ WWT_PUSHARROWBTN
Normal push-button (no toggle button) with arrow caption.
@ 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:44
@ WWT_PANEL
Simple depressed panel.
Definition widget_type.h:39
@ WWT_STICKYBOX
Sticky box (at top-right of a window, after WWT_DEFSIZEBOX)
Definition widget_type.h:57
@ WWT_SHADEBOX
Shade box (at top-right of a window, between WWT_DEBUGBOX and WWT_DEFSIZEBOX)
Definition widget_type.h:55
@ 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:37
@ WWT_DEFSIZEBOX
Default window size box (at top-right of a window, between WWT_SHADEBOX and WWT_STICKYBOX)
Definition widget_type.h:56
@ NWID_HORIZONTAL_LTR
Horizontal container that doesn't change the order of the widgets for RTL languages.
Definition widget_type.h:67
@ NWID_SELECTION
Stacked widgets, only one visible at a time (eg in a panel with tabs).
Definition widget_type.h:71
@ SZSP_NONE
Display plane with zero size in both directions (none filling and resizing).
@ EqualSize
Containers should keep all their (resizing) children equally large.
@ AWV_DECREASE
Arrow to the left or in case of RTL to the right.
Definition widget_type.h:20
@ AWV_INCREASE
Arrow to the right or in case of RTL to the left.
Definition widget_type.h:21
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:1195
void CloseWindowByClass(WindowClass cls, int data)
Close all windows of a given class.
Definition window.cpp:1207
Point AlignInitialConstructionToolbar(int window_width)
Compute the position of the construction toolbars.
Definition window.cpp:1701
Window * FindWindowById(WindowClass cls, WindowNumber number)
Find a window by its class and window number.
Definition window.cpp:1153
void SetWindowDirty(WindowClass cls, WindowNumber number)
Mark window as dirty (in need of repainting)
Definition window.cpp:3178
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:144
@ WDP_MANUAL
Manually align the window (so no automatic location finding)
Definition window_gui.h:143
int WidgetID
Widget ID.
Definition window_type.h:20
@ WN_GAME_OPTIONS_GAME_SETTINGS
Game settings.
Definition window_type.h:32
EventState
State of handling an event.
@ ES_HANDLED
The passed event is handled.
@ ES_NOT_HANDLED
The passed event is not handled.
static constexpr WidgetID INVALID_WIDGET
An invalid widget index.
Definition window_type.h:23
@ WC_BUILD_STATION
Build station; Window numbers:
@ WC_BUILD_TOOLBAR
Build toolbar; Window numbers:
Definition window_type.h:78
@ WC_NONE
No window, redirects to WC_MAIN_WINDOW.
Definition window_type.h:50
@ WC_SCEN_LAND_GEN
Landscape generation (in Scenario Editor); Window numbers:
@ WC_SELECT_STATION
Select station (when joining stations); Window numbers:
@ WC_BUILD_SIGNAL
Build signal toolbar; Window numbers:
@ WC_BUILD_DEPOT
Build depot; Window numbers:
@ WC_GAME_OPTIONS
Game options window; Window numbers:
@ WC_BUILD_WAYPOINT
Build waypoint; 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