Overwatch 2

Przedstawiamy Warsztat Overwatch

Blizzard Entertainment

Twórzcie własne rodzaje rozgrywki z niewyobrażalną do tej pory wolnością! Warsztat to uproszczony system tworzenia skryptów, który jest rozszerzeniem opcji modyfikowania gier. W Warsztacie możecie stworzyć skrypt i dodać do niego reguły oraz specjalne warunki, a to wszystko w znanych i lubianych trybach gry Overwatch. Przy użyciu reguł wpłyniecie na wiele elementów, m.in. na ruch bohatera i jego zdolności, zmodyfikujecie sposoby zadawania obrażeń i leczenia bohaterów, a nawet wyświetlicie tekst w określonych sytuacjach.

Jednym z trybów, jakie możecie stworzyć, jest Podłoga to lawa, w którym bohaterowie stojący na ziemi będą się palić:

W funkcji Warsztat występują słownictwo i wyrażenia charakterystyczne dla języka znanego z programowania. W związku z tym podjęliśmy decyzję, by zachować takie elementy oraz składnię w oryginale, czyli w języku angielskim. Chcemy jednak, by funkcja ta była możliwie najbardziej przystępna zarówno dla ekspertów, jak i początkujących użytkowników, dlatego opisy wszystkich zmiennych i wartości zostały przetłumaczone i są wyświetlane w wybranej wersji językowej gry.

W przypadku jakichkolwiek pytań lub wątpliwości związanych z lokalizacją Warsztatu piszcie do nas na naszym forum, w dziale poświęconym tłumaczeniu i lokalizacji!

Spis treści

Dostęp do Warsztatu

Aby uruchomić Warsztat, kliknijcie Graj > Wyszukiwarka gier > Stwórz > Ustawienia > Warsztat.

Tworzenie skryptu

Żeby stworzyć skrypt, trzeba:

  1. Dodać regułę
  2. Wybrać zdarzenie
  3. Dodać warunek (opcjonalne)
  4. Dodać działanie

Kiedy już to zrobicie, będziecie mogli dodać tyle reguł, warunków i zdarzeń, na ile tylko starczy wam miejsca.

Dodawanie reguły

Reguły to niestandardowe elementy, które tworzą wasz skrypt. Każdy ze skryptów musi zawierać co najmniej jedną regułę.

Każda z reguł może mieć opcjonalny komentarz. Na regułę składają się:

  • Zdarzenie: Określa, kiedy wykonywana będzie dana reguła. Aby dowiedzieć się więcej, przeczytajcie sekcję Wybieranie zdarzenia.
  • Warunki: Opcjonalna lista wymagań, które muszą być spełnione, aby reguła mogła być zastosowana. Aby dowiedzieć się więcej, przeczytajcie sekcję Dodawanie warunku.
  • Działania: Lista działań wykonywanych, jeżeli zdarzenia i warunki zostaną spełnione. Aby dowiedzieć się więcej, przeczytajcie sekcję Dodawanie działania .

Jeżeli chcecie dodać regułę, kliknijcie „Dodaj regułę”.

Wybieranie zdarzenia

Zdarzenie określa, w jakich warunkach zostanie zastosowana reguła. Jeżeli w grze występuje dane zdarzenie, system generuje osobną instancję reguły, a warunki są sprawdzane niezależnie w ramach każdej z nich. Wykonywane w efekcie jednej instancji działania także pozostają niezależne od pozostałych.

Kiedy w edytorze zostanie stworzona reguła, zdarzenie jest dodawane automatycznie, a jego typ musicie wybrać samodzielnie.

Aby wybrać typ zdarzenia:

  1. Kliknijcie rozwijane menu obok paska „Zdarzenie”.
  2. Wybierzcie jeden z poniższych:

    Typ zdarzenia komentarz
    Ongoing – Global

    Na początku gry system tworzy pojedynczą instancję tej reguły. Pozostaje ona aktywna przez całą grę.

    • Ponieważ instancja pozostaje aktywna od początku do końca gry, warunek może zostać spełniony, ale niekoniecznie. Kiedy zostanie spełniony po raz pierwszy, jego skutkiem będą wykonane zdarzenia.
    • Za każdym razem, kiedy warunki z listy zostaną spełnione po tym, kiedy uprzednio się to nie udało, system spróbuje ponownie wykonać działania.
    Ongoing – Each Player

    Tworzy osobną instancję danej reguły dla każdego gracza, który dołącza do gry. Instancja ta pozostaje aktywna do zakończenia gry lub póki gracz nie opuści rozgrywki. Każda z instancji niezależnie sprawdza warunki i wykonuje działania.

    • Ponieważ instancja pozostaje aktywna tak długo, jak długo dany gracz znajduje się w grze, warunek może zostać spełniony, ale niekoniecznie. Kiedy zostanie spełniony po raz pierwszy, jego skutkiem będą wykonane działania.
    • Za każdym razem, kiedy warunki z listy zostaną spełnione po tym, kiedy uprzednio się to nie udało, system spróbuje ponownie wykonać działania.
    Player Earned Elimination

    Stosuje regułę za każdym razem, gdy gracz zalicza likwidację. Każdy z graczy może mieć aktywną tylko jedną instancję reguły tego typu naraz.

    • Kiedy gracz kogoś likwiduje, system sprawdza warunki. Jeżeli każdy z nich zostanie spełniony, skutkiem będą wykonane działania. Jeżeli którykolwiek zaś nie zostanie spełniony, żadne z działań nie będzie wykonane.
    Player Dealt Final Blow

    Stosuje regułę za każdym razem, gdy gracz zalicza trafienie kończące. Każdy z graczy może mieć aktywną tylko jedną instancję reguły tego typu naraz.

    • Kiedy gracz zadaje trafienie kończące, system sprawdza warunki. Jeżeli każdy z nich zostanie spełniony, skutkiem będą wykonane działania. Jeżeli którykolwiek zaś nie zostanie spełniony, żadne z działań nie będzie wykonane.
    Player Dealt Damage

    Stosuje regułę za każdym razem, gdy gracz zadaje obrażenia. Każdy z graczy może mieć aktywną tylko jedną instancję reguły tego typu naraz.

    • Kiedy gracz zadaje obrażenia przeciwnikowi, system sprawdza warunki. Jeżeli każdy z nich zostanie spełniony, skutkiem będą wykonane działania. Jeżeli którykolwiek zaś nie zostanie spełniony, żadne z działań nie będzie wykonane.
    Player Took Damage

    Stosuje regułę za każdym razem, gdy gracz odnosi obrażenia. Każdy z graczy może mieć aktywną tylko jedną instancję reguły tego typu naraz.

    • Kiedy przeciwnik zadaje graczowi obrażenia, system sprawdza warunki. Jeżeli każdy z nich zostanie spełniony, skutkiem będą wykonane działania. Jeżeli którykolwiek zaś nie zostanie spełniony, żadne z działań nie będzie wykonane.
    Player Died

    Stosuje regułę za każdym razem, gdy gracz ginie. Każdy z graczy może mieć aktywną tylko jedną instancję reguły tego typu naraz.

    • Kiedy gracz ginie, system sprawdza warunki. Jeżeli każdy z nich zostanie spełniony, skutkiem będą wykonane działania. Jeżeli którykolwiek zaś nie zostanie spełniony, żadne z działań nie będzie wykonane.
  3. W razie potrzeby możecie określić drużynę lub gracza, których to zdarzenie będzie obejmowało. Opcje to:

    Opcja komentarz
    All Zdarzenie obejmuje wszystkie drużyny, w tym graczy w trybach każdy na każdego.
    Team 1 (lub aktualna nazwa drużyny) Zdarzenie obejmuje wyłącznie członków tej drużyny
    Team 2 (lub aktualna nazwa drużyny) Zdarzenie obejmuje wyłącznie członków tej drużyny
    Opcja komentarz
    All Zdarzenie obejmuje wszystkich graczy
    Slot 0 through Slot 5 Zdarzenie obejmuje wyłącznie graczy na określonych miejscach. W grze zespołowej dwóch graczy może zajmować jedną pozycję (po jednej na drużynę).
    Slot 6 through Slot 11 Zdarzenie obejmuje wyłącznie graczy na określonych miejscach i wyłącznie tryby każdy na każdego.
    Specific Hero Zdarzenie obejmie tylko tych graczy, którzy grają tym bohaterem.

