При создании гулага, не многие знают, что практически всю настройку логики гулагов, можно производить в файле «script». Такой способ построения достигается за счёт динамических ltx. Попробую описать, каким образом это достигается. Я думаю, многие заметили в файлах с гулагами такую функцию:

--'------------------------------------------------------------------------
--' Dynamic ltx
--'------------------------------------------------------------------------
function load_ltx(gname, type)

return nil
end

Это именно та функция, которая и отвечает за динамические ltx. В данном случае, она отключена. Разберём простейший способ построения динамических ltx.

Создаём стандартным способом «smart_terrain» в файле «all.spawn» и гулаг в файле «gulag_уровень.script». Назначим ему имя, например «noobiki». Задаём ему несколько заданий. Например, зададим 3 кампа и двух уолкеров:

if type == "noobiki" then

                for i = 1, 3 do

                        t = { section = "logic@noobiki_kamp",
        idle = 0,
        prior = 8-i, state = {0,1},
        in_rest = "", out_rest = ""
        }
        table.insert(sj, t)
    end

                        for i = 1, 2 do

            t = { section = "logic@noobiki_walker_"..i,
                idle = 0,
                prior = 9-i, state = {0,1},
                in_rest = "", out_rest = ""
            }
            table.insert(sj, t)
                        end   
end

Так как мы собираемся использовать динамические ltx, то дальнейшая настройка заданий будет производиться не в конфигурационных файлах, а непосредственно в этом же файле. То есть в упомянутой выше функции «load_ltx». Для этого находим нужную функцию «load_ltx», и в ней создаём динамический ltx и прописываем требуемые схемы логики:

--'------------------------------------------------------------------------
--' Dynamic ltx
--'------------------------------------------------------------------------
function load_ltx(gname, type)

if type == "noobiki" then
    local ltx = "[logic@noobiki_kamp]\n"..
    "active = kamp@kakashki\n"..

        "[kamp@noobiki]\n"..
        "center_point = kamp\n"..

    "[logic@noobiki_walker_1]\n"..
        "active = walker@kakashki_1\n"..

    "[walker@noobiki_1]\n"..
    "path_walk = walk_1\n"..
    "path_look = look_1\n"..

                "[logic@noobiki_walker_2]\n"..
        "active = walker@kakashki_2\n"..

    "[walker@noobiki_2]\n"..
    "path_walk = walk_2\n"..
    "path_look = look_2\n"

return ltx
end

return nil
end

Где, кавычки обязательны, {\n} назначает новую строку в динамическом ltx, и {..} ставится для привязки строк между собой. В последней строке схем, двоеточие ставить не нужно, так как привязывать больше нечего. Переменная «ltx» может иметь любое другое имя.

Теперь создаём вэйпоинты путей, в файле «all.spawn», и можно смело идти проверять.

Одно из преимуществ динамических ltx - это пакетная настройка логики. Может, я не так выразился, но по ходу действий, я думаю вам станет ясно, что я имел ввиду. Например, нам нужно создать 8 уолкеров, с одинаковыми настройками логики, но при этом, разными поинтами путей. В статических ltx нам понадобится создавать 8 секций [logic]. Тоесть для каждого уолкера, своя секция логики. В динамических ltx, данную проблему можно решить функционально.

Делаем это так:

Создаём 8 уолкеров в функции "load_job". Обязательно с помощью счётчика "for-do":

     for i = 1, 8 do

     t = { section = "logic@noobiki_walker_"..i,
          idle = 0,
          prior = 9-i, state = {0,1},
          in_rest = "", out_rest = ""
     }
     table.insert(sj, t)

end

Кто ещё не знает, как это работает, то поясню. Создаётся переменная i, или любое другое имя. Назначается ей два, или три значения, (через запятую). Где:

    первое значение = какое число задаётся при первом цикле счёта;
    второе значение = при достижении или переполнении какого числа, остановить счёт;
    третье значение = какое значение прибавлять, при каждом цикле счёта.

Если третье значение не задаётся, то при каждом цикле счёта, прибавляется 1.

Переменной "section" задаётся "имя секции"+переменная i. В итоге, при каждом последующем цикле счёта, к имени секции будет приписываться в конце значение переменной i. Тоесть, "logic@noobiki_walker_1"; "logic@noobiki_walker_2"; "logic@noobiki_walker_3" и т.д.

В нашем случае, переменной "prior" задано значение 9-i, что делать не обязательно. Здесь при каждом цикле счёта, вычитается значение переменной i от числа 9. В итоге, при каждом последующем цикле, переменной "prior" задаётся значение на 1 меньше предыдущего.

Итак, уолкеров создали. Теперь нам нужно задать им всем логику действий. Создаём переменную ltx, которую мы будем использовать для динамических ltx. Для этого, подымаемся на самый верх файла, где прописано создание переменной t, и ниже прописываем:

local ltx = ""

Теперь, в функции "load_ltx" создаём ltx файл для нашего гулага:

function load_ltx(gname, type)
if type == "noobiki" then
    return ltx
end

return nil
end

Данным способом, мы возвращаем поиск секций логики, назад в функцию "load_job".

Теперь возвращаемся в функцию "load_job", и в секции нашего гулага, внутри счётчика "for-do" прописываем логику уолкерам. Выглядеть это будет так:

     for i = 1, 8 do

     t = { section = "logic@noobiki_walker_"..i,
          idle = 0,
          prior = 9-i, state = {0,1},
          in_rest = "", out_rest = ""
     }
     table.insert(sj, t)

     ltx = ltx.. "[logic@noobiki_walker_"..i.."]\n"..
                 "active = walker@noobiki_"..i.."\n"..

                 "[walker@noobiki_"..i.."]\n"..
                 "path_walk = walk_"..i.."\n"..
                 "path_look = look_"..i.."\n"

end

Где, так же как и в случае с переменной "section", приписывается в конец имён секций и путей, значение переменной i. В итоге получаем такие имена путей:

walk_1, look_1; walk_2, look_2; walk_3, look_3; и т.д.

Заметим, как мы прописали переменную ltx. Таким способом, мы при каждом цикле счёта, новую секцию логики пришиваем к секциям, пришитым к динамическому ltx при предыдущих циклах. Если прописать просто:

ltx = логика

То при каждом цикле счёта новая секция будет накладываться на предыдущую, что приведёт к нехорошим последствиям.
Ну и создаём соответствующие секции поинтов путей в файле all.spawn. И всё будет работать как часы.
Не забываем, при создании секций поинтов, к именам путей пришить имя смарт террэйна.
Продолжение следует.

Автор: Singapur22