diff options
author | peter1138 <peter1138@openttd.org> | 2005-11-05 16:07:26 +0000 |
---|---|---|
committer | peter1138 <peter1138@openttd.org> | 2005-11-05 16:07:26 +0000 |
commit | 267314b4d0a28ac8a9d5b0d44a7c6dcd7ef88ac1 (patch) | |
tree | ad0c24edec46ec7170c414961c2eda4185970ae0 /vehicle.c | |
parent | d86829d0e09fd981cc65c85d65f75129f9299b8f (diff) | |
download | openttd-267314b4d0a28ac8a9d5b0d44a7c6dcd7ef88ac1.tar.xz |
(svn r3139) -NewGRF, Feature: support for articulated rail vehicles. This is used, for example, by coal tenders.
Diffstat (limited to 'vehicle.c')
-rw-r--r-- | vehicle.c | 28 |
1 files changed, 19 insertions, 9 deletions
@@ -519,20 +519,28 @@ int CountVehiclesInChain(Vehicle *v) void DeleteVehicle(Vehicle *v) { - DeleteName(v->string_id); - v->type = 0; - UpdateVehiclePosHash(v, INVALID_COORD, 0); - v->next_hash = INVALID_VEHICLE; + Vehicle *u; + bool has_artic_part = false; + + do { + u = v->next; + has_artic_part = EngineHasArticPart(v); + DeleteName(v->string_id); + v->type = 0; + UpdateVehiclePosHash(v, INVALID_COORD, 0); + v->next_hash = INVALID_VEHICLE; - if (v->orders != NULL) - DeleteVehicleOrders(v); + if (v->orders != NULL) + DeleteVehicleOrders(v); + v = u; + } while (v != NULL && has_artic_part); } void DeleteVehicleChain(Vehicle *v) { do { Vehicle *u = v; - v = v->next; + v = GetNextVehicle(v); DeleteVehicle(u); } while (v != NULL); } @@ -1486,6 +1494,8 @@ static Vehicle *GetNextEnginePart(Vehicle *v) const RailVehicleInfo *rvi = RailVehInfo(v->engine_type); if (rvi->flags & RVI_MULTIHEAD) return GetRearEngine(v, v->engine_type); + if (v->next != NULL && v->next->subtype == TS_Artic_Part) + return v->next; } break; case VEH_Aircraft: @@ -1579,7 +1589,7 @@ int32 CmdCloneVehicle(int x, int y, uint32 flags, uint32 p1, uint32 p2) } w_rear = w; // trains needs to know the last car in the train, so they can add more in next loop } - } while (v->type == VEH_Train && (v=v->next) != NULL); + } while (v->type == VEH_Train && (v = GetNextVehicle(v)) != NULL); if (flags & DC_EXEC) { v = v_front; @@ -1755,7 +1765,7 @@ static void MaybeReplaceVehicle(Vehicle *v) break; cost += temp_cost; - } while (w->type == VEH_Train && (w=w->next) != NULL); + } while (w->type == VEH_Train && (w = GetNextVehicle(w)) != NULL); if (!(flags & DC_EXEC) && (CmdFailed(temp_cost) || p->money64 < (int32)(cost + p->engine_renew_money) || cost == 0)) { if (p->money64 < (int32)(cost + p->engine_renew_money) && ( _local_player == v->owner ) && cost != 0) { |