Dodawanie warunku

Po tym jak dodaliście już do skryptu regułę i zdarzenie, możecie wybrać jeden lub więcej warunków. Warunki to lista kryteriów, które muszą być spełnione, aby reguła mogła zostać zastosowana, a określone przez nią działania – wykonane. Jeżeli warunek należy do reguły ze zdarzeniem „Ongoing – Global” lub „Ongoing – Each Player”, jest sprawdzany w sposób ciągły. Jeżeli należy do reguły innego typu, jest sprawdzany za każdym razem, gdy określone zdarzenie ma miejsce. Jeżeli reguła nie zawiera żadnych warunków, system spróbuje wykonać listę działań, gdy tylko wystąpi zdarzenie. Każdy warunek składa się z dwóch wartości, zawierających operatory, dzięki którym system sprawdza, czy warunek zwraca wartość prawda, czy nie. Aby dowiedzieć się więcej, przeczytajcie sekcję Wartości.

Aby dodać warunek:

  1. Kliknijcie przycisk Dodaj na pasku warunków.
  2. Uzupełnijcie pola wartości.
    • Uwaga: Jeżeli sama wartość musi zawierać dodatkowe dane wejściowe (np. wartość "Hero Of" wymaga podania nazwy gracza, którego bohater ma być sprawdzany), wówczas dane wejściowe powiązane z tą wartością będą widoczne w nowym akapicie.
  3. Wybierzcie operator. Dostępne są:
    • == równa się
    • != nie równa się
    • > jest większe niż
    • >= jest większe lub równe
    • < jest mniejsze niż
    • <= jest mniejsze lub równe

Ta wartość sprawdza, czy liczba osób w meczu jest równa liczbie graczy pozostałych przy życiu, czy nie.

  • Wartość: „Number of Living Players” sprawdza ogólną liczbę graczy, którzy pozostali przy życiu.
    • Drużyna: „Team”, sprawdza wszystkich graczy w drużynie.
    • Drużyna: „All”, sprawdza graczy we wszystkich drużynach.
  • Operator: ==, oznacza, że aby system uznał, że warunek został spełniony, pierwsza wartość musi być równa drugiej.
  • Wartość: „Number of Living Players”, sprawdza ogólną liczbę graczy, którzy pozostali przy życiu.
    • Drużyna: „Team”, sprawdza wszystkich graczy w drużynie.
    • Drużyna: „All”, sprawdza graczy we wszystkich drużynach.

Inne przykłady

  • „IsFlagBeingCarried(Victim) == False”: Gracz, który został zabity, nie mógł nieść flagi.
  • „IsCrouching(Event Player) == True”: Gracz, którego dotyczy zdarzenie, musi kucać.
  • „NumberOfFinalBlows(Attacker) > 10”: Atakujący gracz zaliczył ponad 10 trafień kończących.

Dodawanie działania

Działanie to element, który wpływa na grę. Działania z listy są wykonywane po kolei, od góry do dołu. Aby system zaczął wykonywać działania z listy:

  • Musi mieć miejsce zdarzenie powiązane z daną regułą.
  • Wszystkie warunki określone w danej regule muszą zostać spełnione (chyba że reguła nie zawiera żadnych warunków).
    • Jeżeli zdarzenie należy do typów „Ongoing – Global” lub „Ongoing – Each Player”, działania z listy będą wykonywane, kiedy wszystkie warunki zostaną spełnione po raz pierwszy. Za każdym razem, kiedy warunki z listy zostaną spełnione po tym, kiedy uprzednio się to nie udało, system spróbuje ponownie wykonać działanie.

Z wyjątkiem działań „Wait” (Aby dowiedzieć się więcej na ich temat, przeczytajcie podsekcję Działania „Wait”), wszystkie działania są wykonywane i kończone natychmiast. Każde składa się z zera lub większej ilości danych wejściowych, które określają, w jaki sposób gra ma zostać zmieniona. Każdym danym wejściowym przypisana jest pewna wartość – to informacja lub instrukcja, określająca, jak pozyskać informację. Aby dowiedzieć się więcej, przejdźcie do sekcji Wartości.

Aby dodać działanie:

  1. Kliknijcie przycisk Dodaj na pasku działań.
  2. Wybierzcie działanie, które określi, w jaki sposób gra będzie zmieniona.
  3. Z rozwijanego menu wybierzcie wartość dla każdych nowych danych wejściowych, które się pojawią.
    • Uwaga: Niektóre działania będą generowały obiekty lub zachowania. Takie działania mogą zawierać dane wejściowe „Ponowne obliczanie”. Określają one, czy inne dane wejściowe dla tego działania są stałe (pozostawiają obiekt lub zachowanie bez zmian), czy dynamiczne (zmieniają obiekt lub zachowanie, kiedy zmienia się wartość powiązana z danymi danymi wejściowymi).

