Symulator EU07 (i nie tylko) > Symulator

 Inc dla sterowania AI na przystankach.

(1/3) > >>

Mariusz1970:
Tak sobie pomyślałem, że warto.
Ponieważ często zachodzi potrzeba sterownia AI na przystankach, gdzie nie ma semafora, a chcemy uzyskać efekt zatrzymania się AI na przystanku, a następnie ruszenia, zmodyfikowałem inc od semafora, tak aby sterowało się jak z semaforem np. AI ma zatrzymać się na przystanku na kilkanście sekund i następnie ma ruszyć. Obiekt jest niewidoczny (żadnych tekstur czy poly), nie posiada współrzędnych. To są jedynie eventy, które ułatwiają sterownie AI na przystankach.
Oto zawartość:

--- Kod: ---// sterowanie AI na przystankach bez semaforow, a steruje sie tak samo jak z semaforem
//(p1)- nazwa, (p2)-opoznienie dla eventu zatrzym_rusz


// PODSTAWOWE ZDARZENIA:

//odczyt z pamieci (zdarzenie przypisane do toru przy ktorym stoi semafor):
event (p1)_sem_info getvalues 1.0 (p1)_sem_mem endevent

//stany :

event (p1)_s1 multiple 0 none (p1)_sem_info_stop endevent

event (p1)_s2 multiple 0 none (p1)_sem_info_vmax (p1)_sem_distinfo_vmax endevent

event (p1)_s3 multiple 0 none (p1)_sem_info_vmax (p1)_sem_distinfo_v100 endevent

event (p1)_s4 multiple 0 none (p1)_sem_info_vmax (p1)_sem_distinfo_v40  endevent

event (p1)_s5 multiple 0 none (p1)_sem_info_vmax (p1)_sem_distinfo_stop endevent

event (p1)_s10 multiple 0 none (p1)_sem_info_v40 (p1)_sem_distinfo_vmax endevent

event (p1)_s11 multiple 0 none (p1)_sem_info_v40 (p1)_sem_distinfo_v100 endevent

event (p1)_s12 multiple 0 none (p1)_sem_info_v40 (p1)_sem_distinfo_v40 endevent

event (p1)_s13 multiple 0 none (p1)_sem_info_v40 (p1)_sem_distinfo_stop endevent

event (p1)_ms2 multiple 0 none (p1)_sem_info_shunt2 endevent

event (p1)_sz1 multiple 0 none (p1)_sem_info_v20 endevent
event (p1)_zatrzym_rusz multiple (p2) none (p1)_s2 endevent

//powyzsze zdarzenia skladaja sie z:


//memcell do pamietania predkosci:
node -1 0 (p1)_sem_mem memcell * * * SetVelocity 0.0 0.0 none endmemcell

//zdarzenia wpisujace w memcell predkosci przy tym (info) i przy nastepnym (distinfo) semaforze:
event (p1)_sem_info_stop updatevalues 10.0 (p1)_sem_mem SetVelocity 0.0 0.0 endevent
event (p1)_sem_distinfo_stop updatevalues 1.0 (p1)_sem_mem SetVelocity * 0.0 endevent
event (p1)_sem_info_vmax updatevalues 1.0 (p1)_sem_mem SetVelocity -1 * endevent
event (p1)_sem_distinfo_vmax updatevalues 0.0 (p1)_sem_mem SetVelocity * -1 endevent
event (p1)_sem_distinfo_v100 updatevalues 1.0 (p1)_sem_mem SetVelocity * 100 endevent
event (p1)_sem_info_v40 updatevalues 1.0 (p1)_sem_mem SetVelocity 40 * endevent
event (p1)_sem_distinfo_v40 updatevalues 0.0 (p1)_sem_mem SetVelocity * 40 endevent
event (p1)_sem_info_v20 updatevalues 1.0 (p1)_sem_mem SetVelocity 20 0 endevent
// dziala tylko na pojazdy w trybie manewrowym:
event (p1)_sem_info_shunt2 updatevalues 1.0 (p1)_sem_mem ShuntVelocity 40 0 endevent

--- Koniec kodu ---
Zawartość należy zapisać jako plik AISEM.inc i umieścić w katalogu scenery.
wpis include do scn:

--- Kod: ---include;aisem.inc;[name];[x];end

--- Koniec kodu ---

name- nazwa obiektu
x-opóźnienie w sekundach patrz pkt. 3a

Sterowanie AI tak samo jak w przypadku semafora, czyli dopuszczalne są sygnały:
s1,s2,s3,s4,s5,s10,s11,s12,s13,ms2,sz1,zatrzym_rusz - nowość

Przykład:
Mamy w scn 5 przystanków i chcemy, aby AI zatrzymywał się na tych przystankach, następnie ruszał.
1)W scn includujemy:

