Djinni Wiki PL
Advertisement

Składnia skryptów i zmiennych[]

Nowy skrypt tworzymy, wybierając File > New > Newerwinter Script (.nss)

Składnia skryptu:
Każdy podstawowy skrypt zawiera się w głównej funkcji void main():

void main()
{

}

Pomiędzy klamrami {} wpisujemy właściwy kod, czyli funkcje wraz z jej argumentami. Tworząc skrypt, musimy wiedzieć co za jego pomocą chcemy osiągnąć.
Każda funkcja musi być zakończona średnikiem.
Możemy również napisać skrypt, który będzie miał funkcję naszą w funkcji głównej:
Przykład:

void nasza_funkcja()
{
 tutaj jakieś instrukcje
}
void main()
{
 float czas = 10.0;
 DelayCommand(czas, nasza_funkcja());
}

Dodawanie bibliotek:
Istnieją funkcję, które wymagają dodatkowych bibliotek do poprawnego działania. Jedną z takich funkcji jest TeleportAndTalk. Dodawanie biblioteki zaczyna się przed główną funkcją void main(), zawsze rozpoczyna się # a potem include i w cudzysłowiu nazwa biblioteki.
Przykład:

#include "inc_dialog"

void main()
{
 TeleportAndTalk(GetObjectByTag("moj_NPC"));
} 

Deklaracja zmiennej:
Pisząc skrypt, możemy posługiwać się zmienną, czyli jakimś ciągiem znaków o konkretnym typie, przechowującą konkretną wartość. Jest to szczególnie przydatne jeśli w naszym skrypcie będzie powtarzała się ta sama wartość.
Przykład:

object gracz = GetObjectByTag("nazwa_NPC");

object - typ zmiennej
gracz - ciąg znaków (dowolny, bez polskich znaków diakrytcznych)
GetObjectByTag - funkcja
"nazwa_NPC" - argument funkcji
W przypadku kiedy typem jest liczba (czyli int lub float) po znaku = możemy dać jedynie liczbę.

Podstawowe typy w skryptach:
int - liczba całkowita
float - liczba rzeczywista (np. 4.0, 4.14, 5.67)
object - objekt
string - ciąg znaków (podany w nawiasach "")
void - pusty

Argumenty funkcji:
Prawie każda funkcja wymaga argumentów. Oczywiście są też funkcje bezargumentowe. Argumenty wstawia się w nawiasach (), natomiast oddziela się je przecinkiem.
Przykład:

SetLocalInt(object oSource, string sVarName, int nValue);

W podanej fukcji argumentami są zmienne, które muszą mieć konkretny typ wartości. Nic nie stoi na przeszkodzie, żeby argumentem funkcji była inna funkcja.
Ważne: Podana funkcja musi zwracać wartość, jaką wymaga argument funkcji.
Przykład:

SetLocalInt(GetObjectByTag("NPC"), "czas", GetTimeHour());


Wartość funkcji:
Istnieją funkcję, które ustawiają wartości. A są też takie, które je sprawdzają. Funkcje ustawiające wartości to wszystkie funkcje, zaczynające się od Set. Te funkcje zwracają wartość void, czyli nic (puste). Natomiast funkcje zaczynające się od Get zwracają konkretny typ danych. Tutaj trzeba wiedzieć, jaki typ zwraca dana funkcja.
Przykład:
GetTimeHour - wartość int
GetActionString - wartość string
GetObjectByTag - wartość object

Deklaracja przedmiotów:
W skryptach wszystkie przedmioty (czyli Triggery, Waypointy, Placeable, itp.) deklarujemy funkcją GetObjectByTag.
Przykład:

GetObjectByTag("nazwa_przedmiotu");

Tak jak w podanym wyżej przykładzie, nazwę podajemy w cudzysłowiu (bez spacji, jedynie z dolnym ukośnikiem "_").
Gracza definiujemy funkcją GetFirstPC(), która zwraca wartość object.

Specjalne funkcje i pętle:
Najczęściej używą funkcją specjalną jest funkcja if.
Składnia:

if(warunek)
{

instrukcje do wykonania

}
else
{

instrukcje do wykonania

}

Funkcja else to specjalna nazwa funkcji, która nie ma własnych warunków. Wykonuje się, jeśli warunek przy funkcji if jest fałszywy, czyli niespełniony. Funkcja else nie działa samodzielnie. Musi być zawsze podawana z funkcją if. Natomiast funkcja if może być podawana sama, bez else.
W nawiasach () podajemy warunek, który musi zostać spełniony, żeby zostały wykonane instrukcje w {}. Do ułożenia warunku wykorzystuje się następujące operatory logiczne:
== równe (obydwie strony równania muszą być sobie równe)
!= różne (strony równania muszą się różnić od siebie)
>= równe, lub większe (lewa strona musi być równa, lub większa niż prawa)
<= równe, lub mniejsze (lewa strona musi być równa, lub mniejsza niż prawa)
Oczywiście funkcję if wykorzystuję się jedynie do danych mających typ: int lub float.

Aby łączyć ze sobą warunki mamy 2 możliwości:
&& oraz (warunek po lewej i prawej stronie musi zostać spełniony)
|| lub (warunek po lewej albo po prawej musi zostać spełniony)

Powyższe operatory stosuje się także w pętli while:
Składnia:

while (warunek)
{
  instrukcje do wykonania
}

Ta pętla wykonuje instrukcje, dopóki warunek w nawiasach () jest prawdziwy (TRUE). Dlatego używając tej pętli trzeba pamiętać, żeby warunek kiedyś się skończył, bo w przeciwnym wypadku pętla będzie wykonywała się w nieskończoność.
Pętla do ... while:
Składnia:

do
{
   //instrukcje do wykonania
}
while(x>8);

Ta pętla to specjalna odmiana pętli while. Jej odmienność polega na tym, że ta pętla wykona się przynajmniej raz, w porównaniu do zwykłej pętli while, która może nie wykonać się nigdy. Działanie funkcji to zrobienie instrukcji, potem sprawdzenie warunku, i w przypadku, gdy jest on prawdziwy (TRUE), wykonanie instrukcji kolejny raz, dopóki warunek nie będzie fałszywy (FALSE).

Pętla for:
Składnia:

void main()
{
  int i;
  for(i=0; i<8; i++)
  {
    //instukcje do wykonania
  }
}

Pętla for ma specyficzną składnię. Jej warunek składa się z 3 faz:
1) instrukcja początkowa (np. i=7; i=x; i=89-1;)
2) warunek sterujący pętlą (np. i<90; i<=x+y; i>x; i>=x+20;)
3) instrukcja kroku (np. i++; i--; i=i+2; i=i-90;)


Advertisement