Как я целый год делал карту для Warcraft III

Как я целый год делал карту для Warcraft III

Очень длинный и подробный текст-девлог о том, как я создавал с нуля карту для Warcraft 3, не имея в этом деле опыта и не пользуясь никакими гайдами. Может заинтересовать тех, кого влечёт к моддингу или даже геймдеву, поскольку создание карты или мода - всегда эдакий «игрострой» в миниатюре, позволяющий взглянуть изнутри на труд настоящих разработчиков и в чём-то его повторить. Попробую рассказать читателям про работу в игровом редакторе, описать логику своих действий и продемонстрировать, как абстрактная идея воплощается в нечто играбельное человеком без специальных навыков.

Этот текст – приведенный в читаемый вид дневник разработки, в котором я документировал свой прогресс. Для людей, разбирающихся в теме, материал может содержать немало нелепиц (как и сама карта). Это нормально: я не эксперт в играх, картах или моддинге. Воспринимайте как взгляд человека со стороны, который зашёл в чужой монастырь, потупил и вышел, сделав выводы.

Как молоды мы были

Warcraft 3 – игра, которая в представлении не нуждается. Всю дорогу фанаты клепали для неё самодельные («кастомные») карты, и как минимум про одну из них слышал каждый: это «DotA». Даже спустя годы, когда WC3 ушёл в забвение, на тематических сайтах не затухал движ и стабильно появлялись новые проекты.

Идея сделать собственную карту пришла мне лет в пятнадцать, когда мы с друзьями по вечерам после школы собирались в рандомной комнате Garena и запускали одну кастомку за другой. Перебрать удалось всё – от популярной в то время «Life in Arena» до какого-нибудь «Скользи, Губка Боб». Новые карты попадали в руки просто – мы смотрели, что хостят другие люди, и подключались к ним своей кодлой. Я был немного знаком с варкрафтовским редактором (WC3 – одна из первых игр моего детства, я ковырялся в ней еще на релизе), и многие кастомки поражали меня сложностью исполнения: некоторым мапмейкерам буквально удавалось сделать новую игру на движке Варкрафта.

В те времена и зародилась мысль о «Бандитских войнах». Вдохновила карта «Pimp my Peon», в которой привлекла идея динамичного PvP с использованием большого количества слабых дешёвых юнитов, получающих апгрейды по ходу игры. Захотелось сделать что-то похожее, и, хотя редактор я видел и имел опыт моддинга в TES, мой «проект» задумывался исключительно как небольшой аттракцион для друзей, напичканный своячковыми шутками и способный занять нас на пару вечеров. Полноценный релиз на публику не планировался, посему серьёзным map-design там и не пахло.

Системообразующим элементом карты должен был стать варкрафтовский бандит.

Тот самый.
Тот самый.

Тогда казалось, что в игре нет более меметичного персонажа: всратая моделька, харизматичная морда и приблатнённый лексикон (в классической озвучке «СофтКлаба») – на выходе получается комичный чёткий поц. Именно своры таких ребят должны были активно гасить друг друга на просторах «Бандитских войн». С неймингом проблем тоже не возникло, я остановился на первом же придуманном варианте в духе бесконечных криминальных сериалов с НТВ. Рабочее название «Бандосы» в среде друзей прижилось как основное. Пару недель я активно ваял прототип карты в редакторе, а потом забил на это дело, споткнувшись о некую техническую трудность. Жизнь тинейджера богата на события – нужно готовиться к каким-то там экзаменам, осваивать контент в очередной онлайн-гриндилке (у меня это был, естественно, WoW), пить пиво в подъездах и думать о будущем. В таких условиях школьнику довести мало-мальски трудозатратный проект до логического завершения сложно, и «Бандосы», конечно, были обречены.

Но они не были забыты. Издевательские шутейки про брошенную карту преследовали меня годами, то и дело я слышал «Ну, когда релиз-то?», «Вот доделаешь «Бандосов», зарубимся как в старые-добрые» и т.д. «Бандосы» возвращались ко мне не только в шутках - я стабильно вспоминал о них примерно раз в год, а однажды мне вдруг приснились готовая карта. Во сне у каждого игрока была своя раса бандитов, т.е. были бандиты-орки, бандиты-нежить и так далее, что раньше мне в голову не приходило. Такой инсайт чуть не заставил меня снова сесть за редактор, но я смог сдержать тягу к труду.

Когда мне было уже двадцать, мы с другом, давно не трогавшие WC3, внезапно нашли карту «Zombie in Village» и убили в ней немало времени, по вечерам после пар собираясь в очередной раз хардтраить карту, которую школьники с ютуба без напряга проходят в соло. Несмотря на заурядную майнкрафтовскую идею (ночью бодаешься с зомби, днём фармишься), «ZIV» обладала целостным геймплеем и игралась настолько приятно, что во мне возродилось желание сколотить нечто столь же интересное. Ну, а если не получится – сколотить хотя бы что-то. С этим желанием я какое-то время покрутил в голове «Бандитов» и вновь забыл о них, ибо жизнь студента богата на события не меньше жизни школьника.

И вот на пороге тридцатника я стряхнул пыль с мозговых архивов и решил наконец доделать то, что когда-то действительно хотел сделать, пусть даже получится кал. «Сделать карту для WC3 и зарубиться в неё с друганами», - один из моих незакрытых, как модно говорить, гештальтов, который я посчитал максимально заслуживающим закрытия. А еще я ярко представил лица друзей при виде легендарных «Бандосов», спустя десятилетие претворенных в жизнь.

Прото-«Бандиты»

Суть первоначального замысла такова: карта рассчитана на четырёх человек, каждый управляет своим лагерем бандитов в лесу. На перекрёстке в середине карты предполагались массовые бандитские замесы. Найм и прокачка стоят денег, деньги зарабатываются убийством юнитов соперника. Как и в оригинале, побеждает уничтоживший вражеские базы игрок. Всё очень примитивно и просто.

Усевшись с этим замыслом за редактор в далёкие школьные годы, я решил сделать в центре карты нейтральную деревню, уничтожение домов в которой приносило бы денежный приз. Хотелось дать игрокам дополнительный источник дохода, органично мотивирующий двигаться к центру, а малое количество домов обостряло бы соперничество между противниками.

<p>Первый вариант карты. Палатки по углам – базы бандитов; фермы в центре – деревня.</p>

Первый вариант карты. Палатки по углам – базы бандитов; фермы в центре – деревня.

Продолжая ваять прототип, я придумал ещё одну фичу: в дневное время деревню будут патрулировать стражники, способные покрошить толпу бандитов в капусту. Вроде бы простецкая идея сразу оживила скудный геймплей карты, сводившийся ранее к «иди в центр и дерись». Теперь от игрока требовалось хотя бы минимальное шевеление мозга для планирования своих действий: в деревню можно идти только ночью; из неё нужно будет вовремя убраться; нужно найти занятие на день (подразумевались набеги на врагов); перемещаться по карте придётся аккуратнее, ибо есть риск лишиться кучи юнитов сразу. Ограниченное временное окно для грабежа должно было повысить частоту столкновений между игроками и усилить конкуренцию за ресурсы.

Изрядно помучившись с настройкой этих самых патрулей, я забил на карту примерно на тринадцать лет.

«Бандиты REFORGED»

