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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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, &nothing_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, &nothing_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, &nothing_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, &nothing_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 }