(svn r11193) -Fix: be more compliant with the specifications of callback #2F (and undocumented side effects in TTDP in corner cases).

This commit is contained in:
rubidium
2007-10-02 16:56:45 +00:00
parent 7979674717
commit 531fe3e070
3 changed files with 31 additions and 23 deletions

View File

@@ -1179,7 +1179,23 @@ static const Town *CheckMultipleIndustryInTown(TileIndex tile, int type)
return t;
}
static bool CheckIfIndustryTilesAreFree(TileIndex tile, const IndustryTileTable *it, int type, bool *custom_shape_check = NULL)
bool IsSlopeRefused(Slope current, Slope refused)
{
if (current != SLOPE_FLAT) {
if (refused & SLOPE_STEEP) return true;
Slope t = ComplementSlope(current);
if (refused & 1 && (t & SLOPE_NW)) return false;
if (refused & 2 && (t & SLOPE_NE)) return false;
if (refused & 4 && (t & SLOPE_SW)) return false;
if (refused & 8 && (t & SLOPE_SE)) return false;
}
return false;
}
static bool CheckIfIndustryTilesAreFree(TileIndex tile, const IndustryTileTable *it, uint itspec_index, int type, bool *custom_shape_check = NULL)
{
_error_message = STR_0239_SITE_UNSUITABLE;
@@ -1207,7 +1223,7 @@ static bool CheckIfIndustryTilesAreFree(TileIndex tile, const IndustryTileTable
if (HASBIT(its->callback_flags, CBM_INDT_SHAPE_CHECK)) {
if (custom_shape_check != NULL) *custom_shape_check = true;
if (!PerformIndustryTileSlopeCheck(cur_tile, its, type, gfx)) return false;
if (!PerformIndustryTileSlopeCheck(tile, cur_tile, its, type, gfx, itspec_index)) return false;
} else {
if (ind_behav & INDUSTRYBEH_BUILT_ONWATER) {
/* As soon as the tile is not water, bail out.
@@ -1226,19 +1242,7 @@ static bool CheckIfIndustryTilesAreFree(TileIndex tile, const IndustryTileTable
/* It is almost impossible to have a fully flat land in TG, so what we
* do is that we check if we can make the land flat later on. See
* CheckIfCanLevelIndustryPlatform(). */
if (tileh != SLOPE_FLAT) {
Slope t;
byte bits = its->slopes_refused;
if (bits & 0x10) return false;
t = ComplementSlope(tileh);
if (bits & 1 && (t & SLOPE_NW)) return false;
if (bits & 2 && (t & SLOPE_NE)) return false;
if (bits & 4 && (t & SLOPE_SW)) return false;
if (bits & 8 && (t & SLOPE_SE)) return false;
}
if (IsSlopeRefused(tileh, its->slopes_refused)) return false;
}
}
}
@@ -1541,7 +1545,7 @@ static Industry *CreateNewIndustryHelper(TileIndex tile, IndustryType type, uint
const IndustryTileTable *it = indspec->table[itspec_index];
bool custom_shape_check = false;
if (!CheckIfIndustryTilesAreFree(tile, it, type, &custom_shape_check)) return NULL;
if (!CheckIfIndustryTilesAreFree(tile, it, itspec_index, type, &custom_shape_check)) return NULL;
if (HASBIT(GetIndustrySpec(type)->callback_flags, CBM_IND_LOCATION)) {
if (!CheckIfCallBackAllowsCreation(tile, type, itspec_index)) return NULL;
@@ -1582,7 +1586,6 @@ CommandCost CmdBuildIndustry(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
{
int num;
const IndustryTileTable * const *itt;
const IndustryTileTable *it;
const IndustrySpec *indspec;
SET_EXPENSES_TYPE(EXPENSES_OTHER);
@@ -1626,7 +1629,7 @@ CommandCost CmdBuildIndustry(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
do {
if (--num < 0) return_cmd_error(STR_0239_SITE_UNSUITABLE);
} while (!CheckIfIndustryTilesAreFree(tile, it = itt[num], p1));
} while (!CheckIfIndustryTilesAreFree(tile, itt[num], num, p1));
if (CreateNewIndustryHelper(tile, p1, flags, indspec, num) == NULL) return CMD_ERROR;
}