Strona główna
Witaj, nieznajomy!

Ścieżki RRR dla pojazdów

Pamiętacie misję Just Bussiness? Deweloperzy z Rockstara zastosowali tam ścieżki *.rrr do zrobienia efektownego pościgu i precyzyjnej jazdy. Każda ścieżka RRR składa się z serii informacji o parametrach pojazdu w każdej 1/10 sekundy jego ruchu. Zapisane parametry to m.in. pozycja pojazdu, jego obrót, prędkość itd.

W tym tutorialu przedstawię sposób wykorzystania ścieżek RRR w swoich skryptach.

Nagrywanie ścieżki

Każda ścieżka RRR do wykorzystania w grze znajduje się w archiwum carrec.img:
Kod:
[katalog z grą]/data/Paths/carrec.img


Do nagrania ścieżki można wykorzystać narzędzie w postaci skryptu CLEO:
- Nagrywarka ścieżek RRR

Ściągnięty skrypt wklejamy do katalogu CLEO. Teraz podczas gry wystarczy wcisnąć kombinację SHIFT+R, aby rozpocząć nagrywanie ścieżki. Należy pamiętać, że prędkość początkowa ruchu będzie równa prędkości, z jaką poruszamy się w momencie wciśnięcia kombinacji. Nagrywanie kończymy wciskając te same klawisze, SHIFT+R.

Nagrana ścieżka RRR zostanie zapisana do pliku carrec900.rrr:
Kod:
[katalog z grą]/data/Paths/carrec900.rrr


Teraz wystarczy umieścić wygenerowany plik w archiwum carrec.img przy pomocy np. IMG Toola.

W skrypcie potrzebny nam będzie identyfikator ścieżki, który jest zależny od nazwy pliku. Np.
  • carrec900.rrr - ID: 900
  • carrec921.rrr - ID: 921
  • carrec852.rrr - ID: 852


Wykorzystanie ścieżki

Przede wszystkim, należy załadować odpowiednią ścieżkę i sprawdzić, czy została załadowana przed jej użyciem. W przeciwnym razie gra może się wysypać.
0@ to tylko przykładowy samochód, wcześniej należy załadować jego model itd. Więcej o tych czynnościach w poprzednich tutorialach z naszej serii.

Kod:
00A5: 0@ = create_car #PONY at 0.0 0.0 0.0

07C0: load_path 900
while 
87C1:   not path 900 available
  wait 
0
end


Teraz mamy dwie opcje wstawienia pojazdu na ścieżkę:
  • ruch nie zapętlany - kiedy pojazd osiągnie ostatni punkt ścieżki, to po prostu się zatrzyma
  • Kod:
    05EB: assign_car 0@ to_path 900

  • ruch zapętlany - kiedy pojazd osiągnie ostatni punkt ścieżki, to zacznie ją pokonywać jeszcze raz od punktu początkowego
  • Kod:
    085E: assign_car 0@ to_looped_path 900


Możemy wypuścić pojazd ze ścieżki w dowolnym momencie. W poniższym przykładzie pojazd jest wypuszczany po dojechaniu do końca ścieżki:
Kod:
1@ = 1200.0 // Współrzędna X ostatniego punktu

2@ = 800.0 // Współrzędna Y ostatniego punktu


while 
true
  wait 
0
  if
    
01AD:   car 0@ sphere 0 near_point 1@ 2@ radius 1.0 1.0
  then
    
05EC: release_car 0@ from_path
    break
  end
end


To tyle, jeśli chodzi o podstawowe czynności. Po wykonaniu powyższego kodu, pojazd zacznie pokonywać wcześniej nagraną ścieżkę, a zakończy po dotarciu do jej końca.

Zatrzymanie pojazdu na ścieżce

Poniższy kod spowoduje zatrzymanie ("zamrożenie") pojazdu na ścieżce. Jeżeli pojazd będzie znajdować się w powietrzu w momencie użycia tego opcodu, to zostanie nad ziemią, nie spadnie. Po 5 sekundach wznawiamy ruch pojazdu.

