changeset 18304:b84b00f90388 draft

(svn r23140) -Add: ErrorUnknownCallbackResult()
author frosch <frosch@openttd.org>
date Tue, 08 Nov 2011 17:24:15 +0000
parents d4e516050f24
children b63ed3b18fd0
files src/lang/english.txt src/newgrf_commons.cpp src/newgrf_commons.h src/newgrf_config.h
diffstat 4 files changed, 40 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/src/lang/english.txt
+++ b/src/lang/english.txt
@@ -2520,6 +2520,7 @@
 STR_NEWGRF_BUGGY                                                :{WHITE}NewGRF '{0:RAW_STRING}' provides incorrect information
 STR_NEWGRF_BUGGY_ARTICULATED_CARGO                              :{WHITE}Cargo/refit information for '{1:ENGINE}' differs from purchase list after construction. This might cause autorenew/-replace to fail refitting correctly
 STR_NEWGRF_BUGGY_ENDLESS_PRODUCTION_CALLBACK                    :{WHITE}'{1:STRING}' caused an endless loop in the production callback
+STR_NEWGRF_BUGGY_UNKNOWN_CALLBACK_RESULT                        :{WHITE}Callback 0x{HEX} returned unknown/invalid result 0x{HEX}
 
 # 'User removed essential NewGRFs'-placeholders for stuff without specs
 STR_NEWGRF_INVALID_CARGO                                        :<invalid cargo>
--- a/src/newgrf_commons.cpp
+++ b/src/newgrf_commons.cpp
@@ -13,10 +13,12 @@
  */
 
 #include "stdafx.h"
+#include "debug.h"
 #include "landscape.h"
 #include "house.h"
 #include "industrytype.h"
 #include "newgrf.h"
+#include "newgrf_config.h"
 #include "clear_map.h"
 #include "station_map.h"
 #include "tree_map.h"
@@ -27,6 +29,8 @@
 #include "newgrf_text.h"
 #include "livery.h"
 #include "company_base.h"
+#include "gui.h"
+#include "strings_func.h"
 
 #include "table/strings.h"
 
@@ -495,6 +499,38 @@
 	return res;
 }
 
+/**
+ * Record that a NewGRF returned an unknown/invalid callback result.
+ * Also show an error to the user.
+ * @param grfid ID of the NewGRF causing the problem.
+ * @param cbid Callback causing the problem.
+ * @param cb_res Invalid result returned by the callback.
+ */
+void ErrorUnknownCallbackResult(uint32 grfid, uint16 cbid, uint16 cb_res)
+{
+	GRFConfig *grfconfig = GetGRFConfig(grfid);
+
+	if (!HasBit(grfconfig->grf_bugs, GBUG_UNKNOWN_CB_RESULT)) {
+		SetBit(grfconfig->grf_bugs, GBUG_UNKNOWN_CB_RESULT);
+		SetDParamStr(0, grfconfig->GetName());
+		SetDParam(1, cbid);
+		SetDParam(2, cb_res);
+		ShowErrorMessage(STR_NEWGRF_BUGGY, STR_NEWGRF_BUGGY_UNKNOWN_CALLBACK_RESULT, WL_CRITICAL);
+	}
+
+	/* debug output */
+	char buffer[512];
+
+	SetDParamStr(0, grfconfig->GetName());
+	GetString(buffer, STR_NEWGRF_BUGGY, lastof(buffer));
+	DEBUG(grf, 0, "%s", buffer + 3);
+
+	SetDParam(1, cbid);
+	SetDParam(2, cb_res);
+	GetString(buffer, STR_NEWGRF_BUGGY_UNKNOWN_CALLBACK_RESULT, lastof(buffer));
+	DEBUG(grf, 0, "%s", buffer + 3);
+}
+
 /* static */ SmallVector<DrawTileSeqStruct, 8> NewGRFSpriteLayout::result_seq;
 
 /**
--- a/src/newgrf_commons.h
+++ b/src/newgrf_commons.h
@@ -300,6 +300,8 @@
 uint32 GetCompanyInfo(CompanyID owner, const struct Livery *l = NULL);
 CommandCost GetErrorMessageFromLocationCallbackResult(uint16 cb_res, uint32 grfid, StringID default_error);
 
+void ErrorUnknownCallbackResult(uint32 grfid, uint16 cbid, uint16 cb_res);
+
 /**
  * Data related to the handling of grf files.
  * @tparam Tcnt Number of spritegroups
--- a/src/newgrf_config.h
+++ b/src/newgrf_config.h
@@ -44,6 +44,7 @@
 	GBUG_VEH_LENGTH,        ///< Length of rail vehicle changes when not inside a depot
 	GBUG_VEH_REFIT,         ///< Articulated vehicles carry different cargos resp. are differently refittable than specified in purchase list
 	GBUG_VEH_POWERED_WAGON, ///< Powered wagon changed poweredness state when not inside a depot
+	GBUG_UNKNOWN_CB_RESULT, ///< A callback returned an unknown/invalid result
 };
 
 /** Status of post-gameload GRF compatibility check */