hmmmm, it's very complicated

):
void Lokomotywa::run(){
wysadzony = false;
unsigned int do_stacji = trasy[0]->get_Dystans();
long int indeks_trasy = 0;
bool mozna_do_przodu;
unsigned int przesuniecie;
bool powrot = false;
bool kierunek;
Stacja* s = kierunki[0] ? trasy[0]->get_Stacja_1() : trasy[0]->get_Stacja_2();
while(!s->zajmij_Semafor(this))
this->msleep(50);
while(!wysadzony){
kierunek = powrot ? !kierunki[indeks_trasy] : kierunki[indeks_trasy];
if(do_stacji==trasy[indeks_trasy]->get_Dystans()){
mozna_do_przodu = trasy[indeks_trasy]->rejestruj(this, kierunek);
if(mozna_do_przodu)
s->zwolnij_Semafor(this);
}
if(mozna_do_przodu){
unsigned int c_s = (speed-weigth/1000)/60;//jedna minuta
przesuniecie = trasy[indeks_trasy]->przesun_Semafor(this, kierunek, true, c_s);
do_stacji -= przesuniecie;
c_s -= przesuniecie;
trasy[indeks_trasy]->get_Stacja_1();
if(do_stacji==0&&c_s>0){//za jednym razem nie przeleci wiecej jak jedna trase
if(kierunek)
s = trasy[indeks_trasy]->get_Stacja_2();
else
s = trasy[indeks_trasy]->get_Stacja_1();
if(s->zajmij_Semafor(this)){
trasy[indeks_trasy]->usun_Semafor(this, kierunek, true);
if(!powrot&&++indeks_trasy==(long int)trasy.size()){
indeks_trasy = trasy.size()-1;
powrot = true;
}
if(powrot&&--indeks_trasy==(long int)-1){
indeks_trasy = 0;
powrot = false;
}
mozna_do_przodu = false;
do_stacji = trasy[indeks_trasy]->get_Dystans();
if(s->get_Name()!="")
this->msleep(200);
else
this->msleep(100);
}
else
this->msleep(50);
}
else
this->msleep(100);
}
else
this->msleep(50);
}
it' something like this...it's a simulation of a train, it checks does it can move forward, then it moves and sleeps, that's all(more or less)...