diff -r bb8f386d5b18 -r a834c2e45ae1 src/autoreplace_cmd.cpp --- a/src/autoreplace_cmd.cpp Wed May 07 22:08:20 2008 +0000 +++ b/src/autoreplace_cmd.cpp Wed May 07 23:00:11 2008 +0000 @@ -427,10 +427,14 @@ /* We are going to try to replace a vehicle but we don't have any backup so we will make one. */ backup.Backup(v, p); } - /* Now replace the vehicle */ + /* Now replace the vehicle. + * First we need to cache if it's the front vehicle as we need to update the v pointer if it is. + * If the replacement fails then we can't trust the data in the vehicle hence the reason to cache the result. */ + bool IsFront = w->type != VEH_TRAIN || w->u.rail.first_engine == INVALID_ENGINE; + cost.AddCost(ReplaceVehicle(&w, DC_EXEC, cost.GetCost(), p, new_engine)); - if (CmdSucceeded(cost) && (w->type != VEH_TRAIN || w->u.rail.first_engine == INVALID_ENGINE)) { + if (IsFront) { /* now we bought a new engine and sold the old one. We need to fix the * pointers in order to avoid pointing to the old one for trains: these * pointers should point to the front engine and not the cars