diff options
Diffstat (limited to 'src/clear_cmd.cpp')
-rw-r--r-- | src/clear_cmd.cpp | 92 |
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; |