czwartek, 2 czerwca 2016

Modding #4 - Kompilacja Skryptów

Szybkie wytłumaczenie kompilacji skryptów. Wystarczy uruchomić Gothika używając programu GothicStarter_mod z zaznaczoną opcją Reparse Scripts. I tyle.

Modding #3 - Opis języka

  Język programowania w Gothiku jest językiem C-podobnym.

Średniki

  Po każdej operacji (no nie każdej, ale lepiej przyzwyczaić się, że do każdej, tak jest łatwiej) trzeba postawić średnik, czyli to ;. To jest właśnie średnik ;. Po co? Po to, żeby kompilator wiedział, że się ta operacja skończyła.

Zmienne i stałe

  Są to wartości, które są zapisane w pamięci komputera. Można się do nich dostać za pomocą ich nazw. Zmienna od stałej różni się tym, że zmienną można zmienić w trakcie działania programu. Stałej nie można.
  Tak się deklaruje zmienne w Gothiku;
  var typzmiennej nazwazmiennej;
  var to "polecenie" stworzenia nowej zmiennej
  typzmiennej to określenie typu nowostworzonej zmiennej
  nazwazmiennej to określenie nazwy nowostworzonej zmiennej, która musi być unikalna
  ; to średnik, który trzeba dać na końcu polecenia
  Typy zmiennych używane w Gothiku to int (liczby) i string (teksty).
  Nazwa zmiennej nie może zawierać spacji, polskich znaków i nie może zaczynać się od liczby.
  Zmienna domyślnie ma wartość 0.
  Przykład stworzenia nowej zmiennej:
  var int Apple_Bonus;
  Jest to zmienna, która liczy ile jabłek zjadł bohater.

  Tak się deklaruje stałe:
  const typstałej nazwastałej = wartośćstałej;
  const to "polecenie" stworzenia nowej stałej
  Stałej trzeba też od razu podać wartość.
  Przykład stworzenia nowej stałej:
  const string MOBNAME_CRATE   = "Skrzynia";
  Stała ta definiuje nazwę skrzyń w grze. Wartość stałej/zmiennej o typie string należy podać w cudzysłowie (dozwolone są spacje i polskie znaki).
  Zmienne i stałe mogą być globalne lub miejscowe. Globalne deklaruje się poza jakimikolwiek funkcjami i działają zawsze i wszędzie, a miejscowe działają tylko wewnątrz funkcji i po jej wykonaniu są usuwane.
  Na zmiennych i stałych można robić różne operacje matematyczne:
  a = ((12 + b - c)*8-3)/35;
  Dodawanie, odejmowanie, dzielenie, mnożenie, a nawiasy działają jak w zwykłej matematyce.
  a = a ^ 2;
  Potęgowanie robi się używając tego znaku ^.
  a += 10; b -= 10;
  Tak się dodaje i zmniejsza zmienne łatwiejszą drogą.
 

Tablice

  Tablice to zbiory zmiennych (lub stałych) o tym samym typie. Tak się deklaruje tablice zmiennych:
  var typtablicy nazwatablicy [rozmiartablicy];
  var - wiadomo
  typtablicy - wszystkie elementy w tablicy muszą mieć ten sam typ
  nazwatablicy - wiadomo
  [rozmiartablicy] to rozmiar tablicy, musi być podany w nawiasach kwadratowych (czyli takich:[])
  ; średnik - wiadomo

  Oto przykład:
  var int ADDON_Skills [6];
  Może to być tablica zawierająca poziomy dodanych zdolności.

  Do elementu tablicy odwołuje się w ten sposób:
  nazwatablicy [indeks]
  indeks to numer zmiennej w tablicy
  Numery są od 0 (!) do liczby o 1 mniejszej niż rozmiar tablicy (bardzo ważne!).

  Tak się deklaruje tablice stałych:
  const typtablicy nazwatablicy [rozmiartablicy] =
  {
     wartość,
     wartość,
     (...)
     wartość
  };
  Po podaniu rozmiaru tablicy wstawiamy znak równości a potem otwieramy klamrę i wpisujemy odpowiednie wartości oddzielając je przecinkami (bez żadnego średnika!), zamykamy klamrę i wstawiamy średnik.
  Tablice przydają się gdy tworzymy ileś podobnych, lub bardzo związanych ze sobą stałych/zmiennych.
  Indeksem tablicy (podczas odwoływania się) może być stała, ale nie zmienna. Trzeba o tym pamiętać.

  To były tablice jednowymiarowe. Programiści wiedzą, że jest coś takiego jak tablica wielowymiarowa. Tu nie działa.