Działania

  • „Pause Match Time”: Zatrzymuje czas aktualnego meczu.
  • „Modify the Global Variable(T, Add, 5)”: Zwiększa globalną zmienną T o 5.
  • „Set Invisible(Event Player, Enemies)”: Sprawia, że gracz dla którego system stosuje regułę, staje się niewidoczny dla wrogów.

Działania z danymi wejściowymi „Ponowne obliczanie”

  • Create Icon(All Players(All Teams), Global Variable(P), Alert, Position): Tworzy symbol „Alert”, który jest widoczny dla wszystkich w lokacji określonej wartością „Global Variable P”. Ponownie sprawdza pozycję w sposób ciągły, więc gdy „Global Variable P” w późniejszym czasie się zmieni, symbol zostanie przeniesiony w inne miejsce.
  • Create Icon(All Players(All Teams), Global Variable(P), Alert, None): Tworzy symbol „Alert”, który jest widoczny dla wszystkich w lokacji określonej wartością „Global Variable P”. Nie sprawdza niczego ponownie. Gdy „Global Variable P” w późniejszym czasie się zmieni, symbol nie zostanie przeniesiony w inne miejsce.

Typy działań

W systemie czeka na was wiele potencjalnych działań, ale jest kilka, którym warto poświęcić więcej uwagi:

„Loop” to działanie, które powoduje ponowne wykonanie listy działań od początku. Istnieją cztery jego typy:

  • „Loop”: Zawsze zaczyna wykonywanie listy działań od początku.
  • „Loop If”: Zaczyna wykonywanie listy działań od początku, jeżeli dane wejściowe powiązane z warunkiem tego działania po przetworzeniu zwrócą wartość inną niż 0 lub fałsz.
  • „Loop if Condition Is True”: Zaczyna wykonywanie listy działań od początku, jeżeli wszystkie warunki reguły zostaną w danym momencie spełnione.
  • „Loop If Condition Is False”: Zaczyna wykonywanie listy działań od początku, jeżeli którykolwiek warunek reguły nie zostanie w danej chwili spełniony.

Działania „Loop” są dozwolone tylko, jeżeli przed rozpoczęciem wykonywania listy działań zostanie wykonane działanie „Wait”.

Dobrze Źle

Taka konfiguracja jest dozwolona, ponieważ nim lista działań zostanie wykonana ponownie, musi upłynąć trochę czasu.

Taka konfiguracja nie jest dozwolona, ponieważ zapętlone działanie cały czas byłoby wykonywane od nowa, bez żadnej przerwy.

„Wait” to typ działania, które sprawia, że nim system zacznie wykonywać kolejne z listy, musi upłynąć trochę czasu. Minimalny czas oczekiwania to 0,25 sek.

Działania „Wait” obejmują trzy rodzaje zachowań:

  • „Ignore Condition”: Jeżeli wybierzecie ten rodzaj, wówczas żadne warunki ani inne zdarzenia nie mogą zakłócić wykonywania działań.
    • Jeżeli zdarzenie należy do typu „Ongoing – Global” lub „Ongoing – Each Player”, wówczas to, czy warunki będą zmieniać stan ze spełnionych na niespełnione i odwrotnie, nie będzie niosło ze sobą żadnych konsekwencji.
    • Jeżeli zdarzenie należy do jakiegokolwiek innego typu i dotyczy ono tego samego gracza, jest w całości ignorowane.
  • „Abort When False”: Jeżeli wybierzecie tę opcję, system przestanie wykonywać działania z listy z chwilą, gdy warunki przestaną być spełniane.
  • „Restart When True”: Jeżeli wybierzecie tę opcję, system zacznie wykonywać działania z listy od początku, pod warunkiem, że:
    • Zdarzenie należy do typu „Ongoing – Global” lub „Ongoing – Each Player”, a niespełnione uprzednio warunki zostaną spełnione.
    • Zdarzenie należy do jakiegokolwiek innego typu i dotyczy ono tego samego gracza, a wszystkie warunki zostaną spełnione.

Dodatkowe informacje

Wartość „String” generuje ciąg. Wiążą się z nią następujące dane wejściowe:

  • „String”: Tekst, który ma być wyświetlany. Jeżeli zawiera cyfrę w nawiasach klamrowych, zostanie ona zastąpiona wartością podaną w jej danych wejściowych.
  • {0}: Wartość zamieniana na tekst, który zastępuje {0} w ciągu. Może być dowolnego typu.
  • {1}: Wartość zamieniana na tekst, który zastępuje {1} w ciągu. Może być dowolnego typu.
  • {2}: Wartość zamieniana na tekst, który zastępuje {2} w ciągu. Może być dowolnego typu.
  • „String(“Hello, Null, Null, Null)”: daje w efekcie ciąg „Hello”
  • „String(“{0} vs {1}”, Hero(Ana), Hero(Pharah), Null)”: daje w efekcie ciąg „Ana vs Pharah”

Ciągi można ze sobą łączyć, by były bardziej złożone:

  • „String(“{0} vs {1}”, Hero(Ana), String("{0} and {1}", Hero(Pharah), Hero(Genji), Null), Null)”: daje w efekcie ciąg „Ana vs Pharah and Genji”

Ciągów nie można umieszczać w warunkach ani wartościach, ze względu na różne języki, których mogą używać gracze w tej samej Grze dowolnej.

Wartość to informacja – lub instrukcja, w jaki sposób uzyskać informację – zawarta w danych wejściowych warunku, działania lub innej wartości. Wartości można ze sobą łączyć.

Jest ich mnóstwo, dlatego nie będziemy ich tu po kolei opisywać. Wszystkie są opisane w Warsztacie. Oto kilka, z którymi się zapewne spotkacie:

