author | bjarni |
Sat, 22 Jan 2005 23:55:45 +0000 | |
changeset 1099 | ad7522bd5c1c |
parent 1093 | 4fdc46eaf423 |
child 1109 | ecb98f43ba2c |
permissions | -rw-r--r-- |
0 | 1 |
#include "stdafx.h" |
2 |
#include "ttd.h" |
|
507
04b5403aaf6b
(svn r815) Include strings.h only in the files which need it.
tron
parents:
445
diff
changeset
|
3 |
#include "table/strings.h" |
679
04ca2cd69420
(svn r1117) Move map arrays and some related macros into their own files map.c and map.h
tron
parents:
593
diff
changeset
|
4 |
#include "map.h" |
0 | 5 |
#include "vehicle.h" |
6 |
#include "gfx.h" |
|
7 |
#include "viewport.h" |
|
8 |
#include "news.h" |
|
9 |
#include "command.h" |
|
10 |
#include "saveload.h" |
|
11 |
#include "player.h" |
|
12 |
#include "engine.h" |
|
337
cbe0c766c947
(svn r513) Merge revisions 402, 416, 417, 478, 479, 511, 512 from map to trunk
tron
parents:
260
diff
changeset
|
13 |
#include "sound.h" |
0 | 14 |
|
15 |
#define INVALID_COORD (-0x8000) |
|
16 |
#define GEN_HASH(x,y) (((x & 0x1F80)>>7) + ((y & 0xFC0))) |
|
17 |
||
919
544f374ee392
(svn r1407) -Codechange: changed a lot around _stations, _vehicles, _towns and _industries
truelight
parents:
915
diff
changeset
|
18 |
enum { |
544f374ee392
(svn r1407) -Codechange: changed a lot around _stations, _vehicles, _towns and _industries
truelight
parents:
915
diff
changeset
|
19 |
VEHICLES_MIN_FREE_FOR_AI = 90 |
544f374ee392
(svn r1407) -Codechange: changed a lot around _stations, _vehicles, _towns and _industries
truelight
parents:
915
diff
changeset
|
20 |
}; |
544f374ee392
(svn r1407) -Codechange: changed a lot around _stations, _vehicles, _towns and _industries
truelight
parents:
915
diff
changeset
|
21 |
|
578
1e66514eb621
(svn r998) now vehicles are serviced both when entering and when leaving depots to prevent that vehicles might need service when leaving after a long stay (ln--)
bjarni
parents:
577
diff
changeset
|
22 |
void VehicleServiceInDepot(Vehicle *v) |
1e66514eb621
(svn r998) now vehicles are serviced both when entering and when leaving depots to prevent that vehicles might need service when leaving after a long stay (ln--)
bjarni
parents:
577
diff
changeset
|
23 |
{ |
1e66514eb621
(svn r998) now vehicles are serviced both when entering and when leaving depots to prevent that vehicles might need service when leaving after a long stay (ln--)
bjarni
parents:
577
diff
changeset
|
24 |
v->date_of_last_service = _date; |
1e66514eb621
(svn r998) now vehicles are serviced both when entering and when leaving depots to prevent that vehicles might need service when leaving after a long stay (ln--)
bjarni
parents:
577
diff
changeset
|
25 |
v->breakdowns_since_last_service = 0; |
1e66514eb621
(svn r998) now vehicles are serviced both when entering and when leaving depots to prevent that vehicles might need service when leaving after a long stay (ln--)
bjarni
parents:
577
diff
changeset
|
26 |
v->reliability = _engines[v->engine_type].reliability; |
1e66514eb621
(svn r998) now vehicles are serviced both when entering and when leaving depots to prevent that vehicles might need service when leaving after a long stay (ln--)
bjarni
parents:
577
diff
changeset
|
27 |
} |
0 | 28 |
|
593 | 29 |
bool VehicleNeedsService(const Vehicle *v) |
30 |
{ |
|
1037
4fbbb01cf87b
(svn r1538) -Feature: [988816] Disable servicing when breakdowns set to none (jaguar7)
darkvater
parents:
1035
diff
changeset
|
31 |
if (_patches.no_servicing_if_no_breakdowns && _opt.diff.vehicle_breakdowns == 0) |
4fbbb01cf87b
(svn r1538) -Feature: [988816] Disable servicing when breakdowns set to none (jaguar7)
darkvater
parents:
1035
diff
changeset
|
32 |
return false; |
4fbbb01cf87b
(svn r1538) -Feature: [988816] Disable servicing when breakdowns set to none (jaguar7)
darkvater
parents:
1035
diff
changeset
|
33 |
|
812
65ecc321b3db
(svn r1283) -Add: AutoRenew is now a client-side patch instead of a game-side patch
truelight
parents:
755
diff
changeset
|
34 |
return _patches.servint_ispercent ? |
65ecc321b3db
(svn r1283) -Add: AutoRenew is now a client-side patch instead of a game-side patch
truelight
parents:
755
diff
changeset
|
35 |
(v->reliability < _engines[v->engine_type].reliability * (100 - v->service_interval) / 100) : |
593 | 36 |
(v->date_of_last_service + v->service_interval < _date); |
37 |
} |
|
38 |
||
0 | 39 |
void VehicleInTheWayErrMsg(Vehicle *v) |
40 |
{ |
|
41 |
StringID id; |
|
42 |
||
43 |
(id = STR_8803_TRAIN_IN_THE_WAY,v->type == VEH_Train) || |
|
44 |
(id = STR_9000_ROAD_VEHICLE_IN_THE_WAY,v->type == VEH_Road) || |
|
45 |
(id = STR_A015_AIRCRAFT_IN_THE_WAY,v->type == VEH_Aircraft) || |
|
46 |
(id = STR_980E_SHIP_IN_THE_WAY, true); |
|
47 |
||
48 |
_error_message = id; |
|
49 |
} |
|
50 |
||
51 |
static void *EnsureNoVehicleProc(Vehicle *v, void *data) |
|
52 |
{ |
|
537
901bd4c077f0
(svn r909) Small cleanup in vehicle.c, this should fix some warnings on 64bit machines
tron
parents:
534
diff
changeset
|
53 |
if (v->tile != *(const TileIndex*)data || v->type == VEH_Disaster) |
0 | 54 |
return NULL; |
193
0a7025304867
(svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents:
164
diff
changeset
|
55 |
|
0a7025304867
(svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents:
164
diff
changeset
|
56 |
VehicleInTheWayErrMsg(v); |
537
901bd4c077f0
(svn r909) Small cleanup in vehicle.c, this should fix some warnings on 64bit machines
tron
parents:
534
diff
changeset
|
57 |
return v; |
193
0a7025304867
(svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents:
164
diff
changeset
|
58 |
} |
0 | 59 |
|
60 |
bool EnsureNoVehicle(TileIndex tile) |
|
61 |
{ |
|
537
901bd4c077f0
(svn r909) Small cleanup in vehicle.c, this should fix some warnings on 64bit machines
tron
parents:
534
diff
changeset
|
62 |
return VehicleFromPos(tile, &tile, EnsureNoVehicleProc) == NULL; |
0 | 63 |
} |
64 |
||
65 |
static void *EnsureNoVehicleProcZ(Vehicle *v, void *data) |
|
66 |
{ |
|
537
901bd4c077f0
(svn r909) Small cleanup in vehicle.c, this should fix some warnings on 64bit machines
tron
parents:
534
diff
changeset
|
67 |
const TileInfo *ti = data; |
901bd4c077f0
(svn r909) Small cleanup in vehicle.c, this should fix some warnings on 64bit machines
tron
parents:
534
diff
changeset
|
68 |
|
901bd4c077f0
(svn r909) Small cleanup in vehicle.c, this should fix some warnings on 64bit machines
tron
parents:
534
diff
changeset
|
69 |
if (v->tile != ti->tile || v->z_pos != ti->z || v->type == VEH_Disaster) |
0 | 70 |
return NULL; |
71 |
||
72 |
VehicleInTheWayErrMsg(v); |
|
537
901bd4c077f0
(svn r909) Small cleanup in vehicle.c, this should fix some warnings on 64bit machines
tron
parents:
534
diff
changeset
|
73 |
return v; |
0 | 74 |
} |
75 |
||
1082
a83d7ac6fecb
(svn r1583) -Fix: You should no longer be able to delete bridges on any type of underground when there is a vehicle on it
darkvater
parents:
1068
diff
changeset
|
76 |
static inline uint Correct_Z(uint tileh) |
a83d7ac6fecb
(svn r1583) -Fix: You should no longer be able to delete bridges on any type of underground when there is a vehicle on it
darkvater
parents:
1068
diff
changeset
|
77 |
{ |
a83d7ac6fecb
(svn r1583) -Fix: You should no longer be able to delete bridges on any type of underground when there is a vehicle on it
darkvater
parents:
1068
diff
changeset
|
78 |
// needs z correction for slope-type graphics that have the NORTHERN tile lowered |
a83d7ac6fecb
(svn r1583) -Fix: You should no longer be able to delete bridges on any type of underground when there is a vehicle on it
darkvater
parents:
1068
diff
changeset
|
79 |
// 1, 2, 3, 4, 5, 6 and 7 |
a83d7ac6fecb
(svn r1583) -Fix: You should no longer be able to delete bridges on any type of underground when there is a vehicle on it
darkvater
parents:
1068
diff
changeset
|
80 |
return (CORRECT_Z(tileh)) ? 8 : 0; |
a83d7ac6fecb
(svn r1583) -Fix: You should no longer be able to delete bridges on any type of underground when there is a vehicle on it
darkvater
parents:
1068
diff
changeset
|
81 |
} |
a83d7ac6fecb
(svn r1583) -Fix: You should no longer be able to delete bridges on any type of underground when there is a vehicle on it
darkvater
parents:
1068
diff
changeset
|
82 |
|
a83d7ac6fecb
(svn r1583) -Fix: You should no longer be able to delete bridges on any type of underground when there is a vehicle on it
darkvater
parents:
1068
diff
changeset
|
83 |
uint GetCorrectTileHeight(TileIndex tile) |
a83d7ac6fecb
(svn r1583) -Fix: You should no longer be able to delete bridges on any type of underground when there is a vehicle on it
darkvater
parents:
1068
diff
changeset
|
84 |
{ |
a83d7ac6fecb
(svn r1583) -Fix: You should no longer be able to delete bridges on any type of underground when there is a vehicle on it
darkvater
parents:
1068
diff
changeset
|
85 |
TileInfo ti; |
a83d7ac6fecb
(svn r1583) -Fix: You should no longer be able to delete bridges on any type of underground when there is a vehicle on it
darkvater
parents:
1068
diff
changeset
|
86 |
|
a83d7ac6fecb
(svn r1583) -Fix: You should no longer be able to delete bridges on any type of underground when there is a vehicle on it
darkvater
parents:
1068
diff
changeset
|
87 |
FindLandscapeHeightByTile(&ti, tile); |
a83d7ac6fecb
(svn r1583) -Fix: You should no longer be able to delete bridges on any type of underground when there is a vehicle on it
darkvater
parents:
1068
diff
changeset
|
88 |
return Correct_Z(ti.tileh); |
a83d7ac6fecb
(svn r1583) -Fix: You should no longer be able to delete bridges on any type of underground when there is a vehicle on it
darkvater
parents:
1068
diff
changeset
|
89 |
} |
a83d7ac6fecb
(svn r1583) -Fix: You should no longer be able to delete bridges on any type of underground when there is a vehicle on it
darkvater
parents:
1068
diff
changeset
|
90 |
|
0 | 91 |
bool EnsureNoVehicleZ(TileIndex tile, byte z) |
92 |
{ |
|
93 |
TileInfo ti; |
|
537
901bd4c077f0
(svn r909) Small cleanup in vehicle.c, this should fix some warnings on 64bit machines
tron
parents:
534
diff
changeset
|
94 |
|
0 | 95 |
FindLandscapeHeightByTile(&ti, tile); |
1082
a83d7ac6fecb
(svn r1583) -Fix: You should no longer be able to delete bridges on any type of underground when there is a vehicle on it
darkvater
parents:
1068
diff
changeset
|
96 |
ti.z = z + Correct_Z(ti.tileh); |
537
901bd4c077f0
(svn r909) Small cleanup in vehicle.c, this should fix some warnings on 64bit machines
tron
parents:
534
diff
changeset
|
97 |
|
901bd4c077f0
(svn r909) Small cleanup in vehicle.c, this should fix some warnings on 64bit machines
tron
parents:
534
diff
changeset
|
98 |
return VehicleFromPos(tile, &ti, EnsureNoVehicleProcZ) == NULL; |
0 | 99 |
} |
100 |
||
101 |
Vehicle *FindVehicleBetween(TileIndex from, TileIndex to, byte z) |
|
102 |
{ |
|
926
a6d140a6a4de
(svn r1414) Move TileIndex, TILE_MASK and GET_TILE_[XY] to map.h and turn the latter into inline functions names Tile[XY]
tron
parents:
924
diff
changeset
|
103 |
int x1 = TileX(from); |
a6d140a6a4de
(svn r1414) Move TileIndex, TILE_MASK and GET_TILE_[XY] to map.h and turn the latter into inline functions names Tile[XY]
tron
parents:
924
diff
changeset
|
104 |
int y1 = TileY(from); |
a6d140a6a4de
(svn r1414) Move TileIndex, TILE_MASK and GET_TILE_[XY] to map.h and turn the latter into inline functions names Tile[XY]
tron
parents:
924
diff
changeset
|
105 |
int x2 = TileX(to); |
a6d140a6a4de
(svn r1414) Move TileIndex, TILE_MASK and GET_TILE_[XY] to map.h and turn the latter into inline functions names Tile[XY]
tron
parents:
924
diff
changeset
|
106 |
int y2 = TileY(to); |
0 | 107 |
Vehicle *veh; |
108 |
||
109 |
/* Make sure x1 < x2 or y1 < y2 */ |
|
110 |
if (x1 > x2 || y1 > y2) { |
|
111 |
intswap(x1,x2); |
|
112 |
intswap(y1,y2); |
|
113 |
} |
|
919
544f374ee392
(svn r1407) -Codechange: changed a lot around _stations, _vehicles, _towns and _industries
truelight
parents:
915
diff
changeset
|
114 |
FOR_ALL_VEHICLES(veh) { |
0 | 115 |
if ((veh->type == VEH_Train || veh->type == VEH_Road) && (z==0xFF || veh->z_pos == z)) { |
116 |
if ((veh->x_pos>>4) >= x1 && (veh->x_pos>>4) <= x2 && |
|
117 |
(veh->y_pos>>4) >= y1 && (veh->y_pos>>4) <= y2) { |
|
118 |
return veh; |
|
119 |
} |
|
120 |
} |
|
121 |
} |
|
122 |
return NULL; |
|
123 |
} |
|
124 |
||
125 |
void VehiclePositionChanged(Vehicle *v) |
|
126 |
{ |
|
127 |
int img = v->cur_image; |
|
128 |
const SpriteDimension *sd; |
|
129 |
Point pt = RemapCoords(v->x_pos + v->x_offs, v->y_pos + v->y_offs, v->z_pos); |
|
130 |
||
131 |
sd = GetSpriteDimension(img); |
|
132 |
||
133 |
pt.x += sd->xoffs; |
|
134 |
pt.y += sd->yoffs; |
|
135 |
||
136 |
UpdateVehiclePosHash(v, pt.x, pt.y); |
|
137 |
||
138 |
v->left_coord = pt.x; |
|
139 |
v->top_coord = pt.y; |
|
140 |
v->right_coord = pt.x + sd->xsize + 2; |
|
141 |
v->bottom_coord = pt.y + sd->ysize + 2; |
|
142 |
} |
|
143 |
||
395
788a9bba0889
(svn r587) -newgrf: Rename all /Checkpoint/i tokens to 'Waypoint's. The name actually makes some sense and is also compatible with TTDPatch (pasky).
darkvater
parents:
337
diff
changeset
|
144 |
void UpdateWaypointSign(Waypoint *cp) |
0 | 145 |
{ |
926
a6d140a6a4de
(svn r1414) Move TileIndex, TILE_MASK and GET_TILE_[XY] to map.h and turn the latter into inline functions names Tile[XY]
tron
parents:
924
diff
changeset
|
146 |
Point pt = RemapCoords2(TileX(cp->xy) * 16, TileY(cp->xy) * 16); |
534
306bc86eb23e
(svn r901) Small step in the process to clean up the DPARAM mess:
tron
parents:
507
diff
changeset
|
147 |
SetDParam(0, cp - _waypoints); |
395
788a9bba0889
(svn r587) -newgrf: Rename all /Checkpoint/i tokens to 'Waypoint's. The name actually makes some sense and is also compatible with TTDPatch (pasky).
darkvater
parents:
337
diff
changeset
|
148 |
UpdateViewportSignPos(&cp->sign, pt.x, pt.y - 0x20, STR_WAYPOINT_VIEWPORT); |
0 | 149 |
} |
150 |
||
395
788a9bba0889
(svn r587) -newgrf: Rename all /Checkpoint/i tokens to 'Waypoint's. The name actually makes some sense and is also compatible with TTDPatch (pasky).
darkvater
parents:
337
diff
changeset
|
151 |
void RedrawWaypointSign(Waypoint *cp) |
0 | 152 |
{ |
153 |
MarkAllViewportsDirty( |
|
154 |
cp->sign.left - 6, |
|
155 |
cp->sign.top, |
|
156 |
cp->sign.left + (cp->sign.width_1 << 2) + 12, |
|
157 |
cp->sign.top + 48); |
|
158 |
} |
|
159 |
||
160 |
// Called after load to update coordinates |
|
1093
4fdc46eaf423
(svn r1594) Convert all undefined parameter lists to (void) and add the appropriate warning flags in the Makefile
tron
parents:
1082
diff
changeset
|
161 |
void AfterLoadVehicles(void) |
0 | 162 |
{ |
163 |
Vehicle *v; |
|
395
788a9bba0889
(svn r587) -newgrf: Rename all /Checkpoint/i tokens to 'Waypoint's. The name actually makes some sense and is also compatible with TTDPatch (pasky).
darkvater
parents:
337
diff
changeset
|
164 |
Waypoint *cp; |
0 | 165 |
|
166 |
FOR_ALL_VEHICLES(v) { |
|
167 |
if (v->type != 0) { |
|
168 |
v->left_coord = INVALID_COORD; |
|
169 |
VehiclePositionChanged(v); |
|
170 |
||
171 |
if (v->type == VEH_Train) { |
|
1067
3ba7987a004e
(svn r1568) made an enum of train subtypes to make the code more readable
bjarni
parents:
1063
diff
changeset
|
172 |
if (v->subtype == TS_Front_Engine) |
0 | 173 |
UpdateTrainAcceleration(v); |
174 |
} |
|
175 |
} |
|
176 |
} |
|
177 |
||
395
788a9bba0889
(svn r587) -newgrf: Rename all /Checkpoint/i tokens to 'Waypoint's. The name actually makes some sense and is also compatible with TTDPatch (pasky).
darkvater
parents:
337
diff
changeset
|
178 |
// update waypoint signs |
788a9bba0889
(svn r587) -newgrf: Rename all /Checkpoint/i tokens to 'Waypoint's. The name actually makes some sense and is also compatible with TTDPatch (pasky).
darkvater
parents:
337
diff
changeset
|
179 |
for(cp=_waypoints; cp != endof(_waypoints); cp++) if (cp->xy) UpdateWaypointSign(cp); |
0 | 180 |
} |
181 |
||
182 |
||
183 |
static Vehicle *InitializeVehicle(Vehicle *v) |
|
184 |
{ |
|
185 |
VehicleID index = v->index; |
|
186 |
memset(v, 0, sizeof(Vehicle)); |
|
187 |
v->index = index; |
|
188 |
||
1024
5e446b5b3ec5
(svn r1525) -Codechange: rewrote the _order_array, now it can be made dynamic.
truelight
parents:
956
diff
changeset
|
189 |
assert(v->orders == NULL); |
0 | 190 |
|
191 |
v->left_coord = INVALID_COORD; |
|
192 |
v->next = NULL; |
|
193 |
v->next_hash = 0xffff; |
|
194 |
v->string_id = 0; |
|
548
440429cbe70d
(svn r948) -Codechange: clearified my last commit a bit more with some comment in the code
truelight
parents:
547
diff
changeset
|
195 |
/* random_bits is used to pick out a random sprite for vehicles |
440429cbe70d
(svn r948) -Codechange: clearified my last commit a bit more with some comment in the code
truelight
parents:
547
diff
changeset
|
196 |
which are technical the same (newgrf stuff). |
440429cbe70d
(svn r948) -Codechange: clearified my last commit a bit more with some comment in the code
truelight
parents:
547
diff
changeset
|
197 |
Because RandomRange() results in desyncs, and because it does |
826 | 198 |
not really matter that one client has other visual vehicles than |
548
440429cbe70d
(svn r948) -Codechange: clearified my last commit a bit more with some comment in the code
truelight
parents:
547
diff
changeset
|
199 |
the other, it can be InteractiveRandomRange() without any problem |
440429cbe70d
(svn r948) -Codechange: clearified my last commit a bit more with some comment in the code
truelight
parents:
547
diff
changeset
|
200 |
*/ |
547 | 201 |
v->random_bits = InteractiveRandomRange(256); |
0 | 202 |
return v; |
203 |
} |
|
204 |
||
1093
4fdc46eaf423
(svn r1594) Convert all undefined parameter lists to (void) and add the appropriate warning flags in the Makefile
tron
parents:
1082
diff
changeset
|
205 |
Vehicle *ForceAllocateSpecialVehicle(void) |
0 | 206 |
{ |
207 |
Vehicle *v; |
|
919
544f374ee392
(svn r1407) -Codechange: changed a lot around _stations, _vehicles, _towns and _industries
truelight
parents:
915
diff
changeset
|
208 |
FOR_ALL_VEHICLES_FROM(v, NUM_NORMAL_VEHICLES) { |
0 | 209 |
if (v->type == 0) |
210 |
return InitializeVehicle(v); |
|
211 |
} |
|
212 |
return NULL; |
|
213 |
||
214 |
} |
|
215 |
||
1093
4fdc46eaf423
(svn r1594) Convert all undefined parameter lists to (void) and add the appropriate warning flags in the Makefile
tron
parents:
1082
diff
changeset
|
216 |
Vehicle *ForceAllocateVehicle(void) |
0 | 217 |
{ |
218 |
Vehicle *v; |
|
919
544f374ee392
(svn r1407) -Codechange: changed a lot around _stations, _vehicles, _towns and _industries
truelight
parents:
915
diff
changeset
|
219 |
FOR_ALL_VEHICLES(v) { |
544f374ee392
(svn r1407) -Codechange: changed a lot around _stations, _vehicles, _towns and _industries
truelight
parents:
915
diff
changeset
|
220 |
if (v->index >= NUM_NORMAL_VEHICLES) |
544f374ee392
(svn r1407) -Codechange: changed a lot around _stations, _vehicles, _towns and _industries
truelight
parents:
915
diff
changeset
|
221 |
return NULL; |
544f374ee392
(svn r1407) -Codechange: changed a lot around _stations, _vehicles, _towns and _industries
truelight
parents:
915
diff
changeset
|
222 |
|
0 | 223 |
if (v->type == 0) |
224 |
return InitializeVehicle(v); |
|
225 |
} |
|
226 |
return NULL; |
|
227 |
} |
|
228 |
||
1093
4fdc46eaf423
(svn r1594) Convert all undefined parameter lists to (void) and add the appropriate warning flags in the Makefile
tron
parents:
1082
diff
changeset
|
229 |
Vehicle *AllocateVehicle(void) |
0 | 230 |
{ |
231 |
Vehicle *v; |
|
232 |
int num; |
|
233 |
||
234 |
if (IS_HUMAN_PLAYER(_current_player)) { |
|
235 |
num = 0; |
|
236 |
||
919
544f374ee392
(svn r1407) -Codechange: changed a lot around _stations, _vehicles, _towns and _industries
truelight
parents:
915
diff
changeset
|
237 |
FOR_ALL_VEHICLES(v) { |
544f374ee392
(svn r1407) -Codechange: changed a lot around _stations, _vehicles, _towns and _industries
truelight
parents:
915
diff
changeset
|
238 |
if (v->index >= NUM_NORMAL_VEHICLES) |
544f374ee392
(svn r1407) -Codechange: changed a lot around _stations, _vehicles, _towns and _industries
truelight
parents:
915
diff
changeset
|
239 |
break; |
544f374ee392
(svn r1407) -Codechange: changed a lot around _stations, _vehicles, _towns and _industries
truelight
parents:
915
diff
changeset
|
240 |
|
0 | 241 |
if (v->type == 0) |
242 |
num++; |
|
243 |
} |
|
244 |
||
919
544f374ee392
(svn r1407) -Codechange: changed a lot around _stations, _vehicles, _towns and _industries
truelight
parents:
915
diff
changeset
|
245 |
if (num <= VEHICLES_MIN_FREE_FOR_AI) |
0 | 246 |
return NULL; |
247 |
} |
|
248 |
||
249 |
return ForceAllocateVehicle(); |
|
250 |
} |
|
251 |
||
252 |
void *VehicleFromPos(TileIndex tile, void *data, VehicleFromPosProc *proc) |
|
253 |
{ |
|
254 |
int x,y,x2,y2; |
|
255 |
VehicleID veh; |
|
926
a6d140a6a4de
(svn r1414) Move TileIndex, TILE_MASK and GET_TILE_[XY] to map.h and turn the latter into inline functions names Tile[XY]
tron
parents:
924
diff
changeset
|
256 |
Point pt = RemapCoords(TileX(tile) * 16, TileY(tile) * 16, 0); |
0 | 257 |
|
258 |
x2 = ((pt.x + 104) & 0x1F80) >> 7; |
|
259 |
x = ((pt.x - 174) & 0x1F80) >> 7; |
|
260 |
||
261 |
y2 = ((pt.y + 56) & 0xFC0); |
|
262 |
y = ((pt.y - 294) & 0xFC0); |
|
263 |
||
264 |
for(;;) { |
|
265 |
int xb = x; |
|
266 |
for(;;) { |
|
267 |
veh = _vehicle_position_hash[ (x+y)&0xFFFF ]; |
|
268 |
while (veh != INVALID_VEHICLE) { |
|
919
544f374ee392
(svn r1407) -Codechange: changed a lot around _stations, _vehicles, _towns and _industries
truelight
parents:
915
diff
changeset
|
269 |
Vehicle *v = GetVehicle(veh); |
0 | 270 |
void *a; |
193
0a7025304867
(svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents:
164
diff
changeset
|
271 |
|
0 | 272 |
if ((a = proc(v, data)) != NULL) |
273 |
return a; |
|
274 |
veh = v->next_hash; |
|
275 |
} |
|
276 |
||
277 |
if (x == x2) |
|
278 |
break; |
|
279 |
||
280 |
x = (x + 1) & 0x3F; |
|
281 |
} |
|
282 |
x = xb; |
|
283 |
||
284 |
if (y == y2) |
|
285 |
break; |
|
286 |
||
287 |
y = (y + 0x40) & ((0x3F) << 6); |
|
288 |
} |
|
289 |
return NULL; |
|
290 |
} |
|
291 |
||
292 |
||
293 |
||
294 |
void UpdateVehiclePosHash(Vehicle *v, int x, int y) |
|
295 |
{ |
|
296 |
VehicleID *old_hash, *new_hash; |
|
297 |
int old_x = v->left_coord; |
|
298 |
int old_y = v->top_coord; |
|
299 |
Vehicle *u; |
|
300 |
||
301 |
new_hash = (x == INVALID_COORD) ? NULL : &_vehicle_position_hash[GEN_HASH(x,y)]; |
|
302 |
old_hash = (old_x == INVALID_COORD) ? NULL : &_vehicle_position_hash[GEN_HASH(old_x, old_y)]; |
|
193
0a7025304867
(svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents:
164
diff
changeset
|
303 |
|
0 | 304 |
if (old_hash == new_hash) |
305 |
return; |
|
306 |
||
307 |
/* remove from hash table? */ |
|
308 |
if (old_hash != NULL) { |
|
309 |
Vehicle *last = NULL; |
|
310 |
int idx = *old_hash; |
|
919
544f374ee392
(svn r1407) -Codechange: changed a lot around _stations, _vehicles, _towns and _industries
truelight
parents:
915
diff
changeset
|
311 |
while ((u = GetVehicle(idx)) != v) { |
0 | 312 |
idx = u->next_hash; |
313 |
assert(idx != INVALID_VEHICLE); |
|
314 |
last = u; |
|
315 |
} |
|
316 |
||
317 |
if (last == NULL) |
|
318 |
*old_hash = v->next_hash; |
|
319 |
else |
|
320 |
last->next_hash = v->next_hash; |
|
321 |
} |
|
322 |
||
323 |
/* insert into hash table? */ |
|
324 |
if (new_hash != NULL) { |
|
325 |
v->next_hash = *new_hash; |
|
326 |
*new_hash = v->index; |
|
327 |
} |
|
328 |
} |
|
329 |
||
1093
4fdc46eaf423
(svn r1594) Convert all undefined parameter lists to (void) and add the appropriate warning flags in the Makefile
tron
parents:
1082
diff
changeset
|
330 |
void InitializeVehicles(void) |
0 | 331 |
{ |
332 |
Vehicle *v; |
|
333 |
int i; |
|
334 |
||
335 |
// clear it... |
|
919
544f374ee392
(svn r1407) -Codechange: changed a lot around _stations, _vehicles, _towns and _industries
truelight
parents:
915
diff
changeset
|
336 |
memset(&_vehicles, 0, sizeof(_vehicles[0]) * _vehicles_size); |
395
788a9bba0889
(svn r587) -newgrf: Rename all /Checkpoint/i tokens to 'Waypoint's. The name actually makes some sense and is also compatible with TTDPatch (pasky).
darkvater
parents:
337
diff
changeset
|
337 |
memset(&_waypoints, 0, sizeof(_waypoints)); |
0 | 338 |
memset(&_depots, 0, sizeof(_depots)); |
193
0a7025304867
(svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents:
164
diff
changeset
|
339 |
|
0 | 340 |
// setup indexes.. |
341 |
i = 0; |
|
342 |
FOR_ALL_VEHICLES(v) |
|
343 |
v->index = i++; |
|
344 |
||
345 |
memset(_vehicle_position_hash, -1, sizeof(_vehicle_position_hash)); |
|
346 |
} |
|
347 |
||
348 |
Vehicle *GetLastVehicleInChain(Vehicle *v) |
|
349 |
{ |
|
350 |
while (v->next != NULL) v = v->next; |
|
351 |
return v; |
|
352 |
} |
|
353 |
||
354 |
Vehicle *GetPrevVehicleInChain(Vehicle *v) |
|
355 |
{ |
|
356 |
Vehicle *org = v; |
|
357 |
||
919
544f374ee392
(svn r1407) -Codechange: changed a lot around _stations, _vehicles, _towns and _industries
truelight
parents:
915
diff
changeset
|
358 |
FOR_ALL_VEHICLES(v) { |
544f374ee392
(svn r1407) -Codechange: changed a lot around _stations, _vehicles, _towns and _industries
truelight
parents:
915
diff
changeset
|
359 |
if (v->type == VEH_Train && org == v->next) |
544f374ee392
(svn r1407) -Codechange: changed a lot around _stations, _vehicles, _towns and _industries
truelight
parents:
915
diff
changeset
|
360 |
return v; |
0 | 361 |
} |
362 |
||
919
544f374ee392
(svn r1407) -Codechange: changed a lot around _stations, _vehicles, _towns and _industries
truelight
parents:
915
diff
changeset
|
363 |
return NULL; |
0 | 364 |
} |
365 |
||
366 |
Vehicle *GetFirstVehicleInChain(Vehicle *v) |
|
367 |
{ |
|
919
544f374ee392
(svn r1407) -Codechange: changed a lot around _stations, _vehicles, _towns and _industries
truelight
parents:
915
diff
changeset
|
368 |
Vehicle *u; |
544f374ee392
(svn r1407) -Codechange: changed a lot around _stations, _vehicles, _towns and _industries
truelight
parents:
915
diff
changeset
|
369 |
|
544f374ee392
(svn r1407) -Codechange: changed a lot around _stations, _vehicles, _towns and _industries
truelight
parents:
915
diff
changeset
|
370 |
while (true) { |
544f374ee392
(svn r1407) -Codechange: changed a lot around _stations, _vehicles, _towns and _industries
truelight
parents:
915
diff
changeset
|
371 |
u = v; |
544f374ee392
(svn r1407) -Codechange: changed a lot around _stations, _vehicles, _towns and _industries
truelight
parents:
915
diff
changeset
|
372 |
v = GetPrevVehicleInChain(v); |
544f374ee392
(svn r1407) -Codechange: changed a lot around _stations, _vehicles, _towns and _industries
truelight
parents:
915
diff
changeset
|
373 |
/* If there is no such vehicle, |
544f374ee392
(svn r1407) -Codechange: changed a lot around _stations, _vehicles, _towns and _industries
truelight
parents:
915
diff
changeset
|
374 |
'v' == NULL and so 'u' is the first vehicle in chain */ |
544f374ee392
(svn r1407) -Codechange: changed a lot around _stations, _vehicles, _towns and _industries
truelight
parents:
915
diff
changeset
|
375 |
if (v == NULL) |
544f374ee392
(svn r1407) -Codechange: changed a lot around _stations, _vehicles, _towns and _industries
truelight
parents:
915
diff
changeset
|
376 |
return u; |
193
0a7025304867
(svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents:
164
diff
changeset
|
377 |
} |
0 | 378 |
} |
379 |
||
380 |
int CountVehiclesInChain(Vehicle *v) |
|
381 |
{ |
|
382 |
int count = 0; |
|
383 |
do count++; while ( (v=v->next) != NULL); |
|
384 |
return count; |
|
385 |
} |
|
386 |
||
387 |
||
1093
4fdc46eaf423
(svn r1594) Convert all undefined parameter lists to (void) and add the appropriate warning flags in the Makefile
tron
parents:
1082
diff
changeset
|
388 |
Depot *AllocateDepot(void) |
0 | 389 |
{ |
390 |
Depot *dep, *free_dep = NULL; |
|
391 |
int num_free = 0; |
|
392 |
||
393 |
for(dep = _depots; dep != endof(_depots); dep++) { |
|
394 |
if (dep->xy == 0) { |
|
395 |
num_free++; |
|
396 |
if (free_dep==NULL) |
|
397 |
free_dep = dep; |
|
398 |
} |
|
399 |
} |
|
400 |
||
193
0a7025304867
(svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents:
164
diff
changeset
|
401 |
if (free_dep == NULL || |
0 | 402 |
(num_free < 30 && IS_HUMAN_PLAYER(_current_player))) { |
403 |
_error_message = STR_1009_TOO_MANY_DEPOTS; |
|
404 |
return NULL; |
|
405 |
} |
|
406 |
||
193
0a7025304867
(svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents:
164
diff
changeset
|
407 |
return free_dep; |
0 | 408 |
} |
409 |
||
1093
4fdc46eaf423
(svn r1594) Convert all undefined parameter lists to (void) and add the appropriate warning flags in the Makefile
tron
parents:
1082
diff
changeset
|
410 |
Waypoint *AllocateWaypoint(void) |
0 | 411 |
{ |
395
788a9bba0889
(svn r587) -newgrf: Rename all /Checkpoint/i tokens to 'Waypoint's. The name actually makes some sense and is also compatible with TTDPatch (pasky).
darkvater
parents:
337
diff
changeset
|
412 |
Waypoint *cp; |
0 | 413 |
|
395
788a9bba0889
(svn r587) -newgrf: Rename all /Checkpoint/i tokens to 'Waypoint's. The name actually makes some sense and is also compatible with TTDPatch (pasky).
darkvater
parents:
337
diff
changeset
|
414 |
for(cp = _waypoints; cp != endof(_waypoints); cp++) { |
0 | 415 |
if (cp->xy == 0) |
416 |
return cp; |
|
417 |
} |
|
418 |
||
419 |
return NULL; |
|
420 |
} |
|
421 |
||
395
788a9bba0889
(svn r587) -newgrf: Rename all /Checkpoint/i tokens to 'Waypoint's. The name actually makes some sense and is also compatible with TTDPatch (pasky).
darkvater
parents:
337
diff
changeset
|
422 |
uint GetWaypointByTile(uint tile) |
0 | 423 |
{ |
395
788a9bba0889
(svn r587) -newgrf: Rename all /Checkpoint/i tokens to 'Waypoint's. The name actually makes some sense and is also compatible with TTDPatch (pasky).
darkvater
parents:
337
diff
changeset
|
424 |
Waypoint *cp; |
0 | 425 |
int i=0; |
395
788a9bba0889
(svn r587) -newgrf: Rename all /Checkpoint/i tokens to 'Waypoint's. The name actually makes some sense and is also compatible with TTDPatch (pasky).
darkvater
parents:
337
diff
changeset
|
426 |
for(cp=_waypoints; cp->xy != (TileIndex)tile; cp++) { i++; } |
0 | 427 |
return i; |
428 |
} |
|
429 |
||
430 |
void DoDeleteDepot(uint tile) |
|
431 |
{ |
|
555
02df8a1b7f33
(svn r955) Replace uint16 for orders with struct Order
tron
parents:
548
diff
changeset
|
432 |
Order order; |
0 | 433 |
byte dep_index; |
434 |
Depot *d; |
|
435 |
||
436 |
// Clear it |
|
437 |
DoClearSquare(tile); |
|
438 |
||
439 |
// Nullify the depot struct |
|
440 |
for(d=_depots,dep_index=0; d->xy != (TileIndex)tile; d++) {dep_index++;} |
|
441 |
d->xy = 0; |
|
442 |
||
555
02df8a1b7f33
(svn r955) Replace uint16 for orders with struct Order
tron
parents:
548
diff
changeset
|
443 |
order.type = OT_GOTO_DEPOT; |
02df8a1b7f33
(svn r955) Replace uint16 for orders with struct Order
tron
parents:
548
diff
changeset
|
444 |
order.station = dep_index; |
1024
5e446b5b3ec5
(svn r1525) -Codechange: rewrote the _order_array, now it can be made dynamic.
truelight
parents:
956
diff
changeset
|
445 |
DeleteDestinationFromVehicleOrder(order); |
0 | 446 |
|
447 |
// Delete the depot |
|
448 |
DeleteWindowById(WC_VEHICLE_DEPOT, tile); |
|
449 |
} |
|
450 |
||
451 |
void DeleteVehicle(Vehicle *v) |
|
452 |
{ |
|
453 |
DeleteName(v->string_id); |
|
454 |
v->type = 0; |
|
455 |
UpdateVehiclePosHash(v, INVALID_COORD, 0); |
|
456 |
v->next_hash = 0xffff; |
|
457 |
||
1024
5e446b5b3ec5
(svn r1525) -Codechange: rewrote the _order_array, now it can be made dynamic.
truelight
parents:
956
diff
changeset
|
458 |
if (v->orders != NULL) |
5e446b5b3ec5
(svn r1525) -Codechange: rewrote the _order_array, now it can be made dynamic.
truelight
parents:
956
diff
changeset
|
459 |
DeleteVehicleOrders(v); |
0 | 460 |
} |
461 |
||
462 |
void DeleteVehicleChain(Vehicle *v) |
|
463 |
{ |
|
464 |
do { |
|
465 |
Vehicle *u = v; |
|
466 |
v = v->next; |
|
467 |
DeleteVehicle(u); |
|
468 |
} while (v); |
|
469 |
} |
|
470 |
||
471 |
||
472 |
void Aircraft_Tick(Vehicle *v); |
|
473 |
void RoadVeh_Tick(Vehicle *v); |
|
474 |
void Ship_Tick(Vehicle *v); |
|
475 |
void Train_Tick(Vehicle *v); |
|
410 | 476 |
static void EffectVehicle_Tick(Vehicle *v); |
0 | 477 |
void DisasterVehicle_Tick(Vehicle *v); |
478 |
||
479 |
VehicleTickProc *_vehicle_tick_procs[] = { |
|
480 |
Train_Tick, |
|
481 |
RoadVeh_Tick, |
|
482 |
Ship_Tick, |
|
483 |
Aircraft_Tick, |
|
484 |
EffectVehicle_Tick, |
|
485 |
DisasterVehicle_Tick, |
|
486 |
}; |
|
487 |
||
1093
4fdc46eaf423
(svn r1594) Convert all undefined parameter lists to (void) and add the appropriate warning flags in the Makefile
tron
parents:
1082
diff
changeset
|
488 |
void CallVehicleTicks(void) |
0 | 489 |
{ |
490 |
Vehicle *v; |
|
491 |
||
492 |
FOR_ALL_VEHICLES(v) { |
|
493 |
if (v->type != 0) |
|
494 |
_vehicle_tick_procs[v->type - 0x10](v); |
|
495 |
} |
|
496 |
} |
|
497 |
||
498 |
static bool CanFillVehicle_FullLoadAny(Vehicle *v) |
|
499 |
{ |
|
500 |
uint32 full = 0, not_full = 0; |
|
193
0a7025304867
(svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents:
164
diff
changeset
|
501 |
|
924
6fbd4419db2a
(svn r1412) -Feature/Fix: Aircraft refit options have been restricted to "sane"
celestar
parents:
922
diff
changeset
|
502 |
//special handling of aircraft |
941
d271102b3010
(svn r1429) Change: bumped savegame to revision 5.
truelight
parents:
939
diff
changeset
|
503 |
|
924
6fbd4419db2a
(svn r1412) -Feature/Fix: Aircraft refit options have been restricted to "sane"
celestar
parents:
922
diff
changeset
|
504 |
//if the aircraft carries passengers and is NOT full, then |
6fbd4419db2a
(svn r1412) -Feature/Fix: Aircraft refit options have been restricted to "sane"
celestar
parents:
922
diff
changeset
|
505 |
//continue loading, no matter how much mail is in |
6fbd4419db2a
(svn r1412) -Feature/Fix: Aircraft refit options have been restricted to "sane"
celestar
parents:
922
diff
changeset
|
506 |
if ((v->type == VEH_Aircraft) && (v->cargo_type == CT_PASSENGERS) && (v->cargo_cap != v->cargo_count)) { |
6fbd4419db2a
(svn r1412) -Feature/Fix: Aircraft refit options have been restricted to "sane"
celestar
parents:
922
diff
changeset
|
507 |
return true; |
6fbd4419db2a
(svn r1412) -Feature/Fix: Aircraft refit options have been restricted to "sane"
celestar
parents:
922
diff
changeset
|
508 |
} |
6fbd4419db2a
(svn r1412) -Feature/Fix: Aircraft refit options have been restricted to "sane"
celestar
parents:
922
diff
changeset
|
509 |
|
0 | 510 |
// patch should return "true" to continue loading, i.e. when there is no cargo type that is fully loaded. |
511 |
do { |
|
512 |
//Should never happen, but just in case future additions change this |
|
513 |
assert(v->cargo_type<32); |
|
514 |
||
515 |
if (v->cargo_cap != 0) { |
|
516 |
uint32 mask = 1 << v->cargo_type; |
|
517 |
if (v->cargo_cap == v->cargo_count) full |= mask; else not_full |= mask; |
|
518 |
} |
|
519 |
} while ( (v=v->next) != NULL); |
|
520 |
||
521 |
// continue loading if there is a non full cargo type and no cargo type that is full |
|
522 |
return not_full && (full & ~not_full) == 0; |
|
523 |
} |
|
524 |
||
525 |
bool CanFillVehicle(Vehicle *v) |
|
526 |
{ |
|
1058
e522c5d6ff69
(svn r1559) Use IsTileType() instead of bit shifting and comparisons
tron
parents:
1037
diff
changeset
|
527 |
TileIndex tile = v->tile; |
0 | 528 |
|
1058
e522c5d6ff69
(svn r1559) Use IsTileType() instead of bit shifting and comparisons
tron
parents:
1037
diff
changeset
|
529 |
if (IsTileType(tile, MP_STATION) || |
e522c5d6ff69
(svn r1559) Use IsTileType() instead of bit shifting and comparisons
tron
parents:
1037
diff
changeset
|
530 |
(v->type == VEH_Ship && ( |
e522c5d6ff69
(svn r1559) Use IsTileType() instead of bit shifting and comparisons
tron
parents:
1037
diff
changeset
|
531 |
IsTileType(TILE_ADDXY(tile, 1, 0), MP_STATION) || |
e522c5d6ff69
(svn r1559) Use IsTileType() instead of bit shifting and comparisons
tron
parents:
1037
diff
changeset
|
532 |
IsTileType(TILE_ADDXY(tile, -1, 0), MP_STATION) || |
e522c5d6ff69
(svn r1559) Use IsTileType() instead of bit shifting and comparisons
tron
parents:
1037
diff
changeset
|
533 |
IsTileType(TILE_ADDXY(tile, 0, 1), MP_STATION) || |
e522c5d6ff69
(svn r1559) Use IsTileType() instead of bit shifting and comparisons
tron
parents:
1037
diff
changeset
|
534 |
IsTileType(TILE_ADDXY(tile, 0, -1), MP_STATION) || |
e522c5d6ff69
(svn r1559) Use IsTileType() instead of bit shifting and comparisons
tron
parents:
1037
diff
changeset
|
535 |
IsTileType(TILE_ADDXY(tile, -2, 0), MP_STATION) |
e522c5d6ff69
(svn r1559) Use IsTileType() instead of bit shifting and comparisons
tron
parents:
1037
diff
changeset
|
536 |
))) { |
0 | 537 |
|
538 |
// If patch is active, use alternative CanFillVehicle-function |
|
539 |
if (_patches.full_load_any) |
|
540 |
return CanFillVehicle_FullLoadAny(v); |
|
541 |
||
542 |
do { |
|
543 |
if (v->cargo_count != v->cargo_cap) |
|
544 |
return true; |
|
545 |
} while ( (v=v->next) != NULL); |
|
546 |
} |
|
547 |
return false; |
|
548 |
} |
|
549 |
||
550 |
static void DoDrawVehicle(Vehicle *v) |
|
551 |
{ |
|
552 |
uint32 image = v->cur_image; |
|
193
0a7025304867
(svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents:
164
diff
changeset
|
553 |
|
0 | 554 |
if (v->vehstatus & VS_DISASTER) { |
555 |
image |= 0x3224000; |
|
556 |
} else if (v->vehstatus & VS_DEFPAL) { |
|
557 |
image |= (v->vehstatus & VS_CRASHED) ? 0x3248000 : SPRITE_PALETTE(PLAYER_SPRITE_COLOR(v->owner)); |
|
193
0a7025304867
(svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents:
164
diff
changeset
|
558 |
} |
0 | 559 |
|
193
0a7025304867
(svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents:
164
diff
changeset
|
560 |
AddSortableSpriteToDraw(image, v->x_pos + v->x_offs, v->y_pos + v->y_offs, |
0 | 561 |
v->sprite_width, v->sprite_height, v->z_height, v->z_pos); |
562 |
} |
|
563 |
||
564 |
void ViewportAddVehicles(DrawPixelInfo *dpi) |
|
565 |
{ |
|
566 |
int x,xb, y, x2, y2; |
|
567 |
VehicleID veh; |
|
568 |
Vehicle *v; |
|
569 |
||
570 |
x = ((dpi->left - 70) & 0x1F80) >> 7; |
|
571 |
x2 = ((dpi->left + dpi->width) & 0x1F80) >> 7; |
|
572 |
||
573 |
y = ((dpi->top - 70) & 0xFC0); |
|
574 |
y2 = ((dpi->top + dpi->height) & 0xFC0); |
|
575 |
||
576 |
for(;;) { |
|
577 |
xb = x; |
|
578 |
for(;;) { |
|
579 |
veh = _vehicle_position_hash[ (x+y)&0xFFFF ]; |
|
580 |
while (veh != INVALID_VEHICLE) { |
|
919
544f374ee392
(svn r1407) -Codechange: changed a lot around _stations, _vehicles, _towns and _industries
truelight
parents:
915
diff
changeset
|
581 |
v = GetVehicle(veh); |
193
0a7025304867
(svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents:
164
diff
changeset
|
582 |
|
0a7025304867
(svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents:
164
diff
changeset
|
583 |
if (!(v->vehstatus & VS_HIDDEN) && |
0 | 584 |
dpi->left <= v->right_coord && |
585 |
dpi->top <= v->bottom_coord && |
|
586 |
dpi->left + dpi->width >= v->left_coord && |
|
193
0a7025304867
(svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents:
164
diff
changeset
|
587 |
dpi->top + dpi->height >= v->top_coord) { |
0 | 588 |
DoDrawVehicle(v); |
589 |
} |
|
590 |
veh = v->next_hash; |
|
591 |
} |
|
592 |
||
593 |
if (x == x2) |
|
594 |
break; |
|
595 |
x = (x + 1) & 0x3F; |
|
596 |
} |
|
597 |
x = xb; |
|
598 |
||
599 |
if (y == y2) |
|
600 |
break; |
|
601 |
y = (y + 0x40) & ((0x3F) << 6); |
|
602 |
} |
|
603 |
} |
|
604 |
||
605 |
static void EffectInit_0(Vehicle *v) |
|
606 |
{ |
|
607 |
uint32 r = Random(); |
|
608 |
v->cur_image = (uint16)((r & 7) + 3701); |
|
609 |
v->progress = (byte)((r >> 16)&7); |
|
610 |
} |
|
611 |
||
612 |
static void EffectTick_0(Vehicle *v) |
|
613 |
{ |
|
614 |
uint tile; |
|
615 |
uint img; |
|
616 |
||
617 |
if (--v->progress & 0x80) { |
|
618 |
BeginVehicleMove(v); |
|
193
0a7025304867
(svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents:
164
diff
changeset
|
619 |
|
0 | 620 |
tile = TILE_FROM_XY(v->x_pos, v->y_pos); |
1035
812f837ee03f
(svn r1536) Move GET_TILEHEIGHT, GET_TILETYPE and IS_TILETYPE to map.h, turn them into inline functions and add some asserts
tron
parents:
1024
diff
changeset
|
621 |
if (!IsTileType(tile, MP_INDUSTRY)) { |
0 | 622 |
EndVehicleMove(v); |
623 |
DeleteVehicle(v); |
|
624 |
return; |
|
625 |
} |
|
626 |
||
627 |
img = v->cur_image + 1; |
|
628 |
if (img > 3708) img = 3701; |
|
629 |
v->cur_image = img; |
|
630 |
v->progress = 7; |
|
631 |
VehiclePositionChanged(v); |
|
632 |
EndVehicleMove(v); |
|
633 |
} |
|
634 |
} |
|
635 |
||
636 |
static void EffectInit_1(Vehicle *v) |
|
637 |
{ |
|
638 |
v->cur_image = 3079; |
|
639 |
v->progress = 12; |
|
640 |
} |
|
641 |
||
642 |
static void EffectTick_1(Vehicle *v) |
|
643 |
{ |
|
644 |
bool moved; |
|
193
0a7025304867
(svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents:
164
diff
changeset
|
645 |
|
0 | 646 |
BeginVehicleMove(v); |
193
0a7025304867
(svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents:
164
diff
changeset
|
647 |
|
0 | 648 |
moved = false; |
193
0a7025304867
(svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents:
164
diff
changeset
|
649 |
|
0 | 650 |
if ((++v->progress & 7) == 0) { |
651 |
v->z_pos++; |
|
652 |
moved = true; |
|
653 |
} |
|
654 |
||
655 |
if ((v->progress & 0xF)==4) { |
|
656 |
if (++v->cur_image > 3083) { |
|
657 |
EndVehicleMove(v); |
|
658 |
DeleteVehicle(v); |
|
659 |
return; |
|
660 |
} |
|
661 |
moved = true; |
|
662 |
} |
|
663 |
||
664 |
if (moved) { |
|
665 |
VehiclePositionChanged(v); |
|
666 |
EndVehicleMove(v); |
|
667 |
} |
|
668 |
} |
|
669 |
||
670 |
static void EffectInit_2(Vehicle *v) |
|
671 |
{ |
|
672 |
v->cur_image = 3073; |
|
673 |
v->progress = 0; |
|
674 |
} |
|
675 |
||
676 |
static void EffectTick_2(Vehicle *v) |
|
677 |
{ |
|
678 |
if ((++v->progress & 3) == 0) { |
|
679 |
BeginVehicleMove(v); |
|
680 |
v->z_pos++; |
|
681 |
VehiclePositionChanged(v); |
|
682 |
EndVehicleMove(v); |
|
683 |
} else if ((v->progress & 7) == 1) { |
|
684 |
BeginVehicleMove(v); |
|
685 |
if (++v->cur_image > 3078) { |
|
686 |
EndVehicleMove(v); |
|
687 |
DeleteVehicle(v); |
|
688 |
} else { |
|
689 |
VehiclePositionChanged(v); |
|
690 |
EndVehicleMove(v); |
|
691 |
} |
|
692 |
} |
|
693 |
} |
|
694 |
||
695 |
static void EffectInit_3(Vehicle *v) |
|
696 |
{ |
|
697 |
v->cur_image = 3084; |
|
698 |
v->progress = 1; |
|
699 |
} |
|
700 |
||
701 |
static void EffectTick_3(Vehicle *v) |
|
702 |
{ |
|
703 |
if (++v->progress > 2) { |
|
704 |
v->progress = 0; |
|
705 |
BeginVehicleMove(v); |
|
706 |
if (++v->cur_image > 3089) { |
|
707 |
EndVehicleMove(v); |
|
708 |
DeleteVehicle(v); |
|
709 |
} else { |
|
710 |
VehiclePositionChanged(v); |
|
711 |
EndVehicleMove(v); |
|
712 |
} |
|
713 |
} |
|
714 |
} |
|
715 |
||
716 |
static void EffectInit_4(Vehicle *v) |
|
717 |
{ |
|
718 |
v->cur_image = 2040; |
|
719 |
v->progress = 12; |
|
720 |
} |
|
721 |
||
722 |
static void EffectTick_4(Vehicle *v) |
|
723 |
{ |
|
724 |
bool moved; |
|
193
0a7025304867
(svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents:
164
diff
changeset
|
725 |
|
0 | 726 |
BeginVehicleMove(v); |
193
0a7025304867
(svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents:
164
diff
changeset
|
727 |
|
0 | 728 |
moved = false; |
193
0a7025304867
(svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents:
164
diff
changeset
|
729 |
|
0 | 730 |
if ((++v->progress & 3) == 0) { |
731 |
v->z_pos++; |
|
732 |
moved = true; |
|
733 |
} |
|
734 |
||
735 |
if ((v->progress & 0xF)==4) { |
|
736 |
if (++v->cur_image > 2044) { |
|
737 |
EndVehicleMove(v); |
|
738 |
DeleteVehicle(v); |
|
739 |
return; |
|
740 |
} |
|
741 |
moved = true; |
|
742 |
} |
|
743 |
||
744 |
if (moved) { |
|
745 |
VehiclePositionChanged(v); |
|
746 |
EndVehicleMove(v); |
|
747 |
} |
|
748 |
} |
|
749 |
||
750 |
static void EffectInit_5(Vehicle *v) |
|
751 |
{ |
|
752 |
v->cur_image = 3709; |
|
753 |
v->progress = 0; |
|
754 |
} |
|
755 |
||
756 |
static void EffectTick_5(Vehicle *v) |
|
757 |
{ |
|
758 |
if (!(++v->progress & 3)) { |
|
759 |
BeginVehicleMove(v); |
|
760 |
if (++v->cur_image > 3724) { |
|
761 |
EndVehicleMove(v); |
|
762 |
DeleteVehicle(v); |
|
763 |
} else { |
|
764 |
VehiclePositionChanged(v); |
|
765 |
EndVehicleMove(v); |
|
766 |
} |
|
767 |
} |
|
768 |
} |
|
769 |
||
770 |
static void EffectInit_6(Vehicle *v) |
|
771 |
{ |
|
772 |
v->cur_image = 3737; |
|
773 |
v->progress = 0; |
|
774 |
} |
|
775 |
||
776 |
static void EffectTick_6(Vehicle *v) |
|
777 |
{ |
|
778 |
if (!(++v->progress & 7)) { |
|
779 |
BeginVehicleMove(v); |
|
780 |
if (++v->cur_image > 3740) v->cur_image = 3737; |
|
781 |
VehiclePositionChanged(v); |
|
782 |
EndVehicleMove(v); |
|
783 |
} |
|
784 |
||
785 |
if (!--v->u.special.unk0) { |
|
786 |
BeginVehicleMove(v); |
|
787 |
EndVehicleMove(v); |
|
788 |
DeleteVehicle(v); |
|
789 |
} |
|
790 |
} |
|
791 |
||
792 |
static void EffectInit_7(Vehicle *v) |
|
793 |
{ |
|
794 |
v->cur_image = 3725; |
|
795 |
v->progress = 0; |
|
796 |
} |
|
797 |
||
798 |
static void EffectTick_7(Vehicle *v) |
|
799 |
{ |
|
800 |
if (!(++v->progress & 3)) { |
|
801 |
BeginVehicleMove(v); |
|
802 |
if (++v->cur_image > 3736) { |
|
803 |
EndVehicleMove(v); |
|
804 |
DeleteVehicle(v); |
|
805 |
} else { |
|
806 |
VehiclePositionChanged(v); |
|
807 |
EndVehicleMove(v); |
|
808 |
} |
|
809 |
} |
|
810 |
} |
|
811 |
||
812 |
static void EffectInit_8(Vehicle *v) |
|
813 |
{ |
|
814 |
v->cur_image = 1416; |
|
815 |
v->progress = 0; |
|
816 |
v->u.special.unk0 = 0; |
|
817 |
v->u.special.unk2 = 0; |
|
818 |
} |
|
819 |
||
820 |
#define MK(imag,dir,dur) (imag<<6)+(dir<<4)+dur |
|
821 |
static const byte _effecttick8_data[] = { |
|
822 |
MK(0,0,4), |
|
823 |
MK(3,3,4), |
|
824 |
MK(2,2,7), |
|
825 |
MK(0,2,7), |
|
826 |
MK(1,1,3), |
|
827 |
MK(2,2,7), |
|
828 |
MK(0,2,7), |
|
829 |
MK(1,1,3), |
|
830 |
MK(2,2,7), |
|
831 |
MK(0,2,7), |
|
832 |
MK(3,3,6), |
|
833 |
MK(2,2,6), |
|
834 |
MK(1,1,7), |
|
835 |
MK(3,1,7), |
|
836 |
MK(0,0,3), |
|
837 |
MK(1,1,7), |
|
838 |
MK(3,1,7), |
|
839 |
MK(0,0,3), |
|
840 |
MK(1,1,7), |
|
841 |
MK(3,1,7), |
|
842 |
255 |
|
843 |
}; |
|
844 |
#undef MK |
|
845 |
||
846 |
static const int8 _xy_inc_by_dir[5] = { |
|
847 |
-1, 0, 1, 0, -1, |
|
848 |
}; |
|
849 |
||
850 |
#define GET_X_INC_BY_DIR(d) _xy_inc_by_dir[d] |
|
851 |
#define GET_Y_INC_BY_DIR(d) _xy_inc_by_dir[(d)+1] |
|
852 |
||
853 |
static void EffectTick_8(Vehicle *v) |
|
854 |
{ |
|
855 |
byte b; |
|
856 |
||
857 |
if (!(++v->progress & 7)) { |
|
858 |
v->u.special.unk2++; |
|
859 |
BeginVehicleMove(v); |
|
860 |
||
861 |
b = _effecttick8_data[v->u.special.unk0]; |
|
862 |
||
863 |
v->cur_image = 0x588 + (b>>6); |
|
864 |
||
865 |
v->x_pos += GET_X_INC_BY_DIR((b>>4)&3); |
|
866 |
v->y_pos += GET_X_INC_BY_DIR((b>>4)&3); |
|
867 |
||
868 |
if (v->u.special.unk2 < (b & 7)) { |
|
869 |
v->u.special.unk2 = 0; |
|
870 |
v->u.special.unk0++; |
|
871 |
if (_effecttick8_data[v->u.special.unk0] == 0xFF) { |
|
872 |
EndVehicleMove(v); |
|
873 |
DeleteVehicle(v); |
|
874 |
return; |
|
875 |
} |
|
876 |
} |
|
877 |
VehiclePositionChanged(v); |
|
878 |
EndVehicleMove(v); |
|
879 |
} |
|
880 |
} |
|
881 |
||
882 |
static void EffectInit_9(Vehicle *v) |
|
883 |
{ |
|
884 |
v->cur_image = 4751; |
|
885 |
v->spritenum = 0; |
|
886 |
v->progress = 0; |
|
887 |
} |
|
888 |
||
889 |
#define MK(x,y,z,i) (x+4)+(y+4)*16,(z+4)+i*16 |
|
890 |
||
891 |
/* -1,0,1,2 = 2*/ |
|
892 |
/* -1,0,1 = 2*/ |
|
893 |
/* */ |
|
894 |
static const byte _effecttick9_data1[] = { |
|
895 |
MK(0,0,1,0), |
|
896 |
MK(1,0,1,1), |
|
897 |
MK(0,0,1,0), |
|
898 |
MK(1,0,1,2), |
|
899 |
0x81, |
|
900 |
}; |
|
901 |
||
902 |
||
903 |
static const byte _effecttick9_data2[] = { |
|
904 |
MK(0,0,1,0), |
|
905 |
MK(-1,0,1,1), |
|
906 |
MK(0,0,1,0), |
|
907 |
MK(-1,0,1,2), |
|
908 |
0x81, |
|
909 |
}; |
|
910 |
||
911 |
static const byte _effecttick9_data3[] = { |
|
912 |
MK(0,0,1,0), |
|
913 |
MK(0,1,1,1), |
|
914 |
MK(0,0,1,0), |
|
915 |
MK(0,1,1,2), |
|
916 |
0x81, |
|
917 |
}; |
|
918 |
||
919 |
static const byte _effecttick9_data4[] = { |
|
920 |
MK(0,0,1,0), |
|
921 |
MK(0,-1,1,1), |
|
922 |
MK(0,0,1,0), |
|
923 |
MK(0,-1,1,2), |
|
924 |
0x81, |
|
925 |
}; |
|
926 |
||
927 |
static const byte _effecttick9_data5[] = { |
|
928 |
MK(0,0,1,2), |
|
929 |
MK(0,0,1,7), |
|
930 |
MK(0,0,1,8), |
|
931 |
MK(0,0,1,9), |
|
932 |
0x80, |
|
933 |
}; |
|
934 |
||
935 |
static const byte _effecttick9_data6[] = { |
|
936 |
MK(0,0,1,0), |
|
937 |
MK(0,0,1,1), |
|
938 |
MK(0,0,1,0), |
|
939 |
MK(0,0,1,2), |
|
940 |
MK(0,0,1,0), |
|
941 |
MK(0,0,1,1), |
|
942 |
MK(0,0,1,0), |
|
943 |
MK(0,0,1,2), |
|
944 |
MK(0,0,1,0), |
|
945 |
MK(0,0,1,1), |
|
946 |
MK(0,0,1,0), |
|
947 |
MK(0,0,1,2), |
|
948 |
MK(0,0,1,0), |
|
949 |
MK(0,0,1,1), |
|
950 |
MK(0,0,1,0), |
|
951 |
MK(0,0,1,2), |
|
952 |
MK(0,0,1,0), |
|
953 |
MK(0,0,1,1), |
|
954 |
MK(0,0,1,0), |
|
955 |
MK(0,0,1,2), |
|
956 |
MK(0,0,1,0), |
|
957 |
MK(0,0,1,1), |
|
958 |
MK(0,0,1,0), |
|
959 |
MK(0,0,1,2), |
|
960 |
MK(0,0,1,0), |
|
961 |
MK(0,0,1,1), |
|
962 |
MK(0,0,1,0), |
|
963 |
MK(0,0,1,2), |
|
964 |
MK(0,0,1,0), |
|
965 |
MK(0,0,1,1), |
|
966 |
MK(0,0,1,0), |
|
967 |
MK(0,0,1,2), |
|
968 |
MK(0,0,1,0), |
|
969 |
MK(0,0,1,1), |
|
970 |
MK(0,0,1,0), |
|
971 |
MK(0,0,1,2), |
|
972 |
MK(0,0,1,0), |
|
973 |
MK(0,0,1,1), |
|
974 |
MK(0,0,1,0), |
|
975 |
MK(0,0,1,2), |
|
976 |
MK(0,0,1,0), |
|
977 |
MK(0,0,1,1), |
|
978 |
MK(0,0,1,0), |
|
979 |
MK(0,0,1,2), |
|
980 |
MK(0,0,1,0), |
|
981 |
MK(0,0,1,1), |
|
982 |
MK(0,0,1,0), |
|
983 |
MK(0,0,1,2), |
|
984 |
MK(0,0,1,0), |
|
985 |
MK(0,0,1,1), |
|
986 |
MK(0,0,1,0), |
|
987 |
MK(0,0,1,2), |
|
988 |
MK(0,0,1,0), |
|
989 |
MK(0,0,1,1), |
|
990 |
MK(0,0,1,0), |
|
991 |
MK(0,0,1,2), |
|
992 |
MK(0,0,1,0), |
|
993 |
MK(0,0,1,1), |
|
994 |
MK(0,0,1,0), |
|
995 |
MK(0,0,1,2), |
|
996 |
MK(0,0,1,0), |
|
997 |
MK(0,0,1,1), |
|
998 |
MK(2,1,3,0), |
|
999 |
MK(1,1,3,1), |
|
1000 |
MK(2,1,3,0), |
|
1001 |
MK(1,1,3,2), |
|
1002 |
MK(2,1,3,0), |
|
1003 |
MK(1,1,3,1), |
|
1004 |
MK(2,1,3,0), |
|
1005 |
MK(1,0,1,2), |
|
1006 |
MK(0,0,1,0), |
|
1007 |
MK(1,0,1,1), |
|
1008 |
MK(0,0,1,0), |
|
1009 |
MK(1,0,1,2), |
|
1010 |
MK(0,0,1,0), |
|
1011 |
MK(1,0,1,1), |
|
1012 |
MK(0,0,1,0), |
|
1013 |
MK(1,0,1,2), |
|
1014 |
0x82,0, |
|
1015 |
MK(0,0,0,0xA), |
|
1016 |
MK(0,0,0,0xB), |
|
1017 |
MK(0,0,0,0xC), |
|
1018 |
MK(0,0,0,0xD), |
|
1019 |
MK(0,0,0,0xE), |
|
1020 |
0x80 |
|
1021 |
}; |
|
1022 |
#undef MK |
|
1023 |
||
1024 |
static const byte * const _effecttick9_data[6] = { |
|
1025 |
_effecttick9_data1, |
|
1026 |
_effecttick9_data2, |
|
1027 |
_effecttick9_data3, |
|
1028 |
_effecttick9_data4, |
|
1029 |
_effecttick9_data5, |
|
1030 |
_effecttick9_data6, |
|
1031 |
}; |
|
1032 |
||
1033 |
static void EffectTick_9(Vehicle *v) |
|
1034 |
{ |
|
543
946badd71033
(svn r942) -Merged branch/network back into the trunk
truelight
parents:
541
diff
changeset
|
1035 |
/* |
946badd71033
(svn r942) -Merged branch/network back into the trunk
truelight
parents:
541
diff
changeset
|
1036 |
* Warning: those effects can NOT use Random(), and have to use |
946badd71033
(svn r942) -Merged branch/network back into the trunk
truelight
parents:
541
diff
changeset
|
1037 |
* InteractiveRandom(), because somehow someone forgot to save |
946badd71033
(svn r942) -Merged branch/network back into the trunk
truelight
parents:
541
diff
changeset
|
1038 |
* spritenum to the savegame, and so it will cause desyncs in |
946badd71033
(svn r942) -Merged branch/network back into the trunk
truelight
parents:
541
diff
changeset
|
1039 |
* multiplayer!! (that is: in ToyLand) |
946badd71033
(svn r942) -Merged branch/network back into the trunk
truelight
parents:
541
diff
changeset
|
1040 |
*/ |
0 | 1041 |
int et; |
1042 |
const byte *b; |
|
1043 |
||
1044 |
if (((++v->progress)&3) != 0) |
|
1045 |
return; |
|
1046 |
||
1047 |
BeginVehicleMove(v); |
|
1048 |
||
1049 |
et = v->engine_type + 1; |
|
1050 |
||
1051 |
if (v->spritenum == 0) { |
|
1052 |
if (++v->cur_image < 4754) { |
|
1053 |
VehiclePositionChanged(v); |
|
1054 |
EndVehicleMove(v); |
|
1055 |
return; |
|
1056 |
} |
|
1057 |
if (v->u.special.unk2 != 0) { |
|
543
946badd71033
(svn r942) -Merged branch/network back into the trunk
truelight
parents:
541
diff
changeset
|
1058 |
v->spritenum = (byte)((InteractiveRandom()&3)+1); |
0 | 1059 |
} else { |
1060 |
v->spritenum = 6; |
|
1061 |
} |
|
1062 |
et = 0; |
|
1063 |
} |
|
1064 |
||
1065 |
again: |
|
1066 |
v->engine_type = et; |
|
1067 |
b = &_effecttick9_data[v->spritenum - 1][et*2]; |
|
1068 |
||
1069 |
if (*b == 0x80) { |
|
1070 |
EndVehicleMove(v); |
|
1071 |
DeleteVehicle(v); |
|
1072 |
return; |
|
193
0a7025304867
(svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents:
164
diff
changeset
|
1073 |
} |
0a7025304867
(svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents:
164
diff
changeset
|
1074 |
|
0 | 1075 |
if (*b == 0x81) { |
543
946badd71033
(svn r942) -Merged branch/network back into the trunk
truelight
parents:
541
diff
changeset
|
1076 |
if (v->z_pos > 180 || CHANCE16I(1,96, InteractiveRandom())) { |
0 | 1077 |
v->spritenum = 5; |
541 | 1078 |
SndPlayVehicleFx(SND_2F_POP, v); |
0 | 1079 |
} |
1080 |
et = 0; |
|
1081 |
goto again; |
|
193
0a7025304867
(svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents:
164
diff
changeset
|
1082 |
} |
0a7025304867
(svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents:
164
diff
changeset
|
1083 |
|
0 | 1084 |
if (*b == 0x82) { |
1085 |
uint tile; |
|
1086 |
||
1087 |
et++; |
|
541 | 1088 |
SndPlayVehicleFx(SND_31_EXTRACT, v); |
0 | 1089 |
|
1090 |
tile = TILE_FROM_XY(v->x_pos, v->y_pos); |
|
1035
812f837ee03f
(svn r1536) Move GET_TILEHEIGHT, GET_TILETYPE and IS_TILETYPE to map.h, turn them into inline functions and add some asserts
tron
parents:
1024
diff
changeset
|
1091 |
if (IsTileType(tile, MP_INDUSTRY) && |
0 | 1092 |
_map5[tile]==0xA2) { |
1093 |
AddAnimatedTile(tile); |
|
1094 |
} |
|
1095 |
goto again; |
|
1096 |
} |
|
1097 |
||
1098 |
v->x_pos += (b[0]&0xF) - 4; |
|
1099 |
v->y_pos += (b[0]>>4) - 4; |
|
1100 |
v->z_pos += (b[1]&0xF) - 4; |
|
1101 |
v->cur_image = 4748 + (b[1] >> 4); |
|
1102 |
||
1103 |
VehiclePositionChanged(v); |
|
1104 |
EndVehicleMove(v); |
|
1105 |
} |
|
1106 |
||
1107 |
||
1108 |
typedef void EffectInitProc(Vehicle *v); |
|
1109 |
typedef void EffectTickProc(Vehicle *v); |
|
1110 |
||
1111 |
static EffectInitProc * const _effect_init_procs[] = { |
|
1112 |
EffectInit_0, |
|
1113 |
EffectInit_1, |
|
1114 |
EffectInit_2, |
|
1115 |
EffectInit_3, |
|
1116 |
EffectInit_4, |
|
1117 |
EffectInit_5, |
|
1118 |
EffectInit_6, |
|
1119 |
EffectInit_7, |
|
1120 |
EffectInit_8, |
|
1121 |
EffectInit_9, |
|
1122 |
}; |
|
1123 |
||
1124 |
static EffectTickProc * const _effect_tick_procs[] = { |
|
1125 |
EffectTick_0, |
|
1126 |
EffectTick_1, |
|
1127 |
EffectTick_2, |
|
1128 |
EffectTick_3, |
|
1129 |
EffectTick_4, |
|
1130 |
EffectTick_5, |
|
1131 |
EffectTick_6, |
|
1132 |
EffectTick_7, |
|
1133 |
EffectTick_8, |
|
1134 |
EffectTick_9, |
|
1135 |
}; |
|
1136 |
||
1137 |
||
1138 |
Vehicle *CreateEffectVehicle(int x, int y, int z, int type) |
|
1139 |
{ |
|
1140 |
Vehicle *v; |
|
193
0a7025304867
(svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents:
164
diff
changeset
|
1141 |
|
0 | 1142 |
v = ForceAllocateSpecialVehicle(); |
1143 |
if (v != NULL) { |
|
1144 |
v->type = VEH_Special; |
|
1145 |
v->subtype = type; |
|
1146 |
v->x_pos = x; |
|
1147 |
v->y_pos = y; |
|
1148 |
v->z_pos = z; |
|
1149 |
v->z_height = v->sprite_width = v->sprite_height = 1; |
|
1150 |
v->x_offs = v->y_offs = 0; |
|
1151 |
v->tile = 0; |
|
1152 |
v->vehstatus = VS_UNCLICKABLE; |
|
1153 |
||
1154 |
_effect_init_procs[type](v); |
|
1155 |
||
1156 |
VehiclePositionChanged(v); |
|
1157 |
BeginVehicleMove(v); |
|
1158 |
EndVehicleMove(v); |
|
1159 |
} |
|
1160 |
return v; |
|
1161 |
} |
|
1162 |
||
1163 |
Vehicle *CreateEffectVehicleAbove(int x, int y, int z, int type) |
|
1164 |
{ |
|
1165 |
return CreateEffectVehicle(x, y, GetSlopeZ(x, y) + z, type); |
|
1166 |
} |
|
1167 |
||
1168 |
Vehicle *CreateEffectVehicleRel(Vehicle *v, int x, int y, int z, int type) |
|
1169 |
{ |
|
1170 |
return CreateEffectVehicle(v->x_pos + x, v->y_pos + y, v->z_pos + z, type); |
|
1171 |
} |
|
1172 |
||
410 | 1173 |
static void EffectVehicle_Tick(Vehicle *v) |
0 | 1174 |
{ |
1175 |
_effect_tick_procs[v->subtype](v); |
|
1176 |
} |
|
1177 |
||
1178 |
Vehicle *CheckClickOnVehicle(ViewPort *vp, int x, int y) |
|
1179 |
{ |
|
1180 |
Vehicle *found = NULL, *v; |
|
1181 |
uint dist, best_dist = (uint)-1; |
|
1182 |
||
1183 |
if ( (uint)(x -= vp->left) >= (uint)vp->width || |
|
1184 |
(uint)(y -= vp->top) >= (uint)vp->height) |
|
1185 |
return NULL; |
|
1186 |
||
1187 |
x = (x << vp->zoom) + vp->virtual_left; |
|
1188 |
y = (y << vp->zoom) + vp->virtual_top; |
|
1189 |
||
1190 |
FOR_ALL_VEHICLES(v) { |
|
193
0a7025304867
(svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents:
164
diff
changeset
|
1191 |
if (v->type != 0 && (v->vehstatus & (VS_HIDDEN|VS_UNCLICKABLE)) == 0 && |
0 | 1192 |
x >= v->left_coord && x <= v->right_coord && |
1193 |
y >= v->top_coord && y <= v->bottom_coord) { |
|
193
0a7025304867
(svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents:
164
diff
changeset
|
1194 |
|
0 | 1195 |
dist = max( |
1196 |
myabs( ((v->left_coord + v->right_coord)>>1) - x ), |
|
1197 |
myabs( ((v->top_coord + v->bottom_coord)>>1) - y ) |
|
1198 |
); |
|
1199 |
||
1200 |
if (dist < best_dist) { |
|
1201 |
found = v; |
|
1202 |
best_dist = dist; |
|
1203 |
} |
|
1204 |
} |
|
1205 |
} |
|
1206 |
||
1207 |
return found; |
|
1208 |
} |
|
1209 |
||
1210 |
||
1211 |
void DecreaseVehicleValue(Vehicle *v) |
|
1212 |
{ |
|
1213 |
v->value -= v->value >> 8; |
|
1214 |
InvalidateWindow(WC_VEHICLE_DETAILS, v->index); |
|
1215 |
} |
|
1216 |
||
1217 |
static const byte _breakdown_chance[64] = { |
|
1218 |
3, 3, 3, 3, 3, 3, 3, 3, |
|
1219 |
4, 4, 5, 5, 6, 6, 7, 7, |
|
1220 |
8, 8, 9, 9, 10, 10, 11, 11, |
|
1221 |
12, 13, 13, 13, 13, 14, 15, 16, |
|
1222 |
17, 19, 21, 25, 28, 31, 34, 37, |
|
1223 |
40, 44, 48, 52, 56, 60, 64, 68, |
|
1224 |
72, 80, 90, 100, 110, 120, 130, 140, |
|
1225 |
150, 170, 190, 210, 230, 250, 250, 250, |
|
1226 |
}; |
|
1227 |
||
1228 |
void CheckVehicleBreakdown(Vehicle *v) |
|
1229 |
{ |
|
1230 |
int rel, rel_old; |
|
1231 |
uint32 r; |
|
1232 |
int chance; |
|
1233 |
||
1234 |
/* decrease reliability */ |
|
1235 |
v->reliability = rel = max((rel_old = v->reliability) - v->reliability_spd_dec, 0); |
|
1236 |
if ((rel_old >> 8) != (rel >> 8)) |
|
1237 |
InvalidateWindow(WC_VEHICLE_DETAILS, v->index); |
|
1238 |
||
1239 |
if (v->breakdown_ctr != 0 || (v->vehstatus & VS_STOPPED) != 0 || |
|
1240 |
v->cur_speed < 5 || _game_mode == GM_MENU) |
|
1241 |
return; |
|
1242 |
||
1243 |
r = Random(); |
|
1244 |
||
1245 |
/* increase chance of failure */ |
|
1246 |
chance = v->breakdown_chance + 1; |
|
1247 |
if (CHANCE16I(1,25,r)) chance += 25; |
|
1248 |
v->breakdown_chance = min(255, chance); |
|
1249 |
||
1250 |
/* calculate reliability value to use in comparison */ |
|
1251 |
rel = v->reliability; |
|
1252 |
if (v->type == VEH_Ship) rel += 0x6666; |
|
193
0a7025304867
(svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents:
164
diff
changeset
|
1253 |
|
0 | 1254 |
/* disabled breakdowns? */ |
1255 |
if (_opt.diff.vehicle_breakdowns < 1) |
|
1256 |
return; |
|
1257 |
||
1258 |
/* reduced breakdowns? */ |
|
1259 |
if (_opt.diff.vehicle_breakdowns == 1) rel += 0x6666; |
|
1260 |
||
1261 |
/* check if to break down */ |
|
1262 |
if (_breakdown_chance[(uint)min(rel, 0xffff) >> 10] <= v->breakdown_chance) { |
|
1263 |
v->breakdown_ctr = (byte)(((r >> 16) & 0x3F) + 0x3F); |
|
1264 |
v->breakdown_delay = (byte)(((r >> 24) & 0x7F) | 0x80); |
|
1265 |
v->breakdown_chance = 0; |
|
1266 |
} |
|
1267 |
} |
|
1268 |
||
1269 |
static const StringID _vehicle_type_names[4] = { |
|
1270 |
STR_019F_TRAIN, |
|
1271 |
STR_019C_ROAD_VEHICLE, |
|
1272 |
STR_019E_SHIP, |
|
1273 |
STR_019D_AIRCRAFT, |
|
1274 |
}; |
|
1275 |
||
1276 |
static void ShowVehicleGettingOld(Vehicle *v, StringID msg) |
|
1277 |
{ |
|
1278 |
if (v->owner != _local_player) |
|
1279 |
return; |
|
812
65ecc321b3db
(svn r1283) -Add: AutoRenew is now a client-side patch instead of a game-side patch
truelight
parents:
755
diff
changeset
|
1280 |
|
26 | 1281 |
// Do not show getting-old message if autorenew is active |
1282 |
if (_patches.autorenew) |
|
1283 |
return; |
|
0 | 1284 |
|
534
306bc86eb23e
(svn r901) Small step in the process to clean up the DPARAM mess:
tron
parents:
507
diff
changeset
|
1285 |
SetDParam(0, _vehicle_type_names[v->type - 0x10]); |
306bc86eb23e
(svn r901) Small step in the process to clean up the DPARAM mess:
tron
parents:
507
diff
changeset
|
1286 |
SetDParam(1, v->unitnumber); |
0 | 1287 |
AddNewsItem(msg, NEWS_FLAGS(NM_SMALL, NF_VIEWPORT|NF_VEHICLE, NT_ADVICE, 0), v->index, 0); |
1288 |
} |
|
1289 |
||
1290 |
void AgeVehicle(Vehicle *v) |
|
1291 |
{ |
|
1292 |
int age; |
|
1293 |
||
1294 |
if (v->age < 65535) |
|
1295 |
v->age++; |
|
1296 |
||
1297 |
age = v->age - v->max_age; |
|
1298 |
if (age == 366*0 || age == 366*1 || age == 366*2 || age == 366*3 || age == 366*4) |
|
193
0a7025304867
(svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents:
164
diff
changeset
|
1299 |
v->reliability_spd_dec <<= 1; |
0a7025304867
(svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents:
164
diff
changeset
|
1300 |
|
0 | 1301 |
InvalidateWindow(WC_VEHICLE_DETAILS, v->index); |
1302 |
||
1303 |
if (age == -366) { |
|
1304 |
ShowVehicleGettingOld(v, STR_01A0_IS_GETTING_OLD); |
|
1305 |
} else if (age == 0) { |
|
1306 |
ShowVehicleGettingOld(v, STR_01A1_IS_GETTING_VERY_OLD); |
|
1307 |
} else if (age == 366*1 || age == 366*2 || age == 366*3 || age == 366*4 || age == 366*5) { |
|
1308 |
ShowVehicleGettingOld(v, STR_01A2_IS_GETTING_VERY_OLD_AND); |
|
1309 |
} |
|
1310 |
} |
|
1311 |
||
812
65ecc321b3db
(svn r1283) -Add: AutoRenew is now a client-side patch instead of a game-side patch
truelight
parents:
755
diff
changeset
|
1312 |
extern int32 EstimateTrainCost(const RailVehicleInfo *rvi); |
65ecc321b3db
(svn r1283) -Add: AutoRenew is now a client-side patch instead of a game-side patch
truelight
parents:
755
diff
changeset
|
1313 |
extern int32 EstimateRoadVehCost(byte engine_type); |
65ecc321b3db
(svn r1283) -Add: AutoRenew is now a client-side patch instead of a game-side patch
truelight
parents:
755
diff
changeset
|
1314 |
extern int32 EstimateShipCost(uint16 engine_type); |
65ecc321b3db
(svn r1283) -Add: AutoRenew is now a client-side patch instead of a game-side patch
truelight
parents:
755
diff
changeset
|
1315 |
extern int32 EstimateAircraftCost(uint16 engine_type); |
842 | 1316 |
extern int32 CmdRefitRailVehicle(int x, int y, uint32 flags, uint32 p1, uint32 p2); |
1317 |
extern int32 CmdRefitShip(int x, int y, uint32 flags, uint32 p1, uint32 p2); |
|
1318 |
extern int32 CmdRefitAircraft(int x, int y, uint32 flags, uint32 p1, uint32 p2); |
|
812
65ecc321b3db
(svn r1283) -Add: AutoRenew is now a client-side patch instead of a game-side patch
truelight
parents:
755
diff
changeset
|
1319 |
|
842 | 1320 |
/* Replaces a vehicle (used to be called autorenew) |
812
65ecc321b3db
(svn r1283) -Add: AutoRenew is now a client-side patch instead of a game-side patch
truelight
parents:
755
diff
changeset
|
1321 |
p1 - Index of vehicle |
65ecc321b3db
(svn r1283) -Add: AutoRenew is now a client-side patch instead of a game-side patch
truelight
parents:
755
diff
changeset
|
1322 |
p2 - Type of new engine */ |
842 | 1323 |
int32 CmdReplaceVehicle(int x, int y, uint32 flags, uint32 p1, uint32 p2) |
0 | 1324 |
{ |
842 | 1325 |
/* makesvariables to inform about how much money the player wants to have left after replacing |
1326 |
and which engine to replace with out of p2. |
|
1327 |
the first 16 bit is the money. The last 5 digits (all 0) were removed when sent, so we add them again. |
|
1328 |
This way the max is 6553 millions and it is more than the 32 bit that is stored in _patches |
|
1329 |
This is a nice way to send 32 bit and only use 16 bit |
|
1330 |
the last 8 bit is the engine. The 8 bits in front of the engine is free so it have room for 16 bit engine entries */ |
|
1331 |
uint16 new_engine_type = (uint16)(p2 & 0xFFFF); |
|
915 | 1332 |
uint32 autorefit_money = (p2 >> 16) * 100000; |
919
544f374ee392
(svn r1407) -Codechange: changed a lot around _stations, _vehicles, _towns and _industries
truelight
parents:
915
diff
changeset
|
1333 |
Vehicle *v = GetVehicle(p1); |
1060
ae9a2238bd80
(svn r1561) Fix: autoreplacing a singleheaded engine into a dualheaded engine now adds the the rear engine
bjarni
parents:
1058
diff
changeset
|
1334 |
int cost, build_cost, rear_engine_cost = 0; |
ae9a2238bd80
(svn r1561) Fix: autoreplacing a singleheaded engine into a dualheaded engine now adds the the rear engine
bjarni
parents:
1058
diff
changeset
|
1335 |
Vehicle *u = v; |
ae9a2238bd80
(svn r1561) Fix: autoreplacing a singleheaded engine into a dualheaded engine now adds the the rear engine
bjarni
parents:
1058
diff
changeset
|
1336 |
byte old_engine_type = v->engine_type; |
889
64d2f7d5f02b
(svn r1375) -Fix: [1050990] Buying trains sometimes accounted for incorrectly. Was the result of the cost getting reset in a recursive call of docommand. That is fixed. In addition all cost-commands are typed explicitely. Please do not forget to do so or your costs will be credited to construction if you are unlucky.
darkvater
parents:
842
diff
changeset
|
1337 |
|
64d2f7d5f02b
(svn r1375) -Fix: [1050990] Buying trains sometimes accounted for incorrectly. Was the result of the cost getting reset in a recursive call of docommand. That is fixed. In addition all cost-commands are typed explicitely. Please do not forget to do so or your costs will be credited to construction if you are unlucky.
darkvater
parents:
842
diff
changeset
|
1338 |
SET_EXPENSES_TYPE(EXPENSES_NEW_VEHICLES); |
915 | 1339 |
|
1340 |
||
890
8e813593e175
(svn r1376) fixed an issue where a modified client could try to replace a vehicle to an invalid engine ID and crash the server. Now the server just rejects the request. Also added a check for vehicle ownership, so you should not be able to replace other player's vehicles
bjarni
parents:
889
diff
changeset
|
1341 |
// first we make sure that it's a valid type the user requested |
8e813593e175
(svn r1376) fixed an issue where a modified client could try to replace a vehicle to an invalid engine ID and crash the server. Now the server just rejects the request. Also added a check for vehicle ownership, so you should not be able to replace other player's vehicles
bjarni
parents:
889
diff
changeset
|
1342 |
// check that it's an engine that is in the engine array |
8e813593e175
(svn r1376) fixed an issue where a modified client could try to replace a vehicle to an invalid engine ID and crash the server. Now the server just rejects the request. Also added a check for vehicle ownership, so you should not be able to replace other player's vehicles
bjarni
parents:
889
diff
changeset
|
1343 |
if (new_engine_type >= TOTAL_NUM_ENGINES ) return CMD_ERROR; |
915 | 1344 |
|
890
8e813593e175
(svn r1376) fixed an issue where a modified client could try to replace a vehicle to an invalid engine ID and crash the server. Now the server just rejects the request. Also added a check for vehicle ownership, so you should not be able to replace other player's vehicles
bjarni
parents:
889
diff
changeset
|
1345 |
// check that the new vehicle type is the same as the original one |
907
e1af4bb92f92
(svn r1393) fix [ 1096026 ]. Autorenew trains should now hopefully work like it did before autoreplace was added
bjarni
parents:
892
diff
changeset
|
1346 |
if (v->type != DEREF_ENGINE(new_engine_type)->type) return CMD_ERROR; |
812
65ecc321b3db
(svn r1283) -Add: AutoRenew is now a client-side patch instead of a game-side patch
truelight
parents:
755
diff
changeset
|
1347 |
|
890
8e813593e175
(svn r1376) fixed an issue where a modified client could try to replace a vehicle to an invalid engine ID and crash the server. Now the server just rejects the request. Also added a check for vehicle ownership, so you should not be able to replace other player's vehicles
bjarni
parents:
889
diff
changeset
|
1348 |
// check that it's the vehicle's owner that requested the replace |
8e813593e175
(svn r1376) fixed an issue where a modified client could try to replace a vehicle to an invalid engine ID and crash the server. Now the server just rejects the request. Also added a check for vehicle ownership, so you should not be able to replace other player's vehicles
bjarni
parents:
889
diff
changeset
|
1349 |
if (!CheckOwnership(v->owner)) return CMD_ERROR; |
8e813593e175
(svn r1376) fixed an issue where a modified client could try to replace a vehicle to an invalid engine ID and crash the server. Now the server just rejects the request. Also added a check for vehicle ownership, so you should not be able to replace other player's vehicles
bjarni
parents:
889
diff
changeset
|
1350 |
|
8e813593e175
(svn r1376) fixed an issue where a modified client could try to replace a vehicle to an invalid engine ID and crash the server. Now the server just rejects the request. Also added a check for vehicle ownership, so you should not be able to replace other player's vehicles
bjarni
parents:
889
diff
changeset
|
1351 |
|
812
65ecc321b3db
(svn r1283) -Add: AutoRenew is now a client-side patch instead of a game-side patch
truelight
parents:
755
diff
changeset
|
1352 |
switch (v->type) { |
842 | 1353 |
case VEH_Train: build_cost = EstimateTrainCost(RailVehInfo(new_engine_type)); break; |
1354 |
case VEH_Road: build_cost = EstimateRoadVehCost(new_engine_type); break; |
|
1355 |
case VEH_Ship: build_cost = EstimateShipCost(new_engine_type); break; |
|
1356 |
case VEH_Aircraft: build_cost = EstimateAircraftCost(new_engine_type); break; |
|
812
65ecc321b3db
(svn r1283) -Add: AutoRenew is now a client-side patch instead of a game-side patch
truelight
parents:
755
diff
changeset
|
1357 |
default: return CMD_ERROR; |
65ecc321b3db
(svn r1283) -Add: AutoRenew is now a client-side patch instead of a game-side patch
truelight
parents:
755
diff
changeset
|
1358 |
} |
65ecc321b3db
(svn r1283) -Add: AutoRenew is now a client-side patch instead of a game-side patch
truelight
parents:
755
diff
changeset
|
1359 |
|
65ecc321b3db
(svn r1283) -Add: AutoRenew is now a client-side patch instead of a game-side patch
truelight
parents:
755
diff
changeset
|
1360 |
/* In a rare situation, when 2 clients are connected to 1 company and have the same |
65ecc321b3db
(svn r1283) -Add: AutoRenew is now a client-side patch instead of a game-side patch
truelight
parents:
755
diff
changeset
|
1361 |
settings, a vehicle can be replaced twice.. check if this is the situation here */ |
1060
ae9a2238bd80
(svn r1561) Fix: autoreplacing a singleheaded engine into a dualheaded engine now adds the the rear engine
bjarni
parents:
1058
diff
changeset
|
1362 |
if (old_engine_type == new_engine_type && v->age == 0) |
812
65ecc321b3db
(svn r1283) -Add: AutoRenew is now a client-side patch instead of a game-side patch
truelight
parents:
755
diff
changeset
|
1363 |
return CMD_ERROR; |
1060
ae9a2238bd80
(svn r1561) Fix: autoreplacing a singleheaded engine into a dualheaded engine now adds the the rear engine
bjarni
parents:
1058
diff
changeset
|
1364 |
|
ae9a2238bd80
(svn r1561) Fix: autoreplacing a singleheaded engine into a dualheaded engine now adds the the rear engine
bjarni
parents:
1058
diff
changeset
|
1365 |
if ( v->type == VEH_Train ) { |
ae9a2238bd80
(svn r1561) Fix: autoreplacing a singleheaded engine into a dualheaded engine now adds the the rear engine
bjarni
parents:
1058
diff
changeset
|
1366 |
u = GetLastVehicleInChain(v); |
ae9a2238bd80
(svn r1561) Fix: autoreplacing a singleheaded engine into a dualheaded engine now adds the the rear engine
bjarni
parents:
1058
diff
changeset
|
1367 |
if ( RailVehInfo(new_engine_type)->flags & RVI_MULTIHEAD ) |
ae9a2238bd80
(svn r1561) Fix: autoreplacing a singleheaded engine into a dualheaded engine now adds the the rear engine
bjarni
parents:
1058
diff
changeset
|
1368 |
build_cost = build_cost >> 1; //multiheaded engines have EstimateTrainCost() for both engines |
ae9a2238bd80
(svn r1561) Fix: autoreplacing a singleheaded engine into a dualheaded engine now adds the the rear engine
bjarni
parents:
1058
diff
changeset
|
1369 |
|
ae9a2238bd80
(svn r1561) Fix: autoreplacing a singleheaded engine into a dualheaded engine now adds the the rear engine
bjarni
parents:
1058
diff
changeset
|
1370 |
if ( old_engine_type != new_engine_type ) { |
ae9a2238bd80
(svn r1561) Fix: autoreplacing a singleheaded engine into a dualheaded engine now adds the the rear engine
bjarni
parents:
1058
diff
changeset
|
1371 |
|
ae9a2238bd80
(svn r1561) Fix: autoreplacing a singleheaded engine into a dualheaded engine now adds the the rear engine
bjarni
parents:
1058
diff
changeset
|
1372 |
// prevent that the rear engine can get replaced to something else than the front engine |
ae9a2238bd80
(svn r1561) Fix: autoreplacing a singleheaded engine into a dualheaded engine now adds the the rear engine
bjarni
parents:
1058
diff
changeset
|
1373 |
if ( v->u.rail.first_engine != 0xffff && RailVehInfo(old_engine_type)->flags & RVI_MULTIHEAD && RailVehInfo(old_engine_type)->flags ) { |
ae9a2238bd80
(svn r1561) Fix: autoreplacing a singleheaded engine into a dualheaded engine now adds the the rear engine
bjarni
parents:
1058
diff
changeset
|
1374 |
Vehicle *first = GetFirstVehicleInChain(v); |
ae9a2238bd80
(svn r1561) Fix: autoreplacing a singleheaded engine into a dualheaded engine now adds the the rear engine
bjarni
parents:
1058
diff
changeset
|
1375 |
if ( first->engine_type != new_engine_type ) return CMD_ERROR; |
ae9a2238bd80
(svn r1561) Fix: autoreplacing a singleheaded engine into a dualheaded engine now adds the the rear engine
bjarni
parents:
1058
diff
changeset
|
1376 |
} |
ae9a2238bd80
(svn r1561) Fix: autoreplacing a singleheaded engine into a dualheaded engine now adds the the rear engine
bjarni
parents:
1058
diff
changeset
|
1377 |
|
ae9a2238bd80
(svn r1561) Fix: autoreplacing a singleheaded engine into a dualheaded engine now adds the the rear engine
bjarni
parents:
1058
diff
changeset
|
1378 |
// checks if the engine is the first one |
ae9a2238bd80
(svn r1561) Fix: autoreplacing a singleheaded engine into a dualheaded engine now adds the the rear engine
bjarni
parents:
1058
diff
changeset
|
1379 |
if ( v->u.rail.first_engine == 0xffff ) { |
ae9a2238bd80
(svn r1561) Fix: autoreplacing a singleheaded engine into a dualheaded engine now adds the the rear engine
bjarni
parents:
1058
diff
changeset
|
1380 |
if ( RailVehInfo(new_engine_type)->flags & RVI_MULTIHEAD ) { |
ae9a2238bd80
(svn r1561) Fix: autoreplacing a singleheaded engine into a dualheaded engine now adds the the rear engine
bjarni
parents:
1058
diff
changeset
|
1381 |
if ( u->engine_type == old_engine_type && v->next != NULL) { |
ae9a2238bd80
(svn r1561) Fix: autoreplacing a singleheaded engine into a dualheaded engine now adds the the rear engine
bjarni
parents:
1058
diff
changeset
|
1382 |
rear_engine_cost = build_cost - u->value; |
ae9a2238bd80
(svn r1561) Fix: autoreplacing a singleheaded engine into a dualheaded engine now adds the the rear engine
bjarni
parents:
1058
diff
changeset
|
1383 |
} else { |
ae9a2238bd80
(svn r1561) Fix: autoreplacing a singleheaded engine into a dualheaded engine now adds the the rear engine
bjarni
parents:
1058
diff
changeset
|
1384 |
rear_engine_cost = build_cost; |
ae9a2238bd80
(svn r1561) Fix: autoreplacing a singleheaded engine into a dualheaded engine now adds the the rear engine
bjarni
parents:
1058
diff
changeset
|
1385 |
} |
ae9a2238bd80
(svn r1561) Fix: autoreplacing a singleheaded engine into a dualheaded engine now adds the the rear engine
bjarni
parents:
1058
diff
changeset
|
1386 |
} else { |
ae9a2238bd80
(svn r1561) Fix: autoreplacing a singleheaded engine into a dualheaded engine now adds the the rear engine
bjarni
parents:
1058
diff
changeset
|
1387 |
if ( u->engine_type == old_engine_type && RailVehInfo(old_engine_type)->flags & RVI_MULTIHEAD) { |
1068 | 1388 |
if (v->next != NULL) rear_engine_cost = -(int32)u->value; |
1060
ae9a2238bd80
(svn r1561) Fix: autoreplacing a singleheaded engine into a dualheaded engine now adds the the rear engine
bjarni
parents:
1058
diff
changeset
|
1389 |
} |
ae9a2238bd80
(svn r1561) Fix: autoreplacing a singleheaded engine into a dualheaded engine now adds the the rear engine
bjarni
parents:
1058
diff
changeset
|
1390 |
} |
ae9a2238bd80
(svn r1561) Fix: autoreplacing a singleheaded engine into a dualheaded engine now adds the the rear engine
bjarni
parents:
1058
diff
changeset
|
1391 |
} |
ae9a2238bd80
(svn r1561) Fix: autoreplacing a singleheaded engine into a dualheaded engine now adds the the rear engine
bjarni
parents:
1058
diff
changeset
|
1392 |
} |
ae9a2238bd80
(svn r1561) Fix: autoreplacing a singleheaded engine into a dualheaded engine now adds the the rear engine
bjarni
parents:
1058
diff
changeset
|
1393 |
} |
812
65ecc321b3db
(svn r1283) -Add: AutoRenew is now a client-side patch instead of a game-side patch
truelight
parents:
755
diff
changeset
|
1394 |
|
65ecc321b3db
(svn r1283) -Add: AutoRenew is now a client-side patch instead of a game-side patch
truelight
parents:
755
diff
changeset
|
1395 |
/* Check if there is money for the upgrade.. if not, give a nice news-item |
65ecc321b3db
(svn r1283) -Add: AutoRenew is now a client-side patch instead of a game-side patch
truelight
parents:
755
diff
changeset
|
1396 |
(that is needed, because this CMD is called automaticly) */ |
1060
ae9a2238bd80
(svn r1561) Fix: autoreplacing a singleheaded engine into a dualheaded engine now adds the the rear engine
bjarni
parents:
1058
diff
changeset
|
1397 |
if ( DEREF_PLAYER(v->owner)->money64 < (int32)(autorefit_money + build_cost + rear_engine_cost - v->value)) { |
842 | 1398 |
if (( _local_player == v->owner ) && ( v->unitnumber != 0 )) { //v->unitnumber = 0 for train cars |
812
65ecc321b3db
(svn r1283) -Add: AutoRenew is now a client-side patch instead of a game-side patch
truelight
parents:
755
diff
changeset
|
1399 |
int message; |
65ecc321b3db
(svn r1283) -Add: AutoRenew is now a client-side patch instead of a game-side patch
truelight
parents:
755
diff
changeset
|
1400 |
SetDParam(0, v->unitnumber); |
65ecc321b3db
(svn r1283) -Add: AutoRenew is now a client-side patch instead of a game-side patch
truelight
parents:
755
diff
changeset
|
1401 |
switch (v->type) { |
65ecc321b3db
(svn r1283) -Add: AutoRenew is now a client-side patch instead of a game-side patch
truelight
parents:
755
diff
changeset
|
1402 |
case VEH_Train: message = STR_TRAIN_AUTORENEW_FAILED; break; |
65ecc321b3db
(svn r1283) -Add: AutoRenew is now a client-side patch instead of a game-side patch
truelight
parents:
755
diff
changeset
|
1403 |
case VEH_Road: message = STR_ROADVEHICLE_AUTORENEW_FAILED; break; |
65ecc321b3db
(svn r1283) -Add: AutoRenew is now a client-side patch instead of a game-side patch
truelight
parents:
755
diff
changeset
|
1404 |
case VEH_Ship: message = STR_SHIP_AUTORENEW_FAILED; break; |
65ecc321b3db
(svn r1283) -Add: AutoRenew is now a client-side patch instead of a game-side patch
truelight
parents:
755
diff
changeset
|
1405 |
case VEH_Aircraft: message = STR_AIRCRAFT_AUTORENEW_FAILED; break; |
65ecc321b3db
(svn r1283) -Add: AutoRenew is now a client-side patch instead of a game-side patch
truelight
parents:
755
diff
changeset
|
1406 |
// This should never happen |
65ecc321b3db
(svn r1283) -Add: AutoRenew is now a client-side patch instead of a game-side patch
truelight
parents:
755
diff
changeset
|
1407 |
default: message = 0; break; |
65ecc321b3db
(svn r1283) -Add: AutoRenew is now a client-side patch instead of a game-side patch
truelight
parents:
755
diff
changeset
|
1408 |
} |
65ecc321b3db
(svn r1283) -Add: AutoRenew is now a client-side patch instead of a game-side patch
truelight
parents:
755
diff
changeset
|
1409 |
|
65ecc321b3db
(svn r1283) -Add: AutoRenew is now a client-side patch instead of a game-side patch
truelight
parents:
755
diff
changeset
|
1410 |
AddNewsItem(message, NEWS_FLAGS(NM_SMALL, NF_VIEWPORT|NF_VEHICLE, NT_ADVICE, 0), v->index, 0); |
65ecc321b3db
(svn r1283) -Add: AutoRenew is now a client-side patch instead of a game-side patch
truelight
parents:
755
diff
changeset
|
1411 |
} |
65ecc321b3db
(svn r1283) -Add: AutoRenew is now a client-side patch instead of a game-side patch
truelight
parents:
755
diff
changeset
|
1412 |
|
65ecc321b3db
(svn r1283) -Add: AutoRenew is now a client-side patch instead of a game-side patch
truelight
parents:
755
diff
changeset
|
1413 |
return CMD_ERROR; |
65ecc321b3db
(svn r1283) -Add: AutoRenew is now a client-side patch instead of a game-side patch
truelight
parents:
755
diff
changeset
|
1414 |
} |
1060
ae9a2238bd80
(svn r1561) Fix: autoreplacing a singleheaded engine into a dualheaded engine now adds the the rear engine
bjarni
parents:
1058
diff
changeset
|
1415 |
cost = build_cost - v->value + rear_engine_cost; |
812
65ecc321b3db
(svn r1283) -Add: AutoRenew is now a client-side patch instead of a game-side patch
truelight
parents:
755
diff
changeset
|
1416 |
|
65ecc321b3db
(svn r1283) -Add: AutoRenew is now a client-side patch instead of a game-side patch
truelight
parents:
755
diff
changeset
|
1417 |
|
65ecc321b3db
(svn r1283) -Add: AutoRenew is now a client-side patch instead of a game-side patch
truelight
parents:
755
diff
changeset
|
1418 |
if (flags & DC_EXEC) { |
1060
ae9a2238bd80
(svn r1561) Fix: autoreplacing a singleheaded engine into a dualheaded engine now adds the the rear engine
bjarni
parents:
1058
diff
changeset
|
1419 |
/* We do not really buy a new vehicle, we upgrade the old one */ |
812
65ecc321b3db
(svn r1283) -Add: AutoRenew is now a client-side patch instead of a game-side patch
truelight
parents:
755
diff
changeset
|
1420 |
Engine *e; |
907
e1af4bb92f92
(svn r1393) fix [ 1096026 ]. Autorenew trains should now hopefully work like it did before autoreplace was added
bjarni
parents:
892
diff
changeset
|
1421 |
e = DEREF_ENGINE(new_engine_type); |
915 | 1422 |
|
1060
ae9a2238bd80
(svn r1561) Fix: autoreplacing a singleheaded engine into a dualheaded engine now adds the the rear engine
bjarni
parents:
1058
diff
changeset
|
1423 |
v->reliability = e->reliability; |
ae9a2238bd80
(svn r1561) Fix: autoreplacing a singleheaded engine into a dualheaded engine now adds the the rear engine
bjarni
parents:
1058
diff
changeset
|
1424 |
v->reliability_spd_dec = e->reliability_spd_dec; |
ae9a2238bd80
(svn r1561) Fix: autoreplacing a singleheaded engine into a dualheaded engine now adds the the rear engine
bjarni
parents:
1058
diff
changeset
|
1425 |
v->age = 0; |
812
65ecc321b3db
(svn r1283) -Add: AutoRenew is now a client-side patch instead of a game-side patch
truelight
parents:
755
diff
changeset
|
1426 |
|
1060
ae9a2238bd80
(svn r1561) Fix: autoreplacing a singleheaded engine into a dualheaded engine now adds the the rear engine
bjarni
parents:
1058
diff
changeset
|
1427 |
v->date_of_last_service = _date; |
ae9a2238bd80
(svn r1561) Fix: autoreplacing a singleheaded engine into a dualheaded engine now adds the the rear engine
bjarni
parents:
1058
diff
changeset
|
1428 |
v->build_year = _cur_year; |
ae9a2238bd80
(svn r1561) Fix: autoreplacing a singleheaded engine into a dualheaded engine now adds the the rear engine
bjarni
parents:
1058
diff
changeset
|
1429 |
|
ae9a2238bd80
(svn r1561) Fix: autoreplacing a singleheaded engine into a dualheaded engine now adds the the rear engine
bjarni
parents:
1058
diff
changeset
|
1430 |
v->value = build_cost; |
ae9a2238bd80
(svn r1561) Fix: autoreplacing a singleheaded engine into a dualheaded engine now adds the the rear engine
bjarni
parents:
1058
diff
changeset
|
1431 |
|
ae9a2238bd80
(svn r1561) Fix: autoreplacing a singleheaded engine into a dualheaded engine now adds the the rear engine
bjarni
parents:
1058
diff
changeset
|
1432 |
InvalidateWindow(WC_VEHICLE_DETAILS, v->index); |
ae9a2238bd80
(svn r1561) Fix: autoreplacing a singleheaded engine into a dualheaded engine now adds the the rear engine
bjarni
parents:
1058
diff
changeset
|
1433 |
|
ae9a2238bd80
(svn r1561) Fix: autoreplacing a singleheaded engine into a dualheaded engine now adds the the rear engine
bjarni
parents:
1058
diff
changeset
|
1434 |
|
812
65ecc321b3db
(svn r1283) -Add: AutoRenew is now a client-side patch instead of a game-side patch
truelight
parents:
755
diff
changeset
|
1435 |
if (v->engine_type != new_engine_type) { |
933
38fe9b8f4422
(svn r1421) improved autoreplace multiheaded trains. It now remembers the current heading for an engine instead of turning all of them like the first one and the last the other way
bjarni
parents:
931
diff
changeset
|
1436 |
byte sprite = v->spritenum; |
842 | 1437 |
byte cargo_type = v->cargo_type; |
1438 |
v->engine_type = new_engine_type; |
|
1439 |
v->max_age = e->lifelength * 366; |
|
915 | 1440 |
|
842 | 1441 |
/* Update limits of the vehicle (for when upgraded) */ |
1442 |
switch (v->type) { |
|
1443 |
case VEH_Train: |
|
1444 |
{ |
|
1445 |
const RailVehicleInfo *rvi = RailVehInfo(new_engine_type); |
|
1060
ae9a2238bd80
(svn r1561) Fix: autoreplacing a singleheaded engine into a dualheaded engine now adds the the rear engine
bjarni
parents:
1058
diff
changeset
|
1446 |
const RailVehicleInfo *rvi2 = RailVehInfo(old_engine_type); |
842 | 1447 |
byte capacity = rvi->capacity; |
1060
ae9a2238bd80
(svn r1561) Fix: autoreplacing a singleheaded engine into a dualheaded engine now adds the the rear engine
bjarni
parents:
1058
diff
changeset
|
1448 |
Vehicle *first = GetFirstVehicleInChain(v); |
842 | 1449 |
|
933
38fe9b8f4422
(svn r1421) improved autoreplace multiheaded trains. It now remembers the current heading for an engine instead of turning all of them like the first one and the last the other way
bjarni
parents:
931
diff
changeset
|
1450 |
/* rvi->image_index is the new sprite for the engine. Adding +1 makes the engine head the other way |
38fe9b8f4422
(svn r1421) improved autoreplace multiheaded trains. It now remembers the current heading for an engine instead of turning all of them like the first one and the last the other way
bjarni
parents:
931
diff
changeset
|
1451 |
if it is a multiheaded engine (rear engine) |
939
eec1a1fd1525
(svn r1427) fixed issue where the wrong sprite could be used if autoreplacing between single and multiheaded trains
bjarni
parents:
938
diff
changeset
|
1452 |
(rvi->flags & RVI_MULTIHEAD && sprite - rvi2->image_index) is true if the engine is heading the other way, otherwise 0*/ |
eec1a1fd1525
(svn r1427) fixed issue where the wrong sprite could be used if autoreplacing between single and multiheaded trains
bjarni
parents:
938
diff
changeset
|
1453 |
v->spritenum = rvi->image_index + (( rvi->flags & RVI_MULTIHEAD && sprite - rvi2->image_index) ? 1 : 0); |
941
d271102b3010
(svn r1429) Change: bumped savegame to revision 5.
truelight
parents:
939
diff
changeset
|
1454 |
|
939
eec1a1fd1525
(svn r1427) fixed issue where the wrong sprite could be used if autoreplacing between single and multiheaded trains
bjarni
parents:
938
diff
changeset
|
1455 |
// turn the last engine in a multiheaded train if needed |
1060
ae9a2238bd80
(svn r1561) Fix: autoreplacing a singleheaded engine into a dualheaded engine now adds the the rear engine
bjarni
parents:
1058
diff
changeset
|
1456 |
if ( v->next == NULL && v->u.rail.first_engine != 0xffff && rvi->flags & RVI_MULTIHEAD && v->spritenum == rvi->image_index ) |
939
eec1a1fd1525
(svn r1427) fixed issue where the wrong sprite could be used if autoreplacing between single and multiheaded trains
bjarni
parents:
938
diff
changeset
|
1457 |
v->spritenum++; |
956
dda0863632df
(svn r1448) -Fix: The current_order of a vehicle is now correctly saved (caused
truelight
parents:
941
diff
changeset
|
1458 |
|
842 | 1459 |
v->cargo_type = rvi->cargo_type; |
1460 |
v->cargo_cap = rvi->capacity; |
|
1461 |
v->max_speed = rvi->max_speed; |
|
1462 |
||
1463 |
v->u.rail.railtype = e->railtype; |
|
915 | 1464 |
|
842 | 1465 |
// 0x0100 means that we skip the check for being stopped inside the depot |
1466 |
// since we do not stop it for autorefitting |
|
1467 |
if (v->cargo_type != cargo_type && capacity) { |
|
1468 |
// BUG: somehow v->index is not transfered properly |
|
1469 |
//CmdRefitRailVehicle(v->x_pos, v->y_pos, DC_EXEC, v->index , cargo_type + 0x0100 ); |
|
1470 |
v->cargo_type = cargo_type; // workaround, but it do not check the refit table |
|
1471 |
} else { |
|
1472 |
v->cargo_type = rvi->cargo_type; |
|
1473 |
} |
|
1060
ae9a2238bd80
(svn r1561) Fix: autoreplacing a singleheaded engine into a dualheaded engine now adds the the rear engine
bjarni
parents:
1058
diff
changeset
|
1474 |
|
ae9a2238bd80
(svn r1561) Fix: autoreplacing a singleheaded engine into a dualheaded engine now adds the the rear engine
bjarni
parents:
1058
diff
changeset
|
1475 |
if ( rvi2->flags & RVI_MULTIHEAD && !(rvi->flags & RVI_MULTIHEAD) && v->index == first->index) { |
ae9a2238bd80
(svn r1561) Fix: autoreplacing a singleheaded engine into a dualheaded engine now adds the the rear engine
bjarni
parents:
1058
diff
changeset
|
1476 |
if (old_engine_type == u->engine_type ) { |
1063
67d38cf7ed26
(svn r1564) ISO C90 forbids mixed declarations and code (bad bjarni, no cookie)
tron
parents:
1062
diff
changeset
|
1477 |
Vehicle *w; |
67d38cf7ed26
(svn r1564) ISO C90 forbids mixed declarations and code (bad bjarni, no cookie)
tron
parents:
1062
diff
changeset
|
1478 |
|
1060
ae9a2238bd80
(svn r1561) Fix: autoreplacing a singleheaded engine into a dualheaded engine now adds the the rear engine
bjarni
parents:
1058
diff
changeset
|
1479 |
u = GetLastVehicleInChain(v); |
1063
67d38cf7ed26
(svn r1564) ISO C90 forbids mixed declarations and code (bad bjarni, no cookie)
tron
parents:
1062
diff
changeset
|
1480 |
w = GetPrevVehicleInChain(u); |
1060
ae9a2238bd80
(svn r1561) Fix: autoreplacing a singleheaded engine into a dualheaded engine now adds the the rear engine
bjarni
parents:
1058
diff
changeset
|
1481 |
w->next = NULL; |
ae9a2238bd80
(svn r1561) Fix: autoreplacing a singleheaded engine into a dualheaded engine now adds the the rear engine
bjarni
parents:
1058
diff
changeset
|
1482 |
DeleteVehicle(u); |
ae9a2238bd80
(svn r1561) Fix: autoreplacing a singleheaded engine into a dualheaded engine now adds the the rear engine
bjarni
parents:
1058
diff
changeset
|
1483 |
} |
ae9a2238bd80
(svn r1561) Fix: autoreplacing a singleheaded engine into a dualheaded engine now adds the the rear engine
bjarni
parents:
1058
diff
changeset
|
1484 |
} |
ae9a2238bd80
(svn r1561) Fix: autoreplacing a singleheaded engine into a dualheaded engine now adds the the rear engine
bjarni
parents:
1058
diff
changeset
|
1485 |
|
ae9a2238bd80
(svn r1561) Fix: autoreplacing a singleheaded engine into a dualheaded engine now adds the the rear engine
bjarni
parents:
1058
diff
changeset
|
1486 |
if ( rvi->flags & RVI_MULTIHEAD && rvi2->flags & RVI_MULTIHEAD && v->index == first->index ) { |
ae9a2238bd80
(svn r1561) Fix: autoreplacing a singleheaded engine into a dualheaded engine now adds the the rear engine
bjarni
parents:
1058
diff
changeset
|
1487 |
CmdReplaceVehicle(x, y, flags, u->index, p2); |
ae9a2238bd80
(svn r1561) Fix: autoreplacing a singleheaded engine into a dualheaded engine now adds the the rear engine
bjarni
parents:
1058
diff
changeset
|
1488 |
} |
ae9a2238bd80
(svn r1561) Fix: autoreplacing a singleheaded engine into a dualheaded engine now adds the the rear engine
bjarni
parents:
1058
diff
changeset
|
1489 |
|
ae9a2238bd80
(svn r1561) Fix: autoreplacing a singleheaded engine into a dualheaded engine now adds the the rear engine
bjarni
parents:
1058
diff
changeset
|
1490 |
if ( rvi->flags & RVI_MULTIHEAD && !(rvi2->flags & RVI_MULTIHEAD) && v->index == first->index ) { |
ae9a2238bd80
(svn r1561) Fix: autoreplacing a singleheaded engine into a dualheaded engine now adds the the rear engine
bjarni
parents:
1058
diff
changeset
|
1491 |
if ( old_engine_type != u->engine_type ) { |
ae9a2238bd80
(svn r1561) Fix: autoreplacing a singleheaded engine into a dualheaded engine now adds the the rear engine
bjarni
parents:
1058
diff
changeset
|
1492 |
Vehicle *w; |
ae9a2238bd80
(svn r1561) Fix: autoreplacing a singleheaded engine into a dualheaded engine now adds the the rear engine
bjarni
parents:
1058
diff
changeset
|
1493 |
if ( (w=AllocateVehicle()) != NULL ) { |
ae9a2238bd80
(svn r1561) Fix: autoreplacing a singleheaded engine into a dualheaded engine now adds the the rear engine
bjarni
parents:
1058
diff
changeset
|
1494 |
AddRearEngineToMultiheadedTrain(v,w, false); |
ae9a2238bd80
(svn r1561) Fix: autoreplacing a singleheaded engine into a dualheaded engine now adds the the rear engine
bjarni
parents:
1058
diff
changeset
|
1495 |
u->next = w; |
ae9a2238bd80
(svn r1561) Fix: autoreplacing a singleheaded engine into a dualheaded engine now adds the the rear engine
bjarni
parents:
1058
diff
changeset
|
1496 |
} |
ae9a2238bd80
(svn r1561) Fix: autoreplacing a singleheaded engine into a dualheaded engine now adds the the rear engine
bjarni
parents:
1058
diff
changeset
|
1497 |
} |
ae9a2238bd80
(svn r1561) Fix: autoreplacing a singleheaded engine into a dualheaded engine now adds the the rear engine
bjarni
parents:
1058
diff
changeset
|
1498 |
} |
ae9a2238bd80
(svn r1561) Fix: autoreplacing a singleheaded engine into a dualheaded engine now adds the the rear engine
bjarni
parents:
1058
diff
changeset
|
1499 |
|
1062
380020506973
(svn r1563) fix: autoreplaced trains now sets wagon override properly
bjarni
parents:
1060
diff
changeset
|
1500 |
// updates the id of the front engine in the other units, since the front engine just got a new engine_id |
380020506973
(svn r1563) fix: autoreplaced trains now sets wagon override properly
bjarni
parents:
1060
diff
changeset
|
1501 |
// this is needed for wagon override |
380020506973
(svn r1563) fix: autoreplaced trains now sets wagon override properly
bjarni
parents:
1060
diff
changeset
|
1502 |
if ( v->u.rail.first_engine == 0xffff && v->next != NULL ) { |
380020506973
(svn r1563) fix: autoreplaced trains now sets wagon override properly
bjarni
parents:
1060
diff
changeset
|
1503 |
Vehicle *veh = v->next; |
380020506973
(svn r1563) fix: autoreplaced trains now sets wagon override properly
bjarni
parents:
1060
diff
changeset
|
1504 |
do { |
380020506973
(svn r1563) fix: autoreplaced trains now sets wagon override properly
bjarni
parents:
1060
diff
changeset
|
1505 |
veh->u.rail.first_engine = new_engine_type; |
380020506973
(svn r1563) fix: autoreplaced trains now sets wagon override properly
bjarni
parents:
1060
diff
changeset
|
1506 |
} while ( (veh=veh->next) != NULL ); |
380020506973
(svn r1563) fix: autoreplaced trains now sets wagon override properly
bjarni
parents:
1060
diff
changeset
|
1507 |
} |
380020506973
(svn r1563) fix: autoreplaced trains now sets wagon override properly
bjarni
parents:
1060
diff
changeset
|
1508 |
|
842 | 1509 |
break; |
1510 |
} |
|
1511 |
case VEH_Road: |
|
1060
ae9a2238bd80
(svn r1561) Fix: autoreplacing a singleheaded engine into a dualheaded engine now adds the the rear engine
bjarni
parents:
1058
diff
changeset
|
1512 |
{ |
842 | 1513 |
const RoadVehicleInfo *rvi = RoadVehInfo(new_engine_type); |
1514 |
||
1515 |
v->spritenum = rvi->image_index; |
|
1516 |
v->cargo_type = rvi->cargo_type; |
|
1517 |
v->cargo_cap = rvi->capacity; |
|
1518 |
v->max_speed = rvi->max_speed; |
|
1519 |
break; |
|
1520 |
} |
|
1521 |
case VEH_Ship: |
|
1060
ae9a2238bd80
(svn r1561) Fix: autoreplacing a singleheaded engine into a dualheaded engine now adds the the rear engine
bjarni
parents:
1058
diff
changeset
|
1522 |
{ |
842 | 1523 |
const ShipVehicleInfo *svi = ShipVehInfo(new_engine_type); |
1524 |
||
1525 |
v->spritenum = svi->image_index; |
|
1526 |
v->cargo_type = svi->cargo_type; |
|
1527 |
v->cargo_cap = svi->capacity; |
|
1528 |
v->max_speed = svi->max_speed; |
|
915 | 1529 |
|
842 | 1530 |
// 0x0100 means that we skip the check for being stopped inside the depot |
1531 |
// since we do not stop it for autorefitting |
|
1532 |
if (v->cargo_type != cargo_type) |
|
1533 |
CmdRefitShip(v->x_pos, v->y_pos, DC_EXEC, v->index , cargo_type + 0x0100 ); |
|
1534 |
break; |
|
1535 |
} |
|
1536 |
case VEH_Aircraft: |
|
1060
ae9a2238bd80
(svn r1561) Fix: autoreplacing a singleheaded engine into a dualheaded engine now adds the the rear engine
bjarni
parents:
1058
diff
changeset
|
1537 |
{ |
842 | 1538 |
const AircraftVehicleInfo *avi = AircraftVehInfo(new_engine_type); |
1539 |
Vehicle *u; |
|
1540 |
||
1541 |
v->max_speed = avi->max_speed; |
|
1542 |
v->acceleration = avi->acceleration; |
|
1543 |
v->spritenum = avi->image_index; |
|
1544 |
||
1545 |
if ( cargo_type == CT_PASSENGERS ) { |
|
922
10035216cbaf
(svn r1410) Replaced all occurences of 'passanger' by 'passenger' in the code
celestar
parents:
919
diff
changeset
|
1546 |
v->cargo_cap = avi->passenger_capacity; |
842 | 1547 |
u = v->next; |
1548 |
u->cargo_cap = avi->mail_capacity; |
|
1549 |
} else { |
|
1550 |
// 0x0100 means that we skip the check for being stopped inside the hangar |
|
1551 |
// since we do not stop it for autorefitting |
|
1552 |
CmdRefitAircraft(v->x_pos, v->y_pos, DC_EXEC, v->index , cargo_type + 0x0100 ); |
|
1553 |
} |
|
1554 |
break; |
|
1555 |
} |
|
1556 |
default: return CMD_ERROR; |
|
1557 |
} |
|
1558 |
// makes sure that the cargo is still valid compared to new capacity |
|
1559 |
if (v->cargo_count != 0) { |
|
1560 |
if ( v->cargo_type != cargo_type ) |
|
1561 |
v->cargo_count = 0; |
|
1562 |
else if ( v->cargo_count > v->cargo_cap ) |
|
1563 |
v->cargo_count = v->cargo_cap; |
|
1564 |
} |
|
812
65ecc321b3db
(svn r1283) -Add: AutoRenew is now a client-side patch instead of a game-side patch
truelight
parents:
755
diff
changeset
|
1565 |
} |
65ecc321b3db
(svn r1283) -Add: AutoRenew is now a client-side patch instead of a game-side patch
truelight
parents:
755
diff
changeset
|
1566 |
} |
842 | 1567 |
//needs to be down here because refitting will change SET_EXPENSES_TYPE if called |
1568 |
SET_EXPENSES_TYPE(EXPENSES_NEW_VEHICLES); |
|
812
65ecc321b3db
(svn r1283) -Add: AutoRenew is now a client-side patch instead of a game-side patch
truelight
parents:
755
diff
changeset
|
1569 |
|
65ecc321b3db
(svn r1283) -Add: AutoRenew is now a client-side patch instead of a game-side patch
truelight
parents:
755
diff
changeset
|
1570 |
return cost; |
65ecc321b3db
(svn r1283) -Add: AutoRenew is now a client-side patch instead of a game-side patch
truelight
parents:
755
diff
changeset
|
1571 |
} |
65ecc321b3db
(svn r1283) -Add: AutoRenew is now a client-side patch instead of a game-side patch
truelight
parents:
755
diff
changeset
|
1572 |
|
842 | 1573 |
void MaybeReplaceVehicle(Vehicle *v) |
812
65ecc321b3db
(svn r1283) -Add: AutoRenew is now a client-side patch instead of a game-side patch
truelight
parents:
755
diff
changeset
|
1574 |
{ |
842 | 1575 |
uint32 new_engine_and_autoreplace_money; |
915 | 1576 |
|
812
65ecc321b3db
(svn r1283) -Add: AutoRenew is now a client-side patch instead of a game-side patch
truelight
parents:
755
diff
changeset
|
1577 |
if (v->owner != _local_player) |
65ecc321b3db
(svn r1283) -Add: AutoRenew is now a client-side patch instead of a game-side patch
truelight
parents:
755
diff
changeset
|
1578 |
return; |
842 | 1579 |
// uncomment next line if you want to see what engine type just entered a depot |
1580 |
//printf("engine type: %d\n", v->engine_type); |
|
0 | 1581 |
|
26 | 1582 |
// A vehicle is autorenewed when it it gets the amount of months |
1583 |
// give by _patches.autorenew_months away for his max age. |
|
1584 |
// Standard is -6, meaning 6 months before his max age |
|
1585 |
// It can be any value between -12 and 12. |
|
842 | 1586 |
// Here it also checks if the vehicles is listed for replacement |
1587 |
if (!_patches.autorenew || v->age - v->max_age < (_patches.autorenew_months * 30)) { //replace if engine is too old |
|
1588 |
if (_autoreplace_array[v->engine_type] == v->engine_type && v->type != VEH_Train) //updates to a new model |
|
1589 |
return; |
|
1590 |
} |
|
1591 |
/* Now replace the vehicle */ |
|
829
e7b66723eba7
(svn r1300) -Fix: The cost for an autorenew was not always send to the right player ;)
truelight
parents:
826
diff
changeset
|
1592 |
_current_player = v->owner; |
915 | 1593 |
|
842 | 1594 |
/* makes the variable to inform about how much money the player wants to have left after replacing |
1595 |
and which engine to replace with |
|
1596 |
the first 16 bit is the money. Since we know the last 5 digits is 0, they are thrown away. |
|
1597 |
This way the max is 6553 millions and it is more than the 32 bit that is stored in _patches |
|
1598 |
This is a nice way to send 32 bit and only use 16 bit |
|
1599 |
the last 8 bit is the engine. The 8 bits in front of the engine is free so it have room for 16 bit engine entries */ |
|
892
900c8825b413
(svn r1378) Fix: train engines are now only replaced if the engine is really set to be replaced and they are replaced to the type that engine type is set to be replaced to (instead of whtat the first engine in the train is set to)
bjarni
parents:
890
diff
changeset
|
1600 |
new_engine_and_autoreplace_money = ((_patches.autorenew_money / 100000) << 16) + _autoreplace_array[v->engine_type]; |
915 | 1601 |
|
907
e1af4bb92f92
(svn r1393) fix [ 1096026 ]. Autorenew trains should now hopefully work like it did before autoreplace was added
bjarni
parents:
892
diff
changeset
|
1602 |
assert(v->type == DEREF_ENGINE(_autoreplace_array[v->engine_type])->type); |
915 | 1603 |
|
842 | 1604 |
if ( v->type != VEH_Train ) { |
1605 |
DoCommandP(v->tile, v->index, new_engine_and_autoreplace_money, NULL, CMD_REPLACE_VEHICLE | CMD_SHOW_NO_ERROR); |
|
1606 |
} else { |
|
892
900c8825b413
(svn r1378) Fix: train engines are now only replaced if the engine is really set to be replaced and they are replaced to the type that engine type is set to be replaced to (instead of whtat the first engine in the train is set to)
bjarni
parents:
890
diff
changeset
|
1607 |
// checks if any of the engines in the train are either old or listed for replacement |
900c8825b413
(svn r1378) Fix: train engines are now only replaced if the engine is really set to be replaced and they are replaced to the type that engine type is set to be replaced to (instead of whtat the first engine in the train is set to)
bjarni
parents:
890
diff
changeset
|
1608 |
do { |
907
e1af4bb92f92
(svn r1393) fix [ 1096026 ]. Autorenew trains should now hopefully work like it did before autoreplace was added
bjarni
parents:
892
diff
changeset
|
1609 |
if ( v->engine_type != _autoreplace_array[v->engine_type] || (_patches.autorenew && (v->age - v->max_age) > (_patches.autorenew_months * 30))) { |
892
900c8825b413
(svn r1378) Fix: train engines are now only replaced if the engine is really set to be replaced and they are replaced to the type that engine type is set to be replaced to (instead of whtat the first engine in the train is set to)
bjarni
parents:
890
diff
changeset
|
1610 |
new_engine_and_autoreplace_money = (new_engine_and_autoreplace_money & 0xFFFF0000) + _autoreplace_array[v->engine_type]; // sets the new engine replacement type |
900c8825b413
(svn r1378) Fix: train engines are now only replaced if the engine is really set to be replaced and they are replaced to the type that engine type is set to be replaced to (instead of whtat the first engine in the train is set to)
bjarni
parents:
890
diff
changeset
|
1611 |
DoCommandP(v->tile, v->index, new_engine_and_autoreplace_money, NULL, CMD_REPLACE_VEHICLE | CMD_SHOW_NO_ERROR); |
842 | 1612 |
} |
892
900c8825b413
(svn r1378) Fix: train engines are now only replaced if the engine is really set to be replaced and they are replaced to the type that engine type is set to be replaced to (instead of whtat the first engine in the train is set to)
bjarni
parents:
890
diff
changeset
|
1613 |
} while ((v=v->next) != NULL); |
842 | 1614 |
} |
1615 |
_current_player = OWNER_NONE; |
|
0 | 1616 |
} |
1617 |
||
1618 |
||
1619 |
int32 CmdNameVehicle(int x, int y, uint32 flags, uint32 p1, uint32 p2) |
|
1620 |
{ |
|
1621 |
Vehicle *v; |
|
1622 |
StringID str; |
|
1623 |
||
919
544f374ee392
(svn r1407) -Codechange: changed a lot around _stations, _vehicles, _towns and _industries
truelight
parents:
915
diff
changeset
|
1624 |
v = GetVehicle(p1); |
0 | 1625 |
|
1626 |
if (!CheckOwnership(v->owner)) |
|
1627 |
return CMD_ERROR; |
|
1628 |
||
543
946badd71033
(svn r942) -Merged branch/network back into the trunk
truelight
parents:
541
diff
changeset
|
1629 |
str = AllocateNameUnique((byte*)_decode_parameters, 2); |
0 | 1630 |
if (str == 0) |
1631 |
return CMD_ERROR; |
|
193
0a7025304867
(svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents:
164
diff
changeset
|
1632 |
|
0 | 1633 |
if (flags & DC_EXEC) { |
1634 |
StringID old_str = v->string_id; |
|
1635 |
v->string_id = str; |
|
1636 |
DeleteName(old_str); |
|
588 | 1637 |
ResortVehicleLists(); |
0 | 1638 |
MarkWholeScreenDirty(); |
1639 |
} else { |
|
1640 |
DeleteName(str); |
|
1641 |
} |
|
1642 |
||
1643 |
return 0; |
|
1644 |
} |
|
1645 |
||
1646 |
||
1647 |
||
1648 |
static Rect _old_vehicle_coords; |
|
1649 |
||
1650 |
void BeginVehicleMove(Vehicle *v) { |
|
1651 |
_old_vehicle_coords.left = v->left_coord; |
|
1652 |
_old_vehicle_coords.top = v->top_coord; |
|
1653 |
_old_vehicle_coords.right = v->right_coord; |
|
1654 |
_old_vehicle_coords.bottom = v->bottom_coord; |
|
1655 |
} |
|
1656 |
||
1657 |
void EndVehicleMove(Vehicle *v) |
|
1658 |
{ |
|
1659 |
MarkAllViewportsDirty( |
|
1660 |
min(_old_vehicle_coords.left,v->left_coord), |
|
1661 |
min(_old_vehicle_coords.top,v->top_coord), |
|
1662 |
max(_old_vehicle_coords.right,v->right_coord)+1, |
|
1663 |
max(_old_vehicle_coords.bottom,v->bottom_coord)+1 |
|
1664 |
); |
|
1665 |
} |
|
1666 |
||
1667 |
/* returns true if staying in the same tile */ |
|
1668 |
bool GetNewVehiclePos(Vehicle *v, GetNewVehiclePosResult *gp) |
|
1669 |
{ |
|
1670 |
static const int8 _delta_coord[16] = { |
|
1671 |
-1,-1,-1, 0, 1, 1, 1, 0, /* x */ |
|
1672 |
-1, 0, 1, 1, 1, 0,-1,-1, /* y */ |
|
1673 |
}; |
|
1674 |
||
1675 |
int x = v->x_pos + _delta_coord[v->direction]; |
|
1676 |
int y = v->y_pos + _delta_coord[v->direction + 8]; |
|
1677 |
||
1678 |
gp->x = x; |
|
1679 |
gp->y = y; |
|
1680 |
gp->old_tile = v->tile; |
|
1681 |
gp->new_tile = TILE_FROM_XY(x,y); |
|
1682 |
return gp->old_tile == gp->new_tile; |
|
1683 |
} |
|
1684 |
||
1685 |
static const byte _new_direction_table[9] = { |
|
1686 |
0, 7, 6, |
|
1687 |
1, 3, 5, |
|
1688 |
2, 3, 4, |
|
1689 |
}; |
|
1690 |
||
1691 |
byte GetDirectionTowards(Vehicle *v, int x, int y) |
|
1692 |
{ |
|
1693 |
byte dirdiff, dir; |
|
1694 |
int i = 0; |
|
1695 |
||
1696 |
if (y >= v->y_pos) { |
|
1697 |
if (y != v->y_pos) i+=3; |
|
1698 |
i+=3; |
|
1699 |
} |
|
1700 |
||
1701 |
if (x >= v->x_pos) { |
|
1702 |
if (x != v->x_pos) i++; |
|
1703 |
i++; |
|
1704 |
} |
|
1705 |
||
1706 |
dir = v->direction; |
|
1707 |
||
1708 |
dirdiff = _new_direction_table[i] - dir; |
|
1709 |
if (dirdiff == 0) |
|
1710 |
return dir; |
|
1711 |
return (dir+((dirdiff&7)<5?1:-1)) & 7; |
|
1712 |
} |
|
1713 |
||
22 | 1714 |
/* Return value has bit 0x2 set, when the vehicle enters a station. Then, |
1715 |
* result << 8 contains the id of the station entered. If the return value has |
|
1716 |
* bit 0x8 set, the vehicle could not and did not enter the tile. Are there |
|
1717 |
* other bits that can be set? */ |
|
0 | 1718 |
uint32 VehicleEnterTile(Vehicle *v, uint tile, int x, int y) |
193
0a7025304867
(svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents:
164
diff
changeset
|
1719 |
{ |
0 | 1720 |
uint old_tile = v->tile; |
1035
812f837ee03f
(svn r1536) Move GET_TILEHEIGHT, GET_TILETYPE and IS_TILETYPE to map.h, turn them into inline functions and add some asserts
tron
parents:
1024
diff
changeset
|
1721 |
uint32 result = _tile_type_procs[TileType(tile)]->vehicle_enter_tile_proc(v, tile, x, y); |
193
0a7025304867
(svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents:
164
diff
changeset
|
1722 |
|
22 | 1723 |
/* When vehicle_enter_tile_proc returns 8, that apparently means that |
1724 |
* we cannot enter the tile at all. In that case, don't call |
|
1725 |
* leave_tile. */ |
|
0 | 1726 |
if (!(result & 8) && old_tile != tile) { |
1035
812f837ee03f
(svn r1536) Move GET_TILEHEIGHT, GET_TILETYPE and IS_TILETYPE to map.h, turn them into inline functions and add some asserts
tron
parents:
1024
diff
changeset
|
1727 |
VehicleLeaveTileProc *proc = _tile_type_procs[TileType(old_tile)]->vehicle_leave_tile_proc; |
0 | 1728 |
if (proc != NULL) |
1729 |
proc(v, old_tile, x, y); |
|
1730 |
} |
|
1731 |
return result; |
|
1732 |
} |
|
1733 |
||
1734 |
uint GetFreeUnitNumber(byte type) |
|
1735 |
{ |
|
1736 |
uint unit_num = 0; |
|
1737 |
Vehicle *u; |
|
1738 |
||
1739 |
restart: |
|
1740 |
unit_num++; |
|
1741 |
FOR_ALL_VEHICLES(u) { |
|
193
0a7025304867
(svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents:
164
diff
changeset
|
1742 |
if (u->type == type && u->owner == _current_player && |
0 | 1743 |
unit_num == u->unitnumber) |
1744 |
goto restart; |
|
1745 |
} |
|
1746 |
return unit_num; |
|
1747 |
} |
|
1748 |
||
1749 |
||
1750 |
// Save and load of vehicles |
|
1751 |
const byte _common_veh_desc[] = { |
|
1752 |
SLE_VAR(Vehicle,subtype, SLE_UINT8), |
|
193
0a7025304867
(svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents:
164
diff
changeset
|
1753 |
|
938
23cc832ac8a2
(svn r1426) -Codechange: cleaned up the reference code in the saveload routines
truelight
parents:
933
diff
changeset
|
1754 |
SLE_REF(Vehicle,next, REF_VEHICLE_OLD), |
0 | 1755 |
SLE_VAR(Vehicle,string_id, SLE_STRINGID), |
1756 |
SLE_VAR(Vehicle,unitnumber, SLE_UINT8), |
|
1757 |
SLE_VAR(Vehicle,owner, SLE_UINT8), |
|
1758 |
SLE_VAR(Vehicle,tile, SLE_UINT16), |
|
1759 |
SLE_VAR(Vehicle,dest_tile, SLE_UINT16), |
|
1760 |
||
1761 |
SLE_VAR(Vehicle,x_pos, SLE_INT16), |
|
1762 |
SLE_VAR(Vehicle,y_pos, SLE_INT16), |
|
1763 |
SLE_VAR(Vehicle,z_pos, SLE_UINT8), |
|
1764 |
SLE_VAR(Vehicle,direction, SLE_UINT8), |
|
1765 |
||
1766 |
SLE_VAR(Vehicle,cur_image, SLE_UINT16), |
|
1767 |
SLE_VAR(Vehicle,spritenum, SLE_UINT8), |
|
1768 |
SLE_VAR(Vehicle,sprite_width, SLE_UINT8), |
|
1769 |
SLE_VAR(Vehicle,sprite_height, SLE_UINT8), |
|
1770 |
SLE_VAR(Vehicle,z_height, SLE_UINT8), |
|
1771 |
SLE_VAR(Vehicle,x_offs, SLE_INT8), |
|
1772 |
SLE_VAR(Vehicle,y_offs, SLE_INT8), |
|
1773 |
SLE_VAR(Vehicle,engine_type, SLE_UINT16), |
|
445
beafc0fb8f12
(svn r654) Hopefully complete support for randomized variational spritegroups (i.e. the cars transporter in DBSetXL gets different cars each time) (pasky)
tron
parents:
410
diff
changeset
|
1774 |
|
0 | 1775 |
SLE_VAR(Vehicle,max_speed, SLE_UINT16), |
1776 |
SLE_VAR(Vehicle,cur_speed, SLE_UINT16), |
|
1777 |
SLE_VAR(Vehicle,subspeed, SLE_UINT8), |
|
1778 |
SLE_VAR(Vehicle,acceleration, SLE_UINT8), |
|
1779 |
SLE_VAR(Vehicle,progress, SLE_UINT8), |
|
1780 |
||
1781 |
SLE_VAR(Vehicle,vehstatus, SLE_UINT8), |
|
817
238bbdaa228b
(svn r1288) -Codechange: changed _map2 to an uint16. It is still saved and loaded as
truelight
parents:
812
diff
changeset
|
1782 |
SLE_CONDVAR(Vehicle,last_station_visited, SLE_FILE_U8 | SLE_VAR_U16, 0, 4), |
238bbdaa228b
(svn r1288) -Codechange: changed _map2 to an uint16. It is still saved and loaded as
truelight
parents:
812
diff
changeset
|
1783 |
SLE_CONDVAR(Vehicle,last_station_visited, SLE_UINT16, 5, 255), |
0 | 1784 |
|
1785 |
SLE_VAR(Vehicle,cargo_type, SLE_UINT8), |
|
1786 |
SLE_VAR(Vehicle,cargo_days, SLE_UINT8), |
|
1787 |
SLE_VAR(Vehicle,cargo_source, SLE_UINT8), |
|
1788 |
SLE_VAR(Vehicle,cargo_cap, SLE_UINT16), |
|
1789 |
SLE_VAR(Vehicle,cargo_count, SLE_UINT16), |
|
1790 |
||
1791 |
SLE_VAR(Vehicle,day_counter, SLE_UINT8), |
|
1792 |
SLE_VAR(Vehicle,tick_counter, SLE_UINT8), |
|
1793 |
||
1794 |
SLE_VAR(Vehicle,cur_order_index, SLE_UINT8), |
|
1795 |
SLE_VAR(Vehicle,num_orders, SLE_UINT8), |
|
956
dda0863632df
(svn r1448) -Fix: The current_order of a vehicle is now correctly saved (caused
truelight
parents:
941
diff
changeset
|
1796 |
|
dda0863632df
(svn r1448) -Fix: The current_order of a vehicle is now correctly saved (caused
truelight
parents:
941
diff
changeset
|
1797 |
/* This next line is for version 4 and prior compatibility.. it temporarily reads |
dda0863632df
(svn r1448) -Fix: The current_order of a vehicle is now correctly saved (caused
truelight
parents:
941
diff
changeset
|
1798 |
type and flags (which were both 4 bits) into type. Later on this is |
dda0863632df
(svn r1448) -Fix: The current_order of a vehicle is now correctly saved (caused
truelight
parents:
941
diff
changeset
|
1799 |
converted correctly */ |
dda0863632df
(svn r1448) -Fix: The current_order of a vehicle is now correctly saved (caused
truelight
parents:
941
diff
changeset
|
1800 |
SLE_CONDVARX(offsetof(Vehicle, current_order) + offsetof(Order, type), SLE_UINT8, 0, 4), |
dda0863632df
(svn r1448) -Fix: The current_order of a vehicle is now correctly saved (caused
truelight
parents:
941
diff
changeset
|
1801 |
SLE_CONDVARX(offsetof(Vehicle, current_order) + offsetof(Order, station), SLE_FILE_U8 | SLE_VAR_U16, 0, 4), |
dda0863632df
(svn r1448) -Fix: The current_order of a vehicle is now correctly saved (caused
truelight
parents:
941
diff
changeset
|
1802 |
|
dda0863632df
(svn r1448) -Fix: The current_order of a vehicle is now correctly saved (caused
truelight
parents:
941
diff
changeset
|
1803 |
/* Orders for version 5 and on */ |
dda0863632df
(svn r1448) -Fix: The current_order of a vehicle is now correctly saved (caused
truelight
parents:
941
diff
changeset
|
1804 |
SLE_CONDVARX(offsetof(Vehicle, current_order) + offsetof(Order, type), SLE_UINT8, 5, 255), |
dda0863632df
(svn r1448) -Fix: The current_order of a vehicle is now correctly saved (caused
truelight
parents:
941
diff
changeset
|
1805 |
SLE_CONDVARX(offsetof(Vehicle, current_order) + offsetof(Order, flags), SLE_UINT8, 5, 255), |
dda0863632df
(svn r1448) -Fix: The current_order of a vehicle is now correctly saved (caused
truelight
parents:
941
diff
changeset
|
1806 |
SLE_CONDVARX(offsetof(Vehicle, current_order) + offsetof(Order, station), SLE_UINT16, 5, 255), |
dda0863632df
(svn r1448) -Fix: The current_order of a vehicle is now correctly saved (caused
truelight
parents:
941
diff
changeset
|
1807 |
|
1024
5e446b5b3ec5
(svn r1525) -Codechange: rewrote the _order_array, now it can be made dynamic.
truelight
parents:
956
diff
changeset
|
1808 |
SLE_REF(Vehicle,orders, REF_ORDER), |
0 | 1809 |
|
1810 |
SLE_VAR(Vehicle,age, SLE_UINT16), |
|
1811 |
SLE_VAR(Vehicle,max_age, SLE_UINT16), |
|
1812 |
SLE_VAR(Vehicle,date_of_last_service,SLE_UINT16), |
|
1813 |
SLE_VAR(Vehicle,service_interval, SLE_UINT16), |
|
1814 |
SLE_VAR(Vehicle,reliability, SLE_UINT16), |
|
1815 |
SLE_VAR(Vehicle,reliability_spd_dec,SLE_UINT16), |
|
1816 |
SLE_VAR(Vehicle,breakdown_ctr, SLE_UINT8), |
|
1817 |
SLE_VAR(Vehicle,breakdown_delay, SLE_UINT8), |
|
1818 |
SLE_VAR(Vehicle,breakdowns_since_last_service, SLE_UINT8), |
|
1819 |
SLE_VAR(Vehicle,breakdown_chance, SLE_UINT8), |
|
1820 |
SLE_VAR(Vehicle,build_year, SLE_UINT8), |
|
1821 |
||
1822 |
SLE_VAR(Vehicle,load_unload_time_rem, SLE_UINT16), |
|
1823 |
||
1824 |
SLE_VAR(Vehicle,profit_this_year, SLE_INT32), |
|
1825 |
SLE_VAR(Vehicle,profit_last_year, SLE_INT32), |
|
1826 |
SLE_VAR(Vehicle,value, SLE_UINT32), |
|
1827 |
||
445
beafc0fb8f12
(svn r654) Hopefully complete support for randomized variational spritegroups (i.e. the cars transporter in DBSetXL gets different cars each time) (pasky)
tron
parents:
410
diff
changeset
|
1828 |
SLE_VAR(Vehicle,random_bits, SLE_UINT8), |
beafc0fb8f12
(svn r654) Hopefully complete support for randomized variational spritegroups (i.e. the cars transporter in DBSetXL gets different cars each time) (pasky)
tron
parents:
410
diff
changeset
|
1829 |
SLE_VAR(Vehicle,waiting_triggers, SLE_UINT8), |
beafc0fb8f12
(svn r654) Hopefully complete support for randomized variational spritegroups (i.e. the cars transporter in DBSetXL gets different cars each time) (pasky)
tron
parents:
410
diff
changeset
|
1830 |
|
1024
5e446b5b3ec5
(svn r1525) -Codechange: rewrote the _order_array, now it can be made dynamic.
truelight
parents:
956
diff
changeset
|
1831 |
SLE_REF(Vehicle,next_shared, REF_VEHICLE), |
5e446b5b3ec5
(svn r1525) -Codechange: rewrote the _order_array, now it can be made dynamic.
truelight
parents:
956
diff
changeset
|
1832 |
SLE_REF(Vehicle,prev_shared, REF_VEHICLE), |
5e446b5b3ec5
(svn r1525) -Codechange: rewrote the _order_array, now it can be made dynamic.
truelight
parents:
956
diff
changeset
|
1833 |
|
5e446b5b3ec5
(svn r1525) -Codechange: rewrote the _order_array, now it can be made dynamic.
truelight
parents:
956
diff
changeset
|
1834 |
// reserve extra space in savegame here. (currently 10 bytes) |
445
beafc0fb8f12
(svn r654) Hopefully complete support for randomized variational spritegroups (i.e. the cars transporter in DBSetXL gets different cars each time) (pasky)
tron
parents:
410
diff
changeset
|
1835 |
SLE_CONDARR(NullStruct,null,SLE_FILE_U8 | SLE_VAR_NULL, 2, 2, 255), /* 2 */ |
beafc0fb8f12
(svn r654) Hopefully complete support for randomized variational spritegroups (i.e. the cars transporter in DBSetXL gets different cars each time) (pasky)
tron
parents:
410
diff
changeset
|
1836 |
SLE_CONDARR(NullStruct,null,SLE_FILE_U32 | SLE_VAR_NULL, 2, 2, 255), /* 8 */ |
193
0a7025304867
(svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents:
164
diff
changeset
|
1837 |
|
0 | 1838 |
SLE_END() |
1839 |
}; |
|
1840 |
||
1841 |
||
1842 |
static const byte _train_desc[] = { |
|
1843 |
SLE_WRITEBYTE(Vehicle,type,VEH_Train, 0), // Train type. VEH_Train in mem, 0 in file. |
|
1844 |
SLE_INCLUDEX(0, INC_VEHICLE_COMMON), |
|
1845 |
SLE_VARX(offsetof(Vehicle,u)+offsetof(VehicleRail,crash_anim_pos), SLE_UINT16), |
|
1846 |
SLE_VARX(offsetof(Vehicle,u)+offsetof(VehicleRail,force_proceed), SLE_UINT8), |
|
1847 |
SLE_VARX(offsetof(Vehicle,u)+offsetof(VehicleRail,railtype), SLE_UINT8), |
|
1848 |
SLE_VARX(offsetof(Vehicle,u)+offsetof(VehicleRail,track), SLE_UINT8), |
|
1849 |
||
1850 |
SLE_CONDVARX(offsetof(Vehicle,u)+offsetof(VehicleRail,flags), SLE_UINT8, 2, 255), |
|
1851 |
SLE_CONDVARX(offsetof(Vehicle,u)+offsetof(VehicleRail,days_since_order_progr), SLE_UINT16, 2, 255), |
|
1852 |
||
1853 |
// reserve extra space in savegame here. (currently 13 bytes) |
|
1854 |
SLE_CONDARR(NullStruct,null,SLE_FILE_U8 | SLE_VAR_NULL, 13, 2, 255), |
|
1855 |
||
1856 |
SLE_END() |
|
1857 |
}; |
|
1858 |
||
1859 |
static const byte _roadveh_desc[] = { |
|
1860 |
SLE_WRITEBYTE(Vehicle,type,VEH_Road, 1), // Road type. VEH_Road in mem, 1 in file. |
|
1861 |
SLE_INCLUDEX(0, INC_VEHICLE_COMMON), |
|
1862 |
SLE_VARX(offsetof(Vehicle,u)+offsetof(VehicleRoad,state), SLE_UINT8), |
|
1863 |
SLE_VARX(offsetof(Vehicle,u)+offsetof(VehicleRoad,frame), SLE_UINT8), |
|
1864 |
SLE_VARX(offsetof(Vehicle,u)+offsetof(VehicleRoad,unk2), SLE_UINT16), |
|
1865 |
SLE_VARX(offsetof(Vehicle,u)+offsetof(VehicleRoad,overtaking), SLE_UINT8), |
|
1866 |
SLE_VARX(offsetof(Vehicle,u)+offsetof(VehicleRoad,overtaking_ctr),SLE_UINT8), |
|
1867 |
SLE_VARX(offsetof(Vehicle,u)+offsetof(VehicleRoad,crashed_ctr), SLE_UINT16), |
|
1868 |
SLE_VARX(offsetof(Vehicle,u)+offsetof(VehicleRoad,reverse_ctr), SLE_UINT8), |
|
1869 |
||
1870 |
// reserve extra space in savegame here. (currently 16 bytes) |
|
1871 |
SLE_CONDARR(NullStruct,null,SLE_FILE_U64 | SLE_VAR_NULL, 2, 2, 255), |
|
1872 |
||
1873 |
SLE_END() |
|
1874 |
}; |
|
1875 |
||
1876 |
static const byte _ship_desc[] = { |
|
1877 |
SLE_WRITEBYTE(Vehicle,type,VEH_Ship, 2), // Ship type. VEH_Ship in mem, 2 in file. |
|
1878 |
SLE_INCLUDEX(0, INC_VEHICLE_COMMON), |
|
1879 |
SLE_VARX(offsetof(Vehicle,u)+offsetof(VehicleShip,state), SLE_UINT8), |
|
1880 |
||
1881 |
// reserve extra space in savegame here. (currently 16 bytes) |
|
1882 |
SLE_CONDARR(NullStruct,null,SLE_FILE_U64 | SLE_VAR_NULL, 2, 2, 255), |
|
1883 |
||
1884 |
SLE_END() |
|
1885 |
}; |
|
1886 |
||
1887 |
static const byte _aircraft_desc[] = { |
|
1888 |
SLE_WRITEBYTE(Vehicle,type,VEH_Aircraft, 3), // Aircraft type. VEH_Aircraft in mem, 3 in file. |
|
1889 |
SLE_INCLUDEX(0, INC_VEHICLE_COMMON), |
|
1890 |
SLE_VARX(offsetof(Vehicle,u)+offsetof(VehicleAir,crashed_counter), SLE_UINT16), |
|
1891 |
SLE_VARX(offsetof(Vehicle,u)+offsetof(VehicleAir,pos), SLE_UINT8), |
|
817
238bbdaa228b
(svn r1288) -Codechange: changed _map2 to an uint16. It is still saved and loaded as
truelight
parents:
812
diff
changeset
|
1892 |
|
238bbdaa228b
(svn r1288) -Codechange: changed _map2 to an uint16. It is still saved and loaded as
truelight
parents:
812
diff
changeset
|
1893 |
SLE_CONDVARX(offsetof(Vehicle,u)+offsetof(VehicleAir,targetairport), SLE_FILE_U8 | SLE_VAR_U16, 0, 4), |
238bbdaa228b
(svn r1288) -Codechange: changed _map2 to an uint16. It is still saved and loaded as
truelight
parents:
812
diff
changeset
|
1894 |
SLE_CONDVARX(offsetof(Vehicle,u)+offsetof(VehicleAir,targetairport), SLE_UINT16, 5, 255), |
238bbdaa228b
(svn r1288) -Codechange: changed _map2 to an uint16. It is still saved and loaded as
truelight
parents:
812
diff
changeset
|
1895 |
|
0 | 1896 |
SLE_VARX(offsetof(Vehicle,u)+offsetof(VehicleAir,state), SLE_UINT8), |
193
0a7025304867
(svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents:
164
diff
changeset
|
1897 |
|
0 | 1898 |
SLE_CONDVARX(offsetof(Vehicle,u)+offsetof(VehicleAir,previous_pos), SLE_UINT8, 2, 255), |
1899 |
||
1900 |
// reserve extra space in savegame here. (currently 15 bytes) |
|
1901 |
SLE_CONDARR(NullStruct,null,SLE_FILE_U8 | SLE_VAR_NULL, 15, 2, 255), |
|
1902 |
||
1903 |
SLE_END() |
|
1904 |
}; |
|
1905 |
||
1906 |
static const byte _special_desc[] = { |
|
1907 |
SLE_WRITEBYTE(Vehicle,type,VEH_Special, 4), |
|
1908 |
||
1909 |
SLE_VAR(Vehicle,subtype, SLE_UINT8), |
|
193
0a7025304867
(svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents:
164
diff
changeset
|
1910 |
|
0 | 1911 |
SLE_VAR(Vehicle,tile, SLE_UINT16), |
1912 |
||
1913 |
SLE_VAR(Vehicle,x_pos, SLE_INT16), |
|
1914 |
SLE_VAR(Vehicle,y_pos, SLE_INT16), |
|
1915 |
SLE_VAR(Vehicle,z_pos, SLE_UINT8), |
|
1916 |
||
1917 |
SLE_VAR(Vehicle,cur_image, SLE_UINT16), |
|
1918 |
SLE_VAR(Vehicle,sprite_width, SLE_UINT8), |
|
1919 |
SLE_VAR(Vehicle,sprite_height, SLE_UINT8), |
|
1920 |
SLE_VAR(Vehicle,z_height, SLE_UINT8), |
|
1921 |
SLE_VAR(Vehicle,x_offs, SLE_INT8), |
|
1922 |
SLE_VAR(Vehicle,y_offs, SLE_INT8), |
|
1923 |
SLE_VAR(Vehicle,progress, SLE_UINT8), |
|
1924 |
SLE_VAR(Vehicle,vehstatus, SLE_UINT8), |
|
1925 |
||
1926 |
SLE_VARX(offsetof(Vehicle,u)+offsetof(VehicleSpecial,unk0), SLE_UINT16), |
|
1927 |
SLE_VARX(offsetof(Vehicle,u)+offsetof(VehicleSpecial,unk2), SLE_UINT8), |
|
1928 |
||
1929 |
// reserve extra space in savegame here. (currently 16 bytes) |
|
1930 |
SLE_CONDARR(NullStruct,null,SLE_FILE_U64 | SLE_VAR_NULL, 2, 2, 255), |
|
1931 |
||
1932 |
SLE_END() |
|
1933 |
}; |
|
1934 |
||
1935 |
static const byte _disaster_desc[] = { |
|
1936 |
SLE_WRITEBYTE(Vehicle,type,VEH_Disaster, 5), |
|
1937 |
||
938
23cc832ac8a2
(svn r1426) -Codechange: cleaned up the reference code in the saveload routines
truelight
parents:
933
diff
changeset
|
1938 |
SLE_REF(Vehicle,next, REF_VEHICLE_OLD), |
0 | 1939 |
|
1940 |
SLE_VAR(Vehicle,subtype, SLE_UINT8), |
|
1941 |
SLE_VAR(Vehicle,tile, SLE_UINT16), |
|
1942 |
SLE_VAR(Vehicle,dest_tile, SLE_UINT16), |
|
1943 |
||
1944 |
SLE_VAR(Vehicle,x_pos, SLE_INT16), |
|
1945 |
SLE_VAR(Vehicle,y_pos, SLE_INT16), |
|
1946 |
SLE_VAR(Vehicle,z_pos, SLE_UINT8), |
|
1947 |
SLE_VAR(Vehicle,direction, SLE_UINT8), |
|
1948 |
||
1949 |
SLE_VAR(Vehicle,x_offs, SLE_INT8), |
|
1950 |
SLE_VAR(Vehicle,y_offs, SLE_INT8), |
|
1951 |
SLE_VAR(Vehicle,sprite_width, SLE_UINT8), |
|
1952 |
SLE_VAR(Vehicle,sprite_height, SLE_UINT8), |
|
1953 |
SLE_VAR(Vehicle,z_height, SLE_UINT8), |
|
1954 |
SLE_VAR(Vehicle,owner, SLE_UINT8), |
|
1955 |
SLE_VAR(Vehicle,vehstatus, SLE_UINT8), |
|
956
dda0863632df
(svn r1448) -Fix: The current_order of a vehicle is now correctly saved (caused
truelight
parents:
941
diff
changeset
|
1956 |
SLE_CONDVARX(offsetof(Vehicle, current_order) + offsetof(Order, station), SLE_FILE_U8 | SLE_VAR_U16, 0, 4), |
dda0863632df
(svn r1448) -Fix: The current_order of a vehicle is now correctly saved (caused
truelight
parents:
941
diff
changeset
|
1957 |
SLE_CONDVARX(offsetof(Vehicle, current_order) + offsetof(Order, station), SLE_UINT16, 5, 255), |
0 | 1958 |
|
1959 |
SLE_VAR(Vehicle,cur_image, SLE_UINT16), |
|
1960 |
SLE_VAR(Vehicle,age, SLE_UINT16), |
|
1961 |
||
1962 |
SLE_VAR(Vehicle,tick_counter, SLE_UINT8), |
|
1963 |
||
1964 |
SLE_VARX(offsetof(Vehicle,u)+offsetof(VehicleDisaster,image_override), SLE_UINT16), |
|
1965 |
SLE_VARX(offsetof(Vehicle,u)+offsetof(VehicleDisaster,unk2), SLE_UINT16), |
|
1966 |
||
1967 |
// reserve extra space in savegame here. (currently 16 bytes) |
|
1968 |
SLE_CONDARR(NullStruct,null,SLE_FILE_U64 | SLE_VAR_NULL, 2, 2, 255), |
|
1969 |
||
1970 |
SLE_END() |
|
1971 |
}; |
|
1972 |
||
1973 |
||
1974 |
static const void *_veh_descs[] = { |
|
1975 |
_train_desc, |
|
1976 |
_roadveh_desc, |
|
1977 |
_ship_desc, |
|
1978 |
_aircraft_desc, |
|
1979 |
_special_desc, |
|
1980 |
_disaster_desc, |
|
1981 |
}; |
|
1982 |
||
1983 |
// Will be called when the vehicles need to be saved. |
|
1093
4fdc46eaf423
(svn r1594) Convert all undefined parameter lists to (void) and add the appropriate warning flags in the Makefile
tron
parents:
1082
diff
changeset
|
1984 |
static void Save_VEHS(void) |
0 | 1985 |
{ |
1986 |
Vehicle *v; |
|
1987 |
// Write the vehicles |
|
1988 |
FOR_ALL_VEHICLES(v) { |
|
1989 |
if (v->type != 0) { |
|
1990 |
SlSetArrayIndex(v->index); |
|
1991 |
SlObject(v, _veh_descs[v->type - 0x10]); |
|
1992 |
} |
|
1993 |
} |
|
1994 |
} |
|
1995 |
||
1996 |
// Will be called when vehicles need to be loaded. |
|
1093
4fdc46eaf423
(svn r1594) Convert all undefined parameter lists to (void) and add the appropriate warning flags in the Makefile
tron
parents:
1082
diff
changeset
|
1997 |
static void Load_VEHS(void) |
0 | 1998 |
{ |
1999 |
int index; |
|
2000 |
Vehicle *v; |
|
2001 |
||
2002 |
while ((index = SlIterateArray()) != -1) { |
|
919
544f374ee392
(svn r1407) -Codechange: changed a lot around _stations, _vehicles, _towns and _industries
truelight
parents:
915
diff
changeset
|
2003 |
Vehicle *v = GetVehicle(index); |
544f374ee392
(svn r1407) -Codechange: changed a lot around _stations, _vehicles, _towns and _industries
truelight
parents:
915
diff
changeset
|
2004 |
|
0 | 2005 |
SlObject(v, _veh_descs[SlReadByte()]); |
2006 |
if (v->type == VEH_Train) |
|
2007 |
v->u.rail.first_engine = 0xffff; |
|
817
238bbdaa228b
(svn r1288) -Codechange: changed _map2 to an uint16. It is still saved and loaded as
truelight
parents:
812
diff
changeset
|
2008 |
|
238bbdaa228b
(svn r1288) -Codechange: changed _map2 to an uint16. It is still saved and loaded as
truelight
parents:
812
diff
changeset
|
2009 |
/* Old savegames used 'last_station_visited = 0xFF', should be 0xFFFF */ |
238bbdaa228b
(svn r1288) -Codechange: changed _map2 to an uint16. It is still saved and loaded as
truelight
parents:
812
diff
changeset
|
2010 |
if (_sl.version < 5 && v->last_station_visited == 0xFF) |
238bbdaa228b
(svn r1288) -Codechange: changed _map2 to an uint16. It is still saved and loaded as
truelight
parents:
812
diff
changeset
|
2011 |
v->last_station_visited = 0xFFFF; |
956
dda0863632df
(svn r1448) -Fix: The current_order of a vehicle is now correctly saved (caused
truelight
parents:
941
diff
changeset
|
2012 |
|
dda0863632df
(svn r1448) -Fix: The current_order of a vehicle is now correctly saved (caused
truelight
parents:
941
diff
changeset
|
2013 |
if (_sl.version < 5) { |
dda0863632df
(svn r1448) -Fix: The current_order of a vehicle is now correctly saved (caused
truelight
parents:
941
diff
changeset
|
2014 |
/* Convert the current_order.type (which is a mix of type and flags, because |
dda0863632df
(svn r1448) -Fix: The current_order of a vehicle is now correctly saved (caused
truelight
parents:
941
diff
changeset
|
2015 |
in those versions, they both were 4 bits big) to type and flags */ |
dda0863632df
(svn r1448) -Fix: The current_order of a vehicle is now correctly saved (caused
truelight
parents:
941
diff
changeset
|
2016 |
v->current_order.flags = (v->current_order.type & 0xF0) >> 4; |
dda0863632df
(svn r1448) -Fix: The current_order of a vehicle is now correctly saved (caused
truelight
parents:
941
diff
changeset
|
2017 |
v->current_order.type = v->current_order.type & 0x0F; |
dda0863632df
(svn r1448) -Fix: The current_order of a vehicle is now correctly saved (caused
truelight
parents:
941
diff
changeset
|
2018 |
} |
0 | 2019 |
} |
2020 |
||
2021 |
// Iterate through trains and set first_engine appropriately. |
|
2022 |
FOR_ALL_VEHICLES(v) { |
|
2023 |
Vehicle *w; |
|
2024 |
||
1067
3ba7987a004e
(svn r1568) made an enum of train subtypes to make the code more readable
bjarni
parents:
1063
diff
changeset
|
2025 |
if (v->type != VEH_Train || v->subtype != TS_Front_Engine) |
0 | 2026 |
continue; |
2027 |
||
2028 |
for (w = v->next; w; w = w->next) |
|
2029 |
w->u.rail.first_engine = v->engine_type; |
|
2030 |
} |
|
919
544f374ee392
(svn r1407) -Codechange: changed a lot around _stations, _vehicles, _towns and _industries
truelight
parents:
915
diff
changeset
|
2031 |
|
1024
5e446b5b3ec5
(svn r1525) -Codechange: rewrote the _order_array, now it can be made dynamic.
truelight
parents:
956
diff
changeset
|
2032 |
/* Check for shared order-lists (we now use pointers for that) */ |
5e446b5b3ec5
(svn r1525) -Codechange: rewrote the _order_array, now it can be made dynamic.
truelight
parents:
956
diff
changeset
|
2033 |
if (_sl.full_version < 0x502) { |
5e446b5b3ec5
(svn r1525) -Codechange: rewrote the _order_array, now it can be made dynamic.
truelight
parents:
956
diff
changeset
|
2034 |
FOR_ALL_VEHICLES(v) { |
5e446b5b3ec5
(svn r1525) -Codechange: rewrote the _order_array, now it can be made dynamic.
truelight
parents:
956
diff
changeset
|
2035 |
Vehicle *u; |
5e446b5b3ec5
(svn r1525) -Codechange: rewrote the _order_array, now it can be made dynamic.
truelight
parents:
956
diff
changeset
|
2036 |
|
5e446b5b3ec5
(svn r1525) -Codechange: rewrote the _order_array, now it can be made dynamic.
truelight
parents:
956
diff
changeset
|
2037 |
if (v->type == 0) |
5e446b5b3ec5
(svn r1525) -Codechange: rewrote the _order_array, now it can be made dynamic.
truelight
parents:
956
diff
changeset
|
2038 |
continue; |
5e446b5b3ec5
(svn r1525) -Codechange: rewrote the _order_array, now it can be made dynamic.
truelight
parents:
956
diff
changeset
|
2039 |
|
5e446b5b3ec5
(svn r1525) -Codechange: rewrote the _order_array, now it can be made dynamic.
truelight
parents:
956
diff
changeset
|
2040 |
FOR_ALL_VEHICLES_FROM(u, v->index + 1) { |
5e446b5b3ec5
(svn r1525) -Codechange: rewrote the _order_array, now it can be made dynamic.
truelight
parents:
956
diff
changeset
|
2041 |
if (u->type == 0) |
5e446b5b3ec5
(svn r1525) -Codechange: rewrote the _order_array, now it can be made dynamic.
truelight
parents:
956
diff
changeset
|
2042 |
continue; |
5e446b5b3ec5
(svn r1525) -Codechange: rewrote the _order_array, now it can be made dynamic.
truelight
parents:
956
diff
changeset
|
2043 |
|
5e446b5b3ec5
(svn r1525) -Codechange: rewrote the _order_array, now it can be made dynamic.
truelight
parents:
956
diff
changeset
|
2044 |
/* If a vehicle has the same orders, add the link to eachother |
5e446b5b3ec5
(svn r1525) -Codechange: rewrote the _order_array, now it can be made dynamic.
truelight
parents:
956
diff
changeset
|
2045 |
in both vehicles */ |
5e446b5b3ec5
(svn r1525) -Codechange: rewrote the _order_array, now it can be made dynamic.
truelight
parents:
956
diff
changeset
|
2046 |
if (v->orders == u->orders) { |
5e446b5b3ec5
(svn r1525) -Codechange: rewrote the _order_array, now it can be made dynamic.
truelight
parents:
956
diff
changeset
|
2047 |
v->next_shared = u; |
5e446b5b3ec5
(svn r1525) -Codechange: rewrote the _order_array, now it can be made dynamic.
truelight
parents:
956
diff
changeset
|
2048 |
u->prev_shared = v; |
5e446b5b3ec5
(svn r1525) -Codechange: rewrote the _order_array, now it can be made dynamic.
truelight
parents:
956
diff
changeset
|
2049 |
break; |
5e446b5b3ec5
(svn r1525) -Codechange: rewrote the _order_array, now it can be made dynamic.
truelight
parents:
956
diff
changeset
|
2050 |
} |
5e446b5b3ec5
(svn r1525) -Codechange: rewrote the _order_array, now it can be made dynamic.
truelight
parents:
956
diff
changeset
|
2051 |
} |
5e446b5b3ec5
(svn r1525) -Codechange: rewrote the _order_array, now it can be made dynamic.
truelight
parents:
956
diff
changeset
|
2052 |
} |
5e446b5b3ec5
(svn r1525) -Codechange: rewrote the _order_array, now it can be made dynamic.
truelight
parents:
956
diff
changeset
|
2053 |
} |
5e446b5b3ec5
(svn r1525) -Codechange: rewrote the _order_array, now it can be made dynamic.
truelight
parents:
956
diff
changeset
|
2054 |
|
919
544f374ee392
(svn r1407) -Codechange: changed a lot around _stations, _vehicles, _towns and _industries
truelight
parents:
915
diff
changeset
|
2055 |
/* This is to ensure all pointers are within the limits of |
544f374ee392
(svn r1407) -Codechange: changed a lot around _stations, _vehicles, _towns and _industries
truelight
parents:
915
diff
changeset
|
2056 |
_vehicles_size */ |
544f374ee392
(svn r1407) -Codechange: changed a lot around _stations, _vehicles, _towns and _industries
truelight
parents:
915
diff
changeset
|
2057 |
if (_vehicle_id_ctr_day >= _vehicles_size) |
544f374ee392
(svn r1407) -Codechange: changed a lot around _stations, _vehicles, _towns and _industries
truelight
parents:
915
diff
changeset
|
2058 |
_vehicle_id_ctr_day = 0; |
0 | 2059 |
} |
2060 |
||
2061 |
static const byte _depot_desc[] = { |
|
2062 |
SLE_VAR(Depot,xy, SLE_UINT16), |
|
2063 |
SLE_VAR(Depot,town_index, SLE_UINT16), |
|
2064 |
SLE_END() |
|
2065 |
}; |
|
2066 |
||
1093
4fdc46eaf423
(svn r1594) Convert all undefined parameter lists to (void) and add the appropriate warning flags in the Makefile
tron
parents:
1082
diff
changeset
|
2067 |
static void Save_DEPT(void) |
0 | 2068 |
{ |
2069 |
Depot *d; |
|
2070 |
int i; |
|
2071 |
for(i=0,d=_depots; i!=lengthof(_depots); i++,d++) { |
|
2072 |
if (d->xy != 0) { |
|
2073 |
SlSetArrayIndex(i); |
|
2074 |
SlObject(d, _depot_desc); |
|
2075 |
} |
|
2076 |
} |
|
2077 |
} |
|
2078 |
||
1093
4fdc46eaf423
(svn r1594) Convert all undefined parameter lists to (void) and add the appropriate warning flags in the Makefile
tron
parents:
1082
diff
changeset
|
2079 |
static void Load_DEPT(void) |
0 | 2080 |
{ |
2081 |
int index; |
|
2082 |
while ((index = SlIterateArray()) != -1) { |
|
2083 |
SlObject(&_depots[index], _depot_desc); |
|
2084 |
} |
|
2085 |
} |
|
2086 |
||
395
788a9bba0889
(svn r587) -newgrf: Rename all /Checkpoint/i tokens to 'Waypoint's. The name actually makes some sense and is also compatible with TTDPatch (pasky).
darkvater
parents:
337
diff
changeset
|
2087 |
static const byte _waypoint_desc[] = { |
788a9bba0889
(svn r587) -newgrf: Rename all /Checkpoint/i tokens to 'Waypoint's. The name actually makes some sense and is also compatible with TTDPatch (pasky).
darkvater
parents:
337
diff
changeset
|
2088 |
SLE_VAR(Waypoint,xy, SLE_UINT16), |
788a9bba0889
(svn r587) -newgrf: Rename all /Checkpoint/i tokens to 'Waypoint's. The name actually makes some sense and is also compatible with TTDPatch (pasky).
darkvater
parents:
337
diff
changeset
|
2089 |
SLE_VAR(Waypoint,town_or_string, SLE_UINT16), |
788a9bba0889
(svn r587) -newgrf: Rename all /Checkpoint/i tokens to 'Waypoint's. The name actually makes some sense and is also compatible with TTDPatch (pasky).
darkvater
parents:
337
diff
changeset
|
2090 |
SLE_VAR(Waypoint,deleted, SLE_UINT8), |
0 | 2091 |
|
395
788a9bba0889
(svn r587) -newgrf: Rename all /Checkpoint/i tokens to 'Waypoint's. The name actually makes some sense and is also compatible with TTDPatch (pasky).
darkvater
parents:
337
diff
changeset
|
2092 |
SLE_CONDVAR(Waypoint, build_date, SLE_UINT16, 3, 255), |
788a9bba0889
(svn r587) -newgrf: Rename all /Checkpoint/i tokens to 'Waypoint's. The name actually makes some sense and is also compatible with TTDPatch (pasky).
darkvater
parents:
337
diff
changeset
|
2093 |
SLE_CONDVAR(Waypoint, stat_id, SLE_UINT8, 3, 255), |
0 | 2094 |
|
2095 |
SLE_END() |
|
2096 |
}; |
|
2097 |
||
1093
4fdc46eaf423
(svn r1594) Convert all undefined parameter lists to (void) and add the appropriate warning flags in the Makefile
tron
parents:
1082
diff
changeset
|
2098 |
static void Save_CHKP(void) |
0 | 2099 |
{ |
395
788a9bba0889
(svn r587) -newgrf: Rename all /Checkpoint/i tokens to 'Waypoint's. The name actually makes some sense and is also compatible with TTDPatch (pasky).
darkvater
parents:
337
diff
changeset
|
2100 |
Waypoint *cp; |
0 | 2101 |
int i; |
395
788a9bba0889
(svn r587) -newgrf: Rename all /Checkpoint/i tokens to 'Waypoint's. The name actually makes some sense and is also compatible with TTDPatch (pasky).
darkvater
parents:
337
diff
changeset
|
2102 |
for(i=0,cp=_waypoints; i!=lengthof(_waypoints); i++,cp++) { |
0 | 2103 |
if (cp->xy != 0) { |
2104 |
SlSetArrayIndex(i); |
|
395
788a9bba0889
(svn r587) -newgrf: Rename all /Checkpoint/i tokens to 'Waypoint's. The name actually makes some sense and is also compatible with TTDPatch (pasky).
darkvater
parents:
337
diff
changeset
|
2105 |
SlObject(cp, _waypoint_desc); |
0 | 2106 |
} |
2107 |
} |
|
2108 |
} |
|
2109 |
||
1093
4fdc46eaf423
(svn r1594) Convert all undefined parameter lists to (void) and add the appropriate warning flags in the Makefile
tron
parents:
1082
diff
changeset
|
2110 |
static void Load_CHKP(void) |
0 | 2111 |
{ |
2112 |
int index; |
|
2113 |
while ((index = SlIterateArray()) != -1) { |
|
395
788a9bba0889
(svn r587) -newgrf: Rename all /Checkpoint/i tokens to 'Waypoint's. The name actually makes some sense and is also compatible with TTDPatch (pasky).
darkvater
parents:
337
diff
changeset
|
2114 |
SlObject(&_waypoints[index], _waypoint_desc); |
0 | 2115 |
} |
2116 |
} |
|
2117 |
||
2118 |
const ChunkHandler _veh_chunk_handlers[] = { |
|
2119 |
{ 'VEHS', Save_VEHS, Load_VEHS, CH_SPARSE_ARRAY}, |
|
2120 |
{ 'DEPT', Save_DEPT, Load_DEPT, CH_ARRAY}, |
|
2121 |
{ 'CHKP', Save_CHKP, Load_CHKP, CH_ARRAY | CH_LAST}, |
|
2122 |
}; |
|
2123 |
||
2124 |