From b926277caf0ab423dd4b6cdfa38bce3eb8a58d2c Mon Sep 17 00:00:00 2001 From: rubidium Date: Wed, 25 Apr 2012 21:06:31 +0000 Subject: (svn r24180) -Codechange/feature-ish: add cache checker for the town's cache --- src/openttd.cpp | 21 ++++++++++++++++- src/saveload/town_sl.cpp | 61 ++++++++++++++++++++++++++++-------------------- 2 files changed, 56 insertions(+), 26 deletions(-) (limited to 'src') diff --git a/src/openttd.cpp b/src/openttd.cpp index 9ef5b5a28..c11dfcf9a 100644 --- a/src/openttd.cpp +++ b/src/openttd.cpp @@ -59,6 +59,7 @@ #include "misc/getoptdata.h" #include "game/game.hpp" #include "game/game_config.hpp" +#include "town.h" @@ -1134,6 +1135,24 @@ static void CheckCaches() * always to aid testing of caches. */ if (_debug_desync_level <= 1) return; + /* Check the town caches. */ + SmallVector old_town_caches; + Town *t; + FOR_ALL_TOWNS(t) { + MemCpyT(old_town_caches.Append(), &t->cache); + } + + extern void RebuildTownCaches(); + RebuildTownCaches(); + + uint i = 0; + FOR_ALL_TOWNS(t) { + if (MemCmpT(old_town_caches.Get(i), &t->cache) != 0) { + DEBUG(desync, 2, "town cache mismatch: town %i", (int)t->index); + } + i++; + } + /* Check company infrastructure cache. */ SmallVector old_infrastructure; Company *c; @@ -1142,7 +1161,7 @@ static void CheckCaches() extern void AfterLoadCompanyStats(); AfterLoadCompanyStats(); - uint i = 0; + i = 0; FOR_ALL_COMPANIES(c) { if (MemCmpT(old_infrastructure.Get(i), &c->infrastructure) != 0) { DEBUG(desync, 2, "infrastructure cache mismatch: company %i", (int)c->index); diff --git a/src/saveload/town_sl.cpp b/src/saveload/town_sl.cpp index 07043bc0a..6edd6ddd3 100644 --- a/src/saveload/town_sl.cpp +++ b/src/saveload/town_sl.cpp @@ -13,19 +13,15 @@ #include "../newgrf_house.h" #include "../town.h" #include "../landscape.h" +#include "../subsidy_func.h" #include "saveload.h" #include "newgrf_sl.h" /** - * Check and update town and house values. - * - * Checked are the HouseIDs. Updated are the - * town population the number of houses per - * town, the town radius and the max passengers - * of the town. + * Rebuild all the cached variables of towns. */ -void UpdateHousesAndTowns() +void RebuildTownCaches() { Town *town; InitializeBuildingCounts(); @@ -36,6 +32,38 @@ void UpdateHousesAndTowns() town->cache.num_houses = 0; } + for (TileIndex t = 0; t < MapSize(); t++) { + if (!IsTileType(t, MP_HOUSE)) continue; + + HouseID house_id = GetCleanHouseType(t); + town = Town::GetByTile(t); + IncreaseBuildingCount(town, house_id); + if (IsHouseCompleted(t)) town->cache.population += HouseSpec::Get(house_id)->population; + + /* Increase the number of houses for every house, but only once. */ + if (GetHouseNorthPart(house_id) == 0) town->cache.num_houses++; + } + + /* Update the population and num_house dependant values */ + FOR_ALL_TOWNS(town) { + UpdateTownRadius(town); + UpdateTownCargoes(town); + } + UpdateTownCargoBitmap(); + + RebuildSubsidisedSourceAndDestinationCache(); +} + +/** + * Check and update town and house values. + * + * Checked are the HouseIDs. Updated are the + * town population the number of houses per + * town, the town radius and the max passengers + * of the town. + */ +void UpdateHousesAndTowns() +{ for (TileIndex t = 0; t < MapSize(); t++) { if (!IsTileType(t, MP_HOUSE)) continue; @@ -82,24 +110,7 @@ void UpdateHousesAndTowns() } } - for (TileIndex t = 0; t < MapSize(); t++) { - if (!IsTileType(t, MP_HOUSE)) continue; - - HouseID house_id = GetCleanHouseType(t); - town = Town::GetByTile(t); - IncreaseBuildingCount(town, house_id); - if (IsHouseCompleted(t)) town->cache.population += HouseSpec::Get(house_id)->population; - - /* Increase the number of houses for every house, but only once. */ - if (GetHouseNorthPart(house_id) == 0) town->cache.num_houses++; - } - - /* Update the population and num_house dependant values */ - FOR_ALL_TOWNS(town) { - UpdateTownRadius(town); - UpdateTownCargoes(town); - } - UpdateTownCargoBitmap(); + RebuildTownCaches(); } /** Save and load of towns. */ -- cgit v1.2.3-54-g00ecf