summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--command.c10
-rw-r--r--command.h6
-rw-r--r--rail_cmd.c8
3 files changed, 15 insertions, 9 deletions
diff --git a/command.c b/command.c
index 2bee18831..1fd746a3f 100644
--- a/command.c
+++ b/command.c
@@ -349,7 +349,7 @@ int32 DoCommand(int x, int y, uint32 p1, uint32 p2, uint32 flags, uint procc)
// only execute the test call if it's toplevel, or we're not execing.
if (_docommand_recursive == 1 || !(flags & DC_EXEC) || (flags & DC_FORCETEST) ) {
res = proc(x, y, flags&~DC_EXEC, p1, p2);
- if ((uint32)res >> 16 == 0x8000) {
+ if (CmdFailed(res)) {
if (res & 0xFFFF) _error_message = res & 0xFFFF;
goto error;
}
@@ -368,7 +368,7 @@ int32 DoCommand(int x, int y, uint32 p1, uint32 p2, uint32 flags, uint procc)
/* Execute the command here. All cost-relevant functions set the expenses type
* themselves with "SET_EXPENSES_TYPE(...);" at the beginning of the function */
res = proc(x, y, flags, p1, p2);
- if ((uint32)res >> 16 == 0x8000) {
+ if (CmdFailed(res)) {
if (res & 0xFFFF) _error_message = res & 0xFFFF;
error:
_docommand_recursive--;
@@ -443,7 +443,7 @@ bool DoCommandP(TileIndex tile, uint32 p1, uint32 p2, CommandCallback *callback,
if (_shift_pressed && _current_player == _local_player && !(cmd & (CMD_NETWORK_COMMAND | CMD_SHOW_NO_ERROR))) {
// estimate the cost.
res = proc(x, y, flags, p1, p2);
- if ((uint32)res >> 16 == 0x8000) {
+ if (CmdFailed(res)) {
if (res & 0xFFFF) _error_message = res & 0xFFFF;
ShowErrorMessage(_error_message, _error_message_2, x, y);
} else {
@@ -458,7 +458,7 @@ bool DoCommandP(TileIndex tile, uint32 p1, uint32 p2, CommandCallback *callback,
if (!((cmd & CMD_NO_TEST_IF_IN_NETWORK) && _networking)) {
// first test if the command can be executed.
res = proc(x,y, flags, p1, p2);
- if ((uint32)res >> 16 == 0x8000) {
+ if (CmdFailed(res)) {
if (res & 0xFFFF) _error_message = res & 0xFFFF;
goto show_error;
}
@@ -489,7 +489,7 @@ bool DoCommandP(TileIndex tile, uint32 p1, uint32 p2, CommandCallback *callback,
if (!notest && !((cmd & CMD_NO_TEST_IF_IN_NETWORK) && _networking)) {
assert(res == res2); // sanity check
} else {
- if ((uint32)res2 >> 16 == 0x8000) {
+ if (CmdFailed(res)) {
if (res2 & 0xFFFF) _error_message = res2 & 0xFFFF;
goto show_error;
}
diff --git a/command.h b/command.h
index 90a3283d2..16ececd50 100644
--- a/command.h
+++ b/command.h
@@ -177,6 +177,12 @@ enum {
//#define return_cmd_error(errcode) do { _error_message=(errcode); return CMD_ERROR; } while(0)
#define return_cmd_error(errcode) do { return CMD_ERROR | (errcode); } while (0)
+static inline bool CmdFailed(int32 res)
+{
+ // lower 16bits are the StringID of the possible error
+ return res <= (CMD_ERROR | INVALID_STRING_ID);
+}
+
/* command.c */
int32 DoCommand(int x, int y, uint32 p1, uint32 p2, uint32 flags, uint procc);
int32 DoCommandByTile(TileIndex tile, uint32 p1, uint32 p2, uint32 flags, uint procc);
diff --git a/rail_cmd.c b/rail_cmd.c
index 2a243b17f..b7724d553 100644
--- a/rail_cmd.c
+++ b/rail_cmd.c
@@ -307,7 +307,7 @@ int32 CmdBuildSingleRail(int x, int y, uint32 flags,
switch (m5 & 0x38) { // what's under the bridge?
case 0x00: // clear land
ret = CheckRailSlope(tileh, rail_bit, 0, tile);
- if (ret & CMD_ERROR) return ret;
+ if (CmdFailed(ret)) return ret;
cost += ret;
if (flags & DC_EXEC) {
@@ -340,7 +340,7 @@ int32 CmdBuildSingleRail(int x, int y, uint32 flags,
}
ret = CheckRailSlope(tileh, rail_bit, m5 & RAIL_BIT_MASK, tile);
- if (ret & CMD_ERROR) return ret;
+ if (CmdFailed(ret)) return ret;
cost += ret;
if (flags & DC_EXEC) _map5[tile] = m5 | rail_bit;
@@ -370,11 +370,11 @@ int32 CmdBuildSingleRail(int x, int y, uint32 flags,
default:
ret = CheckRailSlope(tileh, rail_bit, 0, tile);
- if (ret & CMD_ERROR) return ret;
+ if (CmdFailed(ret)) return ret;
cost += ret;
ret = DoCommandByTile(tile, 0, 0, flags, CMD_LANDSCAPE_CLEAR);
- if (ret == CMD_ERROR) return ret;
+ if (CmdFailed(ret)) return ret;
cost += ret;
if (flags & DC_EXEC) {