OpenTTD
road_gui.cpp
Go to the documentation of this file.
1 /* $Id$ */
2 
3 /*
4  * This file is part of OpenTTD.
5  * OpenTTD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2.
6  * OpenTTD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
7  * See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see <http://www.gnu.org/licenses/>.
8  */
9 
12 #include "stdafx.h"
13 #include "gui.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 "road_cmd.h"
20 #include "station_func.h"
21 #include "window_func.h"
22 #include "vehicle_func.h"
23 #include "sound_func.h"
24 #include "company_func.h"
25 #include "tunnelbridge.h"
26 #include "tunnelbridge_map.h"
27 #include "tilehighlight_func.h"
28 #include "company_base.h"
29 #include "hotkeys.h"
30 #include "road_gui.h"
31 #include "zoom_func.h"
32 #include "engine_base.h"
33 #include "strings_func.h"
34 #include "core/geometry_func.hpp"
35 #include "date_func.h"
36 
37 #include "widgets/road_widget.h"
38 
39 #include "table/strings.h"
40 
41 #include "safeguards.h"
42 
43 static void ShowRVStationPicker(Window *parent, RoadStopType rs);
44 static void ShowRoadDepotPicker(Window *parent);
45 
46 static bool _remove_button_clicked;
47 static bool _one_way_button_clicked;
48 
53 enum RoadFlags {
54  RF_NONE = 0x00,
55  RF_START_HALFROAD_Y = 0x01, // The start tile in Y-dir should have only a half road
56  RF_END_HALFROAD_Y = 0x02, // The end tile in Y-dir should have only a half road
57  RF_DIR_Y = 0x04, // The direction is Y-dir
58  RF_DIR_X = RF_NONE, // Dummy; Dir X is set when RF_DIR_Y is not set
59  RF_START_HALFROAD_X = 0x08, // The start tile in X-dir should have only a half road
60  RF_END_HALFROAD_X = 0x10, // The end tile in X-dir should have only a half road
61 };
63 
64 static RoadFlags _place_road_flag;
65 
66 static RoadType _cur_roadtype;
67 
68 static DiagDirection _road_depot_orientation;
69 static DiagDirection _road_station_picker_orientation;
70 
71 void CcPlaySound_SPLAT_OTHER(const CommandCost &result, TileIndex tile, uint32 p1, uint32 p2, uint32 cmd)
72 {
73  if (result.Succeeded() && _settings_client.sound.confirm) SndPlayTileFx(SND_1F_SPLAT_OTHER, tile);
74 }
75 
81 {
82  if (IsBridgeTile(tile)) {
83  TileIndex other_tile = GetOtherTunnelBridgeEnd(tile);
84  Point pt = {0, 0};
85  w->OnPlaceMouseUp(VPM_X_OR_Y, DDSP_BUILD_BRIDGE, pt, other_tile, tile);
86  } else {
88  }
89 }
90 
101 void CcBuildRoadTunnel(const CommandCost &result, TileIndex start_tile, uint32 p1, uint32 p2, uint32 cmd)
102 {
103  if (result.Succeeded()) {
104  if (_settings_client.sound.confirm) SndPlayTileFx(SND_1F_SPLAT_OTHER, start_tile);
106 
107  DiagDirection start_direction = ReverseDiagDir(GetTunnelBridgeDirection(start_tile));
108  ConnectRoadToStructure(start_tile, start_direction);
109 
110  TileIndex end_tile = GetOtherTunnelBridgeEnd(start_tile);
111  DiagDirection end_direction = ReverseDiagDir(GetTunnelBridgeDirection(end_tile));
112  ConnectRoadToStructure(end_tile, end_direction);
113  } else {
115  }
116 }
117 
124 {
125  tile += TileOffsByDiagDir(direction);
126  /* if there is a roadpiece just outside of the station entrance, build a connecting route */
127  if (IsNormalRoadTile(tile)) {
128  if (GetRoadBits(tile, GetRoadTramType(_cur_roadtype)) != ROAD_NONE) {
129  DoCommandP(tile, _cur_roadtype << 4 | DiagDirToRoadBits(ReverseDiagDir(direction)), 0, CMD_BUILD_ROAD);
130  }
131  }
132 }
133 
134 void CcRoadDepot(const CommandCost &result, TileIndex tile, uint32 p1, uint32 p2, uint32 cmd)
135 {
136  if (result.Failed()) return;
137 
138  DiagDirection dir = (DiagDirection)GB(p1, 0, 2);
142 }
143 
160 void CcRoadStop(const CommandCost &result, TileIndex tile, uint32 p1, uint32 p2, uint32 cmd)
161 {
162  if (result.Failed()) return;
163 
164  DiagDirection dir = (DiagDirection)GB(p2, 3, 2);
165  if (_settings_client.sound.confirm) SndPlayTileFx(SND_1F_SPLAT_OTHER, tile);
167  TileArea roadstop_area(tile, GB(p1, 0, 8), GB(p1, 8, 8));
168  TILE_AREA_LOOP(cur_tile, roadstop_area) {
169  ConnectRoadToStructure(cur_tile, dir);
170  /* For a drive-through road stop build connecting road for other entrance. */
171  if (HasBit(p2, 1)) ConnectRoadToStructure(cur_tile, ReverseDiagDir(dir));
172  }
173 }
174 
185 static void PlaceRoadStop(TileIndex start_tile, TileIndex end_tile, uint32 p2, uint32 cmd)
186 {
187  uint8 ddir = _road_station_picker_orientation;
188  SB(p2, 16, 16, INVALID_STATION); // no station to join
189 
190  if (ddir >= DIAGDIR_END) {
191  SetBit(p2, 1); // It's a drive-through stop.
192  ddir -= DIAGDIR_END; // Adjust picker result to actual direction.
193  }
194  p2 |= ddir << 3; // Set the DiagDirecion into p2 bits 3 and 4.
195 
196  TileArea ta(start_tile, end_tile);
197  CommandContainer cmdcont = { ta.tile, (uint32)(ta.w | ta.h << 8), p2, cmd, CcRoadStop, "" };
198  ShowSelectStationIfNeeded(cmdcont, ta);
199 }
200 
206 {
209  } else {
210  if (_road_station_picker_orientation < DIAGDIR_END) { // Not a drive-through stop.
211  VpStartPlaceSizing(tile, (DiagDirToAxis(_road_station_picker_orientation) == AXIS_X) ? VPM_X_LIMITED : VPM_Y_LIMITED, DDSP_BUILD_BUSSTOP);
212  } else {
214  }
215  VpSetPlaceSizingLimit(_settings_game.station.station_spread);
216  }
217 }
218 
224 {
227  } else {
228  if (_road_station_picker_orientation < DIAGDIR_END) { // Not a drive-through stop.
229  VpStartPlaceSizing(tile, (DiagDirToAxis(_road_station_picker_orientation) == AXIS_X) ? VPM_X_LIMITED : VPM_Y_LIMITED, DDSP_BUILD_TRUCKSTOP);
230  } else {
232  }
233  VpSetPlaceSizingLimit(_settings_game.station.station_spread);
234  }
235 }
236 
237 typedef void OnButtonClick(Window *w);
238 
244 {
248  SetSelectionRed(_remove_button_clicked);
249 }
250 
257 {
258  if (w->IsWidgetDisabled(WID_ROT_REMOVE)) return false;
259 
260  /* allow ctrl to switch remove mode only for these widgets */
261  for (uint i = WID_ROT_ROAD_X; i <= WID_ROT_AUTOROAD; i++) {
262  if (w->IsWidgetLowered(i)) {
264  return true;
265  }
266  }
267 
268  return false;
269 }
270 
274  const RoadTypeInfo *rti;
276 
278  {
279  this->Initialize(_cur_roadtype);
280  this->InitNested(window_number);
281  this->SetupRoadToolbar();
283 
284  if (RoadTypeIsRoad(this->roadtype)) {
286  }
287 
288  this->OnInvalidateData();
289  this->last_started_action = WIDGET_LIST_END;
290 
292  }
293 
295  {
296  if (_game_mode == GM_NORMAL && (this->IsWidgetLowered(WID_ROT_BUS_STATION) || this->IsWidgetLowered(WID_ROT_TRUCK_STATION))) SetViewportCatchmentStation(nullptr, true);
298  }
299 
305  void OnInvalidateData(int data = 0, bool gui_scope = true) override
306  {
307  if (!gui_scope) return;
308 
309  if (_game_mode != GM_EDITOR && !CanBuildVehicleInfrastructure(VEH_ROAD, GetRoadTramType(this->roadtype))) delete this;
310  bool can_build = _game_mode != GM_EDITOR;
311  this->SetWidgetsDisabledState(!can_build,
316  if (!can_build) {
320  }
321  }
322 
323  void Initialize(RoadType roadtype)
324  {
325  assert(roadtype < ROADTYPE_END);
326  this->roadtype = roadtype;
327  this->rti = GetRoadTypeInfo(this->roadtype);
328  }
329 
335  {
336  this->GetWidget<NWidgetCore>(WID_ROT_ROAD_X)->widget_data = rti->gui_sprites.build_x_road;
338  this->GetWidget<NWidgetCore>(WID_ROT_AUTOROAD)->widget_data = rti->gui_sprites.auto_road;
339  if (_game_mode != GM_EDITOR) {
340  this->GetWidget<NWidgetCore>(WID_ROT_DEPOT)->widget_data = rti->gui_sprites.build_depot;
341  }
342  this->GetWidget<NWidgetCore>(WID_ROT_CONVERT_ROAD)->widget_data = rti->gui_sprites.convert_road;
344  }
345 
350  void ModifyRoadType(RoadType roadtype)
351  {
352  this->Initialize(roadtype);
353  this->SetupRoadToolbar();
354  this->ReInit();
355  }
356 
357  void SetStringParameters(int widget) const override
358  {
359  if (widget == WID_ROT_CAPTION) {
360  if (this->rti->max_speed > 0) {
361  SetDParam(0, STR_TOOLBAR_RAILTYPE_VELOCITY);
362  SetDParam(1, this->rti->strings.toolbar_caption);
363  SetDParam(2, this->rti->max_speed / 2);
364  } else {
365  SetDParam(0, this->rti->strings.toolbar_caption);
366  }
367  }
368  }
369 
376  {
377  /* The remove and the one way button state is driven
378  * by the other buttons so they don't act on themselves.
379  * Both are only valid if they are able to apply as options. */
380  switch (clicked_widget) {
381  case WID_ROT_REMOVE:
382  if (RoadTypeIsRoad(this->roadtype)) {
385  }
386 
387  break;
388 
389  case WID_ROT_ONE_WAY:
392  break;
393 
394  case WID_ROT_BUS_STATION:
396  if (RoadTypeIsRoad(this->roadtype)) this->DisableWidget(WID_ROT_ONE_WAY);
397  this->SetWidgetDisabledState(WID_ROT_REMOVE, !this->IsWidgetLowered(clicked_widget));
398  break;
399 
400  case WID_ROT_ROAD_X:
401  case WID_ROT_ROAD_Y:
402  case WID_ROT_AUTOROAD:
403  this->SetWidgetDisabledState(WID_ROT_REMOVE, !this->IsWidgetLowered(clicked_widget));
404  if (RoadTypeIsRoad(this->roadtype)) {
405  this->SetWidgetDisabledState(WID_ROT_ONE_WAY, !this->IsWidgetLowered(clicked_widget));
406  }
407  break;
408 
409  default:
410  /* When any other buttons than road/station, raise and
411  * disable the removal button */
414 
415  if (RoadTypeIsRoad(this->roadtype)) {
418  }
419 
420  break;
421  }
422  }
423 
424  void OnClick(Point pt, int widget, int click_count) override
425  {
426  _remove_button_clicked = false;
427  _one_way_button_clicked = false;
428  switch (widget) {
429  case WID_ROT_ROAD_X:
431  this->last_started_action = widget;
432  break;
433 
434  case WID_ROT_ROAD_Y:
436  this->last_started_action = widget;
437  break;
438 
439  case WID_ROT_AUTOROAD:
441  this->last_started_action = widget;
442  break;
443 
444  case WID_ROT_DEMOLISH:
446  this->last_started_action = widget;
447  break;
448 
449  case WID_ROT_DEPOT:
450  if (_game_mode == GM_EDITOR || !CanBuildVehicleInfrastructure(VEH_ROAD, GetRoadTramType(this->roadtype))) return;
451  if (HandlePlacePushButton(this, WID_ROT_DEPOT, this->rti->cursor.depot, HT_RECT)) {
452  ShowRoadDepotPicker(this);
453  this->last_started_action = widget;
454  }
455  break;
456 
457  case WID_ROT_BUS_STATION:
458  if (_game_mode == GM_EDITOR || !CanBuildVehicleInfrastructure(VEH_ROAD, GetRoadTramType(this->roadtype))) return;
459  if (HandlePlacePushButton(this, WID_ROT_BUS_STATION, SPR_CURSOR_BUS_STATION, HT_RECT)) {
460  ShowRVStationPicker(this, ROADSTOP_BUS);
461  this->last_started_action = widget;
462  }
463  break;
464 
466  if (_game_mode == GM_EDITOR || !CanBuildVehicleInfrastructure(VEH_ROAD, GetRoadTramType(this->roadtype))) return;
467  if (HandlePlacePushButton(this, WID_ROT_TRUCK_STATION, SPR_CURSOR_TRUCK_STATION, HT_RECT)) {
468  ShowRVStationPicker(this, ROADSTOP_TRUCK);
469  this->last_started_action = widget;
470  }
471  break;
472 
473  case WID_ROT_ONE_WAY:
474  if (this->IsWidgetDisabled(WID_ROT_ONE_WAY)) return;
475  this->SetDirty();
477  SetSelectionRed(false);
478  break;
479 
481  HandlePlacePushButton(this, WID_ROT_BUILD_BRIDGE, SPR_CURSOR_BRIDGE, HT_RECT);
482  this->last_started_action = widget;
483  break;
484 
487  this->last_started_action = widget;
488  break;
489 
490  case WID_ROT_REMOVE:
491  if (this->IsWidgetDisabled(WID_ROT_REMOVE)) return;
492 
495  if (_settings_client.sound.click_beep) SndPlayFx(SND_15_BEEP);
496  break;
497 
500  this->last_started_action = widget;
501  break;
502 
503  default: NOT_REACHED();
504  }
507  }
508 
509  EventState OnHotkey(int hotkey) override
510  {
511  MarkTileDirtyByTile(TileVirtXY(_thd.pos.x, _thd.pos.y)); // redraw tile selection
512  return Window::OnHotkey(hotkey);
513  }
514 
515  void OnPlaceObject(Point pt, TileIndex tile) override
516  {
518  _one_way_button_clicked = RoadTypeIsRoad(this->roadtype) ? this->IsWidgetLowered(WID_ROT_ONE_WAY) : false;
519  switch (this->last_started_action) {
520  case WID_ROT_ROAD_X:
521  _place_road_flag = RF_DIR_X;
522  if (_tile_fract_coords.x >= 8) _place_road_flag |= RF_START_HALFROAD_X;
524  break;
525 
526  case WID_ROT_ROAD_Y:
527  _place_road_flag = RF_DIR_Y;
528  if (_tile_fract_coords.y >= 8) _place_road_flag |= RF_START_HALFROAD_Y;
530  break;
531 
532  case WID_ROT_AUTOROAD:
533  _place_road_flag = RF_NONE;
534  if (_tile_fract_coords.x >= 8) _place_road_flag |= RF_START_HALFROAD_X;
535  if (_tile_fract_coords.y >= 8) _place_road_flag |= RF_START_HALFROAD_Y;
537  break;
538 
539  case WID_ROT_DEMOLISH:
541  break;
542 
543  case WID_ROT_DEPOT:
544  DoCommandP(tile, _cur_roadtype << 2 | _road_depot_orientation, 0,
545  CMD_BUILD_ROAD_DEPOT | CMD_MSG(this->rti->strings.err_depot), CcRoadDepot);
546  break;
547 
548  case WID_ROT_BUS_STATION:
549  PlaceRoad_BusStation(tile);
550  break;
551 
554  break;
555 
557  PlaceRoad_Bridge(tile, this);
558  break;
559 
561  DoCommandP(tile, _cur_roadtype | (TRANSPORT_ROAD << 8), 0,
562  CMD_BUILD_TUNNEL | CMD_MSG(STR_ERROR_CAN_T_BUILD_TUNNEL_HERE), CcBuildRoadTunnel);
563  break;
564 
567  break;
568 
569  default: NOT_REACHED();
570  }
571  }
572 
573  void OnPlaceObjectAbort() override
574  {
575  if (_game_mode != GM_EDITOR && (this->IsWidgetLowered(WID_ROT_BUS_STATION) || this->IsWidgetLowered(WID_ROT_TRUCK_STATION))) SetViewportCatchmentStation(nullptr, true);
576 
577  this->RaiseButtons();
580 
581  if (RoadTypeIsRoad(this->roadtype)) {
584  }
585 
591  }
592 
593  void OnPlaceDrag(ViewportPlaceMethod select_method, ViewportDragDropSelectionProcess select_proc, Point pt) override
594  {
595  /* Here we update the end tile flags
596  * of the road placement actions.
597  * At first we reset the end halfroad
598  * bits and if needed we set them again. */
599  switch (select_proc) {
601  _place_road_flag &= ~RF_END_HALFROAD_X;
602  if (pt.x & 8) _place_road_flag |= RF_END_HALFROAD_X;
603  break;
604 
606  _place_road_flag &= ~RF_END_HALFROAD_Y;
607  if (pt.y & 8) _place_road_flag |= RF_END_HALFROAD_Y;
608  break;
609 
610  case DDSP_PLACE_AUTOROAD:
611  _place_road_flag &= ~(RF_END_HALFROAD_Y | RF_END_HALFROAD_X);
612  if (pt.y & 8) _place_road_flag |= RF_END_HALFROAD_Y;
613  if (pt.x & 8) _place_road_flag |= RF_END_HALFROAD_X;
614 
615  /* For autoroad we need to update the
616  * direction of the road */
617  if (_thd.size.x > _thd.size.y || (_thd.size.x == _thd.size.y &&
618  ( (_tile_fract_coords.x < _tile_fract_coords.y && (_tile_fract_coords.x + _tile_fract_coords.y) < 16) ||
619  (_tile_fract_coords.x > _tile_fract_coords.y && (_tile_fract_coords.x + _tile_fract_coords.y) > 16) ))) {
620  /* Set dir = X */
621  _place_road_flag &= ~RF_DIR_Y;
622  } else {
623  /* Set dir = Y */
624  _place_road_flag |= RF_DIR_Y;
625  }
626 
627  break;
628 
629  default:
630  break;
631  }
632 
633  VpSelectTilesWithMethod(pt.x, pt.y, select_method);
634  }
635 
636  void OnPlaceMouseUp(ViewportPlaceMethod select_method, ViewportDragDropSelectionProcess select_proc, Point pt, TileIndex start_tile, TileIndex end_tile) override
637  {
638  if (pt.x != -1) {
639  switch (select_proc) {
640  default: NOT_REACHED();
641  case DDSP_BUILD_BRIDGE:
643  ShowBuildBridgeWindow(start_tile, end_tile, TRANSPORT_ROAD, _cur_roadtype);
644  break;
645 
646  case DDSP_DEMOLISH_AREA:
647  GUIPlaceProcDragXY(select_proc, start_tile, end_tile);
648  break;
649 
652  case DDSP_PLACE_AUTOROAD:
653  /* Flag description:
654  * Use the first three bits (0x07) if dir == Y
655  * else use the last 2 bits (X dir has
656  * not the 3rd bit set) */
657 
658  /* Even if _cur_roadtype_id is a uint8 we only use 5 bits so
659  * we could ignore the last 3 bits and reuse them for other
660  * flags */
661  _place_road_flag = (RoadFlags)((_place_road_flag & RF_DIR_Y) ? (_place_road_flag & 0x07) : (_place_road_flag >> 3));
662 
663  DoCommandP(start_tile, end_tile, _place_road_flag | (_cur_roadtype << 3) | (_one_way_button_clicked << 10),
666  CMD_BUILD_LONG_ROAD | CMD_MSG(this->rti->strings.err_build_road), CcPlaySound_SPLAT_OTHER);
667  break;
668 
669  case DDSP_BUILD_BUSSTOP:
670  case DDSP_REMOVE_BUSSTOP:
673  TileArea ta(start_tile, end_tile);
674  DoCommandP(ta.tile, ta.w | ta.h << 8, (_ctrl_pressed << 1) | ROADSTOP_BUS, CMD_REMOVE_ROAD_STOP | CMD_MSG(this->rti->strings.err_remove_station[ROADSTOP_BUS]), CcPlaySound_SPLAT_OTHER);
675  } else {
676  PlaceRoadStop(start_tile, end_tile, _cur_roadtype << 5 | (_ctrl_pressed << 2) | ROADSTOP_BUS, CMD_BUILD_ROAD_STOP | CMD_MSG(this->rti->strings.err_build_station[ROADSTOP_BUS]));
677  }
678  }
679  break;
680 
685  TileArea ta(start_tile, end_tile);
686  DoCommandP(ta.tile, ta.w | ta.h << 8, (_ctrl_pressed << 1) | ROADSTOP_TRUCK, CMD_REMOVE_ROAD_STOP | CMD_MSG(this->rti->strings.err_remove_station[ROADSTOP_TRUCK]), CcPlaySound_SPLAT_OTHER);
687  } else {
688  PlaceRoadStop(start_tile, end_tile, _cur_roadtype << 5 | (_ctrl_pressed << 2) | ROADSTOP_TRUCK, CMD_BUILD_ROAD_STOP | CMD_MSG(this->rti->strings.err_build_station[ROADSTOP_TRUCK]));
689  }
690  }
691  break;
692 
693  case DDSP_CONVERT_ROAD:
694  DoCommandP(end_tile, start_tile, _cur_roadtype, CMD_CONVERT_ROAD | CMD_MSG(rti->strings.err_convert_road), CcPlaySound_SPLAT_OTHER);
695  break;
696  }
697  }
698  }
699 
700  void OnPlacePresize(Point pt, TileIndex tile) override
701  {
702  DoCommand(tile, _cur_roadtype | (TRANSPORT_ROAD << 8), 0, DC_AUTO, CMD_BUILD_TUNNEL);
704  }
705 
707  {
708  if (RoadToolbar_CtrlChanged(this)) return ES_HANDLED;
709  return ES_NOT_HANDLED;
710  }
711 
712  static HotkeyList road_hotkeys;
713  static HotkeyList tram_hotkeys;
714 };
715 
722 static EventState RoadTramToolbarGlobalHotkeys(int hotkey, RoadType last_build)
723 {
724  Window *w = (_game_mode == GM_NORMAL) ? ShowBuildRoadToolbar(last_build) : ShowBuildRoadScenToolbar(last_build);
725  if (w == nullptr) return ES_NOT_HANDLED;
726  return w->OnHotkey(hotkey);
727 }
728 
729 static EventState RoadToolbarGlobalHotkeys(int hotkey)
730 {
731  if (_game_mode == GM_NORMAL && !CanBuildVehicleInfrastructure(VEH_ROAD, RTT_ROAD)) return ES_NOT_HANDLED;
732 
733  extern RoadType _last_built_roadtype;
734  return RoadTramToolbarGlobalHotkeys(hotkey, _last_built_roadtype);
735 }
736 
737 static EventState TramToolbarGlobalHotkeys(int hotkey)
738 {
739  if (_game_mode != GM_NORMAL || !CanBuildVehicleInfrastructure(VEH_ROAD, RTT_TRAM)) return ES_NOT_HANDLED;
740  extern RoadType _last_built_tramtype;
741  return RoadTramToolbarGlobalHotkeys(hotkey, _last_built_tramtype);
742 }
743 
744 static Hotkey roadtoolbar_hotkeys[] = {
745  Hotkey('1', "build_x", WID_ROT_ROAD_X),
746  Hotkey('2', "build_y", WID_ROT_ROAD_Y),
747  Hotkey('3', "autoroad", WID_ROT_AUTOROAD),
748  Hotkey('4', "demolish", WID_ROT_DEMOLISH),
749  Hotkey('5', "depot", WID_ROT_DEPOT),
750  Hotkey('6', "bus_station", WID_ROT_BUS_STATION),
751  Hotkey('7', "truck_station", WID_ROT_TRUCK_STATION),
752  Hotkey('8', "oneway", WID_ROT_ONE_WAY),
753  Hotkey('B', "bridge", WID_ROT_BUILD_BRIDGE),
754  Hotkey('T', "tunnel", WID_ROT_BUILD_TUNNEL),
755  Hotkey('R', "remove", WID_ROT_REMOVE),
756  Hotkey('C', "convert", WID_ROT_CONVERT_ROAD),
757  HOTKEY_LIST_END
758 };
759 HotkeyList BuildRoadToolbarWindow::road_hotkeys("roadtoolbar", roadtoolbar_hotkeys, RoadToolbarGlobalHotkeys);
760 
761 static Hotkey tramtoolbar_hotkeys[] = {
762  Hotkey('1', "build_x", WID_ROT_ROAD_X),
763  Hotkey('2', "build_y", WID_ROT_ROAD_Y),
764  Hotkey('3', "autoroad", WID_ROT_AUTOROAD),
765  Hotkey('4', "demolish", WID_ROT_DEMOLISH),
766  Hotkey('5', "depot", WID_ROT_DEPOT),
767  Hotkey('6', "bus_station", WID_ROT_BUS_STATION),
768  Hotkey('7', "truck_station", WID_ROT_TRUCK_STATION),
769  Hotkey('B', "bridge", WID_ROT_BUILD_BRIDGE),
770  Hotkey('T', "tunnel", WID_ROT_BUILD_TUNNEL),
771  Hotkey('R', "remove", WID_ROT_REMOVE),
772  Hotkey('C', "convert", WID_ROT_CONVERT_ROAD),
773  HOTKEY_LIST_END
774 };
775 HotkeyList BuildRoadToolbarWindow::tram_hotkeys("tramtoolbar", tramtoolbar_hotkeys, TramToolbarGlobalHotkeys);
776 
777 
778 static const NWidgetPart _nested_build_road_widgets[] = {
780  NWidget(WWT_CLOSEBOX, COLOUR_DARK_GREEN),
781  NWidget(WWT_CAPTION, COLOUR_DARK_GREEN, WID_ROT_CAPTION), SetDataTip(STR_WHITE_STRING, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS),
782  NWidget(WWT_STICKYBOX, COLOUR_DARK_GREEN),
783  EndContainer(),
785  NWidget(WWT_IMGBTN, COLOUR_DARK_GREEN, WID_ROT_ROAD_X),
786  SetFill(0, 1), SetMinimalSize(22, 22), SetDataTip(SPR_IMG_ROAD_X_DIR, STR_ROAD_TOOLBAR_TOOLTIP_BUILD_ROAD_SECTION),
787  NWidget(WWT_IMGBTN, COLOUR_DARK_GREEN, WID_ROT_ROAD_Y),
788  SetFill(0, 1), SetMinimalSize(22, 22), SetDataTip(SPR_IMG_ROAD_Y_DIR, STR_ROAD_TOOLBAR_TOOLTIP_BUILD_ROAD_SECTION),
789  NWidget(WWT_IMGBTN, COLOUR_DARK_GREEN, WID_ROT_AUTOROAD),
790  SetFill(0, 1), SetMinimalSize(22, 22), SetDataTip(SPR_IMG_AUTOROAD, STR_ROAD_TOOLBAR_TOOLTIP_BUILD_AUTOROAD),
791  NWidget(WWT_IMGBTN, COLOUR_DARK_GREEN, WID_ROT_DEMOLISH),
792  SetFill(0, 1), SetMinimalSize(22, 22), SetDataTip(SPR_IMG_DYNAMITE, STR_TOOLTIP_DEMOLISH_BUILDINGS_ETC),
793  NWidget(WWT_IMGBTN, COLOUR_DARK_GREEN, WID_ROT_DEPOT),
794  SetFill(0, 1), SetMinimalSize(22, 22), SetDataTip(SPR_IMG_ROAD_DEPOT, STR_ROAD_TOOLBAR_TOOLTIP_BUILD_ROAD_VEHICLE_DEPOT),
795  NWidget(WWT_IMGBTN, COLOUR_DARK_GREEN, WID_ROT_BUS_STATION),
796  SetFill(0, 1), SetMinimalSize(22, 22), SetDataTip(SPR_IMG_BUS_STATION, STR_ROAD_TOOLBAR_TOOLTIP_BUILD_BUS_STATION),
797  NWidget(WWT_IMGBTN, COLOUR_DARK_GREEN, WID_ROT_TRUCK_STATION),
798  SetFill(0, 1), SetMinimalSize(22, 22), SetDataTip(SPR_IMG_TRUCK_BAY, STR_ROAD_TOOLBAR_TOOLTIP_BUILD_TRUCK_LOADING_BAY),
799  NWidget(WWT_PANEL, COLOUR_DARK_GREEN, -1), SetMinimalSize(0, 22), SetFill(1, 1), EndContainer(),
800  NWidget(WWT_IMGBTN, COLOUR_DARK_GREEN, WID_ROT_ONE_WAY),
801  SetFill(0, 1), SetMinimalSize(22, 22), SetDataTip(SPR_IMG_ROAD_ONE_WAY, STR_ROAD_TOOLBAR_TOOLTIP_TOGGLE_ONE_WAY_ROAD),
802  NWidget(WWT_IMGBTN, COLOUR_DARK_GREEN, WID_ROT_BUILD_BRIDGE),
803  SetFill(0, 1), SetMinimalSize(43, 22), SetDataTip(SPR_IMG_BRIDGE, STR_ROAD_TOOLBAR_TOOLTIP_BUILD_ROAD_BRIDGE),
804  NWidget(WWT_IMGBTN, COLOUR_DARK_GREEN, WID_ROT_BUILD_TUNNEL),
805  SetFill(0, 1), SetMinimalSize(22, 22), SetDataTip(SPR_IMG_ROAD_TUNNEL, STR_ROAD_TOOLBAR_TOOLTIP_BUILD_ROAD_TUNNEL),
806  NWidget(WWT_IMGBTN, COLOUR_DARK_GREEN, WID_ROT_REMOVE),
807  SetFill(0, 1), SetMinimalSize(22, 22), SetDataTip(SPR_IMG_REMOVE, STR_ROAD_TOOLBAR_TOOLTIP_TOGGLE_BUILD_REMOVE_FOR_ROAD),
808  NWidget(WWT_IMGBTN, COLOUR_DARK_GREEN, WID_ROT_CONVERT_ROAD),
809  SetFill(0, 1), SetMinimalSize(22, 22), SetDataTip(SPR_IMG_CONVERT_ROAD, STR_ROAD_TOOLBAR_TOOLTIP_CONVERT_ROAD),
810  EndContainer(),
811 };
812 
813 static WindowDesc _build_road_desc(
814  WDP_ALIGN_TOOLBAR, "toolbar_road", 0, 0,
817  _nested_build_road_widgets, lengthof(_nested_build_road_widgets),
818  &BuildRoadToolbarWindow::road_hotkeys
819 );
820 
821 static const NWidgetPart _nested_build_tramway_widgets[] = {
823  NWidget(WWT_CLOSEBOX, COLOUR_DARK_GREEN),
824  NWidget(WWT_CAPTION, COLOUR_DARK_GREEN, WID_ROT_CAPTION), SetDataTip(STR_WHITE_STRING, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS),
825  NWidget(WWT_STICKYBOX, COLOUR_DARK_GREEN),
826  EndContainer(),
828  NWidget(WWT_IMGBTN, COLOUR_DARK_GREEN, WID_ROT_ROAD_X),
829  SetFill(0, 1), SetMinimalSize(22, 22), SetDataTip(SPR_IMG_TRAMWAY_X_DIR, STR_ROAD_TOOLBAR_TOOLTIP_BUILD_TRAMWAY_SECTION),
830  NWidget(WWT_IMGBTN, COLOUR_DARK_GREEN, WID_ROT_ROAD_Y),
831  SetFill(0, 1), SetMinimalSize(22, 22), SetDataTip(SPR_IMG_TRAMWAY_Y_DIR, STR_ROAD_TOOLBAR_TOOLTIP_BUILD_TRAMWAY_SECTION),
832  NWidget(WWT_IMGBTN, COLOUR_DARK_GREEN, WID_ROT_AUTOROAD),
833  SetFill(0, 1), SetMinimalSize(22, 22), SetDataTip(SPR_IMG_AUTOTRAM, STR_ROAD_TOOLBAR_TOOLTIP_BUILD_AUTOTRAM),
834  NWidget(WWT_IMGBTN, COLOUR_DARK_GREEN, WID_ROT_DEMOLISH),
835  SetFill(0, 1), SetMinimalSize(22, 22), SetDataTip(SPR_IMG_DYNAMITE, STR_TOOLTIP_DEMOLISH_BUILDINGS_ETC),
836  NWidget(WWT_IMGBTN, COLOUR_DARK_GREEN, WID_ROT_DEPOT),
837  SetFill(0, 1), SetMinimalSize(22, 22), SetDataTip(SPR_IMG_ROAD_DEPOT, STR_ROAD_TOOLBAR_TOOLTIP_BUILD_TRAM_VEHICLE_DEPOT),
838  NWidget(WWT_IMGBTN, COLOUR_DARK_GREEN, WID_ROT_BUS_STATION),
839  SetFill(0, 1), SetMinimalSize(22, 22), SetDataTip(SPR_IMG_BUS_STATION, STR_ROAD_TOOLBAR_TOOLTIP_BUILD_PASSENGER_TRAM_STATION),
840  NWidget(WWT_IMGBTN, COLOUR_DARK_GREEN, WID_ROT_TRUCK_STATION),
841  SetFill(0, 1), SetMinimalSize(22, 22), SetDataTip(SPR_IMG_TRUCK_BAY, STR_ROAD_TOOLBAR_TOOLTIP_BUILD_CARGO_TRAM_STATION),
842  NWidget(WWT_PANEL, COLOUR_DARK_GREEN, -1), SetMinimalSize(0, 22), SetFill(1, 1), EndContainer(),
843  NWidget(WWT_IMGBTN, COLOUR_DARK_GREEN, WID_ROT_BUILD_BRIDGE),
844  SetFill(0, 1), SetMinimalSize(43, 22), SetDataTip(SPR_IMG_BRIDGE, STR_ROAD_TOOLBAR_TOOLTIP_BUILD_TRAMWAY_BRIDGE),
845  NWidget(WWT_IMGBTN, COLOUR_DARK_GREEN, WID_ROT_BUILD_TUNNEL),
846  SetFill(0, 1), SetMinimalSize(22, 22), SetDataTip(SPR_IMG_ROAD_TUNNEL, STR_ROAD_TOOLBAR_TOOLTIP_BUILD_TRAMWAY_TUNNEL),
847  NWidget(WWT_IMGBTN, COLOUR_DARK_GREEN, WID_ROT_REMOVE),
848  SetFill(0, 1), SetMinimalSize(22, 22), SetDataTip(SPR_IMG_REMOVE, STR_ROAD_TOOLBAR_TOOLTIP_TOGGLE_BUILD_REMOVE_FOR_TRAMWAYS),
849  NWidget(WWT_IMGBTN, COLOUR_DARK_GREEN, WID_ROT_CONVERT_ROAD),
850  SetFill(0, 1), SetMinimalSize(22, 22), SetDataTip(SPR_IMG_CONVERT_ROAD, STR_ROAD_TOOLBAR_TOOLTIP_CONVERT_TRAM),
851  EndContainer(),
852 };
853 
854 static WindowDesc _build_tramway_desc(
855  WDP_ALIGN_TOOLBAR, "toolbar_tramway", 0, 0,
858  _nested_build_tramway_widgets, lengthof(_nested_build_tramway_widgets),
859  &BuildRoadToolbarWindow::tram_hotkeys
860 );
861 
870 {
871  if (!Company::IsValidID(_local_company)) return nullptr;
872  if (!ValParamRoadType(roadtype)) return nullptr;
873 
875  _cur_roadtype = roadtype;
876 
877  return AllocateWindowDescFront<BuildRoadToolbarWindow>(RoadTypeIsRoad(_cur_roadtype) ? &_build_road_desc : &_build_tramway_desc, TRANSPORT_ROAD);
878 }
879 
880 static const NWidgetPart _nested_build_road_scen_widgets[] = {
882  NWidget(WWT_CLOSEBOX, COLOUR_DARK_GREEN),
883  NWidget(WWT_CAPTION, COLOUR_DARK_GREEN, WID_ROT_CAPTION), SetDataTip(STR_WHITE_STRING, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS),
884  NWidget(WWT_STICKYBOX, COLOUR_DARK_GREEN),
885  EndContainer(),
887  NWidget(WWT_IMGBTN, COLOUR_DARK_GREEN, WID_ROT_ROAD_X),
888  SetFill(0, 1), SetMinimalSize(22, 22), SetDataTip(SPR_IMG_ROAD_X_DIR, STR_ROAD_TOOLBAR_TOOLTIP_BUILD_ROAD_SECTION),
889  NWidget(WWT_IMGBTN, COLOUR_DARK_GREEN, WID_ROT_ROAD_Y),
890  SetFill(0, 1), SetMinimalSize(22, 22), SetDataTip(SPR_IMG_ROAD_Y_DIR, STR_ROAD_TOOLBAR_TOOLTIP_BUILD_ROAD_SECTION),
891  NWidget(WWT_IMGBTN, COLOUR_DARK_GREEN, WID_ROT_AUTOROAD),
892  SetFill(0, 1), SetMinimalSize(22, 22), SetDataTip(SPR_IMG_AUTOROAD, STR_ROAD_TOOLBAR_TOOLTIP_BUILD_AUTOROAD),
893  NWidget(WWT_IMGBTN, COLOUR_DARK_GREEN, WID_ROT_DEMOLISH),
894  SetFill(0, 1), SetMinimalSize(22, 22), SetDataTip(SPR_IMG_DYNAMITE, STR_TOOLTIP_DEMOLISH_BUILDINGS_ETC),
895  NWidget(WWT_PANEL, COLOUR_DARK_GREEN, -1), SetMinimalSize(0, 22), SetFill(1, 1), EndContainer(),
896  NWidget(WWT_IMGBTN, COLOUR_DARK_GREEN, WID_ROT_ONE_WAY),
897  SetFill(0, 1), SetMinimalSize(22, 22), SetDataTip(SPR_IMG_ROAD_ONE_WAY, STR_ROAD_TOOLBAR_TOOLTIP_TOGGLE_ONE_WAY_ROAD),
898  NWidget(WWT_IMGBTN, COLOUR_DARK_GREEN, WID_ROT_BUILD_BRIDGE),
899  SetFill(0, 1), SetMinimalSize(43, 22), SetDataTip(SPR_IMG_BRIDGE, STR_ROAD_TOOLBAR_TOOLTIP_BUILD_ROAD_BRIDGE),
900  NWidget(WWT_IMGBTN, COLOUR_DARK_GREEN, WID_ROT_BUILD_TUNNEL),
901  SetFill(0, 1), SetMinimalSize(22, 22), SetDataTip(SPR_IMG_ROAD_TUNNEL, STR_ROAD_TOOLBAR_TOOLTIP_BUILD_ROAD_TUNNEL),
902  NWidget(WWT_IMGBTN, COLOUR_DARK_GREEN, WID_ROT_REMOVE),
903  SetFill(0, 1), SetMinimalSize(22, 22), SetDataTip(SPR_IMG_REMOVE, STR_ROAD_TOOLBAR_TOOLTIP_TOGGLE_BUILD_REMOVE_FOR_ROAD),
904  NWidget(WWT_IMGBTN, COLOUR_DARK_GREEN, WID_ROT_CONVERT_ROAD),
905  SetFill(0, 1), SetMinimalSize(22, 22), SetDataTip(SPR_IMG_CONVERT_ROAD, STR_ROAD_TOOLBAR_TOOLTIP_CONVERT_ROAD),
906  EndContainer(),
907 };
908 
909 static WindowDesc _build_road_scen_desc(
910  WDP_AUTO, "toolbar_road_scen", 0, 0,
913  _nested_build_road_scen_widgets, lengthof(_nested_build_road_scen_widgets),
914  &BuildRoadToolbarWindow::road_hotkeys
915 );
916 
917 static const NWidgetPart _nested_build_tramway_scen_widgets[] = {
919  NWidget(WWT_CLOSEBOX, COLOUR_DARK_GREEN),
920  NWidget(WWT_CAPTION, COLOUR_DARK_GREEN, WID_ROT_CAPTION), SetDataTip(STR_WHITE_STRING, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS),
921  NWidget(WWT_STICKYBOX, COLOUR_DARK_GREEN),
922  EndContainer(),
924  NWidget(WWT_IMGBTN, COLOUR_DARK_GREEN, WID_ROT_ROAD_X),
925  SetFill(0, 1), SetMinimalSize(22, 22), SetDataTip(SPR_IMG_TRAMWAY_X_DIR, STR_ROAD_TOOLBAR_TOOLTIP_BUILD_TRAMWAY_SECTION),
926  NWidget(WWT_IMGBTN, COLOUR_DARK_GREEN, WID_ROT_ROAD_Y),
927  SetFill(0, 1), SetMinimalSize(22, 22), SetDataTip(SPR_IMG_TRAMWAY_Y_DIR, STR_ROAD_TOOLBAR_TOOLTIP_BUILD_TRAMWAY_SECTION),
928  NWidget(WWT_IMGBTN, COLOUR_DARK_GREEN, WID_ROT_AUTOROAD),
929  SetFill(0, 1), SetMinimalSize(22, 22), SetDataTip(SPR_IMG_AUTOTRAM, STR_ROAD_TOOLBAR_TOOLTIP_BUILD_AUTOTRAM),
930  NWidget(WWT_IMGBTN, COLOUR_DARK_GREEN, WID_ROT_DEMOLISH),
931  SetFill(0, 1), SetMinimalSize(22, 22), SetDataTip(SPR_IMG_DYNAMITE, STR_TOOLTIP_DEMOLISH_BUILDINGS_ETC),
932  NWidget(WWT_PANEL, COLOUR_DARK_GREEN, -1), SetMinimalSize(0, 22), SetFill(1, 1), EndContainer(),
933  NWidget(WWT_IMGBTN, COLOUR_DARK_GREEN, WID_ROT_BUILD_BRIDGE),
934  SetFill(0, 1), SetMinimalSize(43, 22), SetDataTip(SPR_IMG_BRIDGE, STR_ROAD_TOOLBAR_TOOLTIP_BUILD_TRAMWAY_BRIDGE),
935  NWidget(WWT_IMGBTN, COLOUR_DARK_GREEN, WID_ROT_BUILD_TUNNEL),
936  SetFill(0, 1), SetMinimalSize(22, 22), SetDataTip(SPR_IMG_ROAD_TUNNEL, STR_ROAD_TOOLBAR_TOOLTIP_BUILD_TRAMWAY_TUNNEL),
937  NWidget(WWT_IMGBTN, COLOUR_DARK_GREEN, WID_ROT_REMOVE),
938  SetFill(0, 1), SetMinimalSize(22, 22), SetDataTip(SPR_IMG_REMOVE, STR_ROAD_TOOLBAR_TOOLTIP_TOGGLE_BUILD_REMOVE_FOR_TRAMWAYS),
939  NWidget(WWT_IMGBTN, COLOUR_DARK_GREEN, WID_ROT_CONVERT_ROAD),
940  SetFill(0, 1), SetMinimalSize(22, 22), SetDataTip(SPR_IMG_CONVERT_ROAD, STR_ROAD_TOOLBAR_TOOLTIP_CONVERT_TRAM),
941  EndContainer(),
942 };
943 
944 static WindowDesc _build_tramway_scen_desc(
945  WDP_AUTO, "toolbar_tram_scen", 0, 0,
948  _nested_build_tramway_scen_widgets, lengthof(_nested_build_tramway_scen_widgets),
949  &BuildRoadToolbarWindow::tram_hotkeys
950 );
951 
957 {
959  _cur_roadtype = roadtype;
960 
961  return AllocateWindowDescFront<BuildRoadToolbarWindow>(RoadTypeIsRoad(_cur_roadtype) ? &_build_road_scen_desc : &_build_tramway_scen_desc, TRANSPORT_ROAD);
962 }
963 
966  {
967  this->CreateNestedTree();
968 
969  this->LowerWidget(_road_depot_orientation + WID_BROD_DEPOT_NE);
970  if (RoadTypeIsTram(_cur_roadtype)) {
971  this->GetWidget<NWidgetCore>(WID_BROD_CAPTION)->widget_data = STR_BUILD_DEPOT_TRAM_ORIENTATION_CAPTION;
972  for (int i = WID_BROD_DEPOT_NE; i <= WID_BROD_DEPOT_NW; i++) this->GetWidget<NWidgetCore>(i)->tool_tip = STR_BUILD_DEPOT_TRAM_ORIENTATION_SELECT_TOOLTIP;
973  }
974 
976  }
977 
978  void UpdateWidgetSize(int widget, Dimension *size, const Dimension &padding, Dimension *fill, Dimension *resize) override
979  {
980  if (!IsInsideMM(widget, WID_BROD_DEPOT_NE, WID_BROD_DEPOT_NW + 1)) return;
981 
982  size->width = ScaleGUITrad(64) + 2;
983  size->height = ScaleGUITrad(48) + 2;
984  }
985 
986  void DrawWidget(const Rect &r, int widget) const override
987  {
988  if (!IsInsideMM(widget, WID_BROD_DEPOT_NE, WID_BROD_DEPOT_NW + 1)) return;
989 
990  DrawRoadDepotSprite(r.left + 1 + ScaleGUITrad(31), r.bottom - ScaleGUITrad(31), (DiagDirection)(widget - WID_BROD_DEPOT_NE + DIAGDIR_NE), _cur_roadtype);
991  }
992 
993  void OnClick(Point pt, int widget, int click_count) override
994  {
995  switch (widget) {
996  case WID_BROD_DEPOT_NW:
997  case WID_BROD_DEPOT_NE:
998  case WID_BROD_DEPOT_SW:
999  case WID_BROD_DEPOT_SE:
1000  this->RaiseWidget(_road_depot_orientation + WID_BROD_DEPOT_NE);
1001  _road_depot_orientation = (DiagDirection)(widget - WID_BROD_DEPOT_NE);
1002  this->LowerWidget(_road_depot_orientation + WID_BROD_DEPOT_NE);
1003  if (_settings_client.sound.click_beep) SndPlayFx(SND_15_BEEP);
1004  this->SetDirty();
1005  break;
1006 
1007  default:
1008  break;
1009  }
1010  }
1011 };
1012 
1013 static const NWidgetPart _nested_build_road_depot_widgets[] = {
1015  NWidget(WWT_CLOSEBOX, COLOUR_DARK_GREEN),
1016  NWidget(WWT_CAPTION, COLOUR_DARK_GREEN, WID_BROD_CAPTION), SetDataTip(STR_BUILD_DEPOT_ROAD_ORIENTATION_CAPTION, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS),
1017  EndContainer(),
1018  NWidget(WWT_PANEL, COLOUR_DARK_GREEN),
1021  NWidget(NWID_SPACER), SetMinimalSize(3, 0), SetFill(1, 0),
1023  NWidget(WWT_PANEL, COLOUR_GREY, WID_BROD_DEPOT_NW), SetMinimalSize(66, 50), SetDataTip(0x0, STR_BUILD_DEPOT_ROAD_ORIENTATION_SELECT_TOOLTIP),
1024  EndContainer(),
1026  NWidget(WWT_PANEL, COLOUR_GREY, WID_BROD_DEPOT_SW), SetMinimalSize(66, 50), SetDataTip(0x0, STR_BUILD_DEPOT_ROAD_ORIENTATION_SELECT_TOOLTIP),
1027  EndContainer(),
1028  EndContainer(),
1031  NWidget(WWT_PANEL, COLOUR_GREY, WID_BROD_DEPOT_NE), SetMinimalSize(66, 50), SetDataTip(0x0, STR_BUILD_DEPOT_ROAD_ORIENTATION_SELECT_TOOLTIP),
1032  EndContainer(),
1034  NWidget(WWT_PANEL, COLOUR_GREY, WID_BROD_DEPOT_SE), SetMinimalSize(66, 50), SetDataTip(0x0, STR_BUILD_DEPOT_ROAD_ORIENTATION_SELECT_TOOLTIP),
1035  EndContainer(),
1036  EndContainer(),
1037  NWidget(NWID_SPACER), SetMinimalSize(3, 0), SetFill(1, 0),
1038  EndContainer(),
1040  EndContainer(),
1041 };
1042 
1043 static WindowDesc _build_road_depot_desc(
1044  WDP_AUTO, nullptr, 0, 0,
1047  _nested_build_road_depot_widgets, lengthof(_nested_build_road_depot_widgets)
1048 );
1049 
1050 static void ShowRoadDepotPicker(Window *parent)
1051 {
1052  new BuildRoadDepotWindow(&_build_road_depot_desc, parent);
1053 }
1054 
1056  BuildRoadStationWindow(WindowDesc *desc, Window *parent, RoadStopType rs) : PickerWindowBase(desc, parent)
1057  {
1058  this->CreateNestedTree();
1059 
1060  /* Trams don't have non-drivethrough stations */
1061  if (RoadTypeIsTram(_cur_roadtype) && _road_station_picker_orientation < DIAGDIR_END) {
1062  _road_station_picker_orientation = DIAGDIR_END;
1063  }
1064  const RoadTypeInfo *rti = GetRoadTypeInfo(_cur_roadtype);
1065  this->GetWidget<NWidgetCore>(WID_BROS_CAPTION)->widget_data = rti->strings.picker_title[rs];
1066 
1067  for (uint i = RoadTypeIsTram(_cur_roadtype) ? WID_BROS_STATION_X : WID_BROS_STATION_NE; i < WID_BROS_LT_OFF; i++) {
1068  this->GetWidget<NWidgetCore>(i)->tool_tip = rti->strings.picker_tooltip[rs];
1069  }
1070 
1071  this->LowerWidget(_road_station_picker_orientation + WID_BROS_STATION_NE);
1072  this->LowerWidget(_settings_client.gui.station_show_coverage + WID_BROS_LT_OFF);
1073 
1075 
1077  }
1078 
1079  virtual ~BuildRoadStationWindow()
1080  {
1082  }
1083 
1084  void OnPaint() override
1085  {
1086  this->DrawWidgets();
1087 
1090  SetTileSelectBigSize(-rad, -rad, 2 * rad, 2 * rad);
1091  } else {
1092  SetTileSelectSize(1, 1);
1093  }
1094 
1095  /* 'Accepts' and 'Supplies' texts. */
1097  int top = this->GetWidget<NWidgetBase>(WID_BROS_LT_ON)->pos_y + this->GetWidget<NWidgetBase>(WID_BROS_LT_ON)->current_y + WD_PAR_VSEP_NORMAL;
1098  NWidgetBase *back_nwi = this->GetWidget<NWidgetBase>(WID_BROS_BACKGROUND);
1099  int right = back_nwi->pos_x + back_nwi->current_x;
1100  int bottom = back_nwi->pos_y + back_nwi->current_y;
1101  top = DrawStationCoverageAreaText(back_nwi->pos_x + WD_FRAMERECT_LEFT, right - WD_FRAMERECT_RIGHT, top, sct, rad, false) + WD_PAR_VSEP_NORMAL;
1102  top = DrawStationCoverageAreaText(back_nwi->pos_x + WD_FRAMERECT_LEFT, right - WD_FRAMERECT_RIGHT, top, sct, rad, true) + WD_PAR_VSEP_NORMAL;
1103  /* Resize background if the window is too small.
1104  * Never make the window smaller to avoid oscillating if the size change affects the acceptance.
1105  * (This is the case, if making the window bigger moves the mouse into the window.) */
1106  if (top > bottom) {
1107  ResizeWindow(this, 0, top - bottom, false);
1108  }
1109  }
1110 
1111  void UpdateWidgetSize(int widget, Dimension *size, const Dimension &padding, Dimension *fill, Dimension *resize) override
1112  {
1113  if (!IsInsideMM(widget, WID_BROS_STATION_NE, WID_BROS_STATION_Y + 1)) return;
1114 
1115  size->width = ScaleGUITrad(64) + 2;
1116  size->height = ScaleGUITrad(48) + 2;
1117  }
1118 
1119  void DrawWidget(const Rect &r, int widget) const override
1120  {
1121  if (!IsInsideMM(widget, WID_BROS_STATION_NE, WID_BROS_STATION_Y + 1)) return;
1122 
1123  StationType st = (this->window_class == WC_BUS_STATION) ? STATION_BUS : STATION_TRUCK;
1124  StationPickerDrawSprite(r.left + 1 + ScaleGUITrad(31), r.bottom - ScaleGUITrad(31), st, INVALID_RAILTYPE, _cur_roadtype, widget - WID_BROS_STATION_NE);
1125  }
1126 
1127  void OnClick(Point pt, int widget, int click_count) override
1128  {
1129  switch (widget) {
1130  case WID_BROS_STATION_NE:
1131  case WID_BROS_STATION_SE:
1132  case WID_BROS_STATION_SW:
1133  case WID_BROS_STATION_NW:
1134  case WID_BROS_STATION_X:
1135  case WID_BROS_STATION_Y:
1136  this->RaiseWidget(_road_station_picker_orientation + WID_BROS_STATION_NE);
1137  _road_station_picker_orientation = (DiagDirection)(widget - WID_BROS_STATION_NE);
1138  this->LowerWidget(_road_station_picker_orientation + WID_BROS_STATION_NE);
1139  if (_settings_client.sound.click_beep) SndPlayFx(SND_15_BEEP);
1140  this->SetDirty();
1142  break;
1143 
1144  case WID_BROS_LT_OFF:
1145  case WID_BROS_LT_ON:
1149  if (_settings_client.sound.click_beep) SndPlayFx(SND_15_BEEP);
1150  this->SetDirty();
1151  break;
1152 
1153  default:
1154  break;
1155  }
1156  }
1157 
1158  void OnRealtimeTick(uint delta_ms) override
1159  {
1161  }
1162 };
1163 
1167  NWidget(WWT_CLOSEBOX, COLOUR_DARK_GREEN),
1168  NWidget(WWT_CAPTION, COLOUR_DARK_GREEN, WID_BROS_CAPTION),
1169  EndContainer(),
1170  NWidget(WWT_PANEL, COLOUR_DARK_GREEN, WID_BROS_BACKGROUND),
1172  NWidget(NWID_HORIZONTAL), SetPIP(0, 2, 0),
1173  NWidget(NWID_SPACER), SetFill(1, 0),
1174  NWidget(WWT_PANEL, COLOUR_GREY, WID_BROS_STATION_NW), SetMinimalSize(66, 50), SetFill(0, 0), EndContainer(),
1175  NWidget(WWT_PANEL, COLOUR_GREY, WID_BROS_STATION_NE), SetMinimalSize(66, 50), SetFill(0, 0), EndContainer(),
1176  NWidget(WWT_PANEL, COLOUR_GREY, WID_BROS_STATION_X), SetMinimalSize(66, 50), SetFill(0, 0), EndContainer(),
1177  NWidget(NWID_SPACER), SetFill(1, 0),
1178  EndContainer(),
1180  NWidget(NWID_HORIZONTAL), SetPIP(0, 2, 0),
1181  NWidget(NWID_SPACER), SetFill(1, 0),
1182  NWidget(WWT_PANEL, COLOUR_GREY, WID_BROS_STATION_SW), SetMinimalSize(66, 50), SetFill(0, 0), EndContainer(),
1183  NWidget(WWT_PANEL, COLOUR_GREY, WID_BROS_STATION_SE), SetMinimalSize(66, 50), SetFill(0, 0), EndContainer(),
1184  NWidget(WWT_PANEL, COLOUR_GREY, WID_BROS_STATION_Y), SetMinimalSize(66, 50), SetFill(0, 0), EndContainer(),
1185  NWidget(NWID_SPACER), SetFill(1, 0),
1186  EndContainer(),
1188  NWidget(NWID_HORIZONTAL), SetPIP(2, 0, 2),
1189  NWidget(WWT_LABEL, COLOUR_DARK_GREEN, WID_BROS_INFO), SetMinimalSize(140, 14), SetDataTip(STR_STATION_BUILD_COVERAGE_AREA_TITLE, STR_NULL),
1190  NWidget(NWID_SPACER), SetFill(1, 0),
1191  EndContainer(),
1192  NWidget(NWID_HORIZONTAL), SetPIP(2, 0, 2),
1193  NWidget(NWID_SPACER), SetFill(1, 0),
1194  NWidget(WWT_TEXTBTN, COLOUR_GREY, WID_BROS_LT_OFF), SetMinimalSize(60, 12),
1195  SetDataTip(STR_STATION_BUILD_COVERAGE_OFF, STR_STATION_BUILD_COVERAGE_AREA_OFF_TOOLTIP),
1196  NWidget(WWT_TEXTBTN, COLOUR_GREY, WID_BROS_LT_ON), SetMinimalSize(60, 12),
1197  SetDataTip(STR_STATION_BUILD_COVERAGE_ON, STR_STATION_BUILD_COVERAGE_AREA_ON_TOOLTIP),
1198  NWidget(NWID_SPACER), SetFill(1, 0),
1199  EndContainer(),
1200  NWidget(NWID_SPACER), SetMinimalSize(0, 10), SetResize(0, 1),
1201  EndContainer(),
1202 };
1203 
1204 static WindowDesc _road_station_picker_desc(
1205  WDP_AUTO, nullptr, 0, 0,
1208  _nested_road_station_picker_widgets, lengthof(_nested_road_station_picker_widgets)
1209 );
1210 
1214  NWidget(WWT_CLOSEBOX, COLOUR_DARK_GREEN),
1215  NWidget(WWT_CAPTION, COLOUR_DARK_GREEN, WID_BROS_CAPTION),
1216  EndContainer(),
1217  NWidget(WWT_PANEL, COLOUR_DARK_GREEN, WID_BROS_BACKGROUND),
1219  NWidget(NWID_HORIZONTAL), SetPIP(0, 2, 0),
1220  NWidget(NWID_SPACER), SetFill(1, 0),
1221  NWidget(WWT_PANEL, COLOUR_GREY, WID_BROS_STATION_X), SetMinimalSize(66, 50), SetFill(0, 0), EndContainer(),
1222  NWidget(WWT_PANEL, COLOUR_GREY, WID_BROS_STATION_Y), SetMinimalSize(66, 50), SetFill(0, 0), EndContainer(),
1223  NWidget(NWID_SPACER), SetFill(1, 0),
1224  EndContainer(),
1226  NWidget(NWID_HORIZONTAL), SetPIP(2, 0, 2),
1227  NWidget(WWT_LABEL, COLOUR_DARK_GREEN, WID_BROS_INFO), SetMinimalSize(140, 14), SetDataTip(STR_STATION_BUILD_COVERAGE_AREA_TITLE, STR_NULL),
1228  NWidget(NWID_SPACER), SetFill(1, 0),
1229  EndContainer(),
1230  NWidget(NWID_HORIZONTAL), SetPIP(2, 0, 2),
1231  NWidget(NWID_SPACER), SetFill(1, 0),
1232  NWidget(WWT_TEXTBTN, COLOUR_GREY, WID_BROS_LT_OFF), SetMinimalSize(60, 12),
1233  SetDataTip(STR_STATION_BUILD_COVERAGE_OFF, STR_STATION_BUILD_COVERAGE_AREA_OFF_TOOLTIP),
1234  NWidget(WWT_TEXTBTN, COLOUR_GREY, WID_BROS_LT_ON), SetMinimalSize(60, 12),
1235  SetDataTip(STR_STATION_BUILD_COVERAGE_ON, STR_STATION_BUILD_COVERAGE_AREA_ON_TOOLTIP),
1236  NWidget(NWID_SPACER), SetFill(1, 0),
1237  EndContainer(),
1238  NWidget(NWID_SPACER), SetMinimalSize(0, 10), SetResize(0, 1),
1239  EndContainer(),
1240 };
1241 
1242 static WindowDesc _tram_station_picker_desc(
1243  WDP_AUTO, nullptr, 0, 0,
1246  _nested_tram_station_picker_widgets, lengthof(_nested_tram_station_picker_widgets)
1247 );
1248 
1249 static void ShowRVStationPicker(Window *parent, RoadStopType rs)
1250 {
1251  new BuildRoadStationWindow(RoadTypeIsRoad(_cur_roadtype) ? &_road_station_picker_desc : &_tram_station_picker_desc, parent, rs);
1252 }
1253 
1254 void InitializeRoadGui()
1255 {
1256  _road_depot_orientation = DIAGDIR_NW;
1257  _road_station_picker_orientation = DIAGDIR_NW;
1258 }
1259 
1264 {
1266  if (w != nullptr) w->ModifyRoadType(_cur_roadtype);
1267 }
1268 
1269 DropDownList GetRoadTypeDropDownList(RoadTramTypes rtts, bool for_replacement, bool all_option)
1270 {
1271  RoadTypes used_roadtypes;
1272  RoadTypes avail_roadtypes;
1273 
1274  const Company *c = Company::Get(_local_company);
1275 
1276  /* Find the used roadtypes. */
1277  if (for_replacement) {
1278  avail_roadtypes = GetCompanyRoadTypes(c->index, false);
1279  used_roadtypes = GetRoadTypes(false);
1280  } else {
1281  avail_roadtypes = c->avail_roadtypes;
1282  used_roadtypes = GetRoadTypes(true);
1283  }
1284 
1285  /* Filter listed road types */
1286  if (!HasBit(rtts, RTT_ROAD)) used_roadtypes &= _roadtypes_type;
1287  if (!HasBit(rtts, RTT_TRAM)) used_roadtypes &= ~_roadtypes_type;
1288 
1289  DropDownList list;
1290 
1291  if (all_option) {
1292  list.emplace_back(new DropDownListStringItem(STR_REPLACE_ALL_ROADTYPE, INVALID_ROADTYPE, false));
1293  }
1294 
1295  Dimension d = { 0, 0 };
1296  RoadType rt;
1297  /* Get largest icon size, to ensure text is aligned on each menu item. */
1298  if (!for_replacement) {
1300  if (!HasBit(used_roadtypes, rt)) continue;
1301  const RoadTypeInfo *rti = GetRoadTypeInfo(rt);
1303  }
1304  }
1305 
1307  /* If it's not used ever, don't show it to the user. */
1308  if (!HasBit(used_roadtypes, rt)) continue;
1309 
1310  const RoadTypeInfo *rti = GetRoadTypeInfo(rt);
1311 
1313  if (for_replacement) {
1314  item = new DropDownListParamStringItem(rti->strings.replace_text, rt, !HasBit(avail_roadtypes, rt));
1315  } else {
1316  StringID str = rti->max_speed > 0 ? STR_TOOLBAR_RAILTYPE_VELOCITY : STR_JUST_STRING;
1317  DropDownListIconItem *iconitem = new DropDownListIconItem(rti->gui_sprites.build_x_road, PAL_NONE, str, rt, !HasBit(avail_roadtypes, rt));
1318  iconitem->SetDimension(d);
1319  item = iconitem;
1320  }
1321  item->SetParam(0, rti->strings.menu_text);
1322  item->SetParam(1, rti->max_speed / 2);
1323  list.emplace_back(item);
1324  }
1325 
1326  if (list.size() == 0) {
1327  /* Empty dropdowns are not allowed */
1328  list.emplace_back(new DropDownListStringItem(STR_NONE, INVALID_ROADTYPE, true));
1329  }
1330 
1331  return list;
1332 }
1333 
1334 DropDownList GetScenRoadTypeDropDownList(RoadTramTypes rtts)
1335 {
1336  RoadTypes avail_roadtypes = GetRoadTypes(false);
1337  avail_roadtypes = AddDateIntroducedRoadTypes(avail_roadtypes, _date);
1338  RoadTypes used_roadtypes = GetRoadTypes(true);
1339 
1340  /* Filter listed road types */
1341  if (!HasBit(rtts, RTT_ROAD)) used_roadtypes &= _roadtypes_type;
1342  if (!HasBit(rtts, RTT_TRAM)) used_roadtypes &= ~_roadtypes_type;
1343 
1344  DropDownList list;
1345 
1346  /* If it's not used ever, don't show it to the user. */
1347  Dimension d = { 0, 0 };
1348  RoadType rt;
1350  if (!HasBit(used_roadtypes, rt)) continue;
1351  const RoadTypeInfo *rti = GetRoadTypeInfo(rt);
1353  }
1355  if (!HasBit(used_roadtypes, rt)) continue;
1356 
1357  const RoadTypeInfo *rti = GetRoadTypeInfo(rt);
1358 
1359  StringID str = rti->max_speed > 0 ? STR_TOOLBAR_RAILTYPE_VELOCITY : STR_JUST_STRING;
1360  DropDownListIconItem *item = new DropDownListIconItem(rti->gui_sprites.build_x_road, PAL_NONE, str, rt, !HasBit(avail_roadtypes, rt));
1361  item->SetDimension(d);
1362  item->SetParam(0, rti->strings.menu_text);
1363  item->SetParam(1, rti->max_speed);
1364  list.emplace_back(item);
1365  }
1366 
1367  if (list.size() == 0) {
1368  /* Empty dropdowns are not allowed */
1369  list.emplace_back(new DropDownListStringItem(STR_NONE, -1, true));
1370  }
1371 
1372  return list;
1373 }
EventState
State of handling an event.
Definition: window_type.h:713
Functions related to OTTD&#39;s strings.
ViewportDragDropSelectionProcess
Drag and drop selection process, or, what to do with an area of land when you&#39;ve selected it...
Definition: viewport_type.h:97
static EventState RoadTramToolbarGlobalHotkeys(int hotkey, RoadType last_build)
Handler for global hotkeys of the BuildRoadToolbarWindow.
Definition: road_gui.cpp:722
don&#39;t allow building on structures
Definition: command_type.h:347
DECLARE_ENUM_AS_BIT_SET(GenderEthnicity) enum CompanyManagerFaceVariable
Bitgroups of the CompanyManagerFace variable.
Window * ShowBuildRoadScenToolbar(RoadType roadtype)
Show the road building toolbar in the scenario editor.
Definition: road_gui.cpp:956
GameSettings _settings_game
Game settings of a running game or the scenario editor.
Definition: settings.cpp:81
int last_started_action
Last started user action.
Definition: road_gui.cpp:275
Definition of stuff that is very close to a company, like the company struct itself.
static void PlaceRoad_Bridge(TileIndex tile, Window *w)
Callback to start placing a bridge.
Definition: road_gui.cpp:80
Caption of the window.
Definition: road_widget.h:18
uint32 widget_data
Data of the widget.
Definition: widget_type.h:305
Select station (when joining stations); Window numbers:
Definition: window_type.h:237
A standard stop for trucks.
Definition: station_type.h:48
bool link_terraform_toolbar
display terraform toolbar when displaying rail, road, water and airport toolbars
Definition: settings_type.h:96
ResizeInfo resize
Resize information.
Definition: window_gui.h:324
virtual EventState OnHotkey(int hotkey)
A hotkey has been pressed.
Definition: window.cpp:594
Demolish.
Definition: road_widget.h:22
static NWidgetPart SetResize(int16 dx, int16 dy)
Widget part function for setting the resize step.
Definition: widget_type.h:930
void CheckRedrawStationCoverage(const Window *w)
Check whether we need to redraw the station coverage text.
void SetWidgetDisabledState(byte widget_index, bool disab_stat)
Sets the enabled/disabled status of a widget.
Definition: window_gui.h:394
Point pos
Location, in tile "units", of the northern tile of the selected area.
Terminal station with NE entry.
Definition: road_widget.h:48
area of land of limited size
Definition: viewport_type.h:83
void SetWidgetLoweredState(byte widget_index, bool lowered_stat)
Sets the lowered/raised status of a widget.
Definition: window_gui.h:455
RoadTypes _roadtypes_type
Bitmap of road/tram types.
Definition: road_cmd.cpp:59
Window * parent
Parent window.
Definition: window_gui.h:339
All data for a single hotkey.
Definition: hotkeys.h:24
High level window description.
Definition: window_gui.h:168
Road stop placement (trucks)
Build depot.
Definition: road_widget.h:23
build a complete road (not a "half" one)
Definition: command_type.h:201
static const CursorID ANIMCURSOR_DEMOLISH
704 - 707 - demolish dynamite
Definition: sprites.h:1487
CursorID autoroad
Cursor for autorail tool.
Definition: road.h:95
Landscape generation (in Scenario Editor); Window numbers:
Definition: window_type.h:444
void ConnectRoadToStructure(TileIndex tile, DiagDirection direction)
If required, connects a new structure to an existing road or tram by building the missing roadbit...
Definition: road_gui.cpp:123
void DrawWidgets() const
Paint all widgets of a window.
Definition: widget.cpp:604
bool station_show_coverage
whether to highlight coverage area
CursorID depot
Cursor for building a depot.
Definition: road.h:96
static Titem * Get(size_t index)
Returns Titem with given index.
Definition: pool_type.hpp:246
Scenario build toolbar; Window numbers:
Definition: window_type.h:75
SpriteID build_depot
button for building depots
Definition: road.h:87
static bool IsBridgeTile(TileIndex t)
checks if there is a bridge on this tile
Definition: bridge_map.h:37
Hotkey related functions.
Functions related to dates.
RoadTypes
The different roadtypes we support, but then a bitmask of them.
Definition: road_type.h:41
Terminal station with NW entry.
Definition: road_widget.h:51
Centered label.
Definition: widget_type.h:57
Northwest.
void ShowSelectStationIfNeeded(const CommandContainer &cmd, TileArea ta)
Show the station selection window when needed.
Contains enums and function declarations connected with stations GUI.
remove a complete road (not a "half" one)
Definition: command_type.h:202
#define FOR_ALL_SORTED_ROADTYPES(var)
Loop header for iterating over roadtypes, sorted by sortorder.
Definition: road.h:314
Window * ShowTerraformToolbar(Window *link)
Show the toolbar for terraforming in the game.
void SetWidgetDirty(byte widget_index) const
Invalidate a widget, i.e.
Definition: window.cpp:581
Road stop removal (trucks)
Normal amount of vertical space between two paragraphs of text.
Definition: window_gui.h:139
Used for iterations.
static T SetBit(T &x, const uint8 y)
Set a bit in a variable.
Draw only passenger class cargoes.
Definition: station_gui.h:22
Horizontal container.
Definition: widget_type.h:75
Functions/types related to the road GUIs.
Window * FindWindowById(WindowClass cls, WindowNumber number)
Find a window by its class and window number.
Definition: window.cpp:1114
The passed event is not handled.
Definition: window_type.h:715
void SetTileSelectSize(int w, int h)
Highlight w by h tiles at the cursor.
Definition: viewport.cpp:2444
void CDECL SetWidgetsDisabledState(bool disab_stat, int widgets,...)
Sets the enabled/disabled status of a list of widgets.
Definition: window.cpp:520
drag only in X axis
Definition: viewport_type.h:80
static int ScaleGUITrad(int value)
Scale traditional pixel dimensions to GUI zoom level.
Definition: zoom_func.h:78
Turn on area highlight.
Definition: road_widget.h:55
StringID toolbar_caption
Caption in the construction toolbar GUI for this rail type.
Definition: road.h:103
Autorail.
Definition: road_widget.h:21
Drag only in X axis with limited size.
Definition: viewport_type.h:86
Flag for invalid railtype.
Definition: rail_type.h:36
RoadTypes GetCompanyRoadTypes(CompanyID company, bool introduces)
Get the road types the given company can build.
Definition: road.cpp:190
Used for iterations.
Definition: road_type.h:31
Point size
Size, in tile "units", of the white/red selection area.
void SetStringParameters(int widget) const override
Initialize string parameters for a widget.
Definition: road_gui.cpp:357
Window * ShowBuildRoadToolbar(RoadType roadtype)
Open the build road toolbar window.
Definition: road_gui.cpp:869
drag only in Y axis
Definition: viewport_type.h:81
Drag only in Y axis with limited size.
Definition: viewport_type.h:87
Functions related to vehicles.
Turn off area highlight.
Definition: road_widget.h:54
Drive-through station in y-direction.
Definition: road_widget.h:53
SpriteID build_x_road
button for building single rail in X direction
Definition: road.h:84
SpriteID build_tunnel
button for building a tunnel
Definition: road.h:88
A standard stop for buses.
Definition: station_type.h:47
int top
y position of top edge of the window
Definition: window_gui.h:320
void DrawRoadDepotSprite(int x, int y, DiagDirection dir, RoadType rt)
Draw the road depot sprite.
Definition: road_cmd.cpp:1786
byte station_spread
amount a station may spread
Build depot; Window numbers:
Definition: window_type.h:412
void ToggleWidgetLoweredState(byte widget_index)
Invert the lowered/raised status of a widget.
Definition: window_gui.h:465
void OnClick(Point pt, int widget, int click_count) override
A click with the left mouse button has been made on the window.
Definition: road_gui.cpp:424
void OnInvalidateData(int data=0, bool gui_scope=true) override
Some data on this window has become invalid.
Definition: road_gui.cpp:305
Tindex index
Index of this pool item.
Definition: pool_type.hpp:147
flag for invalid roadtype
Definition: road_type.h:32
Close box (at top-left of a window)
Definition: widget_type.h:69
void VpSetPresizeRange(TileIndex from, TileIndex to)
Highlights all tiles between a set of two tiles.
Definition: viewport.cpp:2669
Build bridge.
Definition: road_widget.h:27
build a "half" road
Definition: command_type.h:203
Road stop removal (buses)
Caption of the window.
Definition: road_widget.h:46
void ReInit(int rx=0, int ry=0)
Re-initialize a window, and optionally change its size.
Definition: window.cpp:979
Build road in x-direction.
Definition: road_widget.h:19
const RoadTypeInfo * rti
Information about current road type.
Definition: road_gui.cpp:274
void DisableWidget(byte widget_index)
Sets a widget to disabled.
Definition: window_gui.h:404
Station acceptance info.
Definition: road_widget.h:56
bool persistent_buildingtools
keep the building tools active after usage
Common return value for all commands.
Definition: command_type.h:25
Catchment for bus stops with "modified catchment" enabled.
Definition: station_type.h:79
RoadType
The different roadtypes we support.
Definition: road_type.h:27
StringID err_convert_road
Converting a road type.
Definition: road.h:114
void RaiseWidget(byte widget_index)
Marks a widget as raised.
Definition: window_gui.h:485
Common string list item.
Definition: dropdown_type.h:41
uint16 w
The width of the area.
Definition: tilearea_type.h:20
void CreateNestedTree(bool fill_nested=true)
Perform the first part of the initialization of a nested widget tree.
Definition: window.cpp:1812
StationSettings station
settings related to station management
void UpdateOptionWidgetStatus(RoadToolbarWidgets clicked_widget)
Update the remove button lowered state of the road toolbar.
Definition: road_gui.cpp:375
RoadStopType
Types of RoadStops.
Definition: station_type.h:46
RoadToolbarWidgets
Widgets of the BuildRoadToolbarWindow class.
Definition: road_widget.h:16
static T SB(T &x, const uint8 s, const uint8 n, const U d)
Set n bits in x starting at bit s to d.
Functions, definitions and such used only by the GUI.
static void ToggleRoadButton_Remove(Window *w)
Toggles state of the Remove button of Build road toolbar.
Definition: road_gui.cpp:243
Terminal station with SE entry.
Definition: road_widget.h:49
Partial widget specification to allow NWidgets to be written nested.
Definition: widget_type.h:910
Functions related to (drawing on) viewports.
StringID replace_text
Text used in the autoreplace GUI.
Definition: road.h:106
Data structure for an opened window.
Definition: window_gui.h:278
Clear area.
Definition: viewport_type.h:98
Depot with NE entry.
Definition: road_widget.h:37
bool _ctrl_pressed
Is Ctrl pressed?
Definition: gfx.cpp:37
Road placement (X axis)
void FinishInitNested(WindowNumber window_number=0)
Perform the second part of the initialization of a nested widget tree.
Definition: window.cpp:1828
static bool IsInsideMM(const T x, const size_t min, const size_t max)
Checks if a value is in an interval.
Definition: math_func.hpp:266
void InitNested(WindowNumber number=0)
Perform complete initialization of the Window with nested widgets, to allow use.
Definition: window.cpp:1841
void OnPlaceObjectAbort() override
The user cancelled a tile highlight mode that has been set.
Definition: road_gui.cpp:573
static const RoadTypeInfo * GetRoadTypeInfo(RoadType roadtype)
Returns a pointer to the Roadtype information for a given roadtype.
Definition: road.h:226
static RoadBits DiagDirToRoadBits(DiagDirection d)
Create the road-part which belongs to the given DiagDirection.
Definition: road_func.h:98
Build truck station.
Definition: road_widget.h:25
static TileIndexDiff TileOffsByDiagDir(DiagDirection dir)
Convert a DiagDirection to a TileIndexDiff.
Definition: map_func.h:343
bool ValParamRoadType(RoadType roadtype)
Validate functions for rail building.
Definition: road.cpp:144
Invisible widget that takes some space.
Definition: widget_type.h:79
EventState OnCTRLStateChange() override
The state of the control key has changed.
Definition: road_gui.cpp:706
static const NWidgetPart _nested_road_station_picker_widgets[]
Widget definition of the build road station window.
Definition: road_gui.cpp:1165
TileIndex tile
Tile index.
Definition: tile_cmd.h:48
int DrawStationCoverageAreaText(int left, int right, int top, StationCoverageType sct, int rad, bool supplies)
Calculates and draws the accepted or supplied cargo around the selected tile(s)
Definition: station_gui.cpp:56
CommandCost DoCommand(const CommandContainer *container, DoCommandFlag flags)
Shorthand for calling the long DoCommand with a container.
Definition: command.cpp:443
StringID err_remove_station[2]
Removing of a bus or truck station.
Definition: road.h:113
static RoadBits GetRoadBits(TileIndex t, RoadTramType rtt)
Get the present road bits for a specific road type.
Definition: road_map.h:129
This window is used for construction; close it whenever changing company.
Definition: window_gui.h:210
Road toolbar window handler.
Definition: road_gui.cpp:272
bool IsWidgetLowered(byte widget_index) const
Gets the lowered state of a widget.
Definition: window_gui.h:495
List item with icon and string.
Definition: dropdown_type.h:83
StringID picker_tooltip[2]
Tooltip for the station picker for bus or truck stations.
Definition: road.h:117
RoadTypes AddDateIntroducedRoadTypes(RoadTypes current, Date date)
Add the road types that are to be introduced at the given date.
Definition: road.cpp:157
SoundSettings sound
sound effect settings
Header file for things common for tunnels and bridges.
void SetRedErrorSquare(TileIndex tile)
Set a tile to display a red error square.
Definition: viewport.cpp:2426
StringID picker_title[2]
Title for the station picker for bus or truck stations.
Definition: road.h:116
Depot with SE entry.
Definition: road_widget.h:38
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: road_gui.cpp:700
uint current_y
Current vertical size (after resizing).
Definition: widget_type.h:175
ViewportPlaceMethod
Viewport place method (type of highlighted area and placed objects)
Definition: viewport_type.h:78
void InitializeRoadGUI()
I really don&#39;t know why rail_gui.cpp has this too, shouldn&#39;t be included in the other one...
Definition: road_gui.cpp:1263
static DiagDirection ReverseDiagDir(DiagDirection d)
Returns the reverse direction of the given DiagDirection.
void RaiseButtons(bool autoraise=false)
Raise the buttons of the window.
Definition: window.cpp:557
Structure for buffering the build command when selecting a station to join.
Definition: command_type.h:477
static NWidgetPart SetDataTip(uint32 data, StringID tip)
Widget part function for setting the data and tooltip.
Definition: widget_type.h:1014
build a tunnel
Definition: command_type.h:190
drag in X or Y direction
Definition: viewport_type.h:79
ClientSettings _settings_client
The current settings for this game.
Definition: settings.cpp:80
void OnClick(Point pt, int widget, int click_count) override
A click with the left mouse button has been made on the window.
Definition: road_gui.cpp:1127
static NWidgetPart SetMinimalSize(int16 x, int16 y)
Widget part function for setting the minimal size.
Definition: widget_type.h:947
bool Succeeded() const
Did this command succeed?
Definition: command_type.h:152
StationCoverageType
Types of cargo to display for station coverage.
Definition: station_gui.h:21
#define TILE_AREA_LOOP(var, ta)
A loop which iterates over the tiles of a TileArea.
Definition of base types and functions in a cross-platform compatible way.
A number of safeguards to prevent using unsafe methods.
List of hotkeys for a window.
Definition: hotkeys.h:42
Geometry functions.
rectangle (stations, depots, ...)
Depot with SW entry.
Definition: road_widget.h:39
Simple depressed panel.
Definition: widget_type.h:50
Road stop placement (buses)
void DrawWidget(const Rect &r, int widget) const override
Draw the contents of a nested widget.
Definition: road_gui.cpp:986
Build one-way road.
Definition: road_widget.h:26
void UpdateWidgetSize(int widget, Dimension *size, const Dimension &padding, Dimension *fill, Dimension *resize) override
Update size and resize step of a widget in the window.
Definition: road_gui.cpp:978
bool IsWidgetDisabled(byte widget_index) const
Gets the enabled/disabled status of a widget.
Definition: window_gui.h:423
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: road_gui.cpp:593
void ModifyRoadType(RoadType roadtype)
Switch to another road type.
Definition: road_gui.cpp:350
StringID menu_text
Name of this rail type in the main toolbar dropdown.
Definition: road.h:104
No road-part is build.
Definition: road_type.h:56
Represents the covered area of e.g.
Definition: tilearea_type.h:18
void DrawWidget(const Rect &r, int widget) const override
Draw the contents of a nested widget.
Definition: road_gui.cpp:1119
int pos_x
Horizontal position of top-left corner of the widget in the window.
Definition: widget_type.h:177
void LowerWidget(byte widget_index)
Marks a widget as lowered.
Definition: window_gui.h:476
void CcBuildRoadTunnel(const CommandCost &result, TileIndex start_tile, uint32 p1, uint32 p2, uint32 cmd)
Callback executed after a build road tunnel command has been called.
Definition: road_gui.cpp:101
void SetViewportCatchmentStation(const Station *st, bool sel)
Select or deselect station for coverage area highlight.
Definition: viewport.cpp:3475
GUI stuff related to terraforming.
void SetupRoadToolbar()
Configures the road toolbar for roadtype given.
Definition: road_gui.cpp:334
uint16 max_speed
Maximum speed for vehicles travelling on this road type.
Definition: road.h:141
static NWidgetPart NWidget(WidgetType tp, Colours col, int16 idx=-1)
Widget part function for starting a new &#39;real&#39; widget.
Definition: widget_type.h:1114
void MarkTileDirtyByTile(TileIndex tile, int bridge_level_offset, int tile_height_override)
Mark a tile given by its index dirty for repaint.
Definition: viewport.cpp:1940
TileIndex _build_tunnel_endtile
The end of a tunnel; as hidden return from the tunnel build command for GUI purposes.
Baseclass for nested widgets.
Definition: widget_type.h:126
StringID err_remove_road
Removing a normal piece of road.
Definition: road.h:110
struct RoadTypeInfo::@42 strings
Strings associated with the rail type.
Functions related to stations.
bool DoCommandP(const CommandContainer *container, bool my_cmd)
Shortcut for the long DoCommandP when having a container with the data.
Definition: command.cpp:534
void VpStartPlaceSizing(TileIndex tile, ViewportPlaceMethod method, ViewportDragDropSelectionProcess process)
highlighting tiles while only going over them with the mouse
Definition: viewport.cpp:2626
Catchment for truck stops with "modified catchment" enabled.
Definition: station_type.h:80
Catchment for all stations with "modified catchment" disabled.
Definition: station_type.h:84
#define lengthof(x)
Return the length of an fixed size array.
Definition: depend.cpp:42
void ShowBuildBridgeWindow(TileIndex start, TileIndex end, TransportType transport_type, byte road_rail_type)
Prepare the data for the build a bridge window.
Definition: bridge_gui.cpp:363
Build bridge; Window numbers:
Definition: window_type.h:384
EventState OnHotkey(int hotkey) override
A hotkey has been pressed.
Definition: road_gui.cpp:509
void PlaceProc_DemolishArea(TileIndex tile)
Start a drag for demolishing an area.
Bridge placement.
struct RoadTypeInfo::@40 gui_sprites
struct containing the sprites for the road GUI.
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: road_gui.cpp:636
Also allow &#39;diagonal rectangles&#39;. Only usable in combination with HT_RECT or HT_POINT.
Functions related to sound.
static DiagDirection GetTunnelBridgeDirection(TileIndex t)
Get the direction pointing to the other end.
build a road depot
Definition: command_type.h:204
uint32 StringID
Numeric value that represents a string, independent of the selected language.
Definition: strings_type.h:18
bool GUIPlaceProcDragXY(ViewportDragDropSelectionProcess proc, TileIndex start_tile, TileIndex end_tile)
A central place to handle all X_AND_Y dragged GUI functions.
void DeleteWindowByClass(WindowClass cls)
Delete all windows of a given class.
Definition: window.cpp:1159
bool Failed() const
Did this command fail?
Definition: command_type.h:161
void VpSelectTilesWithMethod(int x, int y, ViewportPlaceMethod method)
Selects tiles while dragging.
Definition: viewport.cpp:3099
Road placement (auto)
RoadType roadtype
Road type to build.
Definition: road_gui.cpp:273
static const int WIDGET_LIST_END
indicate the end of widgets&#39; list for vararg functions
Definition: widget_type.h:22
bool CanBuildVehicleInfrastructure(VehicleType type, byte subtype)
Check whether we can build infrastructure for the given vehicle type.
Definition: vehicle.cpp:1760
void OnPlaceObject(Point pt, TileIndex tile) override
The user clicked some place on the map when a tile highlight mode has been set.
Definition: road_gui.cpp:515
void SetDirty() const
Mark entire window as dirty (in need of re-paint)
Definition: window.cpp:968
Build toolbar; Window numbers:
Definition: window_type.h:68
Road related functions.
TileIndex tile
The base tile of the area.
Definition: tilearea_type.h:19
Types related to the road widgets.
CursorID road_nwse
Cursor for building rail in Y direction.
Definition: road.h:94
Dimension maxdim(const Dimension &d1, const Dimension &d2)
Compute bounding box of both dimensions.
The X axis.
No window, redirects to WC_MAIN_WINDOW.
Definition: window_type.h:40
void DeleteWindowById(WindowClass cls, WindowNumber number, bool force)
Delete a window by its class and window number (if it is open).
Definition: window.cpp:1146
static Axis DiagDirToAxis(DiagDirection d)
Convert a DiagDirection to the axis.
StringID err_depot
Building a depot.
Definition: road.h:111
static TileIndex GetOtherTunnelBridgeEnd(TileIndex t)
Determines type of the wormhole and returns its other end.
Functions related to companies.
Convert road.
Definition: road_widget.h:30
build a road stop
Definition: command_type.h:199
static TileIndex TileVirtXY(uint x, uint y)
Get a tile from the virtual XY-coordinate.
Definition: map_func.h:196
static bool _remove_button_clicked
Flag whether &#39;remove&#39; toggle-button is currently enabled.
Definition: rail_gui.cpp:47
StationType
Station types.
Definition: station_type.h:34
Base class for engines.
Build road in y-direction.
Definition: road_widget.h:20
area of land in X and Y directions
Definition: viewport_type.h:82
static bool IsNormalRoadTile(TileIndex t)
Return whether a tile is a normal road tile.
Definition: road_map.h:75
GUISettings gui
settings related to the GUI
Align toward the toolbar.
Definition: window_gui.h:158
Window caption (window title between closebox and stickybox)
Definition: widget_type.h:61
static void PlaceRoad_BusStation(TileIndex tile)
Callback for placing a bus station.
Definition: road_gui.cpp:205
uint32 TileIndex
The index/ID of a Tile.
Definition: tile_type.h:80
bool HandlePlacePushButton(Window *w, int widget, CursorID cursor, HighLightStyle mode)
This code is shared for the majority of the pushbuttons.
Definition: main_gui.cpp:100
Draw all non-passenger class cargoes.
Definition: station_gui.h:23
CursorID road_swne
Cursor for building rail in X direction.
Definition: road.h:93
bool modified_catchment
different-size catchment areas
Build bus station.
Definition: road_widget.h:24
Vertical container.
Definition: widget_type.h:77
RoadTypes avail_roadtypes
Road types available to this company.
Definition: company_base.h:123
void OnClick(Point pt, int widget, int click_count) override
A click with the left mouse button has been made on the window.
Definition: road_gui.cpp:993
Build truck station; Window numbers:
Definition: window_type.h:404
static NWidgetPart EndContainer()
Widget part function for denoting the end of a container (horizontal, vertical, WWT_FRAME, WWT_INSET, or WWT_PANEL).
Definition: widget_type.h:999
static uint GB(const T x, const uint8 s, const uint8 n)
Fetch n bits from x, started at bit s.
StringID err_build_road
Building a normal piece of road.
Definition: road.h:109
Functions related to zooming.
Drive-through station in x-direction.
Definition: road_widget.h:52
uint current_x
Current horizontal size (after resizing).
Definition: widget_type.h:174
Transport by road vehicle.
bool confirm
Play sound effect on successful constructions or other actions.
SpriteID build_y_road
button for building single rail in Y direction
Definition: road.h:85
Non-water non-rail construction.
Definition: sound_type.h:70
Functions related to commands.
Coordinates of a point in 2D.
Dimension GetSpriteSize(SpriteID sprid, Point *offset, ZoomLevel zoom)
Get the size of a sprite.
Definition: gfx.cpp:767
static bool IsValidID(size_t index)
Tests whether given index can be used to get valid (non-nullptr) Titem.
Definition: pool_type.hpp:235
CursorID tunnel
Cursor for building a tunnel.
Definition: road.h:97
special mode used for highlighting while dragging (and for tunnels/docks)
Functions that have tunnels and bridges in common.
Terminal station with SW entry.
Definition: road_widget.h:50
Build tunnel.
Definition: road_widget.h:28
Offset at right to draw the frame rectangular area.
Definition: window_gui.h:63
Road placement (Y axis)
Sticky box (at top-right of a window, after WWT_DEFSIZEBOX)
Definition: widget_type.h:66
static NWidgetPart SetFill(uint fill_x, uint fill_y)
Widget part function for setting filling.
Definition: widget_type.h:983
static bool HasBit(const T x, const uint8 y)
Checks if a bit in a value is set.
DiagDirection
Enumeration for diagonal directions.
Remove road.
Definition: road_widget.h:29
static void PlaceRoad_TruckStation(TileIndex tile)
Callback for placing a truck station.
Definition: road_gui.cpp:223
Northeast, upper right on your monitor.
#define CMD_MSG(x)
Used to combine a StringID with the command.
Definition: command_type.h:370
Build bus station; Window numbers:
Definition: window_type.h:398
int32 WindowNumber
Number to differentiate different windows of the same class.
Definition: window_type.h:707
WindowClass window_class
Window class.
Definition: window_gui.h:313
void ResetObjectToPlace()
Reset the cursor and mouse mode handling back to default (normal cursor, only clicking in windows)...
Definition: viewport.cpp:3374
Specification of a rectangle with absolute coordinates of all edges.
The passed event is handled.
Definition: window_type.h:714
WindowNumber window_number
Window number within the window class.
Definition: window_gui.h:314
Functions related to tile highlights.
Window functions not directly related to making/drawing windows.
Background of the window.
Definition: road_widget.h:47
Find a place automatically.
Definition: window_gui.h:156
static void PlaceRoadStop(TileIndex start_tile, TileIndex end_tile, uint32 p2, uint32 cmd)
Place a new road stop.
Definition: road_gui.cpp:185
(Toggle) Button with image
Definition: widget_type.h:52
void OnRealtimeTick(uint delta_ms) override
Called periodically.
Definition: road_gui.cpp:1158
String list item with parameters.
Definition: dropdown_type.h:58
void UpdateWidgetSize(int widget, Dimension *size, const Dimension &padding, Dimension *fill, Dimension *resize) override
Update size and resize step of a widget in the window.
Definition: road_gui.cpp:1111
GUI functions that shouldn&#39;t be here.
SpriteID auto_road
button for the autoroad construction
Definition: road.h:86
struct RoadTypeInfo::@41 cursor
Cursors associated with the road type.
SpriteID convert_road
button for converting road types
Definition: road.h:89
RoadTypes GetRoadTypes(bool introduces)
Get list of road types, regardless of company availability.
Definition: road.cpp:219
Date _date
Current date in days (day counter)
Definition: date.cpp:28
StringID err_build_station[2]
Building a bus or truck station.
Definition: road.h:112
uint16 h
The height of the area.
Definition: tilearea_type.h:21
static bool RoadToolbar_CtrlChanged(Window *w)
Updates the Remove button because of Ctrl state change.
Definition: road_gui.cpp:256
void CcRoadStop(const CommandCost &result, TileIndex tile, uint32 p1, uint32 p2, uint32 cmd)
Command callback for building road stops.
Definition: road_gui.cpp:160
void ResizeWindow(Window *w, int delta_x, int delta_y, bool clamp_to_screen)
Resize the window.
Definition: window.cpp:2126
RoadFlags
Define the values of the RoadFlags.
Definition: road_gui.cpp:53
CompanyID _local_company
Company controlled by the human player at this client. Can also be COMPANY_SPECTATOR.
Definition: company_cmd.cpp:46
Dimensions (a width and height) of a rectangle in 2D.
void OnPaint() override
The window must be repainted.
Definition: road_gui.cpp:1084
bool click_beep
Beep on a random selection of buttons.
Offset at left to draw the frame rectangular area.
Definition: window_gui.h:62
Depot with NW entry.
Definition: road_widget.h:40
remove a road stop
Definition: command_type.h:200
convert a road type
Definition: command_type.h:205
Road vehicle type.
Definition: vehicle_type.h:27
Horizontal container that doesn&#39;t change the order of the widgets for RTL languages.
Definition: widget_type.h:76
static NWidgetPart SetPIP(uint8 pre, uint8 inter, uint8 post)
Widget part function for setting a pre/inter/post spaces.
Definition: widget_type.h:1076
Base class for windows opened from a toolbar.
Definition: window_gui.h:856
static const NWidgetPart _nested_tram_station_picker_widgets[]
Widget definition of the build tram station window.
Definition: road_gui.cpp:1212
int pos_y
Vertical position of top-left corner of the widget in the window.
Definition: widget_type.h:178
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:789
(Toggle) Button with text
Definition: widget_type.h:55
Road conversion.
static void SetDParam(uint n, uint64 v)
Set a string parameter v at index n in the global string parameter array.
Definition: strings_func.h:201
Base class for a &#39;real&#39; widget.
Definition: widget_type.h:284
Caption of the window.
Definition: road_widget.h:36