1
0
Fork 0

(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.

release/1.1
frosch 2011-02-05 16:07:23 +00:00
parent a4b08dddd1
commit 915e339d0f
5 changed files with 51 additions and 12 deletions

View File

@ -35,6 +35,7 @@
#include "ai/ai_config.hpp" #include "ai/ai_config.hpp"
#include "newgrf.h" #include "newgrf.h"
#include "console_func.h" #include "console_func.h"
#include "engine_base.h"
#ifdef ENABLE_NETWORK #ifdef ENABLE_NETWORK
#include "table/strings.h" #include "table/strings.h"
@ -141,6 +142,26 @@ DEF_CONSOLE_CMD(ConResetEngines)
return true; 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 #ifdef _DEBUG
DEF_CONSOLE_CMD(ConResetTile) DEF_CONSOLE_CMD(ConResetTile)
{ {
@ -1781,6 +1802,7 @@ void IConsoleStdLibRegister()
IConsoleCmdRegister("getdate", ConGetDate); IConsoleCmdRegister("getdate", ConGetDate);
IConsoleCmdRegister("quit", ConExit); IConsoleCmdRegister("quit", ConExit);
IConsoleCmdRegister("resetengines", ConResetEngines, ConHookNoNetwork); IConsoleCmdRegister("resetengines", ConResetEngines, ConHookNoNetwork);
IConsoleCmdRegister("reset_enginepool", ConResetEnginePool, ConHookNoNetwork);
IConsoleCmdRegister("return", ConReturn); IConsoleCmdRegister("return", ConReturn);
IConsoleCmdRegister("screenshot", ConScreenShot); IConsoleCmdRegister("screenshot", ConScreenShot);
IConsoleCmdRegister("script", ConScript); IConsoleCmdRegister("script", ConScript);

View File

@ -29,6 +29,7 @@
#include "engine_func.h" #include "engine_func.h"
#include "engine_base.h" #include "engine_base.h"
#include "company_base.h" #include "company_base.h"
#include "vehicle_func.h"
#include "table/strings.h" #include "table/strings.h"
#include "table/engines.h" #include "table/engines.h"
@ -429,6 +430,25 @@ EngineID EngineOverrideManager::GetID(VehicleType type, uint16 grf_local_id, uin
return INVALID_ENGINE; return INVALID_ENGINE;
} }
/**
* 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 * Sets cached values in Company::num_vehicles and Group::num_vehicles
*/ */

View File

@ -114,6 +114,8 @@ struct EngineOverrideManager : SmallVector<EngineIDMapping, 256> {
void ResetToDefaultMapping(); void ResetToDefaultMapping();
EngineID GetID(VehicleType type, uint16 grf_local_id, uint32 grfid); EngineID GetID(VehicleType type, uint16 grf_local_id, uint32 grfid);
static bool ResetToCurrentNewGRFConfig();
}; };
extern EngineOverrideManager _engine_mngr; extern EngineOverrideManager _engine_mngr;

View File

@ -36,7 +36,6 @@
#include "train.h" #include "train.h"
#include "news_func.h" #include "news_func.h"
#include "window_func.h" #include "window_func.h"
#include "vehicle_func.h"
#include "sound_func.h" #include "sound_func.h"
#include "company_func.h" #include "company_func.h"
#include "rev.h" #include "rev.h"
@ -58,7 +57,6 @@
#include "ini_type.h" #include "ini_type.h"
#include "ai/ai_config.hpp" #include "ai/ai_config.hpp"
#include "ai/ai.hpp" #include "ai/ai.hpp"
#include "newgrf.h"
#include "ship.h" #include "ship.h"
#include "smallmap_gui.h" #include "smallmap_gui.h"
#include "roadveh.h" #include "roadveh.h"
@ -1133,18 +1131,11 @@ static bool ChangeDynamicEngines(int32 p1)
{ {
if (_game_mode == GM_MENU) return true; if (_game_mode == GM_MENU) return true;
const Vehicle *v; if (!EngineOverrideManager::ResetToCurrentNewGRFConfig()) {
FOR_ALL_VEHICLES(v) { ShowErrorMessage(STR_CONFIG_SETTING_DYNAMIC_ENGINES_EXISTING_VEHICLES, INVALID_STRING_ID, WL_ERROR);
if (IsCompanyBuildableVehicleType(v)) { return false;
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; return true;
} }

View File

@ -31,6 +31,7 @@
#include "newgrf_object.h" #include "newgrf_object.h"
#include "object.h" #include "object.h"
#include "hotkeys.h" #include "hotkeys.h"
#include "engine_base.h"
#include "table/strings.h" #include "table/strings.h"
@ -560,6 +561,9 @@ static void ResetLandscapeConfirmationCallback(Window *w, bool confirmed)
if (!st->IsInUse()) delete st; 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(); MarkWholeScreenDirty();
} }
} }