1
0
Fork 0

(svn r5171) Get rid of an ungly hack in the load routine, which temporarily turned house and road tiles into void tiles to calculate the closest town

release/0.5
tron 2006-06-08 18:31:54 +00:00
parent b690e85604
commit 7c1f1d823f
3 changed files with 37 additions and 26 deletions

View File

@ -1210,22 +1210,22 @@ bool AfterLoadGame(void)
* all about ;) */ * all about ;) */
if (CheckSavegameVersionOldStyle(6, 1)) { if (CheckSavegameVersionOldStyle(6, 1)) {
BEGIN_TILE_LOOP(tile, MapSizeX(), MapSizeY(), 0) { BEGIN_TILE_LOOP(tile, MapSizeX(), MapSizeY(), 0) {
if (IsTileType(tile, MP_HOUSE)) { switch (GetTileType(tile)) {
_m[tile].m4 = _m[tile].m2; case MP_HOUSE:
//XXX magic _m[tile].m4 = _m[tile].m2;
SetTileType(tile, MP_VOID); SetTownIndex(tile, CalcClosestTownFromTile(tile, (uint)-1)->index);
_m[tile].m2 = ClosestTownFromTile(tile,(uint)-1)->index; break;
SetTileType(tile, MP_HOUSE);
} else if (IsTileType(tile, MP_STREET)) { case MP_STREET:
//XXX magic _m[tile].m4 |= (_m[tile].m2 << 4);
_m[tile].m4 |= (_m[tile].m2 << 4); if (IsTileOwner(tile, OWNER_TOWN)) {
if (IsTileOwner(tile, OWNER_TOWN)) { SetTownIndex(tile, CalcClosestTownFromTile(tile, (uint)-1)->index);
SetTileType(tile, MP_VOID); } else {
_m[tile].m2 = ClosestTownFromTile(tile,(uint)-1)->index; SetTownIndex(tile, 0);
SetTileType(tile, MP_STREET); }
} else { break;
SetTownIndex(tile, 0);
} default: break;
} }
} END_TILE_LOOP(tile, MapSizeX(), MapSizeY(), 0); } END_TILE_LOOP(tile, MapSizeX(), MapSizeY(), 0);
} }

View File

@ -1739,18 +1739,12 @@ bool CheckIfAuthorityAllows(TileIndex tile)
} }
Town *ClosestTownFromTile(TileIndex tile, uint threshold) Town* CalcClosestTownFromTile(TileIndex tile, uint threshold)
{ {
Town *t; Town *t;
uint dist, best = threshold; uint dist, best = threshold;
Town *best_town = NULL; Town *best_town = NULL;
if (IsTileType(tile, MP_HOUSE) || (
IsTileType(tile, MP_STREET) &&
(IsLevelCrossing(tile) ? GetCrossingRoadOwner(tile) : GetTileOwner(tile)) == OWNER_TOWN
))
return GetTownByTile(tile);
FOR_ALL_TOWNS(t) { FOR_ALL_TOWNS(t) {
if (t->xy != 0) { if (t->xy != 0) {
dist = DistanceManhattan(tile, t->xy); dist = DistanceManhattan(tile, t->xy);
@ -1764,6 +1758,20 @@ Town *ClosestTownFromTile(TileIndex tile, uint threshold)
return best_town; return best_town;
} }
Town *ClosestTownFromTile(TileIndex tile, uint threshold)
{
if (IsTileType(tile, MP_HOUSE) || (
IsTileType(tile, MP_STREET) &&
(IsLevelCrossing(tile) ? GetCrossingRoadOwner(tile) : GetTileOwner(tile)) == OWNER_TOWN
)) {
return GetTownByTile(tile);
} else {
return CalcClosestTownFromTile(tile, threshold);
}
}
void ChangeTownRating(Town *t, int add, int max) void ChangeTownRating(Town *t, int add, int max)
{ {
int rating; int rating;

View File

@ -20,14 +20,13 @@ static inline TownID GetTownIndex(TileIndex t)
} }
/** /**
* Set the town index for a street tile. * Set the town index for a road or house tile.
* @param tile the tile * @param tile the tile
* @param index the index of the town * @param index the index of the town
* @pre IsTileType(tile, MP_STREET)
*/ */
static inline void SetTownIndex(TileIndex t, TownID index) static inline void SetTownIndex(TileIndex t, TownID index)
{ {
assert(IsTileType(t, MP_STREET)); assert(IsTileType(t, MP_STREET) || IsTileType(t, MP_HOUSE));
_m[t].m2 = index; _m[t].m2 = index;
} }
@ -81,6 +80,10 @@ static inline Town* GetTownByTile(TileIndex t)
return GetTown(GetTownIndex(t)); return GetTown(GetTownIndex(t));
} }
Town* CalcClosestTownFromTile(TileIndex tile, uint threshold);
static inline void MakeHouseTile(TileIndex t, TownID tid, byte counter, byte stage, byte type) static inline void MakeHouseTile(TileIndex t, TownID tid, byte counter, byte stage, byte type)
{ {
assert(IsTileType(t, MP_CLEAR)); assert(IsTileType(t, MP_CLEAR));