# HG changeset patch # User celestar # Date 2007-03-24 09:12:03 # Node ID b0a38d4167ad5d53fe1197aa30ea88b979e11155 # Parent 1e9e4464ad4cdc08612c4e3bc011be05e912f353 (svn r9425) -Codechange/Fix (FS#689): Housekeeping in the convert rail functions: Changed the order of error checks to generate more meaningful error messages, added some doxygen comments and replaced bitshifting by proper mathematical operations diff --git a/src/rail_cmd.cpp b/src/rail_cmd.cpp --- a/src/rail_cmd.cpp +++ b/src/rail_cmd.cpp @@ -849,14 +849,23 @@ int32 CmdRemoveSignalTrack(TileIndex til typedef int32 DoConvertRailProc(TileIndex tile, RailType totype, bool exec); +/** + * Switches the rail type. + * Railtypes are stored on a per-tile basis, not on a per-track basis, so + * all the tracks in the given tile will be converted. + * @param tile The tile on which the railtype is to be convert. + * @param totype The railtype we want to convert to + * @param exec Switches between test and execute mode + * @return The cost and state of the operation + * @retval CMD_ERROR An error occured during the operation. + */ static int32 DoConvertRail(TileIndex tile, RailType totype, bool exec) { if (!CheckTileOwnership(tile)) return CMD_ERROR; - if (!EnsureNoVehicle(tile) && (!IsCompatibleRail(GetRailType(tile), totype) || IsPlainRailTile(tile))) return CMD_ERROR; + if (GetRailType(tile) == totype) return CMD_ERROR; - // tile is already of requested type? - if (GetRailType(tile) == totype) return CMD_ERROR; + if (!EnsureNoVehicle(tile) && (!IsCompatibleRail(GetRailType(tile), totype) || IsPlainRailTile(tile))) return CMD_ERROR; // 'hidden' elrails can't be downgraded to normal rail when elrails are disabled if (_patches.disable_elrails && totype == RAILTYPE_RAIL && GetRailType(tile) == RAILTYPE_ELECTRIC) return CMD_ERROR; diff --git a/src/road_cmd.cpp b/src/road_cmd.cpp --- a/src/road_cmd.cpp +++ b/src/road_cmd.cpp @@ -367,6 +367,14 @@ do_clear:; return cost; } +/** + * Switches the rail type on a level crossing. + * @param tile The tile on which the railtype is to be convert. + * @param totype The railtype we want to convert to + * @param exec Switches between test and execute mode + * @return The cost and state of the operation + * @retval CMD_ERROR An error occured during the operation. + */ int32 DoConvertStreetRail(TileIndex tile, RailType totype, bool exec) { // not a railroad crossing? @@ -386,7 +394,7 @@ int32 DoConvertStreetRail(TileIndex tile YapfNotifyTrackLayoutChange(tile, FindFirstTrack(GetCrossingRailBits(tile))); } - return _price.build_rail >> 1; + return _price.build_rail / 2; } diff --git a/src/station_cmd.cpp b/src/station_cmd.cpp --- a/src/station_cmd.cpp +++ b/src/station_cmd.cpp @@ -1120,6 +1120,14 @@ static int32 RemoveRailroadStation(Stati return cost; } +/** + * Switches the rail type at a railway station tile. + * @param tile The tile on which the railtype is to be convert. + * @param totype The railtype we want to convert to + * @param exec Switches between test and execute mode + * @return The cost and state of the operation + * @retval CMD_ERROR An error occured during the operation. + */ int32 DoConvertStationRail(TileIndex tile, RailType totype, bool exec) { const Station* st = GetStationByTile(tile); @@ -1140,7 +1148,7 @@ int32 DoConvertStationRail(TileIndex til YapfNotifyTrackLayoutChange(tile, GetRailStationTrack(tile)); } - return _price.build_rail >> 1; + return _price.build_rail / 2; } /** diff --git a/src/tunnelbridge_cmd.cpp b/src/tunnelbridge_cmd.cpp --- a/src/tunnelbridge_cmd.cpp +++ b/src/tunnelbridge_cmd.cpp @@ -696,6 +696,16 @@ static int32 ClearTile_TunnelBridge(Tile return CMD_ERROR; } +/** + * Switches the rail type for a tunnel or a bridgehead. As the railtype + * on the bridge are determined by the one of the bridgehead, this + * functions converts the railtype on the entire bridge. + * @param tile The tile on which the railtype is to be convert. + * @param totype The railtype we want to convert to + * @param exec Switches between test and execute mode + * @return The cost and state of the operation + * @retval CMD_ERROR An error occured during the operation. + */ int32 DoConvertTunnelBridgeRail(TileIndex tile, RailType totype, bool exec) { TileIndex endtile; @@ -724,7 +734,7 @@ int32 DoConvertTunnelBridgeRail(TileInde YapfNotifyTrackLayoutChange(tile, track); YapfNotifyTrackLayoutChange(endtile, track); } - return (length + 1) * (_price.build_rail >> 1); + return (length + 1) * (_price.build_rail / 2); } else if (IsBridge(tile) && GetBridgeTransportType(tile) == TRANSPORT_RAIL) { if (!CheckTileOwnership(tile)) return CMD_ERROR; @@ -758,7 +768,7 @@ int32 DoConvertTunnelBridgeRail(TileInde } } - return (DistanceManhattan(tile, endtile) + 1) * (_price.build_rail >> 1); + return (DistanceManhattan(tile, endtile) + 1) * (_price.build_rail / 2); } else { return CMD_ERROR; }