Тактика выжженной земли. Основы работы в редакторе Blitzkrieg Map Editor, часть 2
Редактор: blitzkrieg Map Editor Где взять: Устанавливается вместе с игрой Возможности: 100% игровых Сложность освоения: Выше средней Документация: Устанавливается вместе с игрой В прошлой статье мы нарисовали ландшафт карты и расставили юниты. Но все объекты на уровне застыли без движения. Пора вдохнуть жизнь в это сонное царство. В чем нам помогут скрипты. Сегодня мы разберем логику написания скриптов для " Блицкрига " и подкрепим теорию практикой — рассмотрим на конкретных примерах основные группы скриптов. Теория Для написания скриптов в “Блицкриге” используется популярный у разработчиков компьютерных игр язык Lua. Более подробную информацию о нем вы можете найти на сайте www.lua.org. Язык довольно сложный, но с очень широкими возможностями. С помощью Lua можно писать нестандартные скрипты, не пользуясь шаблонами, которые написали разработчики игры. __ Именно Lua использовали авторы Neverwinter Nights , чтобы оживить мир игры. Статья, посвященная написанию скриптов в Neverwinter Nights, была опубликована в январском номере “Игромании” за этот год. Если хотите более детально изучить язык, обратитесь к этому материалу. Мы же рассмотрим, как работать с Lua в “Блицкриге”. Как ни странно, основные сложности возникают не при написании скрипта, а при его активации в игре. К сожалению, в игровом редакторе нет встроенного редактора скриптов. Поэтому придется писать их при помощи сторонних инструментов. Откройте файл data.pak , находящийся в папке blitzkrieg\Data , с помощью WinRAR (должен быть установлен WinRAR версии 3.0 или выше). Из папки Scenarios\Script извлеките любой файл с расширением *.lua.
-Скрипт, открытый в “Блокноте”
Откройте файл с помощью Notepad и сотрите все написанное. Теперь можно писать свой скрипт. Если скрипт написан, нужно активировать его в редакторе. Для этого зайдите в меню Map\Script и в появившемся окне укажите месторасположение скрипта. __ Теперь что касается непосредственно написания скрипта. Несмотря на кажущуюся сложность, структура “тела” любого скрипта стандартна. В основе его работы лежит принцип проверки условий. Скрипт состоит из набора самых разнообразных функций, которые отвечают за действия различных игровых объектов. Например, функции могут определять перемещение юнитов в указанную зону, проверять количество юнитов в отряде или изменять погодные условия. Все скрипты для конкретного уровня, даже если они никак не связаны друг с другом, нужно писать в одном файле — это связано с особенностями Lua. Правда, иногда это приводит к путанице. Все функции и их назначение перечислены в мануале в разделе " Язык сценариев ". Создание групп Через скрипты нельзя обращаться к отдельным юнитам — только к группам, заданным в редакторе. Если вы хотите определить действия одного конкретного юнита, вам просто нужно сделать группу, в которую будет входить один юнит. Чтобы сформировать группу, в редакторе зайдите на панель Reinforcement Groups. Нажмите на кнопку New Group и в появившемся поле впишите идентификационный номер группы (как устанавливать идентификационные номера юнитам, мы разобрали в первой части статьи). Этот номер будет использоваться в скриптах. Чтобы добавить к группе юнит или несколько юнитов, нажмите на кнопку Add Group With scripted и впишите в появившемся поле идентификационный номер юнита. Одной группе можно дать одновременно несколько номеров. Иногда в скриптах приходится обращаться к той или иной области карты. Но в скрипте нельзя просто написать, что, например, группа 144 должна атаковать базу. Базу тоже надо как-то определить. Для этого существуют сценарные области — это просто локации на карте, которым в редакторе присвоены номера или имена. Чтобы создать сценарную область, зайдите на панель Map Tools и щелкните по Script Area Tool. Выберите форму сценарной области — Rectangle ( Прямоугольник ) или Circle ( Круг ) — и, удерживая левую кнопку мыши, растяните область до нужного размера. Теперь задайте имя области (можно просто вписать номер) в окошке рядом и нажимайте кнопку Ok.
- Обязательно пользуйтесь мануалом. В нем находятся описания всех функций
Имя должно появиться в списке на панели Map Tools. Практикум Научиться программировать на Lua на основе только одной статьи нельзя. Понадобилось бы не менее десяти материалов по 5-6 страниц каждый. Но для того, чтобы “оживить” любой уровень “Блицкрига”, вам и не нужно уметь программировать на Lua. Достаточно иметь перед глазами примеры основных групп скриптов и уметь изменять их в зависимости от ситуации. Рассмотрим основные виды скриптов на примере одного большого скрипта (он включает несколько мелких скриптов) из миссии, которую разработчики почему-то исключили из игры. Скрипты данной миссии сохранились в ini-файлах “Блицкрига”. Скрипт описывает защиту областей Podol и Plazdarm. Цель — уничтожить все юниты с идентификационным номером 21, 201, 210._  local; num = GetNUnitsInScriptGroup(21) + GetNUnitsInScriptGroup(201) + GetNUnitsInScriptGroup(210);  if; ( num <= 0) then  RunScript;( “Victory”, 4000);  Suicide;();  end;  end; _ В этой части скрипта задаются условия победы. Сначала определяется локальная переменная num , через которую в дальнейшем скрипт обращается к группе юнитов, имеющих идентификационные номера 21, 201, 210. Затем задаются условия проверки. Если локальная переменная num станет меньше или равна нулю (это произойдет, когда в отрядах противника не останется ни одного юнита), выполняется скрипт Victory ( Победа ). Этот скрипт будет выполняться каждые 4 секунды. Когда условие выполнится, скрипт отключится функцией Suicide._  function; TobeDefeated()  if; (( GetNUnitsInArea(1, “Plazdarm”) > 1) or ( GetNUnitsInArea(1, “Podol”) > 1)) then  Loose;();  Suicide;();  end;  end; _ Данный участок скрипта задает условия поражения. Если вражеские юниты находятся на сценарной области с названиями (про сценарные области смотрите на врезке) Plazdarm или Podol, игроку засчитается поражение._  function; Victory()  Win;(0);  Suicide;();  end; _ Данный участок скрипта запустится после выполнения первого условия, описанного выше._
_
- Чтобы загрузить скрипт в редактор, достаточно просто прописать название скрипта в поле Set Script File
Точно указывается, какая сторона победит. В скобках оператора Win стоит значение ноль, которое определяет, кому будет засчитана победа. Нулем в игре обозначается сторона, за которую играете вы._  function; Attack0() _ _  Cmd;(3, 20, GetScriptAreaParams( “Podol” ) );  Suicide;();  end;  function; Attack1()  Cmd;(3, 21, GetScriptAreaParams( “Podol” ) );  Suicide;();  end;  function; Attack2()  Cmd;(3, 201, GetScriptAreaParams( “Plazdarm” ) );  Suicide;();  end; _ Скрипт атаки. Все внимание на то, что прописано в скобках рядом с операторами. Цифра “3” рядом с оператором Cmd обозначает, какую команду должен выполнить юнит. Полный список команд вы найдете в мануале, устанавливаемом вместе с игрой. В данном случае команда — штурм ( Attack ) указанной точки. Далее в скрипте указано, какая группа какую локацию отправится штурмовать._  function; Attack3()  if; ( (GetNUnitsInArea(1, “Okuninovsky most”) > 0) or ( GetNUnitsInScriptGroup(201) <= 2) ) then  Cmd;(3, 210, GetScriptAreaParams( “Plazdarm” ) );  Suicide;();  end;  end; _ Еще один скрипт атаки, чуть более сложный. Проверка месторасположения и количества юнитов в разных группах. Обратите внимание на строку GetNUnitsInScriptGroup(201) <= 2. Когда количество юнитов в группе со сценарным номером 201 будет меньше или равно двум, атаку начнет группа со сценарным номером 210. ___  function; Init()  RunScript;( “ToWin”, 3000);  RunScript;( “TobeDefeated”, 3000);  RunScript;( “Attack0”, 1000);  RunScript;( “Attack1”, 300000);  RunScript;( “Attack2”, 10000);  RunScript;( “Attack3”, 5000);  end; _ Последний скрипт, запускающий предыдущие скрипты с указанной периодичностью. Обратите внимание на функцию Init(). При запуске карты сразу запускается эта функция, и уже через нее вызываются все проверочные функции и установки. *** На основе рассмотренного нами скрипта вы можете создавать скрипты движения и атаки практически любой сложности для собственных уровней. Достаточно просто скопировать текст скрипта-исходника и изменить в нем некоторые параметры, чтобы получился совершенно новый скрипт. P.S. Выражаем благодарность всем сотрудникам Nival Interactive и особенно Александру Винникову за помощь, оказанную в написание статьи.