Еще в школе я решил, что основная цель разработки «Бандитов» – отнюдь не выкатить какой-то отполированный продукт, а получить удовольствие от процесса (люблю я копаться в редакторах игр) и поугарать с друзьями над результатом. В новой итерации «проекта» эта цель не поменялась, разве что мной ещё двигали ностальгические чувства. Поэтому я сразу для себя наметил следующий подход:

  • Делаю всё сам, без помощи гайдов и чужих наработок;
  • При этом стараюсь не застревать, иду лёгкими путями и пользуюсь костылями для реализации своих идей, лишь бы всё работало;
  • Конечный результат должен хотя бы на какое-то время увлечь меня с друзьями.

Примерно в марте 23-го года я поставил Reforged и принялся за давно забытое ремесло. Посвящать много времени карте я не мог, обычно заходил в редактор на часок-другой после работы, в редкие свободные дни мог поломать голову и три-четыре часа. В разработке случались перерывы в несколько дней, недель, а иногда и месяцев.

Теоретическая часть подобных проектов зачастую важнее технической. Собрать в движке можно любую вещь, но будет ли в неё интересно играть? Потому моя затея не ограничивалась вознёй в программе-редакторе, многое происходило в голове и на бумаге: я думал о том, в какие ситуации хочу поместить игроков, к чему хочу их подталкивать, что может подстегнуть азарт, а что остудить.

Основная идея осталась нетронутой: четыре лагеря бандитов, грабёж деревни и патрули стражников, но теперь в план «Бандитских войн» вошло множество дополнений. Среди них, например, шанс разбудить стражников при грабеже, «лесные» зоны с крипами и боссами, магазины.

<p>Примерно так выглядела принципиальная схема, которую я набросал перед началом работы в редакторе. </p>

Примерно так выглядела принципиальная схема, которую я набросал перед началом работы в редакторе.

Опоры геймплея были намечены следующие:

1. Игроки стартуют в четырёх точках (зелёные кресты на схеме) за пределами деревни. У каждого игрока есть основное здание – «общак». Если «общак» разрушен, игрок проигрывает. Соответственно, победа за последним выжившим.

2. Игроки могут улучшать и расширять своё бандитское войско за золото. Золото падает с юнитов противника, лесных крипов (розовые кресты по краям) и добывается грабежом домов в деревне (голубые кресты). После грабежа золото нужно донести до «общака», чтобы получить возможность его потратить.

3. Ночью все стражники спят и деревня в центре карты доступна для перемещений. Количество домов для грабежа ограничено, уже ограбленный дом повторно можно грабить только спустя длительное время.

4. Днём стражники просыпаются и патрулируют деревню (их маршруты на схеме – красные стрелки). В это время игроки могут сражаться и фармить деньги друг на друге, либо заниматься PvE в лесу, убивая там крипов и продвигаясь к боссам.

Руководствуясь этим списком, я взялся за дело.

WC3 Editor

Если вы знаете устройство редактора карт для WC3 – можете пропустить главу: тут я объясню, как выглядит сей софт.

WC3 Editor был выпущен Blizzard вместе с игрой и распространялся с ней же. Первый раз я наткнулся на него в детстве, когда просто открыл папку с Варкрафтом и, ткнув на странный ярлык, обомлел от осознания открывшихся возможностей. Программа позволяет собирать собственные карты и имеет для этого весь необходимый инструментарий, разделенный на модули: редактор ландшафта, редактор триггеров (они же скрипты), редактор объектов (где можно изменять и создавать юнитов, предметы, заклинания), редактор кампаний (позволяет собрать из нескольких карт кампанию, подобную оригинальным сюжетным) и так далее.

WC3 Editor и его аналоги для других игр (TES CS, например) –инструмент разработчиков, который использовался при создании игры, а после её выхода был причёсан для массового пользования и пущен в народ. Я сильно уважаю игростроителей, публикующих редакторы для своих детищ. Это предоставляет фанатам необъятный простор для творчества и заметно продлевает игре жизнь – что мы прекрасно видим на примере как WC3, так и игр серии TES.

Как я целый год делал карту для Warcraft III

Так выглядит WC3 Editor. По центру видим саму карту, полоска с иконками наверху содержит основные действия и модули, панель инструментов справа позволяет добавлять на карту объекты и манипулировать ими. Сейчас там открыта ландшафтная палитра – с её помощью можно красить землю в разные текстуры, менять рельеф, лить воду. Другие палитры позволяют размещать декорации, войска и прочее.

Как я целый год делал карту для Warcraft III

Переключаемся на палитру декораций. В палитре выбираем объект, в появившемся под мини-картой окошке слева можем видеть модельку выбранного объекта, а затем просто ставим его курсором в желаемое место. Так можно размещать всё, что душе угодно, от деревьев и юнитов до спецэффектов.

Как я целый год делал карту для Warcraft III

А так выглядит модуль «редактор объектов». Сейчас выбран стандартный юнит – человеческий рабочий, набор параметров которого отображается в центральном окне. Из этого модуля можно поменять ему значения атаки и здоровья, модельку и иконку, добавить какие-то заклинания и прочее. Параметров огромное количество, можно изменить любого юнита до неузнаваемости или просто создать нового. Остальные модули выглядят похожим образом.

Записал вам видео-пример того, как собирается простейшая локация с использованием палитр рельефа и декораций.

В целом можно сказать, что у любой карты три основные составные части: это сама, собственно, «карта» – ландшафт; это набор используемых на карте сущностей-объектов (юниты, предметы, способности); и это набор скриптов (триггеров), управляющих событиями на карте. Еще есть куча мелочей, типа настроек игроков, звуков, игровых констант и прочих – но их я в этом тексте опущу, чтобы сосредоточиться на «трёх китах». Далее я детально расскажу о том, каково мне было осиливать этих «китов» и с чем пришлось столкнуться, и начну я с самого, пожалуй, тяжёлого «кита».

Триггеры

В моддинге для меня самым сложным и нелюбимым элементом был скриптинг. Я уродился чем-то вроде гуманитария, слабо дружу с логикой и не обладаю алгоритмическим мышлением – короче, программист из меня никакой, а скриптинг, по сути, и является программированием. Без него, к сожалению, никуда, потому что большая часть наблюдаемых нами в играх явлений строится именно на скриптах. Скрипты могут быть писаны на особом «скриптовом» языке: например, в Skyrim это язык под названием Papyrus, а в Warcraft 3 он называется jASS. К счастью, для дебилов типа меня в WC3Editor есть прекрасная вещь под названием «редактор триггеров» - эдакое no-code приложение. Оно даёт возможность создавать скрипты, не прибегая к Jass, при помощи графического конструктора. Собираемая конструкция называется «триггер» и имеет три составляющие: events (события) – то, что запускает исполнение триггера; conditions (условия) – условия, без которых триггер не сработает; actions (действия) – то, что триггер делает. В редакторе на выбор даётся огромное количество событий, условий и действий, покрывающих все возможные игровые ситуации, благодаря чему триггерами можно сделать буквально что угодно.

Как я целый год делал карту для Warcraft III

Так выглядит редактор триггеров. Слева – колонка со всеми триггерами карты. Поле справа внизу – наполнение триггера. В выбранном триггере-примере событием выступает «инициализация карты», условием – количество игроков => 1, а само действие, исполняемое триггером – текст «Hello World» в чат. Т.е. этот триггер сразу после запуска карты проверяет количество игроков, и, если их 1 и более, пишет в чат сообщение. Это простой пример, на практике в триггере может быть огромное количество событий, условий и действий.

<p>Скрин из редактора триггеров «Бандитских войн». В списке слева можно оценить количество работающих на карте скриптов (влезла ~четверть общего количества).</p>

Скрин из редактора триггеров «Бандитских войн». В списке слева можно оценить количество работающих на карте скриптов (влезла ~четверть общего количества).

