summaryrefslogtreecommitdiff
path: root/src/clear_cmd.cpp
diff options
context:
space:
mode:
authoryexo <yexo@openttd.org>2011-11-08 19:48:47 +0000
committeryexo <yexo@openttd.org>2011-11-08 19:48:47 +0000
commit5c838ff1c312c240e44bb7da95e5450bcfeaeff6 (patch)
tree0a1e0902aa4874cfbe77fe3c07620e41c3fba28a /src/clear_cmd.cpp
parent704dcc0a475e1361a913a43ae0b5d601dde807cc (diff)
downloadopenttd-5c838ff1c312c240e44bb7da95e5450bcfeaeff6.tar.xz
(svn r23168) -Feature [FS#1824]: always draw fences around field tiles
Diffstat (limited to 'src/clear_cmd.cpp')
-rw-r--r--src/clear_cmd.cpp92
1 files changed, 55 insertions, 37 deletions
diff --git a/src/clear_cmd.cpp b/src/clear_cmd.cpp
index 748318262..7d89c311d 100644
--- a/src/clear_cmd.cpp
+++ b/src/clear_cmd.cpp
@@ -61,22 +61,44 @@ void DrawHillyLandTile(const TileInfo *ti)
}
}
-void DrawClearLandFence(const TileInfo *ti)
+static void DrawClearLandFence(const TileInfo *ti)
{
- bool fence_sw = GetFenceSW(ti->tile) != 0;
- bool fence_se = GetFenceSE(ti->tile) != 0;
+ /* combine fences into one sprite object */
+ StartSpriteCombine();
- if (!fence_sw && !fence_se) return;
+ int maxz = GetSlopeMaxPixelZ(ti->tileh);
- int z = GetSlopePixelZInCorner(ti->tileh, CORNER_S);
+ bool fence_nw = GetFenceNW(ti->tile) != 0;
+ if (fence_nw) {
+ int z = GetSlopePixelZInCorner(ti->tileh, CORNER_W);
+ SpriteID sprite = _clear_land_fence_sprites[GetFenceNW(ti->tile) - 1] + _fence_mod_by_tileh_nw[ti->tileh];
+ AddSortableSpriteToDraw(sprite, PAL_NONE, ti->x, ti->y - 15, 16, 31, maxz - z + 4, ti->z + z, false, 0, 15, -z);
+ }
- if (fence_sw) {
- DrawGroundSpriteAt(_clear_land_fence_sprites[GetFenceSW(ti->tile) - 1] + _fence_mod_by_tileh_sw[ti->tileh], PAL_NONE, 0, 0, z);
+ bool fence_ne = GetFenceNE(ti->tile) != 0;
+ if (fence_ne) {
+ int z = GetSlopePixelZInCorner(ti->tileh, CORNER_E);
+ SpriteID sprite = _clear_land_fence_sprites[GetFenceNE(ti->tile) - 1] + _fence_mod_by_tileh_ne[ti->tileh];
+ AddSortableSpriteToDraw(sprite, PAL_NONE, ti->x - 15, ti->y, 31, 16, maxz - z + 4, ti->z + z, false, 15, 0, -z);
}
- if (fence_se) {
- DrawGroundSpriteAt(_clear_land_fence_sprites[GetFenceSE(ti->tile) - 1] + _fence_mod_by_tileh_se[ti->tileh], PAL_NONE, 0, 0, z);
+ bool fence_sw = GetFenceSW(ti->tile) != 0;
+ bool fence_se = GetFenceSE(ti->tile) != 0;
+
+ if (fence_sw || fence_se) {
+ int z = GetSlopePixelZInCorner(ti->tileh, CORNER_S);
+
+ if (fence_sw) {
+ SpriteID sprite = _clear_land_fence_sprites[GetFenceSW(ti->tile) - 1] + _fence_mod_by_tileh_sw[ti->tileh];
+ AddSortableSpriteToDraw(sprite, PAL_NONE, ti->x, ti->y, 16, 16, maxz - z + 4, ti->z + z, false, 0, 0, -z);
+ }
+
+ if (fence_se) {
+ SpriteID sprite = _clear_land_fence_sprites[GetFenceSE(ti->tile) - 1] + _fence_mod_by_tileh_se[ti->tileh];
+ AddSortableSpriteToDraw(sprite, PAL_NONE, ti->x, ti->y, 16, 16, maxz - z + 4, ti->z + z, false, 0, 0, -z);
+ }
}
+ EndSpriteCombine();
}
static void DrawTile_Clear(TileInfo *ti)
@@ -96,6 +118,7 @@ static void DrawTile_Clear(TileInfo *ti)
case CLEAR_FIELDS:
DrawGroundSprite(_clear_land_sprites_farmland[GetFieldType(ti->tile)] + SlopeToSpriteOffset(ti->tileh), PAL_NONE);
+ DrawClearLandFence(ti);
break;
case CLEAR_SNOW:
@@ -104,7 +127,6 @@ static void DrawTile_Clear(TileInfo *ti)
break;
}
- DrawClearLandFence(ti);
DrawBridgeMiddle(ti);
}
@@ -121,35 +143,33 @@ static Foundation GetFoundation_Clear(TileIndex tile, Slope tileh)
return FOUNDATION_NONE;
}
-void TileLoopClearHelper(TileIndex tile)
+static void UpdateFences(TileIndex tile)
{
- bool self = (IsTileType(tile, MP_CLEAR) && IsClearGround(tile, CLEAR_FIELDS));
+ assert(IsTileType(tile, MP_CLEAR) && IsClearGround(tile, CLEAR_FIELDS));
bool dirty = false;
bool neighbour = (IsTileType(TILE_ADDXY(tile, 1, 0), MP_CLEAR) && IsClearGround(TILE_ADDXY(tile, 1, 0), CLEAR_FIELDS));
- if (GetFenceSW(tile) == 0) {
- if (self != neighbour) {
- SetFenceSW(tile, 3);
- dirty = true;
- }
- } else {
- if (self == 0 && neighbour == 0) {
- SetFenceSW(tile, 0);
- dirty = true;
- }
+ if (!neighbour && GetFenceSW(tile) == 0) {
+ SetFenceSW(tile, 3);
+ dirty = true;
}
neighbour = (IsTileType(TILE_ADDXY(tile, 0, 1), MP_CLEAR) && IsClearGround(TILE_ADDXY(tile, 0, 1), CLEAR_FIELDS));
- if (GetFenceSE(tile) == 0) {
- if (self != neighbour) {
- SetFenceSE(tile, 3);
- dirty = true;
- }
- } else {
- if (self == 0 && neighbour == 0) {
- SetFenceSE(tile, 0);
- dirty = true;
- }
+ if (!neighbour && GetFenceSE(tile) == 0) {
+ SetFenceSE(tile, 3);
+ dirty = true;
+ }
+
+ neighbour = (IsTileType(TILE_ADDXY(tile, -1, 0), MP_CLEAR) && IsClearGround(TILE_ADDXY(tile, -1, 0), CLEAR_FIELDS));
+ if (!neighbour && GetFenceNE(tile) == 0) {
+ SetFenceNE(tile, 3);
+ dirty = true;
+ }
+
+ neighbour = (IsTileType(TILE_ADDXY(tile, 0, -1), MP_CLEAR) && IsClearGround(TILE_ADDXY(tile, 0, -1), CLEAR_FIELDS));
+ if (!neighbour && GetFenceNW(tile) == 0) {
+ SetFenceNW(tile, 3);
+ dirty = true;
}
if (dirty) MarkTileDirtyByTile(tile);
@@ -239,7 +259,6 @@ static void TileLoop_Clear(TileIndex tile)
return;
}
}
- TileLoopClearHelper(tile);
AmbientSoundEffectCallback(tile);
switch (_settings_game.game_creation.landscape) {
@@ -264,8 +283,8 @@ static void TileLoop_Clear(TileIndex tile)
}
break;
- case CLEAR_FIELDS: {
- uint field_type;
+ case CLEAR_FIELDS:
+ UpdateFences(tile);
if (_game_mode == GM_EDITOR) return;
@@ -280,12 +299,11 @@ static void TileLoop_Clear(TileIndex tile)
/* This farmfield is no longer farmfield, so make it grass again */
MakeClear(tile, CLEAR_GRASS, 2);
} else {
- field_type = GetFieldType(tile);
+ uint field_type = GetFieldType(tile);
field_type = (field_type < 8) ? field_type + 1 : 0;
SetFieldType(tile, field_type);
}
break;
- }
default:
return;