diff options
-rw-r--r-- | src/rail_cmd.cpp | 30 |
1 files changed, 16 insertions, 14 deletions
diff --git a/src/rail_cmd.cpp b/src/rail_cmd.cpp index 7bab2a254..3475eb90e 100644 --- a/src/rail_cmd.cpp +++ b/src/rail_cmd.cpp @@ -150,14 +150,12 @@ static const byte _track_sloped_sprites[14] = { * * @param tile The tile. * @param track The track. - * @return \c true if no train that interacts, is found. \c false if a train is found. + * @return Succeeded command (no train found), or a failed command (a train was found). */ -static bool EnsureNoTrainOnTrack(TileIndex tile, Track track) +static CommandCost EnsureNoTrainOnTrack(TileIndex tile, Track track) { TrackBits rail_bits = TrackToTrackBits(track); - CommandCost ret = EnsureNoTrainOnTrackBits(tile, rail_bits); - ret.SetGlobalErrorMessage(); - return ret.Succeeded(); + return EnsureNoTrainOnTrackBits(tile, rail_bits); } /** Check that the new track bits may be built. @@ -375,11 +373,10 @@ CommandCost CmdBuildSingleRail(TileIndex tile, DoCommandFlag flags, uint32 p1, u if (!IsCompatibleRail(GetRailType(tile), railtype)) return_cmd_error(STR_ERROR_IMPOSSIBLE_TRACK_COMBINATION); CommandCost ret = CheckTrackCombination(tile, trackbit, flags); + if (ret.Succeeded()) ret = EnsureNoTrainOnTrack(tile, track); ret.SetGlobalErrorMessage(); if (ret.Failed()) return ret; - if (!EnsureNoTrainOnTrack(tile, track)) return CMD_ERROR; - ret = CheckRailSlope(tileh, trackbit, GetTrackBits(tile), tile); if (ret.Failed()) return ret; cost.AddCost(ret); @@ -542,11 +539,11 @@ CommandCost CmdRemoveSingleRail(TileIndex tile, DoCommandFlag flags, uint32 p1, case MP_RAILWAY: { TrackBits present; - if (!IsPlainRail(tile) || - (_current_company != OWNER_WATER && !CheckTileOwnership(tile)) || - !EnsureNoTrainOnTrack(tile, track)) { - return CMD_ERROR; - } + if (!IsPlainRail(tile) || (_current_company != OWNER_WATER && !CheckTileOwnership(tile))) return CMD_ERROR; + + CommandCost ret = EnsureNoTrainOnTrack(tile, track); + ret.SetGlobalErrorMessage(); + if (ret.Failed()) return ret; present = GetTrackBits(tile); if ((present & trackbit) == 0) return CMD_ERROR; @@ -899,9 +896,12 @@ CommandCost CmdBuildSingleSignal(TileIndex tile, DoCommandFlag flags, uint32 p1, /* You can only build signals on plain rail tiles, and the selected track must exist */ if (!ValParamTrackOrientation(track) || !IsPlainRailTile(tile) || - !HasTrack(tile, track) || !EnsureNoTrainOnTrack(tile, track)) { + !HasTrack(tile, track)) { return CMD_ERROR; } + CommandCost ret = EnsureNoTrainOnTrack(tile, track); + ret.SetGlobalErrorMessage(); + if (ret.Failed()) return ret; /* Protect against invalid signal copying */ if (p2 != 0 && (p2 & SignalOnTrack(track)) == 0) return CMD_ERROR; @@ -1257,10 +1257,12 @@ CommandCost CmdRemoveSingleSignal(TileIndex tile, DoCommandFlag flags, uint32 p1 if (!ValParamTrackOrientation(track) || !IsPlainRailTile(tile) || !HasTrack(tile, track) || - !EnsureNoTrainOnTrack(tile, track) || !HasSignalOnTrack(tile, track)) { return CMD_ERROR; } + CommandCost ret = EnsureNoTrainOnTrack(tile, track); + ret.SetGlobalErrorMessage(); + if (ret.Failed()) return ret; /* Only water can remove signals from anyone */ if (_current_company != OWNER_WATER && !CheckTileOwnership(tile)) return CMD_ERROR; |