"Przerabianie hamulcow" jest kompletna strata czasu bo przy kazdym objeciu skladu AI i tak to sobie ustawia po swojemu. Uzywajac tych samych regul ktore tutaj opisales.
    // autorewident: nastawianie hamulców w składzie
    int r = 0, g = 0, p = 0; // ilości wagonów poszczególnych typów
    TDynamicObject *d = pVehicles[0]; // pojazd na czele składu
    // 1. Zebranie informacji o składzie pociągu — przejście wzdłuż składu i odczyt parametrów:
    //   · ilość wagonów -> są zliczane, wszystkich pojazdów jest (iVehicles)
    //   · długość (jako suma) -> jest w (fLength)
    //   · masa (jako suma) -> jest w (fMass)
    while (d)
    { // klasyfikacja pojazdów wg BrakeDelays i mocy (licznik)
        if (d->MoverParameters->Power < 1) // - lokomotywa - Power>1 - ale może być nieczynna na końcu...
            if (TestFlag(d->MoverParameters->BrakeDelays, bdelay_R))
                ++r; // - wagon pospieszny - jest R
            else if (TestFlag(d->MoverParameters->BrakeDelays, bdelay_G))
                ++g; // - wagon towarowy - jest G (nie ma R)
            else
                ++p; // - wagon osobowy - reszta (bez G i bez R)
        d = d->Next(); // kolejny pojazd, podłączony od tyłu (licząc od czoła)
    }
    // 2. Określenie typu pociągu i nastawy:
    int ustaw; //+16 dla pasażerskiego
    if (r + g + p == 0)
        ustaw = 16 + bdelay_R; // lokomotywa luzem (może być wieloczłonowa)
    else
    { // jeśli są wagony
        ustaw = (g < std::min(4, r + p) ? 16 : 0);
        if (ustaw) // jeśli towarowe < Min(4, pospieszne+osobowe)
        { // to skład pasażerski - nastawianie pasażerskiego
            ustaw += (g && (r < g + p)) ? bdelay_P : bdelay_R;
            // jeżeli towarowe>0 oraz pospiesze<=towarowe+osobowe to P (0)
            // inaczej R (2)
        }
        else
        { // inaczej towarowy - nastawianie towarowego
            if ((fLength < 300.0) && (fMass < 600000.0)) //[kg]
                ustaw |= bdelay_P; // jeżeli długość<300 oraz masa<600 to P (0)
            else if ((fLength < 500.0) && (fMass < 1300000.0))
                ustaw |= bdelay_R; // jeżeli długość<500 oraz masa<1300 to GP (2)
            else
                ustaw |= bdelay_G; // inaczej G (1)
        }
        // zasadniczo na sieci PKP kilka lat temu na P/GP jeździły tylko kontenerowce o
        // rozkładowej 90 km/h. Pozostałe jeździły 70 km/h i były nastawione na G.
    }
    d = pVehicles[0]; // pojazd na czele składu
    p = 0; // będziemy tu liczyć wagony od lokomotywy dla nastawy GP
    while (d)
    { // 3. Nastawianie
        if( ( true == AIControllFlag )
         || ( d != pVehicle ) ) {
            // don't touch human-controlled vehicle, but others are free game
            switch( ustaw ) {
                case bdelay_P: {
                    // towarowy P - lokomotywa na G, reszta na P.
                    d->MoverParameters->BrakeDelaySwitch(
                        d->MoverParameters->Power > 1 ?
                            bdelay_G :
                            bdelay_P );
                    break;
                }
                case bdelay_G: {
                    // towarowy G - wszystko na G, jeśli nie ma to P (powinno się wyłączyć hamulec)
                    d->MoverParameters->BrakeDelaySwitch(
                        TestFlag( d->MoverParameters->BrakeDelays, bdelay_G ) ?
                            bdelay_G :
                            bdelay_P );
                    break;
                }
                case bdelay_R: {
                    // towarowy GP - lokomotywa oraz 5 pierwszych pojazdów przy niej na G, reszta na P
                    if( d->MoverParameters->Power > 1 ) {
                        d->MoverParameters->BrakeDelaySwitch( bdelay_G );
                        p = 0; // a jak będzie druga w środku?
                    }
                    else {
                        d->MoverParameters->BrakeDelaySwitch(
                            ++p <= 5 ?
                                bdelay_G :
                                bdelay_P );
                    }
                    break;
                }
                case 16 + bdelay_R: {
                    // pasażerski R - na R, jeśli nie ma to P
                    d->MoverParameters->BrakeDelaySwitch(
                        TestFlag( d->MoverParameters->BrakeDelays, bdelay_R ) ?
                            bdelay_R :
                            bdelay_P );
                    break;
                }
                case 16 + bdelay_P: {
                    // pasażerski P - wszystko na P
                    d->MoverParameters->BrakeDelaySwitch( bdelay_P );
                    break;
                }
            }
        }
        d = d->Next(); // kolejny pojazd, podłączony od tyłu (licząc od czoła)
    }
(gwoli wyjasnienia, klasyfikacja nastepuje na podstawie ustawienia w lokomotywie, a ta ustawiana jest na G w przypadku skladu towarowego nawet gdy czesc wagonow dostaje inne ustawienie)