summaryrefslogtreecommitdiff
path: root/src/rail_cmd.cpp
diff options
context:
space:
mode:
authorpeter1138 <peter1138@openttd.org>2019-04-06 07:46:15 +0100
committerMichael Lutz <michi@icosahedron.de>2019-05-01 21:36:27 +0200
commitc02ef3e4564b7b54d49f0827d2d7625cbc38f335 (patch)
tree1c0ee62b6ce55124b247daaafa42300bfaa932e7 /src/rail_cmd.cpp
parent21edf67f89c60351d5a0d84625455aa296b6b950 (diff)
downloadopenttd-c02ef3e4564b7b54d49f0827d2d7625cbc38f335.tar.xz
Feature: Add NotRoadTypes (NRT)
Diffstat (limited to 'src/rail_cmd.cpp')
-rw-r--r--src/rail_cmd.cpp44
1 files changed, 26 insertions, 18 deletions
diff --git a/src/rail_cmd.cpp b/src/rail_cmd.cpp
index 0804a4d14..ab87fc40f 100644
--- a/src/rail_cmd.cpp
+++ b/src/rail_cmd.cpp
@@ -512,41 +512,48 @@ CommandCost CmdBuildSingleRail(TileIndex tile, DoCommandFlag flags, uint32 p1, u
if (GetDisallowedRoadDirections(tile) != DRD_NONE) return_cmd_error(STR_ERROR_CROSSING_ON_ONEWAY_ROAD);
- if (RailNoLevelCrossings(railtype)) return_cmd_error(STR_ERROR_CROSSING_DISALLOWED);
+ if (RailNoLevelCrossings(railtype)) return_cmd_error(STR_ERROR_CROSSING_DISALLOWED_RAIL);
- RoadTypes roadtypes = GetRoadTypes(tile);
- RoadBits road = GetRoadBits(tile, ROADTYPE_ROAD);
- RoadBits tram = GetRoadBits(tile, ROADTYPE_TRAM);
+ RoadType roadtype_road = GetRoadTypeRoad(tile);
+ RoadType roadtype_tram = GetRoadTypeTram(tile);
+
+ if (roadtype_road != INVALID_ROADTYPE && RoadNoLevelCrossing(roadtype_road)) return_cmd_error(STR_ERROR_CROSSING_DISALLOWED_ROAD);
+ if (roadtype_tram != INVALID_ROADTYPE && RoadNoLevelCrossing(roadtype_tram)) return_cmd_error(STR_ERROR_CROSSING_DISALLOWED_ROAD);
+
+ RoadBits road = GetRoadBits(tile, RTT_ROAD);
+ RoadBits tram = GetRoadBits(tile, RTT_TRAM);
if ((track == TRACK_X && ((road | tram) & ROAD_X) == 0) ||
(track == TRACK_Y && ((road | tram) & ROAD_Y) == 0)) {
- Owner road_owner = GetRoadOwner(tile, ROADTYPE_ROAD);
- Owner tram_owner = GetRoadOwner(tile, ROADTYPE_TRAM);
+ Owner road_owner = GetRoadOwner(tile, RTT_ROAD);
+ Owner tram_owner = GetRoadOwner(tile, RTT_TRAM);
/* Disallow breaking end-of-line of someone else
* so trams can still reverse on this tile. */
if (Company::IsValidID(tram_owner) && HasExactlyOneBit(tram)) {
CommandCost ret = CheckOwnership(tram_owner);
if (ret.Failed()) return ret;
}
- /* Crossings must always have a road... */
- uint num_new_road_pieces = 2 - CountBits(road);
- if (road == ROAD_NONE) road_owner = _current_company;
- roadtypes |= ROADTYPES_ROAD;
- /* ...but tram is not required. */
- uint num_new_tram_pieces = (tram != ROAD_NONE) ? 2 - CountBits(tram) : 0;
- cost.AddCost((num_new_road_pieces + num_new_tram_pieces) * _price[PR_BUILD_ROAD]);
+ uint num_new_road_pieces = (road != ROAD_NONE) ? 2 - CountBits(road) : 0;
+ if (num_new_road_pieces > 0) {
+ cost.AddCost(num_new_road_pieces * RoadBuildCost(roadtype_road));
+ }
+
+ uint num_new_tram_pieces = (tram != ROAD_NONE) ? 2 - CountBits(tram) : 0;
+ if (num_new_tram_pieces > 0) {
+ cost.AddCost(num_new_tram_pieces * RoadBuildCost(roadtype_tram));
+ }
if (flags & DC_EXEC) {
- MakeRoadCrossing(tile, road_owner, tram_owner, _current_company, (track == TRACK_X ? AXIS_Y : AXIS_X), railtype, roadtypes, GetTownIndex(tile));
+ MakeRoadCrossing(tile, road_owner, tram_owner, _current_company, (track == TRACK_X ? AXIS_Y : AXIS_X), railtype, roadtype_road, roadtype_tram, GetTownIndex(tile));
UpdateLevelCrossing(tile, false);
Company::Get(_current_company)->infrastructure.rail[railtype] += LEVELCROSSING_TRACKBIT_FACTOR;
DirtyCompanyInfrastructureWindows(_current_company);
if (num_new_road_pieces > 0 && Company::IsValidID(road_owner)) {
- Company::Get(road_owner)->infrastructure.road[ROADTYPE_ROAD] += num_new_road_pieces;
+ Company::Get(road_owner)->infrastructure.road[roadtype_road] += num_new_road_pieces;
DirtyCompanyInfrastructureWindows(road_owner);
}
if (num_new_tram_pieces > 0 && Company::IsValidID(tram_owner)) {
- Company::Get(tram_owner)->infrastructure.road[ROADTYPE_TRAM] += num_new_tram_pieces;
+ Company::Get(tram_owner)->infrastructure.road[roadtype_tram] += num_new_tram_pieces;
DirtyCompanyInfrastructureWindows(tram_owner);
}
}
@@ -644,10 +651,11 @@ CommandCost CmdRemoveSingleRail(TileIndex tile, DoCommandFlag flags, uint32 p1,
v = GetTrainForReservation(tile, track);
if (v != nullptr) FreeTrainTrackReservation(v);
}
+
owner = GetTileOwner(tile);
Company::Get(owner)->infrastructure.rail[GetRailType(tile)] -= LEVELCROSSING_TRACKBIT_FACTOR;
DirtyCompanyInfrastructureWindows(owner);
- MakeRoadNormal(tile, GetCrossingRoadBits(tile), GetRoadTypes(tile), GetTownIndex(tile), GetRoadOwner(tile, ROADTYPE_ROAD), GetRoadOwner(tile, ROADTYPE_TRAM));
+ MakeRoadNormal(tile, GetCrossingRoadBits(tile), GetRoadTypeRoad(tile), GetRoadTypeTram(tile), GetTownIndex(tile), GetRoadOwner(tile, RTT_ROAD), GetRoadOwner(tile, RTT_TRAM));
DeleteNewGRFInspectWindow(GSF_RAILTYPES, tile);
}
break;
@@ -1579,7 +1587,7 @@ CommandCost CmdConvertRail(TileIndex tile, DoCommandFlag flags, uint32 p1, uint3
case MP_ROAD:
if (!IsLevelCrossing(tile)) continue;
if (RailNoLevelCrossings(totype)) {
- error.MakeError(STR_ERROR_CROSSING_DISALLOWED);
+ error.MakeError(STR_ERROR_CROSSING_DISALLOWED_RAIL);
continue;
}
break;