terraform_gui.cpp

Go to the documentation of this file.
00001 /* $Id: terraform_gui.cpp 14895 2009-01-07 14:45:07Z rubidium $ */
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       /* FALL THROUGH */
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   /* This button is NOT a place-push-button, so don't treat it as such */
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},             // TTW_CLOSEBOX
00307 {  WWT_CAPTION,   RESIZE_NONE,  COLOUR_DARK_GREEN,  11, 145,   0,  13, STR_LANDSCAPING_TOOLBAR, STR_018C_WINDOW_TITLE_DRAG_THIS},   // TTW_CAPTION
00308 {WWT_STICKYBOX,   RESIZE_NONE,  COLOUR_DARK_GREEN, 146, 157,   0,  13, STR_NULL,                STR_STICKY_BUTTON},                 // TTW_STICKY
00309 
00310 {    WWT_PANEL,   RESIZE_NONE,  COLOUR_DARK_GREEN,  66,  69,  14,  35, 0x0,                    STR_NULL},                           // TTW_SEPERATOR
00311 {   WWT_IMGBTN,   RESIZE_NONE,  COLOUR_DARK_GREEN,   0,  21,  14,  35, SPR_IMG_TERRAFORM_DOWN,  STR_018E_LOWER_A_CORNER_OF_LAND},   // TTW_LOWER_LAND
00312 {   WWT_IMGBTN,   RESIZE_NONE,  COLOUR_DARK_GREEN,  22,  43,  14,  35, SPR_IMG_TERRAFORM_UP,    STR_018F_RAISE_A_CORNER_OF_LAND},   // TTW_RAISE_LAND
00313 {   WWT_IMGBTN,   RESIZE_NONE,  COLOUR_DARK_GREEN,  44,  65,  14,  35, SPR_IMG_LEVEL_LAND,      STR_LEVEL_LAND_TOOLTIP},            // TTW_LEVEL_LAND
00314 {   WWT_IMGBTN,   RESIZE_NONE,  COLOUR_DARK_GREEN,  70,  91,  14,  35, SPR_IMG_DYNAMITE,        STR_018D_DEMOLISH_BUILDINGS_ETC},   // TTW_DEMOLISH
00315 {   WWT_IMGBTN,   RESIZE_NONE,  COLOUR_DARK_GREEN,  92, 113,  14,  35, SPR_IMG_BUY_LAND,        STR_0329_PURCHASE_LAND_FOR_FUTURE}, // TTW_BUY_LAND
00316 {   WWT_IMGBTN,   RESIZE_NONE,  COLOUR_DARK_GREEN, 114, 135,  14,  35, SPR_IMG_PLANTTREES,      STR_0185_PLANT_TREES_PLACE_SIGNS},  // TTW_PLANT_TREES
00317 {   WWT_IMGBTN,   RESIZE_NONE,  COLOUR_DARK_GREEN, 136, 157,  14,  35, SPR_IMG_SIGN,            STR_0289_PLACE_SIGN},               // TTW_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   /* Align the terraform toolbar under the main toolbar and put the linked
00345    * toolbar to left of it
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     /* check out for map overflows */
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       /* Raise land */
00385       h = 15; // XXX - max height
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       /* Lower land */
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   /* not flat || not(trees || clear without bridge above) */
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   /* not flat || not(trees || clear without bridge above) */
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},                   // ETTW_CLOSEBOX
00452 {   WWT_CAPTION,   RESIZE_NONE,  COLOUR_DARK_GREEN,   11,   150,     0,    13, STR_0223_LAND_GENERATION,  STR_018C_WINDOW_TITLE_DRAG_THIS},         // ETTW_CAPTION
00453 { WWT_STICKYBOX,   RESIZE_NONE,  COLOUR_DARK_GREEN,  151,   162,     0,    13, STR_NULL,                  STR_STICKY_BUTTON},                       // ETTW_STICKY
00454 {     WWT_PANEL,   RESIZE_NONE,  COLOUR_DARK_GREEN,    0,   162,    14,   102, 0x0,                       STR_NULL},                                // ETTW_BACKGROUND
00455 {    WWT_IMGBTN,   RESIZE_NONE,  COLOUR_GREY,          2,    23,    16,    37, SPR_IMG_DYNAMITE,          STR_018D_DEMOLISH_BUILDINGS_ETC},         // ETTW_DEMOLISH
00456 {    WWT_IMGBTN,   RESIZE_NONE,  COLOUR_GREY,         24,    45,    16,    37, SPR_IMG_TERRAFORM_DOWN,    STR_018E_LOWER_A_CORNER_OF_LAND},         // ETTW_LOWER_LAND
00457 {    WWT_IMGBTN,   RESIZE_NONE,  COLOUR_GREY,         46,    67,    16,    37, SPR_IMG_TERRAFORM_UP,      STR_018F_RAISE_A_CORNER_OF_LAND},         // ETTW_RAISE_LAND
00458 {    WWT_IMGBTN,   RESIZE_NONE,  COLOUR_GREY,         68,    89,    16,    37, SPR_IMG_LEVEL_LAND,        STR_LEVEL_LAND_TOOLTIP},                  // ETTW_LEVEL_LAND
00459 {    WWT_IMGBTN,   RESIZE_NONE,  COLOUR_GREY,         90,   111,    16,    37, SPR_IMG_ROCKS,             STR_028C_PLACE_ROCKY_AREAS_ON_LANDSCAPE}, // ETTW_PLACE_ROCKS
00460 {    WWT_IMGBTN,   RESIZE_NONE,  COLOUR_GREY,        112,   133,    16,    37, SPR_IMG_LIGHTHOUSE_DESERT, STR_NULL},                                // ETTW_PLACE_DESERT_LIGHTHOUSE XXX - dynamic
00461 {    WWT_IMGBTN,   RESIZE_NONE,  COLOUR_GREY,        134,   156,    16,    37, SPR_IMG_TRANSMITTER,       STR_028E_PLACE_TRANSMITTER},              // ETTW_PLACE_TRANSMITTER
00462 {    WWT_IMGBTN,   RESIZE_NONE,  COLOUR_GREY,        150,   161,    45,    56, SPR_ARROW_UP,              STR_0228_INCREASE_SIZE_OF_LAND_AREA},     // ETTW_INCREASE_SIZE
00463 {    WWT_IMGBTN,   RESIZE_NONE,  COLOUR_GREY,        150,   161,    58,    69, SPR_ARROW_DOWN,            STR_0229_DECREASE_SIZE_OF_LAND_AREA},     // ETTW_DECREASE_SIZE
00464 {   WWT_TEXTBTN,   RESIZE_NONE,  COLOUR_GREY,          2,   161,    76,    87, STR_SE_NEW_WORLD,          STR_022A_GENERATE_RANDOM_LAND},           // ETTW_NEW_SCENARIO
00465 {   WWT_TEXTBTN,   RESIZE_NONE,  COLOUR_GREY,          2,   161,    89,   100, STR_022B_RESET_LANDSCAPE,  STR_RESET_LANDSCAPE_TOOLTIP},             // ETTW_RESET_LANDSCAPE
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     /* Set generating_world to true to get instant-green grass after removing
00572      * company property. */
00573     _generating_world = true;
00574 
00575     /* Delete all stations owned by a company */
00576     Station *st;
00577     FOR_ALL_STATIONS(st) {
00578       if (IsValidCompanyID(st->owner)) delete st;
00579     }
00580 
00581     /* Delete all companies */
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)) { // change area-size if raise/lower corner is selected
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: { // Increase/Decrease terraform 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: // gen random land
00644           this->HandleButtonClick(widget);
00645           ShowCreateScenario();
00646           break;
00647         case ETTW_RESET_LANDSCAPE: // 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; // skip the buttons
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 }

Generated on Fri Jan 9 19:01:52 2009 for openttd by  doxygen 1.5.6