summaryrefslogtreecommitdiff
path: root/src/train_cmd.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/train_cmd.cpp')
-rw-r--r--src/train_cmd.cpp49
1 files changed, 6 insertions, 43 deletions
diff --git a/src/train_cmd.cpp b/src/train_cmd.cpp
index be4c66f3e..2cb2541c0 100644
--- a/src/train_cmd.cpp
+++ b/src/train_cmd.cpp
@@ -2113,52 +2113,15 @@ CommandCost CmdRefitRailVehicle(TileIndex tile, DoCommandFlag flags, uint32 p1,
/* Check cargo */
if (new_cid >= NUM_CARGO) return CMD_ERROR;
- CommandCost cost(EXPENSES_TRAIN_RUN);
- uint num = 0;
-
- v->InvalidateNewGRFCacheOfChain();
- do {
- /* XXX: We also refit all the attached wagons en-masse if they
- * can be refitted. This is how TTDPatch does it. TODO: Have
- * some nice [Refit] button near each wagon. --pasky */
- if (!CanRefitTo(v->engine_type, new_cid)) continue;
-
- const Engine *e = Engine::Get(v->engine_type);
- if (!e->CanCarryCargo()) continue;
-
- /* Back up the vehicle's cargo type */
- CargoID temp_cid = v->cargo_type;
- byte temp_subtype = v->cargo_subtype;
- v->cargo_type = new_cid;
- v->cargo_subtype = new_subtype;
-
- uint amount = GetVehicleCapacity(v);
-
- /* Restore the original cargo type */
- v->cargo_type = temp_cid;
- v->cargo_subtype = temp_subtype;
-
- if (new_cid != v->cargo_type) {
- cost.AddCost(GetRefitCost(v->engine_type));
- }
-
- num += amount;
- if (flags & DC_EXEC) {
- v->cargo.Truncate((v->cargo_type == new_cid) ? amount : 0);
- v->cargo_type = new_cid;
- v->cargo_cap = amount;
- v->cargo_subtype = new_subtype;
- SetWindowDirty(WC_VEHICLE_DETAILS, v->index);
- SetWindowDirty(WC_VEHICLE_DEPOT, v->tile);
- InvalidateWindowClassesData(WC_TRAINS_LIST, 0);
- }
- } while ((v = v->Next()) != NULL && !only_this);
-
- _returned_refit_capacity = num;
+ CommandCost cost = RefitVehicle(v, only_this, new_cid, new_subtype, flags);
/* Update the train's cached variables */
if (flags & DC_EXEC) {
- TrainConsistChanged(Train::Get(p1)->First(), false);
+ Train *front = v->First();
+ TrainConsistChanged(front, false);
+ SetWindowDirty(WC_VEHICLE_DETAILS, front->index);
+ SetWindowDirty(WC_VEHICLE_DEPOT, front->tile);
+ InvalidateWindowClassesData(WC_TRAINS_LIST, 0);
} else {
v->InvalidateNewGRFCacheOfChain(); // always invalidate; querycost might have filled it
}