| Old revision #pgbublr1a | New revision #pxwa9eode | ||
|---|---|---|---|
| 1 | FindDepotData OPFShipFindNearestDepot(const Ship *v, int max_distance) | 1 | FindDepotData OPFShipFindNearestDepot(const Ship *v, int max_distance) |
| 2 | { | 2 | { |
| 3 | TileIndex tile = v->tile; | 3 | FindDepotData fdd; |
| 4 | |||
| 4 | Trackdir trackdir = v->GetVehicleTrackdir(); | 5 | Trackdir trackdir = v->GetVehicleTrackdir(); |
| 5 | DiagDirection enterdir = TrackdirToExitdir(trackdir); | 6 | |
| 7 | /* Argument values for FindShipTrack below, for the current ship direction */ | ||
| 8 | DiagDirection enterdir = TrackdirToExitdir(trackdir); | ||
| 9 | TileIndex tile = TILE_ADD(v->tile, TileOffsByDiagDir(enterdir)); | ||
| 6 | TrackBits tracks = TrackdirBitsToTrackBits(DiagdirReachesTrackdirs(enterdir)); | 10 | TrackBits tracks = TrackdirBitsToTrackBits(DiagdirReachesTrackdirs(enterdir)); |
| 7 | 11 | ||
| 8 | TileIndex tile_rev = TILE_ADD(tile, -TileOffsByDiagDir(enterdir)); | 12 | /* Argument values for FindShipTrack below, for the reversed ship direction */ |
| 9 | TrackBits tracks_rev = TrackStatusToTrackBits(GetTileTrackStatus(tile_rev, TRANSPORT_WATER, 0)) & DiagdirReachesTracks(ReverseDiagDir(enterdir)) & TrackdirBitsToTrackBits(TrackdirToTrackdirBits(trackdir)); | 13 | DiagDirection enterdir_rev = ReverseDiagDir(enterdir); |
| 14 | TileIndex tile_rev = v->tile; | ||
| 15 | TrackBits tracks_rev = TrackStatusToTrackBits(GetTileTrackStatus(tile_rev, TRANSPORT_WATER, 0)) & DiagdirReachesTracks(enterdir_rev) & TrackdirBitsToTrackBits(TrackdirToTrackdirBits(trackdir)); | ||
| 10 | 16 | ||
| 11 | FindDepotData fdd; | 17 | Track track; // initialized, but unused |
| 18 | |||
| 19 | if (max_distance == 0) max_distance = INT_MAX; | ||
| 20 | uint best_length = UINT_MAX; | ||
| 21 | |||
| 12 | Depot *depot; | 22 | Depot *depot; |
| 13 | |||
| 14 | |||
| 15 | |||
| 16 | FOR_ALL_DEPOTS(depot) { | 23 | FOR_ALL_DEPOTS(depot) { |
| 17 | TileIndex depottile = depot->xy; | 24 | TileIndex depottile = depot->xy; |
| 18 | if (IsShipDepotTile(depottile) && IsTileOwner(depottile, v->owner)) { | 25 | if (IsShipDepotTile(depottile) && IsTileOwner(depottile, v->owner)) { |
| 26 | uint distdepot = DistanceManhattan(v->tile, depottile); | ||
| 27 | if (distdepot <= (uint)max_distance && distdepot < best_length) { | ||
| 19 | 28 | ||
| 20 | | 20 | /* Let's find the length it would be if we would reverse first */ |
| 21 | | 21 | uint length_rev = UINT_MAX; |
| 22 | | 22 | if (tracks_rev != 0) { |
| 23 | | 23 | length_rev = FindShipTrack(v, tile_rev, enterdir_rev, tracks_rev, tile, &track, depottile); // |
| 24 | | 24 | if (length_rev != UINT_MAX) length_rev++; // penalty for reversing |
| 25 | | 25 | } |
| 26 | 35 | ||
| 27 | | 27 | /* And if we would not reverse? */ |
| 28 | | 28 | uint length = FindShipTrack(v, tile, enterdir, tracks, 0, &track, depottile); |
| 29 | 38 | ||
| 30 | | 30 | /* Get the shortest length */ |
| 31 | | 31 | uint min_length = minu(length_rev, length); |
| 32 | 41 | ||
| 33 | | 33 | if (min_length < best_length) { |
| 34 | | 34 | best_length = min_length; |
| 35 | 44 | ||
| 36 | uint distdepot = DistanceManhattan(tile, depottile); | 45 | fdd.tile = depottile; // tile location of ship depot |
| 37 | fdd.best_length = distdepot; | 46 | fdd.best_length = distdepot; // distance manhattan from ship to depot |
| 38 | fdd.tile = depottile; | 47 | fdd.reverse = !(length <= length_rev); |
| 48 | } | ||
| 39 | } | 49 | } |
| 40 | } | 50 | } |
| 41 | } | 51 | } |