на главную
об игре
Empire Earth 13.11.2001

Расширение возможностей редактора Empire Earth

Журнал “Игромания” №3/54 2002
Автор: Андрей Верещагин

ИМПЕРИЯ ИЛЛЮЗИЙ
Расширение возможностей редактора Empire Earth в домашних условиях

Изюм и клюква Empire Earth — генератор случайных карт. В него заложены элементы AI, позволяющие компьютеру каждый раз выдавать на-гора играбельный мап, а не очередную голую прерию, где до ближайшего ресурса — три дня лету. Но гнилой чернослив подкрался со стороны настроек, которых очень мало. В результате все случайные карты похожи друг на друга, как две капли воды. Наша задача — внести творческую нотку в процесс мапмейкерства и добиться разнообразия в конечном продукте.
Давайте сделаем карту, как ХОЧЕТСЯ НАМ, а не как нам разрешили разработчики.

Король-то... голый
Скрипты для случайных карт помещаются в *.rmv-файлах, проживающих по адресу: \Data\Random Map Scripts. Каждый из этих файлов соответствует определенному типу случайной карты и заимствует у него имя. Напомню, что таких типов (а соответственно, и *.rmv-файлов) насчитывается семь: Continental, Highlands, Large Islands, Mediterranean, Plains, Small Islands и Tournament Islands.
В той же директории (\Random Map Scripts) вы можете обнаружить восемь подкаталогов. В первом из них — \Common — место забронировали *.rmv-файлы с общими скриптами, используемыми при создании случайной карты любого типа. Остальные местные подкаталоги содержат вспомогательные скрипты для каждого типа случайной карты (названы они соответственно). В каждый набор вспомогательных скриптов входят файлы X Tiny.rmv, X Small.rmv, X Medium.rmv, X Large.rmv, X Huge.rmv, X Gigantic.rmv, где X — название типа случайной карты. В файлах вида X Tiny.rmv прописаны команды, выполняемые при создании случайных карт типа X минимальной величины, в X Small.rmv — малой величины, в X Medium.rmv — средней, в X Large.rmv — большой, в X Huge.rmv — очень большой и в X Gigantic.rmv — гигантской.
Путем редактирования перечисленных выше файлов вы можете изменить на свой вкус любую предложенную авторами случайную карту. Хотя, на мой взгляд, лучше просто создать новый тип случайной карты, который бы полностью удовлетворял вашим требованиям.
Первым делом сделайте копию с одного из основных *.rmv-файлов, находясь в директории \Random Map Scripts (файлы Continental.rmv, Plains.rmv и Tournament Islands.rmv использовать для этого не рекомендуется — с ними могут возникнуть некоторые трудности). Поместите ее сюда же, присвоив новому файлу то имя, которым вы хотите назвать свой тип случайной карты. Здесь же создайте новый каталог, обозвав его так же, как и созданный вами *.rmv-файл. Скопируйте в этот каталог все файлы, которые находятся в папке, относящейся к тому скрипту, с которого вы чуть раньше сняли копию. Далее переименуйте каждый из переписанных файлов, заменив первое слово в его имени на название нового типа случайной карты. К примеру, файл Mediterranean Medium.rmv следует переименовать в My Medium.rmv при условии, что ваш тип случайной карты называется My (далее для краткости буду называть его именно так).
Наконец, заберитесь в директорию \Common и снимите копии со всех местных *.rmv-файлов. Скопированные файлы вставьте в эту же директорию, но при этом заменив в имени каждого из них слово Common на My.


Следующим этапом является редактирование внутренностей основного *.rmv-файла (того, что называется My.rmv), относящегося к создаваемому вами типу случайной карты. Для этого достаточно стандартного “Блокнота”.
Открыв файл, удалите строку вида StringTableID 2700..., примостившуюся в начале, а также строчки FilterHeightMap false и TestingLandDistribution false, располагающиеся в конце. Затем поставьте вместо X название создаваемого вами типа случайных карт в строках вида:
#include "Common\X Map Climate"
#include "Common\X Conditions"
#include "Common\X Terrain Painting"
#include "Common\X Forests"
#include "Common\X Initial Units"
#include "X\X Tiny"
#include "X\X Small"
#include "X\X Medium"
#include "X\X Large"
#include "X\X Huge"
#include "X\X Gigantic"
Приготовления на этом закончены. Можно приступать к созданию вашей уникальной карты.

