| 65 | if (!IsTileFlat(tile) || !IsTileFlat(tile2)) {
| 66 | int h_north_corner_n = TileHeight(tile);
|
|---|
| 66 | int z_slope1;
| 67 | int h_north_corner_s = TileHeight(TileAddByDiagDir(tile, AxisToDiagDir(OtherAxis(axis))));
|
|---|
| 67 | Slope slope1 = GetTileSlope(tile, &z_slope1);
| 68 | int h_middle_corner_n = TileHeight(tile2);
|
|---|
| 68 | int z_middle_corner_n = TileHeight(tile2);
| 69 | int h_middle_corner_s = TileHeight(TileAddByDiagDir(tile2, AxisToDiagDir(OtherAxis(axis))));
|
|---|
| 69 | int z_middle_corner_s = TileHeight(TileAddByDiagDir(tile2, AxisToDiagDir(OtherAxis(axis))));
| 70 | int h_south_corner_n = TileHeight(tile2 + diff);
|
|---|
| 70 | int z_slope2;
| 71 | int h_south_corner_s = TileHeight(TileAddByDiagDir(tile2 + diff, AxisToDiagDir(OtherAxis(axis))));
|
|---|
| 71 | Slope slope2 = GetTileSlope(tile2, &z_slope2);
| 72 |
|
|---|
| 72 |
| 73 | int corners[] = {h_north_corner_n, h_north_corner_s, h_middle_corner_n, h_middle_corner_s, h_south_corner_n, h_south_corner_s};
|
|---|
| 73 | /* Forbid these combinations. */
| 74 |
|
|---|
| 74 | if (IsSteepSlope(slope1) || IsSteepSlope(slope2)) return_cmd_error(STR_ERROR_SITE_UNSUITABLE);
| 75 | int min_h = MAX_TILE_HEIGHT;
|
|---|
| 75 | if (slope1 == SLOPE_NS && slope2 == SLOPE_EW || slope1 == SLOPE_EW && slope2 == SLOPE_NS) return_cmd_error(STR_ERROR_SITE_UNSUITABLE);
| 76 | int max_h = 0;
|
|---|
| 76 | if (z_middle_corner_n != z_middle_corner_s && (IsSlopeWithThreeCornersRaised(slope1) && IsSlopeWithOneCornerRaised(slope2) || IsSlopeWithOneCornerRaised(slope1) && IsSlopeWithThreeCornersRaised(slope2))) return_cmd_error(STR_ERROR_SITE_UNSUITABLE);
| 77 | for (int i = 0; i < lengthof(corners); i++) {
|
|---|
| 77 | if (slope1 == slope2 && IsInclinedSlope(slope1)) return_cmd_error(STR_ERROR_SITE_UNSUITABLE);
| 78 | min_h = min(min_h, corners[i]);
|
|---|
| 78 | if (((IsSlopeWithOneCornerRaised(slope2) || IsSlopeWithThreeCornersRaised(slope2) || slope2 == SLOPE_EW || slope2 == SLOPE_NS) && IsInclinedSlope(slope1) && DiagDirToAxis(GetInclinedSlopeDirection(slope1)) == axis) || ((IsSlopeWithOneCornerRaised(slope1) || IsSlopeWithThreeCornersRaised(slope1) || slope1 == SLOPE_EW || slope1 == SLOPE_NS) && IsInclinedSlope(slope2) && DiagDirToAxis(GetInclinedSlopeDirection(slope2)) == axis)) return_cmd_error(STR_ERROR_SITE_UNSUITABLE);
| 79 | max_h = max(max_h, corners[i]);
|
|---|
| 79 |
| 80 | }
|
|---|
| 80 | /* Terraform these combinations. */
| 81 |
|
|---|
| 81 | if (slope1 == SLOPE_FLAT || slope2 == SLOPE_FLAT) {
| 82 | // int min_h = min(h_north_corner_n, min(h_north_corner_s, min(h_middle_corner_n, min(h_middle_corner_s, min(h_south_corner_n, h_south_corner_s)))));
|
|---|
| 82 | /* Mark the tile as already cleared for the terraform command. */
| 83 | // int max_h = max(h_north_corner_n, max(h_north_corner_s, max(h_middle_corner_n, max(h_middle_corner_s, max(h_south_corner_n, h_south_corner_s)))));
|
|---|
| 83 | ClearedObjectArea *coa = MakeClearedObjectArea(slope1 == SLOPE_FLAT ? tile2 : tile, tile, axis == AXIS_X ? 2 : 1, axis == AXIS_Y ? 2 : 1);
| 84 |
|
|---|
| 84 | /* Hide the tile from the terraforming command. */
| 85 | int best_h;
|
|---|
| 85 | TileIndex tile_flat_before = coa->first_tile;
| 86 | int max_delta = MAX_TILE_HEIGHT;
|
|---|
| 86 | coa->first_tile = INVALID_TILE;
| 87 | for (int h = min_h; h <= max_h; h++) {
|
|---|
| 87 | ret = DoCommand(slope1 == SLOPE_FLAT ? tile2 : tile, slope1 == SLOPE_FLAT ? z_slope1 == z_slope2 ? slope2: ComplementSlope(slope2) : z_slope1 == z_slope2 ? slope1 : ComplementSlope(slope1), z_slope1 == z_slope2 ? 0 : 1, flags | DC_NO_WATER, CMD_TERRAFORM_LAND);
| 88 | int delta = 0;
|
|---|
| 88 | coa->first_tile = tile_flat_before;
| 89 | for (int c = 0; c < lengthof(corners); c++) {
|
|---|
| 89 | if (ret.Failed()) return_cmd_error(STR_ERROR_SITE_UNSUITABLE);
| 90 | delta = max(delta, Delta(h, corners[c]));
|
|---|
| 90 | cost.AddCost(ret);
| 91 | }
|
|---|
| 91 | } else {
| 92 | if (delta < max_delta) {
|
|---|
| 92 | if ((IsSlopeWithThreeCornersRaised(slope1) || IsSlopeWithOneCornerRaised(slope1)) && (IsSlopeWithThreeCornersRaised(slope2) || IsSlopeWithOneCornerRaised(slope2))) {
| 93 | max_delta = delta;
|
|---|
| 93 | /* Mark the tile as already cleared for the terraform command. */
| 94 | best_h = h;
|
|---|
| 94 | ClearedObjectArea *coa = MakeClearedObjectArea(tile, tile, axis == AXIS_X ? 2 : 1, axis == AXIS_Y ? 2 : 1);
| 95 | }
|
|---|
| 95 | /* Hide the tile from the terraforming command. */
| 96 | }
|
|---|
| 96 | TileIndex tile_3corner1_before = coa->first_tile;
| 97 |
|
|---|
| 97 | coa->first_tile = INVALID_TILE;
| 98 | // if (!IsTileFlat(tile) || !IsTileFlat(tile2)) {
|
|---|
| 98 | ret = DoCommand(tile, IsSlopeWithThreeCornersRaised(slope1) ? ComplementSlope(slope1) : slope1, IsSlopeWithThreeCornersRaised(slope1) ? 1 : 0, flags | DC_NO_WATER, CMD_TERRAFORM_LAND);
| 99 | // int z_slope1;
|
|---|
| 99 | coa->first_tile = tile_3corner1_before;
| 100 | // Slope slope1 = GetTileSlope(tile, &z_slope1);
|
|---|
| 100 | if (ret.Failed()) return_cmd_error(STR_ERROR_SITE_UNSUITABLE);
| 101 | // int z_middle_corner_n = TileHeight(tile2);
|
|---|
| 101 | cost.AddCost(ret);
| 102 | // int z_middle_corner_s = TileHeight(TileAddByDiagDir(tile2, AxisToDiagDir(OtherAxis(axis))));
|
|---|
| 102 | if (z_middle_corner_n == z_middle_corner_s) {
| 103 | // int z_slope2;
|
|---|
| 103 | /* Mark the tile as already cleared for the terraform command. */
| 104 | // Slope slope2 = GetTileSlope(tile2, &z_slope2);
|
|---|
| 104 | ClearedObjectArea *coa = MakeClearedObjectArea(tile2, tile, axis == AXIS_X ? 2 : 1, axis == AXIS_Y ? 2 : 1);
| 105 |
|
|---|
| 105 | /* Hide the tile from the terraforming command. */
| 106 | // /* Forbid these combinations. */
|
|---|
| 106 | TileIndex tile_3corner2_before = coa->first_tile;
| 107 | // if (IsSteepSlope(slope1) || IsSteepSlope(slope2)) return_cmd_error(STR_ERROR_SITE_UNSUITABLE);
|
|---|
| 107 | coa->first_tile = INVALID_TILE;
| 108 | // if (slope1 == SLOPE_NS && slope2 == SLOPE_EW || slope1 == SLOPE_EW && slope2 == SLOPE_NS) return_cmd_error(STR_ERROR_SITE_UNSUITABLE);
|
|---|
| 108 | ret = DoCommand(tile2, IsSlopeWithThreeCornersRaised(slope2) ? ComplementSlope(slope2) : slope2, IsSlopeWithThreeCornersRaised(slope2) ? 1 : 0, flags | DC_NO_WATER, CMD_TERRAFORM_LAND);
| 109 | // if (z_middle_corner_n != z_middle_corner_s && (IsSlopeWithThreeCornersRaised(slope1) && IsSlopeWithOneCornerRaised(slope2) || IsSlopeWithOneCornerRaised(slope1) && IsSlopeWithThreeCornersRaised(slope2))) return_cmd_error(STR_ERROR_SITE_UNSUITABLE);
|
|---|
| 109 | coa->first_tile = tile_3corner2_before;
| 110 | // if (slope1 == slope2 && IsInclinedSlope(slope1)) return_cmd_error(STR_ERROR_SITE_UNSUITABLE);
|
|---|
| 110 | if (ret.Failed()) return_cmd_error(STR_ERROR_SITE_UNSUITABLE);
| 111 | // if (((IsSlopeWithOneCornerRaised(slope2) || IsSlopeWithThreeCornersRaised(slope2)) && IsInclinedSlope(slope1) && DiagDirToAxis(GetInclinedSlopeDirection(slope1)) == axis) || ((IsSlopeWithOneCornerRaised(slope1) || IsSlopeWithThreeCornersRaised(slope1)) && IsInclinedSlope(slope2) && DiagDirToAxis(GetInclinedSlopeDirection(slope2)) == axis)) return_cmd_error(STR_ERROR_SITE_UNSUITABLE);
|
|---|
| 111 | cost.AddCost(ret);
| 112 | // if (((slope2 == SLOPE_EW || slope2 == SLOPE_NS) && IsInclinedSlope(slope1) && DiagDirToAxis(GetInclinedSlopeDirection(slope1)) == OtherAxis(axis)) || ((slope1 == SLOPE_EW || slope1 == SLOPE_NS) && IsInclinedSlope(slope2) && DiagDirToAxis(GetInclinedSlopeDirection(slope2)) == OtherAxis(axis))) return_cmd_error(STR_ERROR_SITE_UNSUITABLE);
|
|---|
| 112 | }
| 113 |
|
|---|
| 113 | } else {
| 114 | // /* Terraform these combinations. */
|
|---|
| 114 | if ((IsInclinedSlope(slope1) && DiagDirToAxis(GetInclinedSlopeDirection(slope1)) == OtherAxis(axis) && (IsSlopeWithOneCornerRaised(slope2) || IsSlopeWithThreeCornersRaised(slope2))) || (IsInclinedSlope(slope2) && DiagDirToAxis(GetInclinedSlopeDirection(slope2)) == OtherAxis(axis) && (IsSlopeWithOneCornerRaised(slope1) || IsSlopeWithThreeCornersRaised(slope1)))) {
| 115 | // if (slope1 == SLOPE_FLAT || slope2 == SLOPE_FLAT) {
|
|---|
| 115 | /* Mark the tile as already cleared for the terraform command. */
| 116 | // /* Mark the tile as already cleared for the terraform command. */
|
|---|
| 116 | ClearedObjectArea *coa = MakeClearedObjectArea(IsInclinedSlope(slope1) ? tile : tile2, tile, axis == AXIS_X ? 2 : 1, axis == AXIS_Y ? 2 : 1);
| 117 | // ClearedObjectArea *coa = MakeClearedObjectArea(slope1 == SLOPE_FLAT ? tile2 : tile, tile, axis == AXIS_X ? 2 : 1, axis == AXIS_Y ? 2 : 1);
|
|---|
| 117 | /* Hide the tile from the terraforming command. */
| 118 | // /* Hide the tile from the terraforming command. */
|
|---|
| 118 | TileIndex tile_inclined1_before = coa->first_tile;
| 119 | // TileIndex tile_flat_before = coa->first_tile;
|
|---|
| 119 | coa->first_tile = INVALID_TILE;
| 120 | // coa->first_tile = INVALID_TILE;
|
|---|
| 120 | ret = DoCommand(IsInclinedSlope(slope1) ? tile : tile2, IsInclinedSlope(slope1) ? IsSlopeWithThreeCornersRaised(slope2) ? ComplementSlope(slope1) : slope1 : IsSlopeWithThreeCornersRaised(slope1) ? ComplementSlope(slope2) : slope2, IsInclinedSlope(slope1) ? IsSlopeWithThreeCornersRaised(slope2) ? 1 : 0 : IsSlopeWithThreeCornersRaised(slope1) ? 1 : 0, flags | DC_NO_WATER, CMD_TERRAFORM_LAND);
| 121 | // ret = DoCommand(slope1 == SLOPE_FLAT ? tile2 : tile, slope1 == SLOPE_FLAT ? z_slope1 == z_slope2 ? slope2: ComplementSlope(slope2) : z_slope1 == z_slope2 ? slope1 : ComplementSlope(slope1), z_slope1 == z_slope2 ? 0 : 1, flags | DC_NO_WATER, CMD_TERRAFORM_LAND);
|
|---|
| 121 | coa->first_tile = tile_inclined1_before;
| 122 | // coa->first_tile = tile_flat_before;
|
|---|
| 122 | if (ret.Failed()) return_cmd_error(STR_ERROR_SITE_UNSUITABLE);
| 123 | // if (ret.Failed()) return_cmd_error(STR_ERROR_SITE_UNSUITABLE);
|
|---|
| 123 | cost.AddCost(ret);
| 124 | // cost.AddCost(ret);
|
|---|
| 124 | } else {
| 125 | // } else {
|
|---|
| 125 | if ((slope1 == SLOPE_EW || slope1 == SLOPE_NS) && (IsSlopeWithOneCornerRaised(slope2) || IsSlopeWithThreeCornersRaised(slope2)) || (slope2 == SLOPE_NS || slope2 == SLOPE_EW) && (IsSlopeWithOneCornerRaised(slope1) || IsSlopeWithThreeCornersRaised(slope1))) {
| 126 | // if ((IsSlopeWithThreeCornersRaised(slope1) || IsSlopeWithOneCornerRaised(slope1)) && (IsSlopeWithThreeCornersRaised(slope2) || IsSlopeWithOneCornerRaised(slope2))) {
|
|---|
| 126 | /* Mark the tile as already cleared for the terraform command. */
| 127 | // /* Mark the tile as already cleared for the terraform command. */
|
|---|
| 127 | ClearedObjectArea *coa = MakeClearedObjectArea((slope1 == SLOPE_EW || slope1 == SLOPE_NS), tile, axis == AXIS_X ? 2 : 1, axis == AXIS_Y ? 2 : 1);
| 128 | // ClearedObjectArea *coa = MakeClearedObjectArea(tile, tile, axis == AXIS_X ? 2 : 1, axis == AXIS_Y ? 2 : 1);
|
|---|
| 128 | /* Hide the tile from the terraforming command. */
| 129 | // /* Hide the tile from the terraforming command. */
|
|---|
| 129 | TileIndex tile_oppositecorners_before = coa->first_tile;
| 130 | // TileIndex tile_3corner1_before = coa->first_tile;
|
|---|
| 130 | coa->first_tile = INVALID_TILE;
| 131 | // coa->first_tile = INVALID_TILE;
|
|---|
| 131 | ret = DoCommand((slope1 == SLOPE_EW || slope1 == SLOPE_NS) ? tile : tile2, (slope1 == SLOPE_EW || slope1 == SLOPE_NS) ? IsSlopeWithOneCornerRaised(slope2) ? slope1 : ComplementSlope(slope1) : IsSlopeWithOneCornerRaised(slope1) ? slope2 : ComplementSlope(slope2), (slope1 == SLOPE_EW || slope1 == SLOPE_NS) ? IsSlopeWithOneCornerRaised(slope2) ? 0 : 1 : IsSlopeWithOneCornerRaised(slope1) ? 0 : 1, flags | DC_NO_WATER, CMD_TERRAFORM_LAND);
| 132 | // ret = DoCommand(tile, IsSlopeWithThreeCornersRaised(slope1) ? ComplementSlope(slope1) : slope1, IsSlopeWithThreeCornersRaised(slope1) ? 1 : 0, flags | DC_NO_WATER, CMD_TERRAFORM_LAND);
|
|---|
| 132 | coa->first_tile = tile_oppositecorners_before;
| 133 | // coa->first_tile = tile_3corner1_before;
|
|---|
| 133 | if (ret.Failed()) return_cmd_error(STR_ERROR_SITE_UNSUITABLE);
| 134 | // if (ret.Failed()) return_cmd_error(STR_ERROR_SITE_UNSUITABLE);
|
|---|
| 134 | cost.AddCost(ret);
| 135 | // cost.AddCost(ret);
|
|---|
| 135 | } else {
| 136 | // if (z_middle_corner_n == z_middle_corner_s) {
|
|---|
| 136 | if (slope1 == ComplementSlope(slope2) && IsInclinedSlope(slope1)) {
| 137 | // /* Mark the tile as already cleared for the terraform command. */
|
|---|
| 137 | /* Mark the tile as already cleared for the terraform command. */
| 138 | // ClearedObjectArea *coa = MakeClearedObjectArea(tile2, tile, axis == AXIS_X ? 2 : 1, axis == AXIS_Y ? 2 : 1);
|
|---|
| 138 | ClearedObjectArea *coa = MakeClearedObjectArea(tile, tile, axis == AXIS_X ? 2 : 1, axis == AXIS_Y ? 2 : 1);
| 139 | // /* Hide the tile from the terraforming command. */
|
|---|
| 139 | /* Hide the tile from the terraforming command. */
| 140 | // TileIndex tile_3corner2_before = coa->first_tile;
|
|---|
| 140 | TileIndex tile_complement_before = coa->first_tile;
| 141 | // coa->first_tile = INVALID_TILE;
|
|---|
| 141 | coa->first_tile = INVALID_TILE;
| 142 | // ret = DoCommand(tile2, IsSlopeWithThreeCornersRaised(slope2) ? ComplementSlope(slope2) : slope2, IsSlopeWithThreeCornersRaised(slope2) ? 1 : 0, flags | DC_NO_WATER, CMD_TERRAFORM_LAND);
|
|---|
| 142 | ret = DoCommand(tile, z_slope1 > z_slope2 ? slope2 : slope1, z_slope1 > z_slope2 ? 1 : 0, flags | DC_NO_WATER, CMD_TERRAFORM_LAND);
| 143 | // coa->first_tile = tile_3corner2_before;
|
|---|
| 143 | coa->first_tile = tile_complement_before;
| 144 | // if (ret.Failed()) return_cmd_error(STR_ERROR_SITE_UNSUITABLE);
|
|---|
| 144 | if (ret.Failed()) return_cmd_error(STR_ERROR_SITE_UNSUITABLE);
| 145 | // cost.AddCost(ret);
|
|---|
| 145 | cost.AddCost(ret);
| 146 | // }
|
|---|
| 146 | } else {
| 147 | // } else {
|
|---|
| 147 | /* Shouldn't reach here. */
| 148 | // if ((IsInclinedSlope(slope1) && DiagDirToAxis(GetInclinedSlopeDirection(slope1)) == OtherAxis(axis) && (IsSlopeWithOneCornerRaised(slope2) || IsSlopeWithThreeCornersRaised(slope2))) || (IsInclinedSlope(slope2) && DiagDirToAxis(GetInclinedSlopeDirection(slope2)) == OtherAxis(axis) && (IsSlopeWithOneCornerRaised(slope1) || IsSlopeWithThreeCornersRaised(slope1)))) {
|
|---|
| 148 | assert(false);
| 149 | // /* Mark the tile as already cleared for the terraform command. */
|
|---|
| 149 | }
| 150 | // ClearedObjectArea *coa = MakeClearedObjectArea(IsInclinedSlope(slope1) ? tile : tile2, tile, axis == AXIS_X ? 2 : 1, axis == AXIS_Y ? 2 : 1);
|
|---|
| 150 | }
| 151 | // /* Hide the tile from the terraforming command. */
|
|---|
| 151 | }
| 152 | // TileIndex tile_inclined1_before = coa->first_tile;
|
|---|
| 152 | }
| 153 | // coa->first_tile = INVALID_TILE;
|
|---|
| 153 | }
| 154 | // ret = DoCommand(IsInclinedSlope(slope1) ? tile : tile2, IsInclinedSlope(slope1) ? IsSlopeWithThreeCornersRaised(slope2) ? ComplementSlope(slope1) : slope1 : IsSlopeWithThreeCornersRaised(slope1) ? ComplementSlope(slope2) : slope2, IsInclinedSlope(slope1) ? IsSlopeWithThreeCornersRaised(slope2) ? 1 : 0 : IsSlopeWithThreeCornersRaised(slope1) ? 1 : 0, flags | DC_NO_WATER, CMD_TERRAFORM_LAND);
|
|---|
| 154 | }
| 155 | // coa->first_tile = tile_inclined1_before;
|
|---|
| | | 156 | // if (ret.Failed()) return_cmd_error(STR_ERROR_SITE_UNSUITABLE);
|
|---|
| | | 157 | // cost.AddCost(ret);
|
|---|
| | | 158 | // } else {
|
|---|
| | | 159 | // if ((slope1 == SLOPE_EW || slope1 == SLOPE_NS) && (IsSlopeWithOneCornerRaised(slope2) || IsSlopeWithThreeCornersRaised(slope2)) || (slope2 == SLOPE_NS || slope2 == SLOPE_EW) && (IsSlopeWithOneCornerRaised(slope1) || IsSlopeWithThreeCornersRaised(slope1))) {
|
|---|
| | | 160 | // /* Mark the tile as already cleared for the terraform command. */
|
|---|
| | | 161 | // ClearedObjectArea *coa = MakeClearedObjectArea((slope1 == SLOPE_EW || slope1 == SLOPE_NS) ? tile : tile2, tile, axis == AXIS_X ? 2 : 1, axis == AXIS_Y ? 2 : 1);
|
|---|
| | | 162 | // /* Hide the tile from the terraforming command. */
|
|---|
| | | 163 | // TileIndex tile_oppositecorners_before = coa->first_tile;
|
|---|
| | | 164 | // coa->first_tile = INVALID_TILE;
|
|---|
| | | 165 | // ret = DoCommand((slope1 == SLOPE_EW || slope1 == SLOPE_NS) ? tile : tile2, (slope1 == SLOPE_EW || slope1 == SLOPE_NS) ? IsSlopeWithOneCornerRaised(slope2) ? slope1 : ComplementSlope(slope1) : IsSlopeWithOneCornerRaised(slope1) ? slope2 : ComplementSlope(slope2), (slope1 == SLOPE_EW || slope1 == SLOPE_NS) ? IsSlopeWithOneCornerRaised(slope2) ? 0 : 1 : IsSlopeWithOneCornerRaised(slope1) ? 0 : 1, flags | DC_NO_WATER, CMD_TERRAFORM_LAND);
|
|---|
| | | 166 | // coa->first_tile = tile_oppositecorners_before;
|
|---|
| | | 167 | // if (ret.Failed()) return_cmd_error(STR_ERROR_SITE_UNSUITABLE);
|
|---|
| | | 168 | // cost.AddCost(ret);
|
|---|
| | | 169 | // } else {
|
|---|
| | | 170 | // if (slope1 == ComplementSlope(slope2) && IsInclinedSlope(slope1)) {
|
|---|
| | | 171 | // /* Mark the tile as already cleared for the terraform command. */
|
|---|
| | | 172 | // ClearedObjectArea *coa = MakeClearedObjectArea(tile2, tile, axis == AXIS_X ? 2 : 1, axis == AXIS_Y ? 2 : 1);
|
|---|
| | | 173 | // /* Hide the tile from the terraforming command. */
|
|---|
| | | 174 | // TileIndex tile_complement_before = coa->first_tile;
|
|---|
| | | 175 | // coa->first_tile = INVALID_TILE;
|
|---|
| | | 176 | // ret = DoCommand(tile2, z_middle_corner_n > z_slope1 ? slope2 : slope1, z_middle_corner_n > z_slope1 ? 0 : 1, flags | DC_NO_WATER, CMD_TERRAFORM_LAND);
|
|---|
| | | 177 | // coa->first_tile = tile_complement_before;
|
|---|
| | | 178 | // if (ret.Failed()) return_cmd_error(STR_ERROR_SITE_UNSUITABLE);
|
|---|
| | | 179 | // cost.AddCost(ret);
|
|---|
| | | 180 | // } else {
|
|---|
| | | 181 | // /* Shouldn't reach here. */
|
|---|
| | | 182 | // assert(false);
|
|---|
| | | 183 | // }
|
|---|
| | | 184 | // }
|
|---|
| | | 185 | // }
|
|---|
| | | 186 | // }
|
|---|
| | | 187 | // }
|
|---|
| | | 188 | // }
|
|---|
| | | 189 |
|
|---|
| | | 190 | if (!IsTileFlat(tile) || !IsTileFlat(tile2)) return_cmd_error(STR_ERROR_FLAT_LAND_REQUIRED);
|
|---|
| | | 227 | }
|
|---|
| | | 228 |
|
|---|
| | | 229 | void MakeWaterKeepingClass(TileIndex tile, Owner o)
|
|---|
| | | 230 | {
|
|---|
| | | 231 | WaterClass wc = GetWaterClass(tile);
|
|---|
| | | 232 |
|
|---|
| | | 233 | /* Autoslope might turn an originally canal or river tile into land */
|
|---|
| | | 234 | int z;
|
|---|
| | | 235 | Slope slope = GetTileSlope(tile, &z);
|
|---|
| | | 236 |
|
|---|
| | | 237 | if (slope != SLOPE_FLAT) {
|
|---|
| | | 238 | if (wc == WATER_CLASS_CANAL) {
|
|---|
| | | 239 | /* If we clear the canal, we have to remove it from the infrastructure count as well. */
|
|---|
| | | 240 | Company *c = Company::GetIfValid(o);
|
|---|
| | | 241 | if (c != NULL) {
|
|---|
| | | 242 | c->infrastructure.water--;
|
|---|
| | | 243 | DirtyCompanyInfrastructureWindows(c->index);
|
|---|
| | | 244 | }
|
|---|
| | | 245 | /* Sloped canals are locks and no natural water remains whatever the slope direction */
|
|---|
| | | 246 | wc = WATER_CLASS_INVALID;
|
|---|
| | | 247 | }
|
|---|
| | | 248 |
|
|---|
| | | 249 | /* Only river water should be restored on appropriate slopes. Other water would be invalid on slopes */
|
|---|
| | | 250 | if (wc != WATER_CLASS_RIVER || GetInclinedSlopeDirection(slope) == INVALID_DIAGDIR) {
|
|---|
| | | 251 | wc = WATER_CLASS_INVALID;
|
|---|
| | | 252 | }
|
|---|
| | | 253 | }
|
|---|
| | | 254 |
|
|---|
| | | 255 | if (wc == WATER_CLASS_SEA && z > 0) {
|
|---|
| | | 256 | /* Update company infrastructure count. */
|
|---|
| | | 257 | Company *c = Company::GetIfValid(o);
|
|---|
| | | 258 | if (c != NULL) {
|
|---|
| | | 259 | c->infrastructure.water++;
|
|---|
| | | 260 | DirtyCompanyInfrastructureWindows(c->index);
|
|---|
| | | 261 | }
|
|---|
| | | 262 |
|
|---|
| | | 263 | wc = WATER_CLASS_CANAL;
|
|---|
| | | 264 | }
|
|---|
| | | 265 |
|
|---|
| | | 266 | bool river = HasTileCanalOnRiver(tile);
|
|---|
| | | 267 | /* Zero map array and terminate animation */
|
|---|
| | | 268 | DoClearSquare(tile);
|
|---|
| | | 269 |
|
|---|
| | | 270 | /* Maybe change to water */
|
|---|
| | | 271 | switch (wc) {
|
|---|
| | | 272 | case WATER_CLASS_SEA:
|
|---|
| | | 273 | MakeSea(tile);
|
|---|
| | | 274 | break;
|
|---|
| | | 275 |
|
|---|
| | | 276 | case WATER_CLASS_CANAL:
|
|---|
| | | 277 | MakeCanal(tile, o, Random());
|
|---|
| | | 278 | if (river) SetCanalOnRiver(tile);
|
|---|
| | | 279 | break;
|
|---|
| | | 280 |
|
|---|
| | | 281 | case WATER_CLASS_RIVER:
|
|---|
| | | 282 | MakeRiver(tile, Random());
|
|---|
| | | 283 | break;
|
|---|
| | | 284 |
|
|---|
| | | 285 | default:
|
|---|
| | | 286 | break;
|
|---|
| | | 287 | }
|
|---|
| | | 288 |
|
|---|
| | | 289 | MarkTileDirtyByTile(tile);
|
|---|
| | | 290 | }
|
|---|
| | | 291 |
|
|---|
| | | 292 | static CommandCost RemoveShipDepot(TileIndex tile, DoCommandFlag flags)
|
|---|
| | | 293 | {
|
|---|
| | | 294 | if (!IsShipDepot(tile)) return CMD_ERROR;
|
|---|
| | | 295 |
|
|---|
| | | 296 | CommandCost ret = CheckTileOwnership(tile);
|
|---|
| | | 297 | if (ret.Failed()) return ret;
|
|---|
| | | 298 | Owner oc1 = GetWaterClass(tile) == WATER_CLASS_CANAL ? GetCanalOwner(tile) : INVALID_OWNER;
|
|---|
| | | 299 |
|
|---|
| | | 300 | TileIndex tile2 = GetOtherShipDepotTile(tile);
|
|---|
| | | 301 | Owner oc2 = GetWaterClass(tile2) == WATER_CLASS_CANAL ? GetCanalOwner(tile2) : INVALID_OWNER;
|
|---|
| | | 302 |
|
|---|
| | | 303 | /* do not check for ship on tile when company goes bankrupt */
|
|---|
| | | 304 | if (!(flags & DC_BANKRUPT)) {
|
|---|
| | | 305 | CommandCost ret = EnsureNoVehicleOnGround(tile);
|
|---|
| | | 306 | if (ret.Succeeded()) ret = EnsureNoVehicleOnGround(tile2);
|
|---|
| | | 307 | if (ret.Failed()) return ret;
|
|---|
| | | 308 | }
|
|---|
| | | 309 |
|
|---|
| | | 310 | if (flags & DC_EXEC) {
|
|---|
| | | 311 | delete Depot::GetByTile(tile);
|
|---|
| | | 312 |
|
|---|
| | | 313 | Company *c = Company::GetIfValid(GetTileOwner(tile));
|
|---|
| | | 314 | if (c != NULL) {
|
|---|
| | | 315 | c->infrastructure.water -= 2 * LOCK_DEPOT_TILE_FACTOR;
|
|---|
| | | 316 | DirtyCompanyInfrastructureWindows(c->index);
|
|---|
| | | 317 | }
|
|---|
| | | 318 |
|
|---|
| | | 319 | MakeWaterKeepingClass(tile, oc1);
|
|---|
| | | 320 | MakeWaterKeepingClass(tile2, oc2);
|
|---|
| | | 321 | }
|
|---|
| | | 322 |
|
|---|
| | | 323 | return CommandCost(EXPENSES_CONSTRUCTION, _price[PR_CLEAR_DEPOT_SHIP]);
|
|---|