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

23.01.2020 Автор: Paradox

Познав основы и теорию расписанные в этой статье мы готовы перейти к практике. Давайте на примере разберем создание карты с начала и до конца. В качестве эксперимента мы создадим карту для ФФА, которая получит название FFA Ring.

Поехали!

 

СОЗДАЕМ ФАЙЛ


Открываем Блокнот и создаем текстовый документ с расширением FFA Ring.rms. Сохраняем его в папку путь_к_игре\steamapps\common\Age2HD\resources\_common\random-map-scripts

Запускаем игру, открывает редактор сценариев и загружаем нашу карту в него. Генерируем. Получили пустую зеленую площадки. Это наша холст, на котором нам предстоит нарисовать карту для ФФА.

 

PLAYER_SETUP


Первым делом вписываем нашу карту пользовательские установки и комментарии по желанию:

 

/* ************* FFA RING by Paradox  ***************** */
/* ver 1.0 01/2020 */
 /*   Created by Paradox (RUS)  
Russian-speaking community:   https://villwar.ru/  */  

<PLAYER_SETUP>
random_placement
ai_info_map_type ARENA 0 0 0

Карта у нас будет «ареноподобной», поэтому мы задаем информацию для ИИ о том, что типа карты — Арена.

 

LAND_GENERATION


Второй этап. Создание основных зон (земель). Чтобы добавить в карту разнообразия, мы будем использовать встроенный рандомизатор. Зададим два варианта развития событий: лесная карта и тропическая. И пропишем разные условия:

<LAND_GENERATION>
start_random
percent_chance 50
   #define FOREST_MAP
percent_chance 50
   #define TROPICAL_MAP
end_random

if FOREST_MAP
base_terrain FOREST
else
base_terrain JUNGLE
endif

Мы видим, что Лесная и Тропическая карта будут генерироваться в соотношении 50 на 50. Дальше оператором if мы задаем, что если Лесная карта – то основным ландшафтом у нас будет Лес (FOREST), а если тропическая – то пальмовые джунгли (JUNGLE)

 

Отлично. Готово. Теперь нам нужно создать некое подобие ринга в центре и базы игроков.

 

Начнем с ринга в центре. Однозначно, что лес в центре нас не устраивает, поэтому мы создаем ринг используя по аналогии Траву (для Лесной карты) или Песок (для тропической)

 

create_land /* центр */
{
if FOREST_MAP
  terrain_type GRASS
else
  terrain_type DIRT3
endif

  land_percent 100

if TINY_MAP
base_size 16
elseif SMALL_MAP
base_size 16
elseif MEDIUM_MAP
base_size 18
elseif LARGE_MAP
base_size 20
else
base_size 22
endif

  right_border 32
  top_border 32
  bottom_border 32
  left_border 32

  clumping_factor 15
  zone 1
}

Как видим, мы задаем размер ринга в ручную, в зависимости от размера карты. Границы ринга мы сдвигаем от края карты на 32%.

Ставим clumping_factor по вкусу. Я поставил 15 — в данном случае это максимальная величина, для того чтобы получить максимально правильную форму ринга.

Вот что в итоге мы получаем:

Отлично.

Следующим этапом добавляем земли игроков. Так же точно, прописываем разные ландшафты для Лесной/Тропической карты. Размер базы игроков в зависимости от размера карты. От края карта отступаем по вкусу, я поставил 6%, чтобы игроки имели небольшую полоску бэкового леса.

create_player_lands
{
if FOREST_MAP
  terrain_type GRASS2
else
  terrain_type DESERT
endif

if TINY_MAP
 base_size 14
 bottom_border 3
 top_border 3
 left_border 3
 right_border 3
 land_percent 50

elseif SMALL_MAP
 base_size 14
 bottom_border 4
 top_border 4
 left_border 4
 right_border 4
 land_percent 50

elseif MEDIUM_MAP
 base_size 12
 bottom_border 5
 top_border 5
 left_border 5
 right_border 5
 land_percent 55

elseif LARGE_MAP
 base_size 12
 bottom_border 6
 top_border 6
 left_border 6
 right_border 6
 land_percent 60

elseif HUGE_MAP
 base_size 12
 bottom_border 6
 top_border 6
 left_border 6
 right_border 6
 land_percent 65

else
 base_size 12
 bottom_border 6
 top_border 6
 left_border 6
 right_border 6
 land_percent 70
endif

 other_zone_avoidance_distance 12
clumping_factor 15
}

other_zone_avoidance_distance 12 —  этим параметром мы фактически задаем расстояние между базами игроков. В нашем случае его заполнит Лес, так как он является базовым ландшафтом на карте. Ширина леса будет в среднем 12 тайлов

clumping_factor 15 – опять же цифра 15 для создания максимально квадратной базы игрока

Еще раз проверяем:

 

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

