summaryrefslogtreecommitdiff
path: root/src/train_cmd.cpp
diff options
context:
space:
mode:
authorsmatz <smatz@openttd.org>2009-07-17 13:54:06 +0000
committersmatz <smatz@openttd.org>2009-07-17 13:54:06 +0000
commit57d3d4ce5e9f9333c27b47e5a66d2c3604ce8dc9 (patch)
treebfa744e206782c6e53b2c7f58c7ee81c0d7b98e7 /src/train_cmd.cpp
parentb9cf3f880b8c25a1db7483356ddaeb1dee83ad0e (diff)
downloadopenttd-57d3d4ce5e9f9333c27b47e5a66d2c3604ce8dc9.tar.xz
(svn r16857) -Fix [FS#3036](r16652): crash when train partially in depot crashed
Diffstat (limited to 'src/train_cmd.cpp')
-rw-r--r--src/train_cmd.cpp42
1 files changed, 28 insertions, 14 deletions
diff --git a/src/train_cmd.cpp b/src/train_cmd.cpp
index 3a4dde6a9..3319f3403 100644
--- a/src/train_cmd.cpp
+++ b/src/train_cmd.cpp
@@ -3470,6 +3470,24 @@ static bool TrainMovedChangeSignals(TileIndex tile, DiagDirection dir)
return false;
}
+/**
+ * Tries to reserve track under whole train consist
+ */
+void Train::ReserveTrackUnderConsist() const
+{
+ for (const Train *u = this; u != NULL; u = u->Next()) {
+ switch (u->track) {
+ case TRACK_BIT_WORMHOLE:
+ TryReserveRailTrack(u->tile, DiagDirToDiagTrack(GetTunnelBridgeDirection(u->tile)));
+ break;
+ case TRACK_BIT_DEPOT:
+ break;
+ default:
+ TryReserveRailTrack(u->tile, TrackBitsToTrack(u->track));
+ break;
+ }
+ }
+}
static void SetVehicleCrashed(Train *v)
{
@@ -3532,24 +3550,20 @@ static uint CountPassengersInTrain(const Train *v)
*/
static uint TrainCrashed(Train *v)
{
- /* Try to re-reserve track under already crashed train too */
- for (const Train *u = v; u != NULL; u = u->Next()) {
- TrackBits trackbits = u->track;
- if (trackbits == TRACK_BIT_WORMHOLE) {
- /* Vehicle is inside a wormhole, v->track contains no useful value then. */
- trackbits = DiagDirToDiagTrackBits(GetTunnelBridgeDirection(u->tile));
- }
- TryReserveRailTrack(u->tile, TrackBitsToTrack(trackbits));
- }
+ uint num = 0;
/* do not crash train twice */
- if (v->vehstatus & VS_CRASHED) return 0;
+ if (!(v->vehstatus & VS_CRASHED)) {
+ /* two drivers + passengers */
+ num = 2 + CountPassengersInTrain(v);
- /* two drivers + passengers */
- uint num = 2 + CountPassengersInTrain(v);
+ SetVehicleCrashed(v);
+ AI::NewEvent(v->owner, new AIEventVehicleCrashed(v->index, v->tile, AIEventVehicleCrashed::CRASH_TRAIN));
+ }
- SetVehicleCrashed(v);
- AI::NewEvent(v->owner, new AIEventVehicleCrashed(v->index, v->tile, AIEventVehicleCrashed::CRASH_TRAIN));
+ /* Try to re-reserve track under already crashed train too.
+ * SetVehicleCrashed() clears the reservation! */
+ v->ReserveTrackUnderConsist();
return num;
}