Changeset - r8360:4a4998989c92
[Not reviewed]
master
0 7 0
peter1138 - 16 years ago 2008-01-19 17:00:54
peter1138@openttd.org
(svn r11926) -Feature: Rivers. Graphics must be provided by NewGRF else rivers are drawn as canals. Rivers can currently only be placed with-in the scenario editor.
7 files changed with 130 insertions and 48 deletions:
0 comments (0 inline, 0 general)
src/gui.h
Show inline comments
 
@@ -57,12 +57,13 @@ enum {
 
	DDSP_RAISE_AND_LEVEL_AREA,
 
	DDSP_LOWER_AND_LEVEL_AREA,
 
	DDSP_LEVEL_AREA,
 
	DDSP_CREATE_DESERT,
 
	DDSP_CREATE_ROCKS,
 
	DDSP_CREATE_WATER,
 
	DDSP_CREATE_RIVER,
 
	DDSP_PLANT_TREES,
 
	DDSP_BUILD_BRIDGE,
 

	
 
	/* Rail specific actions */
 
	DDSP_PLACE_RAIL_NE,
 
	DDSP_PLACE_RAIL_NW,
src/lang/english.txt
Show inline comments
 
@@ -723,12 +723,13 @@ STR_028A_RANDOM_TREES                   
 
STR_028B_PLANT_TREES_RANDOMLY_OVER                              :{BLACK}Plant trees randomly over landscape
 
STR_028C_PLACE_ROCKY_AREAS_ON_LANDSCAPE                         :{BLACK}Place rocky areas on landscape
 
STR_028D_PLACE_LIGHTHOUSE                                       :{BLACK}Place lighthouse
 
STR_028E_PLACE_TRANSMITTER                                      :{BLACK}Place transmitter
 
STR_028F_DEFINE_DESERT_AREA                                     :{BLACK}Define desert area.{}Press and hold CTRL to remove it
 
STR_CREATE_LAKE                                                 :{BLACK}Define water area.{}Make a canal, unless CTRL is held down at sea level, when it will flood the surroundings instead
 
STR_CREATE_RIVER                                                :{BLACK}Place rivers.
 
STR_0290_DELETE                                                 :{BLACK}Delete
 
STR_0291_DELETE_THIS_TOWN_COMPLETELY                            :{BLACK}Delete this town completely
 
STR_0292_SAVE_SCENARIO                                          :Save scenario
 
STR_0293_LOAD_SCENARIO                                          :Load scenario
 
STR_LOAD_HEIGHTMAP                                              :Load heightmap
 
STR_0294_QUIT_EDITOR                                            :Quit editor
src/newgrf_canal.h
Show inline comments
 
@@ -8,12 +8,14 @@
 
enum CanalFeature {
 
	CF_WATERSLOPE,
 
	CF_LOCKS,
 
	CF_DIKES,
 
	CF_ICON,
 
	CF_DOCKS,
 
	CF_RIVER_SLOPE,
 
	CF_RIVER_EDGE,
 
	CF_END,
 
};
 

	
 

	
 
/** Table of canal 'feature' sprite groups */
 
extern const SpriteGroup *_canal_sg[CF_END];
src/terraform_gui.cpp
Show inline comments
 
@@ -129,12 +129,15 @@ bool GUIPlaceProcDragXY(const WindowEven
 
		case DDSP_CREATE_DESERT:
 
			GenerateDesertArea(end_tile, start_tile);
 
			break;
 
		case DDSP_CREATE_WATER:
 
			DoCommandP(end_tile, start_tile, _ctrl_pressed, CcBuildCanal, CMD_BUILD_CANAL | CMD_MSG(STR_CANT_BUILD_CANALS));
 
			break;
 
		case DDSP_CREATE_RIVER:
 
			DoCommandP(end_tile, start_tile, 2, CcBuildCanal, CMD_BUILD_CANAL | CMD_MSG(STR_CANT_BUILD_CANALS));
 
			break;
 
		default:
 
			return false;
 
	}
 

	
 
	return true;
 
}
 