Конечно, система не так гибка и многофункциональна, как чистая работа на Jass, но она проста и понятна всем. Ну или не всем – на триггерах я и запоролся тринадцать лет назад. Памятуя о том, что это самая головомойная часть картостроительства, я решил начать с неё и сделать всю техническую начинку, а потом уже заниматься более приятными и лёгкими вещами. При этом я решил ни в коем случае не брать готовые решения из интернета или чужих карт, а делать всё с нуля самостоятельно, прибегая к помощи гугла только в тупиковых ситуациях. В результате большую часть разработки я корпел именно над триггерами основных механик; им и будет посвящен ряд последующих глав.

Грабёж

Главным источником дохода игроков должен был стать грабёж, поэтому механика ограбления занимала ключевое место среди элементов карты и в первую очередь я взялся за неё. В «Бандитских войнах» версии 2010 года грабёж был простым: дом нужно «убить», а игроку, нанёсшему ластхит, базовым функционалом игры выдаётся фиксированное денежное довольствие. Чтобы дома не кончались, я планировал написать триггер, по которому разрушенные дома вырастали за ночь обратно. Система уже тогда казалась мне ущербной.

В 2023 году я её переиначил. Основные компоненты новой системы были такие:

1. Герой игрока должен использовать способность «Взлом» на дом.

2. Способность кастуется 10 секунд, успешный каст приводит к выпадению рандомного количества денег.

3. Каст можно в любой момент прервать (например, если надо срочно смыться), но награды не будет.

4. При успешном «взломе» дом помечается как «ограбленный» и взломать его повторно можно только через время (в итоговом варианте – 1.5 игровых суток).

Я чувствовал, что реализация грабежа доставит мне немало мучений. Так и вышло: работа над «взломом» по неопытности шла тяжело и была полна проблем, причём начались они сразу. В варкрафтовском редакторе невозможно сделать с нуля свою способность для героя (или бафф, или юнита, или что угодно) – новые объекты создаются только на основе старых и наследуют некоторые их свойства. Например, если вы создадите спелл на основе «Одержимости» банши, вы можете поменять ей всё, что душе угодно: можно сделать другой звуковой и визуальный эффект, поменять время каста и стоимость по мане, сделать доступной кому угодно… Но в конечном счёте кастующий юнит будет «вселяться» в свою цель. В ходе тестов множество бандитов сгинули в небытие, населив своими душами деревенские дома.

«Взлом» должен быть прерываемым. Это означало, что за основу я мог взять только потоковую (channel) абилку, коих в варкрафте не так много. Выбор пал на техническую способность под именно таким названием «Channel», которая в игре в чистом виде не встречается, а все необходимые эффекты я настраивал триггерами.

<p>На скрине вы можете наблюдать грабёж: бандит кастует, на доме висит бафф «Взламывается». Дело происходит на тестовой карте-полигоне, где я обкатывал технические решения перед внедрением в основную карту.</p>

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

Мой бандит успешно лупил «Взломом» и спустя десять секунд триггер, реагирующий на конец каста способности, материализовал у дома честным трудом заработанные деньги в виде нескольких предметов-сундуков. Казалось, что механика готова, но в этот момент работа над ней только началась.

Нужно было сделать «ограбленный» эффект, препятствующий новому взлому. Для наглядности я решил кидать на дом бафф, показывающий игрокам, что ловить им здесь нечего, а получение баффа привязать к основному триггеру взлома. Каст завершается, триггер срабатывает, появляются сундуки и дом получает бафф «ограблен» на полтора игровых дня.

Внезапно выяснилось, что триггером нельзя навесить бафф на юнит, такого действия просто нет в конструкторе триггеров. Причём действие «Убрать бафф» есть. А добавить нельзя. Словив недоумение, я в первый раз воспользовался гуглом – объяснения этой странности не нашел, но прочитал, как люди обходятся в таких случаях: они делают невидимого юнита с нужным спеллом, и триггером отдают ему приказ скастовать спелл на цель. Подобная схема у мапмейкеров называется «dummy cast» (под «дамми» понимают как раз скрытого юнита-кастера). Я решил, что у меня сам дом и будет себя баффать. Сколотил нужную способность и вновь запоролся: через триггер нельзя отдать юниту приказ скастовать произвольный спелл. Близзы демонстрируют чудеса логики и дают возможность через триггер кастовать только ограниченное количество стандартных способностей:

<p>Список приказов, которые можно отдать юниту через триггер. Кроме обычных move и attack, здесь есть спеллы, но только из числа стандартных.</p>

Список приказов, которые можно отдать юниту через триггер. Кроме обычных move и attack, здесь есть спеллы, но только из числа стандартных.

Я уже видел некоторое дерьмо и интуитивно придумал решение. Я забацал нужный спелл на основе стандартного «Проклятия» банши, выдал его дому и в триггере в качестве приказа выбрал «Undead Banshee – Curse», однако ни черта не заработало. Решение было верным, в тестовом триггере бафф накладывался удачно: почему-то сломался именно мой «взлом». Тут я застрял надолго.

<p>Первая версия триггера взлома. Начиналось всё просто.</p>

Первая версия триггера взлома. Начиналось всё просто.

Как это часто бывает, причина загвоздки оказалась на поверхности (но не для меня, а для тех, у кого есть хотя бы зачатки логического мышления). По скрину видно, что для построения последнего действия я использовал функцию «Target unit of ability being cast», подразумевающую ограбленный дом, но конкретно в моих условиях такая функция работать не могла. Почему? Триггер стартовал с события «Unit finishes casting an ability»: как только в игре происходит это событие, начинает реализовываться заданная последовательность actions. В этом и крылась проблема: триггер стартует с завершения каста способности, а значит у способности уже нет цели и функция «Target unit of ability being cast» имеет пустое значение. Чтобы система начала действовать, мне пришлось обратиться к переменным – в первый, но далеко не в последний раз.

Теперь взлом работал на двух триггерах. Первый реагировал на начало каста способности (Событие «Unit starts channeling an ability») и сохранял дом-жертву в отдельную переменную «House». Второй триггер с выдачей добычи использовал эту переменную, корректно навешивая на неё бафф «ограблен». По аналогии с меткой «ограблен» я добавил аналогичную, но десятисекундную «взламывается» (на основе орочьей способности Bloodlust) для предотвращения одновременного взлома несколькими юнитами - в такой ситуации все взломщики генерировали лут, что не есть хорошо. Новая система из двух триггеров действовала прекрасно:

Если дом имеет бафф «ограблен» или «взламывается», первый триггер подменяет приказ юнита. Вместо каста «взлома» юнит «кликнет» по дому (подойдёт к нему) и высветится сообщение-ошибка для игрока. Если же дом доступен для грабежа, он сохраняется в переменную, используемую вторым триггером для выдачи баффа «ограблен».

У системы быстро нашлись изъяны. Например, если на протяжении десяти секунд каста «взлома» кто-то начнёт грабить другой дом, значение переменной перезапишется вторым домом и первый не пометится «ограбленным». Я хотел сделать массив хранящих дома переменных House[1,2,3…] и пополнять его при каждом исполнении триггера (в редакторе можно сделать переменную-функцию House[кол-во срабатываний триггера+1]). Однако при прерывании каста (если игрок решил оторваться от взлома) нумерация переменных сбивалась, и переменная во втором триггере не билась с первым, потенциально были и другие проблемы.