Wartość komentarz
Number Zapewnia liczbę rzeczywistą w zakresie sprecyzowanym w danych wejściowych
Vector Zapewnia współrzędne w trójwymiarze w zakresie sprecyzowanym w powiązanych danych wejściowych. Jest używana do określania pozycji i kierunków.
Team Wskazuje konkretną drużynę, np. Drużynę 1, Drużynę 2 lub wszystkie drużyny.
Hero Wskazuje konkretnego bohatera.
Null Wskazuje brak określonego gracza lub obiektu.
True Zapewnia wartość „prawda”.
False Zapewnia wartość „fałsz”.
Compare Zapewnia wartości „prawda” lub „fałsz”, w zależności od tego, czy porównanie, które opisuje, było prawdziwe, czy fałszywe.
Event Player Zapewnia nazwę gracza, którego dotyczy instancja reguły lub „Null”, jeżeli nie ma takiego gracza.
Attacker Zapewnia nazwę atakującego, którego dotyczy instancja reguły lub „Null”, jeżeli nie ma atakującego.
Victim Zapewnia nazwę ofiary, której dotyczy instancja reguły lub „Null”, jeżeli nie ma ofiary.
Current Array Element Sprawia, że dana wartość jest uwzględniana, gdy system przetwarza polecenia „If True For Any„, „If True For All”, „Filtered Array”, or ”Sorted Array Value”.

Wartość może być umieszczona w tabeli, która jest zestawem różnych wartości.

  • Niektóre działania i wartości mogą tworzyć lub modyfikować tabele.
    • Przykładowo: wartość „All Players” zapewnia wam tabelę złożoną ze wszystkich osób, które są w danym momencie w grze.
    • Możecie tworzyć własne tabele, korzystając z operacji „Append to Array”. Jest ona częścią działań „Modify Global Variable” i „Modify Player Variable”.
  • Jeżeli dane wejściowe wymagają tabeli, a otrzymują wartość innego typu, wartość ta zostaje skopiowana do tabeli jednoelementowej, aby jej format był zgodny z wymaganiami danych wejściowych. Analogicznie, jeżeli dane wejściowe otrzymują tabelę, a wymagają wartości innego typu, wykorzystana zostaje pierwsza wartość w z tabeli (lub 0, jeżeli tabela jest pusta).

Zmienna to miejsce, w którym mogą być przechowywane wartości do późniejszego użycia. W zmiennej może znaleźć się dowolna wartość, poza ciągami. Wszystkie zmienne zaczynają się od wartości liczbowej 0.

Skrypt wykorzystuje dwa typy zmiennych:

  • „Global Variable”: Istnieje 26 różnych wartości „Global Variable” oznaczanych literami od A do Z. Każda z nich zawiera osobną wartość lub tabelę z wartościami.
  • „Player Variable”: Do każdego z graczy przypisanych jest 26 zmiennych oznaczanych literami od A do Z. Każda z nich zawiera osobną wartość lub tabelę z wartościami.

Na zmiennych można przeprowadzać operacje trzech typów:

  • Ustawianie: Opcje „Set Global Variable” i „Set Player Variable” zmienią wartość danej zmiennej, zastępując poprzednią wartość.
  • Modyfikacja: „Modify Global Variable” i „Modify Player Variable” modyfikują wartość zmiennej z wykorzystaniem określonej operacji arytmetycznej (np. „Add, „Multiply” itp.) lub operacji na tabeli („Append”, „Remove”).
  • Stopniowa modyfikacja:Chase Global Variable Over Time”, „Chase Player Variable Over Time”, „Chase Global Variable at Rate” i „Chase Player Variable at Rate” stopniowo modyfikują zmienną w wyznaczonym czasie lub w określonym tempie.
    • Wartością docelową operacji „Chase” mogą być liczba lub wektor (czy też dowolna wartość, która zapewnia liczbę lub wektor).
      • Jeżeli wartość docelowa to „Number”, wartość zmiennej przed rozpoczęciem modyfikacji musi być liczbą. W przeciwnym wypadku operacja nie będzie przebiegać poprawnie.
      • Jeżeli wartość docelowa to „Vector”, wartość zmiennej przed rozpoczęciem modyfikacji, musi być wektorem. W przeciwnym wypadku operacja nie będzie przebiegać poprawnie.
      • Jeżeli wartość docelowa zawiera dane wejściowe typu „Ponowne obliczanie”, operacja „Chase” będzie aktualizowana zgodnie ze zmieniającą się wartością docelową, nawet wówczas, gdy została on już raz osiągnięta. Aby dowiedzieć się więcej o danych wejściowych typu „Ponowne obliczanie”, przeczytajcie sekcję Dodawanie działania.
    • Możecie anulować operację „Chase” korzystając z działań „Stop Chasing Global Variable” i „Stop Chasing Player Variable”.
      • Kiedy operacja „Chase” zostaje zatrzymana, zmienna zachowuje tę wartość, którą ma w danym momencie. Wartość ta może znajdować się pomiędzy tą z początku operacji „Chase” a docelową.

Przykłady

Jesteście gotowi do akcji? Spróbujcie stworzyć jeden z poniższych trybów! Po kolei opowiemy wam, co musicie zrobić i dlaczego:

