Mercurial > hg > openttd
changeset 9211:30076ddd1741 draft
(svn r13077) -Codechange: move function that updates cached num_engines to engine.cpp, make it run only 1 loop
author | smatz <smatz@openttd.org> |
---|---|
date | Tue, 13 May 2008 21:36:09 +0000 |
parents | 59df6166f3a1 |
children | cfbd67d81940 |
files | src/engine.cpp src/engine_func.h src/openttd.cpp |
diffstat | 3 files changed, 46 insertions(+), 33 deletions(-) [+] |
line wrap: on
line diff
--- a/src/engine.cpp +++ b/src/engine.cpp @@ -27,6 +27,7 @@ #include "settings_type.h" #include "oldpool_func.h" #include "core/alloc_func.hpp" +#include "vehicle_func.h" #include "map" #include "table/strings.h" @@ -140,6 +141,42 @@ qsort(&((*el)[begin]), num_items, sizeof(EngineID), compare); } +void SetCachedEngineCounts() +{ + uint engines = GetEnginePoolSize(); + + /* Set up the engine count for all players */ + Player *p; + FOR_ALL_PLAYERS(p) { + free(p->num_engines); + p->num_engines = CallocT<EngineID>(engines); + } + + /* Recalculate */ + Group *g; + FOR_ALL_GROUPS(g) { + free(g->num_engines); + g->num_engines = CallocT<EngineID>(engines); + } + + const Vehicle *v; + FOR_ALL_VEHICLES(v) { + if (!IsEngineCountable(v)) continue; + + assert(v->engine_type < engines); + + GetPlayer(v->owner)->num_engines[v->engine_type]++; + + if (v->group_id == DEFAULT_GROUP) continue; + + g = GetGroup(v->group_id); + assert(v->type == g->vehicle_type); + assert(v->owner == g->owner); + + g->num_engines[v->engine_type]++; + } +} + void SetupEngines() { _Engine_pool.CleanPool();
--- a/src/engine_func.h +++ b/src/engine_func.h @@ -27,6 +27,7 @@ bool IsEngineBuildable(EngineID engine, VehicleType type, PlayerID player); CargoID GetEngineCargoType(EngineID engine); +void SetCachedEngineCounts(); typedef int CDECL EngList_SortTypeFunction(const void*, const void*); ///< argument type for EngList_Sort() void EngList_Sort(EngineList *el, EngList_SortTypeFunction compare); ///< qsort of the engine list
--- a/src/openttd.cpp +++ b/src/openttd.cpp @@ -1335,42 +1335,17 @@ UpdateAllTownVirtCoords(); UpdateAllWaypointSigns(); - /* Recalculate */ - Group *g; - FOR_ALL_GROUPS(g) { - g->num_engines = CallocT<uint16>(GetEnginePoolSize()); - - const Vehicle *v; - FOR_ALL_VEHICLES(v) { - if (!IsEngineCountable(v)) continue; - - if (v->group_id != g->index || v->type != g->vehicle_type || v->owner != g->owner) continue; - - g->num_engines[v->engine_type]++; + Player *p; + FOR_ALL_PLAYERS(p) { + /* For each player, verify (while loading a scenario) that the inauguration date is the current year and set it + * accordingly if it is not the case. No need to set it on players that are not been used already, + * thus the MIN_YEAR (which is really nothing more than Zero, initialized value) test */ + if (_file_to_saveload.filetype == FT_SCENARIO && p->inaugurated_year != MIN_YEAR) { + p->inaugurated_year = _cur_year; } } - /* Set up the engine count for all players */ - Player *players[MAX_PLAYERS]; - const Vehicle *v; - - for (PlayerID i = PLAYER_FIRST; i < MAX_PLAYERS; i++) { - players[i] = GetPlayer(i); - - /* For each player, verify (while loading a scenario) that the inauguration date is the current year and set it - * accordingly if it is not the case. No need to set it on players that are not been used already, - * thus the MIN_YEAR (which is really nothing more than Zero, initialized value) test */ - if (_file_to_saveload.filetype == FT_SCENARIO && players[i]->inaugurated_year != MIN_YEAR) - players[i]->inaugurated_year = _cur_year; - - free(players[i]->num_engines); - players[i]->num_engines = CallocT<uint16>(GetEnginePoolSize()); - } - - FOR_ALL_VEHICLES(v) { - if (!IsEngineCountable(v)) continue; - players[v->owner]->num_engines[v->engine_type]++; - } + SetCachedEngineCounts(); return true; }