Всё упиралось в желание сделать универсальный триггер, работающий для всех домов на карте (16 штук). Перебрав несколько нерабочих вариантов, я понял, что быстрее и проще мне будет сделать отдельные триггеры на взлом каждого дома, избежав путаницы с переменными и возможного конфликта между копиями одного триггера, запускающегося на разных домах. Кроме того, свой триггер у каждого дома позволял настраивать процесс ограбления более тонко (например, можно отрегулировать точку появления добычи у конкретного дома, а не у всех сразу). В итоге рабочий вариант триггерной связки был просто скопирован мною 16 раз с необходимыми правками.

<p>Так выглядят релизные версии триггеров взлома, по ходу дела обросшие дополнениями, рассказывать о которых я не буду. Первый триггер даже целиком не влез.</p>

Так выглядят релизные версии триггеров взлома, по ходу дела обросшие дополнениями, рассказывать о которых я не буду. Первый триггер даже целиком не влез.

Визуальные эффекты ограбления получились минималистичные. Красивых эффектов в варкрафте множество, прикрепить можно какой угодно, вот только крепятся они к юнитам на специальные точки (так и называются, attachment points). У использованных мною моделек домов точка прикрепления находилась в какой-то заднице, из-за чего эффект либо проваливался наполовину в текстуры, либо не был виден вовсе. Решить данную проблему я мог тремя путями: скачать не такую кривую модельку дома из интернета (отметаем вариант, поскольку я все делал на стандартных ресурсах); взять эту модель и собственноручно в каком-то там 3д-редакторе поменять ей аттачменты (отметено, как слишком трудоемкое); сделать эффект иным путём. Недолго подумав, я решил красить ограбленные дома в красный цвет – может, не самое изящное решение, зато наглядное и рабочее. По задумке дома должны были автоматом перекрашиваться обратно, как только с них спадает бафф «ограбленности», здесь я применил действие wait until (вставьте условие). Моим условием было triggering unit has buff «Ограблен» equal to «No».

Снова триггер не работал как надо; оказывается, один триггер может хранить в себе только один юнит. Если два дома помечались как «ограбленные», по истечении времени обратно перекрашивался только один, ограбленный позднее – он «перетягивал» на себя значение triggering unit. Я понял, что по этой же причине у меня не получилось бы создать универсальный триггер для взлома всех домов (по крайней мере, простыми средствами). Всю басню с перекрашиванием я встроил в основной триггер взлома; это его усложнило, но зато каждый дом корректно менял цвет. После ещё некоторых дополнений итоговые триггеры стали выглядеть куда более громоздко, они стали одними из самых сложных на карте – но работали безотказно.

Процесс ограбления на релизе.

Триггеры, связанные с грабежом, были первыми реализованными в проекте. Начало разработки давалось трудно, хотя объективно проблемы первых дней были не сложнее тех, что встречались дальше. Карта шла туго из-за того, что я напрочь забыл устройство редактора и по ходу дела изучал особенности работы в нём, то и дело натыкаясь на всякие тонкости.

Добыча

Мне хотелось превратить грабёж в эдакое рисковое приключение, а не тупо зачислять деньги на счёт игрока после успешного взлома, поэтому я устроил дело так.

Когда грабёж заканчивается, около дома появляется 3 рандомных сундука, каждый содержит 25/50/100 золота. Появляются они не с равной вероятностью, я регулировал это дело под баланс: в релизной версии с дома падает от 100 до 250 золота в трёх сундуках. Деньги хорошие (для контекста - стартовый бандит стоит 10 золота).

У бандита есть 1 слот в инвентаре, поэтому он может поднять сундук. Если бандит погибнет, сундук с него выпадет и может быть поднят повторно кем угодно. У героя больше слотов, но сундук с награбленным он все равно может поднять только один. Я специально ввёл такое ограничение, чтобы игроки распределяли добычу между слабыми юнитами и следили за ними. Дополнительно я решил ещё и замедлять юнитов, тягающих добычу.

В игре есть предметы, дающие бонус к скорости; я надеялся на их основе забацать сундуки с отрицательным «бонусом», что оказалось, увы, невозможным (отрицательные значения этим баффам присвоить нельзя). Чуть повозившись с редактором предметов, я понял, что делать это опять придётся через триггер. У меня было два варианта: триггер, отнимающий у юнита скорость в абсолютных значениях (значения скорости передвижения в WC3 измеряются числами от 1 до 522) и возвращает то же значение, когда он теряет предмет; либо снова сделать бафф, теперь с эффектом замедления. Я выбрал второй вариант как более наглядный: когда юнит поднимет сундук, игроки увидят на нём бафф «полные карманы» и сразу поймут, что с ним происходит. У баффа был еще один плюс – он позволял давать штраф к скорости в процентах от исходной без дополнительных костылей. Снова пришлось использовать дамми-каст: когда юнит поднимает сундук с золотом, дамми-юнит кастует на него замедление. В качестве дамми-юнита поначалу выступала ратуша в центре города (принадлежащая фракции NPC), но я столкнулся с затруднением: даже если радиус возможного каста способности поставить 99999, ратуша не может кастовать его дальше своей зоны видимости. Мне же нужно было кастовать замедление на любом участке карты, ведь сундук можно было потерять/поднять где угодно. Был вариант открыть «игроку»-NPC, владеющему ратушей, всю карту, но и тут я столкнулся с проблемой, т.к. владелец ратуши был тот же «игрок», что владел стражниками в деревне. Проблема здесь не самая очевидная: если стражник (о них речь пойдёт ниже) «видел» всю карту, он не прекращал преследовать врага никогда, а мне всё-таки хотелось, чтобы игрок мог оторваться от возможной погони.

Поэтому в качестве дамми-юнита выступил «Васян» – нейтральный невидимый бандит, спрятанный в углу карты и наделенный возможностью кастовать нужный спелл. Васян справлялся с возложенной на него задачей на ура, и при поднятии сундука юниты замедлялись аналогом заклинания волшебниц из оригинала «Slow». Забавно, что Васян во время каста «палится» на карте – становится на секунду видимым. Пофиксить это я не смог, но поставил его так, чтобы никто не заметил :)

Выносим золото из деревни (не очень успешно).

К дебаффу прикручен визуальный эффект в виде монетки над головой юнита, чтобы помечать несущих добычу как для самого игрока, так и для его соперников. Полученные сундуки нужно донести до «общака», основного здания игрока. При использовании предмета-сундука на «общак» предмет исчезает и на счёт игрока зачисляется столько денег, сколько сундук содержал.

Сдаём золото в «общак».

Реализовать эту механику было просто, но, когда я над ней работал, мне в голову пришла забавная идея сделать общаки взламываемыми. Недолго думая, я соорудил аналогичный взлому деревенского дома триггер, но с нюансом – количество выпавшего золота напрямую зависит от того, сколько денег имеет жертва. Если у жертвы 500 золота и больше, после взлома выпадет сундук с 500 золота. Если меньше 500, но больше или равно 250, то выпадет сундук с 250 золота, и так до минимальных значений. Естественно, выпавшая при грабеже сумма денег отнималась у ограбленного игрока. Хоть я и реализовал эту фичу максимально ущербно (при помощи кучи if-ов в триггере), геймплейно она даёт неоценимую возможность нажиться на сопернике, попутно причинив ему ущерб. Прекрасный инструмент вражды.

Следующим, куда более сложным этапом в создании карты была настройка патруля и системы тревог.

Патрули

По задумке в дневное время деревню от грабежа охраняют перекачанные стражники. Эту идею я считал важнейшей для карты, поскольку она придавала хоть какую-то глубину геймплею. Еще до разработки я набросал на бумажке траектории перемещения патрульных по деревне.

Как я целый год делал карту для Warcraft III