В принципе, по ландшафту нас все устраивает.

 

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

 

TERRAIN_GENERATION


<TERRAIN_GENERATION>

if FOREST_MAP
create_terrain PINE_FOREST
{
  base_terrain GRASS2
else
create_terrain PALM_DESERT
{
  base_terrain DESERT
endif

land_percent 4
number_of_clumps 20
clumping_factor 25
spacing_to_other_terrain_types 3
set_avoid_player_start_areas
set_scale_by_groups
}

 

Как видим, мы снова прописываем оператор if и создаем Сосновый лес на базе игрока (если Лесная карта), либо Пальмовый лес (если у нас Тропическая карта).

 

land_percent 4 – задаем процент занимаемой территории

number_of_clumps 20 – устанавливаем общее количество скоплений

clumping_factor 25 – задаем форму скоплений (по умолчанию 20). Чем выше цифра, тем более квадратные скопления.

spacing_to_other_terrain_types 3 – расстояние до других элементов ландшафта (чтобы наши островки бонусного леса не сливались с другим лесом)

set_avoid_player_start_areas – применяем этот параметр, чтобы наши островки леса не заспамились прямо на нашем ТЦ

set_scale_by_groups – ставим масштаб скоплений в зависимости от размера карты

Поверяем:

 

То, что нужно.

 

OBJECTS_GENERATION


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

В каждой карте необходимо прописывать условия для Цареубийства и не забыть добавить на карту как минимум короля (оператор: if REGICIDE).

/* EXTRA FOOD 3 Deers or 4 Forage */ — в этой строчке мы опять используем оператор random для того, чтобы сгенерировать бонусную еду. В нашем случае бонусом для игроков будет либо 3 дополнительных оленя, либо 4 куста с ягодами.

Все остальное по большому счету является стандартным.

<OBJECTS_GENERATION>

create_object TOWN_CENTER
{
  set_place_for_every_player
  min_distance_to_players 0
  max_distance_to_players 0
}

create_object VILLAGER
{
  set_place_for_every_player
  min_distance_to_players 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
}

create_object FORAGE
{
  number_of_objects          6
  group_placement_radius     3
  set_tight_grouping
  set_gaia_object_only
  set_place_for_every_player
  min_distance_to_players    10
  max_distance_to_players    12
  min_distance_group_placement 6
  max_distance_to_other_zones 12
}

create_object PALISADE_WALL
{
  set_place_for_every_player
  min_distance_to_players 16
  max_distance_to_players 20
 }

/* SPECIAL STUFF FOR REGICIDE */
if REGICIDE
create_object VILLAGER
{
  number_of_objects             7
  set_place_for_every_player
  min_distance_to_players       6
  max_distance_to_players       6
}

create_object KING
{
  set_place_for_every_player
  min_distance_to_players       6
  max_distance_to_players       6
}

create_object TOWER
{
  set_place_for_every_player
  min_distance_to_players    10
  max_distance_to_players    10
}
endif
/* ****************************** */

create_object DEER
{
  number_of_objects 3
  number_of_groups 1
  set_loose_grouping
  set_gaia_object_only
  set_place_for_every_player
  min_distance_to_players 16
  max_distance_to_players 20
}

create_object BOAR
{
  number_of_objects 2
  set_gaia_object_only
  set_place_for_every_player
  min_distance_to_players 16
  max_distance_to_players 22
  temp_min_distance_group_placement 20
}

/* EXTRA FOOD 3 Deers or 4 Forage */
start_random
                percent_chance 50
        #define RDEER
end_random

  if RDEER
create_object DEER
{
  number_of_objects 3
  number_of_groups 1
  set_loose_grouping
  set_gaia_object_only
  set_place_for_every_player
  min_distance_to_players 18
  max_distance_to_players 22
}

else
create_object FORAGE
{
  number_of_objects               4
  number_of_groups                 1
  group_placement_radius           3
  set_tight_grouping
  set_gaia_object_only
  set_place_for_every_player
  min_distance_to_players         16
  max_distance_to_players         20
  min_distance_group_placement     6
}
endif

/* NEAR GOLD */
create_object GOLD
{
  number_of_objects          7
  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  8
  max_distance_to_other_zones  12
if FOREST_MAP
  terrain_to_place_on GRASS2
else
  terrain_to_place_on DESERT
endif
}

/* MEDIUM GOLD */
create_object GOLD
{
  number_of_objects        5
  number_of_groups        2
  set_tight_grouping
  set_gaia_object_only
  set_place_for_every_player
  min_distance_to_players    20
  max_distance_to_players    26
  min_distance_group_placement  7
  temp_min_distance_group_placement 25
  max_distance_to_other_zones  10
if FOREST_MAP
  terrain_to_place_on GRASS2
else
  terrain_to_place_on DESERT
endif
}

/* NEAR STONE */
create_object STONE
{
  number_of_objects          5
  group_placement_radius     2 
  set_tight_grouping
  set_gaia_object_only
  set_place_for_every_player
  min_distance_to_players    14
  max_distance_to_players    18
  min_distance_group_placement  7
  max_distance_to_other_zones  10
if FOREST_MAP
  terrain_to_place_on GRASS2
else
  terrain_to_place_on DESERT
endif
}

 if FOREST_MAP
create_object FOREST_TREE
else
create_object PALM_FOREST_TREE /* отдельно стоящие деревья */
endif
{
  number_of_objects             2
  set_gaia_object_only
  set_place_for_every_player
  min_distance_to_players       4
  max_distance_to_players       4
  temp_min_distance_group_placement  6
}

 if FOREST_MAP
create_object FOREST_TREE
else
create_object PALM_FOREST_TREE /* отдельно стоящие деревья */
endif
{
  number_of_objects             2
  set_gaia_object_only
  set_place_for_every_player
  min_distance_to_players       5
  max_distance_to_players       7
  temp_min_distance_group_placement  6
}

create_object SHEEP
{
  number_of_objects 4
  number_of_groups 1
  set_loose_grouping
  set_gaia_object_only
  set_place_for_every_player
  min_distance_to_players 6
  max_distance_to_players 6
  min_distance_group_placement 10
}

create_object SHEEP
{
  number_of_objects 2
  number_of_groups 2
  set_loose_grouping
  set_gaia_object_only
  set_place_for_every_player
  min_distance_to_players 13
  max_distance_to_players 18
  min_distance_group_placement 2
  temp_min_distance_group_placement 20
}

 

 Отлично. Базы игрока на месте. Ресурсы есть. Жизнь кипит.

 

OBJECTS_GENERATION (Конфигурация Ринга)


Нужно добавить изюминки на наш ринг. Сделаем это таким образом: добавим на центр Золото, Камень и Волков. А также добавим Реликвий.

Обратите внимание, что поскольку ландшафт ринга у нас имеет название GRASS (DIRT), то мы должны использовать соответствующую инструкцию   terrain_to_place_on GRASS (  terrain_to_place_on DIRT3). Чтобы наше дополнительное золото не с генерировалось где-нибудь на задворках базы игрока.

 

/* Ring configuration */

create_object GOLD
{
if FOREST_MAP
  terrain_to_place_on GRASS
else
  terrain_to_place_on DIRT3
endif
  number_of_objects          4
  number_of_groups           16
  group_variance                  1
  set_tight_grouping
  set_gaia_object_only
  temp_min_distance_group_placement  5
}

create_object STONE
{
if FOREST_MAP
  terrain_to_place_on GRASS
else
  terrain_to_place_on DIRT3
endif
  number_of_objects          4
  number_of_groups           8
  group_variance                  1
  set_tight_grouping
  set_gaia_object_only
  temp_min_distance_group_placement  5
  resource_delta 3200
}

create_object WOLF
{
if FOREST_MAP
  terrain_to_place_on GRASS
else
  terrain_to_place_on DIRT3
endif
        number_of_groups                                               32
                number_of_objects                                                       1
                set_scaling_to_map_size
                set_gaia_object_only
                min_distance_group_placement              12
}

 /* RELICS */
create_object RELIC
{
  number_of_objects                1
  set_gaia_object_only
  set_place_for_every_player
  min_distance_to_players          15
  min_distance_group_placement     20
}

 

 Вот в принципе карта готова. Ландшафт, базы игроков, ринг – все сформировано. Всякие скалы и холмы здесь мы использовать не будем. Но….

CONNECTION_GENERATION


…осталось решить последнюю проблему. Это настроить всем игрокам выход на ринг. Для этого мы используем соответствующие инструкции:

 

<CONNECTION_GENERATION>

create_connect_all_lands
{
  replace_terrain JUNGLE DIRT
  replace_terrain DESERT DESERT
  replace_terrain FOREST GRASS2
  replace_terrain GRASS2 GRASS2

  terrain_cost JUNGLE 40
  terrain_cost DESERT 3
  terrain_cost FOREST 40
  terrain_cost GRASS2 3

  terrain_size DESERT 0 0
  terrain_size GRASS2 0 0
  terrain_size JUNGLE 9 1
  terrain_size FOREST 9 1
}

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

Проверяем

 

Отлично! Теперь все игроки имеют доступ на ринг! Наша карта готова к тестам и играм.

 

О том, как загрузить вашу карту в мастерскую Стим вы можете прочитать здесь.

Первая часть статьи, посвященная созданию rms-карт в Age of Empires II здесь.

Скачать карту FFA Ring, вы можете подписавшись на нее в Стиме здесь.

Дерзайте!

Комментарии

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

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

9  +  1  =  

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

  +  22  =  27

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