Jump to content

návod [ARMA3] Základy SQF


Recommended Posts

  • Majitel

Zdravíčko přátelé - pokud hrajete Armu 3 (případně jiné Arma tituly) jistě dobře víte o scriptovacím jazyku SQF, na kterém je hra kompletně postavená. Veškerý funkční content je psán v tomto jazyce a dá se s ním vyčarovat cokoliv si představíte. Pro mě je Arma 3 takový sandbox, ve kterém si vytvářím a realizuje nápady a myšlenky herních typů - engine nabízí kvalitní modely postav, objektů i terénu. Dá se říct, že si v Armě 3 můžete vytvořit svou vlastní hru.

Spoiler

Ukázky mých výplodů:

https://steamcommunity.com/sharedfiles/filedetails/?id=176318250 (Survivor - rychlá střílečka na vesnici)
https://steamcommunity.com/sharedfiles/filedetails/?id=186388823 (SHOA - RTS na způsob Men of War)
https://steamcommunity.com/sharedfiles/filedetails/?id=278701081 (Anti Air Arcade - arkádová destrukce nepřátelských letadel)
https://steamcommunity.com/sharedfiles/filedetails/?id=756203516 (Waiting time - cinematic scéna)
https://steamcommunity.com/sharedfiles/filedetails/?id=1420857501 (Curway: Aegis - vylepšená verze RTS systému SHOA)

BIWiki

Veškerou dokumentaci, podklady a zdroje najdete na jednom místě - https://community.bistudio.com

Jsou tam rozepsané a popsané veškeré nativní funkce enginu, seznamy objektů, zbraní, vozidel a dalších zdrojů. Lze tam najít kompletní informace pro jakýkoliv druh příkazu, řešení, či návrhu. Bez tohoto se při scriptování v SQF určitě neobejdete.

Základy SQF

SQF je jednoduchý jazyk. Jakákoliv logika je defakto uložená v proměnné a celý interpreter jen pracuje s těmito proměnnými. Pokročilé vysvětlení zde.

Datatypy

Každá proměnná v jazyce SQF má vlastní způsob deklarace (a defakto automatické inicializace). Veškeré číselné hodnoty jsou podpultové floaty (tedy desetinná čísla), texty jsou stringové řetězce (a lze je rozebrat na bajty - ve formě číselných hodnot) - tedy cokoliv mezi uvozovkami "text", pole jsou jednoduché soustavy jakýchkoliv proměnných deklarovaný jako [obsah,obsah,obsah] a kód je cokoliv mezi závorkami {code}. Existují ještě speciální typy proměnných, jako například displayNull, controlNull, namespace, configNull, grpNull, locationNull, taskNull, objNull, scriptNull a pár dalších.

Deklarace a inicializace probíhají ve stejném kroku a to při přiřazení hodnoty k proměnné, proměnné mohou měnit typy i hodnoty (jedinou výjimku tvoří kód prohnutý funkcí compileFinal - taková proměnná se zabije až se zabitím namespace, ve kterém pracuje - zůstává konstantní - vysvětlíme si později).

Codespace

SQF kód lze praktikovat takřka kdekoliv v enginu. Jedinou výjimku tvoří config, ve kterém pracujeme s C strukturami pro definice tříd a jejich vlastností. Celý engine hry funguje (a je postavený) na SQF - všechny kampaně, mise, addony a další komunitní obsah, obsahuje více, či méně prvků SQF.

Kód se dá psát v Eden editoru (ve spínačích - triggerech), .sqf souborech ve složce mise/kampaně/addonu nebo v debug konzoli. Mnoho cheater řešení dříve užívalo exkluzivně děr v SQF interpreteru pro získání kontroly nad voláním funkcí za běhu - a byli psány celé v SQF.

Lokální / globální proměnná

SQF chápe lokalitu proměnných základně jen ve dvou bodech scope lokální a globální. Globální proměnná je deklarována s jakýmkoliv názvem, který se neshoduje s názvem nativní funkce, či již jiné deklarované globální proměnné. Lokální proměnná se deklaruje a volá s podtržítkem před názvem, spadá pod scope ve kterém je deklarována:

globalniPromenna = 1; //Globální číselná proměnná

func_cistaFunkce = //Globální proměnná obsahující kód
{
	_lokalniPromenna = 2; //Spadá pod scope kódu func_cistaFunkce
};

Hello World

private ["_text"]; //Moderní (volitelná) deklarace lokální proměnné - kód se bez tohoto plně obejde
_text = format["Hello world, %1", profileName]; //Vytvoření textu "Hello world, jméno-hráče"

hint _text; //Vypsání textu na obrazovku (hint)

Struktura kódu

Každý příkaz, či operace musí být ve všech případech oddělena středníkem (;). Kód se může psát v jednom řádku (oddělený středníky) nativní funkce mohou být krmeny dvěma způsoby parametrů - před a za funkcí:

player setPos [0,0,0]; //Příklad nativní funkce s před-za single parametry (před-odkaz na objekt hráče ; za-pozice hráče XYZ v poli)