Маршруты стражников можно узреть на этом скрине. В релизе расстановка немного изменилась, но принцип остался тот же. Четыре стражника неподвижно стоят на четырёх входах в деревню – жирные красные точки по краям. Ещё четыре стражника по красным стрелочкам патрулируют главную дорогу – от центра к границам деревни, каждый на своём отрезке. Последние четыре «оранжевых» гуляют на окраине, в боковых проходах – это важные зоны, поскольку в них сосредотачивается перемещение игроков. Стражники выходят в начале дня на маршрут, а вечером собираются у казарм (розовая точка чуть выше и правее центра) и засыпают. Просыпаются они либо уже утром, либо по тревоге – ночная тревога временно отправляет их на дневной маршрут, но до тревог мы ещё доберёмся.

Маршрут одного из патрульных в игре.

Мне хотелось, чтобы активный патруль сильно усложнял действия игроков, но не делал их невозможными. В итоговом варианте схемы напороться на стражника легко, но при должном умении можно проскользнуть мимо незамеченным. Карта получилась с эдаким «стелс»-компонентом, особенно хорошо он показывает себя в ночи при тревогах, когда есть необходимость выбраться из деревни с награбленным, избегая проснувшихся пехотинцев.

Для всех важных точек на маршруте нужно было создать «регионы» - особые сущности в редакторе, технические зоны, к которым привязываются триггеры.

Как я целый год делал карту для Warcraft III

На этом скрине видны используемые регионы. Тёмно-синие области – точки для патрулей. Утром триггер даёт центральным стражникам приказ проснуться и двинуться в регион A; из него каждый отдельный юнит получает команду «патрулировать» до своей точки, первый пехотинец до точки B, второй до точки C, и так далее. Зона А является точкой возврата; команда «патрулировать», если не знаете, заставляет юнит курсировать между двумя точками, отвлекаясь только на врагов. «Боковые» стражники не собираются в A; каждый из них отправляется сразу на свою точку. Например, стражник по имени Алехандро утром выдвигается в зону 1, из которой получает приказ «патрулировать» до зоны 2. Целый день стражники ходят туда-сюда по своим маршрутам, пока в конце дня триггер не сгоняет их всех в светло-синюю зону у казармы и накидывает эффект сна. Маленькие жёлтые регионы около домов (если вы их заметили) используются в триггерах грабежа для появления добычи.

Опять работать…

В работе над патрулями я столкнулся с множеством нюансов. Например, для возвращения стражника на базу для отбоя я поначалу применял приказ move. Это оказалось ошибкой: если стражник активно месится с бандитами и вдруг получает приказ move, он забивает на драку и бежит спать (работа работой, а сон по расписанию). Использование в том же триггере приказа attack-move позволяло стражнику сначала со всеми разобраться, а потом двигаться в заданном направлении. Другой момент заключался в том, что приказ встать в рандомную точку в регионе может поместить юнита на границе этого самого региона; в таком случае условие «юнит в регионе» не будет выполняться. У меня из-за этой бадяги не засыпали стражники (стояло условие – «wait until все стражники будут в регионе») и я не мог понять, в чём же дело. Эти и другие раздражающие мелочи я устранял путём бесчисленных проб и ошибок.

У каждой группы стражников своё расписание. Сделал себе табличку, потому что никак не мог запомнить, когда какую группу хочу поднимать.
У каждой группы стражников своё расписание. Сделал себе табличку, потому что никак не мог запомнить, когда какую группу хочу поднимать.

Пехотинцы никак не хотели укладываться стандартной механикой сна, действующей в игре на крипов, поскольку крипами в моей карте не являлись (технически они принадлежали «игроку», которым никто не управляет). Здесь я гуглил во второй раз, и нашёл в глубинах интернета совет триггером накидывать на юнит способность «Всегда спит». Она используется во Frozen Throne, в пятой миссии кампании нежити, где нужно за Сильвану разнести вражин, погруженных как раз в этот сон. Способность полностью имитирует стандартный сон крипов: если атаковать стражников, они проснутся.

Изначально скрипты для патрулей и сна я пытался сделать универсально, задавая маршруты и поведение всех юнитов одной группы (боковые, центральные, пограничные) одним триггером. Постепенно я отказался от этой системы в пользу кучи «маленьких» триггеров, каждый из которых управлял поведением отдельного стражника: такая схема делала патрульного независимым от других. Если раньше, например, стражники из группы «боковых» не начинали патруль, пока каждый из них не встанет на исходную позицию, сейчас они выходят на маршрут по готовности, не дожидаясь товарищей. Для удобства я всё равно собирал «маленькие» триггеры отдельных стражников в большие «зонтичные». На каждую группу стражников получалась пара таких «зонтичных» триггеров, управляющих сном и пробуждением этой группы.

Проджект-менеджмент

В один прекрасный день я обнаружил, что карта занимает на удивление много времени моей жизни, и не всегда это время тратилось в редакторе. Я ловил себя на случайных мыслях о «Бандитах» при засыпании, на рабочих перерывах, в разговорах с людьми. Иногда черкал на бумажке схемы внезапно выдуманных механик, мысленно прогонял триггеры и генерировал новые идеи. Воображение обычно опережало фактический прогресс на приличный срок – например, эндгейм я придумал во время работы над расписанием стражников (когда, по сути, ни черта не было готово).

По ходу дела всё чаще и чаще приходилось запускать игру, чтобы тестить триггеры. Зачастую на тестах одной механики я внезапно обнаруживал баг в другой, а иногда новый триггер ломал череду старых. Я мог уйти фиксить некую критичную ошибку, забывая про остальные встреченные баги, и они неприятно всплывали позднее. Так я стал выписывать баги на листочек, чтобы ничего не забыть, и это стало началом некой систематизации работы. Когда карта усложнилась и в ней уже было несколько систем триггеров, начали пагубно сказываться случающиеся длительные перерывы и ограниченное время, которое я отводил «проекту». Порой возвращаясь к карте после долгой паузы, я с трудом мог разобраться в собственных триггерных нагромождениях. Чтобы фиксировать прогресс, я завёл «девлог», а заодно родилось и что-то типа «бэклога» с неисправленными багами и задачками наперёд.

Ближе к финалу работ «бэклог» переехал в таск-менеджер, который я использовал в других своих проектах и в личных целях. Завёл в нём отдельную канбан-доску под «Бандитов», ставил там себе задачи и отслеживал выполнение, каждую задачу решал в рамках «спринтов», короче – воссоздал в миниатюре процесс реальной разработки. И это невероятно упростило жизнь: не надо было держать в голове все свои идеи, этапы работы наглядно планировались, баги записывались отдельными задачами и фиксились в порядке очереди. Приятный побочный эффект такой систематизации состоял в том, что я мог адекватно оценить прогресс и всегда понимал, сколько мне ещё осталось сделать.

Тревоги

«Бэклог» появился одновременно с механикой тревог – она стала рубежом в разработке, заставившим меня начать систематизировать свою хаотичную до поры деятельность. Так получилось, потому что тревоги тем или иным образом затрагивали все существовавшие на тот момент важные механики (взлома, патруля, сна) и мне нужно было их корректно интегрировать.

Сама задумка тревог простая: при грабеже есть шанс (33%) разбудить стражу. Запускается дневной сценарий патруля, но через два игровых часа (1 мин реального времени) стража возвращается ко сну. Я решил, что однократная тревога запускает только центральный патруль; однако, если в текущую тревогу случится ещё одна, запускается патруль «окраин»; наконец, третья тревога разбудит «пограничников», из-за чего выйти из деревни станет непросто.

