(svn r1016) Make the cargo sorter not consider the number of wagons of a particular cargo type but the sum of their capacity.
authortron
Sat, 11 Dec 2004 11:00:54 +0000
changeset 594 1b51f81b4a77
parent 593 4240f624bca0
child 595 927120a39a1f
(svn r1016) Make the cargo sorter not consider the number of wagons of a particular cargo type but the sum of their capacity.
Also add the number sorter to sort by vehicle number if the cargo capacity is equal.
vehicle_gui.c
--- a/vehicle_gui.c	Sat Dec 11 10:17:10 2004 +0000
+++ b/vehicle_gui.c	Sat Dec 11 11:00:54 2004 +0000
@@ -246,24 +246,21 @@
 
 int CDECL VehicleCargoSorter(const void *a, const void *b)
 {
-	// FIXME - someone write a normal cargo sorter that also works by cargo_cap,
-	// FIXME - since I seem to be unable to do so :S
 	const Vehicle *va = DEREF_VEHICLE((*(const SortStruct*)a).index);
 	const Vehicle *vb = DEREF_VEHICLE((*(const SortStruct*)b).index);
+	const Vehicle *v;
 	int r = 0;
 	int i;
-	byte _cargo_counta[NUM_CARGO];
-	byte _cargo_countb[NUM_CARGO];
+	uint _cargo_counta[NUM_CARGO];
+	uint _cargo_countb[NUM_CARGO];
 	memset(_cargo_counta, 0, sizeof(_cargo_counta));
 	memset(_cargo_countb, 0, sizeof(_cargo_countb));
 
-	do {
-		_cargo_counta[va->cargo_type]++;
-	} while ( (va = va->next) != NULL);
+	for (v = va; v != NULL; v = v->next)
+		_cargo_counta[v->cargo_type] += v->cargo_cap;
 
-	do {
-		_cargo_countb[vb->cargo_type]++;
-	} while ( (vb = vb->next) != NULL);
+	for (v = vb; v != NULL; v = v->next)
+		_cargo_countb[v->cargo_type] += v->cargo_cap;
 
 	for (i = 0; i < NUM_CARGO; i++) {
 		r = _cargo_counta[i] - _cargo_countb[i];
@@ -271,6 +268,8 @@
 			break;
 	}
 
+	VEHICLEUNITNUMBERSORTER(r, va, vb);
+
 	return (_internal_sort_order & 1) ? -r : r;
 }