# HG changeset patch # User Jonathan G Rennison # Date 2023-09-06 19:36:26 # Node ID 50ab1fbf7b72b3c2be16f7530128e16345342e48 # Parent 34707980338440f6b74465550218787ca41ee0a5 Fix: Inaccurate waiting cargo total in station window when using cargodist (#11213) For stations with many flows and/or small cargo packets, due to accumulated inaccuracies in DivideApprox. The displayed total should match GoodsEntry::TotalCount(). diff --git a/src/station_gui.cpp b/src/station_gui.cpp --- a/src/station_gui.cpp +++ b/src/station_gui.cpp @@ -1603,9 +1603,23 @@ struct StationViewWindow : public Window continue; } - for (CargoDataSet::iterator dest_it = via_entry->Begin(); dest_it != via_entry->End(); ++dest_it) { + uint remaining = cp->Count(); + for (CargoDataSet::iterator dest_it = via_entry->Begin(); dest_it != via_entry->End();) { CargoDataEntry *dest_entry = *dest_it; - uint val = DivideApprox(cp->Count() * dest_entry->GetCount(), via_entry->GetCount()); + + /* Advance iterator here instead of in the for statement to test whether this is the last entry */ + ++dest_it; + + uint val; + if (dest_it == via_entry->End()) { + /* Allocate all remaining waiting cargo to the last destination to avoid + * waiting cargo being "lost", and the displayed total waiting cargo + * not matching GoodsEntry::TotalCount() */ + val = remaining; + } else { + val = std::min(remaining, DivideApprox(cp->Count() * dest_entry->GetCount(), via_entry->GetCount())); + remaining -= val; + } this->ShowCargo(cargo, i, cp->SourceStation(), next, dest_entry->GetStation(), val); } }