From 359fe89d2f7d413d560b4f1e8ee5ec81fbef44ca Mon Sep 17 00:00:00 2001 From: Jonathan G Rennison Date: Sun, 9 Apr 2023 23:34:29 +0100 Subject: [PATCH] Don't use occupancy of unload and leave empty orders for occupancy average --- src/order_base.h | 2 ++ src/order_cmd.cpp | 13 +++++++++++++ src/order_gui.cpp | 8 +++++++- src/vehicle.cpp | 5 +++-- 4 files changed, 25 insertions(+), 3 deletions(-) diff --git a/src/order_base.h b/src/order_base.h index 1311d8edbc..f633bfa8d3 100644 --- a/src/order_base.h +++ b/src/order_base.h @@ -563,6 +563,8 @@ public: */ inline void SetOccupancy(uint8 occupancy) { this->occupancy = occupancy; } + bool UseOccupancyValueForAverage() const; + bool ShouldStopAtStation(StationID last_station_visited, StationID station, bool waypoint) const; bool ShouldStopAtStation(const Vehicle *v, StationID station, bool waypoint) const; bool CanLeaveWithCargo(bool has_cargo, CargoID cargo) const; diff --git a/src/order_cmd.cpp b/src/order_cmd.cpp index 1824b33b41..a981ce6b5d 100644 --- a/src/order_cmd.cpp +++ b/src/order_cmd.cpp @@ -3556,6 +3556,19 @@ bool ProcessOrders(Vehicle *v) return UpdateOrderDest(v, order) && may_reverse; } +bool Order::UseOccupancyValueForAverage() const +{ + if (this->GetOccupancy() == 0) return false; + if (this->GetOccupancy() > 1) return true; + + if (this->IsType(OT_GOTO_STATION)) { + OrderUnloadFlags unload_type = this->GetUnloadType(); + if ((unload_type == OUFB_TRANSFER || unload_type == OUFB_UNLOAD) && this->GetLoadType() == OLFB_NO_LOAD) return false; + } + + return true; +} + /** * Check whether the given vehicle should stop at the given station * based on this order and the non-stop settings. diff --git a/src/order_gui.cpp b/src/order_gui.cpp index d19ff910f4..8ee97ea28d 100644 --- a/src/order_gui.cpp +++ b/src/order_gui.cpp @@ -2381,7 +2381,13 @@ public: uint8 occupancy = order->GetOccupancy(); if (occupancy > 0) { SetDParam(0, occupancy - 1); - DrawString(ir.left, ir.right, y, STR_ORDERS_OCCUPANCY_PERCENT, (i == this->selected_order) ? TC_WHITE : TC_BLACK); + TextColour colour; + if (order->UseOccupancyValueForAverage()) { + colour = (i == this->selected_order) ? TC_WHITE : TC_BLACK; + } else { + colour = ((i == this->selected_order) ? TC_SILVER : TC_GREY) | TC_NO_SHADE; + } + DrawString(ir.left, ir.right, y, STR_ORDERS_OCCUPANCY_PERCENT, colour); } y += line_height; diff --git a/src/vehicle.cpp b/src/vehicle.cpp index cff0a262ad..796a336f46 100644 --- a/src/vehicle.cpp +++ b/src/vehicle.cpp @@ -3503,8 +3503,9 @@ void Vehicle::RecalculateOrderOccupancyAverage() uint total = 0; uint order_count = this->GetNumOrders(); for (uint i = 0; i < order_count; i++) { - uint occupancy = this->GetOrder(i)->GetOccupancy(); - if (occupancy > 0) { + const Order *order = this->GetOrder(i); + uint occupancy = order->GetOccupancy(); + if (occupancy > 0 && order->UseOccupancyValueForAverage()) { num_valid++; total += (occupancy - 1); }