Mercurial > hg > openttd
annotate src/autoreplace_cmd.cpp @ 12279:329b186db8cd draft
(svn r16694) -Fix [FS#2995] (rgradual loading, rnewindustries): only pay for whatever has been actually unloaded and perform the payment when unloading has finished. This fixes, amongst others:
* cheating by starting to unload and after getting paid rushing to the depot to get sold (or unloading, loading and getting paid again for the remainder)
* cargo being dropped onto a station at the moment a stockpiling industry doesn't accept it anymore
* industries getting cargo that has not been unloaded yet and subsequently dumping it back on the station in one go
Note: you will now get paid after the unloading has finished, so you'll have to wait a bit longer for 'your' money.
author | rubidium <rubidium@openttd.org> |
---|---|
date | Mon, 29 Jun 2009 19:55:36 +0000 |
parents | eef24db9209a |
children | 7ec79afe8c18 |
rev | line source |
---|---|
6264
37ecb2d0cdfb
(svn r9073) -Codechange: moved autoreplace to a file of it's own (now autoreplace has a cmd and a gui file)
bjarni <bjarni@openttd.org>
parents:
diff
changeset
|
1 /* $Id$ */ |
37ecb2d0cdfb
(svn r9073) -Codechange: moved autoreplace to a file of it's own (now autoreplace has a cmd and a gui file)
bjarni <bjarni@openttd.org>
parents:
diff
changeset
|
2 |
8999
0a4c639d1b8f
(svn r12794) -Doc: added missing doxygen comment in autoreplace_cmd.cpp
bjarni <bjarni@openttd.org>
parents:
8997
diff
changeset
|
3 /** @file autoreplace_cmd.cpp Deals with autoreplace execution but not the setup */ |
0a4c639d1b8f
(svn r12794) -Doc: added missing doxygen comment in autoreplace_cmd.cpp
bjarni <bjarni@openttd.org>
parents:
8997
diff
changeset
|
4 |
6264
37ecb2d0cdfb
(svn r9073) -Codechange: moved autoreplace to a file of it's own (now autoreplace has a cmd and a gui file)
bjarni <bjarni@openttd.org>
parents:
diff
changeset
|
5 #include "stdafx.h" |
10208
39cf8eebfda5
(svn r14422) -Codechange: also reflect the changes of r14421 in the filenames.
rubidium <rubidium@openttd.org>
parents:
10207
diff
changeset
|
6 #include "company_func.h" |
6264
37ecb2d0cdfb
(svn r9073) -Codechange: moved autoreplace to a file of it's own (now autoreplace has a cmd and a gui file)
bjarni <bjarni@openttd.org>
parents:
diff
changeset
|
7 #include "vehicle_gui.h" |
37ecb2d0cdfb
(svn r9073) -Codechange: moved autoreplace to a file of it's own (now autoreplace has a cmd and a gui file)
bjarni <bjarni@openttd.org>
parents:
diff
changeset
|
8 #include "train.h" |
9936
bd9b969d5c38
(svn r14091) -Cleanup (r14083): Remove superfluous '#include's.
frosch <frosch@openttd.org>
parents:
9930
diff
changeset
|
9 #include "rail.h" |
8116
9cc845deddfe
(svn r11677) -Codechange: move price and command related types/functions to their respective places.
rubidium <rubidium@openttd.org>
parents:
8114
diff
changeset
|
10 #include "command_func.h" |
9936
bd9b969d5c38
(svn r14091) -Cleanup (r14083): Remove superfluous '#include's.
frosch <frosch@openttd.org>
parents:
9930
diff
changeset
|
11 #include "engine_base.h" |
bd9b969d5c38
(svn r14091) -Cleanup (r14083): Remove superfluous '#include's.
frosch <frosch@openttd.org>
parents:
9930
diff
changeset
|
12 #include "engine_func.h" |
8144
d18c8a0bb638
(svn r11706) -Codechange: split vehicle.h and remove another bunch of useless includes.
rubidium <rubidium@openttd.org>
parents:
8131
diff
changeset
|
13 #include "vehicle_func.h" |
8131
e300ac8001ae
(svn r11692) -Codechange: move some functions from 'functions.h' to a more logical place and remove about 50% of the includes of 'functions.h'
rubidium <rubidium@openttd.org>
parents:
8116
diff
changeset
|
14 #include "functions.h" |
8212
11263ebe590a
(svn r11775) -Codechange: move all autoreplace/autorenew functions to a single location.
rubidium <rubidium@openttd.org>
parents:
8211
diff
changeset
|
15 #include "autoreplace_func.h" |
8363
e912fe1c1424
(svn r11929) -Fix (r9981)[FS#1624]: [autoreplace] fixed a case where a single headed locomotive caused an assert when being replaced to a dualheaded one
bjarni <bjarni@openttd.org>
parents:
8362
diff
changeset
|
16 #include "articulated_vehicles.h" |
10122
dff578338ffb
(svn r14306) -Codechange: unify the code to draw the vehicle list.
rubidium <rubidium@openttd.org>
parents:
10015
diff
changeset
|
17 #include "core/alloc_func.hpp" |
6264
37ecb2d0cdfb
(svn r9073) -Codechange: moved autoreplace to a file of it's own (now autoreplace has a cmd and a gui file)
bjarni <bjarni@openttd.org>
parents:
diff
changeset
|
18 |
8264
2495310e220f
(svn r11828) -Codechange: include table/* as the last includes and remove an unneeded include from openttd.h.
rubidium <rubidium@openttd.org>
parents:
8258
diff
changeset
|
19 #include "table/strings.h" |
2495310e220f
(svn r11828) -Codechange: include table/* as the last includes and remove an unneeded include from openttd.h.
rubidium <rubidium@openttd.org>
parents:
8258
diff
changeset
|
20 |
9889
2bedf7c40bee
(svn r14037) -Fix (r8610): The autoreplace gui showed vehicle types for replacement which CmdSetAutoReplace() did not accept.
frosch <frosch@openttd.org>
parents:
9883
diff
changeset
|
21 /** Figure out if two engines got at least one type of cargo in common (refitting if needed) |
2bedf7c40bee
(svn r14037) -Fix (r8610): The autoreplace gui showed vehicle types for replacement which CmdSetAutoReplace() did not accept.
frosch <frosch@openttd.org>
parents:
9883
diff
changeset
|
22 * @param engine_a one of the EngineIDs |
2bedf7c40bee
(svn r14037) -Fix (r8610): The autoreplace gui showed vehicle types for replacement which CmdSetAutoReplace() did not accept.
frosch <frosch@openttd.org>
parents:
9883
diff
changeset
|
23 * @param engine_b the other EngineID |
2bedf7c40bee
(svn r14037) -Fix (r8610): The autoreplace gui showed vehicle types for replacement which CmdSetAutoReplace() did not accept.
frosch <frosch@openttd.org>
parents:
9883
diff
changeset
|
24 * @param type the type of the engines |
2bedf7c40bee
(svn r14037) -Fix (r8610): The autoreplace gui showed vehicle types for replacement which CmdSetAutoReplace() did not accept.
frosch <frosch@openttd.org>
parents:
9883
diff
changeset
|
25 * @return true if they can both carry the same type of cargo (or at least one of them got no capacity at all) |
2bedf7c40bee
(svn r14037) -Fix (r8610): The autoreplace gui showed vehicle types for replacement which CmdSetAutoReplace() did not accept.
frosch <frosch@openttd.org>
parents:
9883
diff
changeset
|
26 */ |
2bedf7c40bee
(svn r14037) -Fix (r8610): The autoreplace gui showed vehicle types for replacement which CmdSetAutoReplace() did not accept.
frosch <frosch@openttd.org>
parents:
9883
diff
changeset
|
27 static bool EnginesGotCargoInCommon(EngineID engine_a, EngineID engine_b, VehicleType type) |
2bedf7c40bee
(svn r14037) -Fix (r8610): The autoreplace gui showed vehicle types for replacement which CmdSetAutoReplace() did not accept.
frosch <frosch@openttd.org>
parents:
9883
diff
changeset
|
28 { |
2bedf7c40bee
(svn r14037) -Fix (r8610): The autoreplace gui showed vehicle types for replacement which CmdSetAutoReplace() did not accept.
frosch <frosch@openttd.org>
parents:
9883
diff
changeset
|
29 uint32 available_cargos_a = GetUnionOfArticulatedRefitMasks(engine_a, type, true); |
2bedf7c40bee
(svn r14037) -Fix (r8610): The autoreplace gui showed vehicle types for replacement which CmdSetAutoReplace() did not accept.
frosch <frosch@openttd.org>
parents:
9883
diff
changeset
|
30 uint32 available_cargos_b = GetUnionOfArticulatedRefitMasks(engine_b, type, true); |
2bedf7c40bee
(svn r14037) -Fix (r8610): The autoreplace gui showed vehicle types for replacement which CmdSetAutoReplace() did not accept.
frosch <frosch@openttd.org>
parents:
9883
diff
changeset
|
31 return (available_cargos_a == 0 || available_cargos_b == 0 || (available_cargos_a & available_cargos_b) != 0); |
2bedf7c40bee
(svn r14037) -Fix (r8610): The autoreplace gui showed vehicle types for replacement which CmdSetAutoReplace() did not accept.
frosch <frosch@openttd.org>
parents:
9883
diff
changeset
|
32 } |
2bedf7c40bee
(svn r14037) -Fix (r8610): The autoreplace gui showed vehicle types for replacement which CmdSetAutoReplace() did not accept.
frosch <frosch@openttd.org>
parents:
9883
diff
changeset
|
33 |
2bedf7c40bee
(svn r14037) -Fix (r8610): The autoreplace gui showed vehicle types for replacement which CmdSetAutoReplace() did not accept.
frosch <frosch@openttd.org>
parents:
9883
diff
changeset
|
34 /** |
2bedf7c40bee
(svn r14037) -Fix (r8610): The autoreplace gui showed vehicle types for replacement which CmdSetAutoReplace() did not accept.
frosch <frosch@openttd.org>
parents:
9883
diff
changeset
|
35 * Checks some basic properties whether autoreplace is allowed |
2bedf7c40bee
(svn r14037) -Fix (r8610): The autoreplace gui showed vehicle types for replacement which CmdSetAutoReplace() did not accept.
frosch <frosch@openttd.org>
parents:
9883
diff
changeset
|
36 * @param from Origin engine |
2bedf7c40bee
(svn r14037) -Fix (r8610): The autoreplace gui showed vehicle types for replacement which CmdSetAutoReplace() did not accept.
frosch <frosch@openttd.org>
parents:
9883
diff
changeset
|
37 * @param to Destination engine |
10207
c54d140df948
(svn r14421) -Codechange: rename all player variables/types to company *or* client so it is immediatelly clear which one you are working with.
rubidium <rubidium@openttd.org>
parents:
10198
diff
changeset
|
38 * @param company Company to check for |
9889
2bedf7c40bee
(svn r14037) -Fix (r8610): The autoreplace gui showed vehicle types for replacement which CmdSetAutoReplace() did not accept.
frosch <frosch@openttd.org>
parents:
9883
diff
changeset
|
39 * @return true if autoreplace is allowed |
2bedf7c40bee
(svn r14037) -Fix (r8610): The autoreplace gui showed vehicle types for replacement which CmdSetAutoReplace() did not accept.
frosch <frosch@openttd.org>
parents:
9883
diff
changeset
|
40 */ |
10207
c54d140df948
(svn r14421) -Codechange: rename all player variables/types to company *or* client so it is immediatelly clear which one you are working with.
rubidium <rubidium@openttd.org>
parents:
10198
diff
changeset
|
41 bool CheckAutoreplaceValidity(EngineID from, EngineID to, CompanyID company) |
9889
2bedf7c40bee
(svn r14037) -Fix (r8610): The autoreplace gui showed vehicle types for replacement which CmdSetAutoReplace() did not accept.
frosch <frosch@openttd.org>
parents:
9883
diff
changeset
|
42 { |
2bedf7c40bee
(svn r14037) -Fix (r8610): The autoreplace gui showed vehicle types for replacement which CmdSetAutoReplace() did not accept.
frosch <frosch@openttd.org>
parents:
9883
diff
changeset
|
43 /* First we make sure that it's a valid type the user requested |
2bedf7c40bee
(svn r14037) -Fix (r8610): The autoreplace gui showed vehicle types for replacement which CmdSetAutoReplace() did not accept.
frosch <frosch@openttd.org>
parents:
9883
diff
changeset
|
44 * check that it's an engine that is in the engine array */ |
11951
8bbe44fa53e2
(svn r16354) -Codechange: use 'new' pool accessors and methods for Engine too
smatz <smatz@openttd.org>
parents:
11949
diff
changeset
|
45 if (!Engine::IsValidID(from) || !Engine::IsValidID(to)) return false; |
9889
2bedf7c40bee
(svn r14037) -Fix (r8610): The autoreplace gui showed vehicle types for replacement which CmdSetAutoReplace() did not accept.
frosch <frosch@openttd.org>
parents:
9883
diff
changeset
|
46 |
2bedf7c40bee
(svn r14037) -Fix (r8610): The autoreplace gui showed vehicle types for replacement which CmdSetAutoReplace() did not accept.
frosch <frosch@openttd.org>
parents:
9883
diff
changeset
|
47 /* we can't replace an engine into itself (that would be autorenew) */ |
2bedf7c40bee
(svn r14037) -Fix (r8610): The autoreplace gui showed vehicle types for replacement which CmdSetAutoReplace() did not accept.
frosch <frosch@openttd.org>
parents:
9883
diff
changeset
|
48 if (from == to) return false; |
2bedf7c40bee
(svn r14037) -Fix (r8610): The autoreplace gui showed vehicle types for replacement which CmdSetAutoReplace() did not accept.
frosch <frosch@openttd.org>
parents:
9883
diff
changeset
|
49 |
11922
0a4b63f3f3c3
(svn r16325) -Codechange: replace GetPoolItem(index) by PoolItem::Get(index)
smatz <smatz@openttd.org>
parents:
11913
diff
changeset
|
50 VehicleType type = Engine::Get(from)->type; |
9889
2bedf7c40bee
(svn r14037) -Fix (r8610): The autoreplace gui showed vehicle types for replacement which CmdSetAutoReplace() did not accept.
frosch <frosch@openttd.org>
parents:
9883
diff
changeset
|
51 |
10207
c54d140df948
(svn r14421) -Codechange: rename all player variables/types to company *or* client so it is immediatelly clear which one you are working with.
rubidium <rubidium@openttd.org>
parents:
10198
diff
changeset
|
52 /* check that the new vehicle type is available to the company and its type is the same as the original one */ |
c54d140df948
(svn r14421) -Codechange: rename all player variables/types to company *or* client so it is immediatelly clear which one you are working with.
rubidium <rubidium@openttd.org>
parents:
10198
diff
changeset
|
53 if (!IsEngineBuildable(to, type, company)) return false; |
9889
2bedf7c40bee
(svn r14037) -Fix (r8610): The autoreplace gui showed vehicle types for replacement which CmdSetAutoReplace() did not accept.
frosch <frosch@openttd.org>
parents:
9883
diff
changeset
|
54 |
2bedf7c40bee
(svn r14037) -Fix (r8610): The autoreplace gui showed vehicle types for replacement which CmdSetAutoReplace() did not accept.
frosch <frosch@openttd.org>
parents:
9883
diff
changeset
|
55 switch (type) { |
2bedf7c40bee
(svn r14037) -Fix (r8610): The autoreplace gui showed vehicle types for replacement which CmdSetAutoReplace() did not accept.
frosch <frosch@openttd.org>
parents:
9883
diff
changeset
|
56 case VEH_TRAIN: { |
2bedf7c40bee
(svn r14037) -Fix (r8610): The autoreplace gui showed vehicle types for replacement which CmdSetAutoReplace() did not accept.
frosch <frosch@openttd.org>
parents:
9883
diff
changeset
|
57 const RailVehicleInfo *rvi_from = RailVehInfo(from); |
2bedf7c40bee
(svn r14037) -Fix (r8610): The autoreplace gui showed vehicle types for replacement which CmdSetAutoReplace() did not accept.
frosch <frosch@openttd.org>
parents:
9883
diff
changeset
|
58 const RailVehicleInfo *rvi_to = RailVehInfo(to); |
2bedf7c40bee
(svn r14037) -Fix (r8610): The autoreplace gui showed vehicle types for replacement which CmdSetAutoReplace() did not accept.
frosch <frosch@openttd.org>
parents:
9883
diff
changeset
|
59 |
2bedf7c40bee
(svn r14037) -Fix (r8610): The autoreplace gui showed vehicle types for replacement which CmdSetAutoReplace() did not accept.
frosch <frosch@openttd.org>
parents:
9883
diff
changeset
|
60 /* make sure the railtypes are compatible */ |
2bedf7c40bee
(svn r14037) -Fix (r8610): The autoreplace gui showed vehicle types for replacement which CmdSetAutoReplace() did not accept.
frosch <frosch@openttd.org>
parents:
9883
diff
changeset
|
61 if ((GetRailTypeInfo(rvi_from->railtype)->compatible_railtypes & GetRailTypeInfo(rvi_to->railtype)->compatible_railtypes) == 0) return false; |
2bedf7c40bee
(svn r14037) -Fix (r8610): The autoreplace gui showed vehicle types for replacement which CmdSetAutoReplace() did not accept.
frosch <frosch@openttd.org>
parents:
9883
diff
changeset
|
62 |
2bedf7c40bee
(svn r14037) -Fix (r8610): The autoreplace gui showed vehicle types for replacement which CmdSetAutoReplace() did not accept.
frosch <frosch@openttd.org>
parents:
9883
diff
changeset
|
63 /* make sure we do not replace wagons with engines or vise versa */ |
2bedf7c40bee
(svn r14037) -Fix (r8610): The autoreplace gui showed vehicle types for replacement which CmdSetAutoReplace() did not accept.
frosch <frosch@openttd.org>
parents:
9883
diff
changeset
|
64 if ((rvi_from->railveh_type == RAILVEH_WAGON) != (rvi_to->railveh_type == RAILVEH_WAGON)) return false; |
2bedf7c40bee
(svn r14037) -Fix (r8610): The autoreplace gui showed vehicle types for replacement which CmdSetAutoReplace() did not accept.
frosch <frosch@openttd.org>
parents:
9883
diff
changeset
|
65 break; |
2bedf7c40bee
(svn r14037) -Fix (r8610): The autoreplace gui showed vehicle types for replacement which CmdSetAutoReplace() did not accept.
frosch <frosch@openttd.org>
parents:
9883
diff
changeset
|
66 } |
2bedf7c40bee
(svn r14037) -Fix (r8610): The autoreplace gui showed vehicle types for replacement which CmdSetAutoReplace() did not accept.
frosch <frosch@openttd.org>
parents:
9883
diff
changeset
|
67 |
2bedf7c40bee
(svn r14037) -Fix (r8610): The autoreplace gui showed vehicle types for replacement which CmdSetAutoReplace() did not accept.
frosch <frosch@openttd.org>
parents:
9883
diff
changeset
|
68 case VEH_ROAD: |
2bedf7c40bee
(svn r14037) -Fix (r8610): The autoreplace gui showed vehicle types for replacement which CmdSetAutoReplace() did not accept.
frosch <frosch@openttd.org>
parents:
9883
diff
changeset
|
69 /* make sure that we do not replace a tram with a normal road vehicles or vise versa */ |
2bedf7c40bee
(svn r14037) -Fix (r8610): The autoreplace gui showed vehicle types for replacement which CmdSetAutoReplace() did not accept.
frosch <frosch@openttd.org>
parents:
9883
diff
changeset
|
70 if (HasBit(EngInfo(from)->misc_flags, EF_ROAD_TRAM) != HasBit(EngInfo(to)->misc_flags, EF_ROAD_TRAM)) return false; |
2bedf7c40bee
(svn r14037) -Fix (r8610): The autoreplace gui showed vehicle types for replacement which CmdSetAutoReplace() did not accept.
frosch <frosch@openttd.org>
parents:
9883
diff
changeset
|
71 break; |
2bedf7c40bee
(svn r14037) -Fix (r8610): The autoreplace gui showed vehicle types for replacement which CmdSetAutoReplace() did not accept.
frosch <frosch@openttd.org>
parents:
9883
diff
changeset
|
72 |
2bedf7c40bee
(svn r14037) -Fix (r8610): The autoreplace gui showed vehicle types for replacement which CmdSetAutoReplace() did not accept.
frosch <frosch@openttd.org>
parents:
9883
diff
changeset
|
73 case VEH_AIRCRAFT: |
2bedf7c40bee
(svn r14037) -Fix (r8610): The autoreplace gui showed vehicle types for replacement which CmdSetAutoReplace() did not accept.
frosch <frosch@openttd.org>
parents:
9883
diff
changeset
|
74 /* make sure that we do not replace a plane with a helicopter or vise versa */ |
2bedf7c40bee
(svn r14037) -Fix (r8610): The autoreplace gui showed vehicle types for replacement which CmdSetAutoReplace() did not accept.
frosch <frosch@openttd.org>
parents:
9883
diff
changeset
|
75 if ((AircraftVehInfo(from)->subtype & AIR_CTOL) != (AircraftVehInfo(to)->subtype & AIR_CTOL)) return false; |
2bedf7c40bee
(svn r14037) -Fix (r8610): The autoreplace gui showed vehicle types for replacement which CmdSetAutoReplace() did not accept.
frosch <frosch@openttd.org>
parents:
9883
diff
changeset
|
76 break; |
2bedf7c40bee
(svn r14037) -Fix (r8610): The autoreplace gui showed vehicle types for replacement which CmdSetAutoReplace() did not accept.
frosch <frosch@openttd.org>
parents:
9883
diff
changeset
|
77 |
2bedf7c40bee
(svn r14037) -Fix (r8610): The autoreplace gui showed vehicle types for replacement which CmdSetAutoReplace() did not accept.
frosch <frosch@openttd.org>
parents:
9883
diff
changeset
|
78 default: break; |
2bedf7c40bee
(svn r14037) -Fix (r8610): The autoreplace gui showed vehicle types for replacement which CmdSetAutoReplace() did not accept.
frosch <frosch@openttd.org>
parents:
9883
diff
changeset
|
79 } |
2bedf7c40bee
(svn r14037) -Fix (r8610): The autoreplace gui showed vehicle types for replacement which CmdSetAutoReplace() did not accept.
frosch <frosch@openttd.org>
parents:
9883
diff
changeset
|
80 |
2bedf7c40bee
(svn r14037) -Fix (r8610): The autoreplace gui showed vehicle types for replacement which CmdSetAutoReplace() did not accept.
frosch <frosch@openttd.org>
parents:
9883
diff
changeset
|
81 /* the engines needs to be able to carry the same cargo */ |
2bedf7c40bee
(svn r14037) -Fix (r8610): The autoreplace gui showed vehicle types for replacement which CmdSetAutoReplace() did not accept.
frosch <frosch@openttd.org>
parents:
9883
diff
changeset
|
82 return EnginesGotCargoInCommon(from, to, type); |
2bedf7c40bee
(svn r14037) -Fix (r8610): The autoreplace gui showed vehicle types for replacement which CmdSetAutoReplace() did not accept.
frosch <frosch@openttd.org>
parents:
9883
diff
changeset
|
83 } |
8628
97445f45ba39
(svn r12230) -Codechange: [autoreplace] made a function to detect if a vehicle needs autorenewing
bjarni <bjarni@openttd.org>
parents:
8469
diff
changeset
|
84 |
9928
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
85 /** Transfer cargo from a single (articulated )old vehicle to the new vehicle chain |
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
86 * @param old_veh Old vehicle that will be sold |
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
87 * @param new_head Head of the completely constructed new vehicle chain |
10193
5498150a3b12
(svn r14406) -Fix [FS#Eddi]: Autoreplace did not work for vehicles in free wagon chains.
frosch <frosch@openttd.org>
parents:
10151
diff
changeset
|
88 * @param part_of_chain The vehicle is part of a train |
9928
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
89 */ |
10193
5498150a3b12
(svn r14406) -Fix [FS#Eddi]: Autoreplace did not work for vehicles in free wagon chains.
frosch <frosch@openttd.org>
parents:
10151
diff
changeset
|
90 static void TransferCargo(Vehicle *old_veh, Vehicle *new_head, bool part_of_chain) |
9928
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
91 { |
10198
6df8ceececc8
(svn r14411) -Fix (r14406): IsFrontEngine() is only valid for trains.
frosch <frosch@openttd.org>
parents:
10194
diff
changeset
|
92 assert(!part_of_chain || new_head->IsPrimaryVehicle()); |
9928
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
93 /* Loop through source parts */ |
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
94 for (Vehicle *src = old_veh; src != NULL; src = src->Next()) { |
12114
f020ec6be498
(svn r16527) -Codechange: use static member functions instead of simple casts when converting Vehicle to specialised vehicle types. Includes safety check
smatz <smatz@openttd.org>
parents:
12089
diff
changeset
|
95 if (!part_of_chain && src->type == VEH_TRAIN && src != old_veh && src != Train::From(old_veh)->other_multiheaded_part && !IsArticulatedPart(src)) { |
10193
5498150a3b12
(svn r14406) -Fix [FS#Eddi]: Autoreplace did not work for vehicles in free wagon chains.
frosch <frosch@openttd.org>
parents:
10151
diff
changeset
|
96 /* Skip vehicles, which do not belong to old_veh */ |
12114
f020ec6be498
(svn r16527) -Codechange: use static member functions instead of simple casts when converting Vehicle to specialised vehicle types. Includes safety check
smatz <smatz@openttd.org>
parents:
12089
diff
changeset
|
97 src = GetLastEnginePart(Train::From(src)); |
10193
5498150a3b12
(svn r14406) -Fix [FS#Eddi]: Autoreplace did not work for vehicles in free wagon chains.
frosch <frosch@openttd.org>
parents:
10151
diff
changeset
|
98 continue; |
5498150a3b12
(svn r14406) -Fix [FS#Eddi]: Autoreplace did not work for vehicles in free wagon chains.
frosch <frosch@openttd.org>
parents:
10151
diff
changeset
|
99 } |
9928
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
100 if (src->cargo_type >= NUM_CARGO || src->cargo.Count() == 0) continue; |
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
101 |
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
102 /* Find free space in the new chain */ |
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
103 for (Vehicle *dest = new_head; dest != NULL && src->cargo.Count() > 0; dest = dest->Next()) { |
12114
f020ec6be498
(svn r16527) -Codechange: use static member functions instead of simple casts when converting Vehicle to specialised vehicle types. Includes safety check
smatz <smatz@openttd.org>
parents:
12089
diff
changeset
|
104 if (!part_of_chain && dest->type == VEH_TRAIN && dest != new_head && dest != Train::From(new_head)->other_multiheaded_part && !IsArticulatedPart(dest)) { |
10193
5498150a3b12
(svn r14406) -Fix [FS#Eddi]: Autoreplace did not work for vehicles in free wagon chains.
frosch <frosch@openttd.org>
parents:
10151
diff
changeset
|
105 /* Skip vehicles, which do not belong to new_head */ |
12114
f020ec6be498
(svn r16527) -Codechange: use static member functions instead of simple casts when converting Vehicle to specialised vehicle types. Includes safety check
smatz <smatz@openttd.org>
parents:
12089
diff
changeset
|
106 dest = GetLastEnginePart(Train::From(dest)); |
10193
5498150a3b12
(svn r14406) -Fix [FS#Eddi]: Autoreplace did not work for vehicles in free wagon chains.
frosch <frosch@openttd.org>
parents:
10151
diff
changeset
|
107 continue; |
5498150a3b12
(svn r14406) -Fix [FS#Eddi]: Autoreplace did not work for vehicles in free wagon chains.
frosch <frosch@openttd.org>
parents:
10151
diff
changeset
|
108 } |
9928
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
109 if (dest->cargo_type != src->cargo_type) continue; |
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
110 |
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
111 uint amount = min(src->cargo.Count(), dest->cargo_cap - dest->cargo.Count()); |
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
112 if (amount <= 0) continue; |
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
113 |
12279
329b186db8cd
(svn r16694) -Fix [FS#2995] (rgradual loading, rnewindustries): only pay for whatever has been actually unloaded and perform the payment when unloading has finished. This fixes, amongst others:
rubidium <rubidium@openttd.org>
parents:
12264
diff
changeset
|
114 src->cargo.MoveTo(&dest->cargo, amount, CargoList::MTA_UNLOAD, NULL); |
9928
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
115 } |
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
116 } |
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
117 |
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
118 /* Update train weight etc., the old vehicle will be sold anyway */ |
12114
f020ec6be498
(svn r16527) -Codechange: use static member functions instead of simple casts when converting Vehicle to specialised vehicle types. Includes safety check
smatz <smatz@openttd.org>
parents:
12089
diff
changeset
|
119 if (part_of_chain && new_head->type == VEH_TRAIN) TrainConsistChanged(Train::From(new_head), true); |
9928
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
120 } |
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
121 |
9725
5b38d93ef486
(svn r13850) -Fix [FS#2146]: Fix resp. implement refitting of articulated vehicles during autoreplace.
frosch <frosch@openttd.org>
parents:
9704
diff
changeset
|
122 /** |
5b38d93ef486
(svn r13850) -Fix [FS#2146]: Fix resp. implement refitting of articulated vehicles during autoreplace.
frosch <frosch@openttd.org>
parents:
9704
diff
changeset
|
123 * Tests whether refit orders that applied to v will also apply to the new vehicle type |
5b38d93ef486
(svn r13850) -Fix [FS#2146]: Fix resp. implement refitting of articulated vehicles during autoreplace.
frosch <frosch@openttd.org>
parents:
9704
diff
changeset
|
124 * @param v The vehicle to be replaced |
5b38d93ef486
(svn r13850) -Fix [FS#2146]: Fix resp. implement refitting of articulated vehicles during autoreplace.
frosch <frosch@openttd.org>
parents:
9704
diff
changeset
|
125 * @param engine_type The type we want to replace with |
5b38d93ef486
(svn r13850) -Fix [FS#2146]: Fix resp. implement refitting of articulated vehicles during autoreplace.
frosch <frosch@openttd.org>
parents:
9704
diff
changeset
|
126 * @return true iff all refit orders stay valid |
5b38d93ef486
(svn r13850) -Fix [FS#2146]: Fix resp. implement refitting of articulated vehicles during autoreplace.
frosch <frosch@openttd.org>
parents:
9704
diff
changeset
|
127 */ |
5b38d93ef486
(svn r13850) -Fix [FS#2146]: Fix resp. implement refitting of articulated vehicles during autoreplace.
frosch <frosch@openttd.org>
parents:
9704
diff
changeset
|
128 static bool VerifyAutoreplaceRefitForOrders(const Vehicle *v, EngineID engine_type) |
6264
37ecb2d0cdfb
(svn r9073) -Codechange: moved autoreplace to a file of it's own (now autoreplace has a cmd and a gui file)
bjarni <bjarni@openttd.org>
parents:
diff
changeset
|
129 { |
37ecb2d0cdfb
(svn r9073) -Codechange: moved autoreplace to a file of it's own (now autoreplace has a cmd and a gui file)
bjarni <bjarni@openttd.org>
parents:
diff
changeset
|
130 const Order *o; |
37ecb2d0cdfb
(svn r9073) -Codechange: moved autoreplace to a file of it's own (now autoreplace has a cmd and a gui file)
bjarni <bjarni@openttd.org>
parents:
diff
changeset
|
131 const Vehicle *u; |
37ecb2d0cdfb
(svn r9073) -Codechange: moved autoreplace to a file of it's own (now autoreplace has a cmd and a gui file)
bjarni <bjarni@openttd.org>
parents:
diff
changeset
|
132 |
9725
5b38d93ef486
(svn r13850) -Fix [FS#2146]: Fix resp. implement refitting of articulated vehicles during autoreplace.
frosch <frosch@openttd.org>
parents:
9704
diff
changeset
|
133 uint32 union_refit_mask_a = GetUnionOfArticulatedRefitMasks(v->engine_type, v->type, false); |
5b38d93ef486
(svn r13850) -Fix [FS#2146]: Fix resp. implement refitting of articulated vehicles during autoreplace.
frosch <frosch@openttd.org>
parents:
9704
diff
changeset
|
134 uint32 union_refit_mask_b = GetUnionOfArticulatedRefitMasks(engine_type, v->type, false); |
5b38d93ef486
(svn r13850) -Fix [FS#2146]: Fix resp. implement refitting of articulated vehicles during autoreplace.
frosch <frosch@openttd.org>
parents:
9704
diff
changeset
|
135 |
6264
37ecb2d0cdfb
(svn r9073) -Codechange: moved autoreplace to a file of it's own (now autoreplace has a cmd and a gui file)
bjarni <bjarni@openttd.org>
parents:
diff
changeset
|
136 if (v->type == VEH_TRAIN) { |
7497
797ff0b0e0a5
(svn r11011) -Fix [FS#1129]: GetFirstVehicleInChain did change the game state while being marked const.
rubidium <rubidium@openttd.org>
parents:
7492
diff
changeset
|
137 u = v->First(); |
6264
37ecb2d0cdfb
(svn r9073) -Codechange: moved autoreplace to a file of it's own (now autoreplace has a cmd and a gui file)
bjarni <bjarni@openttd.org>
parents:
diff
changeset
|
138 } else { |
37ecb2d0cdfb
(svn r9073) -Codechange: moved autoreplace to a file of it's own (now autoreplace has a cmd and a gui file)
bjarni <bjarni@openttd.org>
parents:
diff
changeset
|
139 u = v; |
37ecb2d0cdfb
(svn r9073) -Codechange: moved autoreplace to a file of it's own (now autoreplace has a cmd and a gui file)
bjarni <bjarni@openttd.org>
parents:
diff
changeset
|
140 } |
37ecb2d0cdfb
(svn r9073) -Codechange: moved autoreplace to a file of it's own (now autoreplace has a cmd and a gui file)
bjarni <bjarni@openttd.org>
parents:
diff
changeset
|
141 |
37ecb2d0cdfb
(svn r9073) -Codechange: moved autoreplace to a file of it's own (now autoreplace has a cmd and a gui file)
bjarni <bjarni@openttd.org>
parents:
diff
changeset
|
142 FOR_VEHICLE_ORDERS(u, o) { |
8838
db9c6b0c9f07
(svn r12586) -Codechange: do not access an order's refit variables directly.
rubidium <rubidium@openttd.org>
parents:
8786
diff
changeset
|
143 if (!o->IsRefit()) continue; |
9725
5b38d93ef486
(svn r13850) -Fix [FS#2146]: Fix resp. implement refitting of articulated vehicles during autoreplace.
frosch <frosch@openttd.org>
parents:
9704
diff
changeset
|
144 CargoID cargo_type = o->GetRefitCargo(); |
5b38d93ef486
(svn r13850) -Fix [FS#2146]: Fix resp. implement refitting of articulated vehicles during autoreplace.
frosch <frosch@openttd.org>
parents:
9704
diff
changeset
|
145 |
5b38d93ef486
(svn r13850) -Fix [FS#2146]: Fix resp. implement refitting of articulated vehicles during autoreplace.
frosch <frosch@openttd.org>
parents:
9704
diff
changeset
|
146 if (!HasBit(union_refit_mask_a, cargo_type)) continue; |
5b38d93ef486
(svn r13850) -Fix [FS#2146]: Fix resp. implement refitting of articulated vehicles during autoreplace.
frosch <frosch@openttd.org>
parents:
9704
diff
changeset
|
147 if (!HasBit(union_refit_mask_b, cargo_type)) return false; |
6264
37ecb2d0cdfb
(svn r9073) -Codechange: moved autoreplace to a file of it's own (now autoreplace has a cmd and a gui file)
bjarni <bjarni@openttd.org>
parents:
diff
changeset
|
148 } |
37ecb2d0cdfb
(svn r9073) -Codechange: moved autoreplace to a file of it's own (now autoreplace has a cmd and a gui file)
bjarni <bjarni@openttd.org>
parents:
diff
changeset
|
149 |
37ecb2d0cdfb
(svn r9073) -Codechange: moved autoreplace to a file of it's own (now autoreplace has a cmd and a gui file)
bjarni <bjarni@openttd.org>
parents:
diff
changeset
|
150 return true; |
37ecb2d0cdfb
(svn r9073) -Codechange: moved autoreplace to a file of it's own (now autoreplace has a cmd and a gui file)
bjarni <bjarni@openttd.org>
parents:
diff
changeset
|
151 } |
37ecb2d0cdfb
(svn r9073) -Codechange: moved autoreplace to a file of it's own (now autoreplace has a cmd and a gui file)
bjarni <bjarni@openttd.org>
parents:
diff
changeset
|
152 |
37ecb2d0cdfb
(svn r9073) -Codechange: moved autoreplace to a file of it's own (now autoreplace has a cmd and a gui file)
bjarni <bjarni@openttd.org>
parents:
diff
changeset
|
153 /** |
37ecb2d0cdfb
(svn r9073) -Codechange: moved autoreplace to a file of it's own (now autoreplace has a cmd and a gui file)
bjarni <bjarni@openttd.org>
parents:
diff
changeset
|
154 * Function to find what type of cargo to refit to when autoreplacing |
37ecb2d0cdfb
(svn r9073) -Codechange: moved autoreplace to a file of it's own (now autoreplace has a cmd and a gui file)
bjarni <bjarni@openttd.org>
parents:
diff
changeset
|
155 * @param *v Original vehicle, that is being replaced |
37ecb2d0cdfb
(svn r9073) -Codechange: moved autoreplace to a file of it's own (now autoreplace has a cmd and a gui file)
bjarni <bjarni@openttd.org>
parents:
diff
changeset
|
156 * @param engine_type The EngineID of the vehicle that is being replaced to |
10193
5498150a3b12
(svn r14406) -Fix [FS#Eddi]: Autoreplace did not work for vehicles in free wagon chains.
frosch <frosch@openttd.org>
parents:
10151
diff
changeset
|
157 * @param part_of_chain The vehicle is part of a train |
6264
37ecb2d0cdfb
(svn r9073) -Codechange: moved autoreplace to a file of it's own (now autoreplace has a cmd and a gui file)
bjarni <bjarni@openttd.org>
parents:
diff
changeset
|
158 * @return The cargo type to replace to |
37ecb2d0cdfb
(svn r9073) -Codechange: moved autoreplace to a file of it's own (now autoreplace has a cmd and a gui file)
bjarni <bjarni@openttd.org>
parents:
diff
changeset
|
159 * CT_NO_REFIT is returned if no refit is needed |
37ecb2d0cdfb
(svn r9073) -Codechange: moved autoreplace to a file of it's own (now autoreplace has a cmd and a gui file)
bjarni <bjarni@openttd.org>
parents:
diff
changeset
|
160 * CT_INVALID is returned when both old and new vehicle got cargo capacity and refitting the new one to the old one's cargo type isn't possible |
37ecb2d0cdfb
(svn r9073) -Codechange: moved autoreplace to a file of it's own (now autoreplace has a cmd and a gui file)
bjarni <bjarni@openttd.org>
parents:
diff
changeset
|
161 */ |
10193
5498150a3b12
(svn r14406) -Fix [FS#Eddi]: Autoreplace did not work for vehicles in free wagon chains.
frosch <frosch@openttd.org>
parents:
10151
diff
changeset
|
162 static CargoID GetNewCargoTypeForReplace(Vehicle *v, EngineID engine_type, bool part_of_chain) |
6264
37ecb2d0cdfb
(svn r9073) -Codechange: moved autoreplace to a file of it's own (now autoreplace has a cmd and a gui file)
bjarni <bjarni@openttd.org>
parents:
diff
changeset
|
163 { |
9725
5b38d93ef486
(svn r13850) -Fix [FS#2146]: Fix resp. implement refitting of articulated vehicles during autoreplace.
frosch <frosch@openttd.org>
parents:
9704
diff
changeset
|
164 CargoID cargo_type; |
6264
37ecb2d0cdfb
(svn r9073) -Codechange: moved autoreplace to a file of it's own (now autoreplace has a cmd and a gui file)
bjarni <bjarni@openttd.org>
parents:
diff
changeset
|
165 |
9725
5b38d93ef486
(svn r13850) -Fix [FS#2146]: Fix resp. implement refitting of articulated vehicles during autoreplace.
frosch <frosch@openttd.org>
parents:
9704
diff
changeset
|
166 if (GetUnionOfArticulatedRefitMasks(engine_type, v->type, true) == 0) return CT_NO_REFIT; // Don't try to refit an engine with no cargo capacity |
5b38d93ef486
(svn r13850) -Fix [FS#2146]: Fix resp. implement refitting of articulated vehicles during autoreplace.
frosch <frosch@openttd.org>
parents:
9704
diff
changeset
|
167 |
5b38d93ef486
(svn r13850) -Fix [FS#2146]: Fix resp. implement refitting of articulated vehicles during autoreplace.
frosch <frosch@openttd.org>
parents:
9704
diff
changeset
|
168 if (IsArticulatedVehicleCarryingDifferentCargos(v, &cargo_type)) return CT_INVALID; // We cannot refit to mixed cargos in an automated way |
6264
37ecb2d0cdfb
(svn r9073) -Codechange: moved autoreplace to a file of it's own (now autoreplace has a cmd and a gui file)
bjarni <bjarni@openttd.org>
parents:
diff
changeset
|
169 |
9725
5b38d93ef486
(svn r13850) -Fix [FS#2146]: Fix resp. implement refitting of articulated vehicles during autoreplace.
frosch <frosch@openttd.org>
parents:
9704
diff
changeset
|
170 uint32 available_cargo_types = GetIntersectionOfArticulatedRefitMasks(engine_type, v->type, true); |
5b38d93ef486
(svn r13850) -Fix [FS#2146]: Fix resp. implement refitting of articulated vehicles during autoreplace.
frosch <frosch@openttd.org>
parents:
9704
diff
changeset
|
171 |
5b38d93ef486
(svn r13850) -Fix [FS#2146]: Fix resp. implement refitting of articulated vehicles during autoreplace.
frosch <frosch@openttd.org>
parents:
9704
diff
changeset
|
172 if (cargo_type == CT_INVALID) { |
5b38d93ef486
(svn r13850) -Fix [FS#2146]: Fix resp. implement refitting of articulated vehicles during autoreplace.
frosch <frosch@openttd.org>
parents:
9704
diff
changeset
|
173 if (v->type != VEH_TRAIN) return CT_NO_REFIT; // If the vehicle does not carry anything at all, every replacement is fine. |
5b38d93ef486
(svn r13850) -Fix [FS#2146]: Fix resp. implement refitting of articulated vehicles during autoreplace.
frosch <frosch@openttd.org>
parents:
9704
diff
changeset
|
174 |
10193
5498150a3b12
(svn r14406) -Fix [FS#Eddi]: Autoreplace did not work for vehicles in free wagon chains.
frosch <frosch@openttd.org>
parents:
10151
diff
changeset
|
175 if (!part_of_chain) return CT_NO_REFIT; |
5498150a3b12
(svn r14406) -Fix [FS#Eddi]: Autoreplace did not work for vehicles in free wagon chains.
frosch <frosch@openttd.org>
parents:
10151
diff
changeset
|
176 |
9725
5b38d93ef486
(svn r13850) -Fix [FS#2146]: Fix resp. implement refitting of articulated vehicles during autoreplace.
frosch <frosch@openttd.org>
parents:
9704
diff
changeset
|
177 /* the old engine didn't have cargo capacity, but the new one does |
5b38d93ef486
(svn r13850) -Fix [FS#2146]: Fix resp. implement refitting of articulated vehicles during autoreplace.
frosch <frosch@openttd.org>
parents:
9704
diff
changeset
|
178 * now we will figure out what cargo the train is carrying and refit to fit this */ |
6264
37ecb2d0cdfb
(svn r9073) -Codechange: moved autoreplace to a file of it's own (now autoreplace has a cmd and a gui file)
bjarni <bjarni@openttd.org>
parents:
diff
changeset
|
179 |
9725
5b38d93ef486
(svn r13850) -Fix [FS#2146]: Fix resp. implement refitting of articulated vehicles during autoreplace.
frosch <frosch@openttd.org>
parents:
9704
diff
changeset
|
180 for (v = v->First(); v != NULL; v = v->Next()) { |
5b38d93ef486
(svn r13850) -Fix [FS#2146]: Fix resp. implement refitting of articulated vehicles during autoreplace.
frosch <frosch@openttd.org>
parents:
9704
diff
changeset
|
181 if (v->cargo_cap == 0) continue; |
5b38d93ef486
(svn r13850) -Fix [FS#2146]: Fix resp. implement refitting of articulated vehicles during autoreplace.
frosch <frosch@openttd.org>
parents:
9704
diff
changeset
|
182 /* Now we found a cargo type being carried on the train and we will see if it is possible to carry to this one */ |
5b38d93ef486
(svn r13850) -Fix [FS#2146]: Fix resp. implement refitting of articulated vehicles during autoreplace.
frosch <frosch@openttd.org>
parents:
9704
diff
changeset
|
183 if (HasBit(available_cargo_types, v->cargo_type)) { |
5b38d93ef486
(svn r13850) -Fix [FS#2146]: Fix resp. implement refitting of articulated vehicles during autoreplace.
frosch <frosch@openttd.org>
parents:
9704
diff
changeset
|
184 /* Do we have to refit the vehicle, or is it already carrying the right cargo? */ |
12264
eef24db9209a
(svn r16679) -Codechange: Let GetCapacityOfArticulatedParts() return a CargoArray instead of a pointer to a static array.
frosch <frosch@openttd.org>
parents:
12114
diff
changeset
|
185 CargoArray default_capacity = GetCapacityOfArticulatedParts(engine_type, v->type); |
9725
5b38d93ef486
(svn r13850) -Fix [FS#2146]: Fix resp. implement refitting of articulated vehicles during autoreplace.
frosch <frosch@openttd.org>
parents:
9704
diff
changeset
|
186 for (CargoID cid = 0; cid < NUM_CARGO; cid++) { |
9883
369c99a0b939
(svn r14031) -Fix (r13850): Determining the refit cargo did not work, when the old vehicle did not carry anything but the new one did.
frosch <frosch@openttd.org>
parents:
9725
diff
changeset
|
187 if (cid != v->cargo_type && default_capacity[cid] > 0) return v->cargo_type; |
9725
5b38d93ef486
(svn r13850) -Fix [FS#2146]: Fix resp. implement refitting of articulated vehicles during autoreplace.
frosch <frosch@openttd.org>
parents:
9704
diff
changeset
|
188 } |
6264
37ecb2d0cdfb
(svn r9073) -Codechange: moved autoreplace to a file of it's own (now autoreplace has a cmd and a gui file)
bjarni <bjarni@openttd.org>
parents:
diff
changeset
|
189 |
9725
5b38d93ef486
(svn r13850) -Fix [FS#2146]: Fix resp. implement refitting of articulated vehicles during autoreplace.
frosch <frosch@openttd.org>
parents:
9704
diff
changeset
|
190 return CT_NO_REFIT; |
5b38d93ef486
(svn r13850) -Fix [FS#2146]: Fix resp. implement refitting of articulated vehicles during autoreplace.
frosch <frosch@openttd.org>
parents:
9704
diff
changeset
|
191 } |
5b38d93ef486
(svn r13850) -Fix [FS#2146]: Fix resp. implement refitting of articulated vehicles during autoreplace.
frosch <frosch@openttd.org>
parents:
9704
diff
changeset
|
192 } |
6264
37ecb2d0cdfb
(svn r9073) -Codechange: moved autoreplace to a file of it's own (now autoreplace has a cmd and a gui file)
bjarni <bjarni@openttd.org>
parents:
diff
changeset
|
193 |
9725
5b38d93ef486
(svn r13850) -Fix [FS#2146]: Fix resp. implement refitting of articulated vehicles during autoreplace.
frosch <frosch@openttd.org>
parents:
9704
diff
changeset
|
194 return CT_NO_REFIT; // We failed to find a cargo type on the old vehicle and we will not refit the new one |
5b38d93ef486
(svn r13850) -Fix [FS#2146]: Fix resp. implement refitting of articulated vehicles during autoreplace.
frosch <frosch@openttd.org>
parents:
9704
diff
changeset
|
195 } else { |
5b38d93ef486
(svn r13850) -Fix [FS#2146]: Fix resp. implement refitting of articulated vehicles during autoreplace.
frosch <frosch@openttd.org>
parents:
9704
diff
changeset
|
196 if (!HasBit(available_cargo_types, cargo_type)) return CT_INVALID; // We can't refit the vehicle to carry the cargo we want |
5b38d93ef486
(svn r13850) -Fix [FS#2146]: Fix resp. implement refitting of articulated vehicles during autoreplace.
frosch <frosch@openttd.org>
parents:
9704
diff
changeset
|
197 |
10193
5498150a3b12
(svn r14406) -Fix [FS#Eddi]: Autoreplace did not work for vehicles in free wagon chains.
frosch <frosch@openttd.org>
parents:
10151
diff
changeset
|
198 if (part_of_chain && !VerifyAutoreplaceRefitForOrders(v, engine_type)) return CT_INVALID; // Some refit orders lose their effect |
9725
5b38d93ef486
(svn r13850) -Fix [FS#2146]: Fix resp. implement refitting of articulated vehicles during autoreplace.
frosch <frosch@openttd.org>
parents:
9704
diff
changeset
|
199 |
5b38d93ef486
(svn r13850) -Fix [FS#2146]: Fix resp. implement refitting of articulated vehicles during autoreplace.
frosch <frosch@openttd.org>
parents:
9704
diff
changeset
|
200 /* Do we have to refit the vehicle, or is it already carrying the right cargo? */ |
12264
eef24db9209a
(svn r16679) -Codechange: Let GetCapacityOfArticulatedParts() return a CargoArray instead of a pointer to a static array.
frosch <frosch@openttd.org>
parents:
12114
diff
changeset
|
201 CargoArray default_capacity = GetCapacityOfArticulatedParts(engine_type, v->type); |
9725
5b38d93ef486
(svn r13850) -Fix [FS#2146]: Fix resp. implement refitting of articulated vehicles during autoreplace.
frosch <frosch@openttd.org>
parents:
9704
diff
changeset
|
202 for (CargoID cid = 0; cid < NUM_CARGO; cid++) { |
5b38d93ef486
(svn r13850) -Fix [FS#2146]: Fix resp. implement refitting of articulated vehicles during autoreplace.
frosch <frosch@openttd.org>
parents:
9704
diff
changeset
|
203 if (cid != cargo_type && default_capacity[cid] > 0) return cargo_type; |
5b38d93ef486
(svn r13850) -Fix [FS#2146]: Fix resp. implement refitting of articulated vehicles during autoreplace.
frosch <frosch@openttd.org>
parents:
9704
diff
changeset
|
204 } |
5b38d93ef486
(svn r13850) -Fix [FS#2146]: Fix resp. implement refitting of articulated vehicles during autoreplace.
frosch <frosch@openttd.org>
parents:
9704
diff
changeset
|
205 |
5b38d93ef486
(svn r13850) -Fix [FS#2146]: Fix resp. implement refitting of articulated vehicles during autoreplace.
frosch <frosch@openttd.org>
parents:
9704
diff
changeset
|
206 return CT_NO_REFIT; |
5b38d93ef486
(svn r13850) -Fix [FS#2146]: Fix resp. implement refitting of articulated vehicles during autoreplace.
frosch <frosch@openttd.org>
parents:
9704
diff
changeset
|
207 } |
6264
37ecb2d0cdfb
(svn r9073) -Codechange: moved autoreplace to a file of it's own (now autoreplace has a cmd and a gui file)
bjarni <bjarni@openttd.org>
parents:
diff
changeset
|
208 } |
37ecb2d0cdfb
(svn r9073) -Codechange: moved autoreplace to a file of it's own (now autoreplace has a cmd and a gui file)
bjarni <bjarni@openttd.org>
parents:
diff
changeset
|
209 |
8997
19392bf555ff
(svn r12792) -Codechange: [autoreplace] added a function to figure out if a replacement is needed and if so, to which EngineID
bjarni <bjarni@openttd.org>
parents:
8996
diff
changeset
|
210 /** Get the EngineID of the replacement for a vehicle |
19392bf555ff
(svn r12792) -Codechange: [autoreplace] added a function to figure out if a replacement is needed and if so, to which EngineID
bjarni <bjarni@openttd.org>
parents:
8996
diff
changeset
|
211 * @param v The vehicle to find a replacement for |
10207
c54d140df948
(svn r14421) -Codechange: rename all player variables/types to company *or* client so it is immediatelly clear which one you are working with.
rubidium <rubidium@openttd.org>
parents:
10198
diff
changeset
|
212 * @param c The vehicle's owner (it's faster to forward the pointer than refinding it) |
8997
19392bf555ff
(svn r12792) -Codechange: [autoreplace] added a function to figure out if a replacement is needed and if so, to which EngineID
bjarni <bjarni@openttd.org>
parents:
8996
diff
changeset
|
213 * @return the EngineID of the replacement. INVALID_ENGINE if no buildable replacement is found |
19392bf555ff
(svn r12792) -Codechange: [autoreplace] added a function to figure out if a replacement is needed and if so, to which EngineID
bjarni <bjarni@openttd.org>
parents:
8996
diff
changeset
|
214 */ |
10207
c54d140df948
(svn r14421) -Codechange: rename all player variables/types to company *or* client so it is immediatelly clear which one you are working with.
rubidium <rubidium@openttd.org>
parents:
10198
diff
changeset
|
215 static EngineID GetNewEngineType(const Vehicle *v, const Company *c) |
8997
19392bf555ff
(svn r12792) -Codechange: [autoreplace] added a function to figure out if a replacement is needed and if so, to which EngineID
bjarni <bjarni@openttd.org>
parents:
8996
diff
changeset
|
216 { |
9725
5b38d93ef486
(svn r13850) -Fix [FS#2146]: Fix resp. implement refitting of articulated vehicles during autoreplace.
frosch <frosch@openttd.org>
parents:
9704
diff
changeset
|
217 assert(v->type != VEH_TRAIN || !IsArticulatedPart(v)); |
5b38d93ef486
(svn r13850) -Fix [FS#2146]: Fix resp. implement refitting of articulated vehicles during autoreplace.
frosch <frosch@openttd.org>
parents:
9704
diff
changeset
|
218 |
8997
19392bf555ff
(svn r12792) -Codechange: [autoreplace] added a function to figure out if a replacement is needed and if so, to which EngineID
bjarni <bjarni@openttd.org>
parents:
8996
diff
changeset
|
219 if (v->type == VEH_TRAIN && IsRearDualheaded(v)) { |
19392bf555ff
(svn r12792) -Codechange: [autoreplace] added a function to figure out if a replacement is needed and if so, to which EngineID
bjarni <bjarni@openttd.org>
parents:
8996
diff
changeset
|
220 /* we build the rear ends of multiheaded trains with the front ones */ |
19392bf555ff
(svn r12792) -Codechange: [autoreplace] added a function to figure out if a replacement is needed and if so, to which EngineID
bjarni <bjarni@openttd.org>
parents:
8996
diff
changeset
|
221 return INVALID_ENGINE; |
19392bf555ff
(svn r12792) -Codechange: [autoreplace] added a function to figure out if a replacement is needed and if so, to which EngineID
bjarni <bjarni@openttd.org>
parents:
8996
diff
changeset
|
222 } |
19392bf555ff
(svn r12792) -Codechange: [autoreplace] added a function to figure out if a replacement is needed and if so, to which EngineID
bjarni <bjarni@openttd.org>
parents:
8996
diff
changeset
|
223 |
10207
c54d140df948
(svn r14421) -Codechange: rename all player variables/types to company *or* client so it is immediatelly clear which one you are working with.
rubidium <rubidium@openttd.org>
parents:
10198
diff
changeset
|
224 EngineID e = EngineReplacementForCompany(c, v->engine_type, v->group_id); |
8997
19392bf555ff
(svn r12792) -Codechange: [autoreplace] added a function to figure out if a replacement is needed and if so, to which EngineID
bjarni <bjarni@openttd.org>
parents:
8996
diff
changeset
|
225 |
10207
c54d140df948
(svn r14421) -Codechange: rename all player variables/types to company *or* client so it is immediatelly clear which one you are working with.
rubidium <rubidium@openttd.org>
parents:
10198
diff
changeset
|
226 if (e != INVALID_ENGINE && IsEngineBuildable(e, v->type, _current_company)) { |
8997
19392bf555ff
(svn r12792) -Codechange: [autoreplace] added a function to figure out if a replacement is needed and if so, to which EngineID
bjarni <bjarni@openttd.org>
parents:
8996
diff
changeset
|
227 return e; |
19392bf555ff
(svn r12792) -Codechange: [autoreplace] added a function to figure out if a replacement is needed and if so, to which EngineID
bjarni <bjarni@openttd.org>
parents:
8996
diff
changeset
|
228 } |
19392bf555ff
(svn r12792) -Codechange: [autoreplace] added a function to figure out if a replacement is needed and if so, to which EngineID
bjarni <bjarni@openttd.org>
parents:
8996
diff
changeset
|
229 |
10207
c54d140df948
(svn r14421) -Codechange: rename all player variables/types to company *or* client so it is immediatelly clear which one you are working with.
rubidium <rubidium@openttd.org>
parents:
10198
diff
changeset
|
230 if (v->NeedsAutorenewing(c) && // replace if engine is too old |
c54d140df948
(svn r14421) -Codechange: rename all player variables/types to company *or* client so it is immediatelly clear which one you are working with.
rubidium <rubidium@openttd.org>
parents:
10198
diff
changeset
|
231 IsEngineBuildable(v->engine_type, v->type, _current_company)) { // engine can still be build |
8997
19392bf555ff
(svn r12792) -Codechange: [autoreplace] added a function to figure out if a replacement is needed and if so, to which EngineID
bjarni <bjarni@openttd.org>
parents:
8996
diff
changeset
|
232 return v->engine_type; |
19392bf555ff
(svn r12792) -Codechange: [autoreplace] added a function to figure out if a replacement is needed and if so, to which EngineID
bjarni <bjarni@openttd.org>
parents:
8996
diff
changeset
|
233 } |
19392bf555ff
(svn r12792) -Codechange: [autoreplace] added a function to figure out if a replacement is needed and if so, to which EngineID
bjarni <bjarni@openttd.org>
parents:
8996
diff
changeset
|
234 |
19392bf555ff
(svn r12792) -Codechange: [autoreplace] added a function to figure out if a replacement is needed and if so, to which EngineID
bjarni <bjarni@openttd.org>
parents:
8996
diff
changeset
|
235 return INVALID_ENGINE; |
19392bf555ff
(svn r12792) -Codechange: [autoreplace] added a function to figure out if a replacement is needed and if so, to which EngineID
bjarni <bjarni@openttd.org>
parents:
8996
diff
changeset
|
236 } |
19392bf555ff
(svn r12792) -Codechange: [autoreplace] added a function to figure out if a replacement is needed and if so, to which EngineID
bjarni <bjarni@openttd.org>
parents:
8996
diff
changeset
|
237 |
9928
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
238 /** Builds and refits a replacement vehicle |
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
239 * Important: The old vehicle is still in the original vehicle chain (used for determining the cargo when the old vehicle did not carry anything, but the new one does) |
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
240 * @param old_veh A single (articulated/multiheaded) vehicle that shall be replaced. |
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
241 * @param new_vehicle Returns the newly build and refittet vehicle |
10193
5498150a3b12
(svn r14406) -Fix [FS#Eddi]: Autoreplace did not work for vehicles in free wagon chains.
frosch <frosch@openttd.org>
parents:
10151
diff
changeset
|
242 * @param part_of_chain The vehicle is part of a train |
9928
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
243 * @return cost or error |
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
244 */ |
10193
5498150a3b12
(svn r14406) -Fix [FS#Eddi]: Autoreplace did not work for vehicles in free wagon chains.
frosch <frosch@openttd.org>
parents:
10151
diff
changeset
|
245 static CommandCost BuildReplacementVehicle(Vehicle *old_veh, Vehicle **new_vehicle, bool part_of_chain) |
9928
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
246 { |
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
247 *new_vehicle = NULL; |
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
248 |
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
249 /* Shall the vehicle be replaced? */ |
11922
0a4b63f3f3c3
(svn r16325) -Codechange: replace GetPoolItem(index) by PoolItem::Get(index)
smatz <smatz@openttd.org>
parents:
11913
diff
changeset
|
250 const Company *c = Company::Get(_current_company); |
10207
c54d140df948
(svn r14421) -Codechange: rename all player variables/types to company *or* client so it is immediatelly clear which one you are working with.
rubidium <rubidium@openttd.org>
parents:
10198
diff
changeset
|
251 EngineID e = GetNewEngineType(old_veh, c); |
9928
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
252 if (e == INVALID_ENGINE) return CommandCost(); // neither autoreplace is set, nor autorenew is triggered |
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
253 |
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
254 /* Does it need to be refitted */ |
10193
5498150a3b12
(svn r14406) -Fix [FS#Eddi]: Autoreplace did not work for vehicles in free wagon chains.
frosch <frosch@openttd.org>
parents:
10151
diff
changeset
|
255 CargoID refit_cargo = GetNewCargoTypeForReplace(old_veh, e, part_of_chain); |
9928
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
256 if (refit_cargo == CT_INVALID) return CommandCost(); // incompatible cargos |
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
257 |
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
258 /* Build the new vehicle */ |
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
259 CommandCost cost = DoCommand(old_veh->tile, e, 0, DC_EXEC | DC_AUTOREPLACE, GetCmdBuildVeh(old_veh)); |
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
260 if (cost.Failed()) return cost; |
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
261 |
11922
0a4b63f3f3c3
(svn r16325) -Codechange: replace GetPoolItem(index) by PoolItem::Get(index)
smatz <smatz@openttd.org>
parents:
11913
diff
changeset
|
262 Vehicle *new_veh = Vehicle::Get(_new_vehicle_id); |
9928
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
263 *new_vehicle = new_veh; |
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
264 |
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
265 /* Refit the vehicle if needed */ |
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
266 if (refit_cargo != CT_NO_REFIT) { |
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
267 cost.AddCost(DoCommand(0, new_veh->index, refit_cargo, DC_EXEC, GetCmdRefitVeh(new_veh))); |
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
268 assert(cost.Succeeded()); // This should be ensured by GetNewCargoTypeForReplace() |
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
269 } |
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
270 |
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
271 /* Try to reverse the vehicle, but do not care if it fails as the new type might not be reversible */ |
12114
f020ec6be498
(svn r16527) -Codechange: use static member functions instead of simple casts when converting Vehicle to specialised vehicle types. Includes safety check
smatz <smatz@openttd.org>
parents:
12089
diff
changeset
|
272 if (new_veh->type == VEH_TRAIN && HasBit(Train::From(old_veh)->flags, VRF_REVERSE_DIRECTION)) { |
9928
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
273 DoCommand(0, new_veh->index, true, DC_EXEC, CMD_REVERSE_TRAIN_DIRECTION); |
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
274 } |
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
275 |
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
276 return cost; |
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
277 } |
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
278 |
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
279 /** Issue a start/stop command |
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
280 * @param v a vehicle |
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
281 * @param evaluate_callback shall the start/stop callback be evaluated? |
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
282 * @return success or error |
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
283 */ |
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
284 static inline CommandCost StartStopVehicle(const Vehicle *v, bool evaluate_callback) |
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
285 { |
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
286 return DoCommand(0, v->index, evaluate_callback ? 1 : 0, DC_EXEC | DC_AUTOREPLACE, CMD_START_STOP_VEHICLE); |
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
287 } |
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
288 |
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
289 /** Issue a train vehicle move command |
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
290 * @param v The vehicle to move |
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
291 * @param after The vehicle to insert 'v' after, or NULL to start new chain |
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
292 * @param whole_chain move all vehicles following 'v' (true), or only 'v' (false) |
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
293 * @return success or error |
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
294 */ |
11090
df23c4e04638
(svn r15434) -Codechange: bit of type safety for the DC_xxx flags.
rubidium <rubidium@openttd.org>
parents:
10960
diff
changeset
|
295 static inline CommandCost MoveVehicle(const Vehicle *v, const Vehicle *after, DoCommandFlag flags, bool whole_chain) |
9928
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
296 { |
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
297 return DoCommand(0, v->index | (after != NULL ? after->index : INVALID_VEHICLE) << 16, whole_chain ? 1 : 0, flags, CMD_MOVE_RAIL_VEHICLE); |
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
298 } |
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
299 |
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
300 /** Copy head specific things to the new vehicle chain after it was successfully constructed |
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
301 * @param old_head The old front vehicle (no wagons attached anymore) |
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
302 * @param new_head The new head of the completely replaced vehicle chain |
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
303 * @param flags the command flags to use |
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
304 */ |
11090
df23c4e04638
(svn r15434) -Codechange: bit of type safety for the DC_xxx flags.
rubidium <rubidium@openttd.org>
parents:
10960
diff
changeset
|
305 static CommandCost CopyHeadSpecificThings(Vehicle *old_head, Vehicle *new_head, DoCommandFlag flags) |
9928
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
306 { |
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
307 CommandCost cost = CommandCost(); |
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
308 |
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
309 /* Share orders */ |
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
310 if (cost.Succeeded() && old_head != new_head) cost.AddCost(DoCommand(0, (old_head->index << 16) | new_head->index, CO_SHARE, DC_EXEC, CMD_CLONE_ORDER)); |
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
311 |
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
312 /* Copy group membership */ |
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
313 if (cost.Succeeded() && old_head != new_head) cost.AddCost(DoCommand(0, old_head->group_id, new_head->index, DC_EXEC, CMD_ADD_VEHICLE_GROUP)); |
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
314 |
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
315 /* Perform start/stop check whether the new vehicle suits newgrf restrictions etc. */ |
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
316 if (cost.Succeeded()) { |
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
317 /* Start the vehicle, might be denied by certain things */ |
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
318 assert((new_head->vehstatus & VS_STOPPED) != 0); |
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
319 cost.AddCost(StartStopVehicle(new_head, true)); |
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
320 |
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
321 /* Stop the vehicle again, but do not care about evil newgrfs allowing starting but not stopping :p */ |
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
322 if (cost.Succeeded()) cost.AddCost(StartStopVehicle(new_head, false)); |
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
323 } |
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
324 |
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
325 /* Last do those things which do never fail (resp. we do not care about), but which are not undo-able */ |
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
326 if (cost.Succeeded() && old_head != new_head && (flags & DC_EXEC) != 0) { |
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
327 /* Copy vehicle name */ |
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
328 if (old_head->name != NULL) { |
10499
45ca88a8de7d
(svn r14754) -Codechange: get rid of _cmd_text and just pass it as (optional) parameter.
rubidium <rubidium@openttd.org>
parents:
10219
diff
changeset
|
329 DoCommand(0, new_head->index, 0, DC_EXEC | DC_AUTOREPLACE, CMD_RENAME_VEHICLE, old_head->name); |
9928
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
330 } |
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
331 |
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
332 /* Copy other things which cannot be copied by a command and which shall not stay resetted from the build vehicle command */ |
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
333 new_head->CopyVehicleConfigAndStatistics(old_head); |
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
334 |
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
335 /* Switch vehicle windows to the new vehicle, so they are not closed when the old vehicle is sold */ |
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
336 ChangeVehicleViewWindow(old_head->index, new_head->index); |
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
337 } |
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
338 |
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
339 return cost; |
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
340 } |
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
341 |
10193
5498150a3b12
(svn r14406) -Fix [FS#Eddi]: Autoreplace did not work for vehicles in free wagon chains.
frosch <frosch@openttd.org>
parents:
10151
diff
changeset
|
342 /** Replace a single unit in a free wagon chain |
5498150a3b12
(svn r14406) -Fix [FS#Eddi]: Autoreplace did not work for vehicles in free wagon chains.
frosch <frosch@openttd.org>
parents:
10151
diff
changeset
|
343 * @param single_unit vehicle to let autoreplace/renew operator on |
5498150a3b12
(svn r14406) -Fix [FS#Eddi]: Autoreplace did not work for vehicles in free wagon chains.
frosch <frosch@openttd.org>
parents:
10151
diff
changeset
|
344 * @param flags command flags |
5498150a3b12
(svn r14406) -Fix [FS#Eddi]: Autoreplace did not work for vehicles in free wagon chains.
frosch <frosch@openttd.org>
parents:
10151
diff
changeset
|
345 * @param nothing_to_do is set to 'false' when something was done (only valid when not failed) |
5498150a3b12
(svn r14406) -Fix [FS#Eddi]: Autoreplace did not work for vehicles in free wagon chains.
frosch <frosch@openttd.org>
parents:
10151
diff
changeset
|
346 * @return cost or error |
5498150a3b12
(svn r14406) -Fix [FS#Eddi]: Autoreplace did not work for vehicles in free wagon chains.
frosch <frosch@openttd.org>
parents:
10151
diff
changeset
|
347 */ |
11090
df23c4e04638
(svn r15434) -Codechange: bit of type safety for the DC_xxx flags.
rubidium <rubidium@openttd.org>
parents:
10960
diff
changeset
|
348 static CommandCost ReplaceFreeUnit(Vehicle **single_unit, DoCommandFlag flags, bool *nothing_to_do) |
10193
5498150a3b12
(svn r14406) -Fix [FS#Eddi]: Autoreplace did not work for vehicles in free wagon chains.
frosch <frosch@openttd.org>
parents:
10151
diff
changeset
|
349 { |
5498150a3b12
(svn r14406) -Fix [FS#Eddi]: Autoreplace did not work for vehicles in free wagon chains.
frosch <frosch@openttd.org>
parents:
10151
diff
changeset
|
350 Vehicle *old_v = *single_unit; |
5498150a3b12
(svn r14406) -Fix [FS#Eddi]: Autoreplace did not work for vehicles in free wagon chains.
frosch <frosch@openttd.org>
parents:
10151
diff
changeset
|
351 assert(old_v->type == VEH_TRAIN && !IsArticulatedPart(old_v) && !IsRearDualheaded(old_v)); |
5498150a3b12
(svn r14406) -Fix [FS#Eddi]: Autoreplace did not work for vehicles in free wagon chains.
frosch <frosch@openttd.org>
parents:
10151
diff
changeset
|
352 |
5498150a3b12
(svn r14406) -Fix [FS#Eddi]: Autoreplace did not work for vehicles in free wagon chains.
frosch <frosch@openttd.org>
parents:
10151
diff
changeset
|
353 CommandCost cost = CommandCost(EXPENSES_NEW_VEHICLES, 0); |
5498150a3b12
(svn r14406) -Fix [FS#Eddi]: Autoreplace did not work for vehicles in free wagon chains.
frosch <frosch@openttd.org>
parents:
10151
diff
changeset
|
354 |
5498150a3b12
(svn r14406) -Fix [FS#Eddi]: Autoreplace did not work for vehicles in free wagon chains.
frosch <frosch@openttd.org>
parents:
10151
diff
changeset
|
355 /* Build and refit replacement vehicle */ |
5498150a3b12
(svn r14406) -Fix [FS#Eddi]: Autoreplace did not work for vehicles in free wagon chains.
frosch <frosch@openttd.org>
parents:
10151
diff
changeset
|
356 Vehicle *new_v = NULL; |
5498150a3b12
(svn r14406) -Fix [FS#Eddi]: Autoreplace did not work for vehicles in free wagon chains.
frosch <frosch@openttd.org>
parents:
10151
diff
changeset
|
357 cost.AddCost(BuildReplacementVehicle(old_v, &new_v, false)); |
5498150a3b12
(svn r14406) -Fix [FS#Eddi]: Autoreplace did not work for vehicles in free wagon chains.
frosch <frosch@openttd.org>
parents:
10151
diff
changeset
|
358 |
5498150a3b12
(svn r14406) -Fix [FS#Eddi]: Autoreplace did not work for vehicles in free wagon chains.
frosch <frosch@openttd.org>
parents:
10151
diff
changeset
|
359 /* Was a new vehicle constructed? */ |
5498150a3b12
(svn r14406) -Fix [FS#Eddi]: Autoreplace did not work for vehicles in free wagon chains.
frosch <frosch@openttd.org>
parents:
10151
diff
changeset
|
360 if (cost.Succeeded() && new_v != NULL) { |
5498150a3b12
(svn r14406) -Fix [FS#Eddi]: Autoreplace did not work for vehicles in free wagon chains.
frosch <frosch@openttd.org>
parents:
10151
diff
changeset
|
361 *nothing_to_do = false; |
5498150a3b12
(svn r14406) -Fix [FS#Eddi]: Autoreplace did not work for vehicles in free wagon chains.
frosch <frosch@openttd.org>
parents:
10151
diff
changeset
|
362 |
5498150a3b12
(svn r14406) -Fix [FS#Eddi]: Autoreplace did not work for vehicles in free wagon chains.
frosch <frosch@openttd.org>
parents:
10151
diff
changeset
|
363 if ((flags & DC_EXEC) != 0) { |
5498150a3b12
(svn r14406) -Fix [FS#Eddi]: Autoreplace did not work for vehicles in free wagon chains.
frosch <frosch@openttd.org>
parents:
10151
diff
changeset
|
364 /* Move the new vehicle behind the old */ |
5498150a3b12
(svn r14406) -Fix [FS#Eddi]: Autoreplace did not work for vehicles in free wagon chains.
frosch <frosch@openttd.org>
parents:
10151
diff
changeset
|
365 MoveVehicle(new_v, old_v, DC_EXEC, false); |
5498150a3b12
(svn r14406) -Fix [FS#Eddi]: Autoreplace did not work for vehicles in free wagon chains.
frosch <frosch@openttd.org>
parents:
10151
diff
changeset
|
366 |
5498150a3b12
(svn r14406) -Fix [FS#Eddi]: Autoreplace did not work for vehicles in free wagon chains.
frosch <frosch@openttd.org>
parents:
10151
diff
changeset
|
367 /* Take over cargo |
5498150a3b12
(svn r14406) -Fix [FS#Eddi]: Autoreplace did not work for vehicles in free wagon chains.
frosch <frosch@openttd.org>
parents:
10151
diff
changeset
|
368 * Note: We do only transfer cargo from the old to the new vehicle. |
5498150a3b12
(svn r14406) -Fix [FS#Eddi]: Autoreplace did not work for vehicles in free wagon chains.
frosch <frosch@openttd.org>
parents:
10151
diff
changeset
|
369 * I.e. we do not transfer remaining cargo to other vehicles. |
5498150a3b12
(svn r14406) -Fix [FS#Eddi]: Autoreplace did not work for vehicles in free wagon chains.
frosch <frosch@openttd.org>
parents:
10151
diff
changeset
|
370 * Else you would also need to consider moving cargo to other free chains, |
5498150a3b12
(svn r14406) -Fix [FS#Eddi]: Autoreplace did not work for vehicles in free wagon chains.
frosch <frosch@openttd.org>
parents:
10151
diff
changeset
|
371 * or doing the same in ReplaceChain(), which would be quite troublesome. |
5498150a3b12
(svn r14406) -Fix [FS#Eddi]: Autoreplace did not work for vehicles in free wagon chains.
frosch <frosch@openttd.org>
parents:
10151
diff
changeset
|
372 */ |
5498150a3b12
(svn r14406) -Fix [FS#Eddi]: Autoreplace did not work for vehicles in free wagon chains.
frosch <frosch@openttd.org>
parents:
10151
diff
changeset
|
373 TransferCargo(old_v, new_v, false); |
5498150a3b12
(svn r14406) -Fix [FS#Eddi]: Autoreplace did not work for vehicles in free wagon chains.
frosch <frosch@openttd.org>
parents:
10151
diff
changeset
|
374 |
5498150a3b12
(svn r14406) -Fix [FS#Eddi]: Autoreplace did not work for vehicles in free wagon chains.
frosch <frosch@openttd.org>
parents:
10151
diff
changeset
|
375 *single_unit = new_v; |
5498150a3b12
(svn r14406) -Fix [FS#Eddi]: Autoreplace did not work for vehicles in free wagon chains.
frosch <frosch@openttd.org>
parents:
10151
diff
changeset
|
376 } |
5498150a3b12
(svn r14406) -Fix [FS#Eddi]: Autoreplace did not work for vehicles in free wagon chains.
frosch <frosch@openttd.org>
parents:
10151
diff
changeset
|
377 |
10194
bf9ac6242b4b
(svn r14407) -Cleanup (r14406): Remove a redundant test. (thanks SmatZ)
frosch <frosch@openttd.org>
parents:
10193
diff
changeset
|
378 /* Sell the old vehicle */ |
bf9ac6242b4b
(svn r14407) -Cleanup (r14406): Remove a redundant test. (thanks SmatZ)
frosch <frosch@openttd.org>
parents:
10193
diff
changeset
|
379 cost.AddCost(DoCommand(0, old_v->index, 0, flags, GetCmdSellVeh(old_v))); |
10193
5498150a3b12
(svn r14406) -Fix [FS#Eddi]: Autoreplace did not work for vehicles in free wagon chains.
frosch <frosch@openttd.org>
parents:
10151
diff
changeset
|
380 |
5498150a3b12
(svn r14406) -Fix [FS#Eddi]: Autoreplace did not work for vehicles in free wagon chains.
frosch <frosch@openttd.org>
parents:
10151
diff
changeset
|
381 /* If we are not in DC_EXEC undo everything */ |
5498150a3b12
(svn r14406) -Fix [FS#Eddi]: Autoreplace did not work for vehicles in free wagon chains.
frosch <frosch@openttd.org>
parents:
10151
diff
changeset
|
382 if ((flags & DC_EXEC) == 0) { |
5498150a3b12
(svn r14406) -Fix [FS#Eddi]: Autoreplace did not work for vehicles in free wagon chains.
frosch <frosch@openttd.org>
parents:
10151
diff
changeset
|
383 DoCommand(0, new_v->index, 0, DC_EXEC, GetCmdSellVeh(new_v)); |
5498150a3b12
(svn r14406) -Fix [FS#Eddi]: Autoreplace did not work for vehicles in free wagon chains.
frosch <frosch@openttd.org>
parents:
10151
diff
changeset
|
384 } |
5498150a3b12
(svn r14406) -Fix [FS#Eddi]: Autoreplace did not work for vehicles in free wagon chains.
frosch <frosch@openttd.org>
parents:
10151
diff
changeset
|
385 } |
5498150a3b12
(svn r14406) -Fix [FS#Eddi]: Autoreplace did not work for vehicles in free wagon chains.
frosch <frosch@openttd.org>
parents:
10151
diff
changeset
|
386 |
5498150a3b12
(svn r14406) -Fix [FS#Eddi]: Autoreplace did not work for vehicles in free wagon chains.
frosch <frosch@openttd.org>
parents:
10151
diff
changeset
|
387 return cost; |
5498150a3b12
(svn r14406) -Fix [FS#Eddi]: Autoreplace did not work for vehicles in free wagon chains.
frosch <frosch@openttd.org>
parents:
10151
diff
changeset
|
388 } |
5498150a3b12
(svn r14406) -Fix [FS#Eddi]: Autoreplace did not work for vehicles in free wagon chains.
frosch <frosch@openttd.org>
parents:
10151
diff
changeset
|
389 |
9928
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
390 /** Replace a whole vehicle chain |
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
391 * @param chain vehicle chain to let autoreplace/renew operator on |
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
392 * @param flags command flags |
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
393 * @param wagon_removal remove wagons when the resulting chain occupies more tiles than the old did |
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
394 * @param nothing_to_do is set to 'false' when something was done (only valid when not failed) |
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
395 * @return cost or error |
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
396 */ |
11090
df23c4e04638
(svn r15434) -Codechange: bit of type safety for the DC_xxx flags.
rubidium <rubidium@openttd.org>
parents:
10960
diff
changeset
|
397 static CommandCost ReplaceChain(Vehicle **chain, DoCommandFlag flags, bool wagon_removal, bool *nothing_to_do) |
9928
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
398 { |
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
399 Vehicle *old_head = *chain; |
10193
5498150a3b12
(svn r14406) -Fix [FS#Eddi]: Autoreplace did not work for vehicles in free wagon chains.
frosch <frosch@openttd.org>
parents:
10151
diff
changeset
|
400 assert(old_head->IsPrimaryVehicle()); |
9928
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
401 |
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
402 CommandCost cost = CommandCost(EXPENSES_NEW_VEHICLES, 0); |
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
403 |
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
404 if (old_head->type == VEH_TRAIN) { |
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
405 /* Store the length of the old vehicle chain, rounded up to whole tiles */ |
12114
f020ec6be498
(svn r16527) -Codechange: use static member functions instead of simple casts when converting Vehicle to specialised vehicle types. Includes safety check
smatz <smatz@openttd.org>
parents:
12089
diff
changeset
|
406 uint16 old_total_length = (Train::From(old_head)->tcache.cached_total_length + TILE_SIZE - 1) / TILE_SIZE * TILE_SIZE; |
9928
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
407 |
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
408 int num_units = 0; ///< Number of units in the chain |
12114
f020ec6be498
(svn r16527) -Codechange: use static member functions instead of simple casts when converting Vehicle to specialised vehicle types. Includes safety check
smatz <smatz@openttd.org>
parents:
12089
diff
changeset
|
409 for (Train *w = Train::From(old_head); w != NULL; w = GetNextUnit(w)) num_units++; |
9928
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
410 |
11985
e05790b0a6c6
(svn r16391) -Codechange: use Train instead of Vehicle where appropriate.
rubidium <rubidium@openttd.org>
parents:
11951
diff
changeset
|
411 Train **old_vehs = CallocT<Train *>(num_units); ///< Will store vehicles of the old chain in their order |
e05790b0a6c6
(svn r16391) -Codechange: use Train instead of Vehicle where appropriate.
rubidium <rubidium@openttd.org>
parents:
11951
diff
changeset
|
412 Train **new_vehs = CallocT<Train *>(num_units); ///< New vehicles corresponding to old_vehs or NULL if no replacement |
e05790b0a6c6
(svn r16391) -Codechange: use Train instead of Vehicle where appropriate.
rubidium <rubidium@openttd.org>
parents:
11951
diff
changeset
|
413 Money *new_costs = MallocT<Money>(num_units); ///< Costs for buying and refitting the new vehicles |
9928
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
414 |
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
415 /* Collect vehicles and build replacements |
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
416 * Note: The replacement vehicles can only successfully build as long as the old vehicles are still in their chain */ |
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
417 int i; |
11985
e05790b0a6c6
(svn r16391) -Codechange: use Train instead of Vehicle where appropriate.
rubidium <rubidium@openttd.org>
parents:
11951
diff
changeset
|
418 Train *w; |
12114
f020ec6be498
(svn r16527) -Codechange: use static member functions instead of simple casts when converting Vehicle to specialised vehicle types. Includes safety check
smatz <smatz@openttd.org>
parents:
12089
diff
changeset
|
419 for (w = Train::From(old_head), i = 0; w != NULL; w = GetNextUnit(w), i++) { |
9928
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
420 assert(i < num_units); |
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
421 old_vehs[i] = w; |
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
422 |
11985
e05790b0a6c6
(svn r16391) -Codechange: use Train instead of Vehicle where appropriate.
rubidium <rubidium@openttd.org>
parents:
11951
diff
changeset
|
423 CommandCost ret = BuildReplacementVehicle(old_vehs[i], (Vehicle**)&new_vehs[i], true); |
9928
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
424 cost.AddCost(ret); |
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
425 if (cost.Failed()) break; |
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
426 |
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
427 new_costs[i] = ret.GetCost(); |
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
428 if (new_vehs[i] != NULL) *nothing_to_do = false; |
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
429 } |
11985
e05790b0a6c6
(svn r16391) -Codechange: use Train instead of Vehicle where appropriate.
rubidium <rubidium@openttd.org>
parents:
11951
diff
changeset
|
430 Train *new_head = (new_vehs[0] != NULL ? new_vehs[0] : old_vehs[0]); |
9928
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
431 |
9968
4ff475766d4f
(svn r14125) -Fix [FS#2237]: Segfault when autoreplace failed very early.
frosch <frosch@openttd.org>
parents:
9936
diff
changeset
|
432 /* Note: When autoreplace has already failed here, old_vehs[] is not completely initialized. But it is also not needed. */ |
9928
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
433 if (cost.Succeeded()) { |
9968
4ff475766d4f
(svn r14125) -Fix [FS#2237]: Segfault when autoreplace failed very early.
frosch <frosch@openttd.org>
parents:
9936
diff
changeset
|
434 /* Separate the head, so we can start constructing the new chain */ |
12114
f020ec6be498
(svn r16527) -Codechange: use static member functions instead of simple casts when converting Vehicle to specialised vehicle types. Includes safety check
smatz <smatz@openttd.org>
parents:
12089
diff
changeset
|
435 Train *second = GetNextUnit(Train::From(old_head)); |
9928
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
436 if (second != NULL) cost.AddCost(MoveVehicle(second, NULL, DC_EXEC | DC_AUTOREPLACE, true)); |
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
437 |
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
438 assert(GetNextUnit(new_head) == NULL); |
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
439 |
9969
7a0342e24e35
(svn r14126) -Codechange (r14125): Add some tabs.
frosch <frosch@openttd.org>
parents:
9968
diff
changeset
|
440 /* Append engines to the new chain |
7a0342e24e35
(svn r14126) -Codechange (r14125): Add some tabs.
frosch <frosch@openttd.org>
parents:
9968
diff
changeset
|
441 * We do this from back to front, so that the head of the temporary vehicle chain does not change all the time. |
7a0342e24e35
(svn r14126) -Codechange (r14125): Add some tabs.
frosch <frosch@openttd.org>
parents:
9968
diff
changeset
|
442 * OTOH the vehicle attach callback is more expensive this way :s */ |
11985
e05790b0a6c6
(svn r16391) -Codechange: use Train instead of Vehicle where appropriate.
rubidium <rubidium@openttd.org>
parents:
11951
diff
changeset
|
443 Train *last_engine = NULL; ///< Shall store the last engine unit after this step |
9969
7a0342e24e35
(svn r14126) -Codechange (r14125): Add some tabs.
frosch <frosch@openttd.org>
parents:
9968
diff
changeset
|
444 if (cost.Succeeded()) { |
7a0342e24e35
(svn r14126) -Codechange (r14125): Add some tabs.
frosch <frosch@openttd.org>
parents:
9968
diff
changeset
|
445 for (int i = num_units - 1; i > 0; i--) { |
11985
e05790b0a6c6
(svn r16391) -Codechange: use Train instead of Vehicle where appropriate.
rubidium <rubidium@openttd.org>
parents:
11951
diff
changeset
|
446 Train *append = (new_vehs[i] != NULL ? new_vehs[i] : old_vehs[i]); |
9928
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
447 |
9969
7a0342e24e35
(svn r14126) -Codechange (r14125): Add some tabs.
frosch <frosch@openttd.org>
parents:
9968
diff
changeset
|
448 if (RailVehInfo(append->engine_type)->railveh_type == RAILVEH_WAGON) continue; |
9928
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
449 |
9969
7a0342e24e35
(svn r14126) -Codechange (r14125): Add some tabs.
frosch <frosch@openttd.org>
parents:
9968
diff
changeset
|
450 if (last_engine == NULL) last_engine = append; |
7a0342e24e35
(svn r14126) -Codechange (r14125): Add some tabs.
frosch <frosch@openttd.org>
parents:
9968
diff
changeset
|
451 cost.AddCost(MoveVehicle(append, new_head, DC_EXEC, false)); |
7a0342e24e35
(svn r14126) -Codechange (r14125): Add some tabs.
frosch <frosch@openttd.org>
parents:
9968
diff
changeset
|
452 if (cost.Failed()) break; |
7a0342e24e35
(svn r14126) -Codechange (r14125): Add some tabs.
frosch <frosch@openttd.org>
parents:
9968
diff
changeset
|
453 } |
7a0342e24e35
(svn r14126) -Codechange (r14125): Add some tabs.
frosch <frosch@openttd.org>
parents:
9968
diff
changeset
|
454 if (last_engine == NULL) last_engine = new_head; |
9928
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
455 } |
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
456 |
9969
7a0342e24e35
(svn r14126) -Codechange (r14125): Add some tabs.
frosch <frosch@openttd.org>
parents:
9968
diff
changeset
|
457 /* When wagon removal is enabled and the new engines without any wagons are already longer than the old, we have to fail */ |
11987
81554d4e6d76
(svn r16393) -Codechange: move VehicleRail to Train.
rubidium <rubidium@openttd.org>
parents:
11986
diff
changeset
|
458 if (cost.Succeeded() && wagon_removal && new_head->tcache.cached_total_length > old_total_length) cost = CommandCost(STR_TRAIN_TOO_LONG_AFTER_REPLACEMENT); |
9928
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
459 |
9969
7a0342e24e35
(svn r14126) -Codechange (r14125): Add some tabs.
frosch <frosch@openttd.org>
parents:
9968
diff
changeset
|
460 /* Append/insert wagons into the new vehicle chain |
7a0342e24e35
(svn r14126) -Codechange (r14125): Add some tabs.
frosch <frosch@openttd.org>
parents:
9968
diff
changeset
|
461 * We do this from back to front, so we can stop when wagon removal or maximum train length (i.e. from mammoth-train setting) is triggered. |
7a0342e24e35
(svn r14126) -Codechange (r14125): Add some tabs.
frosch <frosch@openttd.org>
parents:
9968
diff
changeset
|
462 */ |
7a0342e24e35
(svn r14126) -Codechange (r14125): Add some tabs.
frosch <frosch@openttd.org>
parents:
9968
diff
changeset
|
463 if (cost.Succeeded()) { |
7a0342e24e35
(svn r14126) -Codechange (r14125): Add some tabs.
frosch <frosch@openttd.org>
parents:
9968
diff
changeset
|
464 for (int i = num_units - 1; i > 0; i--) { |
7a0342e24e35
(svn r14126) -Codechange (r14125): Add some tabs.
frosch <frosch@openttd.org>
parents:
9968
diff
changeset
|
465 assert(last_engine != NULL); |
7a0342e24e35
(svn r14126) -Codechange (r14125): Add some tabs.
frosch <frosch@openttd.org>
parents:
9968
diff
changeset
|
466 Vehicle *append = (new_vehs[i] != NULL ? new_vehs[i] : old_vehs[i]); |
9928
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
467 |
9969
7a0342e24e35
(svn r14126) -Codechange (r14125): Add some tabs.
frosch <frosch@openttd.org>
parents:
9968
diff
changeset
|
468 if (RailVehInfo(append->engine_type)->railveh_type == RAILVEH_WAGON) { |
7a0342e24e35
(svn r14126) -Codechange (r14125): Add some tabs.
frosch <frosch@openttd.org>
parents:
9968
diff
changeset
|
469 /* Insert wagon after 'last_engine' */ |
7a0342e24e35
(svn r14126) -Codechange (r14125): Add some tabs.
frosch <frosch@openttd.org>
parents:
9968
diff
changeset
|
470 CommandCost res = MoveVehicle(append, last_engine, DC_EXEC, false); |
9928
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
471 |
11987
81554d4e6d76
(svn r16393) -Codechange: move VehicleRail to Train.
rubidium <rubidium@openttd.org>
parents:
11986
diff
changeset
|
472 if (res.Succeeded() && wagon_removal && new_head->tcache.cached_total_length > old_total_length) { |
9969
7a0342e24e35
(svn r14126) -Codechange (r14125): Add some tabs.
frosch <frosch@openttd.org>
parents:
9968
diff
changeset
|
473 MoveVehicle(append, NULL, DC_EXEC | DC_AUTOREPLACE, false); |
7a0342e24e35
(svn r14126) -Codechange (r14125): Add some tabs.
frosch <frosch@openttd.org>
parents:
9968
diff
changeset
|
474 break; |
7a0342e24e35
(svn r14126) -Codechange (r14125): Add some tabs.
frosch <frosch@openttd.org>
parents:
9968
diff
changeset
|
475 } |
9928
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
476 |
9969
7a0342e24e35
(svn r14126) -Codechange (r14125): Add some tabs.
frosch <frosch@openttd.org>
parents:
9968
diff
changeset
|
477 cost.AddCost(res); |
7a0342e24e35
(svn r14126) -Codechange (r14125): Add some tabs.
frosch <frosch@openttd.org>
parents:
9968
diff
changeset
|
478 if (cost.Failed()) break; |
7a0342e24e35
(svn r14126) -Codechange (r14125): Add some tabs.
frosch <frosch@openttd.org>
parents:
9968
diff
changeset
|
479 } else { |
7a0342e24e35
(svn r14126) -Codechange (r14125): Add some tabs.
frosch <frosch@openttd.org>
parents:
9968
diff
changeset
|
480 /* We have reached 'last_engine', continue with the next engine towards the front */ |
7a0342e24e35
(svn r14126) -Codechange (r14125): Add some tabs.
frosch <frosch@openttd.org>
parents:
9968
diff
changeset
|
481 assert(append == last_engine); |
7a0342e24e35
(svn r14126) -Codechange (r14125): Add some tabs.
frosch <frosch@openttd.org>
parents:
9968
diff
changeset
|
482 last_engine = GetPrevUnit(last_engine); |
7a0342e24e35
(svn r14126) -Codechange (r14125): Add some tabs.
frosch <frosch@openttd.org>
parents:
9968
diff
changeset
|
483 } |
9928
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
484 } |
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
485 } |
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
486 |
9969
7a0342e24e35
(svn r14126) -Codechange (r14125): Add some tabs.
frosch <frosch@openttd.org>
parents:
9968
diff
changeset
|
487 /* Sell superfluous new vehicles that could not be inserted. */ |
7a0342e24e35
(svn r14126) -Codechange (r14125): Add some tabs.
frosch <frosch@openttd.org>
parents:
9968
diff
changeset
|
488 if (cost.Succeeded() && wagon_removal) { |
7a0342e24e35
(svn r14126) -Codechange (r14125): Add some tabs.
frosch <frosch@openttd.org>
parents:
9968
diff
changeset
|
489 for (int i = 1; i < num_units; i++) { |
7a0342e24e35
(svn r14126) -Codechange (r14125): Add some tabs.
frosch <frosch@openttd.org>
parents:
9968
diff
changeset
|
490 Vehicle *wagon = new_vehs[i]; |
7a0342e24e35
(svn r14126) -Codechange (r14125): Add some tabs.
frosch <frosch@openttd.org>
parents:
9968
diff
changeset
|
491 if (wagon == NULL) continue; |
7a0342e24e35
(svn r14126) -Codechange (r14125): Add some tabs.
frosch <frosch@openttd.org>
parents:
9968
diff
changeset
|
492 if (wagon->First() == new_head) break; |
9928
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
493 |
9969
7a0342e24e35
(svn r14126) -Codechange (r14125): Add some tabs.
frosch <frosch@openttd.org>
parents:
9968
diff
changeset
|
494 assert(RailVehInfo(wagon->engine_type)->railveh_type == RAILVEH_WAGON); |
9928
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
495 |
9969
7a0342e24e35
(svn r14126) -Codechange (r14125): Add some tabs.
frosch <frosch@openttd.org>
parents:
9968
diff
changeset
|
496 /* Sell wagon */ |
7a0342e24e35
(svn r14126) -Codechange (r14125): Add some tabs.
frosch <frosch@openttd.org>
parents:
9968
diff
changeset
|
497 CommandCost ret = DoCommand(0, wagon->index, 0, DC_EXEC, GetCmdSellVeh(wagon)); |
7a0342e24e35
(svn r14126) -Codechange (r14125): Add some tabs.
frosch <frosch@openttd.org>
parents:
9968
diff
changeset
|
498 assert(ret.Succeeded()); |
7a0342e24e35
(svn r14126) -Codechange (r14125): Add some tabs.
frosch <frosch@openttd.org>
parents:
9968
diff
changeset
|
499 new_vehs[i] = NULL; |
9928
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
500 |
9969
7a0342e24e35
(svn r14126) -Codechange (r14125): Add some tabs.
frosch <frosch@openttd.org>
parents:
9968
diff
changeset
|
501 /* Revert the money subtraction when the vehicle was built. |
7a0342e24e35
(svn r14126) -Codechange (r14125): Add some tabs.
frosch <frosch@openttd.org>
parents:
9968
diff
changeset
|
502 * This value is different from the sell value, esp. because of refitting */ |
7a0342e24e35
(svn r14126) -Codechange (r14125): Add some tabs.
frosch <frosch@openttd.org>
parents:
9968
diff
changeset
|
503 cost.AddCost(-new_costs[i]); |
7a0342e24e35
(svn r14126) -Codechange (r14125): Add some tabs.
frosch <frosch@openttd.org>
parents:
9968
diff
changeset
|
504 } |
9928
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
505 } |
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
506 |
9969
7a0342e24e35
(svn r14126) -Codechange (r14125): Add some tabs.
frosch <frosch@openttd.org>
parents:
9968
diff
changeset
|
507 /* The new vehicle chain is constructed, now take over orders and everything... */ |
7a0342e24e35
(svn r14126) -Codechange (r14125): Add some tabs.
frosch <frosch@openttd.org>
parents:
9968
diff
changeset
|
508 if (cost.Succeeded()) cost.AddCost(CopyHeadSpecificThings(old_head, new_head, flags)); |
7a0342e24e35
(svn r14126) -Codechange (r14125): Add some tabs.
frosch <frosch@openttd.org>
parents:
9968
diff
changeset
|
509 |
7a0342e24e35
(svn r14126) -Codechange (r14125): Add some tabs.
frosch <frosch@openttd.org>
parents:
9968
diff
changeset
|
510 if (cost.Succeeded()) { |
7a0342e24e35
(svn r14126) -Codechange (r14125): Add some tabs.
frosch <frosch@openttd.org>
parents:
9968
diff
changeset
|
511 /* Success ! */ |
7a0342e24e35
(svn r14126) -Codechange (r14125): Add some tabs.
frosch <frosch@openttd.org>
parents:
9968
diff
changeset
|
512 if ((flags & DC_EXEC) != 0 && new_head != old_head) { |
7a0342e24e35
(svn r14126) -Codechange (r14125): Add some tabs.
frosch <frosch@openttd.org>
parents:
9968
diff
changeset
|
513 *chain = new_head; |
7a0342e24e35
(svn r14126) -Codechange (r14125): Add some tabs.
frosch <frosch@openttd.org>
parents:
9968
diff
changeset
|
514 } |
9928
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
515 |
11342
fff0ccb2819a
(svn r15692) -Fix [FS#2721]: Just sell the old engines after autorenew/replace. Don't bother about trains exceeding the trainlimit, which will be sold anyway.
frosch <frosch@openttd.org>
parents:
11330
diff
changeset
|
516 /* Transfer cargo of old vehicles and sell them */ |
9969
7a0342e24e35
(svn r14126) -Codechange (r14125): Add some tabs.
frosch <frosch@openttd.org>
parents:
9968
diff
changeset
|
517 for (int i = 0; i < num_units; i++) { |
7a0342e24e35
(svn r14126) -Codechange (r14125): Add some tabs.
frosch <frosch@openttd.org>
parents:
9968
diff
changeset
|
518 Vehicle *w = old_vehs[i]; |
7a0342e24e35
(svn r14126) -Codechange (r14125): Add some tabs.
frosch <frosch@openttd.org>
parents:
9968
diff
changeset
|
519 /* Is the vehicle again part of the new chain? |
7a0342e24e35
(svn r14126) -Codechange (r14125): Add some tabs.
frosch <frosch@openttd.org>
parents:
9968
diff
changeset
|
520 * Note: We cannot test 'new_vehs[i] != NULL' as wagon removal might cause to remove both */ |
7a0342e24e35
(svn r14126) -Codechange (r14125): Add some tabs.
frosch <frosch@openttd.org>
parents:
9968
diff
changeset
|
521 if (w->First() == new_head) continue; |
9928
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
522 |
10193
5498150a3b12
(svn r14406) -Fix [FS#Eddi]: Autoreplace did not work for vehicles in free wagon chains.
frosch <frosch@openttd.org>
parents:
10151
diff
changeset
|
523 if ((flags & DC_EXEC) != 0) TransferCargo(w, new_head, true); |
9969
7a0342e24e35
(svn r14126) -Codechange (r14125): Add some tabs.
frosch <frosch@openttd.org>
parents:
9968
diff
changeset
|
524 |
11342
fff0ccb2819a
(svn r15692) -Fix [FS#2721]: Just sell the old engines after autorenew/replace. Don't bother about trains exceeding the trainlimit, which will be sold anyway.
frosch <frosch@openttd.org>
parents:
11330
diff
changeset
|
525 /* Sell the vehicle. |
fff0ccb2819a
(svn r15692) -Fix [FS#2721]: Just sell the old engines after autorenew/replace. Don't bother about trains exceeding the trainlimit, which will be sold anyway.
frosch <frosch@openttd.org>
parents:
11330
diff
changeset
|
526 * Note: This might temporarly construct new trains, so use DC_AUTOREPLACE to prevent |
fff0ccb2819a
(svn r15692) -Fix [FS#2721]: Just sell the old engines after autorenew/replace. Don't bother about trains exceeding the trainlimit, which will be sold anyway.
frosch <frosch@openttd.org>
parents:
11330
diff
changeset
|
527 * it from failing due to engine limits. */ |
fff0ccb2819a
(svn r15692) -Fix [FS#2721]: Just sell the old engines after autorenew/replace. Don't bother about trains exceeding the trainlimit, which will be sold anyway.
frosch <frosch@openttd.org>
parents:
11330
diff
changeset
|
528 cost.AddCost(DoCommand(0, w->index, 0, flags | DC_AUTOREPLACE, GetCmdSellVeh(w))); |
9969
7a0342e24e35
(svn r14126) -Codechange (r14125): Add some tabs.
frosch <frosch@openttd.org>
parents:
9968
diff
changeset
|
529 if ((flags & DC_EXEC) != 0) { |
7a0342e24e35
(svn r14126) -Codechange (r14125): Add some tabs.
frosch <frosch@openttd.org>
parents:
9968
diff
changeset
|
530 old_vehs[i] = NULL; |
7a0342e24e35
(svn r14126) -Codechange (r14125): Add some tabs.
frosch <frosch@openttd.org>
parents:
9968
diff
changeset
|
531 if (i == 0) old_head = NULL; |
7a0342e24e35
(svn r14126) -Codechange (r14125): Add some tabs.
frosch <frosch@openttd.org>
parents:
9968
diff
changeset
|
532 } |
9928
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
533 } |
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
534 } |
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
535 |
9969
7a0342e24e35
(svn r14126) -Codechange (r14125): Add some tabs.
frosch <frosch@openttd.org>
parents:
9968
diff
changeset
|
536 /* If we are not in DC_EXEC undo everything, i.e. rearrange old vehicles. |
7a0342e24e35
(svn r14126) -Codechange (r14125): Add some tabs.
frosch <frosch@openttd.org>
parents:
9968
diff
changeset
|
537 * We do this from back to front, so that the head of the temporary vehicle chain does not change all the time. |
7a0342e24e35
(svn r14126) -Codechange (r14125): Add some tabs.
frosch <frosch@openttd.org>
parents:
9968
diff
changeset
|
538 * Note: The vehicle attach callback is disabled here :) */ |
7a0342e24e35
(svn r14126) -Codechange (r14125): Add some tabs.
frosch <frosch@openttd.org>
parents:
9968
diff
changeset
|
539 if ((flags & DC_EXEC) == 0) { |
7a0342e24e35
(svn r14126) -Codechange (r14125): Add some tabs.
frosch <frosch@openttd.org>
parents:
9968
diff
changeset
|
540 /* Separate the head, so we can reattach the old vehicles */ |
12114
f020ec6be498
(svn r16527) -Codechange: use static member functions instead of simple casts when converting Vehicle to specialised vehicle types. Includes safety check
smatz <smatz@openttd.org>
parents:
12089
diff
changeset
|
541 Train *second = GetNextUnit(Train::From(old_head)); |
9969
7a0342e24e35
(svn r14126) -Codechange (r14125): Add some tabs.
frosch <frosch@openttd.org>
parents:
9968
diff
changeset
|
542 if (second != NULL) MoveVehicle(second, NULL, DC_EXEC | DC_AUTOREPLACE, true); |
9928
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
543 |
12114
f020ec6be498
(svn r16527) -Codechange: use static member functions instead of simple casts when converting Vehicle to specialised vehicle types. Includes safety check
smatz <smatz@openttd.org>
parents:
12089
diff
changeset
|
544 assert(GetNextUnit(Train::From(old_head)) == NULL); |
9928
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
545 |
9969
7a0342e24e35
(svn r14126) -Codechange (r14125): Add some tabs.
frosch <frosch@openttd.org>
parents:
9968
diff
changeset
|
546 for (int i = num_units - 1; i > 0; i--) { |
7a0342e24e35
(svn r14126) -Codechange (r14125): Add some tabs.
frosch <frosch@openttd.org>
parents:
9968
diff
changeset
|
547 CommandCost ret = MoveVehicle(old_vehs[i], old_head, DC_EXEC | DC_AUTOREPLACE, false); |
7a0342e24e35
(svn r14126) -Codechange (r14125): Add some tabs.
frosch <frosch@openttd.org>
parents:
9968
diff
changeset
|
548 assert(ret.Succeeded()); |
7a0342e24e35
(svn r14126) -Codechange (r14125): Add some tabs.
frosch <frosch@openttd.org>
parents:
9968
diff
changeset
|
549 } |
9968
4ff475766d4f
(svn r14125) -Fix [FS#2237]: Segfault when autoreplace failed very early.
frosch <frosch@openttd.org>
parents:
9936
diff
changeset
|
550 } |
4ff475766d4f
(svn r14125) -Fix [FS#2237]: Segfault when autoreplace failed very early.
frosch <frosch@openttd.org>
parents:
9936
diff
changeset
|
551 } |
9928
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
552 |
9968
4ff475766d4f
(svn r14125) -Fix [FS#2237]: Segfault when autoreplace failed very early.
frosch <frosch@openttd.org>
parents:
9936
diff
changeset
|
553 /* Finally undo buying of new vehicles */ |
4ff475766d4f
(svn r14125) -Fix [FS#2237]: Segfault when autoreplace failed very early.
frosch <frosch@openttd.org>
parents:
9936
diff
changeset
|
554 if ((flags & DC_EXEC) == 0) { |
9928
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
555 for (int i = num_units - 1; i >= 0; i--) { |
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
556 if (new_vehs[i] != NULL) { |
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
557 DoCommand(0, new_vehs[i]->index, 0, DC_EXEC, GetCmdSellVeh(new_vehs[i])); |
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
558 new_vehs[i] = NULL; |
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
559 } |
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
560 } |
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
561 } |
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
562 |
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
563 free(old_vehs); |
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
564 free(new_vehs); |
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
565 free(new_costs); |
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
566 } else { |
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
567 /* Build and refit replacement vehicle */ |
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
568 Vehicle *new_head = NULL; |
10193
5498150a3b12
(svn r14406) -Fix [FS#Eddi]: Autoreplace did not work for vehicles in free wagon chains.
frosch <frosch@openttd.org>
parents:
10151
diff
changeset
|
569 cost.AddCost(BuildReplacementVehicle(old_head, &new_head, true)); |
9928
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
570 |
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
571 /* Was a new vehicle constructed? */ |
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
572 if (cost.Succeeded() && new_head != NULL) { |
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
573 *nothing_to_do = false; |
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
574 |
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
575 /* The new vehicle is constructed, now take over orders and everything... */ |
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
576 cost.AddCost(CopyHeadSpecificThings(old_head, new_head, flags)); |
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
577 |
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
578 if (cost.Succeeded()) { |
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
579 /* The new vehicle is constructed, now take over cargo */ |
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
580 if ((flags & DC_EXEC) != 0) { |
10193
5498150a3b12
(svn r14406) -Fix [FS#Eddi]: Autoreplace did not work for vehicles in free wagon chains.
frosch <frosch@openttd.org>
parents:
10151
diff
changeset
|
581 TransferCargo(old_head, new_head, true); |
9928
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
582 *chain = new_head; |
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
583 } |
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
584 |
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
585 /* Sell the old vehicle */ |
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
586 cost.AddCost(DoCommand(0, old_head->index, 0, flags, GetCmdSellVeh(old_head))); |
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
587 } |
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
588 |
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
589 /* If we are not in DC_EXEC undo everything */ |
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
590 if ((flags & DC_EXEC) == 0) { |
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
591 DoCommand(0, new_head->index, 0, DC_EXEC, GetCmdSellVeh(new_head)); |
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
592 } |
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
593 } |
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
594 } |
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
595 |
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
596 return cost; |
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
597 } |
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
598 |
10193
5498150a3b12
(svn r14406) -Fix [FS#Eddi]: Autoreplace did not work for vehicles in free wagon chains.
frosch <frosch@openttd.org>
parents:
10151
diff
changeset
|
599 /** Autoreplaces a vehicle |
5498150a3b12
(svn r14406) -Fix [FS#Eddi]: Autoreplace did not work for vehicles in free wagon chains.
frosch <frosch@openttd.org>
parents:
10151
diff
changeset
|
600 * Trains are replaced as a whole chain, free wagons in depot are replaced on their own |
9928
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
601 * @param tile not used |
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
602 * @param flags type of operation |
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
603 * @param p1 Index of vehicle |
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
604 * @param p2 not used |
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
605 */ |
11090
df23c4e04638
(svn r15434) -Codechange: bit of type safety for the DC_xxx flags.
rubidium <rubidium@openttd.org>
parents:
10960
diff
changeset
|
606 CommandCost CmdAutoreplaceVehicle(TileIndex tile, DoCommandFlag flags, uint32 p1, uint32 p2, const char *text) |
9928
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
607 { |
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
608 CommandCost cost = CommandCost(EXPENSES_NEW_VEHICLES, 0); |
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
609 bool nothing_to_do = true; |
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
610 |
11949
c89301974eb8
(svn r16352) -Codechange: use PoolItem::GetIfValid() instead of PoolItem::IsValidID() and PoolItem::Get()
smatz <smatz@openttd.org>
parents:
11924
diff
changeset
|
611 Vehicle *v = Vehicle::GetIfValid(p1); |
c89301974eb8
(svn r16352) -Codechange: use PoolItem::GetIfValid() instead of PoolItem::IsValidID() and PoolItem::Get()
smatz <smatz@openttd.org>
parents:
11924
diff
changeset
|
612 if (v == NULL) return CMD_ERROR; |
c89301974eb8
(svn r16352) -Codechange: use PoolItem::GetIfValid() instead of PoolItem::IsValidID() and PoolItem::Get()
smatz <smatz@openttd.org>
parents:
11924
diff
changeset
|
613 |
9928
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
614 if (!CheckOwnership(v->owner)) return CMD_ERROR; |
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
615 if (!v->IsInDepot()) return CMD_ERROR; |
12089
482bdd64bbe8
(svn r16498) -Codechange: Remove hardly used HASBITS.
frosch <frosch@openttd.org>
parents:
11987
diff
changeset
|
616 if (v->vehstatus & VS_CRASHED) return CMD_ERROR; |
9928
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
617 |
10193
5498150a3b12
(svn r14406) -Fix [FS#Eddi]: Autoreplace did not work for vehicles in free wagon chains.
frosch <frosch@openttd.org>
parents:
10151
diff
changeset
|
618 bool free_wagon = false; |
5498150a3b12
(svn r14406) -Fix [FS#Eddi]: Autoreplace did not work for vehicles in free wagon chains.
frosch <frosch@openttd.org>
parents:
10151
diff
changeset
|
619 if (v->type == VEH_TRAIN) { |
5498150a3b12
(svn r14406) -Fix [FS#Eddi]: Autoreplace did not work for vehicles in free wagon chains.
frosch <frosch@openttd.org>
parents:
10151
diff
changeset
|
620 if (IsArticulatedPart(v) || IsRearDualheaded(v)) return CMD_ERROR; |
5498150a3b12
(svn r14406) -Fix [FS#Eddi]: Autoreplace did not work for vehicles in free wagon chains.
frosch <frosch@openttd.org>
parents:
10151
diff
changeset
|
621 free_wagon = !IsFrontEngine(v); |
5498150a3b12
(svn r14406) -Fix [FS#Eddi]: Autoreplace did not work for vehicles in free wagon chains.
frosch <frosch@openttd.org>
parents:
10151
diff
changeset
|
622 if (free_wagon && IsFrontEngine(v->First())) return CMD_ERROR; |
5498150a3b12
(svn r14406) -Fix [FS#Eddi]: Autoreplace did not work for vehicles in free wagon chains.
frosch <frosch@openttd.org>
parents:
10151
diff
changeset
|
623 } else { |
5498150a3b12
(svn r14406) -Fix [FS#Eddi]: Autoreplace did not work for vehicles in free wagon chains.
frosch <frosch@openttd.org>
parents:
10151
diff
changeset
|
624 if (!v->IsPrimaryVehicle()) return CMD_ERROR; |
5498150a3b12
(svn r14406) -Fix [FS#Eddi]: Autoreplace did not work for vehicles in free wagon chains.
frosch <frosch@openttd.org>
parents:
10151
diff
changeset
|
625 } |
5498150a3b12
(svn r14406) -Fix [FS#Eddi]: Autoreplace did not work for vehicles in free wagon chains.
frosch <frosch@openttd.org>
parents:
10151
diff
changeset
|
626 |
11922
0a4b63f3f3c3
(svn r16325) -Codechange: replace GetPoolItem(index) by PoolItem::Get(index)
smatz <smatz@openttd.org>
parents:
11913
diff
changeset
|
627 const Company *c = Company::Get(_current_company); |
11913
f67b6243e05a
(svn r16315) -Codechange: move the autorenew settings to a new CompanySettings struct
yexo <yexo@openttd.org>
parents:
11342
diff
changeset
|
628 bool wagon_removal = c->settings.renew_keep_length; |
9928
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
629 |
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
630 /* Test whether any replacement is set, before issuing a whole lot of commands that would end in nothing changed */ |
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
631 Vehicle *w = v; |
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
632 bool any_replacements = false; |
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
633 while (w != NULL && !any_replacements) { |
10207
c54d140df948
(svn r14421) -Codechange: rename all player variables/types to company *or* client so it is immediatelly clear which one you are working with.
rubidium <rubidium@openttd.org>
parents:
10198
diff
changeset
|
634 any_replacements = (GetNewEngineType(w, c) != INVALID_ENGINE); |
12114
f020ec6be498
(svn r16527) -Codechange: use static member functions instead of simple casts when converting Vehicle to specialised vehicle types. Includes safety check
smatz <smatz@openttd.org>
parents:
12089
diff
changeset
|
635 w = (!free_wagon && w->type == VEH_TRAIN ? GetNextUnit(Train::From(w)) : NULL); |
9928
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
636 } |
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
637 |
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
638 if (any_replacements) { |
10193
5498150a3b12
(svn r14406) -Fix [FS#Eddi]: Autoreplace did not work for vehicles in free wagon chains.
frosch <frosch@openttd.org>
parents:
10151
diff
changeset
|
639 bool was_stopped = free_wagon || ((v->vehstatus & VS_STOPPED) != 0); |
9928
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
640 |
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
641 /* Stop the vehicle */ |
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
642 if (!was_stopped) cost.AddCost(StartStopVehicle(v, true)); |
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
643 if (cost.Failed()) return cost; |
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
644 |
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
645 assert(v->IsStoppedInDepot()); |
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
646 |
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
647 /* We have to construct the new vehicle chain to test whether it is valid. |
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
648 * Vehicle construction needs random bits, so we have to save the random seeds |
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
649 * to prevent desyncs and to replay newgrf callbacks during DC_EXEC */ |
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
650 SavedRandomSeeds saved_seeds; |
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
651 SaveRandomSeeds(&saved_seeds); |
10193
5498150a3b12
(svn r14406) -Fix [FS#Eddi]: Autoreplace did not work for vehicles in free wagon chains.
frosch <frosch@openttd.org>
parents:
10151
diff
changeset
|
652 if (free_wagon) { |
5498150a3b12
(svn r14406) -Fix [FS#Eddi]: Autoreplace did not work for vehicles in free wagon chains.
frosch <frosch@openttd.org>
parents:
10151
diff
changeset
|
653 cost.AddCost(ReplaceFreeUnit(&v, flags & ~DC_EXEC, ¬hing_to_do)); |
5498150a3b12
(svn r14406) -Fix [FS#Eddi]: Autoreplace did not work for vehicles in free wagon chains.
frosch <frosch@openttd.org>
parents:
10151
diff
changeset
|
654 } else { |
5498150a3b12
(svn r14406) -Fix [FS#Eddi]: Autoreplace did not work for vehicles in free wagon chains.
frosch <frosch@openttd.org>
parents:
10151
diff
changeset
|
655 cost.AddCost(ReplaceChain(&v, flags & ~DC_EXEC, wagon_removal, ¬hing_to_do)); |
5498150a3b12
(svn r14406) -Fix [FS#Eddi]: Autoreplace did not work for vehicles in free wagon chains.
frosch <frosch@openttd.org>
parents:
10151
diff
changeset
|
656 } |
9928
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
657 RestoreRandomSeeds(saved_seeds); |
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
658 |
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
659 if (cost.Succeeded() && (flags & DC_EXEC) != 0) { |
10193
5498150a3b12
(svn r14406) -Fix [FS#Eddi]: Autoreplace did not work for vehicles in free wagon chains.
frosch <frosch@openttd.org>
parents:
10151
diff
changeset
|
660 CommandCost ret; |
5498150a3b12
(svn r14406) -Fix [FS#Eddi]: Autoreplace did not work for vehicles in free wagon chains.
frosch <frosch@openttd.org>
parents:
10151
diff
changeset
|
661 if (free_wagon) { |
5498150a3b12
(svn r14406) -Fix [FS#Eddi]: Autoreplace did not work for vehicles in free wagon chains.
frosch <frosch@openttd.org>
parents:
10151
diff
changeset
|
662 ret = ReplaceFreeUnit(&v, flags, ¬hing_to_do); |
5498150a3b12
(svn r14406) -Fix [FS#Eddi]: Autoreplace did not work for vehicles in free wagon chains.
frosch <frosch@openttd.org>
parents:
10151
diff
changeset
|
663 } else { |
5498150a3b12
(svn r14406) -Fix [FS#Eddi]: Autoreplace did not work for vehicles in free wagon chains.
frosch <frosch@openttd.org>
parents:
10151
diff
changeset
|
664 ret = ReplaceChain(&v, flags, wagon_removal, ¬hing_to_do); |
5498150a3b12
(svn r14406) -Fix [FS#Eddi]: Autoreplace did not work for vehicles in free wagon chains.
frosch <frosch@openttd.org>
parents:
10151
diff
changeset
|
665 } |
9928
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
666 assert(ret.Succeeded() && ret.GetCost() == cost.GetCost()); |
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
667 } |
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
668 |
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
669 /* Restart the vehicle */ |
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
670 if (!was_stopped) cost.AddCost(StartStopVehicle(v, false)); |
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
671 } |
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
672 |
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
673 if (cost.Succeeded() && nothing_to_do) cost = CommandCost(STR_AUTOREPLACE_NOTHING_TO_DO); |
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
674 return cost; |
0cc9c6c36c43
(svn r14083) -Fix [FS#1264, FS#2037, FS#2038, FS#2110]: Rewrite the autoreplace kernel.
frosch <frosch@openttd.org>
parents:
9889
diff
changeset
|
675 } |