Chunnel: Make error reporting consistent with tunnel length reporting at cursor.

Error reporting should be in tune with occurrence of events.
pull/16/head
HackaLittleBit 7 years ago committed by Jonathan G Rennison
parent c882082467
commit eddd635f00

@ -5009,7 +5009,7 @@ STR_ERROR_TUNNEL_THROUGH_MAP_BORDER :{WHITE}Tunnel w
STR_ERROR_CHUNNEL_THROUGH_MAP_BORDER :{WHITE}Tunnel under water would end out of the map
STR_ERROR_UNABLE_TO_EXCAVATE_LAND :{WHITE}Unable to excavate land for other end of tunnel
STR_ERROR_TUNNEL_TOO_LONG :{WHITE}... tunnel too long
STR_ERROR_CHUNNEL_RAMP :{WHITE}... only ramp length between 4 and {NUM} tiles is allowed for tunnels under water.
STR_ERROR_CHUNNEL_RAMP :{WHITE}... only ramp length between 5 and {NUM} tiles is allowed for tunnels under water.
STR_ERROR_TUNNEL_TOO_MANY :{WHITE}... too many tunnels
STR_ERROR_NO_DRILLING_ABOVE_CHUNNEL :{WHITE}No oil rigs allowed above underwater tunnels.
STR_ERROR_ANOTHER_TUNNEL_IN_THE_WAY_FOR_CHUNNEL :{WHITE}Three tiles are needed to pass under the other tunnel.

@ -613,8 +613,9 @@ static inline StringID IsRampBetweenLimits(TileIndex ramp_start, TileIndex tile,
{
uint min_length = 4;
uint max_length = 7;
if (Delta(ramp_start, tile) < (uint)abs(delta) * min_length || Delta(ramp_start, tile - delta) > (uint)abs(delta) * max_length) {
SetDParam(0, max_length);
if (Delta(ramp_start, tile) < (uint)abs(delta) * min_length || (uint)abs(delta) * max_length < Delta(ramp_start, tile)) {
/* Add 1 in message to have consistency with cursor count in game. */
SetDParam(0, max_length + 1);
return STR_ERROR_CHUNNEL_RAMP;
}
@ -643,17 +644,11 @@ static inline CommandCost CanBuildChunnel(TileIndex tile, DiagDirection directio
for (;;) {
tile += delta;
if (!IsValidTile(tile)) return_cmd_error(STR_ERROR_CHUNNEL_THROUGH_MAP_BORDER);
_build_tunnel_endtile = tile;
int end_z;
Slope end_tileh = GetTileSlope(tile, &end_z);
if (start_z == end_z) {
_build_tunnel_endtile = tile;
/* Check if end ramp was too short or too long after crossing the sea. */
if (crossed_sea) {
StringID err_msg = IsRampBetweenLimits(ramp_start, tile, delta);
if (err_msg > STR_NULL) return_cmd_error(err_msg);
}
/* Handle chunnels only on sea level and only one time crossing. */
if (!crossed_sea &&
@ -668,9 +663,6 @@ static inline CommandCost CanBuildChunnel(TileIndex tile, DiagDirection directio
/* Pass the water and find a proper shore tile that potentially
* could have a tunnel portal behind. */
for (;;) {
if (!IsValidTile(tile)) return_cmd_error(STR_ERROR_CHUNNEL_THROUGH_MAP_BORDER);
_build_tunnel_endtile = tile;
end_tileh = GetTileSlope(tile);
if (direction == DIAGDIR_NE && (end_tileh & SLOPE_NE) == SLOPE_NE) break;
if (direction == DIAGDIR_SE && (end_tileh & SLOPE_SE) == SLOPE_SE) break;
@ -685,15 +677,25 @@ static inline CommandCost CanBuildChunnel(TileIndex tile, DiagDirection directio
if (IsTileType(tile, MP_WATER) && IsSea(tile)) crossed_sea = true;
if (!_cheats.crossing_tunnels.value && IsTunnelInWay(tile, start_z)) return_cmd_error(STR_ERROR_ANOTHER_TUNNEL_IN_THE_WAY);
tile += delta;
if (!IsValidTile(tile)) return_cmd_error(STR_ERROR_CHUNNEL_THROUGH_MAP_BORDER);
_build_tunnel_endtile = tile;
sea_tiles++;
}
if (!crossed_sea) return_cmd_error(STR_ERROR_CHUNNEL_ONLY_OVER_SEA);
ramp_start = tile;
} else {
/* Check if end ramp was too short or too long after crossing the sea. */
if (crossed_sea) {
StringID err_msg = IsRampBetweenLimits(ramp_start, tile, delta);
if (err_msg > STR_NULL) return_cmd_error(err_msg);
}
break;
}
}
if (!_cheats.crossing_tunnels.value && IsTunnelInWay(tile, start_z)) return_cmd_error(STR_ERROR_ANOTHER_TUNNEL_IN_THE_WAY);
}
is_chunnel = crossed_sea;

Loading…
Cancel
Save