author | truebrain |
Thu, 12 Jun 2008 18:03:50 +0000 | |
branch | noai |
changeset 10938 | df6235dd2b7a |
parent 10867 | 5de2923d6e59 |
permissions | -rw-r--r-- |
9625 | 1 |
/* $Id$ */ |
2 |
||
10455
22c441f5adf9
(svn r12997) [NoAI] -Sync: with trunk r12895:12996.
rubidium
parents:
10294
diff
changeset
|
3 |
/** @file articulated_vehicles.cpp Implementation of articulated vehicles. */ |
9625 | 4 |
|
5 |
#include "stdafx.h" |
|
6 |
#include "openttd.h" |
|
7 |
#include "articulated_vehicles.h" |
|
8 |
#include "train.h" |
|
9627 | 9 |
#include "roadveh.h" |
9625 | 10 |
#include "newgrf_callbacks.h" |
11 |
#include "newgrf_engine.h" |
|
9723
eee46cb39750
(svn r11796) [NoAI] -Sync: with trunk r11502:11795.
rubidium
parents:
9722
diff
changeset
|
12 |
#include "vehicle_func.h" |
9625 | 13 |
|
9703
d2a6acdbd665
(svn r11146) [NoAI] -Sync: with trunk r11035:11045.
rubidium
parents:
9701
diff
changeset
|
14 |
uint CountArticulatedParts(EngineID engine_type, bool purchase_window) |
9625 | 15 |
{ |
9722
ebf0ece7d8f6
(svn r11503) [NoAI] -Sync: with trunk r11308:11502.
rubidium
parents:
9704
diff
changeset
|
16 |
if (!HasBit(EngInfo(engine_type)->callbackmask, CBM_VEHICLE_ARTIC_ENGINE)) return 0; |
9625 | 17 |
|
9703
d2a6acdbd665
(svn r11146) [NoAI] -Sync: with trunk r11035:11045.
rubidium
parents:
9701
diff
changeset
|
18 |
Vehicle *v = NULL;; |
d2a6acdbd665
(svn r11146) [NoAI] -Sync: with trunk r11035:11045.
rubidium
parents:
9701
diff
changeset
|
19 |
if (!purchase_window) { |
d2a6acdbd665
(svn r11146) [NoAI] -Sync: with trunk r11035:11045.
rubidium
parents:
9701
diff
changeset
|
20 |
v = new InvalidVehicle(); |
d2a6acdbd665
(svn r11146) [NoAI] -Sync: with trunk r11035:11045.
rubidium
parents:
9701
diff
changeset
|
21 |
v->engine_type = engine_type; |
d2a6acdbd665
(svn r11146) [NoAI] -Sync: with trunk r11035:11045.
rubidium
parents:
9701
diff
changeset
|
22 |
} |
d2a6acdbd665
(svn r11146) [NoAI] -Sync: with trunk r11035:11045.
rubidium
parents:
9701
diff
changeset
|
23 |
|
9625 | 24 |
uint i; |
9703
d2a6acdbd665
(svn r11146) [NoAI] -Sync: with trunk r11035:11045.
rubidium
parents:
9701
diff
changeset
|
25 |
for (i = 1; i < MAX_UVALUE(EngineID); i++) { |
d2a6acdbd665
(svn r11146) [NoAI] -Sync: with trunk r11035:11045.
rubidium
parents:
9701
diff
changeset
|
26 |
uint16 callback = GetVehicleCallback(CBID_VEHICLE_ARTIC_ENGINE, i, 0, engine_type, v); |
10294 | 27 |
if (callback == CALLBACK_FAILED || GB(callback, 0, 8) == 0xFF) break; |
9625 | 28 |
} |
29 |
||
9703
d2a6acdbd665
(svn r11146) [NoAI] -Sync: with trunk r11035:11045.
rubidium
parents:
9701
diff
changeset
|
30 |
delete v; |
d2a6acdbd665
(svn r11146) [NoAI] -Sync: with trunk r11035:11045.
rubidium
parents:
9701
diff
changeset
|
31 |
|
9625 | 32 |
return i - 1; |
33 |
} |
|
34 |
||
9732 | 35 |
|
36 |
uint16 *GetCapacityOfArticulatedParts(EngineID engine, VehicleType type) |
|
37 |
{ |
|
38 |
static uint16 capacity[NUM_CARGO]; |
|
39 |
memset(capacity, 0, sizeof(capacity)); |
|
40 |
||
41 |
if (type == VEH_TRAIN) { |
|
42 |
const RailVehicleInfo *rvi = RailVehInfo(engine); |
|
10867
5de2923d6e59
(svn r13418) [NoAI] -Sync: with trunk r13380:13417.
rubidium
parents:
10455
diff
changeset
|
43 |
capacity[rvi->cargo_type] = GetEngineProperty(engine, 0x14, rvi->capacity); |
9732 | 44 |
if (rvi->railveh_type == RAILVEH_MULTIHEAD) capacity[rvi->cargo_type] += rvi->capacity; |
45 |
} else if (type == VEH_ROAD) { |
|
46 |
const RoadVehicleInfo *rvi = RoadVehInfo(engine); |
|
10867
5de2923d6e59
(svn r13418) [NoAI] -Sync: with trunk r13380:13417.
rubidium
parents:
10455
diff
changeset
|
47 |
capacity[rvi->cargo_type] = GetEngineProperty(engine, 0x0F, rvi->capacity); |
9732 | 48 |
} |
49 |
||
50 |
if (!HasBit(EngInfo(engine)->callbackmask, CBM_VEHICLE_ARTIC_ENGINE)) return capacity; |
|
51 |
||
52 |
for (uint i = 1; i < MAX_UVALUE(EngineID); i++) { |
|
53 |
uint16 callback = GetVehicleCallback(CBID_VEHICLE_ARTIC_ENGINE, i, 0, engine, NULL); |
|
10294 | 54 |
if (callback == CALLBACK_FAILED || GB(callback, 0, 8) == 0xFF) break; |
9732 | 55 |
|
10455
22c441f5adf9
(svn r12997) [NoAI] -Sync: with trunk r12895:12996.
rubidium
parents:
10294
diff
changeset
|
56 |
EngineID artic_engine = GetNewEngineID(GetEngineGRF(engine), type, GB(callback, 0, 7)); |
9732 | 57 |
|
58 |
if (type == VEH_TRAIN) { |
|
59 |
const RailVehicleInfo *rvi = RailVehInfo(artic_engine); |
|
60 |
capacity[rvi->cargo_type] += GetEngineProperty(artic_engine, 0x14, rvi->capacity); |
|
61 |
} else if (type == VEH_ROAD) { |
|
62 |
const RoadVehicleInfo *rvi = RoadVehInfo(artic_engine); |
|
63 |
capacity[rvi->cargo_type] += GetEngineProperty(artic_engine, 0x0F, rvi->capacity); |
|
64 |
} |
|
65 |
} |
|
66 |
||
67 |
return capacity; |
|
68 |
} |
|
69 |
||
70 |
||
9627 | 71 |
void AddArticulatedParts(Vehicle **vl, VehicleType type) |
9625 | 72 |
{ |
73 |
const Vehicle *v = vl[0]; |
|
74 |
Vehicle *u = vl[0]; |
|
75 |
||
9722
ebf0ece7d8f6
(svn r11503) [NoAI] -Sync: with trunk r11308:11502.
rubidium
parents:
9704
diff
changeset
|
76 |
if (!HasBit(EngInfo(v->engine_type)->callbackmask, CBM_VEHICLE_ARTIC_ENGINE)) return; |
9625 | 77 |
|
9703
d2a6acdbd665
(svn r11146) [NoAI] -Sync: with trunk r11035:11045.
rubidium
parents:
9701
diff
changeset
|
78 |
for (uint i = 1; i < MAX_UVALUE(EngineID); i++) { |
9641
855e32c08c9b
(svn r10533) [NoAI] -Sync with trunk r10460:r10532.
truelight
parents:
9627
diff
changeset
|
79 |
uint16 callback = GetVehicleCallback(CBID_VEHICLE_ARTIC_ENGINE, i, 0, v->engine_type, v); |
10294 | 80 |
if (callback == CALLBACK_FAILED || GB(callback, 0, 8) == 0xFF) return; |
9625 | 81 |
|
82 |
/* Attempt to use pre-allocated vehicles until they run out. This can happen |
|
83 |
* if the callback returns different values depending on the cargo type. */ |
|
9701
d1ac22c62f64
(svn r11036) [NoAI] -Sync: with trunk r10774:11035.
rubidium
parents:
9694
diff
changeset
|
84 |
u->SetNext(vl[i]); |
d1ac22c62f64
(svn r11036) [NoAI] -Sync: with trunk r10774:11035.
rubidium
parents:
9694
diff
changeset
|
85 |
if (u->Next() == NULL) return; |
9625 | 86 |
|
9701
d1ac22c62f64
(svn r11036) [NoAI] -Sync: with trunk r10774:11035.
rubidium
parents:
9694
diff
changeset
|
87 |
Vehicle *previous = u; |
d1ac22c62f64
(svn r11036) [NoAI] -Sync: with trunk r10774:11035.
rubidium
parents:
9694
diff
changeset
|
88 |
u = u->Next(); |
9625 | 89 |
|
10455
22c441f5adf9
(svn r12997) [NoAI] -Sync: with trunk r12895:12996.
rubidium
parents:
10294
diff
changeset
|
90 |
EngineID engine_type = GetNewEngineID(GetEngineGRF(v->engine_type), type, GB(callback, 0, 7)); |
9722
ebf0ece7d8f6
(svn r11503) [NoAI] -Sync: with trunk r11308:11502.
rubidium
parents:
9704
diff
changeset
|
91 |
bool flip_image = HasBit(callback, 7); |
9625 | 92 |
|
93 |
/* get common values from first engine */ |
|
94 |
u->direction = v->direction; |
|
95 |
u->owner = v->owner; |
|
96 |
u->tile = v->tile; |
|
97 |
u->x_pos = v->x_pos; |
|
98 |
u->y_pos = v->y_pos; |
|
99 |
u->z_pos = v->z_pos; |
|
100 |
u->build_year = v->build_year; |
|
101 |
u->vehstatus = v->vehstatus & ~VS_STOPPED; |
|
102 |
||
103 |
u->cargo_subtype = 0; |
|
104 |
u->max_speed = 0; |
|
105 |
u->max_age = 0; |
|
106 |
u->engine_type = engine_type; |
|
107 |
u->value = 0; |
|
108 |
u->subtype = 0; |
|
109 |
u->cur_image = 0xAC2; |
|
110 |
u->random_bits = VehicleRandomBits(); |
|
111 |
||
9627 | 112 |
switch (type) { |
113 |
default: NOT_REACHED(); |
|
114 |
||
115 |
case VEH_TRAIN: { |
|
116 |
const RailVehicleInfo *rvi_artic = RailVehInfo(engine_type); |
|
117 |
||
118 |
u = new (u) Train(); |
|
9703
d2a6acdbd665
(svn r11146) [NoAI] -Sync: with trunk r11035:11045.
rubidium
parents:
9701
diff
changeset
|
119 |
previous->SetNext(u); |
9627 | 120 |
u->u.rail.track = v->u.rail.track; |
121 |
u->u.rail.railtype = v->u.rail.railtype; |
|
122 |
u->u.rail.first_engine = v->engine_type; |
|
123 |
||
124 |
u->spritenum = rvi_artic->image_index; |
|
125 |
u->cargo_type = rvi_artic->cargo_type; |
|
126 |
u->cargo_cap = rvi_artic->capacity; |
|
127 |
||
128 |
SetArticulatedPart(u); |
|
129 |
} break; |
|
130 |
||
131 |
case VEH_ROAD: { |
|
132 |
const RoadVehicleInfo *rvi_artic = RoadVehInfo(engine_type); |
|
133 |
||
134 |
u = new (u) RoadVehicle(); |
|
9703
d2a6acdbd665
(svn r11146) [NoAI] -Sync: with trunk r11035:11045.
rubidium
parents:
9701
diff
changeset
|
135 |
previous->SetNext(u); |
9627 | 136 |
u->u.road.first_engine = v->engine_type; |
137 |
u->u.road.cached_veh_length = GetRoadVehLength(u); |
|
138 |
u->u.road.state = RVSB_IN_DEPOT; |
|
139 |
||
140 |
u->u.road.roadtype = v->u.road.roadtype; |
|
141 |
u->u.road.compatible_roadtypes = v->u.road.compatible_roadtypes; |
|
142 |
||
143 |
u->spritenum = rvi_artic->image_index; |
|
144 |
u->cargo_type = rvi_artic->cargo_type; |
|
145 |
u->cargo_cap = rvi_artic->capacity; |
|
146 |
||
147 |
SetRoadVehArticPart(u); |
|
148 |
} break; |
|
149 |
} |
|
150 |
||
151 |
if (flip_image) u->spritenum++; |
|
152 |
||
9625 | 153 |
VehiclePositionChanged(u); |
154 |
} |
|
155 |
} |