00001
00002
00005 #include "stdafx.h"
00006 #include "openttd.h"
00007 #include "bridge_map.h"
00008 #include "clear_map.h"
00009 #include "company_func.h"
00010 #include "company_base.h"
00011 #include "gui.h"
00012 #include "window_gui.h"
00013 #include "window_func.h"
00014 #include "viewport_func.h"
00015 #include "gfx_func.h"
00016 #include "command_func.h"
00017 #include "signs_func.h"
00018 #include "variables.h"
00019 #include "functions.h"
00020 #include "sound_func.h"
00021 #include "station_base.h"
00022 #include "unmovable_map.h"
00023 #include "textbuf_gui.h"
00024 #include "genworld.h"
00025 #include "settings_type.h"
00026 #include "tree_map.h"
00027 #include "landscape_type.h"
00028 #include "tilehighlight_func.h"
00029
00030 #include "table/sprites.h"
00031 #include "table/strings.h"
00032
00033 void CcTerraform(bool success, TileIndex tile, uint32 p1, uint32 p2)
00034 {
00035 if (success) {
00036 SndPlayTileFx(SND_1F_SPLAT, tile);
00037 } else {
00038 extern TileIndex _terraform_err_tile;
00039 SetRedErrorSquare(_terraform_err_tile);
00040 }
00041 }
00042
00043
00045 static void GenerateDesertArea(TileIndex end, TileIndex start)
00046 {
00047 int size_x, size_y;
00048 int sx = TileX(start);
00049 int sy = TileY(start);
00050 int ex = TileX(end);
00051 int ey = TileY(end);
00052
00053 if (_game_mode != GM_EDITOR) return;
00054
00055 if (ex < sx) Swap(ex, sx);
00056 if (ey < sy) Swap(ey, sy);
00057 size_x = (ex - sx) + 1;
00058 size_y = (ey - sy) + 1;
00059
00060 _generating_world = true;
00061 BEGIN_TILE_LOOP(tile, size_x, size_y, TileXY(sx, sy)) {
00062 if (GetTileType(tile) != MP_WATER) {
00063 SetTropicZone(tile, (_ctrl_pressed) ? TROPICZONE_NORMAL : TROPICZONE_DESERT);
00064 DoCommandP(tile, 0, 0, CMD_LANDSCAPE_CLEAR);
00065 MarkTileDirtyByTile(tile);
00066 }
00067 } END_TILE_LOOP(tile, size_x, size_y, 0);
00068 _generating_world = false;
00069 }
00070
00072 static void GenerateRockyArea(TileIndex end, TileIndex start)
00073 {
00074 int size_x, size_y;
00075 bool success = false;
00076 int sx = TileX(start);
00077 int sy = TileY(start);
00078 int ex = TileX(end);
00079 int ey = TileY(end);
00080
00081 if (_game_mode != GM_EDITOR) return;
00082
00083 if (ex < sx) Swap(ex, sx);
00084 if (ey < sy) Swap(ey, sy);
00085 size_x = (ex - sx) + 1;
00086 size_y = (ey - sy) + 1;
00087
00088 BEGIN_TILE_LOOP(tile, size_x, size_y, TileXY(sx, sy)) {
00089 switch (GetTileType(tile)) {
00090 case MP_TREES:
00091 if (GetTreeGround(tile) == TREE_GROUND_SHORE) continue;
00092
00093 case MP_CLEAR:
00094 MakeClear(tile, CLEAR_ROCKS, 3);
00095 break;
00096
00097 default: continue;
00098 }
00099 MarkTileDirtyByTile(tile);
00100 success = true;
00101 } END_TILE_LOOP(tile, size_x, size_y, 0);
00102
00103 if (success) SndPlayTileFx(SND_1F_SPLAT, end);
00104 }
00105
00114 bool GUIPlaceProcDragXY(ViewportDragDropSelectionProcess proc, TileIndex start_tile, TileIndex end_tile)
00115 {
00116 switch (proc) {
00117 case DDSP_DEMOLISH_AREA:
00118 DoCommandP(end_tile, start_tile, 0, CMD_CLEAR_AREA | CMD_MSG(STR_00B5_CAN_T_CLEAR_THIS_AREA), CcPlaySound10);
00119 break;
00120 case DDSP_RAISE_AND_LEVEL_AREA:
00121 DoCommandP(end_tile, start_tile, 1, CMD_LEVEL_LAND | CMD_MSG(STR_0808_CAN_T_RAISE_LAND_HERE), CcTerraform);
00122 break;
00123 case DDSP_LOWER_AND_LEVEL_AREA:
00124 DoCommandP(end_tile, start_tile, (uint32)-1, CMD_LEVEL_LAND | CMD_MSG(STR_0809_CAN_T_LOWER_LAND_HERE), CcTerraform);
00125 break;
00126 case DDSP_LEVEL_AREA:
00127 DoCommandP(end_tile, start_tile, 0, CMD_LEVEL_LAND | CMD_MSG(STR_CAN_T_LEVEL_LAND_HERE), CcTerraform);
00128 break;
00129 case DDSP_CREATE_ROCKS:
00130 GenerateRockyArea(end_tile, start_tile);
00131 break;
00132 case DDSP_CREATE_DESERT:
00133 GenerateDesertArea(end_tile, start_tile);
00134 break;
00135 default:
00136 return false;
00137 }
00138
00139 return true;
00140 }
00141
00142 typedef void OnButtonClick(Window *w);
00143
00144 static const uint16 _terraform_keycodes[] = {
00145 'Q',
00146 'W',
00147 'E',
00148 'D',
00149 'U',
00150 'I',
00151 'O',
00152 };
00153
00154 void CcPlaySound1E(bool success, TileIndex tile, uint32 p1, uint32 p2);
00155
00156 static void PlaceProc_BuyLand(TileIndex tile)
00157 {
00158 DoCommandP(tile, 0, 0, CMD_PURCHASE_LAND_AREA | CMD_MSG(STR_5806_CAN_T_PURCHASE_THIS_LAND), CcPlaySound1E);
00159 }
00160
00161 void PlaceProc_DemolishArea(TileIndex tile)
00162 {
00163 VpStartPlaceSizing(tile, VPM_X_AND_Y, DDSP_DEMOLISH_AREA);
00164 }
00165
00166 static void PlaceProc_RaiseLand(TileIndex tile)
00167 {
00168 VpStartPlaceSizing(tile, VPM_X_AND_Y, DDSP_RAISE_AND_LEVEL_AREA);
00169 }
00170
00171 static void PlaceProc_LowerLand(TileIndex tile)
00172 {
00173 VpStartPlaceSizing(tile, VPM_X_AND_Y, DDSP_LOWER_AND_LEVEL_AREA);
00174 }
00175
00176 static void PlaceProc_LevelLand(TileIndex tile)
00177 {
00178 VpStartPlaceSizing(tile, VPM_X_AND_Y, DDSP_LEVEL_AREA);
00179 }
00180
00182 enum TerraformToolbarWidgets {
00183 TTW_CLOSEBOX = 0,
00184 TTW_CAPTION,
00185 TTW_STICKY,
00186 TTW_SEPERATOR,
00187 TTW_BUTTONS_START,
00188 TTW_LOWER_LAND = TTW_BUTTONS_START,
00189 TTW_RAISE_LAND,
00190 TTW_LEVEL_LAND,
00191 TTW_DEMOLISH,
00192 TTW_BUY_LAND,
00193 TTW_PLANT_TREES,
00194 TTW_PLACE_SIGN,
00195 };
00196
00197 static void TerraformClick_Lower(Window *w)
00198 {
00199 HandlePlacePushButton(w, TTW_LOWER_LAND, ANIMCURSOR_LOWERLAND, VHM_POINT, PlaceProc_LowerLand);
00200 }
00201
00202 static void TerraformClick_Raise(Window *w)
00203 {
00204 HandlePlacePushButton(w, TTW_RAISE_LAND, ANIMCURSOR_RAISELAND, VHM_POINT, PlaceProc_RaiseLand);
00205 }
00206
00207 static void TerraformClick_Level(Window *w)
00208 {
00209 HandlePlacePushButton(w, TTW_LEVEL_LAND, SPR_CURSOR_LEVEL_LAND, VHM_POINT, PlaceProc_LevelLand);
00210 }
00211
00212 static void TerraformClick_Dynamite(Window *w)
00213 {
00214 HandlePlacePushButton(w, TTW_DEMOLISH, ANIMCURSOR_DEMOLISH , VHM_RECT, PlaceProc_DemolishArea);
00215 }
00216
00217 static void TerraformClick_BuyLand(Window *w)
00218 {
00219 HandlePlacePushButton(w, TTW_BUY_LAND, SPR_CURSOR_BUY_LAND, VHM_RECT, PlaceProc_BuyLand);
00220 }
00221
00222 static void TerraformClick_Trees(Window *w)
00223 {
00224
00225 ShowBuildTreesToolbar();
00226 }
00227
00228 static void TerraformClick_PlaceSign(Window *w)
00229 {
00230 HandlePlacePushButton(w, TTW_PLACE_SIGN, SPR_CURSOR_SIGN, VHM_RECT, PlaceProc_Sign);
00231 }
00232
00233 static OnButtonClick * const _terraform_button_proc[] = {
00234 TerraformClick_Lower,
00235 TerraformClick_Raise,
00236 TerraformClick_Level,
00237 TerraformClick_Dynamite,
00238 TerraformClick_BuyLand,
00239 TerraformClick_Trees,
00240 TerraformClick_PlaceSign,
00241 };
00242
00243 struct TerraformToolbarWindow : Window {
00244 TerraformToolbarWindow(const WindowDesc *desc, WindowNumber window_number) : Window(desc, window_number)
00245 {
00246 this->FindWindowPlacementAndResize(desc);
00247 }
00248
00249 ~TerraformToolbarWindow()
00250 {
00251 }
00252
00253 virtual void OnPaint()
00254 {
00255 this->DrawWidgets();
00256 }
00257
00258 virtual void OnClick(Point pt, int widget)
00259 {
00260 if (widget >= TTW_BUTTONS_START) _terraform_button_proc[widget - TTW_BUTTONS_START](this);
00261 }
00262
00263 virtual EventState OnKeyPress(uint16 key, uint16 keycode)
00264 {
00265 for (uint i = 0; i != lengthof(_terraform_keycodes); i++) {
00266 if (keycode == _terraform_keycodes[i]) {
00267 _terraform_button_proc[i](this);
00268 return ES_HANDLED;
00269 }
00270 }
00271 return ES_NOT_HANDLED;
00272 }
00273
00274 virtual void OnPlaceObject(Point pt, TileIndex tile)
00275 {
00276 _place_proc(tile);
00277 }
00278
00279 virtual void OnPlaceDrag(ViewportPlaceMethod select_method, ViewportDragDropSelectionProcess select_proc, Point pt)
00280 {
00281 VpSelectTilesWithMethod(pt.x, pt.y, select_method);
00282 }
00283
00284 virtual void OnPlaceMouseUp(ViewportPlaceMethod select_method, ViewportDragDropSelectionProcess select_proc, Point pt, TileIndex start_tile, TileIndex end_tile)
00285 {
00286 if (pt.x != -1) {
00287 switch (select_proc) {
00288 default: NOT_REACHED();
00289 case DDSP_DEMOLISH_AREA:
00290 case DDSP_RAISE_AND_LEVEL_AREA:
00291 case DDSP_LOWER_AND_LEVEL_AREA:
00292 case DDSP_LEVEL_AREA:
00293 GUIPlaceProcDragXY(select_proc, start_tile, end_tile);
00294 break;
00295 }
00296 }
00297 }
00298
00299 virtual void OnPlaceObjectAbort()
00300 {
00301 this->RaiseButtons();
00302 }
00303 };
00304
00305 static const Widget _terraform_widgets[] = {
00306 { WWT_CLOSEBOX, RESIZE_NONE, COLOUR_DARK_GREEN, 0, 10, 0, 13, STR_00C5, STR_018B_CLOSE_WINDOW},
00307 { WWT_CAPTION, RESIZE_NONE, COLOUR_DARK_GREEN, 11, 145, 0, 13, STR_LANDSCAPING_TOOLBAR, STR_018C_WINDOW_TITLE_DRAG_THIS},
00308 {WWT_STICKYBOX, RESIZE_NONE, COLOUR_DARK_GREEN, 146, 157, 0, 13, STR_NULL, STR_STICKY_BUTTON},
00309
00310 { WWT_PANEL, RESIZE_NONE, COLOUR_DARK_GREEN, 66, 69, 14, 35, 0x0, STR_NULL},
00311 { WWT_IMGBTN, RESIZE_NONE, COLOUR_DARK_GREEN, 0, 21, 14, 35, SPR_IMG_TERRAFORM_DOWN, STR_018E_LOWER_A_CORNER_OF_LAND},
00312 { WWT_IMGBTN, RESIZE_NONE, COLOUR_DARK_GREEN, 22, 43, 14, 35, SPR_IMG_TERRAFORM_UP, STR_018F_RAISE_A_CORNER_OF_LAND},
00313 { WWT_IMGBTN, RESIZE_NONE, COLOUR_DARK_GREEN, 44, 65, 14, 35, SPR_IMG_LEVEL_LAND, STR_LEVEL_LAND_TOOLTIP},
00314 { WWT_IMGBTN, RESIZE_NONE, COLOUR_DARK_GREEN, 70, 91, 14, 35, SPR_IMG_DYNAMITE, STR_018D_DEMOLISH_BUILDINGS_ETC},
00315 { WWT_IMGBTN, RESIZE_NONE, COLOUR_DARK_GREEN, 92, 113, 14, 35, SPR_IMG_BUY_LAND, STR_0329_PURCHASE_LAND_FOR_FUTURE},
00316 { WWT_IMGBTN, RESIZE_NONE, COLOUR_DARK_GREEN, 114, 135, 14, 35, SPR_IMG_PLANTTREES, STR_0185_PLANT_TREES_PLACE_SIGNS},
00317 { WWT_IMGBTN, RESIZE_NONE, COLOUR_DARK_GREEN, 136, 157, 14, 35, SPR_IMG_SIGN, STR_0289_PLACE_SIGN},
00318
00319 { WIDGETS_END},
00320 };
00321
00322 static const WindowDesc _terraform_desc = {
00323 WDP_ALIGN_TBR, 22 + 36, 158, 36, 158, 36,
00324 WC_SCEN_LAND_GEN, WC_NONE,
00325 WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_STICKY_BUTTON,
00326 _terraform_widgets,
00327 };
00328
00329 void ShowTerraformToolbar(Window *link)
00330 {
00331 if (!IsValidCompanyID(_current_company)) return;
00332
00333 Window *w = AllocateWindowDescFront<TerraformToolbarWindow>(&_terraform_desc, 0);
00334 if (link == NULL) return;
00335
00336 if (w == NULL) {
00337 w = FindWindowById(WC_SCEN_LAND_GEN, 0);
00338 } else {
00339 w->top = 22;
00340 w->SetDirty();
00341 }
00342 if (w == NULL) return;
00343
00344
00345
00346
00347 link->top = w->top;
00348 link->left = w->left - link->width;
00349 link->SetDirty();
00350 }
00351
00352 static byte _terraform_size = 1;
00353
00363 static void CommonRaiseLowerBigLand(TileIndex tile, int mode)
00364 {
00365 int sizex, sizey;
00366 uint h;
00367
00368 if (_terraform_size == 1) {
00369 StringID msg =
00370 mode ? STR_0808_CAN_T_RAISE_LAND_HERE : STR_0809_CAN_T_LOWER_LAND_HERE;
00371
00372 DoCommandP(tile, SLOPE_N, (uint32)mode, CMD_TERRAFORM_LAND | CMD_MSG(msg), CcTerraform);
00373 } else {
00374 assert(_terraform_size != 0);
00375
00376 sizex = min(MapSizeX() - TileX(tile) - 1, _terraform_size);
00377 sizey = min(MapSizeY() - TileY(tile) - 1, _terraform_size);
00378
00379 if (sizex == 0 || sizey == 0) return;
00380
00381 SndPlayTileFx(SND_1F_SPLAT, tile);
00382
00383 if (mode != 0) {
00384
00385 h = 15;
00386 BEGIN_TILE_LOOP(tile2, sizex, sizey, tile) {
00387 h = min(h, TileHeight(tile2));
00388 } END_TILE_LOOP(tile2, sizex, sizey, tile)
00389 } else {
00390
00391 h = 0;
00392 BEGIN_TILE_LOOP(tile2, sizex, sizey, tile) {
00393 h = max(h, TileHeight(tile2));
00394 } END_TILE_LOOP(tile2, sizex, sizey, tile)
00395 }
00396
00397 BEGIN_TILE_LOOP(tile2, sizex, sizey, tile) {
00398 if (TileHeight(tile2) == h) {
00399 DoCommandP(tile2, SLOPE_N, (uint32)mode, CMD_TERRAFORM_LAND);
00400 }
00401 } END_TILE_LOOP(tile2, sizex, sizey, tile)
00402 }
00403 }
00404
00405 static void PlaceProc_RaiseBigLand(TileIndex tile)
00406 {
00407 CommonRaiseLowerBigLand(tile, 1);
00408 }
00409
00410 static void PlaceProc_LowerBigLand(TileIndex tile)
00411 {
00412 CommonRaiseLowerBigLand(tile, 0);
00413 }
00414
00415 static void PlaceProc_RockyArea(TileIndex tile)
00416 {
00417 VpStartPlaceSizing(tile, VPM_X_AND_Y, DDSP_CREATE_ROCKS);
00418 }
00419
00420 static void PlaceProc_LightHouse(TileIndex tile)
00421 {
00422
00423 if (GetTileSlope(tile, NULL) != SLOPE_FLAT || !(IsTileType(tile, MP_TREES) || (IsTileType(tile, MP_CLEAR) && !IsBridgeAbove(tile)))) {
00424 return;
00425 }
00426
00427 MakeLighthouse(tile);
00428 MarkTileDirtyByTile(tile);
00429 SndPlayTileFx(SND_1F_SPLAT, tile);
00430 }
00431
00432 static void PlaceProc_Transmitter(TileIndex tile)
00433 {
00434
00435 if (GetTileSlope(tile, NULL) != SLOPE_FLAT || !(IsTileType(tile, MP_TREES) || (IsTileType(tile, MP_CLEAR) && !IsBridgeAbove(tile)))) {
00436 return;
00437 }
00438
00439 MakeTransmitter(tile);
00440 MarkTileDirtyByTile(tile);
00441 SndPlayTileFx(SND_1F_SPLAT, tile);
00442 }
00443
00444 static void PlaceProc_DesertArea(TileIndex tile)
00445 {
00446 VpStartPlaceSizing(tile, VPM_X_AND_Y, DDSP_CREATE_DESERT);
00447 }
00448
00449
00450 static const Widget _scen_edit_land_gen_widgets[] = {
00451 { WWT_CLOSEBOX, RESIZE_NONE, COLOUR_DARK_GREEN, 0, 10, 0, 13, STR_00C5, STR_018B_CLOSE_WINDOW},
00452 { WWT_CAPTION, RESIZE_NONE, COLOUR_DARK_GREEN, 11, 150, 0, 13, STR_0223_LAND_GENERATION, STR_018C_WINDOW_TITLE_DRAG_THIS},
00453 { WWT_STICKYBOX, RESIZE_NONE, COLOUR_DARK_GREEN, 151, 162, 0, 13, STR_NULL, STR_STICKY_BUTTON},
00454 { WWT_PANEL, RESIZE_NONE, COLOUR_DARK_GREEN, 0, 162, 14, 102, 0x0, STR_NULL},
00455 { WWT_IMGBTN, RESIZE_NONE, COLOUR_GREY, 2, 23, 16, 37, SPR_IMG_DYNAMITE, STR_018D_DEMOLISH_BUILDINGS_ETC},
00456 { WWT_IMGBTN, RESIZE_NONE, COLOUR_GREY, 24, 45, 16, 37, SPR_IMG_TERRAFORM_DOWN, STR_018E_LOWER_A_CORNER_OF_LAND},
00457 { WWT_IMGBTN, RESIZE_NONE, COLOUR_GREY, 46, 67, 16, 37, SPR_IMG_TERRAFORM_UP, STR_018F_RAISE_A_CORNER_OF_LAND},
00458 { WWT_IMGBTN, RESIZE_NONE, COLOUR_GREY, 68, 89, 16, 37, SPR_IMG_LEVEL_LAND, STR_LEVEL_LAND_TOOLTIP},
00459 { WWT_IMGBTN, RESIZE_NONE, COLOUR_GREY, 90, 111, 16, 37, SPR_IMG_ROCKS, STR_028C_PLACE_ROCKY_AREAS_ON_LANDSCAPE},
00460 { WWT_IMGBTN, RESIZE_NONE, COLOUR_GREY, 112, 133, 16, 37, SPR_IMG_LIGHTHOUSE_DESERT, STR_NULL},
00461 { WWT_IMGBTN, RESIZE_NONE, COLOUR_GREY, 134, 156, 16, 37, SPR_IMG_TRANSMITTER, STR_028E_PLACE_TRANSMITTER},
00462 { WWT_IMGBTN, RESIZE_NONE, COLOUR_GREY, 150, 161, 45, 56, SPR_ARROW_UP, STR_0228_INCREASE_SIZE_OF_LAND_AREA},
00463 { WWT_IMGBTN, RESIZE_NONE, COLOUR_GREY, 150, 161, 58, 69, SPR_ARROW_DOWN, STR_0229_DECREASE_SIZE_OF_LAND_AREA},
00464 { WWT_TEXTBTN, RESIZE_NONE, COLOUR_GREY, 2, 161, 76, 87, STR_SE_NEW_WORLD, STR_022A_GENERATE_RANDOM_LAND},
00465 { WWT_TEXTBTN, RESIZE_NONE, COLOUR_GREY, 2, 161, 89, 100, STR_022B_RESET_LANDSCAPE, STR_RESET_LANDSCAPE_TOOLTIP},
00466 { WIDGETS_END},
00467 };
00468
00469 static const int8 _multi_terraform_coords[][2] = {
00470 { 0, -2},
00471 { 4, 0}, { -4, 0}, { 0, 2},
00472 { -8, 2}, { -4, 4}, { 0, 6}, { 4, 4}, { 8, 2},
00473 {-12, 0}, { -8, -2}, { -4, -4}, { 0, -6}, { 4, -4}, { 8, -2}, { 12, 0},
00474 {-16, 2}, {-12, 4}, { -8, 6}, { -4, 8}, { 0, 10}, { 4, 8}, { 8, 6}, { 12, 4}, { 16, 2},
00475 {-20, 0}, {-16, -2}, {-12, -4}, { -8, -6}, { -4, -8}, { 0,-10}, { 4, -8}, { 8, -6}, { 12, -4}, { 16, -2}, { 20, 0},
00476 {-24, 2}, {-20, 4}, {-16, 6}, {-12, 8}, { -8, 10}, { -4, 12}, { 0, 14}, { 4, 12}, { 8, 10}, { 12, 8}, { 16, 6}, { 20, 4}, { 24, 2},
00477 {-28, 0}, {-24, -2}, {-20, -4}, {-16, -6}, {-12, -8}, { -8,-10}, { -4,-12}, { 0,-14}, { 4,-12}, { 8,-10}, { 12, -8}, { 16, -6}, { 20, -4}, { 24, -2}, { 28, 0},
00478 };
00479
00481 enum EditorTerraformToolbarWidgets {
00482 ETTW_START = 0,
00483 ETTW_CLOSEBOX = ETTW_START,
00484 ETTW_CAPTION,
00485 ETTW_STICKY,
00486 ETTW_BACKGROUND,
00487 ETTW_BUTTONS_START,
00488 ETTW_DEMOLISH = ETTW_BUTTONS_START,
00489 ETTW_LOWER_LAND,
00490 ETTW_RAISE_LAND,
00491 ETTW_LEVEL_LAND,
00492 ETTW_PLACE_ROCKS,
00493 ETTW_PLACE_DESERT_LIGHTHOUSE,
00494 ETTW_PLACE_TRANSMITTER,
00495 ETTW_BUTTONS_END,
00496 ETTW_INCREASE_SIZE = ETTW_BUTTONS_END,
00497 ETTW_DECREASE_SIZE,
00498 ETTW_NEW_SCENARIO,
00499 ETTW_RESET_LANDSCAPE,
00500 };
00501
00506 static void EditorTerraformClick_Dynamite(Window *w)
00507 {
00508 HandlePlacePushButton(w, ETTW_DEMOLISH, ANIMCURSOR_DEMOLISH, VHM_RECT, PlaceProc_DemolishArea);
00509 }
00510
00511 static void EditorTerraformClick_LowerBigLand(Window *w)
00512 {
00513 HandlePlacePushButton(w, ETTW_LOWER_LAND, ANIMCURSOR_LOWERLAND, VHM_POINT, PlaceProc_LowerBigLand);
00514 }
00515
00516 static void EditorTerraformClick_RaiseBigLand(Window *w)
00517 {
00518 HandlePlacePushButton(w, ETTW_RAISE_LAND, ANIMCURSOR_RAISELAND, VHM_POINT, PlaceProc_RaiseBigLand);
00519 }
00520
00521 static void EditorTerraformClick_LevelLand(Window *w)
00522 {
00523 HandlePlacePushButton(w, ETTW_LEVEL_LAND, SPR_CURSOR_LEVEL_LAND, VHM_POINT, PlaceProc_LevelLand);
00524 }
00525
00526 static void EditorTerraformClick_RockyArea(Window *w)
00527 {
00528 HandlePlacePushButton(w, ETTW_PLACE_ROCKS, SPR_CURSOR_ROCKY_AREA, VHM_RECT, PlaceProc_RockyArea);
00529 }
00530
00531 static void EditorTerraformClick_DesertLightHouse(Window *w)
00532 {
00533 HandlePlacePushButton(w, ETTW_PLACE_DESERT_LIGHTHOUSE, SPR_CURSOR_LIGHTHOUSE, VHM_RECT, (_settings_game.game_creation.landscape == LT_TROPIC) ? PlaceProc_DesertArea : PlaceProc_LightHouse);
00534 }
00535
00536 static void EditorTerraformClick_Transmitter(Window *w)
00537 {
00538 HandlePlacePushButton(w, ETTW_PLACE_TRANSMITTER, SPR_CURSOR_TRANSMITTER, VHM_RECT, PlaceProc_Transmitter);
00539 }
00540
00541 static const uint16 _editor_terraform_keycodes[] = {
00542 'D',
00543 'Q',
00544 'W',
00545 'E',
00546 'R',
00547 'T',
00548 'Y'
00549 };
00550
00551 typedef void OnButtonClick(Window *w);
00552 static OnButtonClick * const _editor_terraform_button_proc[] = {
00553 EditorTerraformClick_Dynamite,
00554 EditorTerraformClick_LowerBigLand,
00555 EditorTerraformClick_RaiseBigLand,
00556 EditorTerraformClick_LevelLand,
00557 EditorTerraformClick_RockyArea,
00558 EditorTerraformClick_DesertLightHouse,
00559 EditorTerraformClick_Transmitter
00560 };
00561
00562
00566 static void ResetLandscapeConfirmationCallback(Window *w, bool confirmed)
00567 {
00568 if (confirmed) {
00569 Company *c;
00570
00571
00572
00573 _generating_world = true;
00574
00575
00576 Station *st;
00577 FOR_ALL_STATIONS(st) {
00578 if (IsValidCompanyID(st->owner)) delete st;
00579 }
00580
00581
00582 FOR_ALL_COMPANIES(c) {
00583 ChangeOwnershipOfCompanyItems(c->index, INVALID_OWNER);
00584 delete c;
00585 }
00586 _generating_world = false;
00587 }
00588 }
00589
00590 struct ScenarioEditorLandscapeGenerationWindow : Window {
00591 ScenarioEditorLandscapeGenerationWindow(const WindowDesc *desc, WindowNumber window_number) : Window(desc, window_number)
00592 {
00593 this->widget[ETTW_PLACE_DESERT_LIGHTHOUSE].tooltips = (_settings_game.game_creation.landscape == LT_TROPIC) ? STR_028F_DEFINE_DESERT_AREA : STR_028D_PLACE_LIGHTHOUSE;
00594 this->FindWindowPlacementAndResize(desc);
00595 }
00596
00597 virtual void OnPaint() {
00598 this->DrawWidgets();
00599
00600 int n = _terraform_size * _terraform_size;
00601 const int8 *coords = &_multi_terraform_coords[0][0];
00602
00603 assert(n != 0);
00604 do {
00605 DrawSprite(SPR_WHITE_POINT, PAL_NONE, 88 + coords[0], 55 + coords[1]);
00606 coords += 2;
00607 } while (--n);
00608
00609 if (this->IsWidgetLowered(ETTW_LOWER_LAND) || this->IsWidgetLowered(ETTW_RAISE_LAND)) {
00610 SetTileSelectSize(_terraform_size, _terraform_size);
00611 }
00612 }
00613
00614 virtual EventState OnKeyPress(uint16 key, uint16 keycode)
00615 {
00616 for (uint i = 0; i != lengthof(_editor_terraform_keycodes); i++) {
00617 if (keycode == _editor_terraform_keycodes[i]) {
00618 _editor_terraform_button_proc[i](this);
00619 return ES_HANDLED;
00620 }
00621 }
00622 return ES_NOT_HANDLED;
00623 }
00624
00625 virtual void OnClick(Point pt, int widget)
00626 {
00627 if (IsInsideMM(widget, ETTW_BUTTONS_START, ETTW_BUTTONS_END)) {
00628 _editor_terraform_button_proc[widget - ETTW_BUTTONS_START](this);
00629 } else {
00630 switch (widget) {
00631 case ETTW_INCREASE_SIZE:
00632 case ETTW_DECREASE_SIZE: {
00633 int size = (widget == ETTW_INCREASE_SIZE) ? 1 : -1;
00634 this->HandleButtonClick(widget);
00635 size += _terraform_size;
00636
00637 if (!IsInsideMM(size, 1, 8 + 1)) return;
00638 _terraform_size = size;
00639
00640 SndPlayFx(SND_15_BEEP);
00641 this->SetDirty();
00642 } break;
00643 case ETTW_NEW_SCENARIO:
00644 this->HandleButtonClick(widget);
00645 ShowCreateScenario();
00646 break;
00647 case ETTW_RESET_LANDSCAPE:
00648 ShowQuery(
00649 STR_022C_RESET_LANDSCAPE,
00650 STR_RESET_LANDSCAPE_CONFIRMATION_TEXT,
00651 NULL,
00652 ResetLandscapeConfirmationCallback);
00653 break;
00654 }
00655 }
00656 }
00657
00658 virtual void OnTimeout()
00659 {
00660 for (uint i = ETTW_START; i < this->widget_count; i++) {
00661 if (i == ETTW_BUTTONS_START) i = ETTW_BUTTONS_END;
00662 if (this->IsWidgetLowered(i)) {
00663 this->RaiseWidget(i);
00664 this->InvalidateWidget(i);
00665 }
00666 }
00667 }
00668
00669 virtual void OnPlaceObject(Point pt, TileIndex tile)
00670 {
00671 _place_proc(tile);
00672 }
00673
00674 virtual void OnPlaceDrag(ViewportPlaceMethod select_method, ViewportDragDropSelectionProcess select_proc, Point pt)
00675 {
00676 VpSelectTilesWithMethod(pt.x, pt.y, select_method);
00677 }
00678
00679 virtual void OnPlaceMouseUp(ViewportPlaceMethod select_method, ViewportDragDropSelectionProcess select_proc, Point pt, TileIndex start_tile, TileIndex end_tile)
00680 {
00681 if (pt.x != -1) {
00682 switch (select_proc) {
00683 default: NOT_REACHED();
00684 case DDSP_CREATE_ROCKS:
00685 case DDSP_CREATE_DESERT:
00686 case DDSP_RAISE_AND_LEVEL_AREA:
00687 case DDSP_LOWER_AND_LEVEL_AREA:
00688 case DDSP_LEVEL_AREA:
00689 case DDSP_DEMOLISH_AREA:
00690 GUIPlaceProcDragXY(select_proc, start_tile, end_tile);
00691 break;
00692 }
00693 }
00694 }
00695
00696 virtual void OnPlaceObjectAbort()
00697 {
00698 this->RaiseButtons();
00699 this->SetDirty();
00700 }
00701 };
00702
00703 static const WindowDesc _scen_edit_land_gen_desc = {
00704 WDP_AUTO, WDP_AUTO, 163, 103, 163, 103,
00705 WC_SCEN_LAND_GEN, WC_NONE,
00706 WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_STICKY_BUTTON,
00707 _scen_edit_land_gen_widgets,
00708 };
00709
00710 void ShowEditorTerraformToolbar()
00711 {
00712 AllocateWindowDescFront<ScenarioEditorLandscapeGenerationWindow>(&_scen_edit_land_gen_desc, 0);
00713 }