Strona główna
Witaj, nieznajomy!

SaveGame

Możliwość zapisu stanu gry jest niezbędna przy większej ilości misji. W tym artykule przedstawię dwie metody na uzyskanie pożądanego efektu. Pierwszą będzie umieszczenia "SaveGamu" w normalnym SCM, a drugą w CLEO. Jeśli tworzysz całe "main" od nowa to zalecam zastosowanie pierwszej metody. Jeśli nie, to warto skorzystać z biblioteki CLEO.

MAIN


Kod savowania umieścimy w tzw. "External Script", które deklaruję się na początku pliku. Do dzieła...

Kod:
DEFINE EXTERNAL_SCRIPTS 1
DEFINE SCRIPT SAVE AT @SAVE


W ten sposób zadeklarowaliśmy jeden skrypt o nazwie SAVE. Jeśli nie wiesz w którym miejscu musisz wstawić powyższy kod, to zajrzyj do poradniku o nazwie "MAIN". Kod skryptu możemy umieścić w dowolnym miejscu, lecz dla porządku najlepiej jest trzymać tego typu skryptu na końcu pliku.
Teraz musimy załadować i uruchomić skrypt "SAVE", żebyśmy mogli z niego skorzystać podczas gry.

Kod:
0884: 'SAVE' = init_external_script_named_handle 0 (SAVE)
08A9: load_external_script 0 (SAVE)
:MAIN1
wait 
10
if
08AB: external_script 0 (SAVE) loaded
jf 
@MAIN1
0913: run_external_script 0 (SAVE)


Pierwszą linijką zainicjowaliśmy skrypt "SAVE" pod taką samą nazwą i numerze 0. Następnie załadowaliśmy skrypt o identyfikatorze 0 (SAVE). Po tym tworzymy pętlę, sprawdzamy czy skrypt 0 (SAVE) został załadowany. Jeśli tak to uruchamiamy go.

Kod:
0180: set_on_mission_flag_to $ONMISSION


Musimy jeszcze dodać powyższą linijkę do sekcji MAIN. Przypisujemy status wykonywania misji do zmiennej $ONMISSION. Będziemy w niej zapisywać jedną z poniższych wartości:
0 - Gracz nie wykonuje misji
1 - Gracz wykonuje misję
Oczywiście numery można samemu sobie dobrać ale powyższe są najbardziej trafne. Za pomocą tej zmiennej, jak nie trudno się domyślić, będziemy sprawdzać czy gracz wykonuje misję, czy też nie.

Niestety zmienna nie będzie się sama edytowała tak jakbyśmy tego chcieli, dlatego będzie trzeba zrobić to ręcznie. Na początku każdej misji trzeba przypisać zmiennej $ONMISSION wartość 1, a na końcu 0. Możemy to zrobić stosując poniższe kody:
Kod:
$ONMISSION = 1
$ONMISSION = 0


Dodam jeszcze, że save przyjmuje nazwę ostatnio wykonywanej misji.
Kod:
0318: set_latest_mission_passed 'INTRO_1'


Powyższą linijką ustaliliśmy nazwę ostatnio wykonanej misji. Nazwę pobiera się z pliku GXT, z tabeli "MAIN".

Teraz pozostało nam napisać skrypt "SAVE".
Kod:
:SAVE
thread 
'SAVE'

:Save_Check_1
wait 
10
if 
and
Player.Defined($PLAYER_CHAR)
$ONMISSION == 0
jf 
@Save_Check_1