Я немало провозился с триггером, пробуя разные варианты, и система тревог для меня стала наиболее продуктивным уроком по триггерному мастерству: здесь я впервые применил функцию «wait until…», здесь мне впервые понадобились не просто проверки условий, но комплексы if/then/else и запуск одного триггера через другой. Открытые для нужд тревог приёмы я потом внедрял в свои ранние триггеры, некоторые переделав из кривых в чуть менее кривые.

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

Как я целый год делал карту для Warcraft III

На скрине кусок «тревожного» триггера. «Undead Banshee – Curse» накладывает бафф «Тревога»; barracks – это казармы, которые в триггере работают в комплексе с ратушой (townhall), накидывая на неё и себя тревогу. Действия «Trigger – Run…» запускают триггеры патрулей и сна.

Через минуту тревога кончается и бафф с ратуши спадает, запускается триггер сна, отправляющий стражников обратно на покой. Он проверяет время суток при запуске – чтобы стражники не отправлялись спать, если во время тревоги уже наступило утро и пора на плановый патруль (в таком случае они просто продолжают маршрут).

Ночная тревога в действии. Грабим дом, выходит стража и наводит порядок.

Днём дома тоже можно грабить, хоть это и проблематично из-за активных патрулей. Поскольку днём стражники на маршрутах, для дневной тревоги я дополнительно сделал пару рыцарей, совсем уж сильных, и настроил триггер на их выезд прямо к месту грабежа. По умолчанию они охраняют центр города, а при дневных беспорядках по очереди покидают пост: сначала выезжает первый, если первого на месте нет (уже где-то рубит головы), отправляется второй, так и гоняют по одному. Вероятность дневной тревоги 66%, что делает дневное воровство совсем непривлекательным занятием до лэйтгейма, в котором игроки могут эффективно противостоять страже.

"Днём дома тоже можно грабить", говорил я.

Во время сборки тревог я вдруг придумал мощный эксплоит своих же механик. Хитрый игрок мог бы сагрить одного из охранников и довести его, например, до базы противника, где страж порядка стал бы всё крушить. Дело в том, что из команд типа attack-move и patrol юнит может продолжать преследование бесконечно, если жертва находится в поле зрения (при умелом контроле вполне можно «проводить» стражника довольно далеко). В игре есть константы, задающие пределы преследования, но они действуют только для крипов. А крипы в игре относятся к фракциям Neutral Hostile/Neutral; я же сделал своих пехотинцев принадлежащими «псевдо»-игроку, чтобы они отображались как отдельная фракция со своим именем. Над фиксом я поломал голову и в результате задал регионы на границах деревни, в которых заблудший пехотинец бросал преследование и возвращался обратно на маршрут. При этом стражник на некоторое время становится неуязвимым, иначе была возможность бесконечно кайтить его до пограничного региона и по итогу прикончить.

Собирая этот триггер, я чувствовал себя узником замка "If".
Собирая этот триггер, я чувствовал себя узником замка "If".

В триггере «возврата» пришлось сделать длинную лестницу из If-ов, определяющих группу пехотинца и перезапускающих патруль этой группы. Была совсем уж бешеная идея специфично определять юнита и перезапускать конкретно его маршрут через «маленький» триггер, от неё я отказался по понятным причинам. В триггер встроена дополнительная проверка на время суток, и, если кто-то выведет стражника из деревни прямо перед отбоем, после возвращения он пойдёт спать с коллегами, а не зависнет в сомнамбулическом патруле.

Тревоги стали последней из реализованных крупных механик, по скриптовой части мне оставалось только сделать пачку мелких триггеров и тщательно всё оттестировать. Тем временем в жизни происходило немалое количество вещей и «Бандитские войны» отошли на задний план. Летом я открывал редактор всего пару раз и не мог вспомнить, на чем вообще остановился. Понимая, что прогресс застопорился, в начале осени я поставил себе задачу добить рабочую версию карты до конца года. Самое сложное уже было позади: мне оставалось сделать юнитов с крипами, придумать систему апгрейдов и забалансить всё и вся. На десерт я оставил сборку ландшафта; остальное было уже опциональными мелочами.

Грейды и баланс

Помимо домов для грабежа и декоративно-технических казарм с ратушей, в деревне имеются полезные здания в количестве четырёх штук. Две таверны работают как «источник жизни», позволяющие подхилить бандитов (автоматическая регенерация здоровья у них отключена) – кроме этих таверн игрокам на первых порах негде подлечиться. В таверны в качестве товара добавлено бухло, выступающее аналогом классических зелий лечения и маны. Есть даже «бочка с пивом», дающая массовый захил по области: эффект скопирован с оригинальной способности «Исцеляющий газ» героя-Алхимика.

Применяем лечебную бочку в сражении с крипами.

Другими полезными зданиями стали кузница с апгрейдами для войск и лесопилка с покупными строениями. Я специально помещал необходимые для развития предметы в деревню, мне хотелось дать игрокам лишний повод заявиться в неё. Деревня задумывалась как концептуальный центр карты, высококонкурентная среда постоянной борьбы. Даже если игрок избегает грабежа, ему придётся совершать вылазки за апгрейдами и предметами, подвергаясь риску встречи со стражниками или врагами.

Пример товара с лесопилки – палатка, увеличивающая максимальный лимит армии. Всё-таки бандитам негоже заниматься ручным трудом и строить они ничего не умеют, поэтому приходится полагаться на такой вот готовый продукт. Реализация повторяет продающиеся в оригинальных кампаниях «игрушечные» здания. Их применение быстренько возводит купленное строение на выбранном участке земли.

Что до апгрейдов, то я ввёл две системы: первая автоматически даёт игрокам доступ к более сильным юнитам по мере прокачки героя, вторая –упомянутые апгрейды из кузницы за деньги. Обе системы требуют от игрока активных действий для развития: фармить опыт или золото.

В оригинальной игре апгрейды-технологии изучаются не в магазине, а в собственных зданиях. Для реализации же моих идей с покупкой улучшений в кузнице пришлось использовать предметы как техническую «прокладку» между строением и изучаемой технологией. Получилась система «игрок покупает предмет» - «покупка запускает триггер» - «триггер проводит улучшение для войск заданного игрока».

<p>Покупка апгрейдов в кузнице.</p>

Покупка апгрейдов в кузнице.

Вторая грейдинговая система, зависящая от уровня героя, включает в себя 4 типа юнитов, доступ к которым появляется поэтапно. Изначально доступны слабые бандиты; на 3-м уровне героя открываются бандиты дороже и сильнее, вместе с возможностью нанять дальнобойных; на 6-м уровне открываются бандиты еще сильнее; наконец, на 9-м уровне можно нанимать настоящих зверей. Покупаемые в кузнице улучшения распространяются на всех юнитов игрока, поэтому они не теряют своего значения до конца игры.

Над балансом пришлось изрядно потрудиться. Всего в распоряжении игрока 6 типов юнитов, открывающихся по ходу прокачки – 2 дальнобойных и 4 ближнего боя, плюс герой. Я отложил до лучших времён разработку рас, поняв, что балансировать их между собой будет очень сложно – это 24 юнита и четыре героя с уникальными способностями, времени на это уйдёт уйма. Было решено сначала довести до ума «людскую» расу.

Честно признаться, в делах баланса я вообще ничего не смыслю и логику придумал следующую: юнит тиром выше должен без проблем убивать юнита тиром ниже, но не осиливать двух таких юнитов или осиливать их с трудом. В моём видении подобный расклад оставлял шанс отставшему в развитии игроку пересилить соперника. В этой стезе я забалансил всех бандитов ближнего боя, осуществив кучу тестовых боёв между ними.

