Как сделать карту для Age of Empires II (random map scripts). Часть 1

23.01.2020 Автор: Paradox

ПРОЛОГ

RMS-карты многие путают со сценариями (которые в самой игре создаются в визуальном редакторе). Однако, это совершенно разные вещи. Отличие состоит в том, что в сценариях вы создаете строго фиксированную местность (что нарисуете, так карта и будет выглядеть). Это отличный инструмент, если мы создаем какую-нибудь миссию (кампанию). Но для командных игр — однообразие не годится.

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

RMS-карты (Random Map Scripts) — это специальные скрипты записанные в текстовый файл с расширением rms.  Создавать их можно в любом текстовом редакторе (например, в Блокноте). Хранятся пользовательские карты в специальной папке: пусть_к_игре\steamapps\common\Age2HD\resources\_common\random-map-scripts

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

Часть текста я взял из англоязычной инструкции по созданию RMS-карт от Майкрософт и постарался перевести на максимально понятный русский язык. Но, как мог, упростил и для наглядности дополнил своими наработками. В частности, наше сегодняшнее повествование будет построено на примере создания простейшей, но вполне реальной карты. За основу мы возьмем карту Оазис и воссоздадим его прямо в процессе прочтения Вами этой статьи. Поехали.

 

<СИНТАКСИС>


Скрипт rms-карт достаточно прост и логичен. Вам не нужно глобальных знаний языков программирования. Однако, кое какой информацией стоит заручиться сразу.

RMS-скрипты чувствительны к регистру

{}  — скобки заключают команды под определенную инструкцию.

/* комментарий  */ — так мы можем встроить в скрипт комментарий, который не обрабатывается игрой. Он служит, для удобства работы.

На картах нет фиксированного положения верх/низ/лево/право. Верх карты может меняться произвольно при каждом новом запуске игры.

В качестве единицы измерения расстояния используются тайлы (1 тайл — это 1 условная клетка в игре).

Размер карты

(согласно синтаксису)

Размер карты

(в игре)

Длина/ширина

(в тайлах)

Общее количество тайлов Коэффициент масштабирования
tiny_map 2 игрока 72×72 5,184 0.5
small_map 3 игрока 96×96 9,216 0.9
medium_map 4 игрока 120×120 14,400 1.4
large_map 6 игроков 144×144 20,736 2.1
huge_map 8 игроков 200×200 40,000 4.0
gigantic_map Огромная 255×255 62,025 6.2

По этой таблице мы наглядно видим, что Гигантская карта в 12,4 раза больше крошечной карты, хотя одна сторона каждой карты только в 3,4 раза больше. Позже, нам пригодиться эта информация. Ибо мы разберем, как можно использовать коэффициент масштабирования для размещения большего количества объектов на карте большего размера относительно карты меньшего размера.

Написание rms-карты подразделяется на 7 основных частей. Каждая часть озаглавлена определённым тегом. Теги располагаются, как правило, в таком порядке:

<PLAYER_SETUP>
Установки игроков

<LAND_GENERATION>
Создает все основные земли такие как острова, базы игроков, оазис или арену в центре карты.

<TERRAIN_GENERATION>
Создает ландшафт на каждом отдельном типе земель. Ниже вы все поймете.

<OBJECTS_GENERATION>
Создает объекты, такие как деревья, живность, ТЦ, крестьян и т.д.

<CONNECTION_GENERATION>
Соединяет различные зоны, например, соединение остров проходами

<ELEVATION_GENERATION>
Создаёт рельеф местности (холмы и низины)

<CLIFF_GENERATION>
Создает скалы

 

<PLAYER_SETUP>


Этот раздел обязателен для всех карт и имеет всего два условия:

random_placement
Размещает игроков в случайном порядке (используется на большинстве карт). Например, при этом параметре каждый игрок получит свою отдельную Арену. Или свой отдельный остров (на карте Острова, например).