Царь-государь и его приставы
Сначала совершим ряд преобразований над файлом My Initial Units.rmv, находящимся в папке \Common. Содержимое файла можно условно разбить на две части, первая из которых начинается после слов Animal units и посвящена животным, располагающимся на случайной карте создаваемого вами типа. Важнейшими параметрами, с которыми вы можете здесь встретиться, являются:
AvailableAnimals — определяет, какие представители животного мира населяют вашу случайную карту. Местные значения (если их несколько) должны быть перечислены через запятую и заключены в скобки. Например,


(Res-Deer, Res-Giraffe, Res-Goat).


Список возможных значений таков: Res-Deer (олень), Res-Giraffe (жираф), Res-Goat (козел), Res-Horse (лошадь), Res-Wolf (волк), Res-Elephant (слон), Res-Hippopotamus (бегемот), Res-Ostrich (страус), Res-Tiger (тигр), Res-Walrus (морж), Res-Chicken (курица). Внимания заслуживает курица, которую авторы почему-то не включили ни в один из оригинальных типов случайной карты, да и в миссиях кампании я ее не встречал.
RandomHerdPerPlayer — число стад животных, находящихся на территории одного игрока. Обратите внимание на то, что не все представители животного мира обитают стадами. Тигры, например, предпочитают пребывать в гордом одиночестве. Максимализм — прямая противоположность баланса, который, в свою очередь, — суть основа любой приличной карты... Но! Не откажите себе в удовольствии хотя бы разок сыграть миссию в пустыне, по которой перемещаются огромные стада диких козлов или свирепых жирафов! Оно того стоит.
RandomHerdPerNeutral — число стад животных, находящихся на нейтральной территории. Этим параметром можно еще больше усугубить тот беспредел, который мы учинили предыдущей опцией. Учитывая тот факт, что стада, живущие в “центре”, никогда не выходят на периферию, а обитатели окраин никогда не забредают к вашей базе, можно покрыть карту равномерным слоем бегемотов, лошадей и волков. Причем сделать это так, что ареалы видов не будут пересекаться. Товарищи биологи, это к вам... Игра предоставляет прекрасные возможности по моделированию экосистем. Не упустите свой шанс...
После слов Initial units и необходимых комментариев следует вторая часть файла, где прописываются все юниты и строения, которые будут иметь в своем распоряжении воюющие стороны в начале игры (по умолчанию это — главное здание и крестьяне). И тут можно поступить незаурядно. Как вам идея начать игру с огромным войском или с уже построенными важнейшими зданиями? Или со всем вместе? Реальный способ сделать из стратегии чистой воды тактику. Все сторонники активных боевых действия и не любители отстраивать базы, вышеописанный способ создания карты — для вас.
А ведь можно начать игру вообще без крестьян и главного здания! Если до этого мы с вами получили тактику "чистую", то теперь пришел черед "чистейшей". Тем более что авторы создали для этого все необходимые условия: богатые возможности по командованию войсками и более чем разумное руководство своей армией со стороны компьютера.
Чтобы добавить в список начальных построек/юнитов новый образец, используйте команду PlaceUnit (N, X, Y, T), где N — название объекта/субъекта, X — расстояние (в клетках) от центра базы (при отсутствии главного здания центром базы является центральная точка территории, отводимой под игрока) до объекта/субъекта по оси X, Y — по оси Y, а T — угол (в градусах) поворота (последний параметр имеется только у юнитов, строениям он просто не нужен). Указываемое здесь название юнита полностью соответствует тому, что он носит в игре (если название состоит из нескольких слов, не ставьте между ними пробел). Имя постройки образуется тем же способом, только с добавлением буквы b в начало названия. Так, например, бараки (Barracks) здесь следует называть так: bBarracks.
Если вы хотите установить на карте стену, используйте команду PlaceWall(bWall-A, X1, Y1, X2, Y2), где A — тип стены, X1 — начальная координата стены по оси X, Y1 — по оси Y; X2 — конечная координата по оси X, Y2 — по оси Y. Список возможных значений для A таков (значения расставлены в порядке возрастания прочности стены): Copper, Bronze, Middle, Imperial, WW1, Digital. Используя данную команду, вы можете окружить плотной стеной базу каждого из игроков, избавив тем самым их от утомительной процедуры строительства стен и исключив возможность быстрой победы. Очень интересно играть на карте, которая сплошь покрыта хитросплетениями коридоров из воздвигнутых вами стен. AI в этом случае пасует, а вот реальный противник по дефматчу — наоборот, только звереет... Что нам, собственно, и нужно. Пока ваш приятель будет озверевать от невозможности быстро выбраться из лабиринта, вы тихой сапой прокрадетесь и покажете оппоненту места зимовья раков. Надеюсь, вы не забыли, что по лабиринту разгуливают стада бегемотов и козлов?! Ведете вы себе армию в тыл к врагу, уже почти добрались... и тут вам навстречу вываливается стадо из сотни-другой гиппопотамов и начинает безжалостно топтать ваших воинов. Своеобразный элемент неожиданности! Но веселье обеспечено... мы в редакции просто лежали, наблюдая, как войско Геймера запуталось в эскадроне отважных курей, бросившихся под ноги рыцарям на самых подступах к Катиной базе. Сколько пернатых полегло — никто не считал.
Добавлять добавляем, но не усердствуем... больше того, стараемся отсечь все лишнее, как завещал великий скульптор. Если вы желаете убрать из списка начальных сооружений и юнитов, скажем, главное здание, просто удалите строку с командой PlaceUnit (bCapitol, -0.5, -0.5). Если нужно избавиться от крестьян, удалите команды вида PlaceUnit (Citizen, ...) и PlaceUnit (FemaleCitizen, ...) (последняя команда добавляет на карту крестьян женского пола). Во-первых, это поможет в борьбе с чрезмерно наплодившимися зверями, а во-вторых, позволит тонко смоделировать новую карту, добиваясь баланса, который многим только снится.