Przeprowadzimy was przez proces tworzenia trybu Podłoga to lawa – gry, w której bohaterowie stojący na ziemi palą się i otrzymują obrażenia.

  1. Najpierw upewnijmy się, że gra będzie się toczyć na odpowiedniej mapie/mapach.
    • Kliknijcie Graj > Wyszukiwarka gier > Stwórz > Ustawienia > Mapy.
    • Wybierzcie mapę, na której chcecie przetestować tryb i wyłączcie wszystkie pozostałe.
  2. Następnie przejdźcie do swojego Warsztatu.
    • Kliknijcie Wstecz.
    • Kliknijcie Warsztat.
  3. Pora stworzyć skrypt! Dodajmy pierwszą regułę.
    • Kliknijcie przycisk Dodaj regułę.
    • W sekcji komentarza wybierzcie Bohater zaczyna płonąć, gdy znajduje się na ziemi. Dzięki temu będziecie wiedzieć, że ta reguła sprawia, że gracze dotykający ziemi zaczynają się palić.
    • Zmieńcie teraz typ zdarzenia po to, byśmy wiedzieli, kiedy powinna być stosowana ta reguła.
      • W rozwijanym menu zdarzeń wybierzcie „Ongoing – Each Player”. Wskazuje to, że ta reguła będzie stosowana osobno dla każdego z graczy.
      • W pozostałych rozwijanych menu zostawcie opcje domyślne.
    • A teraz dodajcie warunek. Będzie on określał to, czy reguła zostanie zastosowana, czy nie. Możecie także zostawić to pole puste, jeżeli chcecie, by reguła była stosowana zawsze!
      • Kliknijcie przycisk Dodaj na pasku warunków.
      • W rozwijanym menu pierwszej wartości wybierzcie „Is On Ground”. Ta wartość będzie zwracała wartość prawda za każdym razem, gdy gracz znajdzie się na ziemi.
      • W pozostałych rozwijanych menu zostawcie opcje domyślne i kliknijcie OK.
        • „Event Player” oznacza gracza, którego dotyczy stosowana właśnie reguła.
    • Na samym końcu dodamy działanie. Działania określają, co się stanie, jeżeli warunek zwróci wartość prawda.
      • Efektem tego działania będzie to, że gracz znajdujący się na ziemi zacznie się palić.
        • Kliknijcie przycisk Dodaj na pasku akcji.
        • W rozwijanym menu działań wybierzcie „Set Status”.
        • W rozwijanym menu statusu wybierzcie „Burning”.
        • W polu czasu trwania ustawcie suwak na pozycji 10 000.
        • W pozostałych rozwijanych menu zostawcie opcje domyślne i kliknijcie OK.
  4. Sprawdźmy, czy wasz bohater będzie się palił po zetknięciu z ziemią!
    • Dwukrotnie kliknijcie przycisk Wstecz.
    • Na ekranie Stwórz grę kliknijcie Start.
    • Wybierzcie bohatera.
    • Gdy tylko pojawicie się w grze, wasz bohater powinien się palić.
    • Naciśnijcie Esc i kliknijcie Otwórz Edytor Warsztatu, aby kontynuować tworzenie waszego skryptu.
  5. Dodajmy teraz kolejną regułę, dzięki której bohater nie będzie się palił, jeżeli podskoczy.
    • Aby nie robić wszystkiego od początku, skopiujmy ostatnią regułę, którą stworzyliśmy.
    • Kliknijcie Kopiuj obok stworzonej przez was reguły.
      • Kliknijcie Wklej regułę.
      • Zmieńcie opis na Bohater w powietrzu przestaje się palić. Dzięki temu będziecie wiedzieć, że ta reguła sprawia, że bohater przestaje się palić, gdy znajduje się w powietrzu lub skacze.
      • Zachowajcie typ zdarzenia.
      • A teraz zmieńmy warunek. Będzie on określał to, czy reguła zostanie zastosowana, czy nie.
        • Kliknijcie istniejący warunek „Is On Ground(Event Player) == True”.
        • W rozwijanym menu wartości wybierzcie „False”.
        • W pozostałych rozwijanych menu zostawcie uprzednio wybrane opcje i kliknijcie OK.
      • A teraz zabierzmy się za edycję działania. Sprawi ono, że wasz bohater przestanie się palić, jeżeli nie będzie znajdował się na ziemi.
        • Kliknijcie działanie „Set Status (Event Player, Null, Burning, 10000)”.
        • W rozwijanym menu działań wybierzcie „Clear Status”.
        • W rozwijanym menu statusu wybierzcie „Burning”.
        • W pozostałych rozwijanych menu zostawcie uprzednio wybrane opcje i kliknijcie OK.
  6. Sprawdźmy, czy bohater przestanie się palić, gdy znajdzie się w powietrzu!
    • Dwukrotnie kliknijcie przycisk Wstecz.
    • Gdy tylko pojawicie się w grze, wasz bohater powinien się palić. Podskoczcie i sprawdźcie, czy przestanie płonąć.
    • Naciśnijcie Esc i kliknijcie Otwórz Edytor Warsztatu, aby kontynuować tworzenie waszego skryptu.
  7. Na koniec sprawimy, że bohater znajdujący się na ziemi będzie otrzymywał obrażenia.
    • Rozwińcie regułę „Bohater, który znajduje się na ziemi, zaczyna płonąć”.
    • Kliknijcie Dodaj na pasku działań. To działanie sprawi, że bohater znajdujący się na ziemi będzie otrzymywał obrażenia.
      • W rozwijanym menu działań wybierzcie „Damage Over Time”.
      • Przestawcie suwak czasu trwania na pozycję 9999.
      • Przestawcie suwak obrażeń na sekundę na pozycję 30.
      • W pozostałych rozwijanych menu zostawcie opcje domyślne i kliknijcie OK.
    • Rozwińcie regułę „Bohater przestaje płonąć, kiedy nie stoi na ziemi”.
      • Kliknijcie przycisk Dodaj na pasku działań. To działanie sprawi, że bohater przestanie otrzymywać obrażenia, gdy nie będzie stał na ziemi.
      • W rozwijanym menu działań wybierzcie„Stop All Damage Over Time” .
  8. Sprawdźmy, czy bohater otrzymuje obrażenia, gdy znajduje się na ziemi, a przestaje, kiedy znajdzie się w powietrzu lub podskoczy.
    1. Dwukrotnie kliknijcie przycisk Wstecz.
    2. Opuśćcie pomieszczenie startowe i zobaczcie, czy wasz bohater zacznie otrzymywać obrażenia.
    3. Podskoczcie, aby sprawdzić, czy przestanie je otrzymywać.
  9. Dobra robota! Podłoga to teraz lawa!

Oto nieco bardziej rozwinięta instrukcja, z której dowiecie się jak stworzyć tryb gry Lustrzany Deathmatch. Składa się on z wielu krótkich rund, podczas których wszyscy grają tym samym bohaterem. Na zakończenie każdej rundy każdy z graczy pojawia się ponownie tam, gdzie się uprzednio znajdował, tym razem jako nowy bohater wybierany losowo z listy. Po zakończeniu rundy finałowej gracz, który zaliczył najwięcej likwidacji, wygrywa.

Przykładowo: w jednym meczu wszyscy mogą zacząć grę McCreem, a w kolejnej rundzie zmienić się w Farę. W innej grze zaczną jako Trupia Wdowa, a w kolejnej rundzie będą grali Ashe. Ze względu na to, w jaki sposób generowana jest lista, dwukrotna gra tą samą postacią jest mało prawdopodobna!

