ZINC

Содержание:

"Hello World!"

Zinc, это хорошо для развития вашего мозга, подобно тому как Zinc, это хорошо для... разработки вашего проекта. Давайте взглянем на традиционный пример:
library HelloWorld
{
    function onInit()
    {
         BJDebugMsg("Hello World");
    }
}
К лучшему или худшему, Zinc полностью основан на использовании библиотек и мы начинаем с объявления библиотеки HelloWorld. Наперекор vJass, у нас нет необходимости явно указывать функцию инициализации библиотеки по ее имени, она будет автоматически вызвана если существует и всегда имеет имя onInit. Функция инициализации не должна принимать аргументов или возвращать какое-либо значение. В нашем случае, внутри функции инициализации просто вызывается функция BJDebugMsg для вывода сообщения на экран.

99 Бутылок пива

library Bottles99
{
    /* 99 Бутылок пива
       Выводит текст песни: http://99-bottles-of-beer.net/lyrics.html
    */
    function onInit()
    {
        string bot = "99 bottles";
        integer i=99;
        while (i>=0)
        {
            BJDebugMsg(bot+" of beer on the wall, "+bot+" of beer");
            i=i-1;
            if      (i== 1) bot = "1 bottle";
            else if (i== 0) bot = "No more bottles";
            else            bot = I2S(i)+" bottles";
            if(i>=0)
            {
                BJDebugMsg("Take one down and pass it around, "+bot+" of beer on the wall.\n");
            }
        }
        BJDebugMsg("Go to the store and buy some more, 99 bottles of beer on the wall.");
    }
}
Этот пример показывает немного больше синтаксических элементов. Мы можем увидеть if и while конструкции, а так же {} ограничивающие блоки кода. Вы можете заметить, что {} являются опциональными и могут быть опущены в случае, если выполняется не более одной инструкции. В примере так же есть комментарии. Можете заметить, что в Zinc отсутствует конструкция elseif, заменяя ее вложенным if.

Факториал

library Factorial
{
    /*
    *   Вычисление факториала числа
    *
    */
    public function Factorial(integer n) -> integer
    {
        integer result=1, i;
        for ( 1 <= i <= n)
            result = result * i;
        return result;
    }
}
Это простой код функции, которая вычисляет факториал числа n, то есть произведение чисел 1*2*3*...n.
Обратите внимание на конструкцию цикла. Фактически, он означает повторение операций для всех числе i между 1 и n.
Так же обратите внимание на две целочисленные переменные, объявленные в одной и той же строке.
Поскольку функцию вычисления факториала, возможно, потребуется вызвать из другой библиотеки, мы объявили ее публичной.

Простая способность

library InstantKill
{
    /*
    *   Мгновенное убийство !
    *   Эта способность убивает цель!
    *
    */
    constant integer SPELL_ID = 'A001';

    function onSpellCast()
    {
        KillUnit(  GetSpellTargetUnit() );
    }

    function spellIdMatch() -> boolean
    {
        return (GetSpellAbilityId() == SPELL_ID);
    }

    function onInit()
    {
        trigger t = CreateTrigger();
        TriggerAddAction(t, function onSpellCast);
        TriggerAddCondition(t, Condition(function spellIdMatch) );
    }
}
Это простая способность, которая будет мгновенно убивать юнита.
Вы могли заметить, что константа внутри библиотеки была объявлена без использования глобального блока.

Add​Special​Effect​Timed

library TimedEffect requires TimerUtils
{
    /*
    *   Добавление эффекта на точку и последующее уничтожение
    *
    */
    struct data
    {
        effect fx;
    }
    function destroyEffect()
    {
        timer t=GetExpiredTimer();
        data dt = data( GetTimerData(t));
        DestroyEffect(dt.fx);
        ReleaseTimer(t);
    }

    public function AddSpecialEffectTimed( string fxpath, real x, real y, real duration)
    {
        timer t=NewTimer();
        data  dt = data.create();
        dt.fx = AddSpecialEffect(fxpath, x, y);

        SetTimerData(t, integer(dt));
        TimerStart(t, duration , false, function destroyEffect);
    }
}
Данная библиотека содержит функцию AddSpecialEffectTimed, просто для примера.
Здесь TimerUtils, это vJass библиотека, что не является проблемой для Zinc.
Обратите внимание, что все члены библиотеки приватные по умолчанию, что подразумевает отсутствие доступа к структуре data и функции destroyEffect извне.
Публичные функции в Zinc устроены несколько иначе чем в vJass - префикс к имени функции в виде имени библиотеки добавлен не будет, следовательно, для вызова публичной функции из этой библиотеки вы используете имя AddSpecialEffectTimed, а не TimedEffect_AddSpecialEffectTimed.
Как вы можете видеть, преобразование типов работает так же как и в vJass.
Так же, объявление переменной типа структуры подчиняется тем же правилам что и локальные/глобальные переменные.

Count​Units​In​Group

library CountUnitsInGroup
{
    integer count;
    public function CountUnitsInGroup( group g ) -> integer
    {
        count = 0;
        ForGroup(g, function() { count = count + 1; });
        return count;
    }
}
Данный пример заменяет аналогичную функцию из blizzard.j. В качестве упражнения, я приглашаю вас найти и посмотреть реализацию этой функции от Blizzard на Jass.
Здесь мы используем анонимные функции (о них позже), которые позволяют вам объявлять новые функции на ходу (что требуется очень часто в подобных случаях). Тело анонимной функции (в данном случае инструкция count = count + 1) не является частью логики объемлющей функции CountUnitsInGroup.

Содержание
Чтобы оставить комментарий, пожалуйста, войдите на сайт.