diff options
author | tron <tron@openttd.org> | 2006-06-24 22:19:28 +0000 |
---|---|---|
committer | tron <tron@openttd.org> | 2006-06-24 22:19:28 +0000 |
commit | 7f444dde30d4c9ed111266d9203f858a02b8e329 (patch) | |
tree | f2de48c334eacb3e4a37acce368f35ef0b87bc95 | |
parent | 5fad8a1829248c450e54d3bf1838868c953fce3b (diff) | |
download | openttd-7f444dde30d4c9ed111266d9203f858a02b8e329.tar.xz |
(svn r5351) -Fix: Several graphical glitches at adjacent tiles with foundations. Some borders were missing, some were superfluous
-rw-r--r-- | landscape.c | 48 |
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 |