Dobra! Stwórzmy skrypt Lustrzanego Deathmatchu!

  • Kliknijcie Graj > Wyszukiwarka gier > Stwórz > Ustawienia > Warsztat.
  • Na początek stworzymy regułę generującą listę bohaterów, którymi potencjalnie można zagrać.
    • Ta lista będzie przechowywana w wartości „Global Variable L” jako tabela.
      • Tabele mogą zawierać dowolne dane: listę graczy, listę bohaterów, listę liczb, pojedynczą wartość, a nawet nie zawierać żadnych wartości (nazywane są wówczas „pustymi” tabelami).
      • Każda wartość w tabeli jest przypisana do unikatowego indeksu. Indeks zaczyna się od 0 i stopniowo rośnie. Indeks i jego wartość są niekiedy nazywane „elementami”.
      • Kolejność elementów ma tu znaczenie, więc [Reaper, Winston, Mercy] i [Mercy, Winston, Reaper] to dwie różne tabele.
      • Tabele mogą zawierać mieszanki informacji różnego typu. Przykładowo, możliwe jest stworzenie następującej tabeli: [123, Reaper, True, -4.5].
      • Jeżeli dane wejściowe wymagają tabeli, a otrzymają pojedynczą wartość, będą traktować tę wartość jako tabelę jednoelementową.
      • Jeżeli dane wejściowe wymagają pojedynczej wartości, a otrzymają tabelę, wykorzystają pierwszą wartość z tabeli (lub 0, jeżeli tabela jest pusta).
    • Dodajcie regułę i wpiszcie komentarz tak, abyście wiedzieli, za co będzie ona odpowiadać.
    • Wybierzcie typ zdarzenia „Ongoing – Global”. Oznacza to, że w grze będzie działać tylko jedna instancja tej reguły.
    • Ponieważ reguła nie zawiera żadnych warunków, zacznie być stosowana zaraz po rozpoczęciu meczu.
    • Dodajcie działanie:
      • Działanie: „Set Global Variable”
        • Zmienna: L
      • Wartość: „Hero”
        • Bohater: Bohater, którym mają grać gracze.
      Zostanie wówczas stworzona tabela bohaterów. Działanie „Set Global Variable” sprawia, że „L” będzie pierwszym bohaterem na liście.
    • Gdyby można było grać tylko jednym bohaterem, byłoby nudno. Potrzebujemy więcej opcji! Dodajcie tyle działań, ile tylko chcecie, w następujący sposób:
      • Działanie: „Modify Global Variable”
        • Zmienna: L
      • Operacja: „Append”
      • Wartość: „Hero”
        • Bohater: Bohater, którym mają grać gracze.
      W ten sposób dodacie bohaterów do stworzonej przez nas przedtem tabeli „L”. Jeżeli pierwsze byłoby działanie „Modify Global Variable”, a nie „Set Global Variable”, tabela zaczynałaby się od 0. Domyślnie wszystkie wartości wynoszą 0, więc jeżeli w jakiś sposób ich nie zmienicie, dostaniecie w efekcie np. taką tabelę: [0, Pharah, Hanzo, Ana,...] .
    • Pora dodać do tej reguły ostatnie działanie. Reguła będzie pobierała losowo wygenerowaną kopię wartości „Global Variable” „L” (tabeli bohaterów) i kopiowała fragment tej tabeli, zaczynając od 0, tak, by zawierała ona tylu bohaterów, ilu wymaga tryb gry. Kopia ta będzie następnie przechowywana z powrotem w wartości „Global Variable” „L”, dzięki czemu otrzymacie losowo wymieszaną listę będącą częścią waszej pierwotnej listy bohaterów.
      • Przykładowo, jeżeli wyjściowa lista bohaterów to: [Ashe, Doomfist, Hanzo, McCree, Pharah, Soldier: 76, Zenyatta, Widowmaker, Ana] , losowo wygenerowana tabela może wyglądać następująco: [Hanzo, Pharah, Widowmaker, Ana, Ashe, Doomfist, Soldier: 76, Zenyatta, McCree] , a uzyskany dzięki niej zestaw bohaterów tak: [Hanzo, Pharah, Widowmaker, Ana, Ashe, Doomfist] .
  • Dzięki kolejnej regule wszyscy gracze będą grali tym samym bohaterem, niezależnie od okoliczności.
    • Dodajcie regułę i wpiszcie komentarz tak, abyście wiedzieli, za co będzie ona odpowiadać.
    • Ustawcie typ zdarzenia „Ongoing – Each Player”. Oznacza to, że dla każdego z graczy będzie generowana osobna instancja reguły.
    • Dodajcie dwa warunki. Oba muszą zostać spełnione, aby dany bohater mógł zostać narzucony graczowi:
      • Liczba rund, czyli wartość „Global Variable B”, musi być niższa niż suma bohaterów na liście bohaterów. Jeżeli tak nie jest, gra się kończy, a graczom nie zostanie już narzucony żaden inny bohater. Początkowa liczba rund wynosi 0 i jest liczona w górę. Jeżeli więc gra ma 6 rund, wartość ta będzie równa 5. Jeżeli wartość „Global Variable R” nigdy nie będzie równa 0, to nic się nie stanie, ponieważ domyślnie wszystkie wartości zaczynają się od 0.
        • Wartość: „Global Variable”
          • Zmienna: R
        • Operator: <
        • Wartość: „Count Of”
          • Tabela: „Global Variable”
            • Zmienna: L
      • Ten warunek sprawdza, czy bohater, którym aktualnie steruje dany gracz, musi różnić się od bohatera przewidzianego dla obecnej rundy przez skrypt. „Dany gracz” jest reprezentowany przez „Event Player”, specjalną wartość, która oznacza gracza przetwarzającego w danym momencie instancję reguły. „Bohater przewidziany dla obecnej rundy” to bohater przechowywany w odpowiednim indeksie listy bohaterów („Global Variable L”). A ponieważ aktualna runda jest przechowywana w wartości „Global Variable R”, bohater przewidziany dla obecnej rundy może zostać pozyskany z wykorzystaniem „Value In Array”.
        • Wartość: „Hero Of”
          • Gracz: „Event Player”
        • Operator: !=
        • Wartość: „Value in Array”
          • Tabela: „Global Variable”
            • Zmienna: L
          • Indeks: „Global Variable”
            • Zmienna: R
    • Skoro już wiemy, że gracz będzie zmuszony zmieniać bohaterów, dodajmy dwa działania, które zostaną wykonane:
      • Pierwsze działanie zmusi „Event Player” do gry wyznaczonym bohaterem. Pierwsze dane wejściowe tego działania określają gracza, którego bohater powinien zostać zmieniony. Drugie dane wejściowe zawierają informacje o docelowym bohaterze.
        • Działanie:„Start Forcing Player To Be Hero”
        • Gracz: „Event Player”
        • Bohater: „Value In Array”
          • Tabela: „Global Variable”
            • Zmienna: L
          • Indeks: „Global Variable”
            • Zmienna: R
      • Kolejne działanie odpowiada za wstępne wczytanie kolejnego bohatera z listy, co zapobiega opóźnieniom przy zmianie postaci. Wszyscy gracze wczytują swojego kolejnego bohatera niezależnie, mimo że będą grać tym samym, a to dlatego, że każdy z nich może korzystać z innej skórki, która musi zostać wczytana.Użyta wartość „Add”, dodająca 1 do wartości „Global Variable R”, powoduje, że w ramach reguły wstępnie wczytany zostaje kolejny bohater, a nie aktualny. W ostatniej rundzie wartość ta zwróci wartość „Array Index” niedostępną dla „Array Global Variable L”. Wszystko jednak będzie działało jak trzeba, gdyż wartości niedostępne dla tabeli są traktowane jako wartości zerowe, a działanie, które wymaga danych bohatera, a otrzymuje wartość 0, nie jest wykonywane.
        • Działanie: „Preload Hero”
        • Gracz: „Event Player”
        • Bohater: „Value In Array”
          • Tabela: „Global Variable”
            • Zmienna: L
          • Indeks: „Add”
            • Wartość: „Global Variable”
              • Zmienna: R
            • Wartość: „Number”
              • Liczba: 1.00
  • Kolejna reguła, którą stworzymy, będzie rozpoczynała kolejną rundę, jeżeli ta nie została jeszcze w danym momencie zainicjowana.
    • Dodajcie regułę i wpiszcie komentarz tak, abyście wiedzieli, za co będzie ona odpowiadać.
    • Wybierzcie typ zdarzenia „Ongoing – Global”. Oznacza to, że w grze będzie działać tylko jedna instancja tej reguły.
    • Aby runda mogła się rozpocząć, wszystkie trzy warunki muszą zostać spełnione:
      • Gra musi trwać. Oznacza to, że ekran „Zbierz bohaterów” został już wyświetlony, a gracze przeszli fazę przygotowania, ale mecz jeszcze się nie zakończył.
        • Wartość: „Is Game In Progress”
        • Operator: ==
        • Wartość: „True”
      • „Global Variable I” musi zwracać wartość fałsz. Za zmienna wskazuje, czy aktualna runda już się rozpoczęła. Jeżeli zmienna „Global Variable I” nie została wyznaczona, będzie miała wartość 0, co w takich przypadkach oznacza fałsz.
        • Wartość: „Global Variable”
          • Zmienna: I
        • Operator: ==
        • Wartość: „False”
      • Liczba rund, czyli „Global Variable R”, musi być mniejsza niż suma bohaterów na liście bohaterów.
        • Wartość: „Global Variable”
          • Zmienna: R
        • Operator: <
        • Wartość: „Count Of”
          • Tabela: „Global Variable”
            • Zmienna: L
    • Kiedy wszystkie warunki zostaną spełnione, trzeba zainicjować rundę. Dodajcie kilka działań, które będą za to odpowiedzialne:
      • Pierwsze działanie informuje standardowy tryb gry, że mecz nie powinien się kończyć po spełnieniu zwykłych kryteriów. Dla gry typu Deathmatch oznacza to, że rozgrywka nie zostanie zakończona, kiedy skończy się czas ani wówczas, gdy któryś z graczy osiągnie limit punktów. Kiedy to działanie zostanie wykonane, mecz nie zakończy się, póki skrypt nie uruchomi ponownie wbudowanego systemu kończenia gry w danym trybie lub póki zwycięzca nie zostanie wskazany bezpośrednio.
        • Działanie: „Disable Built-In Game Mode Completion”
      • Kolejne działanie przestawia licznik danego trybu tak, by wskazywał długość rundy.
        • Działanie: „Set Match Time”
        • Czas: „Number”
        • Liczba: 60.00
      • To działanie sprawia, że zmienna „Global Variable I” będzie zwracała wartość prawda. Dzięki temu inicjalizacja nie zajdzie tak długo, aż „Global Variable I” nie zostanie przestawiona z powrotem na fałsz.
        • Działanie: „Set Global Variable”
        • Zmienna: I
        • Wartość: „True”
  • Ta reguła sprawia, że kolejna runda nie zostanie rozpoczęta, póki czas aktualnej nie dobiegnie końca.
    • Dodajcie regułę i wpiszcie komentarz tak, abyście wiedzieli, za co będzie ona odpowiadać.
    • Wybierzcie typ zdarzenia „Ongoing – Global”. Oznacza to, że w grze będzie działać tylko jedna instancja tej reguły.
    • Dodajcie dwa warunki. Oba muszą zostać spełnione, aby kolejna runda meczu została rozpoczęta:
      • Gra musi trwać. Oznacza to, że ekran „Zbierz bohaterów” został już wyświetlony, a gracze przeszli fazę przygotowania, ale mecz jeszcze się nie zakończył.
        • Wartość: „Is Game In Progress”
        • Operator: ==
        • Wartość: „True”
      • Licznik aktualnej rundy musi wskazywać 0, co oznacza, że jej czas dobiegł końca.
        • Wartość: „Match Time”
        • Operator: ==
        • Wartość: „Number”
          • Liczba: 0.00
    • Jeżeli warunki te zostaną spełnione, a runda dobiegnie końca, gra wyświetli numer kolejnej rundy i oznaczy nową rundę jako niezainicjowaną. Aby to zrobić, dodajcie dwa działania:
      • To działanie poinformuje wszystkie pozostałe reguły, że zaczęła się kolejna runda meczu,
        • Działanie: „Modify Global Variable”
        • Zmienna: R
        • Operacja: „Add”
        • Wartość: „Number”
          • Liczba: 1.00
      • To działanie sprawia, że „Global Variable I” ma wartość fałsz, dzięki czemu pozostałe reguły otrzymują informację o konieczności rozpoczęcia nowej rundy.
        • Działanie: „Set Global Variable”
        • Zmienna: I
        • Wartość: „False”
  • Runda finałowa kończy mecz, jeżeli rozegrano już wszystkie rundy.
    • Dodajcie regułę i wpiszcie komentarz tak, abyście wiedzieli, za co będzie ona odpowiadać.
    • Wybierzcie typ zdarzenia „Ongoing – Global”. Oznacza to, że w grze będzie działać tylko jedna instancja tej reguły.
    • Dodajcie jeden warunek, który sprawdzi, czy „Global Variable R” równa jest liczbie elementów w „Global Variable L”. Jeżeli tak jest, oznacza to, że runda została rozegrana dla każdego bohatera z listy bohaterów. Wówczas mecz powinien dobiec końca.
      • Wartość: „Global Variable”
        • Zmienna: R
      • Operator: ==
      • Wartość: „Count Of”
        • Tabela: „Global Variable”
          • Zmienna: L
    • Kiedy warunek zostanie spełniony, to działanie uruchomi ponownie wbudowany system zakańczania gry w danym trybie. Ponieważ licznik będzie wskazywał 0, tryb gry natychmiastowo zakończy rozgrywkę i wygeneruje wszystkie elementy występujące standardowo po zakończeniu meczu.
      • Działanie: „Enable Built-in Game Mode Completion”

