--- a/landscape.c Mon Jun 26 14:58:41 2006 +0000
+++ b/landscape.c Mon Jun 26 15:00:23 2006 +0000
@@ -184,34 +184,54 @@
return _tile_type_procs[ti.type]->get_slope_z_proc(&ti);
}
-// direction=true: check for foundation in east and south corner
-// direction=false: check for foundation in west and south corner
-static bool hasFoundation(const TileInfo* ti, bool direction)
-{
- bool south, other; // southern corner and east/west corner
- uint slope = _tile_type_procs[ti->type]->get_slope_tileh_proc(ti);
- uint tileh = ti->tileh;
- if (slope == 0 && slope != tileh) tileh = 15;
- south = (tileh & 2) != (slope & 2);
+static Slope GetFoundationSlope(TileIndex tile, uint* z)
+{
+ TileInfo ti;
+ Slope tileh;
+ Slope slope;
- if (direction) {
- other = (tileh & 4) != (slope & 4);
- } else {
- other = (tileh & 1) != (slope & 1);
- }
- return south || other;
+ FindLandscapeHeightByTile(&ti, tile);
+ tileh = ti.tileh;
+ slope = _tile_type_procs[GetTileType(tile)]->get_slope_tileh_proc(&ti);
+
+ // Flatter slope -> higher base height
+ if (slope < tileh) *z += TILE_HEIGHT;
+ return slope;
}
+
+static bool HasFoundationNW(TileIndex tile, Slope slope_here, uint z_here)
+{
+ uint z;
+ Slope slope = GetFoundationSlope(TILE_ADDXY(tile, 0, -1), &z);
+
+ return
+ (z_here + (slope_here & SLOPE_N ? TILE_HEIGHT : 0) > z + (slope & SLOPE_E ? TILE_HEIGHT : 0)) ||
+ (z_here + (slope_here & SLOPE_W ? TILE_HEIGHT : 0) > z + (slope & SLOPE_S ? TILE_HEIGHT : 0));
+}
+
+
+static bool HasFoundationNE(TileIndex tile, Slope slope_here, uint z_here)
+{
+ uint z;
+ Slope slope = GetFoundationSlope(TILE_ADDXY(tile, -1, 0), &z);
+
+ return
+ (z_here + (slope_here & SLOPE_N ? TILE_HEIGHT : 0) > z + (slope & SLOPE_W ? TILE_HEIGHT : 0)) ||
+ (z_here + (slope_here & SLOPE_E ? TILE_HEIGHT : 0) > z + (slope & SLOPE_S ? TILE_HEIGHT : 0));
+}
+
+
void DrawFoundation(TileInfo *ti, uint f)
{
uint32 sprite_base = SPR_SLOPES_BASE-14;
+ Slope slope;
+ uint z;
- TileInfo ti2;
- FindLandscapeHeight(&ti2, ti->x, ti->y - 1);
- if (hasFoundation(&ti2, true)) sprite_base += 22; // foundation in NW direction
- FindLandscapeHeight(&ti2, ti->x - 1, ti->y);
- if (hasFoundation(&ti2, false)) sprite_base += 22 * 2; // foundation in NE direction
+ slope = GetFoundationSlope(ti->tile, &z);
+ if (!HasFoundationNW(ti->tile, slope, z)) sprite_base += 22;
+ if (!HasFoundationNE(ti->tile, slope, z)) sprite_base += 44;
if (f < 15) {
// leveled foundation
--- a/tunnelbridge_cmd.c Mon Jun 26 14:58:41 2006 +0000
+++ b/tunnelbridge_cmd.c Mon Jun 26 15:00:23 2006 +0000
@@ -1277,8 +1277,31 @@
static uint GetSlopeTileh_TunnelBridge(const TileInfo* ti)
{
- // not accurate, but good enough for slope graphics drawing
- return 0;
+ TileIndex tile = ti->tile;
+ Slope tileh = ti->tileh;
+ uint f;
+
+ if (IsTunnel(tile)) {
+ return tileh;
+ } else {
+ if (IsBridgeRamp(tile)) {
+ if (HASBIT(BRIDGE_NO_FOUNDATION, tileh)) {
+ return tileh;
+ } else {
+ f = GetBridgeFoundation(tileh, DiagDirToAxis(GetBridgeRampDirection(tile)));
+ }
+ } else {
+ if (IsTransportUnderBridge(tile)) {
+ f = _bridge_foundations[GetBridgeAxis(tile)][tileh];
+ } else {
+ return tileh;
+ }
+ }
+ }
+
+ if (f == 0) return tileh;
+ if (f < 15) return SLOPE_FLAT;
+ return _inclined_tileh[f - 15];
}