1
0
Fork 0

Feature: Road depots may have a road and tram type at the same time.

pull/8480/head
J0anJosep 2021-04-02 16:21:34 +02:00
parent cf955bc24b
commit 408732d25b
1 changed files with 38 additions and 8 deletions

View File

@ -524,9 +524,20 @@ static CommandCost RemoveRoad(TileIndex tile, DoCommandFlag flags, RoadBits piec
return CommandCost(EXPENSES_CONSTRUCTION, RoadClearCost(existing_rt) * 2); return CommandCost(EXPENSES_CONSTRUCTION, RoadClearCost(existing_rt) * 2);
} }
default: case ROAD_TILE_DEPOT: {
case ROAD_TILE_DEPOT: if (!HasRoadTypeRoad(tile) || !HasRoadTypeTram(tile)) return CMD_ERROR;
return CMD_ERROR; if (flags & DC_EXEC) {
Company *c = Company::GetIfValid(GetTileOwner(tile));
c->infrastructure.road[GetRoadType(tile, rtt)] -= ROAD_DEPOT_TRACKBIT_FACTOR;
DirtyCompanyInfrastructureWindows(c->index);
SetRoadType(tile, rtt, INVALID_ROADTYPE);
Depot::GetByTile(tile)->AfterAddRemove(TileArea(tile), false);
MarkTileDirtyByTile(tile);
}
return CommandCost(EXPENSES_CONSTRUCTION, _price[PR_CLEAR_DEPOT_ROAD]);
}
default: NOT_REACHED();
} }
} }
@ -712,7 +723,16 @@ CommandCost CmdBuildRoad(DoCommandFlag flags, TileIndex tile, RoadBits pieces, R
break; break;
case ROAD_TILE_DEPOT: case ROAD_TILE_DEPOT:
if ((GetAnyRoadBits(tile, rtt) & pieces) == pieces) return_cmd_error(STR_ERROR_ALREADY_BUILT); if (DiagDirToRoadBits(GetRoadDepotDirection(tile)) == pieces) {
/* Check if we can add a new road/tram type if none present. */
if (HasTileRoadType(tile, rtt)) {
return_cmd_error(STR_ERROR_ALREADY_BUILT);
}
/* We may add a new road type. */
cost.AddCost(_price[PR_BUILD_DEPOT_ROAD]);
break;
}
goto do_clear; goto do_clear;
default: NOT_REACHED(); default: NOT_REACHED();
@ -886,7 +906,12 @@ do_clear:;
switch (GetTileType(tile)) { switch (GetTileType(tile)) {
case MP_ROAD: { case MP_ROAD: {
RoadTileType rttype = GetRoadTileType(tile); RoadTileType rttype = GetRoadTileType(tile);
if (existing == ROAD_NONE || rttype == ROAD_TILE_CROSSING) { if (rttype == ROAD_TILE_DEPOT) {
SetRoadType(tile, rtt, rt);
UpdateCompanyRoadInfrastructure(rt, _current_company, ROAD_DEPOT_TRACKBIT_FACTOR);
Depot::GetByTile(tile)->AfterAddRemove(TileArea(tile), true);
break;
} else if (existing == ROAD_NONE || rttype == ROAD_TILE_CROSSING) {
SetRoadType(tile, rtt, rt); SetRoadType(tile, rtt, rt);
SetRoadOwner(tile, rtt, company); SetRoadOwner(tile, rtt, company);
if (rtt == RTT_ROAD) SetTownIndex(tile, town_id); if (rtt == RTT_ROAD) SetTownIndex(tile, town_id);
@ -1227,14 +1252,19 @@ static CommandCost RemoveRoadDepot(TileIndex tile, DoCommandFlag flags)
CommandCost ret = EnsureNoVehicleOnGround(tile); CommandCost ret = EnsureNoVehicleOnGround(tile);
if (ret.Failed()) return ret; if (ret.Failed()) return ret;
CommandCost cost(EXPENSES_CONSTRUCTION, _price[PR_CLEAR_DEPOT_ROAD]);
RoadType rt = GetRoadTypeRoad(tile);
RoadType tt = GetRoadTypeTram(tile);
if (rt != INVALID_ROADTYPE && tt != INVALID_ROADTYPE) cost.AddCost(_price[PR_CLEAR_DEPOT_ROAD]);
if (flags & DC_EXEC) { if (flags & DC_EXEC) {
Depot *depot = Depot::GetByTile(tile); Depot *depot = Depot::GetByTile(tile);
Company *c = Company::GetIfValid(depot->owner); Company *c = Company::GetIfValid(depot->owner);
if (c != nullptr) { if (c != nullptr) {
/* A road depot has two road bits. */ /* A road depot has two road bits. */
RoadType rt = GetRoadTypeRoad(tile); RoadType rt = GetRoadTypeRoad(tile);
if (rt == INVALID_ROADTYPE) rt = GetRoadTypeTram(tile); if (rt != INVALID_ROADTYPE) c->infrastructure.road[rt] -= ROAD_DEPOT_TRACKBIT_FACTOR;
c->infrastructure.road[rt] -= ROAD_DEPOT_TRACKBIT_FACTOR; if (tt != INVALID_ROADTYPE) c->infrastructure.road[tt] -= ROAD_DEPOT_TRACKBIT_FACTOR;
DirtyCompanyInfrastructureWindows(c->index); DirtyCompanyInfrastructureWindows(c->index);
} }
@ -1242,7 +1272,7 @@ static CommandCost RemoveRoadDepot(TileIndex tile, DoCommandFlag flags)
depot->AfterAddRemove(TileArea(tile), false); depot->AfterAddRemove(TileArea(tile), false);
} }
return CommandCost(EXPENSES_CONSTRUCTION, _price[PR_CLEAR_DEPOT_ROAD]); return cost;
} }
static CommandCost ClearTile_Road(TileIndex tile, DoCommandFlag flags) static CommandCost ClearTile_Road(TileIndex tile, DoCommandFlag flags)