mirror of https://github.com/OpenTTD/OpenTTD.git
(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
This commit is contained in:
parent
b690e85604
commit
7c1f1d823f
32
openttd.c
32
openttd.c
|
@ -1210,22 +1210,22 @@ bool AfterLoadGame(void)
|
|||
* all about ;) */
|
||||
if (CheckSavegameVersionOldStyle(6, 1)) {
|
||||
BEGIN_TILE_LOOP(tile, MapSizeX(), MapSizeY(), 0) {
|
||||
if (IsTileType(tile, MP_HOUSE)) {
|
||||
_m[tile].m4 = _m[tile].m2;
|
||||
//XXX magic
|
||||
SetTileType(tile, MP_VOID);
|
||||
_m[tile].m2 = ClosestTownFromTile(tile,(uint)-1)->index;
|
||||
SetTileType(tile, MP_HOUSE);
|
||||
} else if (IsTileType(tile, MP_STREET)) {
|
||||
//XXX magic
|
||||
_m[tile].m4 |= (_m[tile].m2 << 4);
|
||||
if (IsTileOwner(tile, OWNER_TOWN)) {
|
||||
SetTileType(tile, MP_VOID);
|
||||
_m[tile].m2 = ClosestTownFromTile(tile,(uint)-1)->index;
|
||||
SetTileType(tile, MP_STREET);
|
||||
} else {
|
||||
SetTownIndex(tile, 0);
|
||||
}
|
||||
switch (GetTileType(tile)) {
|
||||
case MP_HOUSE:
|
||||
_m[tile].m4 = _m[tile].m2;
|
||||
SetTownIndex(tile, CalcClosestTownFromTile(tile, (uint)-1)->index);
|
||||
break;
|
||||
|
||||
case MP_STREET:
|
||||
_m[tile].m4 |= (_m[tile].m2 << 4);
|
||||
if (IsTileOwner(tile, OWNER_TOWN)) {
|
||||
SetTownIndex(tile, CalcClosestTownFromTile(tile, (uint)-1)->index);
|
||||
} else {
|
||||
SetTownIndex(tile, 0);
|
||||
}
|
||||
break;
|
||||
|
||||
default: break;
|
||||
}
|
||||
} END_TILE_LOOP(tile, MapSizeX(), MapSizeY(), 0);
|
||||
}
|
||||
|
|
22
town_cmd.c
22
town_cmd.c
|
@ -1739,18 +1739,12 @@ bool CheckIfAuthorityAllows(TileIndex tile)
|
|||
}
|
||||
|
||||
|
||||
Town *ClosestTownFromTile(TileIndex tile, uint threshold)
|
||||
Town* CalcClosestTownFromTile(TileIndex tile, uint threshold)
|
||||
{
|
||||
Town *t;
|
||||
uint dist, best = threshold;
|
||||
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) {
|
||||
if (t->xy != 0) {
|
||||
dist = DistanceManhattan(tile, t->xy);
|
||||
|
@ -1764,6 +1758,20 @@ Town *ClosestTownFromTile(TileIndex tile, uint threshold)
|
|||
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)
|
||||
{
|
||||
int rating;
|
||||
|
|
|
@ -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 index the index of the town
|
||||
* @pre IsTileType(tile, MP_STREET)
|
||||
*/
|
||||
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;
|
||||
}
|
||||
|
||||
|
@ -81,6 +80,10 @@ static inline Town* GetTownByTile(TileIndex 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)
|
||||
{
|
||||
assert(IsTileType(t, MP_CLEAR));
|
||||
|
|
Loading…
Reference in New Issue