Debugowanie waszego skryptu

Możecie skorzystać z Inspektora Warsztatu po stworzeniu skryptu, aby podejrzeć, jak będzie wykonywany w grze, sprawdzić, które działania i warunki są aktywne i wychwycić wszelkie błędy.

Aby uruchomić Inspektor Warsztatu:

  1. Rozpocznijcie mecz oparty na stworzonym przez was skrypcie.
  2. Wciśnijcie Esc.
  3. Wciśnijcie Otwórz debugger skryptu.
  4. Wciśnijcie WłączTa funkcja nie jest domyślnie włączona.

Inspektor Warsztatu składa się z kilku elementów:

  • Wpis: To stąd dowiedzie się, co się dzieje
  • Komentarz: Tutaj wyświetlany jest komentarz powiązany z regułą.
  • Warunek: Lista warunków, które muszą zostać spełnione, aby działanie mogło być wykonane.
  • Działanie: Działania, które zostały wykonane.
  • Suwak czasu: Dzięki niemu możecie cofać się i przechodzić do przodu wykonywanego skryptu.

Udostępnianie waszego skryptu

Stworzyliście fantastyczny skrypt, czas więc podzielić się nim ze światem (albo ze znajomymi). Będziecie mogli to zrobić przez kolejne sześć miesięcy. Wasze skrypty mogą być wykorzystywane na dowolnej platformie, niezależnie od tego, na której zostały stworzone.

