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();
 	}
 }