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.
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
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
2@ = 800.0 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.
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
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.
(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.
Posting comments to this article is disabled.