(svn r5833) -Feature: Allow building of (certain) rails, roads and bridge ramps on steep sloped tiles

This commit is contained in:
tron
2006-08-10 14:44:32 +00:00
parent 1f006f2062
commit 0403405d5d
5 changed files with 106 additions and 44 deletions

View File

@@ -243,7 +243,15 @@ static uint32 CheckRoadSlope(Slope tileh, RoadBits* pieces, RoadBits existing)
{
RoadBits road_bits;
if (IsSteepSlope(tileh)) return CMD_ERROR;
if (IsSteepSlope(tileh)) {
if (existing == 0) {
// force full pieces.
*pieces |= (*pieces & 0xC) >> 2;
*pieces |= (*pieces & 0x3) << 2;
if (*pieces == ROAD_X || *pieces == ROAD_Y) return _price.terraform;
}
return CMD_ERROR;
}
road_bits = *pieces | existing;
// no special foundation
@@ -354,11 +362,6 @@ int32 CmdBuildRoad(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
}
case MP_TUNNELBRIDGE:
/* check for flat land */
if (IsSteepSlope(tileh)) {
return_cmd_error(STR_1000_LAND_SLOPED_IN_WRONG_DIRECTION);
}
if (!IsBridge(tile) || !IsBridgeMiddle(tile)) goto do_clear;
/* only allow roads pertendicular to bridge */
@@ -659,7 +662,10 @@ uint GetRoadFoundation(Slope tileh, RoadBits bits)
uint i;
// normal level sloped building
if ((~_valid_tileh_slopes_road[1][tileh] & bits) == 0) return tileh;
if (!IsSteepSlope(tileh) &&
(~_valid_tileh_slopes_road[1][tileh] & bits) == 0) {
return tileh;
}
// inclined sloped building
switch (bits) {
@@ -668,11 +674,15 @@ uint GetRoadFoundation(Slope tileh, RoadBits bits)
default: return 0;
}
switch (tileh) {
case SLOPE_W: i += 0; break;
case SLOPE_S: i += 2; break;
case SLOPE_E: i += 4; break;
case SLOPE_N: i += 6; break;
default: return 0;
case SLOPE_W:
case SLOPE_STEEP_W: i += 0; break;
case SLOPE_S:
case SLOPE_STEEP_S: i += 2; break;
case SLOPE_E:
case SLOPE_STEEP_E: i += 4; break;
case SLOPE_N:
case SLOPE_STEEP_N: i += 6; break;
default: return 0;
}
return i + 15;
}
@@ -839,7 +849,11 @@ static uint GetSlopeZ_Road(TileIndex tile, uint x, uint y)
uint f = GetRoadFoundation(tileh, GetRoadBits(tile));
if (f != 0) {
if (f < 15) return z + TILE_HEIGHT; // leveled foundation
if (IsSteepSlope(tileh)) {
z += TILE_HEIGHT;
} else if (f < 15) {
return z + TILE_HEIGHT; // leveled foundation
}
tileh = _inclined_tileh[f - 15]; // inclined foundation
}
return z + GetPartialZ(x & 0xF, y & 0xF, tileh);