grouped_by_team
объединяет игроков одной команды (используется, например, на картах типа Team Arena (командная арена) или Острова для команд (где каждая команда получает свой общий остров)

У нас Оазис. Поэтому начинаем нашу карту так:

<PLAYER_SETUP>

random_placement

 

<LAND_GENERATION>


В этом разделе мы задаем основную местность на карте.

base_terrain     <значение>
Определяем, с какой местности по умолчанию начать. Т.е. на водных картах, как правило мы ставим значение WATER (вода). В Черном лесу FOREST (лес). А на открытых картах, таких как Арабия мы ставим значение GRASS (трава).

create_player_lands     {инструкции}
Создаем земли игроков. Процент земли, отведенной под земли игроков, делится между всеми игроками. Следовательно, если было указано, что земли игроков занимают 20% карты, то 2 игрока получают по 10%, а 4 игрока — по 5% и т.д.

create_land       {инструкции}
Создает участок земли, который не предназначен для игроков. В нашем случае, карта Оазис подразумевает наличие “острова” из леса в центре карты. Именно в этой команде мы его и создадим.

Давайте попробуем:

<PLAYER_SETUP>
random_placement

<LAND_GENERATION>
base_terrain GRASS /* у нас открытая  карта, поэтому за основу мы принимаем траву */

/* Создаем ОАЗИС в центре */

create_land
{  terrain_type                     FOREST       /* тип местностилес */
land_percent                     100         /* 100% вверенной территории заполняем лесом */
left_border                      35           /* мы отодвигаем наш оазис от левого края на 35% */
right_border                     35              /* тоже самое делаем и с остальными краями, тем самым помещая Оазис в центре нашей карты  */
top_border                       35
bottom_border                    35
}

/* Создаем землю игроков */

create_player_lands
{
terrain_type GRASS      /* тип местности — трава*/
land_percent 100          /* 100% на всех игроков */
base_size 10        /* 10 тайлов это радиус базы игрока. */
other_zone_avoidance_distance 12            /* расстояние в тайлах между базой игрока и другими видами земель. */
}

Вот что у нас получилось:


Можно добавить еще одну землю. Например, озеро в центр Оазиса.

create_land
{
terrain_type                     WATER          /* тип местности — Вода */
land_percent                     5           /* размер озера в процентах от карты */
left_border                      40          /* отодвигаем озеро от каря карты. Так как сам оазис у нас отодвинут на 35%, чтобы озеро оказалось внутри Оазиса – нам нужно поставить цифру больше 35. В моем примере пусть будет 40 */
right_border                     40
top_border                       40
bottom_border                    40
}

И теперь мы видим вот такую картину:

 

Тут у нас три земли по факту:

  • База игроков (мы пока ее не видим, так как мы еще не добавили ТЦ, крестьян и т.д.)
  • Оазис из леса в центре
  • Озеро в центре Оазиса

Ниже я распишу дополнительные инструкции, которые мы также можем применять к данному разделу:

terrain_type <название местности>
Определяет, какой тип местности мы создаем. Для Оазиса – это лес. Для земель Игрока это трава или пустыня.

land_percent <процент>
Определяет, какой процент карты занимает площадь земли. Для Земель игроков эта область будет разделена на количество игроков, поэтому, если число установлено на 60%, и в нем 6 игроков, каждый из них начнёт с примерно 10% карты. Оптимально ставить не менее 60-80%.

number_of_tiles <# количество тайлов >
Альтернативный способ указать размер земельного участка, в данном случае по количеству тайлов. В отличие от Land_percent, эти области не будут масштабироваться с размером карты. Используем либо Land_percent либо Number_of_tiles.

base_size <# количество тайлов >
Определяет минимальный радиус определенного участка. Эта инструкция задается для обеспечения того, чтобы у каждого игрока была достаточно большая территория. Если Base_size не указан, земли игроков могут быть тонкими и змеиноподобными. Мы указали размер базы игрока в 10 тайлов.

left_border <процент>
right_border <процент>
top_border <процент>
bottom_border <процент>
Расстояние от края карты до участка земли. В данном случае, чтобы нам поместить оазис в центре, мы задали границу 35. Если бы наоборот, нужно было бы расположить лес по краю карту, то стоит ставить границу в районе 5% например.

border_fuzziness <процент>
Процент излома границы местности. Если эта инструкция не используется, границы будут прямыми. Задание низкого числа, 5-20, сделает края рваными и больше похоже на реальную местность. Мы хотим получить круглый и ровный “остров из леса” – поэтому не использовали этот параметр.

zone <# номер зоны>
Это команда, используемая для назначения метки определенной территории. Зоны с одинаковым идентификатором могут перекрываться, зоны с разными идентификаторами – не будут накладываться друг на друга. Если зона не указана, каждый игрок будет иметь свою отдельную базу.

land_id <# id>
Назначает метку определенной области земли, которая может использоваться для назначения объектов только этой земле (например, можно присвоить земле номер, и затем именно на земле с этим номером поместить дополнительное золото).

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

set_zone_randomly
Будут случайным образом определять зоны, так что некоторые игроки могут находиться на одном острове, а другие — на другом.

other_zone_avoidance_distance <# количество тайлов >
Эта инструкция определяет, какой должен быть размер земли, поэтому, если она не включена, земля не появится. Дистанция между зонами используется для указания, например, ширины рек между землями игроков.

assign_to_player <# игрок>
Назначает участок земли определенному игроку. Обратите внимание, это не работает с землями игроков.

clumping_factor <# значение>
Фактор скопления влияет на то, как формируются земли. Значение по умолчанию — 8, а диапазон — от 1 до 15. Меньшие числа, как правило, образуют змеиноподобные острова, а более высокие числа, как правило, дают квадраты. Обратите внимание, что clumping_factor для <LAND_GENERATION> и <TERRAIN_GENERATION> имеет разные диапазоны и значения по умолчанию. Далее мы применим этот параметр.

 

<TERRAIN_GENERATION>


Создание ландшафта отличается от создания земель. Земли – это ключевые объекты карты.  Ландшафт же создается на землях и позволяет выделять какие-то отдельные элементы, такие как островки леса на базе игрока или озеро внутри оазиса. Важным отличием является то, что важен порядок расстановки ландшафта на местности. Если вы хотите разместите болото на участке с травой, но в тексте скрипта поместите болото выше, чем инструкцию по генерации травы на карту, то вы не увидите болота. Помните: земли <LAND_GENERATION> генерируются все сразу. Ландшафт <TERRAIN_GENERATION> и объекты <OBJECTS_GENERATION> генерируются по порядку.

 

Сейчас станет понятнее. Давайте на нашей карте, добавим ландшафт в виде глины.

 

<TERRAIN_GENERATION>

 

create_terrain DIRT /* вид ландшафта, который мы хотим разместить. В нашем случае берем DIRT (дословно — грязь) */

{

  base_terrain                   GRASS /* указываем землю, на которую мы генерируем наш ландшафт. В нашем случае генерируем его на базовую землю, на траву */

  number_of_clumps               10 /* указываем количество островков с глиной */

  spacing_to_other_terrain_types 3 /* расстояние до других элементов ландшафта */

  land_percent                   10 /* размер островов глины в процентах, берем 10%, чтобы сделать их небольшими и немаленькими */

  set_scale_by_size /* задаем параметр масштабирования по размеру карты */

}

 

И вот что у нас получилось:

 

Чтобы стало еще понятнее, давайте снова добавим озеро в центр нашего оазиса, но уже используя именно ландшафтное оформление. И даже не просто добавим. А заполним наш оазис водой, оставив лишь тонкую границу леса по краям. Итак, пишем следующие инструкции для ландшафта:

 

create_terrain WATER /* вид ландшафта, который мы хотим разместить. На сей раз берем воду */

{

  base_terrain                   FOREST /* нам нужно поместить озеро в оазис, поэтому пишем сюда FOREST */

  number_of_clumps               1 /* озеро должно быть одно, ставим 1. Или вообще убираем этот параметр */

  spacing_to_other_terrain_types 3 /* задаем толщину границы между водой и травой. Т.е. эта граница у нас останется заполненной лесом */

  land_percent                   100 /* размер озера берем 100% так как мы хотим полностью заполнить оазис водой */

  set_scale_by_size /* задаем параметр масштабирования по размеру карты */

}

 

И вот что мы с вами видим в итоге:

 

Неплохо? Фактически, ландшафт нам дает дополнительные возможностей по дизайну карты.

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

 

Ниже опишу все возможные инструкции для раздела <TERRAIN_GENERATION>:

 

create_terrain < название местности, которую мы хотим поместить на карту> {инструкции}

 

base_terrain < название местности >

Определяет тип местности, на которой будет размещен новый ландшафт. Например, пальмовая пустыня может быть размещена в пустыне, или grass3 может быть размещен на grass1.

 

land_percent <# процент карты для покрытия>

Процент общей площади, которую покрывает эта местность. Лучше всего использовать небольшие проценты (1-10) для местности, если планируется укладывать много разных типов местности.

 

number_of_tiles <# размер скопления ландшафта в тайлах>

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

 

number_of_clumps <# количество сгустков для размещения>

Процент или количество тайлов рельефа равномерно распределены в виде скоплений. Если количество скоплений = 3 и количество тайлов = 18, местность будет отображаться как 3 скопления по 6 тайлов каждый.

 

spacing_to_other_terrain_types <# расстояние до других типов местности>

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

 

set_scale_by_groups

Масштабирует количество скоплений ландшафта с размером карты (базовая карта 100×100). Таким образом, если указано 2 скопления, то большая карта будет иметь 2 (2 x 1,4) скопления, а гигантская карта будет иметь 13 (2 x 6,5) скоплений.

 

set_scale_by_size

Масштабирует размер участка местности с размером карты. Таким образом, если указано 10 тайлов, то большая карта будет иметь 140 (10 x 1,4) плиток, а гигантская карта будет иметь 650 (10 x 6,5) тайлов.

 

set_avoid_player_start_areas

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

 

clumping_factor <# значение>

Скопление влияет на то, сколько земли имеет тенденцию образовывать квадраты вместо прямоугольников. Значение по умолчанию — 20. Меньшие числа, как правило, приводят к появлению змеевидных скоплний, в то время как более высокие числа приводят к появлению квадратов.

 

height_limits <# минимальная высота тайла> <# максимальная высота тайла>

Определяет, на какой высоте может быть размещена местность (от 0 до 8). Эта инструкция может использоваться для размещения травы на вершинах холмов или для размещения воды только в углублениях.

 

set_flat_terrain_only

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

 

 

<OBJECTS_GENERATION>


Как только земли и ландшафт сформированы, мы готовы размещать на карте объекты, такие как ТЦ, крестьян, живность, ресурсы и т.п.

Давайте сразу перейдем к делу и поместим на нашу карту Ратушу (ТЦ), крестьян и скаута

 

<OBJECTS_GENERATION>

 

create_object TOWN_CENTER /* создаем Ратушу (ТЦ) */

{

set_place_for_every_player /* задаем положение для каждого игрока */

group_placement_radius     18

min_distance_to_players    0 /* минимальное расстояние до объекта от стартовой точки игрока, для ТЦ это 0 */

max_distance_to_players    0 /* максимальное расстояние до объекта от стартовой точки игрока, для ТЦ это 0 */

}

 

create_object VILLAGER /* создаем крестьян. Для всех цивилизаций по умолчанию генерируется 3 крестьянина. Для Майя и Китайцев – 4 и 6 крестьян соответственно */

{

set_place_for_every_player

min_distance_to_players       6 /* минимальное расстояние до объекта от стартовой точки игрока (по факту от ТЦ). Т.е. крестьяне будут генерироваться на расстоянии в 6 тайлов от ТЦ */

max_distance_to_players       6

}

 

create_object SCOUT /* создаем скаута. Для всех цивилизаций по умолчанию генерируется Скаут. Для индейцев (Майя, Ацтеков, Инков) — орлы */

{

number_of_objects             1 /* задаем количество скаутов, по умолчанию, скаут один, разумеется */

set_place_for_every_player

min_distance_to_players       7

max_distance_to_players       9 /* минимальное расстояние до объекта от стартовой точки игрока (по факту от ТЦ). Т.е. скаут будет генерироваться на расстоянии от 7 до 9 тайлов от ТЦ */

}

 

И вот на нашей карте уже появилась жизнь:

 

Итак, разбираем инструкции для объектов:

 

create_object <название объекта> {инструкции}

Создаем сам объект (ТЦ, крестьянина, скаута, золото, что угодно)

 

min_distance_to_players <# количество тайлов>

max_distance_to_players <# количество тайлов>

Определяет пределы, где объект может быть размещен относительно центра земли игрока. Объект появится случайным образом в любом месте между минимумом и максимумом. Например, центр города с минимальным 0 и максимальным 0 появится в центре земель каждого игрока. Золото, расположенная в 10-12, появится на расстоянии одного экрана от центра города, но не слишком далеко. Значения по умолчанию для этих инструкций — 0 и бесконечность, соответственно, поэтому, если расстояние не указано, объект появится случайным образом на этой земле. Будьте внимательны, чтобы не указать минимум, который больше радиуса земли, иначе объект может не появиться или может появиться не в том месте. Помните, что при использовании с place_on_specific_land_id вместо set_place_for_every_player расстояния относятся к центру этого участка земли, а не к игрокам.

 

set_scaling_to_map_size

Масштабирует количество групп в зависимости от размера карты. Когда используется эта инструкция, number_of_groups будет применяться только к Большим картам. Например, если на Большой карте указано 6 групп, то Средняя Карта будет иметь 4 группы, а Малая Карта будет иметь 2. Примечание. Если number_of_groups не используется (по существу, все объекты разделяются), применяется масштабирование к самим объектам. Это хороший способ размещать на карте такие вещи, как рыбу и деревья на карте. Укажите большое количество объектов, не задавая им группы, а затем используйте set_scaling_of_groups_to_map_size. Кроме того, вы можете создать большое количество групп по одному объекту в каждой. Эффект будет таким же. Обратите внимание, что масштабирование может быть установлено на номер игрока или размер карты, а не на оба. Тем не менее, можно иметь разные объекты одного типа с разными масштабами.

Пример:

create_object FISH

{

  число_объектов 50

  set_scaling_to_map_size

  terrain_to_place_on WATER

  set_gaia_object_only

  min_distance_group_placement 4

}

Создает 50 рыб (но на большой карте их будет автоматически больше, а на маленькой – меньше, согласно мастштабу и на расстоянии 4 тайлов от другой рыбы).

 

 

set_scaling_to_player_number

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

 

min_distance_group_placement <#в тайлах>

Расстояние до отдельного центра группы — предотвращает образование огромной пачки золота, камня и ягод. Как и в set_scaling_of_groups_to_map_size, если группы не назначены, то эта инструкция будет применяться ко всем объектам. Примечание: group_placement_radius, set_loose_grouping и set_tight_grouping будут переопределять разброс объектов и сохранять группу вместе.

Пример:

create_object FISH

{

  число_объектов 50

  set_scaling_of_groups_to_map_size

  terrain_to_place_on WATER

  set_gaia_object_only

  min_distance_group_placement 4

}

Создает 50 рыб (но на большой карте их будет автоматически больше, а на маленькой – меньше, согласно масштабу и на расстоянии 4 тайлов от другой рыбы).

 

 

max_distance_to_other_zones <#в тайлах>

Определяет, насколько близко объекты могут быть к другим зонам. Это полезно, если нужно разместить что-то, например подальше от воды или леса.

 

number_of_objects <# значение>

Определяет, сколько объектов размещено. Например, золотые рудники. Если группы не указаны, то для каждого объекта будет одна группа. Другими словами, все объекты будут разбросаны.

 

number_of_groups <# значение>

Определяет количество размещенных групп. Каждая группа будет иметь количество объектов, указанных в number_of_objects. Если группы не указаны, то для каждого объекта будет одна группа. Другими словами, все объекты будут разбросаны.

 

group_placement_radius <# в тайлах>

Определяет, сколько области занимает группа. Группы больших объектов могут стать очень длинными, если объекты размещены в ряд. Указание небольшого group_placement_radius ограничит группу меньшей областью.

 

set_loose_grouping

set_tight_grouping

Свободные группы могут иметь несколько тайлов пространства между объектами. Например, Олени и овцы – находятся на расстоянии друг от друга. А вот золото или камень мы плотно утрамбовываем в один рудник.

 

terrain_to_place_on <название местности>

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

 

set_gaia_object_only

Используется, если вы хотите, чтобы объект был Gaia (не принадлежащий игроку, природным), например, овцы или бонусные юниты, спрятанные на карте.

 

set_place_for_every_player

Размещает группу для каждого игрока. Если вы хотите, чтобы была для каждого игрока выпадали ягоды, например, то можно используйте этот параметр для объекта Ягоды (FORAGE). Если ли, же, мы хотим разместить дополнительные ягоды рандомно (без привязки к каждому игроку) то эту команду просто не используем.

 

place_on_specific_land_id <идентификатор земли>

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

 

Ничего не понятно? Ну так и должно быть. Давайте просто дополним нашу карту различными объектами с различными параметрами для наглядности.

 

Например, давайте на базу игрока добавим овец:

 

create_object SHEEP /* создаем овец */

{

   number_of_objects 4 /* указываем их количество, в данном случае 4 шт */

   set_loose_grouping /* устанавливаем между ними интервал, чтобы они не были в одной куче */

   set_gaia_object_only /* делаем их частью природы, они станут принадлежать игроку, только после того, как он их найдет */

   set_place_for_every_player /* этой инструкцией мы создаем овец для каждого игрока */

   min_distance_to_players    9 /* задаем расстояние от ТЦ до овец */

   max_distance_to_players    11

}

create_object SHEEP /* а теперь мы создаем дополнительных овец */

{

   number_of_objects 2 /* указываем количество, в данном случае 2 шт */

   number_of_groups 2 /* указываем количество групп, в данном случае мы получим 2 группы по 2 овцы */

   set_loose_grouping

   set_gaia_object_only

   set_place_for_every_player

   min_distance_to_players    14

   max_distance_to_players    30

}

 

Теперь добавим золото:

 

create_object GOLD /* создаем золото */

{

  number_of_objects          6 /* указываем количество в тайлах */

  group_placement_radius     3 /* указываем максимальный радиус золотого рудника. Чтобы золото не выстроилось в линейку 6х1 тайл, мы ограничиваем радиус до 2 тайлов. Т.е. у нас будет формироваться прииск на площади 3х3 тайла */

  set_tight_grouping /* убираем интервал между тайлами золота, чтобы оно было плотной группой */

  set_gaia_object_only

  set_place_for_every_player

  min_distance_to_players    12

  max_distance_to_players    16

  min_distance_group_placement  10 /* указываем минимальное расстояние до других золотых прииисков. Делается для того, чтобы бонусное золото не выпало тут же в соседнем тайле. */

  max_distance_to_other_zones  5 /* указываем минимальное расстояние до других зон. Делается для того, чтобы золото не выпало скажем в плотную к лесу (что делает его неудобнодобываевым и приводит к дисбалансу на карте */

}

 

И закрепим. Добавим в наше озеро рыбу.

 

create_object TUNA /* создаем рыбу TUNA */

{

  number_of_objects                   10 /* указываем количество */

  set_scaling_to_map_size /* задаем привязку количества к масштабу карты */

  set_gaia_object_only

  max_distance_to_other_zones         4 /* отодвигаем рыбу от других зон, в частности в нашем случае она будет не ближе 4 тайлов от берега */

  min_distance_group_placement  8 /* задаем расстояние между рыбой */

terrain_to_place_on WATER /* помещаем рыбу конкретно в наше озеро, имеющего ландшафт WATER */

}

 

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

 

 

<ELEVATION_GENERATION>


Этот параметр определяет рельеф нашей местности. Хомы и низины.

Рельеф использует те же самые параметры, что и ландшафт: base_terrain, number_of_clumps, number_of_tiles, set_scale_by_groups и set_scale_by_size. Но рельеф всегда избегают стартовой точки базы игрока.

 

Сама команда выглядит следующим образом:

create_elevation <# максимальная высота> {инструкции}

Диапазон высот составляет от 1 до 7. Обратите внимание, что отметки расположены не на указанной отметке, а до указанной отметки. Таким образом, если вы укажете высоту 6, вы получите некоторые возвышения от 1-6. Указание высоты 7 создаст холмы в диапазоне от 1-7.

 

Добавим к нашему Оазису холмы, разбросаем их по карте:

 

create_elevation 3 /* создаем холмы высотой от 1 до 3 */

{

base_terrain GRASS /* размещаем их по всей карте, указав GRASS, так как GRASS у нас является базовой землей */

number_of_clumps 16 /* количество холмов равномерно распределены в виде скоплений */

number_of_tiles                           500 /* общее количество тайлов, которые будут относится к холмам */

set_scale_by_groups /* указываем автоматический масштаб для групп */

 

set_scale_by_size /* указываем автоматический масштаб от размера карты */

}

 

 

<CLIFF_GENERATION>


Скалы могут разнообразить наши карты. А так же могут дополнительно помогать игрокам, особенно на открытых картах, вроде Арабии.

 

Поместим на нашу карту скалы:

<CLIFF_GENERATION>

min_number_of_cliffs 5

max_number_of_cliffs 8

min_length_of_cliff 4

max_length_of_cliff 10

cliff_curliness 10

min_distance_cliffs 3

 

Итого, мы получим:

Размещает 5-8 скал длиной 4-10 на карте, но держит их на расстоянии 3 тайла друг от друга.

 

min_number_of_cliffs <# количество скал>

max_number_of_cliffs <# количество скал>

Определяет диапазон количества скал на карте. Если указать не менее 1 и не более 12, то на карте появятся от 1 до 12 скал.

 

min_length_of_cliff <# расстояние в тайлах>

 max_length_of_cliff <# расстояние в тайлах>

Определяет длину каждого утеса.

 

cliff_curliness <# в процентах>

Определяет процентную вероятность того, что скала развернется, вместо того чтобы продолжать движение прямо. Большие числа приведут к появлению зигзагообразных скал, а низкие — к прямым. Как и во всем, экспериментируйте.

 

min_distance_cliffs <# расстояние в тайлах>

Чтобы избежать образования скал слишком близко к другим скалам, укажите минимальное расстояние.

 

 

<CONNECTION_GENERATION>


Раздел объединения земель — это взаимосвязь среди земель и ландшафтов на карте. Этот раздел используется, например, для прокладки дорог между городскими центрами, для отмелей через реки или для проходов через лес (как на карте Черный лес)

 

Нам доступно три инструкции:

 

create_connect_teams_lands {Инструкции}

create_connect_all_lands {Инструкции}

create_connect_all_players_land {Инструкции}

 

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

 

Давайте добавим нашему Оазису хитрое соединение. Организуем проходы к озеру через лес.

 

<CONNECTION_GENERATION>

create_connect_all_lands

{

replace_terrain FOREST         GRASS

terrain_cost    FOREST          7

terrain_cost    GRASS     3

terrain_size    FOREST         3       1

terrain_size    GRASS     3       1

}

 

Этой командой мы заменили часть леса на траву. И задали параметры для проходов (ниже пояснение). Обратите особое внимание: что если FOREST используется еще где-то на карте (например, вы разместили дополнительный лес с таким же названием), то там тоже будут генерироваться проходы. Чтобы этого избежать, используйте другой вид леса, например, сосновый лес (PINE_FOREST) или джунгли (JUNGLE). Тогда получите ту картинку, что видите на скриншоте:

 

replace_terrain < название местности > < название местности >

Это инструкция говорит нам о том, что на что меняем. Т.е. в нашем примере мы меняем Лес (FOREST) на траву (GRASS). Аналогично эта же инструкция используется и для остальных земель и лендшафтов, например, заменить воду на отмели или заменить лес на дорогу. Вам необходимо использовать команду замены местности для каждого типа местности, размещенного на карте. Таким образом, если вы смешиваете grass1, grass2 и grass3, вам потребуется команда замены ландшафта для каждого.

 

terrain_cost < название местности > <# стоимость прохождения через тайл>

Присвоение стоимости местности как правило приводит к тому, что соединение будет выбирать обходной маршрут. Если вы хотите, чтобы ваши отмели избегали глубокой воды и старались располагаться в основном на мелкой воде, тогда назначьте высокую стоимость для глубокой воды (например, 15) и меньшую стоимость для мелкой воды (например, 7).

 

terrain_size < название местности > <#радиус в тайлах> <#величина отклонения>

Вам необходимо указать, насколько широким будет соединение. В нашем примере мы задаем ширину проходов terrain_size  GRASS  3   1, это означает, что проходы будут шириной 1-4 тайла (3 +/- 1). Размер прохода нужно так же указывать для каждой местности, через которую может проходить соединение.

 

 

 

ТЕСТИРОВАНИЕ КАРТЫ

 

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

 

Первоначально, в папке random-map-scripts достаточно просто создать пустой файл ваша_карта.rms

Далее запускаем игру, идем в Редактор сценариев и создаем новый. Выбираем нашу карту в разделе Случайная карта. Нажимаем Сгенерировать. Получив пустую карту, мы возвращаемся к нашему rms-файлу и начинаем творить. По мере внесения изменений в ваш скрипт, просто сохраняем и нажимаем в игровом редакторе повторно кнопку Сгенерировать карту. И сразу же видим результат.

 

Помните, что вашей картой игроки могут пользоваться самым разнообразным образом. Играть 1на1, 2на2, 4на4 или вообще играть ФФА. Поэтому не забывайте проверять генерацию вашей карты в разных режимах (на маленьких и больших картах). Проверив работу вашей карты в редакторе. Не поленитесь прогнать ее в режиме одиночной игры, установив в качестве игроков ИИ.

 

При создании карты, учитывайте, что общепринятыми стандартными ресурсами для большинства карт являются:

  • 6 ягод
  • 1 группа из 7 золотых приисков
  • 2 группы по 4 золотых прииска
  • 1 группа из 5 каменных шахт
  • 1 группа из 4 каменных шахт
  • 1 группа из 4 овец
  • 2 группы по 2 овцы
  • 1 группа из 4 оленей
  • 2 кабана
  • 2 волка
  • 1 группа из 3 отдельно стоящих деревьев под ТЦ
  • 1 группа из 2 отдельно стоящих деревьев на базе игрока

 

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

 

ОБЪЕКТЫ В AGE OF EMPIRES II


Полный список всех доступных нам объектов, которые мы можем использовать для создания пользовательских карт можно скачать здесь

 

ЭПИЛОГ


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

И если вы все еще полны сил и решимости творить и созидать, переходим во вторую часть статьи. Практическую.

Комментарии

Авторизируйтесь, что бы оставлять комментарии и оценивать посты

Авторизация
*
*

52  +    =  56

Регистрация
*
*
*

  +  10  =  12

Генерация пароля