$SavePickup = Pickup.Create(#PICKUPSAVE, 3, 2522.9409, -1679.2528, 15.497)


Dwie pierwsze linijki - wiadomo, rozpoczęliśmy skrypt o nazwie SAVE. Później robimy pętlę, w której sprawdzamy czy gracz został zdefiniowany jako $PLAYER_CHAR i czy nie wykonuje misji. Jeśli obydwa warunki się zgadzają, tworzymy pickupa w podanych współrzędnych (dom Sweeta).

Kod:
:Save_Check_2
wait 
10
if
$ONMISSION == 1
jf 
@Save_Check_3

Pickup.Destroy($SavePickup)
jump 
@Save_Check_1

:Save_Check_3
wait 
10
if 
and
not 
Actor.Driving($PLAYER_ACTOR)
Pickup.Picked_up($SavePickup)
jf 
@Save_Check_2

Player.CanMove($PLAYER_CHAR) = False

fade 0 500

:Save_Fade_Check_1
wait 
10
if
816B: not fading
jf 
@Save_Fade_Check_1


Tworzymy kolejną pętlę, tym razem sprawdzamy czy gracz wykonuje misję, jeśli nie to przeskakujemy do następnej pętli. Jeśli tak to niszczymy pickupa i przeskakujemy do pierwszej pętli. Nie chcemy przecież żeby gracz zapisał grę podczas wykonywania misji. W trzeciej pętli sprawdzamy czy aktor nie jest w samochodzie i czy podniósł pickup. Jeśli nie to przeskakujemy do drugiej pętli. Jeśli tak to idziemy dalej, uniemożliwiamy graczowi ruch i zaciemniamy obraz. W ostatniej pętli w powyższym kodzie sprawdzamy czy obraz już się zaciemnił, znana procedura z poprzednich artykułów.

Kod:
0395: clear_area 1 at 2519.4165 -1679.0637 14.7198 radius 2.0

Actor.PutAt($PLAYER_ACTOR, 2519.4165, -1679.0637, 14.7198)
Actor.Angle($PLAYER_ACTOR) = 90.0

wait 
1000

03D8: show_save_screen

:Save_Check_4
wait 
10
if
83D9: not save_done
jf 
@Save_Check_5
jump 
@Save_Check_4

:Save_Check_5
fade 
1 1500

Player.CanMove($PLAYER_CHAR) = True

jump @Save_Check_1
end_thread


Po zaciemnieniu obrazu czyścimy teren ze zbędnych przechodniów i pojazdów w miejscu gdzie położymy gracza, aby uniknąć błędów typu wtopienie gracza w inną postać lub samochód. Następnie kładziemy gracza w wyczyszczone miejsce i obracamy go o 90 stopni. Czekamy sekundę i używamy funkcji, która pokaże tzw. "Save Screen". Po zastosowaniu jej naszym oczom ukaże się ekran z możliwością wyboru slotu, na którym chcemy zapisać grę. Na szczęście nie musimy sami tego programować. Później tworzymy pętlę, w której sprawdzamy czy gracz zakończył zapisywanie gry. Jeśli tak to przeskakujemy do następnej części kodu. Rozjaśniamy obraz i umożliwiamy graczowi ruch. Na koniec przeskakujemy do pierwszej pętli, żeby skrypt był cały czas w ruchu (cały czas była możliwość zapisu gry). Ostatnią linijką kończymy nasz skrypt.
Na koniec powiem jeszcze że podczas zapisu gry zapisywany jest stan wszystkich zmiennych. SCM samo nie rozpozna jakie misje zostały już wykonane, trzeba to zapisywać do zmiennych np.
$BIGSMOKE_1MISSION = 1

Jeśli przed rozpoczęciem misji chcemy sprawdzić czy poprzednie zadanie zostało wykonano, to wystarczy tylko sprawdzić stan zmiennej z pomocą if:
Kod:
if
$BIGSMOKE_1MISSION == 1
jf 
@MISJA_STOP



CLEO


W CLEO kod na możliwość zapisu gry jest IDENTYCZNY jak ten w MAIN. Jest tylko kilka warunków, które musi spełniać MAIN. Po pierwsze gracz musi być zadeklarowany jako $PLAYER_CHAR, chyba że zmienisz nazwę tej zmiennej w kodzie savu i w MAIN. Po drugie, w zmiennej $ONMISSION muszą być przetrzymywane dane czy gracz wykonuje misję. Możesz oczywiście zmienić nazwę z $ONMISSION na dowolną inną.

Tutaj możesz pobrać przykład w CLEO
Dodane przez: MakG
Posting comments to this article is disabled.
Created & Powered by MakG
Wszelkie prawa zastrzeżone