mirror of https://github.com/OpenTTD/OpenTTD
(svn r13953) -Add [YAPP]: Free track reservations of crashed trains. (michi_cc)
parent
10d8fb6456
commit
d06fb949ff
|
@ -3068,6 +3068,21 @@ static void SetVehicleCrashed(Vehicle *v)
|
||||||
{
|
{
|
||||||
if (v->u.rail.crash_anim_pos != 0) return;
|
if (v->u.rail.crash_anim_pos != 0) return;
|
||||||
|
|
||||||
|
/* Free a possible path reservation and try to mark all tiles occupied by the train reserved. */
|
||||||
|
if (IsFrontEngine(v)) {
|
||||||
|
/* Remove all reservations, also the ones currently under the train
|
||||||
|
* and any railway station paltform reservation. */
|
||||||
|
FreeTrainTrackReservation(v);
|
||||||
|
for (const Vehicle *u = v; u != NULL; u = u->Next()) {
|
||||||
|
ClearPathReservation(u->tile, GetVehicleTrackdir(u));
|
||||||
|
}
|
||||||
|
/* Try to reserve all tiles directly under the train, but not the whole
|
||||||
|
* railway station platform or both tunnel/bridge ends. */
|
||||||
|
for (const Vehicle *u = v; u != NULL; u = u->Next()) {
|
||||||
|
TryReserveRailTrack(u->tile, TrackdirToTrack(GetVehicleTrackdir(u)));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* we may need to update crossing we were approaching */
|
/* we may need to update crossing we were approaching */
|
||||||
TileIndex crossing = TrainApproachingCrossingTile(v);
|
TileIndex crossing = TrainApproachingCrossingTile(v);
|
||||||
|
|
||||||
|
@ -3452,6 +3467,12 @@ static void DeleteLastWagon(Vehicle *v)
|
||||||
|
|
||||||
MarkSingleVehicleDirty(v);
|
MarkSingleVehicleDirty(v);
|
||||||
|
|
||||||
|
/* Clear a possible path reservation */
|
||||||
|
if ((IsFrontEngine(v) && !(v->u.rail.track & TRACK_BIT_DEPOT))
|
||||||
|
|| ((v->u.rail.track & ~TRACK_BIT_MASK) == TRACK_BIT_NONE && (v->tile != u->tile || (u->u.rail.track & ~TRACK_BIT_MASK) != TRACK_BIT_NONE))) {
|
||||||
|
if (HasReservedTracks(v->tile, v->u.rail.track)) UnreserveRailTrack(v->tile, TrackBitsToTrack(v->u.rail.track));
|
||||||
|
}
|
||||||
|
|
||||||
/* 'v' shouldn't be accessed after it has been deleted */
|
/* 'v' shouldn't be accessed after it has been deleted */
|
||||||
TrackBits track = v->u.rail.track;
|
TrackBits track = v->u.rail.track;
|
||||||
TileIndex tile = v->tile;
|
TileIndex tile = v->tile;
|
||||||
|
|
|
@ -887,7 +887,10 @@ static void FloodVehicle(Vehicle *v)
|
||||||
switch (v->type) {
|
switch (v->type) {
|
||||||
default: NOT_REACHED();
|
default: NOT_REACHED();
|
||||||
case VEH_TRAIN:
|
case VEH_TRAIN:
|
||||||
if (IsFrontEngine(v)) pass += 4; // driver
|
if (IsFrontEngine(v)) {
|
||||||
|
pass += 4; // driver
|
||||||
|
FreeTrainTrackReservation(v);
|
||||||
|
}
|
||||||
v->u.rail.crash_anim_pos = 4000; // max 4440, disappear pretty fast
|
v->u.rail.crash_anim_pos = 4000; // max 4440, disappear pretty fast
|
||||||
InvalidateWindowClassesData(WC_TRAINS_LIST, 0);
|
InvalidateWindowClassesData(WC_TRAINS_LIST, 0);
|
||||||
break;
|
break;
|
||||||
|
|
Loading…
Reference in New Issue