(svn r16884) -Codechange: Add Train::GetFirstEnginePart() and use it.

This commit is contained in:
frosch 2009-07-19 19:17:41 +00:00
parent ba11651346
commit f1f4edfbd1
3 changed files with 26 additions and 7 deletions

View File

@ -453,10 +453,7 @@ struct DepotWindow : Window {
if (x < 0) break;
}
/* if an articulated part was selected, find its parent */
while (v != NULL && v->IsArticulatedPart()) v = v->Previous();
d->wagon = v;
d->wagon = (v != NULL ? v->GetFirstEnginePart() : NULL);
return MODE_DRAG_VEHICLE;
}

View File

@ -273,6 +273,28 @@ struct Train : public SpecializedVehicle<Train, VEH_TRAIN> {
return this->Next();
}
/**
* Get the first part of a multi-part engine.
* @return First part of the engine.
*/
FORCEINLINE Train *GetFirstEnginePart()
{
Train *v = this;
while (v->IsArticulatedPart()) v = v->Previous();
return v;
}
/**
* Get the first part of a multi-part engine.
* @return First part of the engine.
*/
FORCEINLINE const Train *GetFirstEnginePart() const
{
const Train *v = this;
while (v->IsArticulatedPart()) v = v->Previous();
return v;
}
/**
* Get the last part of a multi-part engine.
* @return Last part of the engine.

View File

@ -1105,9 +1105,9 @@ CommandCost CmdMoveRailVehicle(TileIndex tile, DoCommandFlag flags, uint32 p1, u
}
/* if an articulated part is being handled, deal with its parent vehicle */
while (src->IsArticulatedPart()) src = src->Previous();
src = src->GetFirstEnginePart();
if (dst != NULL) {
while (dst->IsArticulatedPart()) dst = dst->Previous();
dst = dst->GetFirstEnginePart();
}
/* don't move the same vehicle.. */
@ -1445,7 +1445,7 @@ CommandCost CmdSellRailWagon(TileIndex tile, DoCommandFlag flags, uint32 p1, uin
if (v->vehstatus & VS_CRASHED) return_cmd_error(STR_CAN_T_SELL_DESTROYED_VEHICLE);
while (v->IsArticulatedPart()) v = v->Previous();
v = v->GetFirstEnginePart();
Train *first = v->First();
/* make sure the vehicle is stopped in the depot */