(svn r2625) - Fix: [pbs] Store the end of a train's reserved path explicitly. Prevents trains from unreserving eachothers paths in some cases.

- CodeChange: Use the TrackdirToTrack function instead of &7, and remove an unneeded variable.
This commit is contained in:
hackykid
2005-07-17 20:09:02 +00:00
parent eabc482184
commit 1d11bbb34d
6 changed files with 56 additions and 28 deletions

24
npf.c
View File

@@ -180,27 +180,35 @@ void NPFReservePBSPath(AyStar *as)
* BUT, you have to have a pretty fucked up junction layout for this to happen,
* so we'll just stop this train, the user will eventually notice, so he can fix it.
*/
PBSClearPath(start, trackdir);
PBSClearPath(start, trackdir, curr->node.tile, curr->node.direction);
NPFSetFlag(&ftd->node, NPF_FLAG_PBS_BLOCKED, true);
DEBUG(pbs, 1) ("PBS: Self-crossing path!!!");
return;
};
PBSReserveTrack(curr->node.tile, (curr->node.direction & 7) );
PBSReserveTrack(curr->node.tile, TrackdirToTrack(curr->node.direction) );
/* we want to reserve the last tile (with the signal) on the path too */
if (prev != NULL && start == INVALID_TILE) {
PBSReserveTrack(prev->node.tile, (prev->node.direction & 7) );
start = prev->node.tile;
trackdir = ReverseTrackdir(prev->node.direction);
/* we want to reserve the last tile (with the signal) on the path too
also remember this tile, cause its the end of the path (where we exit the block) */
if (start == INVALID_TILE) {
if (prev != NULL) {
PBSReserveTrack(prev->node.tile, TrackdirToTrack(prev->node.direction) );
start = prev->node.tile;
trackdir = ReverseTrackdir(prev->node.direction);
} else {
start = curr->node.tile;
trackdir = curr->node.direction;
}
}
}
prev = curr;
curr = curr->parent;
} while (curr != NULL);
// we remember the tile/track where this path leaves the pbs junction
ftd->node.tile = start;
ftd->node.direction = trackdir;
}
}