Kod:
05ED: freeze_car 0@ while_on_path
wait 
5000
05EE: unfreeze_car 0@ while_on_path


Zmiana prędkości pojazdu

Z racji, że korzystamy z nagranej ścieżki, to nie możemy ustawić konkretnej prędkości dla całego ruchu lub dla jego momentu. Możemy natomiast zmienić prędkość pojazdu używając współczynnika. Bardziej szczegółowy opis znajduje się w naszej bazie opcodów

Kod:
06FD: set_car 0@ speed_on_path_to 2.0

Powyższy kod spowoduje, że pojazd będzie poruszał się 2 razy szybciej.

Dla zaawansowanych

(tradycyjnie dodane przez Silenta)

Wykorzystując kilka trików, możliwe jest by odpalić ścieżkę RRR bezpośrednio z pliku, bez potrzeby wrzucania go do jakiegokolwiek archiwum IMG. Na końcu kodu wystarczy dodać tę funkcję SCM, autorstwa Deji'ego (oryginalny post z trikiem znajduje się tutaj):

Kod:
:LoadCustomPathFromFile{\__(*pathData)__[hFile,_pathID]__}
0AA7: call_function 0x459FF0 num_params 1 pop 1 1@ 2@
0012: 2@ *= 0x10
000A: 2@ += 0x97D884
0A8D: 3@ = read_memory 2@ size 4 virtual_protect 0
if
    
8039:   not 3@ == 0
then
    
0A8E: 4@ = 2@ + 0xB
    0A8D: 5@ = read_memory 4@ size 1 virtual_protect 0
    if 
0039:   5@ == 1
    then 
0AC9: free_allocated_memory 3@
    else 
0873: release_path 1@
    end
    
0A8C: write_memory 2@ size 8 value 0 virtual_protect 0
end
0A9C: 4@ = file 0@ size
0AC8: 3@ = allocate_memory_size 4@
0AC7: 5@ = var 5@ offset
0A8F: 5@ = 3@ - 5@
0016: 5@ /= 4
0A9D: readfile 0@ size 4@ to 5@(5@,1i)
0A8C: write_memory 2@ size 4 value 3@ virtual_protect 0
0A8E: 5@ = 3@ + 0x20
while 
true
    0A8D: 6@ = read_memory 5@ size 4 virtual_protect 0
    8039:   not 6@ == 0
    jf 
break
    000A: 5@ += 0x20
end
0062: 5@ -= 3@
000A: 2@ += 0x4
0A8C: write_memory 2@ size 4 value 5@ virtual_protect 0
000A: 2@ += 0x7
0A8C: write_memory 2@ size 1 value 1 virtual_protect 0
0AB2: ret 1 3@


Następnie, w skrypcie SCM, wystarczy wywołać funkcję

Kod:
0AB1: call_scm_func @LoadCustomPathFromFile num_params 2 file 0@ pathID 899 store_path_data_to 1@


gdzie pierwsza wartość to uchwyt pliku (trzeba takowy otworzyć opcodem 0A9A), druga to ID, na które wczytamy ścieżkę, a trzecia jest zmienną, która przechowa wskaźnik na informacje o ścieżce - nie musimy się jednak tym przejmować, wystarczy zostawić tą zmienną w spokoju :)

Ścieżkę wyładowuje się, stosując

Kod:
0AC9: free_allocated_memory 1@
0873: release_path 899


gdzie 0AC9 wymaga podania zmiennej ze wskaźnikiem na informacje o ścieżce (został on zwrócony przez funkcję wczytującą), a 0873 wyładowuje ścieżkę o podanym ID w zwykły, 'tradycyjny' sposób.
Przykładowy kod z użyciem tego triku również znajduje się w oryginalnym poście na GTAG.

Należy zaznaczyć, że ten trik wymaga zastosowania CLEO4.
Dodane przez: MakG
Posting comments to this article is disabled.
Created & Powered by MakG
Wszelkie prawa zastrzeżone