Wyrażenie warunkowe

  Dzięki wyrażeniu warunkowemu można określić czy dana operacja się wykona czy nie zależnie od spełnionych warunków. Tak wygląda schemat:
 
  if (warunek)
  {
  operacje
  };
 
  if to "polecenie" stworzenia nowego "ifa" (wyrażenia warunkowego)
  warunek to warunek, który musi zostać spełniony aby operacje się wykonały
  Operacje są zamknięte klamrami.
  I na końcu średnik.
 
  Oto przykłady warunków:
  (zmienna == 23) równość
  Koniecznie 2 znaki równości!
  (zmienna < 10) mniejsze
  (zmienna > 10) większe
  (zmienna >= 21) większe/równe
  (zmienna <= 21) mniejsze/równe
  (zmienna != 23) nierówność
  Z obu stron można dodać różne działania.

  Można użyć też czegoś takiego:
  (!warunek)
  Wtedy operacje wykonają się tylko jeśli warunek nie będzie spełniony.

  Warunkiem może też być funkcja (o tym w dalszej części), która zwraca wartość liczbową. Gdy wartość będzie wynosić 0, to operacje się nie wykonają.

  Można użyć parę warunków:

  (warunek1) && (warunek2)
  Operacje się wykonają gdy oba warunki są prawdziwe.
  (warunek1) || (warunek2)
  Operacje wykonają się gdy przynajmniej jeden warunek będzie spełniony.
  Można w ten sposób tworzyć bardzo skomplikowane "ify":
  ((warunek1) && ((warunek2) || ((warunek3) && (warunek4)))) || (warunek5)
  Czyli warunek w warunku. Łatwo to zrozumieć.
 
 
  Można też zrobić bardziej skomplikowane wyrażenie warunkowe:
  if (warunek1)
  {
     operacje
  }
  else
  {
     operacje
  };
  Jeśli warunek jest spełniony to wykonają się pierwsze operacje, a jeśli nie, to drugie.
  UWAGA po klamrze przed else nie ma średnika!!!
  Po else można dać od razu if i stworzyć nawet bardzo skomplikowane wyrażenie warunkowe:
  if (warunek1)
  {
     operacje
  }
  else if (warunek2)
  {
     operacje
  }
  else
  {
     operacje
  };
  Średnik tylko na końcu, a z else if można iść w nieskończoność.
 
  Można też oczywiście "wsadzić ifa do ifa".

Funkcje

  Funkcje wydają się być skomplikowane, ale są proste i bardzo użyteczne. Tak się je tworzy:
  func typfunkcji nazwafunkcji (parametr1, parametr2, parametr3)
  {
     operacje
     return wartość;
  };
  func to "polecenie" stworzenia nowej funkcji
  typfunkcji to inaczej typ zwracanej wartości (typy są takie same jak dla zmiennych), jest jeszcze jeden typ, void, funkcje tego typu nie muszą zwracać żadnej wartości (ale jak najbardziej mogą), takie puste funkcje są nazywane procedurami (w innych językach programowania ma to sens, ponieważ procedury często tworzy się w nich inaczej niż funkcje)
  nazwafunkcji - wiadomo, musi być unikalna
  Parametry to zmienne (które tworzy się jak zmienne, zamiast parametr trzeba napisać deklaracje zmiennej (bez średnika)), które są wprowadzane do funkcji z zewnątrz.
  operacje - wiadomo
  return, to polecenie zwrócenia jakiejś wartości, w procedurach jest on zbędny, zwracana wartość jest zależna od parametrów

  Funkcje/procedury bez parametrów też muszą mieć nawiasy, puste, ale muszą być.

  Twórcy gry stworzyli wiele nowych funkcji, najłatwiej jest je po prostu poprzeglądać w plikach gry. Część oczywiście podam w przyszłych poradnikach.

  Tak się używa funkcji:
  nazwafunkcji (wartość1, wartość2, wartość3)
  Trzeba wpisać wartości wszystkich parametrów. Średnika nie dałem celowo, ponieważ funkcję zwykle stosuje się w ten sposób (przykład to funkcja zwracająca int):
  a = fun (b,c);
  W tym wypadku zmienna a przyjmuje wartość obliczoną za pomocą funkcji na podstawie wartości zmiennych b i c.

  Funkcja, a przede wszystkim procedura (taki jest jej sens bytu) może być użyta do wykonywania jakichś często powtarzanych operacji.





 To wszystko z podstaw. Bardziej skomplikowane rzeczy później.