# HG changeset patch # User bjarni # Date 2006-09-07 15:00:47 # Node ID e55502a629108f71c1c689b339d9deae9e6e2f6d # Parent a76319c63352e421e4841174609409c278c6e5a1 (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) diff --git a/vehicle_gui.c b/vehicle_gui.c --- a/vehicle_gui.c +++ b/vehicle_gui.c @@ -773,19 +773,20 @@ static void ReplaceVehicleWndProc(Window { 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]++; } }