diff options
-rw-r--r-- | command.c | 10 | ||||
-rw-r--r-- | command.h | 6 | ||||
-rw-r--r-- | rail_cmd.c | 8 |
3 files changed, 15 insertions, 9 deletions
@@ -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; } @@ -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) { |