Mercurial > hg > openttd
changeset 17235:3f6432af5795 draft
(svn r21975) -Add: console command to reset the engine pool. It removes the traces of engines which are no longer associated to a NewGRF, and can be used to e.g. 'fix' scenarios which were screwed up by the author. You can only use it when there are no vehicles in the game though.
author | frosch <frosch@openttd.org> |
---|---|
date | Sat, 05 Feb 2011 16:07:23 +0000 |
parents | 08d6a07fe4ce |
children | 2401b5b905f3 |
files | src/console_cmds.cpp src/engine.cpp src/engine_base.h src/settings.cpp src/terraform_gui.cpp |
diffstat | 5 files changed, 51 insertions(+), 12 deletions(-) [+] |
line wrap: on
line diff
--- a/src/console_cmds.cpp +++ b/src/console_cmds.cpp @@ -35,6 +35,7 @@ #include "ai/ai_config.hpp" #include "newgrf.h" #include "console_func.h" +#include "engine_base.h" #ifdef ENABLE_NETWORK #include "table/strings.h" @@ -141,6 +142,26 @@ return true; } +DEF_CONSOLE_CMD(ConResetEnginePool) +{ + if (argc == 0) { + IConsoleHelp("Reset NewGRF allocations of engine slots. This will remove invalid engine definitions, and might make default engines available again."); + return true; + } + + if (_game_mode == GM_MENU) { + IConsoleError("This command is only available in game and editor."); + return true; + } + + if (!EngineOverrideManager::ResetToCurrentNewGRFConfig()) { + IConsoleError("This can only be done when there are no vehicles in the game."); + return true; + } + + return true; +} + #ifdef _DEBUG DEF_CONSOLE_CMD(ConResetTile) { @@ -1781,6 +1802,7 @@ IConsoleCmdRegister("getdate", ConGetDate); IConsoleCmdRegister("quit", ConExit); IConsoleCmdRegister("resetengines", ConResetEngines, ConHookNoNetwork); + IConsoleCmdRegister("reset_enginepool", ConResetEnginePool, ConHookNoNetwork); IConsoleCmdRegister("return", ConReturn); IConsoleCmdRegister("screenshot", ConScreenShot); IConsoleCmdRegister("script", ConScript);
--- a/src/engine.cpp +++ b/src/engine.cpp @@ -29,6 +29,7 @@ #include "engine_func.h" #include "engine_base.h" #include "company_base.h" +#include "vehicle_func.h" #include "table/strings.h" #include "table/engines.h" @@ -430,6 +431,25 @@ } /** + * Tries to reset the engine mapping to match the current NewGRF configuration. + * This is only possible when there are currently no vehicles in the game. + * @return false if resetting failed due to present vehicles. + */ +bool EngineOverrideManager::ResetToCurrentNewGRFConfig() +{ + const Vehicle *v; + FOR_ALL_VEHICLES(v) { + if (IsCompanyBuildableVehicleType(v)) return false; + } + + /* Reset the engines, they will get new EngineIDs */ + _engine_mngr.ResetToDefaultMapping(); + ReloadNewGRFData(); + + return true; +} + +/** * Sets cached values in Company::num_vehicles and Group::num_vehicles */ void SetCachedEngineCounts()
--- a/src/engine_base.h +++ b/src/engine_base.h @@ -114,6 +114,8 @@ void ResetToDefaultMapping(); EngineID GetID(VehicleType type, uint16 grf_local_id, uint32 grfid); + + static bool ResetToCurrentNewGRFConfig(); }; extern EngineOverrideManager _engine_mngr;
--- a/src/settings.cpp +++ b/src/settings.cpp @@ -36,7 +36,6 @@ #include "train.h" #include "news_func.h" #include "window_func.h" -#include "vehicle_func.h" #include "sound_func.h" #include "company_func.h" #include "rev.h" @@ -58,7 +57,6 @@ #include "ini_type.h" #include "ai/ai_config.hpp" #include "ai/ai.hpp" -#include "newgrf.h" #include "ship.h" #include "smallmap_gui.h" #include "roadveh.h" @@ -1133,18 +1131,11 @@ { if (_game_mode == GM_MENU) return true; - const Vehicle *v; - FOR_ALL_VEHICLES(v) { - if (IsCompanyBuildableVehicleType(v)) { - ShowErrorMessage(STR_CONFIG_SETTING_DYNAMIC_ENGINES_EXISTING_VEHICLES, INVALID_STRING_ID, WL_ERROR); - return false; - } + if (!EngineOverrideManager::ResetToCurrentNewGRFConfig()) { + ShowErrorMessage(STR_CONFIG_SETTING_DYNAMIC_ENGINES_EXISTING_VEHICLES, INVALID_STRING_ID, WL_ERROR); + return false; } - /* Reset the engines, they will get new EngineIDs */ - _engine_mngr.ResetToDefaultMapping(); - ReloadNewGRFData(); - return true; }
--- a/src/terraform_gui.cpp +++ b/src/terraform_gui.cpp @@ -31,6 +31,7 @@ #include "newgrf_object.h" #include "object.h" #include "hotkeys.h" +#include "engine_base.h" #include "table/strings.h" @@ -560,6 +561,9 @@ if (!st->IsInUse()) delete st; } + /* Now that all vehicles are gone, we can reset the engine pool. Maybe it reduces some NewGRF changing-mess */ + EngineOverrideManager::ResetToCurrentNewGRFConfig(); + MarkWholeScreenDirty(); } }