diff --git a/src/newgrf_commons.cpp b/src/newgrf_commons.cpp --- 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(TileInde 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 NewGRFSpriteLayout::result_seq; /**