diff --git src/train_cmd.cpp src/train_cmd.cpp index a016125..fabc8aa 100644 --- src/train_cmd.cpp +++ src/train_cmd.cpp @@ -3067,9 +3067,17 @@ bool TrainController(Train *v, Vehicle *nomove, bool reverse) Train *first = v->First(); Train *prev; bool direction_changed = false; // has direction of any part changed? + int progress = v->GetAdvanceDistance(); /* For every vehicle after and including the given vehicle */ for (prev = v->Previous(); v != nomove; prev = v, v = v->Next()) { + int reps=1; + if (prev!=NULL) { + int dist = v->progress + progress; + reps = dist/v->GetAdvanceDistance(); + v->progress = dist%v->GetAdvanceDistance(); + } + while (reps--) { DiagDirection enterdir = DIAGDIR_BEGIN; bool update_signals_crossing = false; // will we update signals or crossing state? @@ -3197,6 +3205,10 @@ bool TrainController(Train *v, Vehicle *nomove, bool reverse) * However, just choose the track into the wormhole. */ assert(IsTunnel(prev->tile)); chosen_track = bits; + } else if (prev->track == TRACK_BIT_DEPOT) { + /* The previous vehicle might be entering the depot too soon. */ + assert(IsDepotTile(prev->tile)); + chosen_track = bits; } else { chosen_track = prev->track; } @@ -3352,6 +3364,7 @@ bool TrainController(Train *v, Vehicle *nomove, bool reverse) if (IsLevelCrossingTile(gp.old_tile)) UpdateLevelCrossing(gp.old_tile); } } + } // End non-indented while loop. /* Do not check on every tick to save some computing time. */ if (v->IsFrontEngine() && v->tick_counter % _settings_game.pf.path_backoff_interval == 0) CheckNextTrainTile(v);