diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/engine.cpp | 39 | ||||
-rw-r--r-- | src/engine_func.h | 1 | ||||
-rw-r--r-- | src/group.h | 2 | ||||
-rw-r--r-- | src/group_cmd.cpp | 39 | ||||
-rw-r--r-- | src/saveload/afterload.cpp | 5 |
5 files changed, 44 insertions, 42 deletions
diff --git a/src/engine.cpp b/src/engine.cpp index 6f5ea40a8..f4474ea27 100644 --- a/src/engine.cpp +++ b/src/engine.cpp @@ -461,45 +461,6 @@ bool EngineOverrideManager::ResetToCurrentNewGRFConfig() } /** - * Sets cached values in Company::num_vehicles and Group::num_vehicles - */ -void SetCachedEngineCounts() -{ - size_t engines = Engine::GetPoolSize(); - - /* Set up the engine count for all companies */ - Company *c; - FOR_ALL_COMPANIES(c) { - free(c->num_engines); - c->num_engines = CallocT<EngineID>(engines); - } - - /* Recalculate */ - Group *g; - FOR_ALL_GROUPS(g) { - g->statistics.Clear(); - } - - const Vehicle *v; - FOR_ALL_VEHICLES(v) { - if (!v->IsEngineCountable()) continue; - - assert(v->engine_type < engines); - - Company::Get(v->owner)->num_engines[v->engine_type]++; - - if (v->group_id == DEFAULT_GROUP) continue; - - g = Group::Get(v->group_id); - assert(v->type == g->vehicle_type); - assert(v->owner == g->owner); - - g->statistics.num_engines[v->engine_type]++; - if (v->IsPrimaryVehicle()) g->statistics.num_vehicle++; - } -} - -/** * Initialise the engine pool with the data from the original vehicles. */ void SetupEngines() diff --git a/src/engine_func.h b/src/engine_func.h index d8fbeb607..bb7e2fcac 100644 --- a/src/engine_func.h +++ b/src/engine_func.h @@ -25,7 +25,6 @@ extern const uint8 _engine_offsets[4]; bool IsEngineBuildable(EngineID engine, VehicleType type, CompanyID company); bool IsEngineRefittable(EngineID engine); -void SetCachedEngineCounts(); void SetYearEngineAgingStops(); void StartupOneEngine(Engine *e, Date aging_date); diff --git a/src/group.h b/src/group.h index e28d36120..2b6e72492 100644 --- a/src/group.h +++ b/src/group.h @@ -30,6 +30,8 @@ struct GroupStatistics { ~GroupStatistics(); void Clear(); + + static void UpdateAfterLoad(); }; /** Group data. */ diff --git a/src/group_cmd.cpp b/src/group_cmd.cpp index 1dfa8e258..d4148474f 100644 --- a/src/group_cmd.cpp +++ b/src/group_cmd.cpp @@ -54,6 +54,45 @@ void GroupStatistics::Clear() this->num_engines = CallocT<uint16>(Engine::GetPoolSize()); } +/** + * Update all caches after loading a game, changing NewGRF etc.. + */ +/* static */ void GroupStatistics::UpdateAfterLoad() +{ + size_t engines = Engine::GetPoolSize(); + + /* Set up the engine count for all companies */ + Company *c; + FOR_ALL_COMPANIES(c) { + free(c->num_engines); + c->num_engines = CallocT<EngineID>(engines); + } + + /* Recalculate */ + Group *g; + FOR_ALL_GROUPS(g) { + g->statistics.Clear(); + } + + const Vehicle *v; + FOR_ALL_VEHICLES(v) { + if (!v->IsEngineCountable()) continue; + + assert(v->engine_type < engines); + + Company::Get(v->owner)->num_engines[v->engine_type]++; + + if (v->group_id == DEFAULT_GROUP) continue; + + g = Group::Get(v->group_id); + assert(v->type == g->vehicle_type); + assert(v->owner == g->owner); + + g->statistics.num_engines[v->engine_type]++; + if (v->IsPrimaryVehicle()) g->statistics.num_vehicle++; + } +} + /** * Update the num engines of a groupID. Decrease the old one and increase the new one diff --git a/src/saveload/afterload.cpp b/src/saveload/afterload.cpp index 1ad7f5493..52f5e7bb5 100644 --- a/src/saveload/afterload.cpp +++ b/src/saveload/afterload.cpp @@ -52,6 +52,7 @@ #include "../core/backup_type.hpp" #include "../smallmap_gui.h" #include "../news_func.h" +#include "../group.h" #include "table/strings.h" @@ -252,7 +253,7 @@ static void InitializeWindowsAndCaches() RecomputePrices(); - SetCachedEngineCounts(); + GroupStatistics::UpdateAfterLoad(); Station::RecomputeIndustriesNearForAll(); RebuildSubsidisedSourceAndDestinationCache(); @@ -2677,7 +2678,7 @@ void ReloadNewGRFData() ResetVehiclePosHash(); AfterLoadVehicles(false); StartupEngines(); - SetCachedEngineCounts(); + GroupStatistics::UpdateAfterLoad(); /* update station graphics */ AfterLoadStations(); /* Check and update house and town values */ |