mirror of https://github.com/OpenTTD/OpenTTD.git
Codechange: Restrict docking points of docks.
This commit is contained in:
parent
f538179878
commit
ec2656ab7e
|
@ -612,7 +612,7 @@ bool IsShipDestinationTile(TileIndex tile, StationID station)
|
|||
for (DiagDirection d = DIAGDIR_BEGIN; d != DIAGDIR_END; d++) {
|
||||
TileIndex t = tile + TileOffsByDiagDir(d);
|
||||
if (!IsValidTile(t)) continue;
|
||||
if (IsDockTile(t) && GetStationIndex(t) == station) return true;
|
||||
if (IsDockTile(t) && GetStationIndex(t) == station && IsValidDockingDirectionForDock(t, d)) return true;
|
||||
if (IsTileType(t, MP_INDUSTRY)) {
|
||||
const Industry *i = Industry::GetByTile(t);
|
||||
if (i->neutral_station != nullptr && i->neutral_station->index == station) return true;
|
||||
|
|
|
@ -2631,6 +2631,28 @@ void ClearDockingTilesCheckingNeighbours(TileIndex tile)
|
|||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if a dock tile can be docked from the given direction.
|
||||
* @param t Tile index of dock.
|
||||
* @param d DiagDirection adjacent to dock being tested.
|
||||
* @return True iff the dock can be docked from the given direction.
|
||||
*/
|
||||
bool IsValidDockingDirectionForDock(TileIndex t, DiagDirection d)
|
||||
{
|
||||
assert(IsDockTile(t));
|
||||
|
||||
/** Bitmap of valid directions for each dock tile part. */
|
||||
static const uint8 _valid_docking_tile[] = {
|
||||
0, 0, 0, 0, // No docking against the slope part.
|
||||
1 << DIAGDIR_NE | 1 << DIAGDIR_SW, // Docking permitted at the end
|
||||
1 << DIAGDIR_NW | 1 << DIAGDIR_SE, // of the flat piers.
|
||||
};
|
||||
|
||||
StationGfx gfx = GetStationGfx(t);
|
||||
assert(gfx < lengthof(_valid_docking_tile));
|
||||
return HasBit(_valid_docking_tile[gfx], d);
|
||||
}
|
||||
|
||||
/**
|
||||
* Find the part of a dock that is land-based
|
||||
* @param t Dock tile to find land part of
|
||||
|
|
|
@ -43,6 +43,7 @@ void DeleteOilRig(TileIndex t);
|
|||
void UpdateStationDockingTiles(Station *st);
|
||||
void RemoveDockingTile(TileIndex t);
|
||||
void ClearDockingTilesCheckingNeighbours(TileIndex tile);
|
||||
bool IsValidDockingDirectionForDock(TileIndex t, DiagDirection d);
|
||||
|
||||
/* Check if a rail station tile is traversable. */
|
||||
bool IsStationTileBlocked(TileIndex tile);
|
||||
|
|
|
@ -187,7 +187,7 @@ void CheckForDockingTile(TileIndex t)
|
|||
TileIndex tile = t + TileOffsByDiagDir(d);
|
||||
if (!IsValidTile(tile)) continue;
|
||||
|
||||
if (IsDockTile(tile)) {
|
||||
if (IsDockTile(tile) && IsValidDockingDirectionForDock(tile, d)) {
|
||||
Station::GetByTile(tile)->docking_station.Add(t);
|
||||
SetDockingTile(t, true);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue