(svn r6418) -Fix: [autoreplace] now multiheaded engines and other locomotives consisting of more than one unit will only be counted once
authorbjarni
Thu, 07 Sep 2006 15:00:47 +0000
changeset 4569 0ec04a037a37
parent 4568 8bec79c4d8ad
child 4570 61a551bc82ef
(svn r6418) -Fix: [autoreplace] now multiheaded engines and other locomotives consisting of more than one unit will only be counted once
This also cleaned up the counting loop alot and it will also (hopefully) be faster (didn't benchmark it)
vehicle_gui.c
--- a/vehicle_gui.c	Thu Sep 07 06:38:37 2006 +0000
+++ b/vehicle_gui.c	Thu Sep 07 15:00:47 2006 +0000
@@ -773,19 +773,20 @@
 				{
 					uint i;
 					const Vehicle *vehicle;
+					/* compiler optimisation tend to prefer to keep local variables in the registers instead of global ones,
+					 * so we cache often used and unchanging variables in local variables to increase the loop speed */
+					const byte vehicle_type = w->window_number;
+					const PlayerID player = _local_player;
 
 					for (i = 0; i < lengthof(_player_num_engines); i++) {
 						_player_num_engines[i] = 0;
 					}
 					FOR_ALL_VEHICLES(vehicle) {
-						if (vehicle->owner == _local_player) {
-							if (vehicle->type == VEH_Aircraft && vehicle->subtype > 2) continue;
-
-							// do not count the vehicles, that contains only 0 in all var
-							if (vehicle->engine_type == 0 && vehicle->spritenum == 0) continue;
-
-							if (vehicle->type != GetEngine(vehicle->engine_type)->type) continue;
-
+						if (vehicle->owner == player && vehicle->type == vehicle_type) {
+							if (vehicle_type == VEH_Aircraft && vehicle->subtype > 2) continue; // plane shadows and helicopter rotors
+							if (vehicle_type == VEH_Train && (
+								IsArticulatedPart(vehicle) || // tenders and other articulated parts
+								(IsMultiheaded(vehicle) && !IsTrainEngine(vehicle)))) continue; // rear parts of multiheaded engines
 							_player_num_engines[vehicle->engine_type]++;
 						}
 					}