I. Uwagi dotyczące tworzenia broni.

Program omija pierwszą linijkę tekstu. Możesz napisać w niej co tylko ci się podoba, ale ta linijka MUSI znaleźć się w pliku. W przeciwnym
wypadku pojawią się errory, których natury nie przewidzę.
Każda broń składa się z 11 podstawowych zmiennych. Opis poniżej.
12                <--Prędkość pocisku. Dobrze by było, gdyby była mniejsza lub równa 16, wtedy nie będzie błędów kolzji. 12 to już sporo.
10                <--Główne obrażenia, zadawane wieżom.
0                 <--Czynnik niszczenia terenu. Im większy, tym więcej terenu opadnie w punkcie trafienia.
5                 <--Liczba strzałów, które wieża odda.
2                 <--Rozrzut broni. 10 to duży rozrzut.
10                <--Szybkostrzelność. 85 = jedna sekunda.
flak88.bmp        <--Nazwa obrazka broni. Obrazek musi znajdować się w folderze 'weapons\sprites\'.
7                 <--Obszar objęty działaniem broni. Im większy, tym większy lej pozostawi po sobie pocisk.
1                 <--Czynnik grawitacji. 1 to normalna grawitacja.
60                <--Długość życia pocisku. Po tym czasie pocisk ulegnie autodestrukcji.
1                 <--Czas, jaki pocisk może przebyć pod ziemią. 85 = jedna sekunda.

Po zadeklarowaniu wszystkich zmiennych, ponownie zostawiasz wolną linijkę, z tych samych względów co wcześniej.

No i najważniejsze: musisz dodać nazwę broni do pliku "queue_weapons.txt". Bez tego broń nie zostanie załadowana do gry.

II. Uwagi dotyczące pisania skryptów do broni.
1. Funkcja add_bullet() zwraca indeks stworzonego pocisku - zapisuje się do zmiennej a.
Dodatkowo nazwę broni w argumencie funkcji piszemy w podwójnych cudzysłowach ("nazwa broni.wps"). W pojedynczych wywali błąd.
Przykład:

a = add_bullet("Tesla - projectile.wps")
a.speed = 14

2. Możliwe identyfikatory skryptów:
-AT SHOT - przy tworzeniu pocisku (przy wystrzale)
-EVERY FRAME - co każdą klatkę gry
-AT CONTACT - gdy dotknie ziemi (nie zawsze oznacza to, że pocisk zostanie zniszczony, o czym później)
-AT DESTROY - przy zniszczeniu pocisku
3. Zmienna "parent" działa tylko, gdy pocisk zostanie wystrzelony przez wieżę. To dlatego, że oznacza ona indeks wieży, która wystrzeliła
pocisk. Przykład:
parent.hp += 30
Nie zmieniaj wartości zmiennej "parent", dla Twojego bezpieczeństwa.
4. Zawsze kończ skrypt linijką "endscript". Inaczej plik się nie wczyta, gra się zawiesi, a Ty będziesz miał kłopot.
5. Komentarze między skryptami poprzedzasz znakiem "@".Nie można pisać komentarzy w linijkach "endscript" i w identyfikatorach skryptów.
Oraz w samym kodzie (jest łączony w jedną linijkę). Jeśli zachowasz te zasady, błędów nie uświadczysz.

Przykład dobrze napisanego skryptu:

@skrypt zwalniania pocisku
EVERY FRAME
if(speed > 0) speed -= 0.2
endscript

@skrypt teleportacji w miejsce trafienia
@wieżyczki mają współrzędne podzielne przez 16, pociski już nie, więc trzeba je zaokrąglić
AT DESTROY
if(height-external_call(GetCell,x div 16,y div 16) < 1) { parent.x = (x div 16)*16
parent.y = (y div 16)*16 }
endscript

6. Między identyfikatorami skryptów a linijką "endscript" można napisać dowolny kod kompatybilny z GM-em 7.0 (bez komentarzy w kodzie).
Jest tylko kilka wyjątków, a mianowicie nie można wpisać trzech słów do gry: "keyboard", "mouse", "joystick". Na wypadek, gdyby
komuś się zachciało zrobić darmowego Game Makera Pro.

III. Oprócz zmiennych wbudowanych natywnie do GM-a można wykorzystać zmienne poniżej.
Zmienne wieżyczki (poprzedzane słowem "parent."):
-height          <--wysokość wieżyczki (od 0 do 255) - nie zmieniać, i tak się nie da
-active          <--czy z wieżyczki można strzelać
-weapon          <--aktualna broń wieżyczki - nie zmieniać (chyba że chcesz popsuć grę)
-remain          <--liczba strzałów, ktorą można jeszcze oddać w pojedynczej serii
-angle           <--kąt strzału
-group           <--drużyna wieżyczki
-hp              <--stan wieżyczki
Zmienne pocisku:
-height          <--wysokość pocisku (od 0 do 255)
-time            <--czas od stworzenia pocisku - nie zmieniać; czas jest powiązany z grawitacją :o
-sped            <--prędkość spadania pocisku; odpowiednik "gravity"
-md              <--obrażenia zadawane wieżyczkom
-dd              <--czynnik niszczenia terenu
-ar              <--obszar objęty działaniem pocisku
-life            <--długość życia; 85 = jedna sekunda
-factor          <--czynnik grawitacji; 1 = normalna grawitacja
-ds              <--czas możliwy do przebycia pod ziemią (tak jakby wiercenie); 85 = jedna sekunda
-parent          <--"rodzic" pocisku; tylko gdy wystrzelony
-weap            <--broń, która wystrzeliła ten pocisk; nie wiem, po co mi to, ale chyba jest ważne; nie zmieniać
-cont            <--czy pocisk miał kontakt z ziemią
-group           <--drużyna pocisku; ważne, aby nie trafiał swoich
-a               <--zmienna tymczasowa; o tym za chwilę

IV. Oprócz funkcji wbudowanych natywnie do GM-a można wykorzystać trzy dodatkowe funkcje:
-external_call(GetCell,x,y)      <--funkcja z DLL-a; pobiera wysokość komórki na pozycji (x*16,y*16), więc dany obiekt (np. parent) 
znajduje się w komórce (obiekt.x div 16, obiekt.y div 16)
-external_call(SetCell,x,y,v)    <--funkcja z DLL-a; zapisuje wysokość v do komórki na pozycji (x*16,y*16)
-add_bullet(broń)                <--funkcja tworzy pocisk wykorzystując dane z broni o nazwie "broń" (np. "Standard gun.wps"). Funkcja
zwraca wartość, którą zapisuje się do zmiennej "a". Przykład:

@"a" jest teraz numerem ID nowego pocisku
AT_DESTROY
a = add_bullet("Flamethrower - spark.wps")
a.direction = -direction-20+random(40)
endscript

-sound_play(nazwa_pliku)         <--teraz ta funkcja bierze za argument nazwę pliku dźwiękowego, a nie indeks dźwięku. Nazwa dźwięku musi
znajdować się w pliku "queue_sounds.txt", a dźwięk w folderze "sounds"