Королевство и сопредельные
Теперь, когда основная модель новой карты готова, животные запущены и стратегия боя разработана, можно заняться редактированием вспомогательных скриптов, находящихся в отдельной папке. Все они имеют одну и ту же структуру и разбиты на блоки в соответствии с количеством игроков, принимающих участие в игре. Название блоков происходит от числа участников игры с добавлением слова PLAYERS, например, 16 PLAYERS. Исключение составляет лишь первый блок, содержащий общие параметры, использующиеся независимо от того, сколько игроков играет на карте. Из всех параметров начального блока нас интересует лишь один: ResourcePlacementLimit (N, MIN, MAX). Этой характеристикой задается минимальное (MIN) и максимальное (MAX) возможное расстояние (в клетках) между месторождением ресурса, заданного параметром N (вместо N могут стоять следующие значения: Gold — золото, Steel — железо, Berry — ягоды, Tree — деревья, Stone — камни), и центром базы любого игрока. Если ваша цель — сделать геймплей на своей случайной карте максимально динамичным, ставьте сюда значения пониже.
Начиная со второго блока файла, все параметры несколько меняют свой вид: перед ними ставится надпись #define. Не обращайте на нее внимания — она создана для служебных целей. Вот список основных характеристик, с которыми вы можете здесь столкнуться.
kMinIntElevation — самая высокая точка на вашей карте (в клетках).
kMaxIntElevation — самая низкая точка на вашей карте (также в клетках).
Все разнообразие рельефа Земли — от скалистых гор до болотистых равнин — можно реализовать на вашей карте. Стоит лишь немного поиграть с этими двумя параметрами.
kPercentLand — место на карте, занятое сушей (максимум — 1); оставшуюся площадь будет занимать вода. Замечание: значения для данного параметра устанавливаются следующим образом: Between(.A, .B), где A — минимальное значение, а B — максимальное. Например,


Between(.70, .75).

