Funkce v ArmA: Armed Assault
Princip je jednoduchý. V podstatě se vytvoří kód (po sobě jdoucí
příkazy ohraničené složenou závorkou), kterému přidělíme nějaký
název. Kdykoliv pak po zadefinování je možné tento kód zavolat a tím
v podstatě zavolat naši funkci. Funkci lze navíc zavolat i s parametry,
což si ukážeme na následujícím příkladu:
// ----- CELO_Dopln_Naloz
// ----- doplneni naloze do vybavy objektu
// ----- @param object objekt, kteremu se ma pridat naloz do vybavy
CELO_Dopln_Naloz = {
_soldier = _this;
try {
if (isNil "_soldier") then {throw "neznamy objekt"};
if (!alive _soldier) then {throw "neni nazivu"};
if (!(_soldier isKindOf "Man")) then {throw "neni clovek"};
_soldier addmagazine "pipebomb";
} catch {
switch (_exception) do {
case "neznamy objekt": {
// -- chybny stav
};
case "neni clovek": {
_this addmagazinecargo ["pipebomb",1];
};
case "neni nazivu": {
// -- nezije, neni duvod pridavat naloz
};
default {
hint "neznama vyjimka";
};
};
};
};
Tento kód, který jsme si pojmenovali jako CELO_Dopln_Naloz je
možné kdykoliv po zadefinovaní za pomoci příkazu call nebo
spawn zavolat v závislosti na tom, zda chceme (call) či
nechceme (spawn) čekat na dokončení této funkce.
nul = player call CELO_Dopln_Naloz;
Naši funkci můžeme předávat parametry všech možných typů.
V předchozím příkladě šlo o objekt. Uveďme si teď příklad funkce,
která bude pracovat s více parametry předanými funkci jako pole.
// ----- CELO_Vysadek
// ----- necha vyskocit vsechny osoby z dopravniho prostredku
// ----- @param array seznam vojaku, ktere se maji vysazovat
// ----- @param object dopravni prostredek, ze ktereho se maji jednotky vysazovat.
// ----- @param integer casova prodleva mezi vysadkem
CELO_Vysadek = {
_soldiers = _this select 0;
_car = _this select 1;
_interval = _this select 2;
try {
if (isNil(_soldiers) or !(typeName _soldiers=="ARRAY")) then {throw "spatny parametr _soldiers"};
if (isNil(_car) or !(typeName _car=="OBJECT")) then {throw "spatny parametr _car"};
if (isNil(_interval) or !(typeName _interval=="SCALAR")) then {throw "spatny parametr _interval"};
{
if ((typeName _x=="OBJECT") and (_x in _car)) then {
unassignvehicle _x;
_x action ["EJECT",_car];
sleep _interval;
};
} foreach _soldiers;
} catch {
if (debug) then {
switch (_exception) do {
case "spatny parametr _soldiers": {
hint "spatne definovany prvni parametr pro CELO_Vysadek. Ocekavano je pole vojaku";
};
case "spatny parametr _car": {
hint "spatne definovany druhy parametr pro CELO_Vysadek. Ocekavan je dopravni prostredek.";
};
case "spatny parametr _interval": {
hint "spatne definovany treti parametr pro CELO_Vysadek. Ocekavan je casovy rozestup.";
}
default {
hint "neznama vyjimka";
};
};
};
};
};
// --- x tisic radku kodu
nul = [units soldier1,heli1,2] spawn CELO_Vysadek;
Jak je vidět, tak po spuštění se zadefinuje kód (neboli funkce
CELO_Vysadek, který o x tisíc řádků později zavoláme se třemi parametry
předanými v poli. Výsledkem bude, že všechny jednotky (respektive objekty)
ze skupiny, do které patří objekt soldier1 jsou vysazeny z objektu
pojmenovaného jako heli1 ve dvouvteřinovém intervalu. Skript ze kterého
došlo ke spuštění nečeká na dokončení a pokračuje v provádění
následujících příkazů (díky příkazu spawn).