Aby udostępnić skrypt:

  1. Kliknijcie Graj > Wyszukiwarka gier > Stwórz > Ustawienia > Udostępnij .
  2. Kliknijcie Kopiuj.
  3. Prześlijcie innym swój odnośnik!

Otwieranie skryptu

Jeżeli ktoś udostępnił skrypt, z którego chcielibyście skorzystać:

  1. Kliknijcie Graj > Wyszukiwarka gier > Stwórz > Ustawienia > Importuj .
  2. Wprowadźcie odnośnik.
  3. Kliknijcie OK.

Wskazówki

  • Dostęp do Inspektora będzie łatwiejszy, jeżeli przypiszecie mu osobny klawisz. Aby to zrobić, kliknijcie Esc > Opcje > Sterowanie. Przewińcie następnie w dół, aż zobaczycie pozycję „Otwórz Inspektor Warsztatu” i przypiszcie klawisz.
  • Inspektor Warsztatu nie tylko powie wam, co się stało, ale także – co się nie stało (i dlaczego)!
  • Nie zapomnijcie o szablonach trybów gry! Być może znajdziecie tam gotowe ustawienia i nie będziecie musieli wszystkiego wymyślać od początku.
  • Jeżeli zdarzenie nie przebiega tak, jak powinno, być może „Event Player” wykonuje już listę działań. Przyjrzyj się działaniom „Wait” w twojej regule, w szczególności jeżeli którekolwiek z nich ma ignorować warunki.
  • Aby wybrać konkretną lokację na mapie, wykorzystacie wartość „Vector” i kliknijcie ikonę kamery.
  • Wartość „Has Spawned” jest przydatna tylko, jeśli zależy wam, aby logika zadziałała po tym, jak gracz zaczął grać bohaterem.
  • Jeżeli chcecie, aby wasze reguły były stosowane wyłącznie po fazie przygotowań i zbierania bohaterów, użyjcie wartości „Is Game In Progress”.
  • Przypisywanie wartości zmiennej i sprawdzanie jej w Inspektorze Warsztatu to najprostszy sposób, żeby zrozumieć, co wartość ta zwraca podczas gry.
  • Ostatni utworzony efekt lub ikonę możecie przechowywać w zmiennej „Player Variable”, korzystając z wartości „Last Created Entity”. Pozwala wam to na późniejsze odwołanie się do tego obiektu, jeżeli chcecie go zniszczyć.
  • Łączenie wartości „Filtered Array” z wartościami takimi jak „All Players On Objective” lub „Players Within Radius” umożliwia wam łatwe odfiltrowanie graczy, którzy spełniają określone kryteria (są martwi, żywi, mają aktywne pewne efekty itp.).
  • Jeżeli chcecie stworzyć rozgałęzione drzewa zachowań, możecie użyć działania „Skip If”, dzięki któremu wasz skrypt pominie dowolną liczbę działań, gdy zostanie spełniony określony warunek. W takiej sytuacji konieczne może się okazać dodanie do pominiętych działań działania „Abort”, aby uniknąć przetwarzania obu gałęzi.
  • Zacznijcie wpisywać nazwę poszukiwanego elementu w rozwijanym menu, aby przefiltrować jego zawartość.
  • Jeżeli jednym z wymaganych parametrów wybranej przez was wartości jest tabela, a wartość ta jej nie otrzyma, przetworzy dane wejściowe tak, aby stworzyć z nich tabelę jednoelementową.
    • W drugą stronę działa to podobnie. Jeżeli jednym z wymaganych parametrów wybranej przez was wartości są dane w formie pojedynczego elementu, a wartość ta otrzyma zamiast tego tabelę, wykorzysta wyłącznie element z pozycji 0, który znajdzie w tej tabeli.
  • Dzielenie tego, nad czym pracujecie, na różne działania i warunki pomoże wam szybciej odnaleźć te elementy, które nie działają tak, jak byście chcieli.
  • Jeżeli nie jesteście pewni, co robi dane działanie, wartość lub dane wejściowe, najedźcie na nie kursorem (na PC) lub wybierzcie „Pokaż szczegóły” (na konsolach), aby przeczytać objaśnienie.
  • Zawsze uzupełniajcie sekcję komentarza, aby wiedzieć, za co odpowiada wasza reguła!
  • Często testujcie swoje skrypty!