author | smatz |
Sat, 13 Dec 2008 16:16:44 +0000 | |
changeset 10417 | a1a609566853 |
parent 9725 | 982452c3357e |
permissions | -rw-r--r-- |
2186 | 1 |
/* $Id$ */ |
2 |
||
9111
48ce04029fe4
(svn r12971) -Documentation: add @file in files that missed them and add something more than whitespace as description of files that don't have a description.
rubidium
parents:
9073
diff
changeset
|
3 |
/** @file articulated_vehicles.cpp Implementation of articulated vehicles. */ |
6422
6679df1c05ba
(svn r9558) -Documentation: doxygen and comment changes: 'T' now. Almost done
belugas
parents:
6407
diff
changeset
|
4 |
|
0 | 5 |
#include "stdafx.h" |
1891
862800791170
(svn r2397) - CodeChange: rename all "ttd" files to "openttd" files.
Darkvater
parents:
1883
diff
changeset
|
6 |
#include "openttd.h" |
6772
8672ba1bebc9
(svn r10008) -Codechange: Move a couple of functions related to articulated vehicles to a file of their own.
maedhros
parents:
6771
diff
changeset
|
7 |
#include "articulated_vehicles.h" |
2676
59b65b4fb480
(svn r3218) -Feature: Multiheaded train engines will now stay in the same train
bjarni
parents:
2666
diff
changeset
|
8 |
#include "train.h" |
6857
60130753e595
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
6775
diff
changeset
|
9 |
#include "roadveh.h" |
2982
eb7f50dcb249
(svn r3557) - NewGRF: move callback enums to a new file as more than just engines will use them
peter1138
parents:
2970
diff
changeset
|
10 |
#include "newgrf_callbacks.h" |
2962
f0a49b646c48
(svn r3524) - Split newgrf features from engine.[ch] into newgrf_engine.[ch], and add the new files to project files.
peter1138
parents:
2952
diff
changeset
|
11 |
#include "newgrf_engine.h" |
8144
65cec0877b78
(svn r11706) -Codechange: split vehicle.h and remove another bunch of useless includes.
rubidium
parents:
8131
diff
changeset
|
12 |
#include "vehicle_func.h" |
0 | 13 |
|
9723
db2564531299
(svn r13847) -Codechange: Add MAX_ARTICULATED_PARTS and set it to 100.
frosch
parents:
9465
diff
changeset
|
14 |
static const uint MAX_ARTICULATED_PARTS = 100; ///< Maximum of articulated parts per vehicle, i.e. when to abort calling the articulated vehicle callback. |
db2564531299
(svn r13847) -Codechange: Add MAX_ARTICULATED_PARTS and set it to 100.
frosch
parents:
9465
diff
changeset
|
15 |
|
7595
9d645518f001
(svn r11122) -Fix [FS#1234]: crash when building a NewGRF vehicle when the articulated build vehicle callback returneed a different value for the purchase window than the normal build. Thanks for Dalestan and _minime_ for pointers to possible causes.
rubidium
parents:
7593
diff
changeset
|
16 |
uint CountArticulatedParts(EngineID engine_type, bool purchase_window) |
2602
1a6561c9a408
(svn r3139) -NewGRF, Feature: support for articulated rail vehicles. This is used, for example, by coal tenders.
peter1138
parents:
2599
diff
changeset
|
17 |
{ |
7928
63e18de69e50
(svn r11481) -Codechange: Rename the HASBIT function to fit with the naming style
skidd13
parents:
7642
diff
changeset
|
18 |
if (!HasBit(EngInfo(engine_type)->callbackmask, CBM_VEHICLE_ARTIC_ENGINE)) return 0; |
6150 | 19 |
|
7595
9d645518f001
(svn r11122) -Fix [FS#1234]: crash when building a NewGRF vehicle when the articulated build vehicle callback returneed a different value for the purchase window than the normal build. Thanks for Dalestan and _minime_ for pointers to possible causes.
rubidium
parents:
7593
diff
changeset
|
20 |
Vehicle *v = NULL;; |
9d645518f001
(svn r11122) -Fix [FS#1234]: crash when building a NewGRF vehicle when the articulated build vehicle callback returneed a different value for the purchase window than the normal build. Thanks for Dalestan and _minime_ for pointers to possible causes.
rubidium
parents:
7593
diff
changeset
|
21 |
if (!purchase_window) { |
9d645518f001
(svn r11122) -Fix [FS#1234]: crash when building a NewGRF vehicle when the articulated build vehicle callback returneed a different value for the purchase window than the normal build. Thanks for Dalestan and _minime_ for pointers to possible causes.
rubidium
parents:
7593
diff
changeset
|
22 |
v = new InvalidVehicle(); |
9d645518f001
(svn r11122) -Fix [FS#1234]: crash when building a NewGRF vehicle when the articulated build vehicle callback returneed a different value for the purchase window than the normal build. Thanks for Dalestan and _minime_ for pointers to possible causes.
rubidium
parents:
7593
diff
changeset
|
23 |
v->engine_type = engine_type; |
9d645518f001
(svn r11122) -Fix [FS#1234]: crash when building a NewGRF vehicle when the articulated build vehicle callback returneed a different value for the purchase window than the normal build. Thanks for Dalestan and _minime_ for pointers to possible causes.
rubidium
parents:
7593
diff
changeset
|
24 |
} |
9d645518f001
(svn r11122) -Fix [FS#1234]: crash when building a NewGRF vehicle when the articulated build vehicle callback returneed a different value for the purchase window than the normal build. Thanks for Dalestan and _minime_ for pointers to possible causes.
rubidium
parents:
7593
diff
changeset
|
25 |
|
2602
1a6561c9a408
(svn r3139) -NewGRF, Feature: support for articulated rail vehicles. This is used, for example, by coal tenders.
peter1138
parents:
2599
diff
changeset
|
26 |
uint i; |
9723
db2564531299
(svn r13847) -Codechange: Add MAX_ARTICULATED_PARTS and set it to 100.
frosch
parents:
9465
diff
changeset
|
27 |
for (i = 1; i < MAX_ARTICULATED_PARTS; i++) { |
7595
9d645518f001
(svn r11122) -Fix [FS#1234]: crash when building a NewGRF vehicle when the articulated build vehicle callback returneed a different value for the purchase window than the normal build. Thanks for Dalestan and _minime_ for pointers to possible causes.
rubidium
parents:
7593
diff
changeset
|
28 |
uint16 callback = GetVehicleCallback(CBID_VEHICLE_ARTIC_ENGINE, i, 0, engine_type, v); |
9020
8174bbda9abe
(svn r12819) -Codechange: handle more NewGRFs in the same way as TTDP does it, i.e. testing the low bits for 0xFF or 0 instead of all bits.
rubidium
parents:
8786
diff
changeset
|
29 |
if (callback == CALLBACK_FAILED || GB(callback, 0, 8) == 0xFF) break; |
2602
1a6561c9a408
(svn r3139) -NewGRF, Feature: support for articulated rail vehicles. This is used, for example, by coal tenders.
peter1138
parents:
2599
diff
changeset
|
30 |
} |
1a6561c9a408
(svn r3139) -NewGRF, Feature: support for articulated rail vehicles. This is used, for example, by coal tenders.
peter1138
parents:
2599
diff
changeset
|
31 |
|
7595
9d645518f001
(svn r11122) -Fix [FS#1234]: crash when building a NewGRF vehicle when the articulated build vehicle callback returneed a different value for the purchase window than the normal build. Thanks for Dalestan and _minime_ for pointers to possible causes.
rubidium
parents:
7593
diff
changeset
|
32 |
delete v; |
9d645518f001
(svn r11122) -Fix [FS#1234]: crash when building a NewGRF vehicle when the articulated build vehicle callback returneed a different value for the purchase window than the normal build. Thanks for Dalestan and _minime_ for pointers to possible causes.
rubidium
parents:
7593
diff
changeset
|
33 |
|
2608
c98436848294
(svn r3145) Fix two off-by-one errors in building articulated rail vehicles.
peter1138
parents:
2607
diff
changeset
|
34 |
return i - 1; |
2602
1a6561c9a408
(svn r3139) -NewGRF, Feature: support for articulated rail vehicles. This is used, for example, by coal tenders.
peter1138
parents:
2599
diff
changeset
|
35 |
} |
1a6561c9a408
(svn r3139) -NewGRF, Feature: support for articulated rail vehicles. This is used, for example, by coal tenders.
peter1138
parents:
2599
diff
changeset
|
36 |
|
8559
e51166aff0b2
(svn r12137) -Fix [FS#1769]: Show cargo capacity for articulated vehicles correctly in the purchase list. Multiple cargo types can also now been shown.
peter1138
parents:
8144
diff
changeset
|
37 |
|
9725
982452c3357e
(svn r13850) -Fix [FS#2146]: Fix resp. implement refitting of articulated vehicles during autoreplace.
frosch
parents:
9723
diff
changeset
|
38 |
/** |
982452c3357e
(svn r13850) -Fix [FS#2146]: Fix resp. implement refitting of articulated vehicles during autoreplace.
frosch
parents:
9723
diff
changeset
|
39 |
* Returns the default (non-refitted) capacity of a specific EngineID. |
982452c3357e
(svn r13850) -Fix [FS#2146]: Fix resp. implement refitting of articulated vehicles during autoreplace.
frosch
parents:
9723
diff
changeset
|
40 |
* @param engine the EngineID of iterest |
982452c3357e
(svn r13850) -Fix [FS#2146]: Fix resp. implement refitting of articulated vehicles during autoreplace.
frosch
parents:
9723
diff
changeset
|
41 |
* @param type the type of the engine |
982452c3357e
(svn r13850) -Fix [FS#2146]: Fix resp. implement refitting of articulated vehicles during autoreplace.
frosch
parents:
9723
diff
changeset
|
42 |
* @param cargo_type returns the default cargo type, if needed |
982452c3357e
(svn r13850) -Fix [FS#2146]: Fix resp. implement refitting of articulated vehicles during autoreplace.
frosch
parents:
9723
diff
changeset
|
43 |
* @return capacity |
982452c3357e
(svn r13850) -Fix [FS#2146]: Fix resp. implement refitting of articulated vehicles during autoreplace.
frosch
parents:
9723
diff
changeset
|
44 |
*/ |
982452c3357e
(svn r13850) -Fix [FS#2146]: Fix resp. implement refitting of articulated vehicles during autoreplace.
frosch
parents:
9723
diff
changeset
|
45 |
static inline uint16 GetVehicleDefaultCapacity(EngineID engine, VehicleType type, CargoID *cargo_type) |
982452c3357e
(svn r13850) -Fix [FS#2146]: Fix resp. implement refitting of articulated vehicles during autoreplace.
frosch
parents:
9723
diff
changeset
|
46 |
{ |
982452c3357e
(svn r13850) -Fix [FS#2146]: Fix resp. implement refitting of articulated vehicles during autoreplace.
frosch
parents:
9723
diff
changeset
|
47 |
switch (type) { |
982452c3357e
(svn r13850) -Fix [FS#2146]: Fix resp. implement refitting of articulated vehicles during autoreplace.
frosch
parents:
9723
diff
changeset
|
48 |
case VEH_TRAIN: { |
982452c3357e
(svn r13850) -Fix [FS#2146]: Fix resp. implement refitting of articulated vehicles during autoreplace.
frosch
parents:
9723
diff
changeset
|
49 |
const RailVehicleInfo *rvi = RailVehInfo(engine); |
982452c3357e
(svn r13850) -Fix [FS#2146]: Fix resp. implement refitting of articulated vehicles during autoreplace.
frosch
parents:
9723
diff
changeset
|
50 |
if (cargo_type != NULL) *cargo_type = rvi->cargo_type; |
982452c3357e
(svn r13850) -Fix [FS#2146]: Fix resp. implement refitting of articulated vehicles during autoreplace.
frosch
parents:
9723
diff
changeset
|
51 |
return GetEngineProperty(engine, 0x14, rvi->capacity) + (rvi->railveh_type == RAILVEH_MULTIHEAD ? rvi->capacity : 0); |
982452c3357e
(svn r13850) -Fix [FS#2146]: Fix resp. implement refitting of articulated vehicles during autoreplace.
frosch
parents:
9723
diff
changeset
|
52 |
} |
982452c3357e
(svn r13850) -Fix [FS#2146]: Fix resp. implement refitting of articulated vehicles during autoreplace.
frosch
parents:
9723
diff
changeset
|
53 |
|
982452c3357e
(svn r13850) -Fix [FS#2146]: Fix resp. implement refitting of articulated vehicles during autoreplace.
frosch
parents:
9723
diff
changeset
|
54 |
case VEH_ROAD: { |
982452c3357e
(svn r13850) -Fix [FS#2146]: Fix resp. implement refitting of articulated vehicles during autoreplace.
frosch
parents:
9723
diff
changeset
|
55 |
const RoadVehicleInfo *rvi = RoadVehInfo(engine); |
982452c3357e
(svn r13850) -Fix [FS#2146]: Fix resp. implement refitting of articulated vehicles during autoreplace.
frosch
parents:
9723
diff
changeset
|
56 |
if (cargo_type != NULL) *cargo_type = rvi->cargo_type; |
982452c3357e
(svn r13850) -Fix [FS#2146]: Fix resp. implement refitting of articulated vehicles during autoreplace.
frosch
parents:
9723
diff
changeset
|
57 |
return GetEngineProperty(engine, 0x0F, rvi->capacity); |
982452c3357e
(svn r13850) -Fix [FS#2146]: Fix resp. implement refitting of articulated vehicles during autoreplace.
frosch
parents:
9723
diff
changeset
|
58 |
} |
982452c3357e
(svn r13850) -Fix [FS#2146]: Fix resp. implement refitting of articulated vehicles during autoreplace.
frosch
parents:
9723
diff
changeset
|
59 |
|
982452c3357e
(svn r13850) -Fix [FS#2146]: Fix resp. implement refitting of articulated vehicles during autoreplace.
frosch
parents:
9723
diff
changeset
|
60 |
case VEH_SHIP: { |
982452c3357e
(svn r13850) -Fix [FS#2146]: Fix resp. implement refitting of articulated vehicles during autoreplace.
frosch
parents:
9723
diff
changeset
|
61 |
const ShipVehicleInfo *svi = ShipVehInfo(engine); |
982452c3357e
(svn r13850) -Fix [FS#2146]: Fix resp. implement refitting of articulated vehicles during autoreplace.
frosch
parents:
9723
diff
changeset
|
62 |
if (cargo_type != NULL) *cargo_type = svi->cargo_type; |
982452c3357e
(svn r13850) -Fix [FS#2146]: Fix resp. implement refitting of articulated vehicles during autoreplace.
frosch
parents:
9723
diff
changeset
|
63 |
return GetEngineProperty(engine, 0x0D, svi->capacity); |
982452c3357e
(svn r13850) -Fix [FS#2146]: Fix resp. implement refitting of articulated vehicles during autoreplace.
frosch
parents:
9723
diff
changeset
|
64 |
} |
982452c3357e
(svn r13850) -Fix [FS#2146]: Fix resp. implement refitting of articulated vehicles during autoreplace.
frosch
parents:
9723
diff
changeset
|
65 |
|
982452c3357e
(svn r13850) -Fix [FS#2146]: Fix resp. implement refitting of articulated vehicles during autoreplace.
frosch
parents:
9723
diff
changeset
|
66 |
case VEH_AIRCRAFT: { |
982452c3357e
(svn r13850) -Fix [FS#2146]: Fix resp. implement refitting of articulated vehicles during autoreplace.
frosch
parents:
9723
diff
changeset
|
67 |
const AircraftVehicleInfo *avi = AircraftVehInfo(engine); |
982452c3357e
(svn r13850) -Fix [FS#2146]: Fix resp. implement refitting of articulated vehicles during autoreplace.
frosch
parents:
9723
diff
changeset
|
68 |
if (cargo_type != NULL) *cargo_type = CT_PASSENGERS; |
982452c3357e
(svn r13850) -Fix [FS#2146]: Fix resp. implement refitting of articulated vehicles during autoreplace.
frosch
parents:
9723
diff
changeset
|
69 |
return avi->passenger_capacity; |
982452c3357e
(svn r13850) -Fix [FS#2146]: Fix resp. implement refitting of articulated vehicles during autoreplace.
frosch
parents:
9723
diff
changeset
|
70 |
} |
982452c3357e
(svn r13850) -Fix [FS#2146]: Fix resp. implement refitting of articulated vehicles during autoreplace.
frosch
parents:
9723
diff
changeset
|
71 |
|
982452c3357e
(svn r13850) -Fix [FS#2146]: Fix resp. implement refitting of articulated vehicles during autoreplace.
frosch
parents:
9723
diff
changeset
|
72 |
default: NOT_REACHED(); |
982452c3357e
(svn r13850) -Fix [FS#2146]: Fix resp. implement refitting of articulated vehicles during autoreplace.
frosch
parents:
9723
diff
changeset
|
73 |
} |
982452c3357e
(svn r13850) -Fix [FS#2146]: Fix resp. implement refitting of articulated vehicles during autoreplace.
frosch
parents:
9723
diff
changeset
|
74 |
|
982452c3357e
(svn r13850) -Fix [FS#2146]: Fix resp. implement refitting of articulated vehicles during autoreplace.
frosch
parents:
9723
diff
changeset
|
75 |
} |
982452c3357e
(svn r13850) -Fix [FS#2146]: Fix resp. implement refitting of articulated vehicles during autoreplace.
frosch
parents:
9723
diff
changeset
|
76 |
|
982452c3357e
(svn r13850) -Fix [FS#2146]: Fix resp. implement refitting of articulated vehicles during autoreplace.
frosch
parents:
9723
diff
changeset
|
77 |
/** |
982452c3357e
(svn r13850) -Fix [FS#2146]: Fix resp. implement refitting of articulated vehicles during autoreplace.
frosch
parents:
9723
diff
changeset
|
78 |
* Returns all cargos a vehicle can carry. |
982452c3357e
(svn r13850) -Fix [FS#2146]: Fix resp. implement refitting of articulated vehicles during autoreplace.
frosch
parents:
9723
diff
changeset
|
79 |
* @param engine the EngineID of iterest |
982452c3357e
(svn r13850) -Fix [FS#2146]: Fix resp. implement refitting of articulated vehicles during autoreplace.
frosch
parents:
9723
diff
changeset
|
80 |
* @param type the type of the engine |
982452c3357e
(svn r13850) -Fix [FS#2146]: Fix resp. implement refitting of articulated vehicles during autoreplace.
frosch
parents:
9723
diff
changeset
|
81 |
* @param include_initial_cargo_type if true the default cargo type of the vehicle is included; if false only the refit_mask |
982452c3357e
(svn r13850) -Fix [FS#2146]: Fix resp. implement refitting of articulated vehicles during autoreplace.
frosch
parents:
9723
diff
changeset
|
82 |
* @return bit set of CargoIDs |
982452c3357e
(svn r13850) -Fix [FS#2146]: Fix resp. implement refitting of articulated vehicles during autoreplace.
frosch
parents:
9723
diff
changeset
|
83 |
*/ |
982452c3357e
(svn r13850) -Fix [FS#2146]: Fix resp. implement refitting of articulated vehicles during autoreplace.
frosch
parents:
9723
diff
changeset
|
84 |
static inline uint32 GetAvailableVehicleCargoTypes(EngineID engine, VehicleType type, bool include_initial_cargo_type) |
982452c3357e
(svn r13850) -Fix [FS#2146]: Fix resp. implement refitting of articulated vehicles during autoreplace.
frosch
parents:
9723
diff
changeset
|
85 |
{ |
982452c3357e
(svn r13850) -Fix [FS#2146]: Fix resp. implement refitting of articulated vehicles during autoreplace.
frosch
parents:
9723
diff
changeset
|
86 |
uint32 cargos = 0; |
982452c3357e
(svn r13850) -Fix [FS#2146]: Fix resp. implement refitting of articulated vehicles during autoreplace.
frosch
parents:
9723
diff
changeset
|
87 |
CargoID initial_cargo_type; |
982452c3357e
(svn r13850) -Fix [FS#2146]: Fix resp. implement refitting of articulated vehicles during autoreplace.
frosch
parents:
9723
diff
changeset
|
88 |
|
982452c3357e
(svn r13850) -Fix [FS#2146]: Fix resp. implement refitting of articulated vehicles during autoreplace.
frosch
parents:
9723
diff
changeset
|
89 |
if (GetVehicleDefaultCapacity(engine, type, &initial_cargo_type) > 0) { |
982452c3357e
(svn r13850) -Fix [FS#2146]: Fix resp. implement refitting of articulated vehicles during autoreplace.
frosch
parents:
9723
diff
changeset
|
90 |
if (type != VEH_SHIP || ShipVehInfo(engine)->refittable) { |
982452c3357e
(svn r13850) -Fix [FS#2146]: Fix resp. implement refitting of articulated vehicles during autoreplace.
frosch
parents:
9723
diff
changeset
|
91 |
const EngineInfo *ei = EngInfo(engine); |
982452c3357e
(svn r13850) -Fix [FS#2146]: Fix resp. implement refitting of articulated vehicles during autoreplace.
frosch
parents:
9723
diff
changeset
|
92 |
cargos = ei->refit_mask; |
982452c3357e
(svn r13850) -Fix [FS#2146]: Fix resp. implement refitting of articulated vehicles during autoreplace.
frosch
parents:
9723
diff
changeset
|
93 |
} |
982452c3357e
(svn r13850) -Fix [FS#2146]: Fix resp. implement refitting of articulated vehicles during autoreplace.
frosch
parents:
9723
diff
changeset
|
94 |
if (include_initial_cargo_type && initial_cargo_type < NUM_CARGO) SetBit(cargos, initial_cargo_type); |
982452c3357e
(svn r13850) -Fix [FS#2146]: Fix resp. implement refitting of articulated vehicles during autoreplace.
frosch
parents:
9723
diff
changeset
|
95 |
} |
982452c3357e
(svn r13850) -Fix [FS#2146]: Fix resp. implement refitting of articulated vehicles during autoreplace.
frosch
parents:
9723
diff
changeset
|
96 |
|
982452c3357e
(svn r13850) -Fix [FS#2146]: Fix resp. implement refitting of articulated vehicles during autoreplace.
frosch
parents:
9723
diff
changeset
|
97 |
return cargos; |
982452c3357e
(svn r13850) -Fix [FS#2146]: Fix resp. implement refitting of articulated vehicles during autoreplace.
frosch
parents:
9723
diff
changeset
|
98 |
} |
982452c3357e
(svn r13850) -Fix [FS#2146]: Fix resp. implement refitting of articulated vehicles during autoreplace.
frosch
parents:
9723
diff
changeset
|
99 |
|
8559
e51166aff0b2
(svn r12137) -Fix [FS#1769]: Show cargo capacity for articulated vehicles correctly in the purchase list. Multiple cargo types can also now been shown.
peter1138
parents:
8144
diff
changeset
|
100 |
uint16 *GetCapacityOfArticulatedParts(EngineID engine, VehicleType type) |
e51166aff0b2
(svn r12137) -Fix [FS#1769]: Show cargo capacity for articulated vehicles correctly in the purchase list. Multiple cargo types can also now been shown.
peter1138
parents:
8144
diff
changeset
|
101 |
{ |
e51166aff0b2
(svn r12137) -Fix [FS#1769]: Show cargo capacity for articulated vehicles correctly in the purchase list. Multiple cargo types can also now been shown.
peter1138
parents:
8144
diff
changeset
|
102 |
static uint16 capacity[NUM_CARGO]; |
e51166aff0b2
(svn r12137) -Fix [FS#1769]: Show cargo capacity for articulated vehicles correctly in the purchase list. Multiple cargo types can also now been shown.
peter1138
parents:
8144
diff
changeset
|
103 |
memset(capacity, 0, sizeof(capacity)); |
e51166aff0b2
(svn r12137) -Fix [FS#1769]: Show cargo capacity for articulated vehicles correctly in the purchase list. Multiple cargo types can also now been shown.
peter1138
parents:
8144
diff
changeset
|
104 |
|
9725
982452c3357e
(svn r13850) -Fix [FS#2146]: Fix resp. implement refitting of articulated vehicles during autoreplace.
frosch
parents:
9723
diff
changeset
|
105 |
CargoID cargo_type; |
982452c3357e
(svn r13850) -Fix [FS#2146]: Fix resp. implement refitting of articulated vehicles during autoreplace.
frosch
parents:
9723
diff
changeset
|
106 |
uint16 cargo_capacity = GetVehicleDefaultCapacity(engine, type, &cargo_type); |
982452c3357e
(svn r13850) -Fix [FS#2146]: Fix resp. implement refitting of articulated vehicles during autoreplace.
frosch
parents:
9723
diff
changeset
|
107 |
if (cargo_type < NUM_CARGO) capacity[cargo_type] = cargo_capacity; |
982452c3357e
(svn r13850) -Fix [FS#2146]: Fix resp. implement refitting of articulated vehicles during autoreplace.
frosch
parents:
9723
diff
changeset
|
108 |
|
982452c3357e
(svn r13850) -Fix [FS#2146]: Fix resp. implement refitting of articulated vehicles during autoreplace.
frosch
parents:
9723
diff
changeset
|
109 |
if (type != VEH_TRAIN && type != VEH_ROAD) return capacity; |
8559
e51166aff0b2
(svn r12137) -Fix [FS#1769]: Show cargo capacity for articulated vehicles correctly in the purchase list. Multiple cargo types can also now been shown.
peter1138
parents:
8144
diff
changeset
|
110 |
|
e51166aff0b2
(svn r12137) -Fix [FS#1769]: Show cargo capacity for articulated vehicles correctly in the purchase list. Multiple cargo types can also now been shown.
peter1138
parents:
8144
diff
changeset
|
111 |
if (!HasBit(EngInfo(engine)->callbackmask, CBM_VEHICLE_ARTIC_ENGINE)) return capacity; |
e51166aff0b2
(svn r12137) -Fix [FS#1769]: Show cargo capacity for articulated vehicles correctly in the purchase list. Multiple cargo types can also now been shown.
peter1138
parents:
8144
diff
changeset
|
112 |
|
9723
db2564531299
(svn r13847) -Codechange: Add MAX_ARTICULATED_PARTS and set it to 100.
frosch
parents:
9465
diff
changeset
|
113 |
for (uint i = 1; i < MAX_ARTICULATED_PARTS; i++) { |
8559
e51166aff0b2
(svn r12137) -Fix [FS#1769]: Show cargo capacity for articulated vehicles correctly in the purchase list. Multiple cargo types can also now been shown.
peter1138
parents:
8144
diff
changeset
|
114 |
uint16 callback = GetVehicleCallback(CBID_VEHICLE_ARTIC_ENGINE, i, 0, engine, NULL); |
9020
8174bbda9abe
(svn r12819) -Codechange: handle more NewGRFs in the same way as TTDP does it, i.e. testing the low bits for 0xFF or 0 instead of all bits.
rubidium
parents:
8786
diff
changeset
|
115 |
if (callback == CALLBACK_FAILED || GB(callback, 0, 8) == 0xFF) break; |
8559
e51166aff0b2
(svn r12137) -Fix [FS#1769]: Show cargo capacity for articulated vehicles correctly in the purchase list. Multiple cargo types can also now been shown.
peter1138
parents:
8144
diff
changeset
|
116 |
|
9070
dd0121143eba
(svn r12924) -Feature: Introducing the so called 'engine pool' which primarily removes the fixed engine type limits and also happens to allow (with the patch option 'dynamic_engines') multiple NewGRF vehicle sets to coexist.
peter1138
parents:
9020
diff
changeset
|
117 |
EngineID artic_engine = GetNewEngineID(GetEngineGRF(engine), type, GB(callback, 0, 7)); |
8559
e51166aff0b2
(svn r12137) -Fix [FS#1769]: Show cargo capacity for articulated vehicles correctly in the purchase list. Multiple cargo types can also now been shown.
peter1138
parents:
8144
diff
changeset
|
118 |
|
9725
982452c3357e
(svn r13850) -Fix [FS#2146]: Fix resp. implement refitting of articulated vehicles during autoreplace.
frosch
parents:
9723
diff
changeset
|
119 |
cargo_capacity = GetVehicleDefaultCapacity(artic_engine, type, &cargo_type); |
982452c3357e
(svn r13850) -Fix [FS#2146]: Fix resp. implement refitting of articulated vehicles during autoreplace.
frosch
parents:
9723
diff
changeset
|
120 |
if (cargo_type < NUM_CARGO) capacity[cargo_type] += cargo_capacity; |
8559
e51166aff0b2
(svn r12137) -Fix [FS#1769]: Show cargo capacity for articulated vehicles correctly in the purchase list. Multiple cargo types can also now been shown.
peter1138
parents:
8144
diff
changeset
|
121 |
} |
e51166aff0b2
(svn r12137) -Fix [FS#1769]: Show cargo capacity for articulated vehicles correctly in the purchase list. Multiple cargo types can also now been shown.
peter1138
parents:
8144
diff
changeset
|
122 |
|
e51166aff0b2
(svn r12137) -Fix [FS#1769]: Show cargo capacity for articulated vehicles correctly in the purchase list. Multiple cargo types can also now been shown.
peter1138
parents:
8144
diff
changeset
|
123 |
return capacity; |
e51166aff0b2
(svn r12137) -Fix [FS#1769]: Show cargo capacity for articulated vehicles correctly in the purchase list. Multiple cargo types can also now been shown.
peter1138
parents:
8144
diff
changeset
|
124 |
} |
e51166aff0b2
(svn r12137) -Fix [FS#1769]: Show cargo capacity for articulated vehicles correctly in the purchase list. Multiple cargo types can also now been shown.
peter1138
parents:
8144
diff
changeset
|
125 |
|
9725
982452c3357e
(svn r13850) -Fix [FS#2146]: Fix resp. implement refitting of articulated vehicles during autoreplace.
frosch
parents:
9723
diff
changeset
|
126 |
/** |
982452c3357e
(svn r13850) -Fix [FS#2146]: Fix resp. implement refitting of articulated vehicles during autoreplace.
frosch
parents:
9723
diff
changeset
|
127 |
* Ors the refit_masks of all articulated parts. |
982452c3357e
(svn r13850) -Fix [FS#2146]: Fix resp. implement refitting of articulated vehicles during autoreplace.
frosch
parents:
9723
diff
changeset
|
128 |
* Note: Vehicles with a default capacity of zero are ignored. |
982452c3357e
(svn r13850) -Fix [FS#2146]: Fix resp. implement refitting of articulated vehicles during autoreplace.
frosch
parents:
9723
diff
changeset
|
129 |
* @param engine the first part |
982452c3357e
(svn r13850) -Fix [FS#2146]: Fix resp. implement refitting of articulated vehicles during autoreplace.
frosch
parents:
9723
diff
changeset
|
130 |
* @param type the vehicle type |
982452c3357e
(svn r13850) -Fix [FS#2146]: Fix resp. implement refitting of articulated vehicles during autoreplace.
frosch
parents:
9723
diff
changeset
|
131 |
* @param include_initial_cargo_type if true the default cargo type of the vehicle is included; if false only the refit_mask |
982452c3357e
(svn r13850) -Fix [FS#2146]: Fix resp. implement refitting of articulated vehicles during autoreplace.
frosch
parents:
9723
diff
changeset
|
132 |
* @return bit mask of CargoIDs which are a refit option for at least one articulated part |
982452c3357e
(svn r13850) -Fix [FS#2146]: Fix resp. implement refitting of articulated vehicles during autoreplace.
frosch
parents:
9723
diff
changeset
|
133 |
*/ |
982452c3357e
(svn r13850) -Fix [FS#2146]: Fix resp. implement refitting of articulated vehicles during autoreplace.
frosch
parents:
9723
diff
changeset
|
134 |
uint32 GetUnionOfArticulatedRefitMasks(EngineID engine, VehicleType type, bool include_initial_cargo_type) |
982452c3357e
(svn r13850) -Fix [FS#2146]: Fix resp. implement refitting of articulated vehicles during autoreplace.
frosch
parents:
9723
diff
changeset
|
135 |
{ |
982452c3357e
(svn r13850) -Fix [FS#2146]: Fix resp. implement refitting of articulated vehicles during autoreplace.
frosch
parents:
9723
diff
changeset
|
136 |
uint32 cargos = GetAvailableVehicleCargoTypes(engine, type, include_initial_cargo_type); |
982452c3357e
(svn r13850) -Fix [FS#2146]: Fix resp. implement refitting of articulated vehicles during autoreplace.
frosch
parents:
9723
diff
changeset
|
137 |
|
982452c3357e
(svn r13850) -Fix [FS#2146]: Fix resp. implement refitting of articulated vehicles during autoreplace.
frosch
parents:
9723
diff
changeset
|
138 |
if (type != VEH_TRAIN && type != VEH_ROAD) return cargos; |
982452c3357e
(svn r13850) -Fix [FS#2146]: Fix resp. implement refitting of articulated vehicles during autoreplace.
frosch
parents:
9723
diff
changeset
|
139 |
|
982452c3357e
(svn r13850) -Fix [FS#2146]: Fix resp. implement refitting of articulated vehicles during autoreplace.
frosch
parents:
9723
diff
changeset
|
140 |
if (!HasBit(EngInfo(engine)->callbackmask, CBM_VEHICLE_ARTIC_ENGINE)) return cargos; |
982452c3357e
(svn r13850) -Fix [FS#2146]: Fix resp. implement refitting of articulated vehicles during autoreplace.
frosch
parents:
9723
diff
changeset
|
141 |
|
982452c3357e
(svn r13850) -Fix [FS#2146]: Fix resp. implement refitting of articulated vehicles during autoreplace.
frosch
parents:
9723
diff
changeset
|
142 |
for (uint i = 1; i < MAX_ARTICULATED_PARTS; i++) { |
982452c3357e
(svn r13850) -Fix [FS#2146]: Fix resp. implement refitting of articulated vehicles during autoreplace.
frosch
parents:
9723
diff
changeset
|
143 |
uint16 callback = GetVehicleCallback(CBID_VEHICLE_ARTIC_ENGINE, i, 0, engine, NULL); |
982452c3357e
(svn r13850) -Fix [FS#2146]: Fix resp. implement refitting of articulated vehicles during autoreplace.
frosch
parents:
9723
diff
changeset
|
144 |
if (callback == CALLBACK_FAILED || GB(callback, 0, 8) == 0xFF) break; |
982452c3357e
(svn r13850) -Fix [FS#2146]: Fix resp. implement refitting of articulated vehicles during autoreplace.
frosch
parents:
9723
diff
changeset
|
145 |
|
982452c3357e
(svn r13850) -Fix [FS#2146]: Fix resp. implement refitting of articulated vehicles during autoreplace.
frosch
parents:
9723
diff
changeset
|
146 |
EngineID artic_engine = GetNewEngineID(GetEngineGRF(engine), type, GB(callback, 0, 7)); |
982452c3357e
(svn r13850) -Fix [FS#2146]: Fix resp. implement refitting of articulated vehicles during autoreplace.
frosch
parents:
9723
diff
changeset
|
147 |
cargos |= GetAvailableVehicleCargoTypes(artic_engine, type, include_initial_cargo_type); |
982452c3357e
(svn r13850) -Fix [FS#2146]: Fix resp. implement refitting of articulated vehicles during autoreplace.
frosch
parents:
9723
diff
changeset
|
148 |
} |
982452c3357e
(svn r13850) -Fix [FS#2146]: Fix resp. implement refitting of articulated vehicles during autoreplace.
frosch
parents:
9723
diff
changeset
|
149 |
|
982452c3357e
(svn r13850) -Fix [FS#2146]: Fix resp. implement refitting of articulated vehicles during autoreplace.
frosch
parents:
9723
diff
changeset
|
150 |
return cargos; |
982452c3357e
(svn r13850) -Fix [FS#2146]: Fix resp. implement refitting of articulated vehicles during autoreplace.
frosch
parents:
9723
diff
changeset
|
151 |
} |
982452c3357e
(svn r13850) -Fix [FS#2146]: Fix resp. implement refitting of articulated vehicles during autoreplace.
frosch
parents:
9723
diff
changeset
|
152 |
|
982452c3357e
(svn r13850) -Fix [FS#2146]: Fix resp. implement refitting of articulated vehicles during autoreplace.
frosch
parents:
9723
diff
changeset
|
153 |
/** |
982452c3357e
(svn r13850) -Fix [FS#2146]: Fix resp. implement refitting of articulated vehicles during autoreplace.
frosch
parents:
9723
diff
changeset
|
154 |
* Ands the refit_masks of all articulated parts. |
982452c3357e
(svn r13850) -Fix [FS#2146]: Fix resp. implement refitting of articulated vehicles during autoreplace.
frosch
parents:
9723
diff
changeset
|
155 |
* Note: Vehicles with a default capacity of zero are ignored. |
982452c3357e
(svn r13850) -Fix [FS#2146]: Fix resp. implement refitting of articulated vehicles during autoreplace.
frosch
parents:
9723
diff
changeset
|
156 |
* @param engine the first part |
982452c3357e
(svn r13850) -Fix [FS#2146]: Fix resp. implement refitting of articulated vehicles during autoreplace.
frosch
parents:
9723
diff
changeset
|
157 |
* @param type the vehicle type |
982452c3357e
(svn r13850) -Fix [FS#2146]: Fix resp. implement refitting of articulated vehicles during autoreplace.
frosch
parents:
9723
diff
changeset
|
158 |
* @param include_initial_cargo_type if true the default cargo type of the vehicle is included; if false only the refit_mask |
982452c3357e
(svn r13850) -Fix [FS#2146]: Fix resp. implement refitting of articulated vehicles during autoreplace.
frosch
parents:
9723
diff
changeset
|
159 |
* @return bit mask of CargoIDs which are a refit option for every articulated part (with default capacity > 0) |
982452c3357e
(svn r13850) -Fix [FS#2146]: Fix resp. implement refitting of articulated vehicles during autoreplace.
frosch
parents:
9723
diff
changeset
|
160 |
*/ |
982452c3357e
(svn r13850) -Fix [FS#2146]: Fix resp. implement refitting of articulated vehicles during autoreplace.
frosch
parents:
9723
diff
changeset
|
161 |
uint32 GetIntersectionOfArticulatedRefitMasks(EngineID engine, VehicleType type, bool include_initial_cargo_type) |
982452c3357e
(svn r13850) -Fix [FS#2146]: Fix resp. implement refitting of articulated vehicles during autoreplace.
frosch
parents:
9723
diff
changeset
|
162 |
{ |
982452c3357e
(svn r13850) -Fix [FS#2146]: Fix resp. implement refitting of articulated vehicles during autoreplace.
frosch
parents:
9723
diff
changeset
|
163 |
uint32 cargos = UINT32_MAX; |
982452c3357e
(svn r13850) -Fix [FS#2146]: Fix resp. implement refitting of articulated vehicles during autoreplace.
frosch
parents:
9723
diff
changeset
|
164 |
|
982452c3357e
(svn r13850) -Fix [FS#2146]: Fix resp. implement refitting of articulated vehicles during autoreplace.
frosch
parents:
9723
diff
changeset
|
165 |
uint32 veh_cargos = GetAvailableVehicleCargoTypes(engine, type, include_initial_cargo_type); |
982452c3357e
(svn r13850) -Fix [FS#2146]: Fix resp. implement refitting of articulated vehicles during autoreplace.
frosch
parents:
9723
diff
changeset
|
166 |
if (veh_cargos != 0) cargos &= veh_cargos; |
982452c3357e
(svn r13850) -Fix [FS#2146]: Fix resp. implement refitting of articulated vehicles during autoreplace.
frosch
parents:
9723
diff
changeset
|
167 |
|
982452c3357e
(svn r13850) -Fix [FS#2146]: Fix resp. implement refitting of articulated vehicles during autoreplace.
frosch
parents:
9723
diff
changeset
|
168 |
if (type != VEH_TRAIN && type != VEH_ROAD) return cargos; |
982452c3357e
(svn r13850) -Fix [FS#2146]: Fix resp. implement refitting of articulated vehicles during autoreplace.
frosch
parents:
9723
diff
changeset
|
169 |
|
982452c3357e
(svn r13850) -Fix [FS#2146]: Fix resp. implement refitting of articulated vehicles during autoreplace.
frosch
parents:
9723
diff
changeset
|
170 |
if (!HasBit(EngInfo(engine)->callbackmask, CBM_VEHICLE_ARTIC_ENGINE)) return cargos; |
982452c3357e
(svn r13850) -Fix [FS#2146]: Fix resp. implement refitting of articulated vehicles during autoreplace.
frosch
parents:
9723
diff
changeset
|
171 |
|
982452c3357e
(svn r13850) -Fix [FS#2146]: Fix resp. implement refitting of articulated vehicles during autoreplace.
frosch
parents:
9723
diff
changeset
|
172 |
for (uint i = 1; i < MAX_ARTICULATED_PARTS; i++) { |
982452c3357e
(svn r13850) -Fix [FS#2146]: Fix resp. implement refitting of articulated vehicles during autoreplace.
frosch
parents:
9723
diff
changeset
|
173 |
uint16 callback = GetVehicleCallback(CBID_VEHICLE_ARTIC_ENGINE, i, 0, engine, NULL); |
982452c3357e
(svn r13850) -Fix [FS#2146]: Fix resp. implement refitting of articulated vehicles during autoreplace.
frosch
parents:
9723
diff
changeset
|
174 |
if (callback == CALLBACK_FAILED || GB(callback, 0, 8) == 0xFF) break; |
982452c3357e
(svn r13850) -Fix [FS#2146]: Fix resp. implement refitting of articulated vehicles during autoreplace.
frosch
parents:
9723
diff
changeset
|
175 |
|
982452c3357e
(svn r13850) -Fix [FS#2146]: Fix resp. implement refitting of articulated vehicles during autoreplace.
frosch
parents:
9723
diff
changeset
|
176 |
EngineID artic_engine = GetNewEngineID(GetEngineGRF(engine), type, GB(callback, 0, 7)); |
982452c3357e
(svn r13850) -Fix [FS#2146]: Fix resp. implement refitting of articulated vehicles during autoreplace.
frosch
parents:
9723
diff
changeset
|
177 |
veh_cargos = GetAvailableVehicleCargoTypes(artic_engine, type, include_initial_cargo_type); |
982452c3357e
(svn r13850) -Fix [FS#2146]: Fix resp. implement refitting of articulated vehicles during autoreplace.
frosch
parents:
9723
diff
changeset
|
178 |
if (veh_cargos != 0) cargos &= veh_cargos; |
982452c3357e
(svn r13850) -Fix [FS#2146]: Fix resp. implement refitting of articulated vehicles during autoreplace.
frosch
parents:
9723
diff
changeset
|
179 |
} |
982452c3357e
(svn r13850) -Fix [FS#2146]: Fix resp. implement refitting of articulated vehicles during autoreplace.
frosch
parents:
9723
diff
changeset
|
180 |
|
982452c3357e
(svn r13850) -Fix [FS#2146]: Fix resp. implement refitting of articulated vehicles during autoreplace.
frosch
parents:
9723
diff
changeset
|
181 |
return cargos; |
982452c3357e
(svn r13850) -Fix [FS#2146]: Fix resp. implement refitting of articulated vehicles during autoreplace.
frosch
parents:
9723
diff
changeset
|
182 |
} |
982452c3357e
(svn r13850) -Fix [FS#2146]: Fix resp. implement refitting of articulated vehicles during autoreplace.
frosch
parents:
9723
diff
changeset
|
183 |
|
982452c3357e
(svn r13850) -Fix [FS#2146]: Fix resp. implement refitting of articulated vehicles during autoreplace.
frosch
parents:
9723
diff
changeset
|
184 |
|
982452c3357e
(svn r13850) -Fix [FS#2146]: Fix resp. implement refitting of articulated vehicles during autoreplace.
frosch
parents:
9723
diff
changeset
|
185 |
/** |
982452c3357e
(svn r13850) -Fix [FS#2146]: Fix resp. implement refitting of articulated vehicles during autoreplace.
frosch
parents:
9723
diff
changeset
|
186 |
* Tests if all parts of an articulated vehicle are refitted to the same cargo. |
982452c3357e
(svn r13850) -Fix [FS#2146]: Fix resp. implement refitting of articulated vehicles during autoreplace.
frosch
parents:
9723
diff
changeset
|
187 |
* Note: Vehicles not carrying anything are ignored |
982452c3357e
(svn r13850) -Fix [FS#2146]: Fix resp. implement refitting of articulated vehicles during autoreplace.
frosch
parents:
9723
diff
changeset
|
188 |
* @param v the first vehicle in the chain |
982452c3357e
(svn r13850) -Fix [FS#2146]: Fix resp. implement refitting of articulated vehicles during autoreplace.
frosch
parents:
9723
diff
changeset
|
189 |
* @param cargo_type returns the common CargoID if needed. (CT_INVALID if no part is carrying something or they are carrying different things) |
982452c3357e
(svn r13850) -Fix [FS#2146]: Fix resp. implement refitting of articulated vehicles during autoreplace.
frosch
parents:
9723
diff
changeset
|
190 |
* @return true if some parts are carrying different cargos, false if all parts are carrying the same (nothing is also the same) |
982452c3357e
(svn r13850) -Fix [FS#2146]: Fix resp. implement refitting of articulated vehicles during autoreplace.
frosch
parents:
9723
diff
changeset
|
191 |
*/ |
982452c3357e
(svn r13850) -Fix [FS#2146]: Fix resp. implement refitting of articulated vehicles during autoreplace.
frosch
parents:
9723
diff
changeset
|
192 |
bool IsArticulatedVehicleCarryingDifferentCargos(const Vehicle *v, CargoID *cargo_type) |
982452c3357e
(svn r13850) -Fix [FS#2146]: Fix resp. implement refitting of articulated vehicles during autoreplace.
frosch
parents:
9723
diff
changeset
|
193 |
{ |
982452c3357e
(svn r13850) -Fix [FS#2146]: Fix resp. implement refitting of articulated vehicles during autoreplace.
frosch
parents:
9723
diff
changeset
|
194 |
CargoID first_cargo = CT_INVALID; |
982452c3357e
(svn r13850) -Fix [FS#2146]: Fix resp. implement refitting of articulated vehicles during autoreplace.
frosch
parents:
9723
diff
changeset
|
195 |
|
982452c3357e
(svn r13850) -Fix [FS#2146]: Fix resp. implement refitting of articulated vehicles during autoreplace.
frosch
parents:
9723
diff
changeset
|
196 |
do { |
982452c3357e
(svn r13850) -Fix [FS#2146]: Fix resp. implement refitting of articulated vehicles during autoreplace.
frosch
parents:
9723
diff
changeset
|
197 |
if (v->cargo_cap > 0 && v->cargo_type != CT_INVALID) { |
982452c3357e
(svn r13850) -Fix [FS#2146]: Fix resp. implement refitting of articulated vehicles during autoreplace.
frosch
parents:
9723
diff
changeset
|
198 |
if (first_cargo == CT_INVALID) first_cargo = v->cargo_type; |
982452c3357e
(svn r13850) -Fix [FS#2146]: Fix resp. implement refitting of articulated vehicles during autoreplace.
frosch
parents:
9723
diff
changeset
|
199 |
if (first_cargo != v->cargo_type) { |
982452c3357e
(svn r13850) -Fix [FS#2146]: Fix resp. implement refitting of articulated vehicles during autoreplace.
frosch
parents:
9723
diff
changeset
|
200 |
if (cargo_type != NULL) *cargo_type = CT_INVALID; |
982452c3357e
(svn r13850) -Fix [FS#2146]: Fix resp. implement refitting of articulated vehicles during autoreplace.
frosch
parents:
9723
diff
changeset
|
201 |
return true; |
982452c3357e
(svn r13850) -Fix [FS#2146]: Fix resp. implement refitting of articulated vehicles during autoreplace.
frosch
parents:
9723
diff
changeset
|
202 |
} |
982452c3357e
(svn r13850) -Fix [FS#2146]: Fix resp. implement refitting of articulated vehicles during autoreplace.
frosch
parents:
9723
diff
changeset
|
203 |
} |
982452c3357e
(svn r13850) -Fix [FS#2146]: Fix resp. implement refitting of articulated vehicles during autoreplace.
frosch
parents:
9723
diff
changeset
|
204 |
|
982452c3357e
(svn r13850) -Fix [FS#2146]: Fix resp. implement refitting of articulated vehicles during autoreplace.
frosch
parents:
9723
diff
changeset
|
205 |
switch (v->type) { |
982452c3357e
(svn r13850) -Fix [FS#2146]: Fix resp. implement refitting of articulated vehicles during autoreplace.
frosch
parents:
9723
diff
changeset
|
206 |
case VEH_TRAIN: |
982452c3357e
(svn r13850) -Fix [FS#2146]: Fix resp. implement refitting of articulated vehicles during autoreplace.
frosch
parents:
9723
diff
changeset
|
207 |
v = (EngineHasArticPart(v) ? GetNextArticPart(v) : NULL); |
982452c3357e
(svn r13850) -Fix [FS#2146]: Fix resp. implement refitting of articulated vehicles during autoreplace.
frosch
parents:
9723
diff
changeset
|
208 |
break; |
982452c3357e
(svn r13850) -Fix [FS#2146]: Fix resp. implement refitting of articulated vehicles during autoreplace.
frosch
parents:
9723
diff
changeset
|
209 |
|
982452c3357e
(svn r13850) -Fix [FS#2146]: Fix resp. implement refitting of articulated vehicles during autoreplace.
frosch
parents:
9723
diff
changeset
|
210 |
case VEH_ROAD: |
982452c3357e
(svn r13850) -Fix [FS#2146]: Fix resp. implement refitting of articulated vehicles during autoreplace.
frosch
parents:
9723
diff
changeset
|
211 |
v = (RoadVehHasArticPart(v) ? v->Next() : NULL); |
982452c3357e
(svn r13850) -Fix [FS#2146]: Fix resp. implement refitting of articulated vehicles during autoreplace.
frosch
parents:
9723
diff
changeset
|
212 |
break; |
982452c3357e
(svn r13850) -Fix [FS#2146]: Fix resp. implement refitting of articulated vehicles during autoreplace.
frosch
parents:
9723
diff
changeset
|
213 |
|
982452c3357e
(svn r13850) -Fix [FS#2146]: Fix resp. implement refitting of articulated vehicles during autoreplace.
frosch
parents:
9723
diff
changeset
|
214 |
default: |
982452c3357e
(svn r13850) -Fix [FS#2146]: Fix resp. implement refitting of articulated vehicles during autoreplace.
frosch
parents:
9723
diff
changeset
|
215 |
v = NULL; |
982452c3357e
(svn r13850) -Fix [FS#2146]: Fix resp. implement refitting of articulated vehicles during autoreplace.
frosch
parents:
9723
diff
changeset
|
216 |
break; |
982452c3357e
(svn r13850) -Fix [FS#2146]: Fix resp. implement refitting of articulated vehicles during autoreplace.
frosch
parents:
9723
diff
changeset
|
217 |
} |
982452c3357e
(svn r13850) -Fix [FS#2146]: Fix resp. implement refitting of articulated vehicles during autoreplace.
frosch
parents:
9723
diff
changeset
|
218 |
} while (v != NULL); |
982452c3357e
(svn r13850) -Fix [FS#2146]: Fix resp. implement refitting of articulated vehicles during autoreplace.
frosch
parents:
9723
diff
changeset
|
219 |
|
982452c3357e
(svn r13850) -Fix [FS#2146]: Fix resp. implement refitting of articulated vehicles during autoreplace.
frosch
parents:
9723
diff
changeset
|
220 |
if (cargo_type != NULL) *cargo_type = first_cargo; |
982452c3357e
(svn r13850) -Fix [FS#2146]: Fix resp. implement refitting of articulated vehicles during autoreplace.
frosch
parents:
9723
diff
changeset
|
221 |
return false; |
982452c3357e
(svn r13850) -Fix [FS#2146]: Fix resp. implement refitting of articulated vehicles during autoreplace.
frosch
parents:
9723
diff
changeset
|
222 |
} |
982452c3357e
(svn r13850) -Fix [FS#2146]: Fix resp. implement refitting of articulated vehicles during autoreplace.
frosch
parents:
9723
diff
changeset
|
223 |
|
8559
e51166aff0b2
(svn r12137) -Fix [FS#1769]: Show cargo capacity for articulated vehicles correctly in the purchase list. Multiple cargo types can also now been shown.
peter1138
parents:
8144
diff
changeset
|
224 |
|
6857
60130753e595
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
6775
diff
changeset
|
225 |
void AddArticulatedParts(Vehicle **vl, VehicleType type) |
2602
1a6561c9a408
(svn r3139) -NewGRF, Feature: support for articulated rail vehicles. This is used, for example, by coal tenders.
peter1138
parents:
2599
diff
changeset
|
226 |
{ |
6150 | 227 |
const Vehicle *v = vl[0]; |
228 |
Vehicle *u = vl[0]; |
|
2602
1a6561c9a408
(svn r3139) -NewGRF, Feature: support for articulated rail vehicles. This is used, for example, by coal tenders.
peter1138
parents:
2599
diff
changeset
|
229 |
|
7928
63e18de69e50
(svn r11481) -Codechange: Rename the HASBIT function to fit with the naming style
skidd13
parents:
7642
diff
changeset
|
230 |
if (!HasBit(EngInfo(v->engine_type)->callbackmask, CBM_VEHICLE_ARTIC_ENGINE)) return; |
2602
1a6561c9a408
(svn r3139) -NewGRF, Feature: support for articulated rail vehicles. This is used, for example, by coal tenders.
peter1138
parents:
2599
diff
changeset
|
231 |
|
9723
db2564531299
(svn r13847) -Codechange: Add MAX_ARTICULATED_PARTS and set it to 100.
frosch
parents:
9465
diff
changeset
|
232 |
for (uint i = 1; i < MAX_ARTICULATED_PARTS; i++) { |
7215
7f90af37655d
(svn r10493) -Codechange: update some callback ID enums to reflect their changed usage, add a few and update the comments.
rubidium
parents:
6857
diff
changeset
|
233 |
uint16 callback = GetVehicleCallback(CBID_VEHICLE_ARTIC_ENGINE, i, 0, v->engine_type, v); |
9020
8174bbda9abe
(svn r12819) -Codechange: handle more NewGRFs in the same way as TTDP does it, i.e. testing the low bits for 0xFF or 0 instead of all bits.
rubidium
parents:
8786
diff
changeset
|
234 |
if (callback == CALLBACK_FAILED || GB(callback, 0, 8) == 0xFF) return; |
2602
1a6561c9a408
(svn r3139) -NewGRF, Feature: support for articulated rail vehicles. This is used, for example, by coal tenders.
peter1138
parents:
2599
diff
changeset
|
235 |
|
4831
ffc748f7e3e6
(svn r6755) - Fix: Pass the newly created vehicle when checking for articulated engines. As this could result in more parts being added than previously counted, we check to see if we need to allocate more vehicles as we add parts.
peter1138
parents:
4806
diff
changeset
|
236 |
/* Attempt to use pre-allocated vehicles until they run out. This can happen |
ffc748f7e3e6
(svn r6755) - Fix: Pass the newly created vehicle when checking for articulated engines. As this could result in more parts being added than previously counted, we check to see if we need to allocate more vehicles as we add parts.
peter1138
parents:
4806
diff
changeset
|
237 |
* if the callback returns different values depending on the cargo type. */ |
7492
35acee076719
(svn r11003) -Codechange: replace Vehicle->next to Vehicle->Next() and Vehicle->SetNext() so we can trap instances that change a next pointer and (in the future) update the first/previous pointers based on that.
rubidium
parents:
7398
diff
changeset
|
238 |
u->SetNext(vl[i]); |
35acee076719
(svn r11003) -Codechange: replace Vehicle->next to Vehicle->Next() and Vehicle->SetNext() so we can trap instances that change a next pointer and (in the future) update the first/previous pointers based on that.
rubidium
parents:
7398
diff
changeset
|
239 |
if (u->Next() == NULL) return; |
4831
ffc748f7e3e6
(svn r6755) - Fix: Pass the newly created vehicle when checking for articulated engines. As this could result in more parts being added than previously counted, we check to see if we need to allocate more vehicles as we add parts.
peter1138
parents:
4806
diff
changeset
|
240 |
|
7518
75f9c0f2baf1
(svn r11033) -Fix [FS#1184] (r11011): building articulated vehicles failed. Based on a patch by SmatZ.
rubidium
parents:
7492
diff
changeset
|
241 |
Vehicle *previous = u; |
7492
35acee076719
(svn r11003) -Codechange: replace Vehicle->next to Vehicle->Next() and Vehicle->SetNext() so we can trap instances that change a next pointer and (in the future) update the first/previous pointers based on that.
rubidium
parents:
7398
diff
changeset
|
242 |
u = u->Next(); |
2602
1a6561c9a408
(svn r3139) -NewGRF, Feature: support for articulated rail vehicles. This is used, for example, by coal tenders.
peter1138
parents:
2599
diff
changeset
|
243 |
|
9070
dd0121143eba
(svn r12924) -Feature: Introducing the so called 'engine pool' which primarily removes the fixed engine type limits and also happens to allow (with the patch option 'dynamic_engines') multiple NewGRF vehicle sets to coexist.
peter1138
parents:
9020
diff
changeset
|
244 |
EngineID engine_type = GetNewEngineID(GetEngineGRF(v->engine_type), type, GB(callback, 0, 7)); |
7928
63e18de69e50
(svn r11481) -Codechange: Rename the HASBIT function to fit with the naming style
skidd13
parents:
7642
diff
changeset
|
245 |
bool flip_image = HasBit(callback, 7); |
2602
1a6561c9a408
(svn r3139) -NewGRF, Feature: support for articulated rail vehicles. This is used, for example, by coal tenders.
peter1138
parents:
2599
diff
changeset
|
246 |
|
6422
6679df1c05ba
(svn r9558) -Documentation: doxygen and comment changes: 'T' now. Almost done
belugas
parents:
6407
diff
changeset
|
247 |
/* get common values from first engine */ |
2602
1a6561c9a408
(svn r3139) -NewGRF, Feature: support for articulated rail vehicles. This is used, for example, by coal tenders.
peter1138
parents:
2599
diff
changeset
|
248 |
u->direction = v->direction; |
1a6561c9a408
(svn r3139) -NewGRF, Feature: support for articulated rail vehicles. This is used, for example, by coal tenders.
peter1138
parents:
2599
diff
changeset
|
249 |
u->owner = v->owner; |
1a6561c9a408
(svn r3139) -NewGRF, Feature: support for articulated rail vehicles. This is used, for example, by coal tenders.
peter1138
parents:
2599
diff
changeset
|
250 |
u->tile = v->tile; |
1a6561c9a408
(svn r3139) -NewGRF, Feature: support for articulated rail vehicles. This is used, for example, by coal tenders.
peter1138
parents:
2599
diff
changeset
|
251 |
u->x_pos = v->x_pos; |
1a6561c9a408
(svn r3139) -NewGRF, Feature: support for articulated rail vehicles. This is used, for example, by coal tenders.
peter1138
parents:
2599
diff
changeset
|
252 |
u->y_pos = v->y_pos; |
1a6561c9a408
(svn r3139) -NewGRF, Feature: support for articulated rail vehicles. This is used, for example, by coal tenders.
peter1138
parents:
2599
diff
changeset
|
253 |
u->z_pos = v->z_pos; |
1a6561c9a408
(svn r3139) -NewGRF, Feature: support for articulated rail vehicles. This is used, for example, by coal tenders.
peter1138
parents:
2599
diff
changeset
|
254 |
u->build_year = v->build_year; |
1a6561c9a408
(svn r3139) -NewGRF, Feature: support for articulated rail vehicles. This is used, for example, by coal tenders.
peter1138
parents:
2599
diff
changeset
|
255 |
u->vehstatus = v->vehstatus & ~VS_STOPPED; |
1a6561c9a408
(svn r3139) -NewGRF, Feature: support for articulated rail vehicles. This is used, for example, by coal tenders.
peter1138
parents:
2599
diff
changeset
|
256 |
|
3870
d9ebc4ea750a
(svn r4910) - NewGRF: add and initialize cargo subtype for vehicle visual variations
peter1138
parents:
3836
diff
changeset
|
257 |
u->cargo_subtype = 0; |
2602
1a6561c9a408
(svn r3139) -NewGRF, Feature: support for articulated rail vehicles. This is used, for example, by coal tenders.
peter1138
parents:
2599
diff
changeset
|
258 |
u->max_speed = 0; |
1a6561c9a408
(svn r3139) -NewGRF, Feature: support for articulated rail vehicles. This is used, for example, by coal tenders.
peter1138
parents:
2599
diff
changeset
|
259 |
u->max_age = 0; |
1a6561c9a408
(svn r3139) -NewGRF, Feature: support for articulated rail vehicles. This is used, for example, by coal tenders.
peter1138
parents:
2599
diff
changeset
|
260 |
u->engine_type = engine_type; |
1a6561c9a408
(svn r3139) -NewGRF, Feature: support for articulated rail vehicles. This is used, for example, by coal tenders.
peter1138
parents:
2599
diff
changeset
|
261 |
u->value = 0; |
2676
59b65b4fb480
(svn r3218) -Feature: Multiheaded train engines will now stay in the same train
bjarni
parents:
2666
diff
changeset
|
262 |
u->subtype = 0; |
2602
1a6561c9a408
(svn r3139) -NewGRF, Feature: support for articulated rail vehicles. This is used, for example, by coal tenders.
peter1138
parents:
2599
diff
changeset
|
263 |
u->cur_image = 0xAC2; |
2804
ea4080819175
(svn r3352) - NewGRF: Move initialization of vehicle random_bits to DC_EXEC blocks to allow use of Random() instead of InteractiveRandom(), which will alleviate some possible network desyncs.
peter1138
parents:
2758
diff
changeset
|
264 |
u->random_bits = VehicleRandomBits(); |
2602
1a6561c9a408
(svn r3139) -NewGRF, Feature: support for articulated rail vehicles. This is used, for example, by coal tenders.
peter1138
parents:
2599
diff
changeset
|
265 |
|
6857
60130753e595
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
6775
diff
changeset
|
266 |
switch (type) { |
60130753e595
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
6775
diff
changeset
|
267 |
default: NOT_REACHED(); |
60130753e595
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
6775
diff
changeset
|
268 |
|
60130753e595
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
6775
diff
changeset
|
269 |
case VEH_TRAIN: { |
60130753e595
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
6775
diff
changeset
|
270 |
const RailVehicleInfo *rvi_artic = RailVehInfo(engine_type); |
60130753e595
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
6775
diff
changeset
|
271 |
|
60130753e595
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
6775
diff
changeset
|
272 |
u = new (u) Train(); |
7528
fe994ed19d34
(svn r11047) -Fix (r11011) [FS#1205]: desync due to wrong cached vehicle length on articulated vehicle construction.
rubidium
parents:
7518
diff
changeset
|
273 |
previous->SetNext(u); |
6857
60130753e595
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
6775
diff
changeset
|
274 |
u->u.rail.track = v->u.rail.track; |
60130753e595
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
6775
diff
changeset
|
275 |
u->u.rail.railtype = v->u.rail.railtype; |
60130753e595
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
6775
diff
changeset
|
276 |
u->u.rail.first_engine = v->engine_type; |
60130753e595
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
6775
diff
changeset
|
277 |
|
60130753e595
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
6775
diff
changeset
|
278 |
u->spritenum = rvi_artic->image_index; |
60130753e595
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
6775
diff
changeset
|
279 |
u->cargo_type = rvi_artic->cargo_type; |
60130753e595
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
6775
diff
changeset
|
280 |
u->cargo_cap = rvi_artic->capacity; |
60130753e595
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
6775
diff
changeset
|
281 |
|
60130753e595
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
6775
diff
changeset
|
282 |
SetArticulatedPart(u); |
60130753e595
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
6775
diff
changeset
|
283 |
} break; |
60130753e595
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
6775
diff
changeset
|
284 |
|
60130753e595
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
6775
diff
changeset
|
285 |
case VEH_ROAD: { |
60130753e595
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
6775
diff
changeset
|
286 |
const RoadVehicleInfo *rvi_artic = RoadVehInfo(engine_type); |
60130753e595
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
6775
diff
changeset
|
287 |
|
60130753e595
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
6775
diff
changeset
|
288 |
u = new (u) RoadVehicle(); |
7528
fe994ed19d34
(svn r11047) -Fix (r11011) [FS#1205]: desync due to wrong cached vehicle length on articulated vehicle construction.
rubidium
parents:
7518
diff
changeset
|
289 |
previous->SetNext(u); |
6857
60130753e595
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
6775
diff
changeset
|
290 |
u->u.road.first_engine = v->engine_type; |
60130753e595
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
6775
diff
changeset
|
291 |
u->u.road.cached_veh_length = GetRoadVehLength(u); |
60130753e595
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
6775
diff
changeset
|
292 |
u->u.road.state = RVSB_IN_DEPOT; |
60130753e595
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
6775
diff
changeset
|
293 |
|
60130753e595
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
6775
diff
changeset
|
294 |
u->u.road.roadtype = v->u.road.roadtype; |
60130753e595
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
6775
diff
changeset
|
295 |
u->u.road.compatible_roadtypes = v->u.road.compatible_roadtypes; |
60130753e595
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
6775
diff
changeset
|
296 |
|
60130753e595
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
6775
diff
changeset
|
297 |
u->spritenum = rvi_artic->image_index; |
60130753e595
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
6775
diff
changeset
|
298 |
u->cargo_type = rvi_artic->cargo_type; |
60130753e595
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
6775
diff
changeset
|
299 |
u->cargo_cap = rvi_artic->capacity; |
60130753e595
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
6775
diff
changeset
|
300 |
|
60130753e595
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
6775
diff
changeset
|
301 |
SetRoadVehArticPart(u); |
60130753e595
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
6775
diff
changeset
|
302 |
} break; |
60130753e595
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
6775
diff
changeset
|
303 |
} |
60130753e595
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
6775
diff
changeset
|
304 |
|
60130753e595
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
6775
diff
changeset
|
305 |
if (flip_image) u->spritenum++; |
60130753e595
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
6775
diff
changeset
|
306 |
|
2602
1a6561c9a408
(svn r3139) -NewGRF, Feature: support for articulated rail vehicles. This is used, for example, by coal tenders.
peter1138
parents:
2599
diff
changeset
|
307 |
VehiclePositionChanged(u); |
1a6561c9a408
(svn r3139) -NewGRF, Feature: support for articulated rail vehicles. This is used, for example, by coal tenders.
peter1138
parents:
2599
diff
changeset
|
308 |
} |
1a6561c9a408
(svn r3139) -NewGRF, Feature: support for articulated rail vehicles. This is used, for example, by coal tenders.
peter1138
parents:
2599
diff
changeset
|
309 |
} |