--- Kod: ---include;aisem.inc;przystanek1;60;end
include;aisem.inc;przystanek2;90;end
include;aisem.inc;przystanek3;30;end
include;aisem.inc;przystanek4;40;end
include;aisem.inc;przystanek5;0;end

--- Koniec kodu ---

2)Przed każdym przystankiem dajemy eventy przypisane do toru:

--- Kod: ---event1 przystanek1_sem_info
event1 przystanek2_sem_info
event1 przystanek3_sem_info
event1 przystanek4_sem_info
event1 przystanek5_sem_info

--- Koniec kodu ---
W zależności od kierunku wjazdu pociągu zamiast event1 dajemy event2

Teraz alternatywy:
3)
a)Przed torem, gdzie wpisaliśmy event sem_info - dajemy eventy:

--- Kod: ---event1 przystanek1_zatrzym_rusz
event1 przystanek2_zatrzym_rusz
event1 przystanek3_zatrzym_rusz
event1 przystanek4_zatrzym_rusz
event1 przystanek5_zatrzym_rusz

--- Koniec kodu ---
W zależności od kierunku wjazdu pociągu zamiast event1 dajemy event2
Efekt: od momentu wjechania na tor, po ilości sekund jaką wpisaliśmy, AI automatycznie ruszy i będzie to oznaczało sygnał s2.

b)Przed torem, gdzie wpisaliśmy event sem_info - dajemy evnty, wyzwalane z opóźnieniem lub inne jakieś zależności np. mijanki i dajemy eventy:

--- Kod: ---przystanek1_s2
przystanek2_s2
przystanek3_s2
przystanek4_s2
przystanek5_s2

--- Koniec kodu ---

Uwaga: Domyślnie jest s1 dla AI na tym incu.

Mam nadzieję, iż to będzie pomocne dla trasopisarzy.

Rozi:
Dużo się napisałeś i na pewno się przyda. Tylko mam pytaniee dotyczące np. pośpiechów. Czy AI też się będzie zatrzymywał na wszystkich przystankach?

Mariusz1970:
I tak i nie:)
Wszystko zależy od eventów. Chcąc, aby coś się nie zatrzymywało na przystanku, wcześniej wprowadzamy event s2 i się nie zatrzymie.
To tak jakbyś mnie zapytał, czy przed semoforem jest różnica dla zatrzymania się pociągu: osobowego, pośpiesznego, ekspresu czy towarowego.
To jest poprostu niewidoczny semafor.

Ra:
Bardzo ciekawe rozwiązanie. A czy w4n.inc funkcjonuje źle? (W4 to taki biały krzyż na czarnym tle.) On używa funkcji sterowania AI PassengerStopPoint:... i powinno to być synchronizowane z rozkładem, żeby odjeżdżał o ustalonych godzinach (wiem, i tak nie ma zegarów na stacjach). Jakoś się jeszcze nie dokopałem do dokumentacji w tym zakresie.

Na liście Komendy dla AI komenda PassengerStopPoint: figuruje jako niepogrubiona, czyli chyba nie jest zaimplementowana. W kodzie EU07.EXE też nie ma takiego łańcucha. Czyli faktycznie, mamy W4, który nigdy nie działał. To może by to, co Mariusz proponujesz, włączyć w istniejące include W4n.inc? Tam jest definiowany event (p1)_stopinfo do wpisania w torze.

Przy okazji mam pytanie. Skąd AI wie, że zmienił się sygnał na semaforze? Rozumiem, że jak wjeżdża na tor, to wywołuje *_sem_info, który to przekazuje informację o ustawionej prędkości. Ale jak już stanie, to jak sprawdza, czy sygnał się zmienił?

Czyżby stojące AI wykonywało co jakiś czas *_sem_info na okolicznych torach (tym z przodu i tym z tyłu?

hunter:
Mariusz, trochę namotałeś ;-)
Po pierwsze, w (p1)_zatrzym_rusz powinno jeszcze być (p1)_sem_info .
Po drugie, powinny eventy być przypisane tak:

event0 (tor z peronem) - (p1)_zatrzym_rusz
event1 (tor oddalony od peronu) - (p1)_sem_info (w zależności od rodzaju pociągu)
event2 (tor oddalony od peronu) - (p1)_sem_info (w zależności od rodzaju pociągu)

Po trzecie, sporo eventów w tym plików jest niepotrzebne. IMO powinny być tylko (p1)_sem_info, (p1)_s1, (p1)_s2, (p1)_zatrzym_rusz, (p1)_sem_mem, (p1)_sem_info_stop, (p1)_sem_distinfo_stop, (p1)_sem_info_vmax i (p1)_sem_distinfo_vmax .

Pozdrawiam.

Nawigacja

[0] Indeks wiadomości

[#] Następna strona

Idź do wersji pełnej
Powered by Advanced Topic Prefix Pro
Powered by SMFPacks Likes Pro Mod