Merge branch 'order_occupancy-sx' into jgrpp
This commit is contained in:
@@ -297,6 +297,7 @@ STR_SORT_BY_VALUE :Value
|
|||||||
STR_SORT_BY_LENGTH :Length
|
STR_SORT_BY_LENGTH :Length
|
||||||
STR_SORT_BY_LIFE_TIME :Remaining lifetime
|
STR_SORT_BY_LIFE_TIME :Remaining lifetime
|
||||||
STR_SORT_BY_TIMETABLE_DELAY :Timetable delay
|
STR_SORT_BY_TIMETABLE_DELAY :Timetable delay
|
||||||
|
STR_SORT_BY_AVG_ORDER_OCCUPANCY :Average order occupancy
|
||||||
STR_SORT_BY_FACILITY :Station type
|
STR_SORT_BY_FACILITY :Station type
|
||||||
STR_SORT_BY_WAITING_TOTAL :Total waiting cargo
|
STR_SORT_BY_WAITING_TOTAL :Total waiting cargo
|
||||||
STR_SORT_BY_WAITING_AVAILABLE :Available waiting cargo
|
STR_SORT_BY_WAITING_AVAILABLE :Available waiting cargo
|
||||||
@@ -4314,9 +4315,9 @@ STR_ORDERS_GO_TO_TOOLTIP :{BLACK}Insert a
|
|||||||
|
|
||||||
STR_ORDERS_VEH_WITH_SHARED_ORDERS_LIST_TOOLTIP :{BLACK}Show all vehicles that share this schedule
|
STR_ORDERS_VEH_WITH_SHARED_ORDERS_LIST_TOOLTIP :{BLACK}Show all vehicles that share this schedule
|
||||||
|
|
||||||
STR_ORDERS_OCCUPANCY_BUTTON :{BLACK}%
|
STR_ORDERS_OCCUPANCY_BUTTON :{BLACK}{STRING2}%
|
||||||
STR_ORDERS_OCCUPANCY_BUTTON_TOOLTIP :{BLACK}Show occupancy running averages
|
STR_ORDERS_OCCUPANCY_BUTTON_TOOLTIP :{BLACK}Show occupancy running averages{}The percentage shown is the overall average of the order occupancies
|
||||||
STR_ORDERS_OCCUPANCY_LIST_TOOLTIP :{BLACK}Order occupancy - this shows runnings averages of recent occupancy levels when leaving a station, for all vehicles sharing these orders
|
STR_ORDERS_OCCUPANCY_LIST_TOOLTIP :{BLACK}Order occupancy - this shows running averages of recent occupancy levels when leaving a station, for all vehicles sharing these orders
|
||||||
STR_ORDERS_OCCUPANCY_PERCENT :{NUM}%
|
STR_ORDERS_OCCUPANCY_PERCENT :{NUM}%
|
||||||
|
|
||||||
# String parts to build the order string
|
# String parts to build the order string
|
||||||
|
@@ -943,6 +943,11 @@ public:
|
|||||||
*size = maxdim(*size, d);
|
*size = maxdim(*size, d);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
case WID_O_OCCUPANCY_TOGGLE:
|
||||||
|
SetDParamMaxValue(0, 100);
|
||||||
|
size->width = WD_FRAMERECT_LEFT + GetStringBoundingBox(STR_ORDERS_OCCUPANCY_PERCENT).width + 10 + WD_FRAMERECT_RIGHT;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -1331,6 +1336,17 @@ public:
|
|||||||
case WID_O_CAPTION:
|
case WID_O_CAPTION:
|
||||||
SetDParam(0, this->vehicle->index);
|
SetDParam(0, this->vehicle->index);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case WID_O_OCCUPANCY_TOGGLE:
|
||||||
|
const_cast<Vehicle *>(this->vehicle)->RecalculateOrderOccupancyAverage();
|
||||||
|
if (this->vehicle->order_occupancy_average >= 16) {
|
||||||
|
SetDParam(0, STR_JUST_INT);
|
||||||
|
SetDParam(1, this->vehicle->order_occupancy_average - 16);
|
||||||
|
} else {
|
||||||
|
SetDParam(0, STR_EMPTY);
|
||||||
|
SetDParam(1, 0);
|
||||||
|
}
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1821,7 +1837,7 @@ static const NWidgetPart _nested_orders_train_widgets[] = {
|
|||||||
EndContainer(),
|
EndContainer(),
|
||||||
EndContainer(),
|
EndContainer(),
|
||||||
EndContainer(),
|
EndContainer(),
|
||||||
NWidget(WWT_TEXTBTN, COLOUR_GREY, WID_O_OCCUPANCY_TOGGLE), SetMinimalSize(12, 12), SetDataTip(STR_ORDERS_OCCUPANCY_BUTTON, STR_ORDERS_OCCUPANCY_BUTTON_TOOLTIP),
|
NWidget(WWT_TEXTBTN, COLOUR_GREY, WID_O_OCCUPANCY_TOGGLE), SetMinimalSize(36, 12), SetDataTip(STR_ORDERS_OCCUPANCY_BUTTON, STR_ORDERS_OCCUPANCY_BUTTON_TOOLTIP),
|
||||||
NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, WID_O_SHARED_ORDER_LIST), SetMinimalSize(12, 12), SetDataTip(SPR_SHARED_ORDERS_ICON, STR_ORDERS_VEH_WITH_SHARED_ORDERS_LIST_TOOLTIP),
|
NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, WID_O_SHARED_ORDER_LIST), SetMinimalSize(12, 12), SetDataTip(SPR_SHARED_ORDERS_ICON, STR_ORDERS_VEH_WITH_SHARED_ORDERS_LIST_TOOLTIP),
|
||||||
EndContainer(),
|
EndContainer(),
|
||||||
|
|
||||||
@@ -1905,7 +1921,7 @@ static const NWidgetPart _nested_orders_widgets[] = {
|
|||||||
EndContainer(),
|
EndContainer(),
|
||||||
EndContainer(),
|
EndContainer(),
|
||||||
|
|
||||||
NWidget(WWT_TEXTBTN, COLOUR_GREY, WID_O_OCCUPANCY_TOGGLE), SetMinimalSize(12, 12), SetDataTip(STR_ORDERS_OCCUPANCY_BUTTON, STR_ORDERS_OCCUPANCY_BUTTON_TOOLTIP),
|
NWidget(WWT_TEXTBTN, COLOUR_GREY, WID_O_OCCUPANCY_TOGGLE), SetMinimalSize(36, 12), SetDataTip(STR_ORDERS_OCCUPANCY_BUTTON, STR_ORDERS_OCCUPANCY_BUTTON_TOOLTIP),
|
||||||
NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, WID_O_SHARED_ORDER_LIST), SetMinimalSize(12, 12), SetDataTip(SPR_SHARED_ORDERS_ICON, STR_ORDERS_VEH_WITH_SHARED_ORDERS_LIST_TOOLTIP),
|
NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, WID_O_SHARED_ORDER_LIST), SetMinimalSize(12, 12), SetDataTip(SPR_SHARED_ORDERS_ICON, STR_ORDERS_VEH_WITH_SHARED_ORDERS_LIST_TOOLTIP),
|
||||||
EndContainer(),
|
EndContainer(),
|
||||||
|
|
||||||
|
@@ -2476,6 +2476,7 @@ void Vehicle::LeaveStation()
|
|||||||
new_occupancy /= 100;
|
new_occupancy /= 100;
|
||||||
}
|
}
|
||||||
if (new_occupancy + 1 != old_occupancy) {
|
if (new_occupancy + 1 != old_occupancy) {
|
||||||
|
this->order_occupancy_average = 0;
|
||||||
real_current_order->SetOccupancy(static_cast<uint8>(new_occupancy + 1));
|
real_current_order->SetOccupancy(static_cast<uint8>(new_occupancy + 1));
|
||||||
for (const Vehicle *v = this->FirstShared(); v != NULL; v = v->NextShared()) {
|
for (const Vehicle *v = this->FirstShared(); v != NULL; v = v->NextShared()) {
|
||||||
SetWindowDirty(WC_VEHICLE_ORDERS, v->index);
|
SetWindowDirty(WC_VEHICLE_ORDERS, v->index);
|
||||||
@@ -2486,6 +2487,25 @@ void Vehicle::LeaveStation()
|
|||||||
this->MarkDirty();
|
this->MarkDirty();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Vehicle::RecalculateOrderOccupancyAverage()
|
||||||
|
{
|
||||||
|
uint num_valid = 0;
|
||||||
|
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) {
|
||||||
|
num_valid++;
|
||||||
|
total += (occupancy - 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (num_valid > 0) {
|
||||||
|
this->order_occupancy_average = 16 + ((total + (num_valid / 2)) / num_valid);
|
||||||
|
} else {
|
||||||
|
this->order_occupancy_average = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Reset all refit_cap in the consist to cargo_cap.
|
* Reset all refit_cap in the consist to cargo_cap.
|
||||||
*/
|
*/
|
||||||
|
@@ -278,6 +278,8 @@ public:
|
|||||||
byte running_ticks; ///< Number of ticks this vehicle was not stopped this day
|
byte running_ticks; ///< Number of ticks this vehicle was not stopped this day
|
||||||
|
|
||||||
byte vehstatus; ///< Status
|
byte vehstatus; ///< Status
|
||||||
|
|
||||||
|
uint8 order_occupancy_average; ///< NOSAVE: order occupancy average. 0 = invalid, 1 = n/a, 16-116 = 0-100%
|
||||||
Order current_order; ///< The current order (+ status, like: loading)
|
Order current_order; ///< The current order (+ status, like: loading)
|
||||||
|
|
||||||
union {
|
union {
|
||||||
@@ -704,6 +706,14 @@ public:
|
|||||||
return (this->orders.list == NULL) ? INVALID_STATION : this->orders.list->GetNextStoppingStation(this);
|
return (this->orders.list == NULL) ? INVALID_STATION : this->orders.list->GetNextStoppingStation(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void RecalculateOrderOccupancyAverage();
|
||||||
|
|
||||||
|
inline uint8 GetOrderOccupancyAverage() const
|
||||||
|
{
|
||||||
|
if (order_occupancy_average == 0) const_cast<Vehicle *>(this)->RecalculateOrderOccupancyAverage();
|
||||||
|
return this->order_occupancy_average;
|
||||||
|
}
|
||||||
|
|
||||||
void ResetRefitCaps();
|
void ResetRefitCaps();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@@ -60,6 +60,7 @@ static GUIVehicleList::SortFunction VehicleValueSorter;
|
|||||||
static GUIVehicleList::SortFunction VehicleLengthSorter;
|
static GUIVehicleList::SortFunction VehicleLengthSorter;
|
||||||
static GUIVehicleList::SortFunction VehicleTimeToLiveSorter;
|
static GUIVehicleList::SortFunction VehicleTimeToLiveSorter;
|
||||||
static GUIVehicleList::SortFunction VehicleTimetableDelaySorter;
|
static GUIVehicleList::SortFunction VehicleTimetableDelaySorter;
|
||||||
|
static GUIVehicleList::SortFunction VehicleAverageOrderOccupancySorter;
|
||||||
|
|
||||||
GUIVehicleList::SortFunction * const BaseVehicleListWindow::vehicle_sorter_funcs[] = {
|
GUIVehicleList::SortFunction * const BaseVehicleListWindow::vehicle_sorter_funcs[] = {
|
||||||
&VehicleNumberSorter,
|
&VehicleNumberSorter,
|
||||||
@@ -76,6 +77,7 @@ GUIVehicleList::SortFunction * const BaseVehicleListWindow::vehicle_sorter_funcs
|
|||||||
&VehicleLengthSorter,
|
&VehicleLengthSorter,
|
||||||
&VehicleTimeToLiveSorter,
|
&VehicleTimeToLiveSorter,
|
||||||
&VehicleTimetableDelaySorter,
|
&VehicleTimetableDelaySorter,
|
||||||
|
&VehicleAverageOrderOccupancySorter,
|
||||||
};
|
};
|
||||||
|
|
||||||
const StringID BaseVehicleListWindow::vehicle_sorter_names[] = {
|
const StringID BaseVehicleListWindow::vehicle_sorter_names[] = {
|
||||||
@@ -93,6 +95,7 @@ const StringID BaseVehicleListWindow::vehicle_sorter_names[] = {
|
|||||||
STR_SORT_BY_LENGTH,
|
STR_SORT_BY_LENGTH,
|
||||||
STR_SORT_BY_LIFE_TIME,
|
STR_SORT_BY_LIFE_TIME,
|
||||||
STR_SORT_BY_TIMETABLE_DELAY,
|
STR_SORT_BY_TIMETABLE_DELAY,
|
||||||
|
STR_SORT_BY_AVG_ORDER_OCCUPANCY,
|
||||||
INVALID_STRING_ID
|
INVALID_STRING_ID
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -1269,6 +1272,13 @@ static int CDECL VehicleTimetableDelaySorter(const Vehicle * const *a, const Veh
|
|||||||
return (r != 0) ? r : VehicleNumberSorter(a, b);
|
return (r != 0) ? r : VehicleNumberSorter(a, b);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Sort vehicles by the average order occupancy */
|
||||||
|
static int CDECL VehicleAverageOrderOccupancySorter(const Vehicle * const *a, const Vehicle * const *b)
|
||||||
|
{
|
||||||
|
int r = (*a)->GetOrderOccupancyAverage() - (*b)->GetOrderOccupancyAverage();
|
||||||
|
return (r != 0) ? r : VehicleNumberSorter(a, b);
|
||||||
|
}
|
||||||
|
|
||||||
void InitializeGUI()
|
void InitializeGUI()
|
||||||
{
|
{
|
||||||
MemSetT(&_sorting, 0);
|
MemSetT(&_sorting, 0);
|
||||||
|
Reference in New Issue
Block a user