From ad2fdd8d6fefe8cde63aa4147ae5cd77ebae49d5 Mon Sep 17 00:00:00 2001 From: michi_cc Date: Fri, 4 Nov 2011 15:04:24 +0000 Subject: [PATCH] (svn r23111) -Fix: Keep subtype when automatically choosing the cargo for auto-refitting. --- src/economy.cpp | 1 + src/vehicle_func.h | 3 ++- src/vehicle_gui.cpp | 9 ++++++--- 3 files changed, 9 insertions(+), 4 deletions(-) diff --git a/src/economy.cpp b/src/economy.cpp index 2480be14f9..5ba852bc6f 100644 --- a/src/economy.cpp +++ b/src/economy.cpp @@ -1300,6 +1300,7 @@ static void LoadUnloadVehicle(Vehicle *front, int *cargo_left) if (cargo_left[cid] > amount) { /* Try to find out if auto-refitting would succeed. In case the refit is allowed, * the returned refit capacity will be greater than zero. */ + new_subtype = GetBestFittingSubType(v, v, cid); DoCommand(v->tile, v->index, cid | 1U << 6 | new_subtype << 8 | 1U << 16, DC_QUERY_COST, GetCmdRefitVeh(v)); // Auto-refit and only this vehicle including artic parts. if (_returned_refit_capacity > 0) { amount = cargo_left[cid]; diff --git a/src/vehicle_func.h b/src/vehicle_func.h index efc07ed075..7082404ae7 100644 --- a/src/vehicle_func.h +++ b/src/vehicle_func.h @@ -21,6 +21,7 @@ #include "newgrf_config.h" #include "track_type.h" #include "livery.h" +#include "cargotype.h" #define is_custom_sprite(x) (x >= 0xFD) #define IS_CUSTOM_FIRSTHEAD_SPRITE(x) (x == 0xFD) @@ -44,7 +45,7 @@ byte VehicleRandomBits(); void ResetVehiclePosHash(); void ResetVehicleColourMap(); -byte GetBestFittingSubType(Vehicle *v_from, Vehicle *v_for); +byte GetBestFittingSubType(Vehicle *v_from, Vehicle *v_for, CargoID dest_cargo_type = INVALID_CARGO); void ViewportAddVehicles(DrawPixelInfo *dpi); diff --git a/src/vehicle_gui.cpp b/src/vehicle_gui.cpp index 5a2993516a..abd1e3317e 100644 --- a/src/vehicle_gui.cpp +++ b/src/vehicle_gui.cpp @@ -213,9 +213,10 @@ static const uint MAX_REFIT_CYCLE = 256; * Assuming they are going to carry the same cargo ofcourse! * @param v_from the vehicle to match the subtype from * @param v_for the vehicle to get the subtype for + * @param dest_cargo_type Destination cargo type, taken from #v_from if set to #INVALID_CARGO. * @return the best sub type */ -byte GetBestFittingSubType(Vehicle *v_from, Vehicle *v_for) +byte GetBestFittingSubType(Vehicle *v_from, Vehicle *v_for, CargoID dest_cargo_type) { const Engine *e_from = v_from->GetEngine(); const Engine *e_for = v_for->GetEngine(); @@ -229,8 +230,10 @@ byte GetBestFittingSubType(Vehicle *v_from, Vehicle *v_for) return 0; } + if (dest_cargo_type == INVALID_CARGO) dest_cargo_type = v_from->cargo_type; + /* It has to be possible for v_for to carry the cargo of v_from. */ - if (!HasBit(e_for->info.refit_mask, v_from->cargo_type)) return 0; + if (!HasBit(e_for->info.refit_mask, dest_cargo_type)) return 0; StringID expected_string = GetCargoSubtypeText(v_from); @@ -239,7 +242,7 @@ byte GetBestFittingSubType(Vehicle *v_from, Vehicle *v_for) byte ret_refit_cyc = 0; /* Set the 'destination' cargo */ - v_for->cargo_type = v_from->cargo_type; + v_for->cargo_type = dest_cargo_type; /* Cycle through the refits */ for (uint refit_cyc = 0; refit_cyc < MAX_REFIT_CYCLE; refit_cyc++) {