Тестовая битва: бандиты 2-го тира уничтожают бандитов 1-го. Хотя силовой перевес кажется большим, в реальных игровых условиях их преимущество может сгладиться ситуацией и навыками игрока.

Сложнее обстояли дела с бандитами дальнего боя. Их всего 2 типа: первый открывается на 3-м уровне после покупки грейда в кузнице, второй же становится доступен игроку, получившему артефакт «Порох». Порох выпадал рандомно с одного из четырёх боссов, которых не так просто осилить. Это означало, что второй тип дальнобойников игрок мог вообще не получить, или получить очень поздно. В связи с этим первый тип хотелось забалансить таким образом, чтобы он сохранял хоть какую-то актуальность и на следующем тире прокачки. С юнитами дальнего боя есть ещё тонкая ситуация: они должны быть достаточно мощными по урону, чтобы их вообще имело смысл нанимать, но при этом разваливаться в ближнем бою – иначе выйдет дисбаланс. Здесь, опять же, я перебирал варианты в тестовых боях, по единичкам выверяя атрибуты.

Хотя у копейщиков меньше здоровья и они получают двойной урон от ближних атак, на расстоянии они станут серьёзной угрозой для мили-отрядов.

Поломать голову пришлось с героем. Герой, для игрока являющийся самым ценным юнитом (на старте только он может взламывать дома), должен быть сильнее падающих за несколько ударов бандитов, иначе пользоваться им будет невозможно. С другой стороны, он должен быть достаточно уязвим, дабы приходилось его беречь. При том нужно задать такие бонусы от уровней, чтобы герой не терял боеспособности по ходу игры и не рассыпался под натиском продвинутых войск. Стартовые параметры и уровневые бонусы долго подбирались «на глазок» по тестам. Задуманное соотношение сил соблюсти удалось: в дебюте герой выступает как хрупкий «взломщик», но с растущим уровнем становится крепче и приобретает ценность уже как боевая единица.

Героя первого уровня быстро выносят пять начальных бандитов. На более поздних этапах игры он, конечно, становится в разы сильнее, особенно с артефактами.

Герой также нуждался в способностях, но на данном этапе фантазия моя уже иссякала, и способности стали калькой стандартных варкрафтовских. Я взял за основу те, что полезны в контексте карты – невидимость, например, или просветка. Спеллы становятся доступны на 2, 5, 8 уровнях и предшествуют, таким образом, открытию новых юнитов.

Лес и крипы

Для того, чтобы карта не сводилась исключительно к PvP и у игроков были еще потенциальные пути для развития (а также дневное занятие), я внёс в неё PvE-контент в виде «леса». Это четыре секции по краям карты, выполненные в виде лабиринта с крипами, а в конечной точке каждой секции находится босс.

<p>Лесок, вид из редактора.</p>

Лесок, вид из редактора.

Секции исполнены в стиле уникальных «биомов»: лес, болото, нагорье и чумные земли. Соответственно, крипы между секциями тоже отличаются модельками и способностями (на чумных землях орудует нежить, в нагорье – кобольды и т.п.). В каждую секцию можно войти с двух сторон, и по своеобразному «коридору» с ответвлениями явиться к боссу, по пути встречая точки с крипами. Крипы поделены на 4 тира по мощности, возрастающей по мере углубления игрока в «лес», у некоторых есть раздражающие способности вроде исцеления.

<p>Расположение точек в лесу по сложности от слабых (бледных) к боссу (красный). Зелёный круг – магазин. </p>

Расположение точек в лесу по сложности от слабых (бледных) к боссу (красный). Зелёный круг – магазин.

Крипов балансил таким образом, чтобы точка могла быть зачищена только усилиями пачки бандитов того же тира, что и сами мобы, но при этом были шансы при хорошем контроле убить группу бандитами тиром меньше. В любом случае, крипинг – дело непростое, но выгодное в плане прокачки героя, к тому же в лесу находятся магазины и лагеря наемников. Какие-то новые предметы в магазинах для карты я выдумывать не собирался изначально, у меня на примете были вещи из оригинала, хорошо вписывающиеся в концепцию, и я просто их ребаланснул. В лагерях наёмников можно купить сильных крипов и парочку интересных небоевых юнитов (например, там есть дополнительный взломщик - его применение кардинально меняет игру).

Убиваем босса на болоте.

Кончается «лесная» секция боссом. С боссов рандомно выпадает один из четырёх мощных артефактов: рандомное определение артефакта было для меня обязательным условием, поскольку я не хотел, чтобы игроки запоминали расположение того или иного предмета и шли конкретно за ним.

После всех мучений с триггерами и балансом работа над крипами показалась лёгкой прогулочкой по направлению к финишу. На тот момент оставалась только одна крупная задача: добить ландшафт и разместить все объекты на карте по задуманному плану.

Лэнд-дизайн

Моей любимой частью моддинга всегда был лэнд-дизайн. По какой-то причине я получал немыслимое удовольствие, ручками расставляя всякие ёлки и пеньки.

«Бандиты» заставили меня усомниться в своем пристрастии. Размер для карты я выбрал немаленький, ёлок и пеньков пришлось расставить много и процесс быстро превратился в рутину, а творческий полёт мысли усох. Хотя моделек и тайлов в игре в изобилии, при сборке крупной локации ограниченность набора декораций даёт о себе знать, и приходится сильно ухищряться, чтобы повторы не бросались в глаза. К концу спринта, посвященного лэнд-дизайну, меня уже тошнило от вида бесчисленных заборчиков, сеновалов и ящиков. Я ошибочно полагал, что этот этап разработки дастся легко – но нет, потрудиться пришлось и здесь.

Я очень люблю болотные ландшафты и имею долгую историю взаимоотношений с ними, но, увы, в «Бандитских войнах» свой потенциал болотного эстета не реализовал. Отчасти способствовал этому тот факт, что я поспешил детализировать болото в начале разработки, а к финалу его пришлось быстро перекраивать под новопридуманную логику расположения крипов. Другой болотный казус состоял в том, что карту я хоть и делал на Reforged, но обновлённую графику не включал и собирал всё в SD-режиме (ну не нравится мне новая графика). Когда решил потестить на HD, был немного опечален: в Reforged некоторые модельки не просто подтянули, а перерисовали в другом стиле, и собранная мной на SD картинка не всегда выглядела адекватно на HD. Особенно это затронуло болото, т.к. в нём я использовал деревья из Ашенваля, а в Reforged изначально зелёный Ашенваль почему-то перекрасили в фиолетовый цвет. Фиолетовые деревья никак не гармонировали с гаммой зелёных текстур на болоте, пришлось использовать деревья из другого тайлсета – к сожалению, подходят тоже не на 100%.

Больше всего мне понравилось собирать «чумные земли». Хотелось сделать заброшенные сельские угодья где-то за деревней, и вдохновлялся я темой вторжения нежити в Лордерон, знакомой всем по оригинальной игре. Я здесь немного соригинальничал, и в качестве стен и перегородок вместо традиционных насаждений деревьев использовал огороженные поля. Это разбавляет монотонность лесных заслонов и вызывает ощущение просторности локации (хотя на деле она узкая и коридорная). Подойдя к забору юнитом, игрок может даже не увидеть другого края поля.

Однако самый время- и трудозатратный участок карты – это, конечно, деревня. Здесь было важно расставить всё не только и не столько красиво, сколько функционально: ничто не должно препятствовать патрулям стражников, игроки должны проходить к домам, нужны скрытые «карманы», чтобы игрокам было где переждать тревогу. Одновременно хотелось, чтобы рельеф привносил дополнительную сложность и игрокам приходилось с ним считаться, поэтому деревню я наполнил темными местами и узкими проходами.

