Index: vehicle_gui.c =================================================================== --- vehicle_gui.c (revision 3419) +++ vehicle_gui.c (working copy) @@ -41,6 +41,10 @@ static VehicleSortListingTypeFunction VehicleCargoSorter; static VehicleSortListingTypeFunction VehicleReliabilitySorter; static VehicleSortListingTypeFunction VehicleMaxSpeedSorter; +static VehicleSortListingTypeFunction VehicleModelSorter; +static VehicleSortListingTypeFunction VehicleValueSorter; +static VehicleSortListingTypeFunction VehicleFirstOrderSorter; +static VehicleSortListingTypeFunction VehicleLastOrderSorter; static VehicleSortListingTypeFunction* const _vehicle_sorter[] = { &VehicleUnsortedSorter, @@ -51,7 +55,11 @@ &VehicleProfitLastYearSorter, &VehicleCargoSorter, &VehicleReliabilitySorter, - &VehicleMaxSpeedSorter + &VehicleMaxSpeedSorter, + &VehicleModelSorter, + &VehicleValueSorter, + &VehicleFirstOrderSorter, + &VehicleLastOrderSorter, }; const StringID _vehicle_sort_listing[] = { @@ -64,6 +72,10 @@ STR_SORT_BY_TOTAL_CAPACITY_PER_CARGOTYPE, STR_SORT_BY_RELIABILITY, STR_SORT_BY_MAX_SPEED, + STR_SORT_BY_MODEL, + STR_SORT_BY_VALUE, + STR_SORT_BY_FIRST_ORDER, + STR_SORT_BY_LAST_ORDER, INVALID_STRING_ID }; @@ -403,6 +415,84 @@ return (_internal_sort_order & 1) ? -r : r; } +static int CDECL VehicleModelSorter(const void *a, const void *b) +{ + const Vehicle *va = GetVehicle((*(const SortStruct*)a).index); + const Vehicle *vb = GetVehicle((*(const SortStruct*)b).index); + int r = va->engine_type - vb->engine_type; + + VEHICLEUNITNUMBERSORTER(r, va, vb); + + return (_internal_sort_order & 1) ? -r : r; +} + +static int CDECL VehicleValueSorter(const void *a, const void *b) +{ + const Vehicle *va = GetVehicle((*(const SortStruct*)a).index); + const Vehicle *vb = GetVehicle((*(const SortStruct*)b).index); + int r; + + if (va->type == VEH_Train && vb->type == VEH_Train) { //we're comparing trains + int valuea; + int valueb; + do valuea += va->value; while ( (va=va->next) != NULL); //go through all wagons + do valueb += vb->value; while ( (vb=vb->next) != NULL); //and count their values + r = valuea - valueb; + } else { //road vehicles, airplanes or ships + r = va->value - vb->value; + } + + VEHICLEUNITNUMBERSORTER(r, va, vb); + + return (_internal_sort_order & 1) ? -r : r; +} + +static int CDECL VehicleFirstOrderSorter(const void *a, const void *b) +{ + const Vehicle *va = GetVehicle((*(const SortStruct*)a).index); + const Vehicle *vb = GetVehicle((*(const SortStruct*)b).index); + int r; + Station *sta; + Station *stb; + + if (va->num_orders > 1 && vb->num_orders > 1) { + sta = GetStation(va->orders->station); + stb = GetStation(vb->orders->station); + r = sta->index - stb->index; + } else if (va->num_orders <= 1 && vb->num_orders > 1) { + r = 1; + } else { + r = -1; + } + + VEHICLEUNITNUMBERSORTER(r, va, vb); + + return (_internal_sort_order & 1) ? -r : r; +} + +static int CDECL VehicleLastOrderSorter(const void *a, const void *b) +{ + const Vehicle *va = GetVehicle((*(const SortStruct*)a).index); + const Vehicle *vb = GetVehicle((*(const SortStruct*)b).index); + int r; + Station *sta; + Station *stb; + + if (va->num_orders > 1 && vb->num_orders > 1) { + sta = GetStation(GetLastVehicleOrder(va)->station); + stb = GetStation(GetLastVehicleOrder(vb)->station); + r = sta->index - stb->index; + } else if (va->num_orders <= 1 && vb->num_orders > 1) { + r = 1; + } else { + r = -1; + } + + VEHICLEUNITNUMBERSORTER(r, va, vb); + + return (_internal_sort_order & 1) ? -r : r; +} + // this define is to match engine.c, but engine.c keeps it to itself // ENGINE_AVAILABLE is used in ReplaceVehicleWndProc #define ENGINE_AVAILABLE ((e->flags & 1 && HASBIT(info->climates, _opt.landscape)) || HASBIT(e->player_avail, _local_player)) Index: lang/english.txt =================================================================== --- lang/english.txt (revision 3419) +++ lang/english.txt (working copy) @@ -345,6 +345,10 @@ STR_SORT_BY_RELIABILITY :Reliability STR_SORT_BY_TOTAL_CAPACITY_PER_CARGOTYPE :Total capacity per cargo type STR_SORT_BY_MAX_SPEED :Maximum speed +STR_SORT_BY_MODEL :Model +STR_SORT_BY_VALUE :Value +STR_SORT_BY_FIRST_ORDER :First order +STR_SORT_BY_LAST_ORDER :Last order ############ range for months starts STR_0162_JAN :Jan