diff --git a/water_cmd.c b/water_cmd.c --- a/water_cmd.c +++ b/water_cmd.c @@ -148,7 +148,7 @@ static int32 DoBuildShiplift(TileIndex t } if (flags & DC_EXEC) { - MakeLock(tile, dir); + MakeLock(tile, _current_player, dir); MarkTileDirtyByTile(tile); MarkTileDirtyByTile(tile - delta); MarkTileDirtyByTile(tile + delta); @@ -161,6 +161,8 @@ static int32 RemoveShiplift(TileIndex ti { TileIndexDiff delta = TileOffsByDir(GetLockDirection(tile)); + if (!CheckTileOwnership(tile)) return CMD_ERROR; + // make sure no vehicle is on the tile. if (!EnsureNoVehicle(tile) || !EnsureNoVehicle(tile + delta) || !EnsureNoVehicle(tile - delta)) return CMD_ERROR; @@ -249,7 +251,11 @@ int32 CmdBuildCanal(TileIndex tile, uint cost += ret; if (flags & DC_EXEC) { - MakeWater(tile); + if (TileHeight(tile) == 0) { + MakeWater(tile); + } else { + MakeCanal(tile, _current_player); + } MarkTileDirtyByTile(tile); MarkTilesAroundDirty(tile); } @@ -279,6 +285,8 @@ static int32 ClearTile_Water(TileIndex t return_cmd_error(STR_0002_TOO_CLOSE_TO_EDGE_OF_MAP); } + if (GetTileOwner(tile) != OWNER_WATER && !CheckTileOwnership(tile)) return CMD_ERROR; + if (flags & DC_EXEC) DoClearSquare(tile); return _price.clear_water; diff --git a/water_map.h b/water_map.h --- a/water_map.h +++ b/water_map.h @@ -95,6 +95,16 @@ static inline void MakeShore(TileIndex t _m[t].m5 = 1; } +static inline void MakeCanal(TileIndex t, Owner o) +{ + SetTileType(t, MP_WATER); + SetTileOwner(t, o); + _m[t].m2 = 0; + _m[t].m3 = 0; + _m[t].m4 = 0; + _m[t].m5 = 0; +} + static inline void MakeShipDepot(TileIndex t, Owner o, DepotPart base, Axis a) { SetTileType(t, MP_WATER); @@ -105,23 +115,23 @@ static inline void MakeShipDepot(TileInd _m[t].m5 = base + a * 2; } -static inline void MakeLockTile(TileIndex t, byte section) +static inline void MakeLockTile(TileIndex t, Owner o, byte section) { SetTileType(t, MP_WATER); - SetTileOwner(t, OWNER_WATER); + SetTileOwner(t, o); _m[t].m2 = 0; _m[t].m3 = 0; _m[t].m4 = 0; _m[t].m5 = section; } -static inline void MakeLock(TileIndex t, DiagDirection d) +static inline void MakeLock(TileIndex t, Owner o, DiagDirection d) { TileIndexDiff delta = TileOffsByDir(d); - MakeLockTile(t, LOCK_MIDDLE + d); - MakeLockTile(t - delta, LOCK_LOWER + d); - MakeLockTile(t + delta, LOCK_UPPER + d); + MakeLockTile(t, o, LOCK_MIDDLE + d); + MakeLockTile(t - delta, o, LOCK_LOWER + d); + MakeLockTile(t + delta, o, LOCK_UPPER + d); } #endif