O edytorze i języku SAIL
O Edytorze i SAIL'u
Edytor OW pozwala na tworzenie map do Singleplayer oraz Multiplayer. Do tworzenia interakcji mapy z użytkownikiem używany jest język skryptowy SAIL (Scripting AI Language).
SAIL jest bardzo podobny do Pascala. Zawiera wszystkie struktury kontrolne z Pascala: bloki begin-end, if oraz case, pętle while, repeat i for. Są one jednak rozszerzone w stosunku do tych z Pascala. Case jest rozszerzone, opcje mogą być zarówno wyrażeniem jak i stałą. For oprócz standardowego powtarzania poprzez dodanie do określonej liczby może również iterować tablicę danych (Array) (składnia: for zmienna in tablica do).
Składnia SAIL'a jest oparta na Pascalu, ale w niektórych miejscach się różni. Ten tekst ma za zadanie ułatwić naukę podstaw SAIL'a. Uwaga: Wszystkie konstrukcje językowe (np. Begin, End, For, Case, Function) muszą wyglądać tak jak przedstawione w tym tekscie, ale nazwy funkcji własnych oraz zmiennych mogą być jakiekolwiek.
Starting
Ta konstrukcja może zostać użyta tylko raz. Wyznacza ona miejsce od którego SAIL będzie wykonywany.
Starting Begin Wait(1000); End;
Export
Aby umożliwić wszystkim modułom dostęp do funkcji i zmiennych z wyznaczonego modułu musisz użyć konstrukcji Export (każda "strona" kodu jest nazywana modułem)
Zmienne:
Export moja_zmienna; Export moja_zmienna1, moja_zmienna2;
Funkcje:
Export Function moja_funkcja; begin end;
Funkcje i zmienne wyeksportowane są używane tak samo jak zwykłe. Jedyna różnica to to że sąone dostępne dla wszystkich modułów.
Var
Jeżeli nie chcesz żeby dana zmienna była globalna, musisz użyć konstrukcji Var aby wyznaczyć zmienną. W SAIL'u zmienne nie muszą mieć określonego typu, mogą być czymkolwiek (np. liczbą, tekstem).
Var moja_zmienna; Var moja_zmienna1, moja_zmienna2; Function moja_funkcja; Var moja_zmienna; begin end;
Funkcje
W SAIL'u możesz używać funkcji do różnych zadań. Funkcje mogą przyjmować parametry i zwracać wynik.
Bez parametrów:
Function moja_funkcja; begin end;
Z parametrami:
Function moja_funkcja(parametr, parametr2); begin end;
Z wynikiem:
Function moja_funkcja(parametr); begin Result := parametr; end; zmienna := moja_funkcja(5);
Komentarze
Możesz dodawać swoje komentarze do kodu (choćby po to aby pamiętać gdzie co jest) używając "//". Ta konstrukcja działa w jednej linijce. Wszystko po "//" jest oznaczane jako komentarz, aż do końca danej linijki. Komentarze blokowe umieszcza się w "{" i "}"
Wait(10); // Jakis komentarz Wait(10); // Komentarz { Tu kolejny komentarz, i następna linia } // Wait(10); <---- nie zostanie wykonane, poniewaz jest oznaczone jako komentarz { Wait(10); ta funkcja również się nie wykona. }
If Then
Ta struktura kontrolna pozwala na oznaczenie części kodu jako wykonywalnego, jeżeli wyznaczona kondycja jest spełniona.
If moja_zmienna = 5 then Wait(1); If moja_zmienna = moja_zmienna2 then Wait(1); If moja_funkcja("Q1") = 1 then Wait(1);
Można również określić akcję, jeżeli podane wymagania nie są spełnione.
If moja_zmienna = 1 then Wait(1) else Wait(2);
Begin End
Konstrukcje te są m.in. używane do wyznaczania początka i końca funkcji oraz różnych struktur kontrolnych.
if moja_zmienna = 1 then begin Wait(1); Wait(2); end;
Pętla For Do
Pętle For powtarzają kod w nich zawarty wyznaczoną ilość razy.
For x := 1 to 5 do wait(1); For x := 1 to 5 do begin wait(1); end; y := 1; j := 5; For x := y to j do begin wait(1); end;
Pętla Repeat Until
Pętle Repeat Until powtarzają zawarty w nich kod dopóki wyznaczony warunek nie zostanie osiągnięty.
x := 0; Repeat x := x + 1; Until x := 5;
Pętla While Do
Pętle While są takie same jak pętle Repeat Until, tyle że ta pętla nie zostanei wykonana ani razu jeżeli warunek nie jest spełniony na początku.
x := 0; While x < 5 do begin x := x + 1; end;
Case
Ta konstrukcja wykonuje kawałki kodu opierając się na wartości wyznaczonej zmiennej.
case Query('Q1') of 1:begin // jakiś kod który zostanie wykonany jeżeli rezultat zapytania zwróci 1 end; 2:begin end; end; case twoja_zmienna of 1:begin // jak wyżej end; 2:begin end; end;
Można też używac stałych
case twoja_zmienna of unit_human:begin // unit_human jest to stała wartość w OW, dzięki temu można łatwo sprawdzić czy dana jednostka to żołnierz end; unit_vehicle:begin end; end;