_stav = linearConversion //Deklarace lokální proměnné s hodnotou z outputu funkce linearConversion, která má jen multi-parametry za sebou v poli
  [ //Pole
  	0, //Výchozí bod konverze Z
  	60, //Výchozí bod konverze Do
  	time, //Progress konverze
  	0, //Konverzní bod Z
  	100 //Konverzní bod Do
  ]; //při time=15 je výsledek 25

Scheduled/unscheduled

SQF engine pracuje ve dvou prostředích. To hlavní, ve kterém poběží váš kód většinu času (resp. vy budete většinu času psát kód pro tento environment) a druhý real-time, na který engine počká před vykreslením frame. Při volání funkcí pomocí call se prostředí dědí od volajícího. Pokud ve scheduled prostředí voláme jinou funkci, spustí se také ve scheduled prostředí (a volající čeká na výsledek - neprovádí další logiku). Pokud je funkce volána z unscheduled prostředí, také bude pracovat v unscheduled. Voláním funkce pomocí spawn volanou funkci vždy spustí v scheduled prostředí. Unscheduled prostředí si můžeme vynutit trikem za použití funkce isNil.

  • Scheduled (a k němu vázaný scheduler) environment je rozhraní, ve kterém mohou scripty běžet neustále, ve smyčce, nikdy nekončící, případně i vytěžující. Běží na pozadí vykreslování, engine na ně nečeká, případně je i pozastavuje v momentě slabšího výkonu. Scheduler je systém, který se stará o rozložení dostupného výpočetního výkonu a snaží se rozdat mezi všemi scripty rovným dílem. Může se stát, že váš script poběží jen v jednom frame z deseti, při dobrém výkonu poběží v každém frame. Spouštění scriptů v scheduled environmentu může být několik framů odloženo a při spuštění několika scriptů zároveň se tyto scripty reálně spustí nezávisle na sobě, i s rozdílem několika framů. Scheduled environment je defakto všechno spuštěné ze souboru, pomocí execVM nebo spawn. 
  • Unscheduled environment je pro změnu rozhraní, ve kterém engine zpracovává exkluzivně skripty až do konce. Nekonečné smyčky jsou schopné bricknout celou hru a nesmí být v tomto environmentu spouštěné. Také všechny odkládací funkce (sleep, waitUntil) v tomto prostředí nefungují, vyhodí chybu, či jsou ignorovány. Jen v tomto prostředí máte jistotu, že se vaše scripty spustí okamžitě, projdou veškerou logiku za sebou tak jak mají a vše stihnou v jednom frame - scheduler na základě výpočetní náročnosti takového scriptu poté pozastaví, či omezí spuštění jiných skriptů ve scheduled prostředí.

Kam psát skripty?

  • Většinou ze začátku vám bude stačit soubor init.sqf ve složce s misí (Dokumenty/Arma 3/missions/). Případně deriváty initPlayerLocal.sqf a initServer.sqf. Existují i další speciální názvy souborů, které engine spouští na základě různých událostí, to už dohledáte na BIWiki. 
  • Dalším způsobem psaní scriptů pro mise je přímo v editoru. Stačí hodit kamkoliv spínač (trigger), podmínku mu hodit jen true a do pole Po aktivaci vepsat kód (můžete si ho připravit v editoru jako VS Code). Případně do pole inicializace jednotek.
  • Pro dočasná, či jednorázová spuštění kódu lze využít i debug konzoli, která je vždy dostupná editoru. Případně lze aktivovat i pro finální verzi pomocí atributů mise. Takto spuštěné skripty se nikam neukládají, a jsou spouštěny jen pro aktuální relaci mise.

Na závěr

Projděte si dokumentaci, experimentujte a tvořte. Pomocí SQF se dají vytvářet nehorázné blbosti a kreace. Vaším nejlepším přítelem je i fakt, že vše publikované pro Armu 3 podléhá open-source licenci, můžete číst všechny skripty ostatních autorů, vykrádat jejich obsah a učit se z nich. Najděte si na workshopu zajímavou misi, či addon - s pomocí programu PBO Manager můžete rozbalit balík, který obsahuje veškeré zdroje, soubory a skripty, který tento addon nese, tento program vám bude i velkým pomocníkem, až budete hledat textury základní hry - můžete si pomocí jej rozbalit i základní soubory hry a čerpat informace z nich (kampaně, objekty, funkce, textury)

Úkol pro vás: Prohledejte BIWiki a zkuste si najít další event scripty, se kterými se dá pracovat. Vytvořte misi, ve které máte za úkol ukrást nepřátelské vozidlo - zkuste se držet podobného stylu jako v misích základní hry - využívejte tasky, naučte se s nimi pracovat ve scriptu, relevantní dokumentaci vyhledejte na BIWiki. Naučte se spojit prvky editoru se scripty, využijte spínače pro aktivování scriptovacích funkcí (nativní funkce call nebo spawn).

Edited by ffredyk
Vylepšení čitelnosti
Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...