summaryrefslogtreecommitdiff
path: root/landscape.c
diff options
context:
space:
mode:
authortron <tron@openttd.org>2006-06-24 22:19:28 +0000
committertron <tron@openttd.org>2006-06-24 22:19:28 +0000
commit7f444dde30d4c9ed111266d9203f858a02b8e329 (patch)
treef2de48c334eacb3e4a37acce368f35ef0b87bc95 /landscape.c
parent5fad8a1829248c450e54d3bf1838868c953fce3b (diff)
downloadopenttd-7f444dde30d4c9ed111266d9203f858a02b8e329.tar.xz
(svn r5351) -Fix: Several graphical glitches at adjacent tiles with foundations. Some borders were missing, some were superfluous
Diffstat (limited to 'landscape.c')
-rw-r--r--landscape.c48
1 files changed, 33 insertions, 15 deletions
diff --git a/landscape.c b/landscape.c
index 97cb4e3eb..918203537 100644
--- a/landscape.c
+++ b/landscape.c
@@ -181,31 +181,49 @@ uint GetSlopeZ(int x, int y)
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(TileIndex tile, bool direction)
+
+static Slope GetFoundationSlope(TileIndex tile, uint* z)
{
- bool south, other; // southern corner and east/west corner
- Slope tileh = GetTileSlope(tile, NULL);
+ Slope tileh = GetTileSlope(tile, z);
Slope slope = _tile_type_procs[GetTileType(tile)]->get_slope_tileh_proc(tile, tileh);
- if (slope == SLOPE_FLAT && slope != tileh) tileh = SLOPE_ELEVATED;
- south = (tileh & SLOPE_S) != (slope & SLOPE_S);
+ // Flatter slope -> higher base height
+ if (slope < tileh) *z += TILE_HEIGHT;
+ return slope;
+}
- if (direction) {
- other = (tileh & SLOPE_E) != (slope & SLOPE_E);
- } else {
- other = (tileh & SLOPE_W) != (slope & SLOPE_W);
- }
- return south || other;
+
+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;
- if (HasFoundation(TILE_ADDXY(ti->tile, 0, -1), true)) sprite_base += 22; // foundation in NW direction
- if (HasFoundation(TILE_ADDXY(ti->tile, -1, 0), false)) sprite_base += 44; // 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