diff options
Diffstat (limited to 'src/town_cmd.cpp')
-rw-r--r-- | src/town_cmd.cpp | 28 |
1 files changed, 27 insertions, 1 deletions
diff --git a/src/town_cmd.cpp b/src/town_cmd.cpp index b7719c879..246313663 100644 --- a/src/town_cmd.cpp +++ b/src/town_cmd.cpp @@ -257,6 +257,19 @@ static uint GetSlopeZ_Town(TileIndex tile, uint x, uint y) /** Tile callback routine */ static Foundation GetFoundation_Town(TileIndex tile, Slope tileh) { + HouseID hid = GetHouseType(tile); + + /* For NewGRF house tiles we might not be drawing a foundation. We need to + * account for this, as other structures should + * draw the wall of the foundation in this case. + */ + if (hid >= NEW_HOUSE_OFFSET) { + const HouseSpec *hs = HouseSpec::Get(hid); + if (hs->spritegroup != NULL && HasBit(hs->callback_mask, CBM_HOUSE_DRAW_FOUNDATIONS)) { + uint32 callback_res = GetHouseCallback(CBID_HOUSE_DRAW_FOUNDATIONS, 0, 0, hid, Town::GetByTile(tile), tile); + if (callback_res == 0) return FOUNDATION_NONE; + } + } return FlatteningFoundation(tileh); } @@ -2895,7 +2908,20 @@ static CommandCost TerraformTile_Town(TileIndex tile, DoCommandFlag flags, uint /* Here we differ from TTDP by checking TILE_NOT_SLOPED */ if (((hs->building_flags & TILE_NOT_SLOPED) == 0) && !IsSteepSlope(tileh_new) && - (GetTileMaxZ(tile) == z_new + GetSlopeMaxZ(tileh_new))) return CommandCost(EXPENSES_CONSTRUCTION, _price.terraform); + (GetTileMaxZ(tile) == z_new + GetSlopeMaxZ(tileh_new))) { + bool allow_terraform = true; + + /* Call the autosloping callback per tile, not for the whole building at once. */ + house = GetHouseType(tile); + hs = HouseSpec::Get(house); + if (HasBit(hs->callback_mask, CBM_HOUSE_AUTOSLOPE)) { + /* If the callback fails, allow autoslope. */ + uint16 res = GetHouseCallback(CBID_HOUSE_AUTOSLOPE, 0, 0, house, Town::GetByTile(tile), tile); + if ((res != 0) && (res != CALLBACK_FAILED)) allow_terraform = false; + } + + if (allow_terraform) return CommandCost(EXPENSES_CONSTRUCTION, _price.terraform); + } } return DoCommand(tile, 0, 0, flags, CMD_LANDSCAPE_CLEAR); |