Gothic I Gothic II Gothic III Risen Modding
A je tu konečně velká kapitola, která je programátorsky mnohem zajímavější než předchozí dvě, ze kterých leda tak rozbolí hlava. Funkce je mocná věc, se kterou má programátor mnohem větší svobodu psaní scriptu a celkově přináší strašně moc nejrůznějších výhod. Funkci si představte třeba jako ševce. Dáte mu potřebné suroviny a on vám z nich vytvoří boty. Navíc vám může vrátit různé druhy botů podle toho jaké mu dáte suroviny a jaké máte požadavky. Ukážeme si jak takového ševce (funkci) vytvořit a jak si pak od něj vyžádat nějaké ty boty (proměnnou). Koukněte na tuhle funkci:

func int soucetCisel(var int cislo1, var int cislo2)
{
    return cislo1 + cislo2;
};

Tato primitivní funkce pouze sečte proměnnou cislo1 a cislo2 a vrátí výsledek. Funkce je to možná zbytečná, ale pro popsání ideální. Klíčové slovo func označuje že se jedná o funkci. Dále se musí uvést typ proměnné, kterou má funkce vracet (zatím jsme si říkali o int, string a float, ale je jich víc). Pokud nemusí funkce nic vracet, dosaďtě místo typu proměnné klíčové slovo void. Za označením funkce a typem návratové hodnoty následuje jméno samotné funkce. Pravidla pro pojmenovávání funkcí jsou stejná jako u proměnných. Do kulatých závorek se pak vkládají typy proměnných, se kterými může funkce dále pracovat (to jsou ty suroviny, co švec potřebuje pro výrobu bot). Můžete jich požadovat kolik chcete... klidně i žádnou. Samotné tělo funkce ve složených závorkách pak může obsahovat jakýkoliv kód. Pokud není funkce typu void, musí ještě pokaždé vrátit nějakou hodnotu stejného typu, jako je uvedena v záhlaví funkce. K tomu slouží klíčové slovo return, za které dosadíte vracenou hodnotu. Radši ukážu pár dalších funkcí...

Správně napsané funkce

func void neudelejNic()
{

};

func string vratUrovenKopace(var int levelDolovani)
{
    var string text;

    if (levelDolovani < 10)
    {
        text = "Naprostá nula!";
    }
    else if (levelDolovani < 40)
    {
        text = "Začátečník";
    }
    else if (levelDolovani < 70)
    {
        text = "Pokročilý";
    }
    else if (levelDolovani < 95)
    {
        text = "Expert";
    }
    else
    {
        text = "Guru mezi kopáči!";
    };

    return text;
};

Špatně napsané funkce

func int vratDruhouMocninu(var int cislo)
{
    var int vysledek;
    vysledek = cislo * cislo;
};

func void UpravText(var string text)
{
    // Nějaká úprava proměnné "text"

    return text;
};

A jak takovou funkci pak tedy zavolat (využít)? Zavolám například funkci, která mi vrátí úroveň toho kopáče. Ještě jsem ale do teď tajil, že skoro vše kromě zakládání proměnných a funkcí se musí už psát do nějaké funkce, aby to fungovalo. Takže od teď budu psát všechen kód, který tam patří do funkce nazvané třeba main.

Volání funkce na zjištění levelu kopáče

func string vratUrovenKopace(var int levelDolovani)
{
    var string text;

    if (levelDolovani < 10)
    {
        text = "Naprostá nula!";
    }
    else if (levelDolovani < 40)
    {
        text = "Začátečník";
    }
    else if (levelDolovani < 70)
    {
        text = "Pokročilý";
    }
    else if (levelDolovani < 95)
    {
        text = "Expert";
    }
    else
    {
        text = "Guru mezi kopáči!";
    };

    return text;
};

func void main()
{
    var string urovenKopace;
    urovenKopace = vratUrovenKopace(82);

    Print(urovenKopace); // Zabudovaná funkce pro vypsání textu
};

Celý tento kód by měl vypsat akorát text "Expert". Pokud chcete volat funkci, musíte do ní vždy vložit všechny požadované parametry. Na oplátku vám pak vrátí proměnnou uvedeného typu (připomínám, že pokud je typu void, nic nevrací). Pamatujete z druhé kapitoly na příklad s Diegem a zvyšováním obratnosti? Přepíšeme ho do funkcí a přidáme další možnosti...

const int maximalniObratnostDiego = 200;
const int akrobacie = 90;

var int obratnostHrdiny;
var int zkusenostniBodyHrdiny;
var int umiHrdinaAkrobacii;

func string zvysObratnost(var int prirustek, var int limit)
{
    var string zprava;

    if (zkusenostiBodyHrdiny >= prirustek)
    {
        if (obratnost + prirustek <= maximalniObratnostDiego)
        {
            obratnostHrdiny = obratnostHrdiny + prirustek;
            zkusenostniBodyHrdiny = zkusenostniBodyHrdiny - prirustek;

            if (obratnost >= akrobacie)
            {
                umiHrdinaAkrobacii = true;
                Print("Naučil jsi se akrobacii!");
            };

            // Funkce ConcatString spojí 2 texty
            // a funkce IntToString převádí číslo na text
            zprava = ConcatStrings(ConcatStrings("Tvá obratnost se zvýšila o ", IntToString(prirustek)), " bodů obratnosti!");
        }
        else
        {
            zprava = "Už tě nedokážu dál učit.";
        };
    }
    else
    {
        zprava = "Nemáš dostatek zkušeností, abych tě mohl trénovat!";
    };

    return zprava;
};

func void main()
{
    var int pozadovanaObratnost;
    var string odpoved;

    // Hrdina se dá do řeči s Diegem a zvolí si,
    // kolik obratnosti se chce naučit

    odpoved = zvysObratnost(pozadovanaObratnost, maximalniObratnostDiego);

    // A diego poté řekne odpověd,
    // kterou má uloženou v proměnné odpoved
};

V dialogu využíváme obecnou funkci, která je nezávislá na tom, s kým hrdina mluví a dala by se používat při každým učení obratnosti u každého učitele. Ušetříme tím docela hodně kopírování kódů nemyslíte?

Velká poznámka na závěr. Pokud založíte proměnnou mimo funkci, platí všude ve všech scriptech... říká se jí tzv. globální proměnná. Ale pozor. Obsah globální proměnné se zároveň i uloží do savů hry, tak nezakládejte globálních proměnných zbytečně víc než je potřeba. Naopak proměnné, které založíte uvnitř funkce mají platnost pouze v té funkci. A mám i jednu drobnou poznámku na závěr. Uvnitř funkce nelze vytvořit další funkci. Nějaké vnořování jako u podmínek tu tedy praktikovat nejde...

Od teď budu počítat s tím, že základy funkcí už zvládáte a další kapitoly je začnu naplno využívat.
Google+