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

pull/155/head
frosch 14 years ago
parent 67ce7c5c41
commit 447f3dbe2c

@ -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 @@ DEF_CONSOLE_CMD(ConResetEngines)
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 @@ void IConsoleStdLibRegister()
IConsoleCmdRegister("getdate", ConGetDate);
IConsoleCmdRegister("quit", ConExit);
IConsoleCmdRegister("resetengines", ConResetEngines, ConHookNoNetwork);
IConsoleCmdRegister("reset_enginepool", ConResetEnginePool, ConHookNoNetwork);
IConsoleCmdRegister("return", ConReturn);
IConsoleCmdRegister("screenshot", ConScreenShot);
IConsoleCmdRegister("script", ConScript);

@ -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"
@ -429,6 +430,25 @@ EngineID EngineOverrideManager::GetID(VehicleType type, uint16 grf_local_id, uin
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
*/

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

@ -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 @@ static bool ChangeDynamicEngines(int32 p1)
{
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;
}

@ -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 @@ static void ResetLandscapeConfirmationCallback(Window *w, bool confirmed)
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();
}
}

Loading…
Cancel
Save