@@ -409,29 +412,35 @@ static void PlaceProc_DesertArea(TileInd
 

	
 
static void PlaceProc_WaterArea(TileIndex tile)
 
{
 
	VpStartPlaceSizing(tile, VPM_X_AND_Y, DDSP_CREATE_WATER);
 
}
 

	
 
static void PlaceProc_RiverArea(TileIndex tile)
 
{
 
	VpStartPlaceSizing(tile, VPM_X_AND_Y, DDSP_CREATE_RIVER);
 
}
 

	
 
static const Widget _scen_edit_land_gen_widgets[] = {
 
{  WWT_CLOSEBOX,   RESIZE_NONE,     7,     0,    10,     0,    13, STR_00C5,                  STR_018B_CLOSE_WINDOW},
 
{   WWT_CAPTION,   RESIZE_NONE,     7,    11,   169,     0,    13, STR_0223_LAND_GENERATION,  STR_018C_WINDOW_TITLE_DRAG_THIS},
 
{ WWT_STICKYBOX,   RESIZE_NONE,     7,   170,   181,     0,    13, STR_NULL,                  STR_STICKY_BUTTON},
 
{     WWT_PANEL,   RESIZE_NONE,     7,     0,   181,    14,   102, 0x0,                       STR_NULL},
 
{   WWT_CAPTION,   RESIZE_NONE,     7,    11,   191,     0,    13, STR_0223_LAND_GENERATION,  STR_018C_WINDOW_TITLE_DRAG_THIS},
 
{ WWT_STICKYBOX,   RESIZE_NONE,     7,   192,   203,     0,    13, STR_NULL,                  STR_STICKY_BUTTON},
 
{     WWT_PANEL,   RESIZE_NONE,     7,     0,   203,    14,   102, 0x0,                       STR_NULL},
 
{    WWT_IMGBTN,   RESIZE_NONE,    14,     2,    23,    16,    37, SPR_IMG_DYNAMITE,          STR_018D_DEMOLISH_BUILDINGS_ETC},
 
{    WWT_IMGBTN,   RESIZE_NONE,    14,    24,    45,    16,    37, SPR_IMG_TERRAFORM_DOWN,    STR_018E_LOWER_A_CORNER_OF_LAND},
 
{    WWT_IMGBTN,   RESIZE_NONE,    14,    46,    67,    16,    37, SPR_IMG_TERRAFORM_UP,      STR_018F_RAISE_A_CORNER_OF_LAND},
 
{    WWT_IMGBTN,   RESIZE_NONE,    14,    68,    89,    16,    37, SPR_IMG_LEVEL_LAND,        STR_LEVEL_LAND_TOOLTIP},
 
{    WWT_IMGBTN,   RESIZE_NONE,    14,    90,   111,    16,    37, SPR_IMG_BUILD_CANAL,       STR_CREATE_LAKE},
 
{    WWT_IMGBTN,   RESIZE_NONE,    14,   112,   134,    16,    37, SPR_IMG_ROCKS,             STR_028C_PLACE_ROCKY_AREAS_ON_LANDSCAPE},
 
{    WWT_IMGBTN,   RESIZE_NONE,    14,   135,   157,    16,    37, SPR_IMG_LIGHTHOUSE_DESERT, STR_NULL}, // XXX - dynamic
 
{    WWT_IMGBTN,   RESIZE_NONE,    14,   158,   179,    16,    37, SPR_IMG_TRANSMITTER,       STR_028E_PLACE_TRANSMITTER},
 
{    WWT_IMGBTN,   RESIZE_NONE,    14,   139,   150,    45,    56, SPR_ARROW_UP,              STR_0228_INCREASE_SIZE_OF_LAND_AREA},
 
{    WWT_IMGBTN,   RESIZE_NONE,    14,   139,   150,    58,    69, SPR_ARROW_DOWN,            STR_0229_DECREASE_SIZE_OF_LAND_AREA},
 
{   WWT_TEXTBTN,   RESIZE_NONE,    14,    24,   157,    76,    87, STR_SE_NEW_WORLD,          STR_022A_GENERATE_RANDOM_LAND},
 
{   WWT_TEXTBTN,   RESIZE_NONE,    14,    24,   157,    89,   100, STR_022B_RESET_LANDSCAPE,  STR_RESET_LANDSCAPE_TOOLTIP},
 
{    WWT_IMGBTN,   RESIZE_NONE,    14,   112,   133,    16,    37, SPR_IMG_BUILD_CANAL,       STR_CREATE_RIVER},
 
{    WWT_IMGBTN,   RESIZE_NONE,    14,   134,   156,    16,    37, SPR_IMG_ROCKS,             STR_028C_PLACE_ROCKY_AREAS_ON_LANDSCAPE},
 
{    WWT_IMGBTN,   RESIZE_NONE,    14,   157,   179,    16,    37, SPR_IMG_LIGHTHOUSE_DESERT, STR_NULL}, // XXX - dynamic
 
{    WWT_IMGBTN,   RESIZE_NONE,    14,   180,   201,    16,    37, SPR_IMG_TRANSMITTER,       STR_028E_PLACE_TRANSMITTER},
 
{    WWT_IMGBTN,   RESIZE_NONE,    14,   150,   161,    45,    56, SPR_ARROW_UP,              STR_0228_INCREASE_SIZE_OF_LAND_AREA},
 
{    WWT_IMGBTN,   RESIZE_NONE,    14,   150,   161,    58,    69, SPR_ARROW_DOWN,            STR_0229_DECREASE_SIZE_OF_LAND_AREA},
 
{   WWT_TEXTBTN,   RESIZE_NONE,    14,    24,   179,    76,    87, STR_SE_NEW_WORLD,          STR_022A_GENERATE_RANDOM_LAND},
 
{   WWT_TEXTBTN,   RESIZE_NONE,    14,    24,   179,    89,   100, STR_022B_RESET_LANDSCAPE,  STR_RESET_LANDSCAPE_TOOLTIP},
 
{   WIDGETS_END},
 
};
 

	
 
static const int8 _multi_terraform_coords[][2] = {
 
	{  0, -2},
 
	{  4,  0}, { -4,  0}, {  0,  2},
 
@@ -469,45 +478,52 @@ static void EditorTerraformClick_LevelLa
 

	
 
static void EditorTerraformClick_WaterArea(Window *w)
 
{
 
	HandlePlacePushButton(w, 8, SPR_CURSOR_CANAL, VHM_RECT, PlaceProc_WaterArea);
 
}
 

	
 
static void EditorTerraformClick_RiverArea(Window *w)
 
{
 
	HandlePlacePushButton(w, 9, SPR_CURSOR_CANAL, VHM_RECT, PlaceProc_RiverArea);
 
}
 

	
 
static void EditorTerraformClick_RockyArea(Window *w)
 
{
 
	HandlePlacePushButton(w, 9, SPR_CURSOR_ROCKY_AREA, VHM_RECT, PlaceProc_RockyArea);
 
	HandlePlacePushButton(w, 10, SPR_CURSOR_ROCKY_AREA, VHM_RECT, PlaceProc_RockyArea);
 
}
 

	
 
static void EditorTerraformClick_DesertLightHouse(Window *w)
 
{
 
	HandlePlacePushButton(w, 10, SPR_CURSOR_LIGHTHOUSE, VHM_RECT, (_opt.landscape == LT_TROPIC) ? PlaceProc_DesertArea : PlaceProc_LightHouse);
 
	HandlePlacePushButton(w, 11, SPR_CURSOR_LIGHTHOUSE, VHM_RECT, (_opt.landscape == LT_TROPIC) ? PlaceProc_DesertArea : PlaceProc_LightHouse);
 
}
 

	
 
static void EditorTerraformClick_Transmitter(Window *w)
 
{
 
	HandlePlacePushButton(w, 11, SPR_CURSOR_TRANSMITTER, VHM_RECT, PlaceProc_Transmitter);
 
	HandlePlacePushButton(w, 12, SPR_CURSOR_TRANSMITTER, VHM_RECT, PlaceProc_Transmitter);
 
}
 

	
 
static const uint16 _editor_terraform_keycodes[] = {
 
	'D',
 
	'Q',
 
	'W',
 
	'E',
 
	'R',
 
	'T',
 
	'Y',
 
	'U'
 
	'U',
 
	'I'
 
};
 

	
 
typedef void OnButtonClick(Window *w);
 
static OnButtonClick * const _editor_terraform_button_proc[] = {
 
	EditorTerraformClick_Dynamite,
 
	EditorTerraformClick_LowerBigLand,
 
	EditorTerraformClick_RaiseBigLand,
 
	EditorTerraformClick_LevelLand,
 
	EditorTerraformClick_WaterArea,
 
	EditorTerraformClick_RiverArea,
 
	EditorTerraformClick_RockyArea,
 
	EditorTerraformClick_DesertLightHouse,
 
	EditorTerraformClick_Transmitter
 
};
 

	
 

	
 
@@ -540,25 +556,25 @@ static void ResetLandscapeConfirmationCa
 
}
 

	
 
static void ScenEditLandGenWndProc(Window *w, WindowEvent *e)
 
{
 
	switch (e->event) {
 
		case WE_CREATE:
 
			/* XXX - lighthouse button is widget 10!! Don't forget when changing */
 
			w->widget[10].tooltips = (_opt.landscape == LT_TROPIC) ? STR_028F_DEFINE_DESERT_AREA : STR_028D_PLACE_LIGHTHOUSE;
 
			/* XXX - lighthouse button is widget 11!! Don't forget when changing */
 
			w->widget[11].tooltips = (_opt.landscape == LT_TROPIC) ? STR_028F_DEFINE_DESERT_AREA : STR_028D_PLACE_LIGHTHOUSE;
 
			break;
 

	
 
		case WE_PAINT: {
 
			DrawWindowWidgets(w);
 

	
 
			int n = _terraform_size * _terraform_size;
 
			const int8 *coords = &_multi_terraform_coords[0][0];
 

	
 
			assert(n != 0);
 
			do {
 
				DrawSprite(SPR_WHITE_POINT, PAL_NONE, 77 + coords[0], 55 + coords[1]);
 
				DrawSprite(SPR_WHITE_POINT, PAL_NONE, 88 + coords[0], 55 + coords[1]);
 
				coords += 2;
 
			} while (--n);
 

	
 
			if (w->IsWidgetLowered(5) || w->IsWidgetLowered(6)) // change area-size if raise/lower corner is selected
 
				SetTileSelectSize(_terraform_size, _terraform_size);
 

	
 
@@ -573,31 +589,31 @@ static void ScenEditLandGenWndProc(Windo
 
				}
 
			}
 
			break;
 

	
 
		case WE_CLICK:
 
			switch (e->we.click.widget) {
 
				case 4: case 5: case 6: case 7: case 8: case 9: case 10: case 11:
 
				case 4: case 5: case 6: case 7: case 8: case 9: case 10: case 11: case 12:
 
					_editor_terraform_button_proc[e->we.click.widget - 4](w);
 
					break;
 
				case 12: case 13: { // Increase/Decrease terraform size
 
					int size = (e->we.click.widget == 12) ? 1 : -1;
 
				case 13: case 14: { // Increase/Decrease terraform size
 
					int size = (e->we.click.widget == 13) ? 1 : -1;
 
					w->HandleButtonClick(e->we.click.widget);
 
					size += _terraform_size;
 

	
 
					if (!IsInsideMM(size, 1, 8 + 1)) return;
 
					_terraform_size = size;
 

	
 
					SndPlayFx(SND_15_BEEP);
 
					SetWindowDirty(w);
 
				} break;
 
				case 14: // gen random land
 
					w->HandleButtonClick(14);
 
				case 15: // gen random land
 
					w->HandleButtonClick(15);
 
					ShowCreateScenario();
 
					break;
 
				case 15: // Reset landscape
 
				case 16: // Reset landscape
 
					ShowQuery(
 
						STR_022C_RESET_LANDSCAPE,
 
						STR_RESET_LANDSCAPE_CONFIRMATION_TEXT,
 
						NULL,
 
						ResetLandscapeConfirmationCallback);
 
					break;
 
@@ -607,13 +623,13 @@ static void ScenEditLandGenWndProc(Windo
 
		case WE_TIMEOUT:
 
			for (uint i = 0; i < w->widget_count; i++) {
 
				if (w->IsWidgetLowered(i)) {
 
					w->RaiseWidget(i);
 
					w->InvalidateWidget(i);
 
				}
 
				if (i == 3) i = 11;
 
				if (i == 3) i = 12;
 
			}
 
			break;
 

	
 
		case WE_PLACE_OBJ:
 
			_place_proc(e->we.place.tile);
 
			break;
 
@@ -625,12 +641,13 @@ static void ScenEditLandGenWndProc(Windo
 
		case WE_PLACE_MOUSEUP:
 
			if (e->we.place.pt.x != -1) {
 
				switch (e->we.place.select_proc) {
 
					case DDSP_CREATE_ROCKS:
 
					case DDSP_CREATE_DESERT:
 
					case DDSP_CREATE_WATER:
 
					case DDSP_CREATE_RIVER:
 
					case DDSP_RAISE_AND_LEVEL_AREA:
 
					case DDSP_LOWER_AND_LEVEL_AREA:
 
					case DDSP_LEVEL_AREA:
 
					case DDSP_DEMOLISH_AREA:
 
						GUIPlaceProcDragXY(e);
 
						break;
 
@@ -643,13 +660,13 @@ static void ScenEditLandGenWndProc(Windo
 
			SetWindowDirty(w);
 
			break;
 
	}
 
}
 

	
 
static const WindowDesc _scen_edit_land_gen_desc = {
 
	WDP_AUTO, WDP_AUTO, 182, 103, 182, 103,
 
	WDP_AUTO, WDP_AUTO, 204, 103, 204, 103,
 
	WC_SCEN_LAND_GEN, WC_NONE,
 
	WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_STICKY_BUTTON,
 
	_scen_edit_land_gen_widgets,
 
	ScenEditLandGenWndProc,
 
};
 

	
src/tunnelbridge_cmd.cpp
Show inline comments
 
@@ -373,13 +373,13 @@ CommandCost CmdBuildBridge(TileIndex end
 
			return_cmd_error(STR_5007_MUST_DEMOLISH_BRIDGE_FIRST);
 
		}
 

	
 
		switch (GetTileType(tile)) {
 
			case MP_WATER:
 
				if (!EnsureNoVehicleOnGround(tile)) return_cmd_error(STR_980E_SHIP_IN_THE_WAY);
 
				if (!IsWater(tile) && !IsCoast(tile)) goto not_valid_below;
 
				if (!IsWater(tile) && !IsCoast(tile) && !IsRiver(tile)) goto not_valid_below;
 
				break;
 

	
 
			case MP_RAILWAY:
 
				if (!IsPlainRailTile(tile)) goto not_valid_below;
 
				break;
 

	
src/water_cmd.cpp
Show inline comments
 
@@ -266,14 +266,15 @@ CommandCost CmdBuildCanal(TileIndex tile
 
	int size_x, size_y;
 
	int x;
 
	int y;
 
	int sx, sy;
 

	
 
	if (p1 >= MapSize()) return CMD_ERROR;
 

	
 
	/* Outside of the editor you can only build canals, not oceans */
 
	if (HasBit(p2, 0) && _game_mode != GM_EDITOR) return CMD_ERROR;
 
	if (p2 == 0 && _game_mode != GM_EDITOR) return CMD_ERROR;
 

	
 
	x = TileX(tile);
 
	y = TileY(tile);
 
	sx = TileX(p1);
 
	sy = TileY(p1);
 

	
 
@@ -285,26 +286,29 @@ CommandCost CmdBuildCanal(TileIndex tile
 
	/* Outside the editor you can only drag canals, and not areas */
 
	if (_game_mode != GM_EDITOR && (sx != x && sy != y)) return CMD_ERROR;
 

	
 
	BEGIN_TILE_LOOP(tile, size_x, size_y, TileXY(sx, sy)) {
 
		CommandCost ret;
 

	
 
		if (GetTileSlope(tile, NULL) != SLOPE_FLAT) {
 
		Slope slope = GetTileSlope(tile, NULL);
 
		if (slope != SLOPE_FLAT && (p2 != 2 || (slope != SLOPE_NW && slope != SLOPE_NE && slope != SLOPE_SW && slope != SLOPE_SE))) {
 
			return_cmd_error(STR_0007_FLAT_LAND_REQUIRED);
 
		}
 

	
 
		/* can't make water of water! */
 
		if (IsTileType(tile, MP_WATER) && (!IsTileOwner(tile, OWNER_WATER) || HasBit(p2, 0))) continue;
 
		if (IsTileType(tile, MP_WATER) && (!IsTileOwner(tile, OWNER_WATER) || p2 == 1)) continue;
 

	
 
		ret = DoCommand(tile, 0, 0, flags, CMD_LANDSCAPE_CLEAR);
 
		if (CmdFailed(ret)) return ret;
 
		cost.AddCost(ret);
 

	
 
		if (flags & DC_EXEC) {
 
			if (TileHeight(tile) == 0 && HasBit(p2, 0)) {
 
			if (TileHeight(tile) == 0 && p2 == 1) {
 
				MakeWater(tile);
 
			} else if (p2 == 2) {
 
				MakeRiver(tile);
 
			} else {
 
				MakeCanal(tile, _current_player);
 
			}
 
			MarkTileDirtyByTile(tile);
 
			MarkTilesAroundDirty(tile);
 
		}
 
@@ -320,12 +324,13 @@ CommandCost CmdBuildCanal(TileIndex tile
 
}
 

	
 
static CommandCost ClearTile_Water(TileIndex tile, byte flags)
 
{
 
	switch (GetWaterTileType(tile)) {
 
		case WATER_TILE_CLEAR:
 
		case WATER_TILE_RIVER:
 
			if (flags & DC_NO_WATER) return_cmd_error(STR_3807_CAN_T_BUILD_ON_WATER);
 

	
 
			/* Make sure it's not an edge tile. */
 
			if (!IsInsideMM(TileX(tile), 1, MapMaxX() - 1) ||
 
					!IsInsideMM(TileY(tile), 1, MapMaxY() - 1)) {
 
				return_cmd_error(STR_0002_TOO_CLOSE_TO_EDGE_OF_MAP);
 
@@ -397,57 +402,62 @@ static bool IsWateredTile(TileIndex tile
 
		case MP_STATION:  return IsOilRig(tile) || IsDock(tile) || IsBuoy(tile);
 
		case MP_INDUSTRY: return (GetIndustrySpec(GetIndustryType(tile))->behaviour & INDUSTRYBEH_BUILT_ONWATER) != 0;
 
		default:          return false;
 
	}
 
}
 

	
 
/** draw a canal styled water tile with dikes around */
 
void DrawCanalWater(TileIndex tile)
 
static void DrawWaterEdges(SpriteID base, TileIndex tile)
 
{
 
	uint wa;
 

	
 
	/* Test for custom graphics, else use the default */
 
	SpriteID dikes_base = GetCanalSprite(CF_DIKES, tile);
 
	if (dikes_base == 0) dikes_base = SPR_CANAL_DIKES_BASE;
 

	
 
	/* determine the edges around with water. */
 
	wa  = IsWateredTile(TILE_ADDXY(tile, -1,  0)) << 0;
 
	wa += IsWateredTile(TILE_ADDXY(tile,  0,  1)) << 1;
 
	wa += IsWateredTile(TILE_ADDXY(tile,  1,  0)) << 2;
 
	wa += IsWateredTile(TILE_ADDXY(tile,  0, -1)) << 3;
 

	
 
	if (!(wa & 1)) DrawGroundSprite(dikes_base,     PAL_NONE);
 
	if (!(wa & 2)) DrawGroundSprite(dikes_base + 1, PAL_NONE);
 
	if (!(wa & 4)) DrawGroundSprite(dikes_base + 2, PAL_NONE);
 
	if (!(wa & 8)) DrawGroundSprite(dikes_base + 3, PAL_NONE);
 
	if (!(wa & 1)) DrawGroundSprite(base,     PAL_NONE);
 
	if (!(wa & 2)) DrawGroundSprite(base + 1, PAL_NONE);
 
	if (!(wa & 4)) DrawGroundSprite(base + 2, PAL_NONE);
 
	if (!(wa & 8)) DrawGroundSprite(base + 3, PAL_NONE);
 

	
 
	/* right corner */
 
	switch (wa & 0x03) {
 
		case 0: DrawGroundSprite(dikes_base + 4, PAL_NONE); break;
 
		case 3: if (!IsWateredTile(TILE_ADDXY(tile, -1, 1))) DrawGroundSprite(dikes_base + 8, PAL_NONE); break;
 
		case 0: DrawGroundSprite(base + 4, PAL_NONE); break;
 
		case 3: if (!IsWateredTile(TILE_ADDXY(tile, -1, 1))) DrawGroundSprite(base + 8, PAL_NONE); break;
 
	}
 

	
 
	/* bottom corner */
 
	switch (wa & 0x06) {
 
		case 0: DrawGroundSprite(dikes_base + 5, PAL_NONE); break;
 
		case 6: if (!IsWateredTile(TILE_ADDXY(tile, 1, 1))) DrawGroundSprite(dikes_base + 9, PAL_NONE); break;
 
		case 0: DrawGroundSprite(base + 5, PAL_NONE); break;
 
		case 6: if (!IsWateredTile(TILE_ADDXY(tile, 1, 1))) DrawGroundSprite(base + 9, PAL_NONE); break;
 
	}
 

	
 
	/* left corner */
 
	switch (wa & 0x0C) {
 
		case  0: DrawGroundSprite(dikes_base + 6, PAL_NONE); break;
 
		case 12: if (!IsWateredTile(TILE_ADDXY(tile, 1, -1))) DrawGroundSprite(dikes_base + 10, PAL_NONE); break;
 
		case  0: DrawGroundSprite(base + 6, PAL_NONE); break;
 
		case 12: if (!IsWateredTile(TILE_ADDXY(tile, 1, -1))) DrawGroundSprite(base + 10, PAL_NONE); break;
 
	}
 

	
 
	/* upper corner */
 
	switch (wa & 0x09) {
 
		case 0: DrawGroundSprite(dikes_base + 7, PAL_NONE); break;
 
		case 9: if (!IsWateredTile(TILE_ADDXY(tile, -1, -1))) DrawGroundSprite(dikes_base + 11, PAL_NONE); break;
 
		case 0: DrawGroundSprite(base + 7, PAL_NONE); break;
 
		case 9: if (!IsWateredTile(TILE_ADDXY(tile, -1, -1))) DrawGroundSprite(base + 11, PAL_NONE); break;
 
	}
 
}
 

	
 
/** draw a canal styled water tile with dikes around */
 
void DrawCanalWater(TileIndex tile)
 
{
 
	/* Test for custom graphics, else use the default */
 
	SpriteID dikes_base = GetCanalSprite(CF_DIKES, tile);
 
	if (dikes_base == 0) dikes_base = SPR_CANAL_DIKES_BASE;
 

	
 
	DrawWaterEdges(dikes_base, tile);
 
}
 

	
 
struct LocksDrawTileStruct {
 
	int8 delta_x, delta_y, delta_z;
 
	byte width, height, depth;
 
	SpriteID image;
 
};
 

	
 
@@ -480,12 +490,39 @@ static void DrawWaterStuff(const TileInf
 
			wdts->width, wdts->height,
 
			wdts->unk, ti->z + wdts->delta_z,
 
			IsTransparencySet(TO_BUILDINGS));
 
	}
 
}
 

	
 
static void DrawRiverWater(const TileInfo *ti)
 
{
 
	SpriteID image = SPR_FLAT_WATER_TILE;
 
	SpriteID edges_base = GetCanalSprite(CF_RIVER_EDGE, ti->tile);
 

	
 
	if (ti->tileh != SLOPE_FLAT) {
 
		image = GetCanalSprite(CF_RIVER_SLOPE, ti->tile);
 
		if (image == 0) {
 
			image = SPR_FLAT_WATER_TILE;
 
		} else {
 
			switch (ti->tileh) {
 
				default: NOT_REACHED();
 
				case SLOPE_SE:             edges_base += 12; break;
 
				case SLOPE_NE: image += 1; edges_base += 24; break;
 
				case SLOPE_SW: image += 2; edges_base += 36; break;
 
				case SLOPE_NW: image += 3; edges_base += 48; break;
 
			}
 
		}
 
	}
 

	
 
	DrawGroundSprite(image, PAL_NONE);
 

	
 
	/* Draw canal dikes if there are no river edges to draw. */
 
	if (edges_base <= 48) edges_base = SPR_CANAL_DIKES_BASE;
 
	DrawWaterEdges(edges_base, ti->tile);
 
}
 

	
 
static void DrawTile_Water(TileInfo *ti)
 
{
 
	switch (GetWaterTileType(ti->tile)) {
 
		case WATER_TILE_CLEAR:
 
			DrawGroundSprite(SPR_FLAT_WATER_TILE, PAL_NONE);
 
			if (IsCanal(ti->tile)) DrawCanalWater(ti->tile);
 
@@ -510,12 +547,17 @@ static void DrawTile_Water(TileInfo *ti)
 
			DrawWaterStuff(ti, t, 0, ti->z > t[3].delta_y ? 24 : 0);
 
		} break;
 

	
 
		case WATER_TILE_DEPOT:
 
			DrawWaterStuff(ti, _shipdepot_display_seq[GetSection(ti->tile)], PLAYER_SPRITE_COLOR(GetTileOwner(ti->tile)), 0);
 
			break;
 

	
 
		case WATER_TILE_RIVER:
 
			DrawRiverWater(ti);
 
			DrawBridgeMiddle(ti);
 
			break;
 
	}
 
}
 

	
 
void DrawShipDepotSprite(int x, int y, int image)
 
{
 
	const WaterDrawTileStruct *wdts = _shipdepot_display_seq[image];
 
@@ -548,12 +590,13 @@ static void GetAcceptedCargo_Water(TileI
 
}
 

	
 
static void GetTileDesc_Water(TileIndex tile, TileDesc *td)
 
{
 
	switch (GetWaterTileType(tile)) {
 
		case WATER_TILE_CLEAR:
 
		case WATER_TILE_RIVER:
 
			if (!IsCanal(tile)) {
 
				td->str = STR_3804_WATER;
 
			} else {
 
				td->str = STR_LANDINFO_CANAL;
 
			}
 
			break;
 
@@ -845,12 +888,13 @@ static uint32 GetTileTrackStatus_Water(T
 

	
 
	switch (GetWaterTileType(tile)) {
 
		case WATER_TILE_CLEAR: ts = TRACK_BIT_ALL; break;
 
		case WATER_TILE_COAST: ts = (TrackBits)coast_tracks[GetTileSlope(tile, NULL) & 0xF]; break;
 
		case WATER_TILE_LOCK:  ts = AxisToTrackBits(DiagDirToAxis(GetLockDirection(tile))); break;
 
		case WATER_TILE_DEPOT: ts = AxisToTrackBits(GetShipDepotAxis(tile)); break;
 
		case WATER_TILE_RIVER: ts = (GetTileSlope(tile, NULL) == SLOPE_FLAT) ? TRACK_BIT_ALL : TRACK_BIT_NONE; break;
 
		default: return 0;
 
	}
 
	if (TileX(tile) == 0) {
 
		/* NE border: remove tracks that connects NE tile edge */
 
		ts &= ~(TRACK_BIT_X | TRACK_BIT_UPPER | TRACK_BIT_RIGHT);
 
	}
src/water_map.h
Show inline comments
 
@@ -7,12 +7,13 @@
 

	
 
enum WaterTileType {
 
	WATER_TILE_CLEAR,
 
	WATER_TILE_COAST,
 
	WATER_TILE_LOCK,
 
	WATER_TILE_DEPOT,
 
	WATER_TILE_RIVER,
 
};
 

	
 
enum DepotPart {
 
	DEPOT_NORTH = 0x80,
 
	DEPOT_SOUTH = 0x81,
 
	DEPOT_END   = 0x84,
 
@@ -28,12 +29,13 @@ enum LockPart {
 
static inline WaterTileType GetWaterTileType(TileIndex t)
 
{
 
	assert(IsTileType(t, MP_WATER));
 

	
 
	if (_m[t].m5 == 0) return WATER_TILE_CLEAR;
 
	if (_m[t].m5 == 1) return WATER_TILE_COAST;
 
	if (_m[t].m5 == 2) return WATER_TILE_RIVER;
 
	if (IsInsideMM(_m[t].m5, LOCK_MIDDLE, LOCK_END)) return WATER_TILE_LOCK;
 

	
 
	assert(IsInsideMM(_m[t].m5, DEPOT_NORTH, DEPOT_END));
 
	return WATER_TILE_DEPOT;
 
}
 

	
 
@@ -57,12 +59,17 @@ static inline bool IsCoast(TileIndex t)
 

	
 
static inline bool IsCanal(TileIndex t)
 
{
 
	return GetWaterTileType(t) == WATER_TILE_CLEAR && GetTileOwner(t) != OWNER_WATER;
 
}
 

	
 
static inline bool IsRiver(TileIndex t)
 
{
 
	return GetWaterTileType(t) == WATER_TILE_RIVER;
 
}
 

	
 
static inline bool IsWaterTile(TileIndex t)
 
{
 
	return IsTileType(t, MP_WATER) && IsWater(t);
 
}
 

	
 
static inline TileIndex GetOtherShipDepotTile(TileIndex t)
 
@@ -119,12 +126,22 @@ static inline void MakeShore(TileIndex t
 
	_m[t].m2 = 0;
 
	_m[t].m3 = 0;
 
	_m[t].m4 = 0;
 
	_m[t].m5 = 1;
 
}
 

	
 
static inline void MakeRiver(TileIndex t)
 
{
 
	SetTileType(t, MP_WATER);
 
	SetTileOwner(t, OWNER_WATER);
 
	_m[t].m2 = 0;
 
	_m[t].m3 = 0;
 
	_m[t].m4 = 0;
 
	_m[t].m5 = 2;
 
}
 

	
 
static inline void MakeCanal(TileIndex t, Owner o)
 
{
 
	assert(o != OWNER_WATER);
 
	SetTileType(t, MP_WATER);
 
	SetTileOwner(t, o);
 
	_m[t].m2 = 0;
0 comments (0 inline, 0 general)