|
@@ -36,25 +36,25 @@ static uint CountRoadBits(RoadBits r)
|
|
|
|
|
|
|
|
|
static bool CheckAllowRemoveRoad(TileIndex tile, RoadBits remove, bool* edge_road)
|
|
|
{
|
|
|
RoadBits present;
|
|
|
RoadBits n;
|
|
|
Owner owner;
|
|
|
*edge_road = true;
|
|
|
|
|
|
if (_game_mode == GM_EDITOR) return true;
|
|
|
|
|
|
// Only do the special processing for actual players.
|
|
|
if (_current_player >= MAX_PLAYERS) return true;
|
|
|
if (!IsValidPlayer(_current_player)) return true;
|
|
|
|
|
|
owner = IsLevelCrossingTile(tile) ? GetCrossingRoadOwner(tile) : GetTileOwner(tile);
|
|
|
|
|
|
// Only do the special processing if the road is owned
|
|
|
// by a town
|
|
|
if (owner != OWNER_TOWN) return (owner == OWNER_NONE) || CheckOwnership(owner);
|
|
|
|
|
|
if (_cheats.magic_bulldozer.value) return true;
|
|
|
|
|
|
// Get a bitmask of which neighbouring roads has a tile
|
|
|
n = 0;
|
|
|
present = GetAnyRoadBits(tile);
|
|
@@ -280,25 +280,25 @@ static uint32 CheckRoadSlope(Slope tileh
|
|
|
int32 CmdBuildRoad(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
|
|
|
{
|
|
|
int32 cost = 0;
|
|
|
int32 ret;
|
|
|
RoadBits existing = 0;
|
|
|
RoadBits pieces;
|
|
|
Slope tileh;
|
|
|
|
|
|
SET_EXPENSES_TYPE(EXPENSES_CONSTRUCTION);
|
|
|
|
|
|
/* Road pieces are max 4 bitset values (NE, NW, SE, SW) and town can only be non-zero
|
|
|
* if a non-player is building the road */
|
|
|
if ((p1 >> 4) || (_current_player < MAX_PLAYERS && p2 != 0) || !IsValidTownID(p2)) return CMD_ERROR;
|
|
|
if ((p1 >> 4) || (IsValidPlayer(_current_player) && p2 != 0) || !IsValidTownID(p2)) return CMD_ERROR;
|
|
|
pieces = p1;
|
|
|
|
|
|
tileh = GetTileSlope(tile, NULL);
|
|
|
|
|
|
switch (GetTileType(tile)) {
|
|
|
case MP_STREET:
|
|
|
switch (GetRoadTileType(tile)) {
|
|
|
case ROAD_TILE_NORMAL:
|
|
|
if (HasRoadWorks(tile)) return_cmd_error(STR_ROAD_WORKS_IN_PROGRESS);
|
|
|
|
|
|
existing = GetRoadBits(tile);
|
|
|
if ((existing & pieces) == pieces) {
|