main_gui.c
changeset 1632 10c391e108b7
parent 1610 c2abd16875a7
child 1633 329a0b826a64
equal deleted inserted replaced
1631:604ae8b0386e 1632:10c391e108b7
    46 static byte _last_built_railtype;
    46 static byte _last_built_railtype;
    47 extern void GenerateWorld(int mode, uint log_x, uint log_y);
    47 extern void GenerateWorld(int mode, uint log_x, uint log_y);
    48 
    48 
    49 extern void GenerateIndustries(void);
    49 extern void GenerateIndustries(void);
    50 extern void GenerateTowns(void);
    50 extern void GenerateTowns(void);
    51 
       
    52 extern void CcTerraform(bool success, uint tile, uint32 p1, uint32 p2);
       
    53 
    51 
    54 void HandleOnEditTextCancel(void)
    52 void HandleOnEditTextCancel(void)
    55 {
    53 {
    56 	switch(_rename_what) {
    54 	switch(_rename_what) {
    57 #ifdef ENABLE_NETWORK
    55 #ifdef ENABLE_NETWORK
  1143 static void AskResetLandscape(uint mode)
  1141 static void AskResetLandscape(uint mode)
  1144 {
  1142 {
  1145 	AllocateWindowDescFront(&_ask_reset_landscape_desc, mode);
  1143 	AllocateWindowDescFront(&_ask_reset_landscape_desc, mode);
  1146 }
  1144 }
  1147 
  1145 
       
  1146 // TODO - Incorporate into game itself to allow for ingame raising/lowering of
       
  1147 // larger chunks at the same time OR remove altogether, as we have 'level land' ?
       
  1148 /**
       
  1149  * Raise/Lower a bigger chunk of land at the same time in the editor. When
       
  1150  * raising get the lowest point, when lowering the highest point, and set all
       
  1151  * tiles in the selection to that height.
       
  1152  * @param tile The top-left tile where the terraforming will start
       
  1153  * @param mode 1 for raising, 0 for lowering land
       
  1154  */
  1148 static void CommonRaiseLowerBigLand(uint tile, int mode)
  1155 static void CommonRaiseLowerBigLand(uint tile, int mode)
  1149 {
  1156 {
  1150 	int size;
  1157 	int size;
  1151 	byte h;
  1158 	byte h;
  1152 
  1159 
  1153 	_error_message_2 = mode ? STR_0808_CAN_T_RAISE_LAND_HERE : STR_0809_CAN_T_LOWER_LAND_HERE;
  1160 	_error_message_2 = mode ? STR_0808_CAN_T_RAISE_LAND_HERE : STR_0809_CAN_T_LOWER_LAND_HERE;
  1154 
  1161 
  1155 	_generating_world = true;
  1162 	_generating_world = true; // used to create green terraformed land
  1156 
       
  1157 //	tile = TILE_FROM_XY(TileX(tile) * 16 + _tile_fract_coords.x + 8, TileY(tile) * 16 + _tile_fract_coords.y + 8);
       
  1158 
  1163 
  1159 	if (_terraform_size == 1) {
  1164 	if (_terraform_size == 1) {
  1160 		DoCommandP(tile, 8, (uint32)mode, CcTerraform, CMD_TERRAFORM_LAND | CMD_AUTO | CMD_MSG(_error_message_2));
  1165 		DoCommandP(tile, 8, (uint32)mode, CcTerraform, CMD_TERRAFORM_LAND | CMD_AUTO | CMD_MSG(_error_message_2));
  1161 	} else {
  1166 	} else {
  1162 		SndPlayTileFx(SND_1F_SPLAT, tile);
  1167 		SndPlayTileFx(SND_1F_SPLAT, tile);
  1163 
  1168 
  1164 		size = _terraform_size;
  1169 		size = _terraform_size;
  1165 		assert(size != 0);
  1170 		assert(size != 0);
  1166 		if (mode != 0) {
  1171 		if (mode != 0) {
  1167 			/* Raise land */
  1172 			/* Raise land */
  1168 			h = 15;
  1173 			h = 15; // XXX - max height
  1169 			BEGIN_TILE_LOOP(tile2, size, size, tile)
  1174 			BEGIN_TILE_LOOP(tile2, size, size, tile)
  1170 				h = min(h, TileHeight(tile2));
  1175 				h = min(h, TileHeight(tile2));
  1171 			END_TILE_LOOP(tile2, size, size, tile)
  1176 			END_TILE_LOOP(tile2, size, size, tile)
  1172 		} else {
  1177 		} else {
  1173 			/* Lower land */
  1178 			/* Lower land */
  1195 static void PlaceProc_LowerBigLand(uint tile)
  1200 static void PlaceProc_LowerBigLand(uint tile)
  1196 {
  1201 {
  1197 	CommonRaiseLowerBigLand(tile, 0);
  1202 	CommonRaiseLowerBigLand(tile, 0);
  1198 }
  1203 }
  1199 
  1204 
  1200 //void CcDemolish(bool success, uint tile, uint32 p1, uint32 p2)
       
  1201 //{
       
  1202 //	if (success) {
       
  1203 		//SndPlayTileFx(0x10, tile);
       
  1204 		//CreateEffectVehicleAbove(TileX(tile) * 16 + 8, TileY(tile) * 16 + 8, 2, EV_DEMOLISH);
       
  1205 //	}
       
  1206 //}
       
  1207 
       
  1208 //void PlaceProc_Demolish(uint tile)
       
  1209 //{
       
  1210 //	DoCommandP(tile, 0, 0, CcDemolish, CMD_LANDSCAPE_CLEAR | CMD_MSG(STR_00B5_CAN_T_CLEAR_THIS_AREA));
       
  1211 //}
       
  1212 
       
  1213 
       
  1214 static void PlaceProc_RockyArea(uint tile)
  1205 static void PlaceProc_RockyArea(uint tile)
  1215 {
  1206 {
  1216 	if (!IsTileType(tile, MP_CLEAR) && !IsTileType(tile, MP_TREES))
  1207 	if (!IsTileType(tile, MP_CLEAR) && !IsTileType(tile, MP_TREES))
  1217 		return;
  1208 		return;
  1218 
  1209 
  1242 
  1233 
  1243 	ModifyTile(tile, MP_SETTYPE(MP_UNMOVABLE) | MP_MAP5, 0);
  1234 	ModifyTile(tile, MP_SETTYPE(MP_UNMOVABLE) | MP_MAP5, 0);
  1244 	SndPlayTileFx(SND_1F_SPLAT, tile);
  1235 	SndPlayTileFx(SND_1F_SPLAT, tile);
  1245 }
  1236 }
  1246 
  1237 
  1247 static void PlaceProc_Desert(uint tile)
  1238 static void PlaceProc_DesertArea(TileIndex tile)
  1248 {
  1239 {
  1249 	SetMapExtraBits(tile, GetMapExtraBits(tile) == 1 ? 0 : 1);
  1240 	VpStartPlaceSizing(tile, VPM_X_AND_Y | GUI_PlaceProc_DesertArea);
       
  1241 }
       
  1242 
       
  1243 static void PlaceProc_WaterArea(TileIndex tile)
       
  1244 {
       
  1245 	VpStartPlaceSizing(tile, VPM_X_AND_Y | GUI_PlaceProc_WaterArea);
  1250 }
  1246 }
  1251 
  1247 
  1252 static const Widget _scen_edit_land_gen_widgets[] = {
  1248 static const Widget _scen_edit_land_gen_widgets[] = {
  1253 {    WWT_TEXTBTN,   RESIZE_NONE,     7,     0,    10,     0,    13, STR_00C5,	STR_018B_CLOSE_WINDOW},
  1249 {   WWT_TEXTBTN,   RESIZE_NONE,     7,     0,    10,     0,    13, STR_00C5,                  STR_018B_CLOSE_WINDOW},
  1254 {    WWT_CAPTION,   RESIZE_NONE,     7,    11,   153,     0,    13, STR_0223_LAND_GENERATION,STR_018C_WINDOW_TITLE_DRAG_THIS},
  1250 {   WWT_CAPTION,   RESIZE_NONE,     7,    11,   169,     0,    13, STR_0223_LAND_GENERATION,  STR_018C_WINDOW_TITLE_DRAG_THIS},
  1255 {     WWT_IMGBTN,   RESIZE_NONE,     7,     0,   153,    14,    99, 0x0,				STR_NULL},
  1251 { WWT_STICKYBOX,   RESIZE_NONE,     7,   170,   181,     0,    13, STR_NULL,                  STR_STICKY_BUTTON},
  1256 {     WWT_IMGBTN,   RESIZE_NONE,    14,    22,    43,    14,    35, 0x2B6,			STR_018F_RAISE_A_CORNER_OF_LAND},
  1252 {    WWT_IMGBTN,   RESIZE_NONE,     7,     0,   181,    14,   101, STR_NULL,                  STR_NULL},
  1257 {     WWT_IMGBTN,   RESIZE_NONE,    14,    44,    65,    14,    35, 0x2B7,			STR_018E_LOWER_A_CORNER_OF_LAND},
  1253 
  1258 {     WWT_IMGBTN,   RESIZE_NONE,    14,     0,    21,    14,    35, 0x2BF,			STR_018D_DEMOLISH_BUILDINGS_ETC},
  1254 {    WWT_IMGBTN,   RESIZE_NONE,    14,     2,    23,    14,    35, SPR_IMG_DYNAMITE,          STR_018D_DEMOLISH_BUILDINGS_ETC},
  1259 {    WWT_TEXTBTN,   RESIZE_NONE,    14,   125,   135,    43,    54, STR_0224,	STR_0228_INCREASE_SIZE_OF_LAND_AREA},
  1255 {    WWT_IMGBTN,   RESIZE_NONE,    14,    24,    45,    14,    35, SPR_IMG_TERRAFORM_UP,      STR_018F_RAISE_A_CORNER_OF_LAND},
  1260 {    WWT_TEXTBTN,   RESIZE_NONE,    14,   125,   135,    56,    67, STR_0225,	STR_0229_DECREASE_SIZE_OF_LAND_AREA},
  1256 {    WWT_IMGBTN,   RESIZE_NONE,    14,    46,    67,    14,    35, SPR_IMG_TERRAFORM_DOWN,    STR_018E_LOWER_A_CORNER_OF_LAND},
  1261 {    WWT_TEXTBTN,   RESIZE_NONE,    14,    20,   135,    75,    86, STR_0226_RANDOM_LAND,		STR_022A_GENERATE_RANDOM_LAND},
  1257 {    WWT_IMGBTN,   RESIZE_NONE,    14,    68,    89,    14,    35, SPR_IMG_LEVEL_LAND,        STR_LEVEL_LAND_TOOLTIP},
  1262 {    WWT_TEXTBTN,   RESIZE_NONE,    14,    20,   135,    88,    99, STR_0227_RESET_LAND,			STR_022B_RESET_LANDSCAPE},
  1258 {    WWT_IMGBTN,   RESIZE_NONE,    14,    90,   111,    14,    35, SPR_IMG_BUILD_CANAL,       STR_CREATE_LAKE},
  1263 
  1259 {    WWT_IMGBTN,   RESIZE_NONE,    14,   112,   134,    14,    35, SPR_IMG_ROCKS,             STR_028C_PLACE_ROCKY_AREAS_ON_LANDSCAPE},
  1264 {     WWT_IMGBTN,   RESIZE_NONE,    14,    88,   109,    14,    35, 0xFF4,			STR_028C_PLACE_ROCKY_AREAS_ON_LANDSCAPE},
  1260 {    WWT_IMGBTN,   RESIZE_NONE,    14,   135,   157,    14,    35, SPR_IMG_LIGHTHOUSE_DESERT, STR_NULL}, // XXX - dynamic
  1265 {     WWT_IMGBTN,   RESIZE_NONE,    14,   110,   131,    14,    35, 0xFF5,			STR_028D_PLACE_LIGHTHOUSE},
  1261 {    WWT_IMGBTN,   RESIZE_NONE,    14,   158,   179,    14,    35, SPR_IMG_TRANSMITTER,       STR_028E_PLACE_TRANSMITTER},
  1266 {     WWT_IMGBTN,   RESIZE_NONE,    14,   132,   153,    14,    35, 0xFF6,			STR_028E_PLACE_TRANSMITTER},
  1262 {   WWT_TEXTBTN,   RESIZE_NONE,    14,   139,   149,    43,    54, STR_0224,                  STR_0228_INCREASE_SIZE_OF_LAND_AREA},
  1267 {     WWT_IMGBTN,   RESIZE_NONE,    14,    66,    87,    14,    35, SPR_OPENTTD_BASE+68,			STR_LEVEL_LAND_TOOLTIP},
  1263 {   WWT_TEXTBTN,   RESIZE_NONE,    14,   139,   149,    56,    67, STR_0225,                  STR_0229_DECREASE_SIZE_OF_LAND_AREA},
       
  1264 {   WWT_TEXTBTN,   RESIZE_NONE,    14,    34,   149,    75,    86, STR_0226_RANDOM_LAND,      STR_022A_GENERATE_RANDOM_LAND},
       
  1265 {   WWT_TEXTBTN,   RESIZE_NONE,    14,    34,   149,    88,    99, STR_0227_RESET_LAND,       STR_022B_RESET_LANDSCAPE},
  1268 {   WIDGETS_END},
  1266 {   WIDGETS_END},
  1269 };
  1267 };
  1270 
  1268 
  1271 static const int8 _multi_terraform_coords[][2] = {
  1269 static const int8 _multi_terraform_coords[][2] = {
  1272 	{  0, -2},
  1270 	{  0, -2},
  1277 	{-20,  0},{-16, -2},{-12, -4},{ -8, -6},{ -4, -8},{  0,-10},{  4, -8},{  8, -6},{ 12, -4},{ 16, -2},{ 20,  0},
  1275 	{-20,  0},{-16, -2},{-12, -4},{ -8, -6},{ -4, -8},{  0,-10},{  4, -8},{  8, -6},{ 12, -4},{ 16, -2},{ 20,  0},
  1278 	{-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},
  1276 	{-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},
  1279 	{-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},
  1277 	{-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},
  1280 };
  1278 };
  1281 
  1279 
       
  1280 // TODO - Merge with terraform_gui.c (move there) after I have cooled down at its braindeadness
       
  1281 // and changed OnButtonClick to include the widget as well in the function decleration. Post 0.4.0 - Darkvater
       
  1282 static void EditorTerraformClick_Dynamite(Window *w)
       
  1283 {
       
  1284 	HandlePlacePushButton(w, 4, ANIMCURSOR_DEMOLISH, 1, PlaceProc_DemolishArea);
       
  1285 }
       
  1286 
       
  1287 static void EditorTerraformClick_LowerBigLand(Window *w)
       
  1288 {
       
  1289 	HandlePlacePushButton(w, 5, ANIMCURSOR_LOWERLAND, 2, PlaceProc_LowerBigLand);
       
  1290 }
       
  1291 
       
  1292 static void EditorTerraformClick_RaiseBigLand(Window *w)
       
  1293 {
       
  1294 	HandlePlacePushButton(w, 6, ANIMCURSOR_RAISELAND, 2, PlaceProc_RaiseBigLand);
       
  1295 }
       
  1296 
       
  1297 static void EditorTerraformClick_LevelLand(Window *w)
       
  1298 {
       
  1299 	HandlePlacePushButton(w, 7, SPR_CURSOR_LEVEL_LAND, 2, PlaceProc_LevelLand);
       
  1300 }
       
  1301 
       
  1302 static void EditorTerraformClick_WaterArea(Window *w)
       
  1303 {
       
  1304 	HandlePlacePushButton(w, 8, SPR_CURSOR_CANAL, 1, PlaceProc_WaterArea);
       
  1305 }
       
  1306 
       
  1307 static void EditorTerraformClick_RockyArea(Window *w)
       
  1308 {
       
  1309 	HandlePlacePushButton(w, 9, SPR_CURSOR_ROCKY_AREA, 1, PlaceProc_RockyArea);
       
  1310 }
       
  1311 
       
  1312 static void EditorTerraformClick_DesertLightHouse(Window *w)
       
  1313 {
       
  1314 	HandlePlacePushButton(w, 10, SPR_CURSOR_LIGHTHOUSE, 1, (_opt.landscape == LT_DESERT) ? PlaceProc_DesertArea : PlaceProc_LightHouse);
       
  1315 }
       
  1316 
       
  1317 static void EditorTerraformClick_Transmitter(Window *w)
       
  1318 {
       
  1319 	HandlePlacePushButton(w, 11, SPR_CURSOR_TRANSMITTER, 1, PlaceProc_Transmitter);
       
  1320 }
       
  1321 
       
  1322 static const uint16 _editor_terraform_keycodes[] = {
       
  1323 	'D',
       
  1324 	'Q',
       
  1325 	'W',
       
  1326 	'E',
       
  1327 	'R',
       
  1328 	'T',
       
  1329 	'Y',
       
  1330 	'U'
       
  1331 };
       
  1332 
       
  1333 typedef void OnButtonClick(Window *w);
       
  1334 static OnButtonClick * const _editor_terraform_button_proc[] = {
       
  1335 	EditorTerraformClick_Dynamite,
       
  1336 	EditorTerraformClick_LowerBigLand,
       
  1337 	EditorTerraformClick_RaiseBigLand,
       
  1338 	EditorTerraformClick_LevelLand,
       
  1339 	EditorTerraformClick_WaterArea,
       
  1340 	EditorTerraformClick_RockyArea,
       
  1341 	EditorTerraformClick_DesertLightHouse,
       
  1342 	EditorTerraformClick_Transmitter
       
  1343 };
       
  1344 
  1282 static void ScenEditLandGenWndProc(Window *w, WindowEvent *e)
  1345 static void ScenEditLandGenWndProc(Window *w, WindowEvent *e)
  1283 {
  1346 {
  1284 	switch(e->event) {
  1347 	switch (e->event) {
       
  1348 	case WE_CREATE:
       
  1349 		// XXX - lighthouse button is widget 10!! Don't forget when changing
       
  1350 		w->widget[10].tooltips = (_opt.landscape == LT_DESERT) ? STR_028F_DEFINE_DESERT_AREA : STR_028D_PLACE_LIGHTHOUSE;
       
  1351 		break;
       
  1352 
  1285 	case WE_PAINT:
  1353 	case WE_PAINT:
  1286 		// XXX - lighthouse button is widget 11!! Don't forget when changing
       
  1287 		w->widget[11].tooltips = (_opt.landscape == LT_DESERT) ? STR_028F_DEFINE_DESERT_AREA : STR_028D_PLACE_LIGHTHOUSE;
       
  1288 		DrawWindowWidgets(w);
  1354 		DrawWindowWidgets(w);
  1289 
  1355 
  1290 		{
  1356 		{
  1291 			int n = _terraform_size * _terraform_size;
  1357 			int n = _terraform_size * _terraform_size;
  1292 			const int8 *coords = &_multi_terraform_coords[0][0];
  1358 			const int8 *coords = &_multi_terraform_coords[0][0];
  1293 
  1359 
  1294 			assert(n != 0);
  1360 			assert(n != 0);
  1295 			do {
  1361 			do {
  1296 				DrawSprite(0xFEF, 77 + coords[0], 55 + coords[1]);
  1362 				DrawSprite(SPR_WHITE_POINT, 77 + coords[0], 55 + coords[1]);
  1297 				coords += 2;
  1363 				coords += 2;
  1298 			} while (--n);
  1364 			} while (--n);
  1299 		}
  1365 		}
  1300 
  1366 
  1301 		if (_thd.window_class == WC_SCEN_LAND_GEN && (w->click_state&(1<<3|1<<4))) {
  1367 		if (w->click_state & ( 1 << 5 | 1 << 6)) // change area-size if raise/lower corner is selected
  1302 			SetTileSelectSize(_terraform_size, _terraform_size);
  1368 			SetTileSelectSize(_terraform_size, _terraform_size);
  1303 		}
  1369 
  1304 		break;
  1370 		break;
       
  1371 
       
  1372 	case WE_KEYPRESS: {
       
  1373 		int i;
       
  1374 
       
  1375 		for (i = 0; i != lengthof(_editor_terraform_keycodes); i++) {
       
  1376 			if (e->keypress.keycode == _editor_terraform_keycodes[i]) {
       
  1377 				e->keypress.cont = false;
       
  1378 				_editor_terraform_button_proc[i](w);
       
  1379 				break;
       
  1380 			}
       
  1381 		}
       
  1382 	} break;
       
  1383 
  1305 	case WE_CLICK:
  1384 	case WE_CLICK:
  1306 		switch (e->click.widget) {
  1385 		switch (e->click.widget) {
  1307 		case 3: /* raise corner */
  1386 		case 4: case 5: case 6: case 7: case 8: case 9: case 10: case 11:
  1308 			HandlePlacePushButton(w, 3, ANIMCURSOR_RAISELAND, 2, PlaceProc_RaiseBigLand);
  1387 			_editor_terraform_button_proc[e->click.widget - 4](w);
  1309 			break;
  1388 			break;
  1310 		case 4: /* lower corner */
  1389 		case 12: case 13: { /* Increase/Decrease terraform size */
  1311 			HandlePlacePushButton(w, 4, ANIMCURSOR_LOWERLAND, 2, PlaceProc_LowerBigLand);
  1390 			int size = (e->click.widget == 12) ? 1 : -1;
  1312 			break;
  1391 			HandleButtonClick(w, e->click.widget);
  1313 		case 5: /* demolish */
       
  1314 			HandlePlacePushButton(w, 5, ANIMCURSOR_DEMOLISH, 1, PlaceProc_DemolishArea);
       
  1315 			break;
       
  1316 		{
       
  1317 			int size;
       
  1318 		case 6: /* increase terraform size */
       
  1319 			HandleButtonClick(w, 6);
       
  1320 			size = 1;
       
  1321 			goto terraform_size_common;
       
  1322 		case 7: /* decrease terraform size */
       
  1323 			HandleButtonClick(w, 7);
       
  1324 			size = -1;
       
  1325 terraform_size_common:;
       
  1326 			size += _terraform_size;
  1392 			size += _terraform_size;
  1327 			if (!IS_INT_INSIDE(size, 1, 8+1))
  1393 
  1328 				return;
  1394 			if (!IS_INT_INSIDE(size, 1, 8 + 1))	return;
  1329 			_terraform_size = size;
  1395 			_terraform_size = size;
       
  1396 
  1330 			SndPlayFx(SND_15_BEEP);
  1397 			SndPlayFx(SND_15_BEEP);
  1331 			SetWindowDirty(w);
  1398 			SetWindowDirty(w);
  1332 			break;
  1399 		} break;
  1333 		}
  1400 		case 14: /* gen random land */
  1334 
  1401 			HandleButtonClick(w, 14);
  1335 		case 8: /* gen random land */
       
  1336 			HandleButtonClick(w, 8);
       
  1337 			AskResetLandscape(0);
  1402 			AskResetLandscape(0);
  1338 			break;
  1403 			break;
  1339 
  1404 		case 15: /* reset landscape */
  1340 		case 9: /* reset landscape */
  1405 			HandleButtonClick(w,15);
  1341 			HandleButtonClick(w,9);
       
  1342 			AskResetLandscape(1);
  1406 			AskResetLandscape(1);
  1343 			break;
  1407 			break;
  1344 
  1408 		}
  1345 		case 10: /* place rocky areas */
  1409 		break;
  1346 			HandlePlacePushButton(w, 10, 0xFF7, 1, PlaceProc_RockyArea);
  1410 
  1347 			break;
       
  1348 
       
  1349 		case 11: /* place lighthouse */
       
  1350 			HandlePlacePushButton(w, 11, 0xFF8, 1, _opt.landscape == LT_DESERT ? PlaceProc_Desert : PlaceProc_LightHouse);
       
  1351 			break;
       
  1352 
       
  1353 		case 12: /* place transmitter */
       
  1354 			HandlePlacePushButton(w, 12, 0xFF9, 1, PlaceProc_Transmitter);
       
  1355 			break;
       
  1356 
       
  1357 		case 13: /* level Land */
       
  1358 			HandlePlacePushButton(w, 13, SPR_OPENTTD_BASE+69, 2, PlaceProc_LevelLand);
       
  1359 			break;
       
  1360 		}
       
  1361 		break;
       
  1362 	case WE_TIMEOUT:
  1411 	case WE_TIMEOUT:
  1363 		UnclickSomeWindowButtons(w, ~(1<<3 | 1<<4 | 1<<5 | 1<<10 | 1<<11 | 1<<12));
  1412 		UnclickSomeWindowButtons(w, ~(1<<4 | 1<<5 | 1<<6 | 1<<7 | 1<<8 | 1<<9 | 1<<10 | 1<<11));
  1364 		break;
  1413 		break;
  1365 	case WE_PLACE_OBJ:
  1414 	case WE_PLACE_OBJ:
  1366 		_place_proc(e->place.tile);
  1415 		_place_proc(e->place.tile);
  1367 		break;
  1416 		break;
  1368 	case WE_PLACE_DRAG: {
  1417 	case WE_PLACE_DRAG:
  1369 		VpSelectTilesWithMethod(e->place.pt.x, e->place.pt.y, e->place.userdata & 0xF);
  1418 		VpSelectTilesWithMethod(e->place.pt.x, e->place.pt.y, e->place.userdata & 0xF);
  1370 		return;
  1419 		break;
  1371 	}
  1420 
  1372 	case WE_PLACE_MOUSEUP:
  1421 	case WE_PLACE_MOUSEUP:
  1373 		if (e->click.pt.x != -1) {
  1422 		if (e->click.pt.x != -1) {
  1374 			uint start_tile = e->place.starttile;
  1423 			if ((e->place.userdata & 0xF) == VPM_X_AND_Y) // dragged actions
  1375 			uint end_tile = e->place.tile;
  1424 				GUIPlaceProcDragXY(e);
  1376 			if (e->place.userdata == VPM_X_AND_Y) {
  1425 		}
  1377 				DoCommandP(end_tile, start_tile, 0, CcPlaySound10, CMD_CLEAR_AREA | CMD_MSG(STR_00B5_CAN_T_CLEAR_THIS_AREA));
  1426 		break;
  1378 			} else if (e->place.userdata == (VPM_X_AND_Y | (2<<4))) {
       
  1379 				DoCommandP(end_tile, start_tile, 0, CcPlaySound10, CMD_LEVEL_LAND | CMD_AUTO);
       
  1380 			}
       
  1381 		}
       
  1382 	break;
       
  1383 
  1427 
  1384 	case WE_ABORT_PLACE_OBJ:
  1428 	case WE_ABORT_PLACE_OBJ:
  1385 		w->click_state = 0;
  1429 		w->click_state = 0;
  1386 		SetWindowDirty(w);
  1430 		SetWindowDirty(w);
  1387 		break;
  1431 		break;
  1388 	}
  1432 	}
  1389 }
  1433 }
  1390 
  1434 
  1391 static const WindowDesc _scen_edit_land_gen_desc = {
  1435 static const WindowDesc _scen_edit_land_gen_desc = {
  1392 	-1,-1, 154, 100,
  1436 	-1,-1, 182, 102,
  1393 	WC_SCEN_LAND_GEN,0,
  1437 	WC_SCEN_LAND_GEN,0,
  1394 	WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET,
  1438 	WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_STICKY_BUTTON,
  1395 	_scen_edit_land_gen_widgets,
  1439 	_scen_edit_land_gen_widgets,
  1396 	ScenEditLandGenWndProc,
  1440 	ScenEditLandGenWndProc,
  1397 };
  1441 };
  1398 
  1442 
       
  1443 static inline void ShowEditorTerraformToolBar(void)
       
  1444 {
       
  1445 	AllocateWindowDescFront(&_scen_edit_land_gen_desc, 0);
       
  1446 }
       
  1447 
  1399 static void ToolbarScenGenLand(Window *w)
  1448 static void ToolbarScenGenLand(Window *w)
  1400 {
  1449 {
  1401 	HandleButtonClick(w, 11);
  1450 	HandleButtonClick(w, 11);
  1402 	SndPlayFx(SND_15_BEEP);
  1451 	SndPlayFx(SND_15_BEEP);
  1403 
  1452 
  1404 	AllocateWindowDescFront(&_scen_edit_land_gen_desc, 0);
  1453 	ShowEditorTerraformToolBar();
  1405 }
  1454 }
  1406 
  1455 
  1407 void CcBuildTown(bool success, uint tile, uint32 p1, uint32 p2)
  1456 void CcBuildTown(bool success, uint tile, uint32 p1, uint32 p2)
  1408 {
  1457 {
  1409 	if (success) {
  1458 	if (success) {
  1417 	DoCommandP(tile, 0, 0, CcBuildTown, CMD_BUILD_TOWN | CMD_MSG(STR_0236_CAN_T_BUILD_TOWN_HERE));
  1466 	DoCommandP(tile, 0, 0, CcBuildTown, CMD_BUILD_TOWN | CMD_MSG(STR_0236_CAN_T_BUILD_TOWN_HERE));
  1418 }
  1467 }
  1419 
  1468 
  1420 
  1469 
  1421 static const Widget _scen_edit_town_gen_widgets[] = {
  1470 static const Widget _scen_edit_town_gen_widgets[] = {
  1422 {    WWT_TEXTBTN,   RESIZE_NONE,     7,     0,    10,     0,    13, STR_00C5,									STR_018B_CLOSE_WINDOW},
  1471 {    WWT_TEXTBTN,   RESIZE_NONE,     7,     0,    10,     0,    13, STR_00C5,                 STR_018B_CLOSE_WINDOW},
  1423 {    WWT_CAPTION,   RESIZE_NONE,     7,    11,   159,     0,    13, STR_0233_TOWN_GENERATION,	STR_018C_WINDOW_TITLE_DRAG_THIS},
  1472 {    WWT_CAPTION,   RESIZE_NONE,     7,    11,   147,     0,    13, STR_0233_TOWN_GENERATION, STR_018C_WINDOW_TITLE_DRAG_THIS},
  1424 {     WWT_IMGBTN,   RESIZE_NONE,     7,     0,   159,    14,    81, 0x0,												STR_NULL},
  1473 {  WWT_STICKYBOX,   RESIZE_NONE,     7,   148,   159,     0,    13, 0x0,                      STR_STICKY_BUTTON},
  1425 {    WWT_TEXTBTN,   RESIZE_NONE,    14,     2,   157,    16,    27, STR_0234_NEW_TOWN,					STR_0235_CONSTRUCT_NEW_TOWN},
  1474 {     WWT_IMGBTN,   RESIZE_NONE,     7,     0,   159,    14,    81, 0x0,                      STR_NULL},
  1426 {    WWT_TEXTBTN,   RESIZE_NONE,    14,     2,   157,    29,    40, STR_023D_RANDOM_TOWN,			STR_023E_BUILD_TOWN_IN_RANDOM_LOCATION},
  1475 {    WWT_TEXTBTN,   RESIZE_NONE,    14,     2,   157,    16,    27, STR_0234_NEW_TOWN,        STR_0235_CONSTRUCT_NEW_TOWN},
  1427 {    WWT_TEXTBTN,   RESIZE_NONE,    14,     2,   157,    42,    53, STR_MANY_RANDOM_TOWNS,			STR_RANDOM_TOWNS_TIP},
  1476 {    WWT_TEXTBTN,   RESIZE_NONE,    14,     2,   157,    29,    40, STR_023D_RANDOM_TOWN,     STR_023E_BUILD_TOWN_IN_RANDOM_LOCATION},
  1428 {    WWT_TEXTBTN,   RESIZE_NONE,    14,     2,    53,    68,    79, STR_02A1_SMALL,						STR_02A4_SELECT_TOWN_SIZE},
  1477 {    WWT_TEXTBTN,   RESIZE_NONE,    14,     2,   157,    42,    53, STR_MANY_RANDOM_TOWNS,    STR_RANDOM_TOWNS_TIP},
  1429 {    WWT_TEXTBTN,   RESIZE_NONE,    14,    54,   105,    68,    79, STR_02A2_MEDIUM,						STR_02A4_SELECT_TOWN_SIZE},
  1478 {    WWT_TEXTBTN,   RESIZE_NONE,    14,     2,    53,    68,    79, STR_02A1_SMALL,           STR_02A4_SELECT_TOWN_SIZE},
  1430 {    WWT_TEXTBTN,   RESIZE_NONE,    14,   106,   157,    68,    79, STR_02A3_LARGE,						STR_02A4_SELECT_TOWN_SIZE},
  1479 {    WWT_TEXTBTN,   RESIZE_NONE,    14,    54,   105,    68,    79, STR_02A2_MEDIUM,          STR_02A4_SELECT_TOWN_SIZE},
       
  1480 {    WWT_TEXTBTN,   RESIZE_NONE,    14,   106,   157,    68,    79, STR_02A3_LARGE,           STR_02A4_SELECT_TOWN_SIZE},
  1431 {   WIDGETS_END},
  1481 {   WIDGETS_END},
  1432 };
  1482 };
  1433 
  1483 
  1434 static void ScenEditTownGenWndProc(Window *w, WindowEvent *e)
  1484 static void ScenEditTownGenWndProc(Window *w, WindowEvent *e)
  1435 {
  1485 {
  1436 	switch(e->event) {
  1486 	switch(e->event) {
  1437 	case WE_PAINT:
  1487 	case WE_PAINT:
  1438 		w->click_state = (w->click_state & ~(1<<6 | 1<<7 | 1<<8) ) | (1 << (_new_town_size + 6));
  1488 		w->click_state = (w->click_state & ~(1<<7 | 1<<8 | 1<<9) ) | (1 << (_new_town_size + 7));
  1439 		DrawWindowWidgets(w);
  1489 		DrawWindowWidgets(w);
  1440 		DrawStringCentered(80, 56, STR_02A5_TOWN_SIZE, 0);
  1490 		DrawStringCentered(80, 56, STR_02A5_TOWN_SIZE, 0);
  1441 		break;
  1491 		break;
  1442 
  1492 
  1443 	case WE_CLICK:
  1493 	case WE_CLICK:
  1444 		switch(e->click.widget) {
  1494 		switch (e->click.widget) {
  1445 		case 3: /* new town */
  1495 		case 4: /* new town */
  1446 			HandlePlacePushButton(w, 3, 0xFF0, 1, PlaceProc_Town);
  1496 			HandlePlacePushButton(w, 4, SPR_CURSOR_TOWN, 1, PlaceProc_Town);
  1447 			break;
  1497 			break;
  1448 		case 4: {/* random town */
  1498 		case 5: {/* random town */
  1449 			Town *t;
  1499 			Town *t;
  1450 
  1500 
  1451 			HandleButtonClick(w, 4);
  1501 			HandleButtonClick(w, 5);
  1452 			_generating_world = true;
  1502 			_generating_world = true;
  1453 			t = CreateRandomTown(20);
  1503 			t = CreateRandomTown(20);
  1454 			_generating_world = false;
  1504 			_generating_world = false;
  1455 			if (t != NULL)
  1505 			if (t != NULL)
  1456 				ScrollMainWindowToTile(t->xy);
  1506 				ScrollMainWindowToTile(t->xy);
  1457 			break;
  1507 			break;
  1458 		}
  1508 		}
  1459 		case 5: {/* many random towns */
  1509 		case 6: {/* many random towns */
  1460 			HandleButtonClick(w, 5);
  1510 			HandleButtonClick(w, 6);
  1461 			_generating_world = true;
  1511 			_generating_world = true;
  1462 			_game_mode = GM_NORMAL; // little hack to avoid towns of the same size
  1512 			_game_mode = GM_NORMAL; // little hack to avoid towns of the same size
  1463 			GenerateTowns();
  1513 			GenerateTowns();
  1464 			_generating_world = false;
  1514 			_generating_world = false;
  1465 			_game_mode = GM_EDITOR;
  1515 			_game_mode = GM_EDITOR;
  1466 			break;
  1516 			break;
  1467 		}
  1517 		}
  1468 
  1518 
  1469 		case 6: case 7: case 8:
  1519 		case 7: case 8: case 9:
  1470 			_new_town_size = e->click.widget - 6;
  1520 			_new_town_size = e->click.widget - 7;
  1471 			SetWindowDirty(w);
  1521 			SetWindowDirty(w);
  1472 			break;
  1522 			break;
  1473 		}
  1523 		}
  1474 		break;
  1524 		break;
  1475 
  1525 
  1476 	case WE_TIMEOUT:
  1526 	case WE_TIMEOUT:
  1477 		UnclickSomeWindowButtons(w, 1<<4 | 1<<5);
  1527 		UnclickSomeWindowButtons(w, 1<<5 | 1<<6);
  1478 		break;
  1528 		break;
  1479 	case WE_PLACE_OBJ:
  1529 	case WE_PLACE_OBJ:
  1480 		_place_proc(e->place.tile);
  1530 		_place_proc(e->place.tile);
  1481 		break;
  1531 		break;
  1482 	case WE_ABORT_PLACE_OBJ:
  1532 	case WE_ABORT_PLACE_OBJ:
  1487 }
  1537 }
  1488 
  1538 
  1489 static const WindowDesc _scen_edit_town_gen_desc = {
  1539 static const WindowDesc _scen_edit_town_gen_desc = {
  1490 	-1,-1, 160, 82,
  1540 	-1,-1, 160, 82,
  1491 	WC_SCEN_TOWN_GEN,0,
  1541 	WC_SCEN_TOWN_GEN,0,
  1492 	WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET,
  1542 	WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_STICKY_BUTTON,
  1493 	_scen_edit_town_gen_widgets,
  1543 	_scen_edit_town_gen_widgets,
  1494 	ScenEditTownGenWndProc,
  1544 	ScenEditTownGenWndProc,
  1495 };
  1545 };
  1496 
  1546 
  1497 static void ToolbarScenGenTown(Window *w)
  1547 static void ToolbarScenGenTown(Window *w)
  2306 		case 'A':
  2356 		case 'A':
  2307 			ShowBuildRailToolbar(_last_built_railtype, 4);
  2357 			ShowBuildRailToolbar(_last_built_railtype, 4);
  2308 			break;
  2358 			break;
  2309 
  2359 
  2310 		case 'L':
  2360 		case 'L':
  2311 			ShowTerraformToolbar();
  2361   		if (_game_mode == GM_EDITOR) {
       
  2362   			ShowEditorTerraformToolBar();
       
  2363   		} else
       
  2364   			ShowTerraformToolbar();
  2312 			break;
  2365 			break;
  2313 
  2366 
  2314 		case 'X':
  2367 		case 'X':
  2315 			_display_opt ^= DO_TRANS_BUILDINGS;
  2368 			_display_opt ^= DO_TRANS_BUILDINGS;
  2316 			MarkWholeScreenDirty();
  2369 			MarkWholeScreenDirty();