На случай, если вы забыли, как выглядит деревня сверху – скрин релизной версии. Зеленые кресты – лагеря игроков, голубые – дома для грабежа, фиолетовые – полезные здания.
На случай, если вы забыли, как выглядит деревня сверху – скрин релизной версии. Зеленые кресты – лагеря игроков, голубые – дома для грабежа, фиолетовые – полезные здания.

Основными дорогами деревня делится на четверти, в каждой из которых можно еще выделить «центральный» и «окраинный» район, разделенные побочной дорогой-тропинкой. В окраинных районах игрокам орудовать легче: патруль сюда заглянет только после повторной тревоги и тут есть, где спрятаться. Здесь же находятся полезные здания. В центральных районах грабить сложнее: все дома смотрят на главные улицы, при первой же тревоге по ней начнут бегать стражники. Из имеющихся 16 домов только 6 находятся на «безопасных» окраинах, при активном грабеже игроки быстро их исчерпают и перейдут к более рискованным центральным домам. Я декорировал деревню, пытаясь выдержать тонкий баланс между функциональностью, красотой и желанием сэкономить своё время.

Череда видов деревни в SD и HD-графике (не обращайте внимания на полупрозрачные модельки домов - баг SD при съёмке скриншота):

Последние штрихи

На «Бандитские войны» ушло куда больше сил, чем я изначально рассчитывал, поэтому в ноябре я выставил строгий дедлайн и несколько дней перед «релизом» работал ударно. Когда был доделан ландшафт, карта, по сути, оказалась готова к применению. Время до дедлайна ещё оставалось, и я решил долепить кое-что из отложенных идей.

Для оживления деревни были добавлены мирные жители. У них простое расписание – днём гуляют по деревне, а ночью «прячутся» в домах (на самом деле триггер перемещает их в специальную техническую зону). Кроме обитающих в деревне крестьян, я сделал триггер на периодическое появление «заблудившихся» жителей в рандомном месте вне деревни. Так я внёс чуточку «оживляжа» за границами села, и игрокам маленький приятный сюрприз – иногда можно подрезать случайного блудника и полутать немного денег. С теми же мотивами я сделал «торговца» - юнита, несущего в себе большое количество золота. Каждый день с небольшой вероятностью он спавнится на случайном краю карты и идёт в деревню, а потом уходит на другой случайный край карты и «покидает» её.

Встречаем торговца на дороге и не оставляем ему шансов.

В «Бандитских войнах» присутствует своеобразный полу-пасхальный эндгейм: при выполнении ряда условий есть возможность захватить деревню. Автоматической победой это не станет, но с полученными бонусами легко втоптать в грязь остальных игроков. Правда, чтобы деревню захватить, придется сильно постараться: сначала нужно перебить всех стражников, что уже довольно нелегко, и пережить череду последующих тяжёлых событий.

Хотя в релизной версии оказалось намного больше контента, чем планировалось сделать, в бэклоге у меня всё равно осталась кипа нереализованных идей – от случайных ивентов наподобие торговца до новых ступеней прокачки и юнитов. Как вы помните, идею про расы бандитов я тоже отложил. На текущий момент все игроки оперируют одинаковым набором юнитов, как в первоначальном замысле; я сколотил только небольшой задел на будущее в виде выбора расы-«скина» в начале игры – можно выбрать определенный набор моделек, но характеристики у всех рас пока одинаковые.

<p>«Выбор» расы.</p>

«Выбор» расы.

Если бы я принялся реализовывать всё, что задумывал, то карта бы увидела свет очень нескоро. Или вообще не увидела, потому что с увеличением срока разработки неизбежно увеличивается шанс её забросить. Придумывать идеи можно бесконечно, как и клепать что-то на их основе, как и полировать полученное до идеального состояния. Чтобы довести «проект» до логического завершения и покончить с картой, пришлось переспорить внутреннего перфекциониста. Редактор уже поднадоел, а появление первого играбельного варианта поселило во мне нетерпеливое желание поскорее показать карту друзьям, поэтому я собрал волю в кулак и поставил точку в работе над «Бандитскими войнами».

Релиз и заключение

Я начал тесты в «реальных» игровых условиях и внезапно ощутил удовольствие от кривеньких плодов своего труда. Сразу потащил в WC3 друга, и вскоре мы столкнулись на просторах «Бандитских войн». Всплывали баги (и мне приходилось каждый день штамповать патчи, несмотря на обещание не возвращаться в редактор), но их малое количество приятно удивляло, да и положительных моментов всё же было больше. Все механики исправно работали, карта оказалась более чем играбельна, в ней присутствовал задуманный геймплей. Приятно смотрелся ландшафт, даже вымученный баланс показал себя хорошо: в патчах я почти не вносил правок в статы юнитов, а герои и вовсе остались нетронутыми.

Гоп-стоп.

В играх часто возникали интересные геймплейные ситуации. Например, мы с противником схлестнулись посреди деревни за добычу, в пылу схватки потеряли чувство времени и нас внезапно накрыл проснувшийся патруль. Пришлось сбрасывать золото и спасаться, кто как может. Неожиданные и забавные вещи случались регулярно, чему я неподдельно радовался: спонтанное возникновение таких ситуаций было индикатором того, что карта «работает», что в ней есть событийная вариативность, способная заинтересовать игрока. А ещё это было попросту весело.

Объясняю другу устройство карты на пальцах.

После формального «релиза» в двадцатых числах ноября карта обкатывалась уже не только мной, но и друзьями. Вплоть до января продолжалось исправление багов и допиливание «Бандитов»: я сделал более сотни больших и малых изменений. Среди больших, например, – «одиночный режим», активирующийся в присутствии одного игрока и позволяющий пройти карту в PvE. Первая релизная версия обозначалась 0.6; только спустя десять патчей, на версии 0.7, я выложил карту в общий доступ. С друзьями мы сыграли не одну и не две катки, а много больше. Я ощущал удовлетворение не только и не столько от игрового процесса, сколько от вида собственных идей, воплотившихся в итоговую форму путём упорных стараний. Эти чувства сложно с чем-то сравнить.

Текст вышел гигантский, хотя многое я оставил за кадром, постаравшись сосредоточиться на ключевых вещах; на деле, конечно, увидено, сделано и понято было куда больше. История про «Бандитские войны» во многом личная, поскольку с точки зрения моддинга/мапмейкинга здесь, наверное, не происходило ничего интересного – вряд ли я придумал некие оригинальные решения (а что-то наверняка сделал просто неправильно). Зато я порадовал себя и друзей, попробовал что-то новое и получил немаленький опыт. Не стесняйтесь реализовывать свои идеи, пусть даже выйдет плохо: труд обязательно окупится полученными знаниями и свежими впечатлениями, а это уже успех.

P.S. Карту можно скачать здесь.

5757
25 комментариев

Хорош.

Ты конечно опоздал лет на 10, но всё равно гигахорош, и лонг мощный.

Тебе бы на XGM в его золотые годы

6
Ответить

Даже не на 10 лет опоздал, а на все 15)
Спасибо!

2
Ответить

а получилась хуйня. бывает брат

4
Ответить

Хорош) интересно было читать

2
Ответить

Спасибо! Рад, что было интересно)

3
Ответить

Надеюсь 5к за лонг будут твоими)

2
Ответить

Это вряд ли, но спасибо)

3
Ответить