mirror of https://github.com/OpenTTD/OpenTTD
(svn r2154) - Fix: [NPF] Vehicles should no longer try to drive through the back of depots and road stations.
- Add: GetDepotDirection() wrapper function. - Fix: [NPF] Ships can now actually reach buoys.release/0.4.5
parent
dfe6c34bf1
commit
92fe22382a
26
depot.h
26
depot.h
|
@ -71,6 +71,32 @@ static inline bool IsTileDepotType(TileIndex tile, TransportType type)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the direction the exit of the depot on the given tile is facing.
|
||||||
|
*/
|
||||||
|
static inline uint GetDepotDirection(TileIndex tile, TransportType type)
|
||||||
|
{
|
||||||
|
assert(IsTileDepotType(tile, type));
|
||||||
|
|
||||||
|
switch (type)
|
||||||
|
{
|
||||||
|
case TRANSPORT_RAIL:
|
||||||
|
case TRANSPORT_ROAD:
|
||||||
|
/* Rail and road store a diagonal direction in bits 0 and 1 */
|
||||||
|
return _map5[tile] & 3;
|
||||||
|
case TRANSPORT_WATER:
|
||||||
|
/* Water is stubborn, it stores the directions in a different order. */
|
||||||
|
switch (_map5[tile] & 3) {
|
||||||
|
case 0: return 0;
|
||||||
|
case 1: return 2;
|
||||||
|
case 2: return 3;
|
||||||
|
case 3: return 1;
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
return 0; /* Not reached */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
Depot *GetDepotByTile(uint tile);
|
Depot *GetDepotByTile(uint tile);
|
||||||
void InitializeDepot(void);
|
void InitializeDepot(void);
|
||||||
Depot *AllocateDepot(void);
|
Depot *AllocateDepot(void);
|
||||||
|
|
19
npf.c
19
npf.c
|
@ -493,7 +493,7 @@ void NPFFollowTrack(AyStar* aystar, OpenListNode* current) {
|
||||||
flotr = FindLengthOfTunnel(src_tile, src_exitdir);
|
flotr = FindLengthOfTunnel(src_tile, src_exitdir);
|
||||||
dst_tile = flotr.tile;
|
dst_tile = flotr.tile;
|
||||||
} else {
|
} else {
|
||||||
if (IsTileDepotType(src_tile, type)){
|
if (type != TRANSPORT_WATER && (IsRoadStationTile(src_tile) || IsTileDepotType(src_tile, type))){
|
||||||
/* This is a road station or a train or road depot. We can enter and exit
|
/* This is a road station or a train or road depot. We can enter and exit
|
||||||
* those from one side only. Trackdirs don't support that (yet), so we'll
|
* those from one side only. Trackdirs don't support that (yet), so we'll
|
||||||
* do this here. */
|
* do this here. */
|
||||||
|
@ -503,7 +503,7 @@ void NPFFollowTrack(AyStar* aystar, OpenListNode* current) {
|
||||||
if (IsRoadStationTile(src_tile))
|
if (IsRoadStationTile(src_tile))
|
||||||
exitdir = GetRoadStationDir(src_tile);
|
exitdir = GetRoadStationDir(src_tile);
|
||||||
else /* Train or road depot. Direction is stored the same for both, in map5 */
|
else /* Train or road depot. Direction is stored the same for both, in map5 */
|
||||||
exitdir = _map5[src_tile] & 3; /* Extract the direction from the map */
|
exitdir = GetDepotDirection(src_tile, type);
|
||||||
|
|
||||||
/* Let's see if were headed the right way */
|
/* Let's see if were headed the right way */
|
||||||
if (src_trackdir != _dir_to_diag_trackdir[exitdir])
|
if (src_trackdir != _dir_to_diag_trackdir[exitdir])
|
||||||
|
@ -529,9 +529,10 @@ void NPFFollowTrack(AyStar* aystar, OpenListNode* current) {
|
||||||
|
|
||||||
/* Check the owner of the tile */
|
/* Check the owner of the tile */
|
||||||
if (
|
if (
|
||||||
IsTileType(dst_tile, MP_RAILWAY) /* Rail tile */
|
IsTileType(dst_tile, MP_RAILWAY) /* Rail tile (also rail depot) */
|
||||||
|
|| IsTrainStationTile(dst_tile) /* Rail station tile */
|
||||||
|| IsTileDepotType(dst_tile, TRANSPORT_ROAD) /* Road depot tile */
|
|| IsTileDepotType(dst_tile, TRANSPORT_ROAD) /* Road depot tile */
|
||||||
|| IsTileType(dst_tile, MP_STATION) /* Station tile */
|
|| IsRoadStationTile(dst_tile) /* Road station tile */
|
||||||
|| IsTileDepotType(dst_tile, TRANSPORT_WATER) /* Water depot tile */
|
|| IsTileDepotType(dst_tile, TRANSPORT_WATER) /* Water depot tile */
|
||||||
) /* TODO: Crossings, tunnels and bridges are "public" now */
|
) /* TODO: Crossings, tunnels and bridges are "public" now */
|
||||||
/* The above cases are "private" tiles, we need to check the owner */
|
/* The above cases are "private" tiles, we need to check the owner */
|
||||||
|
@ -545,10 +546,12 @@ void NPFFollowTrack(AyStar* aystar, OpenListNode* current) {
|
||||||
if (IsRoadStationTile(dst_tile))
|
if (IsRoadStationTile(dst_tile))
|
||||||
exitdir = GetRoadStationDir(dst_tile);
|
exitdir = GetRoadStationDir(dst_tile);
|
||||||
else /* Road depot */
|
else /* Road depot */
|
||||||
/* Find the trackdirs that are available for a depot with this orientation. They are in both directions */
|
exitdir = GetDepotDirection(dst_tile, type);
|
||||||
exitdir = _map5[dst_tile] & 3; /* Extract the direction from the map */
|
/* Find the trackdirs that are available for a depot or station with this
|
||||||
ts = (1 << _dir_to_diag_trackdir[exitdir])
|
* orientation. They are only "inwards", since we are reaching this tile
|
||||||
| (1 << _dir_to_diag_trackdir[_reverse_dir[exitdir]]);
|
* from some other tile. This prevents vehicles driving into depots from
|
||||||
|
* the back */
|
||||||
|
ts = (1 << _dir_to_diag_trackdir[exitdir]);
|
||||||
} else {
|
} else {
|
||||||
ts = GetTileTrackStatus(dst_tile, type);
|
ts = GetTileTrackStatus(dst_tile, type);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue