|
@@ -968,7 +968,7 @@ static Train *UnlinkWagon(Train *v, Trai
|
|
|
{
|
|
|
/* unlinking the first vehicle of the chain? */
|
|
|
if (v == first) {
|
|
|
v = GetNextVehicle(v);
|
|
|
v = v->GetNextVehicle();
|
|
|
if (v == NULL) return NULL;
|
|
|
|
|
|
if (v->IsWagon()) v->SetFreeWagon();
|
|
@@ -982,8 +982,8 @@ static Train *UnlinkWagon(Train *v, Trai
|
|
|
}
|
|
|
|
|
|
Train *u;
|
|
|
for (u = first; GetNextVehicle(u) != v; u = GetNextVehicle(u)) {}
|
|
|
GetLastEnginePart(u)->SetNext(GetNextVehicle(v));
|
|
|
for (u = first; u->GetNextVehicle() != v; u = u->GetNextVehicle()) {}
|
|
|
u->GetLastEnginePart()->SetNext(v->GetNextVehicle());
|
|
|
return first;
|
|
|
}
|
|
|
|
|
@@ -1034,7 +1034,7 @@ static void NormaliseTrainConsist(Train
|
|
|
|
|
|
assert(v->IsFrontEngine());
|
|
|
|
|
|
for (; v != NULL; v = GetNextVehicle(v)) {
|
|
|
for (; v != NULL; v = v->GetNextVehicle()) {
|
|
|
if (!v->IsMultiheaded() || !v->IsEngine()) continue;
|
|
|
|
|
|
/* make sure that there are no free cars before next engine */
|
|
@@ -1094,7 +1094,7 @@ CommandCost CmdMoveRailVehicle(TileIndex
|
|
|
dst_head = dst->First();
|
|
|
if (dst_head->tile != src_head->tile) return CMD_ERROR;
|
|
|
/* Now deal with articulated part of destination wagon */
|
|
|
dst = GetLastEnginePart(dst);
|
|
|
dst = dst->GetLastEnginePart();
|
|
|
} else {
|
|
|
dst_head = NULL;
|
|
|
}
|
|
@@ -1126,8 +1126,9 @@ CommandCost CmdMoveRailVehicle(TileIndex
|
|
|
* row that are being moved. */
|
|
|
if (HasBit(p2, 0)) {
|
|
|
const Train *u;
|
|
|
for (u = src_head; u != src && u != NULL; u = GetNextVehicle(u))
|
|
|
for (u = src_head; u != src && u != NULL; u = u->GetNextVehicle()) {
|
|
|
src_len--;
|
|
|
}
|
|
|
} else {
|
|
|
/* If moving only one vehicle, just count that. */
|
|
|
src_len = 1;
|
|
@@ -1141,8 +1142,9 @@ CommandCost CmdMoveRailVehicle(TileIndex
|
|
|
}
|
|
|
} else {
|
|
|
/* Abort if we're creating a new train on an existing row. */
|
|
|
if (src_len > max_len && src == src_head && GetNextVehicle(src_head)->IsEngine())
|
|
|
if (src_len > max_len && src == src_head && src_head->GetNextVehicle()->IsEngine()) {
|
|
|
return_cmd_error(STR_ERROR_TRAIN_TOO_LONG);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -1157,7 +1159,7 @@ CommandCost CmdMoveRailVehicle(TileIndex
|
|
|
|
|
|
/* When we move the front vehicle, the second vehicle might need a unitnumber */
|
|
|
if (!HasBit(p2, 0) && (src->IsFreeWagon() || (src->IsFrontEngine() && dst == NULL)) && (flags & DC_AUTOREPLACE) == 0) {
|
|
|
Train *second = GetNextUnit(src);
|
|
|
Train *second = src->GetNextUnit();
|
|
|
if (second != NULL && second->IsEngine() && GetFreeUnitNumber(VEH_TRAIN) > _settings_game.vehicle.max_trains) {
|
|
|
return_cmd_error(STR_ERROR_TOO_MANY_VEHICLES_IN_GAME);
|
|
|
}
|
|
@@ -1268,7 +1270,7 @@ CommandCost CmdMoveRailVehicle(TileIndex
|
|
|
/* If we move the front Engine and if the second vehicle is not an engine
|
|
|
add the whole vehicle to the DEFAULT_GROUP */
|
|
|
if (src->IsFrontEngine() && !IsDefaultGroupID(src->group_id)) {
|
|
|
Train *v = GetNextVehicle(src);
|
|
|
Train *v = src->GetNextVehicle();
|
|
|
|
|
|
if (v != NULL && v->IsEngine()) {
|
|
|
v->group_id = src->group_id;
|
|
@@ -1280,8 +1282,8 @@ CommandCost CmdMoveRailVehicle(TileIndex
|
|
|
/* unlink ALL wagons */
|
|
|
if (src != src_head) {
|
|
|
Train *v = src_head;
|
|
|
while (GetNextVehicle(v) != src) v = GetNextVehicle(v);
|
|
|
GetLastEnginePart(v)->SetNext(NULL);
|
|
|
while (v->GetNextVehicle() != src) v = v->GetNextVehicle();
|
|
|
v->GetLastEnginePart()->SetNext(NULL);
|
|
|
} else {
|
|
|
InvalidateWindowData(WC_VEHICLE_DEPOT, src_head->tile); // We removed a line
|
|
|
src_head = NULL;
|
|
@@ -1291,7 +1293,7 @@ CommandCost CmdMoveRailVehicle(TileIndex
|
|
|
if (src_head == dst_head) dst_head = NULL;
|
|
|
/* unlink single wagon from linked list */
|
|
|
src_head = UnlinkWagon(src, src_head);
|
|
|
GetLastEnginePart(src)->SetNext(NULL);
|
|
|
src->GetLastEnginePart()->SetNext(NULL);
|
|
|
}
|
|
|
|
|
|
if (dst == NULL) {
|
|
@@ -1340,8 +1342,8 @@ CommandCost CmdMoveRailVehicle(TileIndex
|
|
|
{
|
|
|
Train *v;
|
|
|
|
|
|
for (v = src; GetNextVehicle(v) != NULL; v = GetNextVehicle(v)) {}
|
|
|
GetLastEnginePart(v)->SetNext(dst->Next());
|
|
|
for (v = src; v->GetNextVehicle() != NULL; v = v->GetNextVehicle()) {}
|
|
|
v->GetLastEnginePart()->SetNext(dst->Next());
|
|
|
}
|
|
|
dst->SetNext(src);
|
|
|
}
|
|
@@ -1460,7 +1462,7 @@ CommandCost CmdSellRailWagon(TileIndex t
|
|
|
/* 2. We are selling the front vehicle, some special action might be required
|
|
|
* here, so take attention */
|
|
|
if (v == first) {
|
|
|
Train *new_f = GetNextVehicle(first);
|
|
|
Train *new_f = first->GetNextVehicle();
|
|
|
|
|
|
/* 2.2 If there are wagons present after the deleted front engine, check
|
|
|
* if the second wagon (which will be first) is an engine. If it is one,
|
|
@@ -1521,7 +1523,7 @@ CommandCost CmdSellRailWagon(TileIndex t
|
|
|
* If we encounter a matching rear-engine to a front-engine
|
|
|
* earlier in the chain (before deletion), leave it alone */
|
|
|
for (Train *tmp; v != NULL; v = tmp) {
|
|
|
tmp = GetNextVehicle(v);
|
|
|
tmp = v->GetNextVehicle();
|
|
|
|
|
|
if (v->IsMultiheaded()) {
|
|
|
if (v->IsEngine()) {
|
|
@@ -1537,7 +1539,7 @@ CommandCost CmdSellRailWagon(TileIndex t
|
|
|
* deleted here. However, because tmp has already
|
|
|
* been set it needs to be updated now so that the
|
|
|
* loop never sees the rear part. */
|
|
|
if (tmp == rear) tmp = GetNextVehicle(tmp);
|
|
|
if (tmp == rear) tmp = tmp->GetNextVehicle();
|
|
|
|
|
|
if (flags & DC_EXEC) {
|
|
|
first = UnlinkWagon(rear, first);
|
|
@@ -4439,7 +4441,7 @@ Money Train::GetRunningCost() const
|
|
|
if (v->IsMultiheaded()) cost_factor /= 2;
|
|
|
|
|
|
cost += cost_factor * GetPriceByIndex(rvi->running_cost_class);
|
|
|
} while ((v = GetNextVehicle(v)) != NULL);
|
|
|
} while ((v = v->GetNextVehicle()) != NULL);
|
|
|
|
|
|
return cost;
|
|
|
}
|