Поставив сюда небольшое значение (скажем, в пределах 30 процентов), вы можете превратить свою случайную карту во вторую Венецию, дав простор для действия своим “водным” юнитам. Возможно проводить настоящие морские баталии с участием двух, трех и более флотилий.
kHeightMapChaos — неравномерность распределения рельефа местности.
kMinimumStartPositionToMapEdge — минимальное расстояние (в клетках) между вашей базой и краем карты.
kMaxAngleBetweenTeamMembers — максимальный угол (в градусах) между базами игроков-напарников.
kPlayerPercentFlat — территория на карте (в процентах), занятая равнинами. Это опять к вопросу о рельефе.
kMaxResourceElevation — максимальная высота (в клетках), на которой может находиться месторождение какого-либо ресурса.
kResourceToEdgeDistance — минимальное расстояние (в клетках) от края карты до любого источника ресурсов.
kResourceToWaterDistance — минимальное расстояние (также в клетках) от воды до любого месторождения ресурсов. Совсем уж оттеснять ресурсы к центу карты или, наоборот, к периферии не советую, но ради эксперимента и новизны игровых ощущений можно попробовать и крайности.
Характеристикой вида kXPerPlayer определяется, сколько источников ресурса, имя которого указывается вместо X, находится в области, отведенной под одного игрока. Повышение значений параметров, имеющих такой вид, в лучшую сторону влияет на динамичность игрового процесса на случайной карте. Параметры вида kXPerNeutral определяют, сколько месторождений ресурса, указанного вместо X, располагается на нейтральной территории.
Здесь же мы можем обнаружить характеристики kOilPerPlayer и kOilPerNeutral, которые ни на что не влияют (вероятно, они использовались в самых ранних версиях игры), но позволяют нам сделать
вывод о том, что первоначально в игре было шесть ресурсов, среди которых числилась нефть.
Далее следуют параметры леса:
kForestFreeRadius — величина леса (в клетках), находящегося на нейтральной территории;
kForestsPerPlayer — величина леса (также в клетках), находящегося на территории одного игрока;
kForestChaosLevel — хаотичность расстановки деревьев в лесу. Чем выше, тем более естественно выглядит лес.
И если до этого мы модифицировали геологический рельеф, то теперь нам открывается прекрасная возможность изменять рельеф биологический. Можно перекраивать на новый лад результат биогеоценотических взаимодействий живых организмов и неживой природной материи. Если быть проще, то можно засадить свою карту зелеными насаждениями... Кислорода от этого больше не станет — разработчики не предусмотрели в игре такой параметр — но вот на движении войск по карте подобная манипуляция отразится... Да еще как. А как насчет того, чтобы создать систему живых изгородей вокруг собственной базы?.. Зачатки смекалки — и вы сами придумаете такое, что все западные картоделы выпадут в осадок.

* * *
Мы подошли к финишной черте. Но прежде чем ее пересекать, хочу обратить ваше внимание, что в статье разобраны только самые важные параметры случайной карты — с остальными вы можете поработать сами, благо в этом нет ничего сложного. Равно как и нет ничего сложного в создании абсолютно нового типа карты, на котором было бы действительно интересно играть и вам, и вашим друзьям. Нужно только немного терпения и фантазии. Остальное придет с опытом... И не забывайте, что созданные карты можно — и нужно — присылать в редакцию (на адрес makarenkOFF@igromania.ru), чтобы мы могли обнародовать ваши нетленки на нашем компакте.

Комментарии: 6
Ваш комментарий

Автор молодец, что написал всё в подробностях, куда было бы сложнее разбираться, когда всё написано в "двух словах".
Ещё посоветовал бы Автору делать в будущем так:
- параметры, директивы записывать жирным шрифтом, - читабельность улучшится :)
Н-р:
RandomHerdPerPlayer — число стад животных, ....

А в остальном статья хорошая.

0

Кто нибудь разобрался со скриптами в редакторе сценариев игры Empire Earth - Art Of Conquest ,если такой есть,то хотелось спросить как зделать что бы при приближении дипломата к лучнику,отнималось 20 золота и создовался лучник,заранее спасибо за ответ.

0

SWORD-DEMON
Кстати, в Empire Earth "DirectX Great Path"(starting on modern OS) есть скрипты, встроенные в установщик патча для генерации случайных карт новых видов, а так же возможность выставления гораздо большего количества начальных юнитов "рабочий" и максимальной численности населения 4000 и некоторые другие возможности...
Ссылка:http://www.playground.ru/files/empire_earth_directx_great_path_starting_on_modern_os-167572/

0