diff options
Diffstat (limited to 'src/rail_cmd.cpp')
-rw-r--r-- | src/rail_cmd.cpp | 26 |
1 files changed, 20 insertions, 6 deletions
diff --git a/src/rail_cmd.cpp b/src/rail_cmd.cpp index 34ad07d52..8af7871fc 100644 --- a/src/rail_cmd.cpp +++ b/src/rail_cmd.cpp @@ -262,10 +262,6 @@ static CommandCost CheckTrackCombination(TileIndex tile, TrackBits to_build, uin return_cmd_error(STR_ERROR_ALREADY_BUILT); } - /* Let's see if we may build this */ - if (HasSignals(tile) && future != TRACK_BIT_HORZ && future != TRACK_BIT_VERT) { - return_cmd_error(STR_ERROR_MUST_REMOVE_SIGNALS_FIRST); - } /* Normally, we may overlap and any combination is valid */ return CommandCost(); } @@ -432,7 +428,9 @@ static inline bool ValParamTrackOrientation(Track track) * @param tile tile to build on * @param flags operation to perform * @param p1 railtype of being built piece (normal, mono, maglev) - * @param p2 rail track to build + * @param p2 various bitstuffed elements + * - (bit 0- 2) - track-orientation, valid values: 0-5 (@see Track) + * - (bit 3) - 0 = error on signal in the way, 1 = auto remove signals when in the way * @param text unused * @return the cost of this operation or an error */ @@ -440,6 +438,7 @@ CommandCost CmdBuildSingleRail(TileIndex tile, DoCommandFlag flags, uint32 p1, u { RailType railtype = Extract<RailType, 0, 6>(p1); Track track = Extract<Track, 0, 3>(p2); + bool auto_remove_signals = HasBit(p2, 3); CommandCost cost(EXPENSES_CONSTRUCTION); if (!ValParamRailtype(railtype) || !ValParamTrackOrientation(track)) return CMD_ERROR; @@ -460,6 +459,19 @@ CommandCost CmdBuildSingleRail(TileIndex tile, DoCommandFlag flags, uint32 p1, u if (ret.Succeeded()) ret = EnsureNoTrainOnTrack(tile, track); if (ret.Failed()) return ret; + if (HasSignals(tile) && TracksOverlap(GetTrackBits(tile) | TrackToTrackBits(track))) { + /* If adding the new track causes any overlap, all signals must be removed first */ + if (!auto_remove_signals) return_cmd_error(STR_ERROR_MUST_REMOVE_SIGNALS_FIRST); + + for (Track track_it = TRACK_BEGIN; track_it < TRACK_END; track_it++) { + if (HasTrack(tile, track_it) && HasSignalOnTrack(tile, track_it)) { + CommandCost ret_remove_signals = DoCommand(tile, track_it, 0, flags, CMD_REMOVE_SIGNALS); + if (ret_remove_signals.Failed()) return ret_remove_signals; + cost.AddCost(ret_remove_signals); + } + } + } + ret = CheckRailSlope(tileh, trackbit, GetTrackBits(tile), tile); if (ret.Failed()) return ret; cost.AddCost(ret); @@ -868,6 +880,7 @@ static CommandCost ValidateAutoDrag(Trackdir *trackdir, TileIndex start, TileInd * - p2 = (bit 6-8) - track-orientation, valid values: 0-5 (Track enum) * - p2 = (bit 9) - 0 = build, 1 = remove tracks * - p2 = (bit 10) - 0 = build up to an obstacle, 1 = fail if an obstacle is found (used for AIs). + * - p2 = (bit 11) - 0 = error on signal in the way, 1 = auto remove signals when in the way * @param text unused * @return the cost of this operation or an error */ @@ -876,6 +889,7 @@ static CommandCost CmdRailTrackHelper(TileIndex tile, DoCommandFlag flags, uint3 CommandCost total_cost(EXPENSES_CONSTRUCTION); Track track = Extract<Track, 6, 3>(p2); bool remove = HasBit(p2, 9); + bool auto_remove_signals = HasBit(p2, 11); RailType railtype = Extract<RailType, 0, 6>(p2); if ((!remove && !ValParamRailtype(railtype)) || !ValParamTrackOrientation(track)) return CMD_ERROR; @@ -889,7 +903,7 @@ static CommandCost CmdRailTrackHelper(TileIndex tile, DoCommandFlag flags, uint3 bool had_success = false; CommandCost last_error = CMD_ERROR; for (;;) { - CommandCost ret = DoCommand(tile, remove ? 0 : railtype, TrackdirToTrack(trackdir), flags, remove ? CMD_REMOVE_SINGLE_RAIL : CMD_BUILD_SINGLE_RAIL); + CommandCost ret = DoCommand(tile, remove ? 0 : railtype, TrackdirToTrack(trackdir) | (auto_remove_signals << 3), flags, remove ? CMD_REMOVE_SINGLE_RAIL : CMD_BUILD_SINGLE_RAIL); if (ret.Failed()) { last_error = ret; |