summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormichi_cc <michi_cc@openttd.org>2011-07-11 16:32:19 +0000
committermichi_cc <michi_cc@openttd.org>2011-07-11 16:32:19 +0000
commit206ff68e65b1a679e96f5064e3595a183327ef6b (patch)
treeb8e692a54a0d9cf28150a6e2efb1a3c78ceff8b3
parent1e855be4924d113d1e1eefd6345f174a86a9ef0b (diff)
downloadopenttd-206ff68e65b1a679e96f5064e3595a183327ef6b.tar.xz
(svn r22656) -Codechange: Deduplicate the custom error message of the industry shape and location callbacks.
-rw-r--r--src/newgrf_commons.cpp27
-rw-r--r--src/newgrf_commons.h2
-rw-r--r--src/newgrf_industries.cpp15
-rw-r--r--src/newgrf_industrytiles.cpp14
4 files changed, 32 insertions, 26 deletions
diff --git a/src/newgrf_commons.cpp b/src/newgrf_commons.cpp
index 8a50786fb..0c6cef3eb 100644
--- a/src/newgrf_commons.cpp
+++ b/src/newgrf_commons.cpp
@@ -24,6 +24,9 @@
#include "newgrf_object.h"
#include "genworld.h"
#include "newgrf_spritegroup.h"
+#include "newgrf_text.h"
+
+#include "table/strings.h"
/**
* Constructor of generic class
@@ -446,6 +449,30 @@ uint32 GetNearbyTileInformation(TileIndex tile)
return tile_type << 24 | z << 16 | terrain_type << 8 | tileh;
}
+/**
+ * Get the error message from a shape/location/slope check callback result.
+ * @param cb_res Callback result to translate. If bit 10 is set this is a standard error message, otherwise a NewGRF provided string.
+ * @param grfid grfID to use to resolve a custom error message.
+ * @param default_error Error message to use for the generic error.
+ * @return CommandCost indicating success or the error message.
+ */
+CommandCost GetErrorMessageFromLocationCallbackResult(uint16 cb_res, uint32 grfid, StringID default_error)
+{
+ CommandCost res;
+ switch (cb_res) {
+ case 0x400: return res; // No error.
+ case 0x401: res = CommandCost(default_error); break;
+ case 0x402: res = CommandCost(STR_ERROR_CAN_ONLY_BE_BUILT_IN_RAINFOREST); break;
+ case 0x403: res = CommandCost(STR_ERROR_CAN_ONLY_BE_BUILT_IN_DESERT); break;
+ default: res = CommandCost(GetGRFStringID(grfid, 0xD000 + cb_res)); break;
+ }
+
+ /* Copy some parameters from the registers to the error message text ref. stack */
+ res.UseTextRefStack(4);
+
+ return res;
+}
+
/* static */ SmallVector<DrawTileSeqStruct, 8> NewGRFSpriteLayout::result_seq;
/**
diff --git a/src/newgrf_commons.h b/src/newgrf_commons.h
index 52622a44d..f1977b252 100644
--- a/src/newgrf_commons.h
+++ b/src/newgrf_commons.h
@@ -19,6 +19,7 @@
#include "sprite.h"
#include "core/alloc_type.hpp"
#include "core/smallvec_type.hpp"
+#include "command_type.h"
/** Context for tile accesses */
enum TileContext {
@@ -267,6 +268,7 @@ extern ObjectOverrideManager _object_mngr;
uint32 GetTerrainType(TileIndex tile, TileContext context = TCX_NORMAL);
TileIndex GetNearbyTile(byte parameter, TileIndex tile, bool signed_offsets = true);
uint32 GetNearbyTileInformation(TileIndex tile);
+CommandCost GetErrorMessageFromLocationCallbackResult(uint16 cb_res, uint32 grfid, StringID default_error);
/**
* Data related to the handling of grf files.
diff --git a/src/newgrf_industries.cpp b/src/newgrf_industries.cpp
index fa4fdf197..71118b126 100644
--- a/src/newgrf_industries.cpp
+++ b/src/newgrf_industries.cpp
@@ -544,20 +544,9 @@ CommandCost CheckIfCallBackAllowsCreation(TileIndex tile, IndustryType type, uin
* the building of the industry, as that's how it's done in TTDP. */
if (group == NULL) return CommandCost();
uint16 result = group->GetCallbackResult();
- if (result == 0x400 || result == CALLBACK_FAILED) return CommandCost();
-
- CommandCost res;
- switch (result) {
- case 0x401: res = CommandCost(STR_ERROR_SITE_UNSUITABLE); break;
- case 0x402: res = CommandCost(STR_ERROR_CAN_ONLY_BE_BUILT_IN_RAINFOREST); break;
- case 0x403: res = CommandCost(STR_ERROR_CAN_ONLY_BE_BUILT_IN_DESERT); break;
- default: res = CommandCost(GetGRFStringID(indspec->grf_prop.grffile->grfid, 0xD000 + result)); break;
- }
-
- /* Copy some parameters from the registers to the error message text ref. stack */
- res.UseTextRefStack(4);
+ if (result == CALLBACK_FAILED) return CommandCost();
- return res;
+ return GetErrorMessageFromLocationCallbackResult(result, indspec->grf_prop.grffile->grfid, STR_ERROR_SITE_UNSUITABLE);
}
/**
diff --git a/src/newgrf_industrytiles.cpp b/src/newgrf_industrytiles.cpp
index 3315de46e..ae5dca45c 100644
--- a/src/newgrf_industrytiles.cpp
+++ b/src/newgrf_industrytiles.cpp
@@ -303,20 +303,8 @@ CommandCost PerformIndustryTileSlopeCheck(TileIndex ind_base_tile, TileIndex ind
if (callback_res != 0) return CommandCost();
return_cmd_error(STR_ERROR_SITE_UNSUITABLE);
}
- if (callback_res == 0x400) return CommandCost();
-
- CommandCost res;
- switch (callback_res) {
- case 0x401: res = CommandCost(STR_ERROR_SITE_UNSUITABLE); break;
- case 0x402: res = CommandCost(STR_ERROR_CAN_ONLY_BE_BUILT_IN_RAINFOREST); break;
- case 0x403: res = CommandCost(STR_ERROR_CAN_ONLY_BE_BUILT_IN_DESERT); break;
- default: res = CommandCost(GetGRFStringID(its->grf_prop.grffile->grfid, 0xD000 + callback_res)); break;
- }
-
- /* Copy some parameters from the registers to the error message text ref. stack */
- res.UseTextRefStack(4);
- return res;
+ return GetErrorMessageFromLocationCallbackResult(callback_res, its->grf_prop.grffile->grfid, STR_ERROR_SITE_UNSUITABLE);
}
/* Simple wrapper for GetHouseCallback to keep the animation unified. */