00001
00002
00003
00004
00005
00006
00007
00008
00009
00012 #include "stdafx.h"
00013 #include "openttd.h"
00014 #include "terraform_gui.h"
00015 #include "window_gui.h"
00016 #include "station_gui.h"
00017 #include "command_func.h"
00018 #include "water.h"
00019 #include "water_map.h"
00020 #include "window_func.h"
00021 #include "vehicle_func.h"
00022 #include "sound_func.h"
00023 #include "viewport_func.h"
00024 #include "gfx_func.h"
00025 #include "company_func.h"
00026 #include "slope_func.h"
00027 #include "tilehighlight_func.h"
00028 #include "company_base.h"
00029 #include "station_type.h"
00030 #include "hotkeys.h"
00031 #include "bridge.h"
00032
00033 #include "table/sprites.h"
00034 #include "table/strings.h"
00035
00036 static void ShowBuildDockStationPicker(Window *parent);
00037 static void ShowBuildDocksDepotPicker(Window *parent);
00038
00039 static Axis _ship_depot_direction;
00040
00041 void CcBuildDocks(const CommandCost &result, TileIndex tile, uint32 p1, uint32 p2)
00042 {
00043 if (result.Failed()) return;
00044
00045 SndPlayTileFx(SND_02_SPLAT, tile);
00046 if (!_settings_client.gui.persistent_buildingtools) ResetObjectToPlace();
00047 }
00048
00049 void CcBuildCanal(const CommandCost &result, TileIndex tile, uint32 p1, uint32 p2)
00050 {
00051 if (result.Succeeded()) SndPlayTileFx(SND_02_SPLAT, tile);
00052 }
00053
00054
00061 static TileIndex GetOtherAqueductEnd(TileIndex tile_from, TileIndex *tile_to = NULL)
00062 {
00063 uint z;
00064 DiagDirection dir = GetInclinedSlopeDirection(GetTileSlope(tile_from, &z));
00065
00066
00067
00068
00069
00070 if (!IsValidDiagDirection(dir)) return TILE_ADDXY(tile_from, TileX(tile_from) > 2 ? -1 : 1, 0);
00071
00072
00073 TileIndexDiff offset = TileOffsByDiagDir(ReverseDiagDir(dir));
00074
00075 int max_length = min(_settings_game.construction.longbridges ? MAX_BRIDGE_LENGTH_LONGBRIDGES : MAX_BRIDGE_LENGTH, DistanceFromEdgeDir(tile_from, ReverseDiagDir(dir)) - 1);
00076
00077 TileIndex endtile = tile_from;
00078 for (int length = 0; IsValidTile(endtile) && TileX(endtile) != 0 && TileY(endtile) != 0; length++) {
00079 endtile = TILE_ADD(endtile, offset);
00080
00081 if (length > max_length) break;
00082
00083 if (GetTileMaxZ(endtile) > z) {
00084 if (tile_to != NULL) *tile_to = endtile;
00085 break;
00086 }
00087 }
00088
00089 return endtile;
00090 }
00091
00093 enum DockToolbarWidgets {
00094 DTW_BUTTONS_BEGIN,
00095 DTW_CANAL = DTW_BUTTONS_BEGIN,
00096 DTW_LOCK,
00097 DTW_DEMOLISH,
00098 DTW_DEPOT,
00099 DTW_STATION,
00100 DTW_BUOY,
00101 DTW_RIVER,
00102 DTW_BUILD_AQUEDUCT,
00103 DTW_END,
00104 };
00105
00107 struct BuildDocksToolbarWindow : Window {
00108 DockToolbarWidgets last_clicked_widget;
00109
00110 BuildDocksToolbarWindow(const WindowDesc *desc, WindowNumber window_number) : Window()
00111 {
00112 this->last_clicked_widget = DTW_END;
00113 this->InitNested(desc, window_number);
00114 this->OnInvalidateData();
00115 if (_settings_client.gui.link_terraform_toolbar) ShowTerraformToolbar(this);
00116 }
00117
00118 ~BuildDocksToolbarWindow()
00119 {
00120 if (_settings_client.gui.link_terraform_toolbar) DeleteWindowById(WC_SCEN_LAND_GEN, 0, false);
00121 }
00122
00123 void OnInvalidateData(int data = 0)
00124 {
00125 this->SetWidgetsDisabledState(!CanBuildVehicleInfrastructure(VEH_SHIP),
00126 DTW_DEPOT,
00127 DTW_STATION,
00128 DTW_BUOY,
00129 WIDGET_LIST_END);
00130 }
00131
00132 virtual void OnClick(Point pt, int widget, int click_count)
00133 {
00134 this->last_clicked_widget = (DockToolbarWidgets)widget;
00135 switch (widget) {
00136 case DTW_CANAL:
00137 HandlePlacePushButton(this, DTW_CANAL, SPR_CURSOR_CANAL, HT_RECT);
00138 break;
00139
00140 case DTW_LOCK:
00141 HandlePlacePushButton(this, DTW_LOCK, SPR_CURSOR_LOCK, HT_SPECIAL);
00142 break;
00143
00144 case DTW_DEMOLISH:
00145 HandlePlacePushButton(this, DTW_DEMOLISH, ANIMCURSOR_DEMOLISH, HT_RECT | HT_DIAGONAL);
00146 break;
00147
00148 case DTW_DEPOT:
00149 if (!CanBuildVehicleInfrastructure(VEH_SHIP)) return;
00150 if (HandlePlacePushButton(this, DTW_DEPOT, SPR_CURSOR_SHIP_DEPOT, HT_RECT)) ShowBuildDocksDepotPicker(this);
00151 break;
00152
00153 case DTW_STATION:
00154 if (!CanBuildVehicleInfrastructure(VEH_SHIP)) return;
00155 if (HandlePlacePushButton(this, DTW_STATION, SPR_CURSOR_DOCK, HT_SPECIAL)) ShowBuildDockStationPicker(this);
00156 break;
00157
00158 case DTW_BUOY:
00159 if (!CanBuildVehicleInfrastructure(VEH_SHIP)) return;
00160 HandlePlacePushButton(this, DTW_BUOY, SPR_CURSOR_BUOY, HT_RECT);
00161 break;
00162
00163 case DTW_RIVER:
00164 if (_game_mode != GM_EDITOR) return;
00165 HandlePlacePushButton(this, DTW_RIVER, SPR_CURSOR_RIVER, HT_RECT);
00166 break;
00167
00168 case DTW_BUILD_AQUEDUCT:
00169 HandlePlacePushButton(this, DTW_BUILD_AQUEDUCT, SPR_CURSOR_AQUEDUCT, HT_SPECIAL);
00170 break;
00171
00172 default: break;
00173 }
00174 }
00175
00176 virtual EventState OnKeyPress(uint16 key, uint16 keycode)
00177 {
00178 int num = CheckHotkeyMatch(dockstoolbar_hotkeys, keycode, this);
00179 if (num == -1) return ES_NOT_HANDLED;
00180 this->OnClick(Point(), num, 1);
00181 return ES_HANDLED;
00182 }
00183
00184 virtual void OnPlaceObject(Point pt, TileIndex tile)
00185 {
00186 switch (this->last_clicked_widget) {
00187 case DTW_CANAL:
00188 VpStartPlaceSizing(tile, (_game_mode == GM_EDITOR) ? VPM_X_AND_Y : VPM_X_OR_Y, DDSP_CREATE_WATER);
00189 break;
00190
00191 case DTW_LOCK:
00192 DoCommandP(tile, 0, 0, CMD_BUILD_LOCK | CMD_MSG(STR_ERROR_CAN_T_BUILD_LOCKS), CcBuildDocks);
00193 break;
00194
00195 case DTW_DEMOLISH:
00196 PlaceProc_DemolishArea(tile);
00197 break;
00198
00199 case DTW_DEPOT:
00200 DoCommandP(tile, _ship_depot_direction, 0, CMD_BUILD_SHIP_DEPOT | CMD_MSG(STR_ERROR_CAN_T_BUILD_SHIP_DEPOT), CcBuildDocks);
00201 break;
00202
00203 case DTW_STATION: {
00204 uint32 p2 = (uint32)INVALID_STATION << 16;
00205
00206
00207 CommandContainer cmdcont = { tile, _ctrl_pressed, p2, CMD_BUILD_DOCK | CMD_MSG(STR_ERROR_CAN_T_BUILD_DOCK_HERE), CcBuildDocks, "" };
00208
00209
00210 DiagDirection dir = GetInclinedSlopeDirection(GetTileSlope(tile, NULL));
00211 TileIndex tile_to = (dir != INVALID_DIAGDIR ? TileAddByDiagDir(tile, ReverseDiagDir(dir)) : tile);
00212
00213 ShowSelectStationIfNeeded(cmdcont, TileArea(tile, tile_to));
00214 break;
00215 }
00216
00217 case DTW_BUOY:
00218 DoCommandP(tile, 0, 0, CMD_BUILD_BUOY | CMD_MSG(STR_ERROR_CAN_T_POSITION_BUOY_HERE), CcBuildDocks);
00219 break;
00220
00221 case DTW_RIVER:
00222 VpStartPlaceSizing(tile, VPM_X_AND_Y, DDSP_CREATE_RIVER);
00223 break;
00224
00225 case DTW_BUILD_AQUEDUCT:
00226 DoCommandP(tile, GetOtherAqueductEnd(tile), TRANSPORT_WATER << 15, CMD_BUILD_BRIDGE | CMD_MSG(STR_ERROR_CAN_T_BUILD_AQUEDUCT_HERE), CcBuildBridge);
00227 break;
00228
00229 default: NOT_REACHED();
00230 }
00231 }
00232
00233 virtual void OnPlaceDrag(ViewportPlaceMethod select_method, ViewportDragDropSelectionProcess select_proc, Point pt)
00234 {
00235 VpSelectTilesWithMethod(pt.x, pt.y, select_method);
00236 }
00237
00238 virtual void OnPlaceMouseUp(ViewportPlaceMethod select_method, ViewportDragDropSelectionProcess select_proc, Point pt, TileIndex start_tile, TileIndex end_tile)
00239 {
00240 if (pt.x != -1) {
00241 switch (select_proc) {
00242 case DDSP_DEMOLISH_AREA:
00243 GUIPlaceProcDragXY(select_proc, start_tile, end_tile);
00244 break;
00245 case DDSP_CREATE_WATER:
00246 DoCommandP(end_tile, start_tile, (_game_mode == GM_EDITOR && _ctrl_pressed) ? WATER_CLASS_SEA : WATER_CLASS_CANAL, CMD_BUILD_CANAL | CMD_MSG(STR_ERROR_CAN_T_BUILD_CANALS), CcBuildCanal);
00247 break;
00248 case DDSP_CREATE_RIVER:
00249 DoCommandP(end_tile, start_tile, WATER_CLASS_RIVER, CMD_BUILD_CANAL | CMD_MSG(STR_ERROR_CAN_T_PLACE_RIVERS), CcBuildCanal);
00250 break;
00251
00252 default: break;
00253 }
00254 }
00255 }
00256
00257 virtual void OnPlaceObjectAbort()
00258 {
00259 this->RaiseButtons();
00260
00261 DeleteWindowById(WC_BUILD_STATION, TRANSPORT_WATER);
00262 DeleteWindowById(WC_BUILD_DEPOT, TRANSPORT_WATER);
00263 DeleteWindowById(WC_SELECT_STATION, 0);
00264 DeleteWindowByClass(WC_BUILD_BRIDGE);
00265 }
00266
00267 virtual void OnPlacePresize(Point pt, TileIndex tile_from)
00268 {
00269 TileIndex tile_to = tile_from;
00270
00271 if (this->last_clicked_widget == DTW_BUILD_AQUEDUCT) {
00272 GetOtherAqueductEnd(tile_from, &tile_to);
00273 } else {
00274 DiagDirection dir = GetInclinedSlopeDirection(GetTileSlope(tile_from, NULL));
00275 if (IsValidDiagDirection(dir)) {
00276
00277 tile_to = TileAddByDiagDir(tile_from, ReverseDiagDir(dir));
00278
00279 if (this->last_clicked_widget == DTW_LOCK) tile_from = TileAddByDiagDir(tile_from, dir);
00280 }
00281 }
00282
00283 VpSetPresizeRange(tile_from, tile_to);
00284 }
00285
00286 static Hotkey<BuildDocksToolbarWindow> dockstoolbar_hotkeys[];
00287 };
00288
00289 const uint16 _dockstoolbar_aqueduct_keys[] = {'B', '8', 0};
00290
00291 Hotkey<BuildDocksToolbarWindow> BuildDocksToolbarWindow::dockstoolbar_hotkeys[] = {
00292 Hotkey<BuildDocksToolbarWindow>('1', "canal", DTW_CANAL),
00293 Hotkey<BuildDocksToolbarWindow>('2', "lock", DTW_LOCK),
00294 Hotkey<BuildDocksToolbarWindow>('3', "demolish", DTW_DEMOLISH),
00295 Hotkey<BuildDocksToolbarWindow>('4', "depot", DTW_DEPOT),
00296 Hotkey<BuildDocksToolbarWindow>('5', "dock", DTW_STATION),
00297 Hotkey<BuildDocksToolbarWindow>('6', "buoy", DTW_BUOY),
00298 Hotkey<BuildDocksToolbarWindow>('7', "river", DTW_RIVER),
00299 Hotkey<BuildDocksToolbarWindow>(_dockstoolbar_aqueduct_keys, "aqueduct", DTW_BUILD_AQUEDUCT),
00300 HOTKEY_LIST_END(BuildDocksToolbarWindow)
00301 };
00302 Hotkey<BuildDocksToolbarWindow> *_dockstoolbar_hotkeys = BuildDocksToolbarWindow::dockstoolbar_hotkeys;
00303
00308 static const NWidgetPart _nested_build_docks_toolbar_widgets[] = {
00309 NWidget(NWID_HORIZONTAL),
00310 NWidget(WWT_CLOSEBOX, COLOUR_DARK_GREEN),
00311 NWidget(WWT_CAPTION, COLOUR_DARK_GREEN), SetDataTip(STR_WATERWAYS_TOOLBAR_CAPTION, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS),
00312 NWidget(WWT_STICKYBOX, COLOUR_DARK_GREEN),
00313 EndContainer(),
00314 NWidget(NWID_HORIZONTAL_LTR),
00315 NWidget(WWT_IMGBTN, COLOUR_DARK_GREEN, DTW_CANAL), SetMinimalSize(22, 22), SetFill(0, 1), SetDataTip(SPR_IMG_BUILD_CANAL, STR_WATERWAYS_TOOLBAR_BUILD_CANALS_TOOLTIP),
00316 NWidget(WWT_IMGBTN, COLOUR_DARK_GREEN, DTW_LOCK), SetMinimalSize(22, 22), SetFill(0, 1), SetDataTip(SPR_IMG_BUILD_LOCK, STR_WATERWAYS_TOOLBAR_BUILD_LOCKS_TOOLTIP),
00317 NWidget(WWT_PANEL, COLOUR_DARK_GREEN), SetMinimalSize(5, 22), SetFill(1, 1), EndContainer(),
00318 NWidget(WWT_IMGBTN, COLOUR_DARK_GREEN, DTW_DEMOLISH), SetMinimalSize(22, 22), SetFill(0, 1), SetDataTip(SPR_IMG_DYNAMITE, STR_TOOLTIP_DEMOLISH_BUILDINGS_ETC),
00319 NWidget(WWT_IMGBTN, COLOUR_DARK_GREEN, DTW_DEPOT), SetMinimalSize(22, 22), SetFill(0, 1), SetDataTip(SPR_IMG_SHIP_DEPOT, STR_WATERWAYS_TOOLBAR_BUILD_DEPOT_TOOLTIP),
00320 NWidget(WWT_IMGBTN, COLOUR_DARK_GREEN, DTW_STATION), SetMinimalSize(22, 22), SetFill(0, 1), SetDataTip(SPR_IMG_SHIP_DOCK, STR_WATERWAYS_TOOLBAR_BUILD_DOCK_TOOLTIP),
00321 NWidget(WWT_IMGBTN, COLOUR_DARK_GREEN, DTW_BUOY), SetMinimalSize(22, 22), SetFill(0, 1), SetDataTip(SPR_IMG_BUOY, STR_WATERWAYS_TOOLBAR_BUOY_TOOLTIP),
00322 NWidget(WWT_IMGBTN, COLOUR_DARK_GREEN, DTW_BUILD_AQUEDUCT), SetMinimalSize(23, 22), SetFill(0, 1), SetDataTip(SPR_IMG_AQUEDUCT, STR_WATERWAYS_TOOLBAR_BUILD_AQUEDUCT_TOOLTIP),
00323 EndContainer(),
00324 };
00325
00326 static const WindowDesc _build_docks_toolbar_desc(
00327 WDP_ALIGN_TOOLBAR, 0, 0,
00328 WC_BUILD_TOOLBAR, WC_NONE,
00329 WDF_CONSTRUCTION,
00330 _nested_build_docks_toolbar_widgets, lengthof(_nested_build_docks_toolbar_widgets)
00331 );
00332
00340 Window *ShowBuildDocksToolbar()
00341 {
00342 if (!Company::IsValidID(_local_company)) return NULL;
00343
00344 DeleteWindowByClass(WC_BUILD_TOOLBAR);
00345 return AllocateWindowDescFront<BuildDocksToolbarWindow>(&_build_docks_toolbar_desc, TRANSPORT_WATER);
00346 }
00347
00348 EventState DockToolbarGlobalHotkeys(uint16 key, uint16 keycode)
00349 {
00350 int num = CheckHotkeyMatch<BuildDocksToolbarWindow>(_dockstoolbar_hotkeys, keycode, NULL, true);
00351 if (num == -1) return ES_NOT_HANDLED;
00352 Window *w = ShowBuildDocksToolbar();
00353 if (w == NULL) return ES_NOT_HANDLED;
00354 return w->OnKeyPress(key, keycode);
00355 }
00356
00361 static const NWidgetPart _nested_build_docks_scen_toolbar_widgets[] = {
00362 NWidget(NWID_HORIZONTAL),
00363 NWidget(WWT_CLOSEBOX, COLOUR_DARK_GREEN),
00364 NWidget(WWT_CAPTION, COLOUR_DARK_GREEN), SetDataTip(STR_WATERWAYS_TOOLBAR_CAPTION_SE, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS),
00365 NWidget(WWT_STICKYBOX, COLOUR_DARK_GREEN),
00366 EndContainer(),
00367 NWidget(NWID_HORIZONTAL),
00368 NWidget(WWT_IMGBTN, COLOUR_DARK_GREEN, DTW_CANAL), SetMinimalSize(22, 22), SetFill(0, 1), SetDataTip(SPR_IMG_BUILD_CANAL, STR_WATERWAYS_TOOLBAR_CREATE_LAKE_TOOLTIP),
00369 NWidget(WWT_IMGBTN, COLOUR_DARK_GREEN, DTW_LOCK), SetMinimalSize(22, 22), SetFill(0, 1), SetDataTip(SPR_IMG_BUILD_LOCK, STR_WATERWAYS_TOOLBAR_BUILD_LOCKS_TOOLTIP),
00370 NWidget(WWT_PANEL, COLOUR_DARK_GREEN), SetMinimalSize(5, 22), SetFill(1, 1), EndContainer(),
00371 NWidget(WWT_IMGBTN, COLOUR_DARK_GREEN, DTW_DEMOLISH), SetMinimalSize(22, 22), SetFill(0, 1), SetDataTip(SPR_IMG_DYNAMITE, STR_TOOLTIP_DEMOLISH_BUILDINGS_ETC),
00372 NWidget(WWT_IMGBTN, COLOUR_DARK_GREEN, DTW_RIVER), SetMinimalSize(22, 22), SetFill(0, 1), SetDataTip(SPR_IMG_BUILD_RIVER, STR_WATERWAYS_TOOLBAR_CREATE_RIVER_TOOLTIP),
00373 NWidget(WWT_IMGBTN, COLOUR_DARK_GREEN, DTW_BUILD_AQUEDUCT), SetMinimalSize(22, 22), SetFill(0, 1), SetDataTip(SPR_IMG_AQUEDUCT, STR_WATERWAYS_TOOLBAR_BUILD_AQUEDUCT_TOOLTIP),
00374 EndContainer(),
00375 };
00376
00378 static const WindowDesc _build_docks_scen_toolbar_desc(
00379 WDP_AUTO, 0, 0,
00380 WC_SCEN_BUILD_TOOLBAR, WC_NONE,
00381 WDF_CONSTRUCTION,
00382 _nested_build_docks_scen_toolbar_widgets, lengthof(_nested_build_docks_scen_toolbar_widgets)
00383 );
00384
00390 Window *ShowBuildDocksScenToolbar()
00391 {
00392 return AllocateWindowDescFront<BuildDocksToolbarWindow>(&_build_docks_scen_toolbar_desc, TRANSPORT_WATER);
00393 }
00394
00396 enum BuildDockStationWidgets {
00397 BDSW_BACKGROUND,
00398 BDSW_LT_OFF,
00399 BDSW_LT_ON,
00400 BDSW_INFO,
00401 };
00402
00403 struct BuildDocksStationWindow : public PickerWindowBase {
00404 public:
00405 BuildDocksStationWindow(const WindowDesc *desc, Window *parent) : PickerWindowBase(parent)
00406 {
00407 this->InitNested(desc, TRANSPORT_WATER);
00408 this->LowerWidget(_settings_client.gui.station_show_coverage + BDSW_LT_OFF);
00409 }
00410
00411 virtual ~BuildDocksStationWindow()
00412 {
00413 DeleteWindowById(WC_SELECT_STATION, 0);
00414 }
00415
00416 virtual void OnPaint()
00417 {
00418 int rad = (_settings_game.station.modified_catchment) ? CA_DOCK : CA_UNMODIFIED;
00419
00420 this->DrawWidgets();
00421
00422 if (_settings_client.gui.station_show_coverage) {
00423 SetTileSelectBigSize(-rad, -rad, 2 * rad, 2 * rad);
00424 } else {
00425 SetTileSelectSize(1, 1);
00426 }
00427
00428
00429 int top = this->GetWidget<NWidgetBase>(BDSW_LT_OFF)->pos_y + this->GetWidget<NWidgetBase>(BDSW_LT_OFF)->current_y + WD_PAR_VSEP_NORMAL;
00430 NWidgetBase *back_nwi = this->GetWidget<NWidgetBase>(BDSW_BACKGROUND);
00431 int right = back_nwi->pos_x + back_nwi->current_x;
00432 int bottom = back_nwi->pos_y + back_nwi->current_y;
00433 top = DrawStationCoverageAreaText(back_nwi->pos_x + WD_FRAMERECT_LEFT, right - WD_FRAMERECT_RIGHT, top, SCT_ALL, rad, false) + WD_PAR_VSEP_NORMAL;
00434 top = DrawStationCoverageAreaText(back_nwi->pos_x + WD_FRAMERECT_LEFT, right - WD_FRAMERECT_RIGHT, top, SCT_ALL, rad, true) + WD_PAR_VSEP_NORMAL;
00435
00436 if (top > bottom || (top < bottom && back_nwi->current_y > back_nwi->smallest_y)) {
00437 ResizeWindow(this, 0, top - bottom);
00438 }
00439 }
00440
00441 virtual void OnClick(Point pt, int widget, int click_count)
00442 {
00443 switch (widget) {
00444 case BDSW_LT_OFF:
00445 case BDSW_LT_ON:
00446 this->RaiseWidget(_settings_client.gui.station_show_coverage + BDSW_LT_OFF);
00447 _settings_client.gui.station_show_coverage = (widget != BDSW_LT_OFF);
00448 this->LowerWidget(_settings_client.gui.station_show_coverage + BDSW_LT_OFF);
00449 SndPlayFx(SND_15_BEEP);
00450 this->SetDirty();
00451 break;
00452 }
00453 }
00454
00455 virtual void OnTick()
00456 {
00457 CheckRedrawStationCoverage(this);
00458 }
00459 };
00460
00462 static const NWidgetPart _nested_build_dock_station_widgets[] = {
00463 NWidget(NWID_HORIZONTAL),
00464 NWidget(WWT_CLOSEBOX, COLOUR_DARK_GREEN),
00465 NWidget(WWT_CAPTION, COLOUR_DARK_GREEN), SetDataTip(STR_STATION_BUILD_DOCK_CAPTION, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS),
00466 EndContainer(),
00467 NWidget(WWT_PANEL, COLOUR_DARK_GREEN, BDSW_BACKGROUND),
00468 NWidget(NWID_SPACER), SetMinimalSize(0, 3),
00469 NWidget(WWT_LABEL, COLOUR_DARK_GREEN, BDSW_INFO), SetMinimalSize(148, 14), SetDataTip(STR_STATION_BUILD_COVERAGE_AREA_TITLE, STR_NULL),
00470 NWidget(NWID_HORIZONTAL), SetPIP(14, 0, 14),
00471 NWidget(WWT_TEXTBTN, COLOUR_GREY, BDSW_LT_OFF), SetMinimalSize(40, 12), SetFill(1, 0), SetDataTip(STR_STATION_BUILD_COVERAGE_OFF, STR_STATION_BUILD_COVERAGE_AREA_OFF_TOOLTIP),
00472 NWidget(WWT_TEXTBTN, COLOUR_GREY, BDSW_LT_ON), SetMinimalSize(40, 12), SetFill(1, 0), SetDataTip(STR_STATION_BUILD_COVERAGE_ON, STR_STATION_BUILD_COVERAGE_AREA_ON_TOOLTIP),
00473 EndContainer(),
00474 NWidget(NWID_SPACER), SetMinimalSize(0, 20), SetResize(0, 1),
00475 EndContainer(),
00476 };
00477
00478 static const WindowDesc _build_dock_station_desc(
00479 WDP_AUTO, 0, 0,
00480 WC_BUILD_STATION, WC_BUILD_TOOLBAR,
00481 WDF_CONSTRUCTION,
00482 _nested_build_dock_station_widgets, lengthof(_nested_build_dock_station_widgets)
00483 );
00484
00485 static void ShowBuildDockStationPicker(Window *parent)
00486 {
00487 new BuildDocksStationWindow(&_build_dock_station_desc, parent);
00488 }
00489
00491 enum BuildDockDepotWidgets {
00492 BDDW_BACKGROUND,
00493 BDDW_X,
00494 BDDW_Y,
00495 };
00496
00497 struct BuildDocksDepotWindow : public PickerWindowBase {
00498 private:
00499 static void UpdateDocksDirection()
00500 {
00501 if (_ship_depot_direction != AXIS_X) {
00502 SetTileSelectSize(1, 2);
00503 } else {
00504 SetTileSelectSize(2, 1);
00505 }
00506 }
00507
00508 public:
00509 BuildDocksDepotWindow(const WindowDesc *desc, Window *parent) : PickerWindowBase(parent)
00510 {
00511 this->InitNested(desc, TRANSPORT_WATER);
00512 this->LowerWidget(_ship_depot_direction + BDDW_X);
00513 UpdateDocksDirection();
00514 }
00515
00516 virtual void OnPaint()
00517 {
00518 this->DrawWidgets();
00519
00520 DrawShipDepotSprite(this->GetWidget<NWidgetBase>(BDDW_X)->pos_x + 64, this->GetWidget<NWidgetBase>(BDDW_X)->pos_y + 18, 0);
00521 DrawShipDepotSprite(this->GetWidget<NWidgetBase>(BDDW_X)->pos_x + 32, this->GetWidget<NWidgetBase>(BDDW_X)->pos_y + 34, 1);
00522 DrawShipDepotSprite(this->GetWidget<NWidgetBase>(BDDW_Y)->pos_x + 32, this->GetWidget<NWidgetBase>(BDDW_Y)->pos_y + 18, 2);
00523 DrawShipDepotSprite(this->GetWidget<NWidgetBase>(BDDW_Y)->pos_x + 64, this->GetWidget<NWidgetBase>(BDDW_Y)->pos_y + 34, 3);
00524 }
00525
00526 virtual void OnClick(Point pt, int widget, int click_count)
00527 {
00528 switch (widget) {
00529 case BDDW_X:
00530 case BDDW_Y:
00531 this->RaiseWidget(_ship_depot_direction + BDDW_X);
00532 _ship_depot_direction = (widget == BDDW_X ? AXIS_X : AXIS_Y);
00533 this->LowerWidget(_ship_depot_direction + BDDW_X);
00534 SndPlayFx(SND_15_BEEP);
00535 UpdateDocksDirection();
00536 this->SetDirty();
00537 break;
00538 }
00539 }
00540 };
00541
00542 static const NWidgetPart _nested_build_docks_depot_widgets[] = {
00543 NWidget(NWID_HORIZONTAL),
00544 NWidget(WWT_CLOSEBOX, COLOUR_DARK_GREEN),
00545 NWidget(WWT_CAPTION, COLOUR_DARK_GREEN), SetDataTip(STR_DEPOT_BUILD_SHIP_CAPTION, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS),
00546 EndContainer(),
00547 NWidget(WWT_PANEL, COLOUR_DARK_GREEN, BDDW_BACKGROUND),
00548 NWidget(NWID_SPACER), SetMinimalSize(0, 3),
00549 NWidget(NWID_HORIZONTAL_LTR),
00550 NWidget(NWID_SPACER), SetMinimalSize(3, 0),
00551 NWidget(WWT_PANEL, COLOUR_GREY, BDDW_X), SetMinimalSize(98, 66), SetDataTip(0x0, STR_DEPOT_BUILD_SHIP_ORIENTATION_TOOLTIP),
00552 EndContainer(),
00553 NWidget(NWID_SPACER), SetMinimalSize(2, 0),
00554 NWidget(WWT_PANEL, COLOUR_GREY, BDDW_Y), SetMinimalSize(98, 66), SetDataTip(0x0, STR_DEPOT_BUILD_SHIP_ORIENTATION_TOOLTIP),
00555 EndContainer(),
00556 NWidget(NWID_SPACER), SetMinimalSize(3, 0),
00557 EndContainer(),
00558 NWidget(NWID_SPACER), SetMinimalSize(0, 3),
00559 EndContainer(),
00560 };
00561
00562 static const WindowDesc _build_docks_depot_desc(
00563 WDP_AUTO, 0, 0,
00564 WC_BUILD_DEPOT, WC_BUILD_TOOLBAR,
00565 WDF_CONSTRUCTION,
00566 _nested_build_docks_depot_widgets, lengthof(_nested_build_docks_depot_widgets)
00567 );
00568
00569
00570 static void ShowBuildDocksDepotPicker(Window *parent)
00571 {
00572 new BuildDocksDepotWindow(&_build_docks_depot_desc, parent);
00573 }
00574
00575
00576 void InitializeDockGui()
00577 {
00578 _ship_depot_direction = AXIS_X;
00579 }