|
RMS Создание карты (часть 2)
II. СЛУЧАЙНЫЕ КАРТЫ СКРИПТИНГА
1) ОБЩАЯ ЦЕЛЬ
rmEchoInfo (строка echoString, int level ); Случайное отображение карты. Используйте это, чтобы выплевывать информацию при отладке скрипта. Это не показано игроку.
rmRandFloat (минимум с плавающей точкой, максимум с плавающей точкой ); Возвращает случайное число с плавающей точкой между минимальным и максимальным. Это генератор случайных чисел, полезный для определения случайных событий. Поскольку это число с плавающей точкой, он может обрабатывать десятичные дроби.
rmRandInt (интермедиат мин, Int макс ); Возвращает случайное целое число от мин до макс. Это генератор случайных чисел, полезный для определения случайных событий. Поскольку это целое число, оно не может обрабатывать десятичные дроби, но это делает его полезным для размещения номеров объектов.
rmSetMapSize(целое х, Int г ); Устанавливает размер карты. Х и Z в метрах. Они не должны быть такими же , если вы хотите создать прямоугольную карту. Все карты ES масштабируют карты по количеству игроков.
rmSetSeaLevel ( ); Устанавливает уровень моря для карты.
rmGetSeaLevel ( ); Получает уровень моря для карты.
rmSetSeaType (имя строки ); Устанавливает тип моря для карты. Это используется, если местность инициализирована для воды. Вы должны использовать эту команду, прежде чем размещать воду на карте. Тип моря должен быть действительным типом воды из редактора случайных карт.
rmAreaFractionToTiles (дробная доля ); Преобразует площадь из доли карты в число плиток. Фракции относятся к размеру карты, поэтому иногда вы можете использовать их.
rmAreaTilesToFraction (int плитки ); Преобразует количество плитки области в часть карты. rmXFractionToTiles (дробная доля ); Преобразует часть карты в направлении х в число плиток. rmXTilesToFraction (int плитки ); Преобразует количество плиток в направлении x во фракцию карты. rmZFractionToTiles (дробная доля ); Преобразует часть карты в направлении z в число плиток. rmZTilesToFraction (int плитки ); Преобразует количество плиток в направлении z во фракцию карты. rmMetersToTiles (поплавковые счетчики ); Преобразует расстояние в метрах в число плиток.
rmTilesToMeters (int плитки); Преобразует количество плиток в расстояние в метрах.
rmXMetersToFraction (поплавковые счетчики ); Преобразует метры в часть карты в направлении х.
rmZMetersToFraction (поплавковые счетчики ); Преобразует метры в часть карты в направлении z.
rmXFractionToMeters (поплавковые счетчики); Преобразует часть карты в направлении х в метры.
rmZFractionToMeters (поплавковые счетчики); Преобразует метры часть карты в направлении z в метры. Фракции относятся к размеру карты, поэтому иногда вы можете использовать их вместо расстояний в метрах.
rmDegreesToRadians (степени с плавающей запятой); Преобразует угол в градусах в радианы. Особенно полезно, когда игроков помещают в круг.
rmTerrainInitialize (строка baseTerrain, высота с плавающей точкой ); Инициализирует местность для базового типа и высоты. Определяет базовый ландшафт для использования на карте. Если установлено значение вода, тип моря должен быть определен. Начальная местность - это обычно трава, песок, снег или вода.
rmSetLightingSet (имя строки ); Устанавливает набор освещения. Вы можете указать набор освещения из редактора сценариев, который будет использоваться для вашей RMS. Эта команда должна быть размещена после инициализации ландшафта.
rmSetGaiaCiv (long civ ); Устанавливает цивилизацию Гайи. Это полезно только в том случае, если вы размещаете объекты Gaia, которые различаются в зависимости от цивилизации, такие как специальные цивилизационные отряды. rmSetStatusText (статус, прогресс); Устанавливает дружественный крутой текст загрузки экрана. Этот текст будет виден игрокам во время генерации карты. Если вы не укажете хотя бы проценты в параметре прогресса, «полоса загрузки» не будет продвигаться во время генерации карты. rmDefineConstant (имя строки, значение int); Определяет целочисленную констант
2) ИГРОКИ
Местоположение игроков должно быть определено так, чтобы объекты и области могли быть размещены «игроком». Игровые области все еще должны быть созданы как отдельные области. Специальным игроком в сценарии RM является игрок «Gaia», и в сценарии карты он всегда имеет номер игрока «0» (подробности см. В главе выше). Следующие команды относятся только к
играм на людях и компьютерах: rmGetPlayerCiv (int playerID); Получает цивилизацию указанного игрока. rmGetCivID (строковая цивилизация ); Устанавливает цивилизацию для сравнения с цивилизацией игроков. Пример: if (rmGetPlayerCiv (i) == rmGetCivID ("русские")) { / * сделать что-то для игрока i, если он русский * / };
Эти команды полезны для размещения определенных объектов или различных начальных ресурсов. Они также полезны для триггеров, которые запускают или запрещают определенные улучшения.
rmGetNumberPlayersOnTeam (int teamID); Получает количество игроков в данной команде. Полезно для масштабирования области или ресурсов в командной области в зависимости от количества игроков в этой команде.
rmSetTeamSpacingModifier (модификатор float); Устанавливает модификатор интервала команд. Обычно все игроки располагаются на равном расстоянии. Эта команда позволяет вам сблизить членов команды. Значения 0,3-0,5 возвращают лучшие результаты. Значения менее 0,25 могут не обеспечивать достаточно места для запуска ресурсов.
rmPlacePlayersCircular (flora minFraction, float maxFraction, float angleVariation); Делает круг локаций игрока. Размещает игроков по кругу. Вариация определяется разницей между мин и макс. Изменение угла определяет, находятся ли игроки на одинаковом расстоянии или могут быть немного ближе или дальше друг от друга. Расположение по кругу, как правило, наиболее универсально, но не будет работать на всех типах карт, таких как неквадратные карты.
rmPlacePlayersSquare (float dist, float distVariation, float spacingVariationfloat); Делает квадрат местоположений игрока. Размещает игроков в квадрат, который автоматически подстраивается под прямоугольник для прямоугольных карт. В отличие от круга, дисперсия здесь определяется плюсом или минусом (distVariation) от среднего расстояния. SpacingVariation определяет, являются ли игроки на равном расстоянии или могут быть немного ближе или дальше друг от друга. rmPlacePlayersLine (float x1, float z1, float x2, float z2, float distVariation, float spacingVariation); Делает линию локаций игроков. Иногда вам захочется, чтобы игроков помещали в линию. Техас помещает каждый раз в линию, в то время как Новая Англия помещает всех игроков в круг. Использовать размещение на линии нелегко, потому что может не хватить места для игровых зон или ресурсов. X и Z определяют начальное и конечное положения линии. DistVariation определяет, насколько далеко могут варьироваться области игроков, а spacingVariation определяет, сколько места находится между точками на линии, где расположены игроки.
rmSetPlaceSection (плавать от Процент, плавать до Процент); Размещая игроков по кругу или квадрату, эта команда позволяет пропустить часть круга или квадрата, по сути, удалив часть с пирога (может быть, вы хотите разместить там океан или море, как в Техасе). Значение по умолчанию для fromPercent равно 0, а значение по умолчанию для toPercent равно 1. Это означает использование всего круга или квадрата. Вы можете передать что-то вроде 0,25 и 0,50, чтобы игроки разместили от 25% до 50% вдоль круга или квадрата. Для кругового размещения 0 - в 9:00, 0,25 - в 12:00, 0,5 - в 3:00 и 0,75 - в 6:00. Для размещения квадрата (представьте себе квадрат как линию, которая следует за квадратом), 0 - в 6:00, 0,25 - в 9:00, 0.
rmSetPlacementTeam (длинный teamID); Устанавливает команду на место. Используйте это перед вызовом различных функций rmPlacePlayers, и только игроки в указанной команде будут размещены. Первая команда - номер 0, вторая - номер 1 и т. Д. Передайте -1, чтобы teamID разместил все команды (или фактически всех игроков, которые еще не были размещены).
rmPlacePlayer (int playerID, float xFraction, float zFraction ); Устанавливает одно местоположение игрока. Вы можете использовать это, чтобы разместить игроков где угодно. Как только игрок размещен, он не будет перемещен в будущем при вызове различных функций rmPlacePlayers. Это может быть сложно, так как вы часто не знаете, сколько игроков будет размещено на карте, так как от 2 до 12 игроков могут играть на любой карте.
Вот несколько примеров того, что вы можете сделать;
Поместите первую команду в центр карты, а все остальные команды - снаружи:
rmSetPlacementTeam (0); rmSetPlayerPlacementArea (0,3, 0,3, 0,7, 0,7); rmPlacePlayersCircular (0.4,0.3, rmDegreesToRadians (5,0));
rmSetPlacementTeam (-1); rmSetPlayerPlacementArea (0, 0, 1, 1); rmPlacePlayersCircular (0.4,0.3, rmDegreesToRadians (5,0))
rmSetPlayerPlacementArea (float minX, float minZ, float maxX, float maxZ);Устанавливает область карты для размещения игрока. Используйте эту команду, если, например, вы хотите разместить игроков в одном квадранте карты.
rmSetPlayerArea (int playerID, int areaID ); Устанавливает «официальную» область игрока.rmSetTeamArea (int teamID, int areaID ); Устанавливает «официальную» область команды. Если вы хотите, чтобы область принадлежала игроку (т. Е. Это место, из которого вы будете размещать ресурсы игрока), назначьте его игроку. Команды работают так же. Обычно вы хотите перебирать количество игроков, использующих for (i = 1; <cNumberPlayers). rmPlayerLocXFraction (int playerID); Получает начальное местоположение игрока х фракция. rmPlayerLocZFraction (int playerID );
Получает начальную локацию игрока по z доле. Используйте эти команды, когда вы не знаете, где находится начальная локация игрока, и вам нужны значения для размещения других областей или ресурсов.
3) ОБЛАСТИ
Районы - это регионы на карте. Они часто имеют неправильную форму, но могут быть и прямоугольными. Некоторые области используются для размещения определенного ландшафта, например скалы или океана, в то время как другие просто используются в качестве границ для других областей. Специальные типы областей - это области игрока, которые принадлежат определенному игроку, или области команды, которые принадлежат команде. Сказать, что эти области «принадлежат», - это просто удобный способ убедиться, что другие области или объекты размещены в этой области.
rmCreateArea (строковое имя, int parentAreaID); Создает область. Создает область и позволяет вам назвать ее. Области без родительской области используют всю карту в качестве своей родительской области. Вы также можете сделать существующие области parentArea, чтобы разместить подобласти внутри области игрока, например. Области обычно пытаются разместить несколько раз и возвращают сообщение об ошибке, если они терпят неудачу. Чтобы игнорировать это сообщение об ошибке, используйте setAreaWarnFailure ниже.
rmSetAreaSize (плавание minFraction, плавание maxFraction ); Установите размер области на минимальную / максимальную долю карты. Мин и макс могут быть установлены на одно и то же значение, если вы не хотите изменения размера. Поэкспериментируйте с разными значениями, чтобы убедиться, что ваша область не слишком велика или слишком мала, чтобы ее можно было увидеть. Даже если в вашем районе нет особого рельефа, может быть полезно временно закрасить область отчетливой текстурой, такой как черный или снег, чтобы увидеть, где и действительно ли она размещается.
rmSetAreaLocation (int areaID, float xFraction, float zFraction ); Установите местоположение области. Иногда вы хотите разместить область в определенном месте, например, 0,5, 0,5, центр карты. rmSetAreaLocPlayer (int areaID, int playerID); Установите местоположение области к местоположению игрока. Это ярлык для размещения области на месте игрока. Как правило, это используется, когда крошечные игровые зоны сначала размещаются в качестве заполнителей, а затем SetAreaLocPlayer можно использовать для создания больших игровых площадок позже или для размещения подобласти (например, участка местности) рядом с центром города игрока.
rmSetAreaLocTeam (int areaID, int teamID); Установите местоположение области к местоположению команды. Точно так же, как SetAreaLocPlayer, за исключением того, что он применяется к групповым областям.
rmBuildArea (int areaID); Строит указанную область. На самом деле строит область. Выбор, когда использовать эту команду, может оказать большое влияние на вашу карту. Например, если вы определили площадь озера, а затем построили его, земля, которая будет размещена позже, может застрять в озере или быть размещена как острова. С другой стороны, если земля и вода строятся одновременно, они будут стараться избегать друг друга (если установлены надлежащие ограничения). Как правило, игровые зоны должны быть построены одновременно, чтобы обеспечить достаточно места для любого игрока.
rmBuildAllAreas (); Одновременно строит все незастроенные участки. Не включает соединения.
rmSetAreaTerrainType (int areaID, string terrainTypeName); Устанавливает тип местности для области. Часто вы хотите рисовать в области с определенной местностью. Используйте названия местности из редактора сценариев. Леса, скалы и вода обрабатываются по-разному. Используйте AreaTerrainType для местности, такой как трава, снег, лед и песок.
rmPaintAreaTerrain (int areaID); Окрашивает местность для указанной области.
rmSetAreaBaseHeight (int areaID, float height); Устанавливает базовую высоту для области. Если не указано, область будет принимать высоту родительской области, включая базовую высоту карты, если родительская область не указана. Убедитесь, что земля выше уровня воды, если вы хотите разместить земельные объекты (например, TownCenter) позже.
rmSetAreaWarnFailure (int areaID, bool warn); Устанавливает, будет ли процесс построения области предупреждать о сбое. Очень легко чрезмерно ограничить области до точки, где нет места для них. Это может вызвать две проблемы: для генерации карты может потребоваться много времени, или, если вы находитесь в режиме отладки (см. Выше), откроется отладчик, и генерация прекратится. Иногда вы хотите отловить эти ошибки, но когда вы закончите работу с картой, рекомендуется установить для SetAreaWarnFailure значение false.
rmSetAreaForestType (int areaID, строка forestName); Устанавливает тип леса для области. Окрашивает территорию лесным типом. Используйте типы леса из редактора сценариев. rmSetAreaWaterType (int areaID, string waterName); Устанавливает тип воды для области. Окрашивает область с типом воды. Используйте типы воды из редактора сценариев. Поскольку типы воды автоматически меняют высоту и могут размещать объекты, они, как правило, влияют на области, немного превышающие указанные. Просто позвольте много места.
rmSetAreaCliffType (int areaID, строка cliffName); Устанавливает тип утеса для области. Скалы обрабатываются не так, как на других территориях, чтобы вы могли обрабатывать такие элементы, как пандусы. Однако вы можете использовать setAreaTerrainType, чтобы поместить непроходимую текстуру скалы в качестве обычной области. CliffName должен использовать тип скалы из редактора.
rmSetAreaCliffPainting (int areaID, bool paintGround, bool paintOutsideEdge, bool paintSide, float minSideHeight, bool paintInsideEdge); Установите параметры рисования утеса для области. Определяет, как скала окрашивается непроходимыми и проходимыми текстурами. PaintGround - Определяет, нужно ли рисовать грунт или оставить его там, где он уже есть. По умолчанию верно. PaintSide - Определяет, должны ли быть окрашены стороны утеса. По умолчанию верно. PaintEdge - Определяет, должен ли быть окрашен край утеса. Это область между обрывом и землей. По умолчанию верно. MinSideHeight - задает минимальную высоту, на которую должен быть уклонен фрагмент скалы, прежде чем рассматривать его как сторону скалы. Установите в 0, чтобы нарисовать минимальное количество сторон скалы. По умолчанию 1,5.
rmSetAreaCliffEdge (int areaID, int count, размер с плавающей точкой, дисперсия с плавающей точкой, интервал с плавающей точкой, int mapEdge); Установите параметры края утеса для области. Определяет, должны ли быть скатные пандусы или не соединять вершину утеса с окружающей территорией. Count - количество ребер обрыва для создания. Количество раз размер не должен быть больше, чем 1,0. По умолчанию 1. размер - указывает, сколько контуров области следует превратить в края обрыва. Оно должно быть между 0,0 и 1,0. Установите значение 1.0, чтобы окружить всю область. По умолчанию 0,5. Дисперсия - дисперсия для размера. По умолчанию 0.0. Spacing - модификатор Spacing. Это должно быть между 0,0 и 1,0. Чем меньше, тем ближе друг к другу края обрыва. По умолчанию 1.0. MapEdge - указывает, где должен быть край утеса относительно края карты. Установите 0 для любого, 1, чтобы быть далеко от края карты, или 2, чтобы быть близко к краю карты. По умолчанию 0.
rmSetAreaCliffHeight (int areaID, значение с плавающей точкой, дисперсия с плавающей точкой, рампа с плавающей точкой); Установите высоту скалы области. Val - сделать положительным для поднятых скал и отрицательным для пониженных скал. По умолчанию 4.0. Дисперсия - дисперсия, используемая для высоты. Пандус - используется для определения того, насколько быстро высота поднимается до высоты скалы (в данном контексте это относится к крутизне, а не к изменяемым скатам для достижения вершины утеса). По умолчанию 0,5.
rmAddAreaCliffEdgeAvoidClass (int areaID, intoidID, float minDist ); Добавляет класс для края обрыва области, чтобы избежать. Вы можете указать край утеса, чтобы избежать определенного класса, такого как соединение. Помните, что соединения должны быть созданы до обрыва (см. Ниже).
rmAddAreaTerrainLayer (int areaID, строка terrain, float minDist, float maxDist); Добавляет слой местности в область. Слои Terrain позволяют размещать границы одной или нескольких текстур вокруг области. Например, вы можете иметь« texas \ ground3_tex » и « texas \ ground4_tex» вокруг области травы. Вы можете указать несколько слоев для области, если minDistance для одного начинается там, где maxDistance для другого заканчивается. Поскольку различные текстуры накладываются друг на друга, вам может потребоваться поэкспериментировать с расстояниями, чтобы получить правильный эффект. Вот пример:
rmSetAreaTerrainType (bonusIslandID, ""); rmAddAreaTerrainLayer (bonusIslandID," texas \ ground6_tex ", 13, 20); rmAddAreaTerrainLayer (bonusIslandID," texas \ ground5_tex ", 6, 13); rmAddAreaTerrainLayer (bonusIslandID," земля-земля ", Техасский земельный участок_4) int areaID, bool variance); указывает, должна ли область изменяться по краям слоя terrain. Обычно дисперсия в слоях terrain выглядит лучше, но иногда может потребоваться отключить ее. По умолчанию используется значение true. rmSetAreaMinBlobs (int areaID, int blobs);
Устанавливает минимальное количество областей blob.
rmSetAreaMaxBlobs (int areaID, int blobs ); Устанавливает максимальное количество областей blob. Область может быть размещена с несколькими каплями. Капли размещаются независимо друг от друга, используя минимальное и максимальное расстояния ниже. Области, сделанные с одной каплей, будут круглыми. Области, сделанные с несколькими каплями, могут быть длинными и извилистыми.
rmSetAreaMinBlobDistance (int areaID, float dist); Устанавливает минимальное расстояние блоба.
rmSetAreaMaxBlobDistance (int areaID, float dist ); Устанавливает максимальное расстояние блоба. Определяет, насколько далеко друг от друга могут находиться капли. Чем больше расстояние, тем больше площадь будет стремиться к серпантину, а не к кругу (представьте цепочку бусинок). Однако, если вы укажете много капель, эта вариация может стать неясной, поскольку для этой области будет добавлено все больше капель.
rmSetAreaCoherence (int areaID, float coherence); Устанавливает согласованность области (0-1). Связанные области имеют тенденцию оставаться вместе больше. Эффект труднее заметить на небольших участках.
rmSetAreaSmoothDistance (int areaID, int smoothDistance); Устанавливает расстояние сглаживания края области. Расстояние - это количество соседних точек, которые необходимо учитывать в каждом направлении. Акватории извлекают выгоду из большей гладкости, поскольку это устраняет маленькие удары и углубления.
rmSetAreaHeightBlend (int areaID, int heightBlend); Устанавливает, как плавно сочетается высота области с окружением. Соответствует гладкому инструменту в редакторе сценариев. Обычно heightBlend 0 оставляет геометрически выглядящие неровные края. Высота, равная 1, сгладит меньшие области. Высота, равная 2, сгладит большие области или области непропорциональной высоты. Все, что выше 2, может полностью сгладить область.
rmAreaID (имя строки); Получает идентификатор области для данного имени области.
rmAddAreaInfluencePoint (int areaID, float xFraction, float zFraction); Добавляет точку влияния области.
rmAddAreaInfluenceSegment (int areaID, float xFraction1, float zFraction1, float xFraction2, float zFraction2 ); Добавляет сегмент влияния области. Вы можете хотеть, чтобы область росла к определенным точкам или линиям. Круглая область, расположенная в центре карты с точкой влияния 1, 1, приведет к полуострову, который выступает к 12 часам. Точки влияния и сегменты могут быть полезны для получения областей, таких как реки, которые выходят за границы карты.
rmAddAreaRemoveType (int areaID, string typeName); Добавьте тип объекта, который удаляет указанная область. Иногда вам может понадобиться очистить область от таких объектов, как удаление деревьев со льда. Это будет работать, только если объекты уже размещены перед областью, что противоположно тому, как генерируется большинство карт ES. Вы можете ссылаться на определенные модули или абстрактные типы, такие как «unit» и «building».
RmAddAreaTerrainReplacement (int areaID, string terrainTypeName, string newTypeName); Добавляет правило замены местности в область. Если вы разместите область без указания местности, она будет использовать территорию родительской области (включая базовую карту). Однако указание замены ландшафта будет окрашивать область только при наличии другой текстуры. Эта команда наиболее полезна для соединений, где вы хотите заменить воду землей, где соединение проходит через реку, или заменить скалу снегом для горных перевалов. bool rmAddAreaToClass (int areaID, int classID); Добавьте данную область к указанному классу. Причина добавления областей в классы заключается в том, что вы можете ссылаться на весь класс позже, а не на отдельные области. Это наиболее полезно при размещении объектов (можно сказать, просто поместить в класс) или ограничений (можно сказать, чтобы избежать определенного класса).
int rmDefineClass (string className); Определите класс с заданным именем. Как и любая переменная, классы должны быть определены, прежде чем они могут быть использованы в первый раз.
rmClassID (имя строки); Получает идентификатор класса для данного имени класса.
4) СОЕДИНЕНИЯ
Соединения - это специальные области, которые используются для соединения других областей. Они обычно используются для размещения наземных мостов или горных перевалов среди игроков. Соединения должны быть размещены после областей, которые они пытаются соединить, но часто их нужно определять перед этими областями, если для области требуется команда rmAddConnectionArea.
rmCreateConnection (имя строки );Создает соединение. Определяет новое соединение. rmSetConnectionType (int connectionID, int connectionType, bool connectAll, float connectPercentage); Устанавливает тип подключения. Эта команда определяет, какие игроки подключены. Допустимые значения для connectionType:
- cConnectAreas: это значение по умолчанию, которое используется, если вы не вызываете rmSetConnectionType. Вы должны указать каждую область для соединения, вызвав rmAddConnectionArea. - cConnectPlayers: соединить все зоны игрока. - cConnectAllies: соединить все зоны игроков союзников. - cConnectEnemies: соединять вражеские зоны игрока. В настоящее время этот параметр игнорирует параметр connectAll (он обрабатывает его как true, несмотря ни на что). Просто дайте мне знать, если вы считаете, что для него важно работать определенным образом, когда connectAll ложно ... Одна вещь, о которой я подумал, - это подключение каждого игрока к ближайшему врагу.
Установите для параметра connectAll значение true, если вы хотите, чтобы все области были связаны со всеми остальными областями. Установите значение false, чтобы области соединялись последовательно, где первая область соединяется со второй областью, вторая область соединяется с третьей областью и т. Д.
Вы можете использовать параметр connectPercentage, чтобы уменьшить количество создаваемых соединений. Например, если вы установите значение 0,5, будет сгенерирована половина соединений. Те, которые генерируются, выбираются случайным образом. Некоторые карты ES со связями соединяют всех игроков, когда номер игрока мал (<6), и используют процент соединений на больших картах, в противном случае может быть установлено так много соединений, что барьер (например, вода или камень) скрыт.
rmAddConnectionArea (int connectionID, int areaID); Добавляет область к соединению. Это допустимо только в том случае, если вы установили тип соединения cConnectAreas. Вы должны указать это при определении области, после определения соединения и перед построением соединения.
rmSetConnectionPositionVariance (int connectionID, float дисперсия); Устанавливает дисперсию положения соединения. Соединение обычно начинается с позиции области, но это позволяет ему отличаться от этой позиции. Вы можете установить это -1, чтобы выбрать абсолютно случайные позиции в начальной и конечной областях. Эта команда часто необходима при указании нескольких соединений (например, одно в команде, а другое между командами), чтобы соединения не перекрывались.
bool rmAddConnectionStartConstraint (int connectionID, int constraintID); Добавьте указанное ограничение для начальной точки подключения.
bool rmAddConnectionEndConstraint (int connectionID, int constraintID ); Добавьте указанное ограничение для конечной точки соединения. Если setConnectionPositionVariance не работает, вы также можете указать содержание для конечных точек самого соединения. Таким образом, вы можете иметь конечные точки подключения, например, избегать непроходимых участков земли или игроков.
rmSetConnectionWidth (int connectionID, ширина с плавающей точкой, дисперсия с плавающей точкой); Устанавливает ширину соединения. Поскольку соединения часто являются единственной исправляемой областью над барьером, таким как вода или камень, установите это значение достаточно широким, чтобы избежать проблем
прохождения пути , обычно> 8. rmSetConnectionBaseHeight (int connectionID, float width); Устанавливает базовую высоту соединения. rmSetConnectionCoherence (int connectionID, ширина с плавающей точкой ); Устанавливает согласованность области (0-1).
rmSetConnectionWarnFailure (int connectionID, bool warn ); Устанавливает, предупреждает ли соединение о сбое.
rmSetConnectionHeightBlend (int connectionID, float width ); Устанавливает, как плавно соединяется высота соединения с окружением.
rmSetConnectionSmoothDistance (int connectionID, ширина с плавающей точкой ); Устанавливает расстояние сглаживания края соединения (расстояние - это количество соседних точек, которые необходимо учитывать в каждом направлении).
rmAddConnectionTerrainReplacement (int connectionID, строка terrainTypeName, строка newTypeName ); Добавляет правило замены ландшафта к соединению. Все эти команды работают точно так же, как и для областей, но должны вызываться специально для соединений.
rmSetConnectionTerrainCost (int connectionID, строка terrainTypeName, значение с плавающей запятой); Устанавливает стоимость местности для соединения. Когда вам нужно соединение, чтобы избежать типа местности, установите это значение. Если вы размещаете дороги между игроками, вы можете избегать леса или скал. Стоимость должна быть больше или равна 1 или равна -1, чтобы указать, что местность непроходима.
rmSetConnectionBaseTerrainCost (int connectionID, float cost); Устанавливает базовую стоимость местности для соединения. Это стоимость, которая будет использоваться для всех территорий, для которых не установлена стоимость с помощью rmSetConnectionTerrainCost. Стоимость по умолчанию для каждого типа местности равна 1, если это не вызывается. rmBuildConnection (int connectionID); Строит данное соединение. Убедитесь, что области построены в первую очередь. RmBuildAllAreas не включает соединения.
rmAddConnectionToClass (int connectionID, int classID); Добавляет соединение к указанному классу. Полезно с ограничениями для областей или объектов, размещаемых после подключения.
bool rmAddConnectionConstraint (int connectionID, int constraintID); Добавьте указанное ограничение к соединению. Полезно, когда ограничение применяется к соединению. Как и со всеми ограничениями, соединение может избегать только областей или объектов, которые размещены до его размещения.
5) ОБЪЕКТЫ
Объекты включают в себя все, что размещено на карте, но не на местности. Здания, юниты и ресурсы - все объекты. Объекты могут даже быть коллекциями из множества различных единиц. Просто помните, что объекты всегда размещаются в виде кластеров, и иногда может быть проще разместить 2 разных объекта, чем добавлять разные типы единиц в один объект.
bool rmAddObjectDefToClass (int objectDefID, int classID); Добавить данный объект def в указанный класс. Полезно для использования ограничений класса.
rmCreateObjectDef (имя строки ); Создает определение объекта. Используется для определения нового объекта.
r mSetObjectDefMinDistance (int defID, float dist ); Установите минимальное расстояние для определения объекта (в метрах).
rmSetObjectDefMaxDistance (int defID, float dist ); Установите максимальное расстояние для определения объекта (в метрах). Эти расстояния относятся к местоположению объекта. Если местоположение объекта равно местоположению игрока, то это минимальное и максимальное значения из стартовой области игрока (обычно это центр города). Полезный подход состоит в том, чтобы поместить объект в местоположение 0,5, 0,5 (центр карты) и назначить максимальное расстояние, равное половине карты. См. Подраздел « Сетка карты » выше для более подробных объяснений.
rmAddObjectDefItem (int defID, строка unitName, int count, float clusterDistance); Добавить элемент в определение объекта. Объекты определены в сценарии случайной карты и могут быть названы как угодно. Подразделения, с другой стороны, используют определенные имена из игры, такие как Villager Greek, Palm или TownCenter (название игры для Town Center). Расстояние кластера - это только максимум, что объект может быть размещен из местоположения, и применяется после применения минимального и максимального расстояния (т. Е. MaxDistance 10 и clusterDistance 5 могут фактически поместить объект в 15 м от местоположения). При размещении одного модуля clusterDistance может иметь значение 0. Если к объекту добавлено несколько модулей, они должны использовать clusterDistance> 0 или они будут ставить друг на друга. Вот два примера:
я нт farCowsID = rmCreateObjectDef ( "далеко коров"); rmAddObjectDefItem (farCowsID, "cow", 1, 0.0);
int rock2ID = rmCreateObjectDef ("rock2"); rmAddObjectDefItem (rock2ID, "маленький известняк", 1, 1.0); rmAddObjectDefItem (rock2ID, "спрайт из известняка", 3, 3.0); rmPlaceObjectDefAtLoc (int defID, int playerID, float xFraction, float zFraction, long placeCount); Поместите определение объекта в определенном месте для данного игрока. Размещение объектов таким способом полезно, когда вы не хотите размещать их для каждого игрока, как в случае, когда вы размещаете разные юниты для разных цивилизаций. Вы можете установить int playerID в 0, чтобы убедиться, что никто не владеет объектом. Вот хороший ярлык:
for (i = 0; <cNumberPlayers) { if ( rmGetPlayerCiv ( i ) == rmGetCivID ("русские") ) rmPlaceObjectDefAtLoc (транспортный идентификатор русских , i, rmPlayerLocXFraction (i), rmPlayerLocZFraction; иначе если (
rmGetPlayerCiv ( i ) == rmGetCivID ("Germans") ) rmPlaceObjectDefAtLoc (транспортный идентификатор немцев , i, rmPlayerLocXFraction (i), rmPlayerLocZFraction (i)); else if ( rmGetPlayerCiv ( i ) == rmGetCivID (" French ") ) rmPlaceObjectDefAtLoc (transportFrenchID, i, rmPlayerLocXFraction (i), rmPlayerLocZFraction (i)); }
rmPlaceObjectDefPerPlayer (int defID, bool playerOwned, long placeCount); Поместите определение объекта на игрока. Эта команда часто является самым быстрым способом размещения объектов, особенно по сравнению с doinf для циклов по числу игроков. Однако это не применимо, если вы не хотите размещать объект хотя бы один раз для каждого игрока. Верните playerOwned как false, если вы хотите, чтобы объект принадлежал gaia.
rmPlaceObjectDefAtAreaLoc (int defID, int playerID, int areaID, long placeCount); Поместите определение объекта для игрока в местоположение данной области. Разница между этим и placeObjectDefAtLoc заключается в том, что последний нуждается в координатах X, Z, в то время как эта команда просто находит местоположение в центре области.
rmPlaceObjectDefInArea (int defID, int playerID, int areaID, long placeCount); Поместите определение объекта для игрока в данной области. Размещает объект случайным образом во всей области (в соответствии с расположением в центре).
rmPlaceObjectDefAtRandomAreaOfClass (int defID, int playerID, int classID, long placeCount); Поместите определение объекта для игрока в месте случайной области в данном классе.
rmPlaceObjectDefInRandomAreaOfClass (int defID, int playerID, int classID, long placeCount ); Поместите определение объекта для игрока в случайной области в данном классе. Разница между этими двумя заключается в том, что первый использует местоположение области, а второй просто находит случайное местоположение внутри области. Верните playerID как 0, чтобы разместить объект, не принадлежащий.
rmGetNumberUnitsPlaced (int objectDefID); rmGetUnitPlaced (int objectDefID, int index); rmGetUnitPlacedOfPlayer (int objectDefID, int playerID); Эти три команды могут использоваться для обнаружения неудачных случаев размещения объекта. Возможно, вы захотите попытаться поместить объект во второй раз с меньшим количеством ограничений, если он потерпит неудачу в первый раз. Вот пример из Акрополя:
for (i = 1; <cNumberPlayers) { int initialOutpostID = rmCreateObjectDef ("Стартовая застава" + i); int outpostRampConstraint = rmCreateCliffRampConstraint ("onCliffRamp" + i, rmAreaID ("player" + i)); int outpostRampEdgeConstraint = rmCreateCliffEdgeMaxDistanceConstraint ("nearCliffEdge" + i, rmAreaID ("player" + i), 2); rmAddObjectDefItem (startOutpostID, "Outpost", 1, 0,0); rmAddObjectDefConstraint (startOutpostID, avoOutpost); rmAddObjectDefConstraint (начальныйOutpostID, outpostRampConstraint); rmAddObjectDefConstraint (начальныйOutpostID, outpostRampEdgeConstraint); rmAddObjectDefToClass (startOutpostID, classOutpost); rmPlaceObjectDefInArea (initialOutpostID, i, rmAreaID ("player" + i), 6);
/ * резервное копирование, чтобы повторить попытку * / if (rmGetNumberUnitsPlaced (initialOutpostID) <4) { int initialOutpostID2 = rmCreateObjectDef ("Менее оптимальный начальный Outpost" + i); rmAddObjectDefItem (начальныйOutpostID2, "Outpost", 1, 0,0); rmAddObjectDefConstraint (начальныйOutpostID2, avoOutpost); rmAddObjectDefConstraint (начальныйOutpostID2, outpostRampConstraint); rmAddObjectDefToClass (начальныйOutpostID2, classOutpost); rmPlaceObjectDefInArea (initialOutpostID2, i, rmAreaID ("player" + i), 1); } }
rmSetIgnoreForceToGaia (bool val);
Может использоваться, чтобы заставить любой размещенный объект, даже ресурсы, принадлежать игроку.
6) ЧЕСТНЫЕ ОБЪЕКТЫ
Эти специальные команды предназначены для размещения важных ресурсов, таких как TownCenters и иногда Silver Mines. Они дорогие и медленные, поэтому их не следует использовать для многих объектов, но они могут обеспечить присутствие на карте объектов, которые «должны быть размещены».
int rmAddFairLoc (строка unitName, bool forward, bool inside, float minPlayerDist, float maxPlayerDist, float locDist, float edgeDist, bool playerArea, bool teamArea); Добавляет некоторую информацию о размещении fairLoc. Для каждого fairLoc вы указываете следующие параметры: необязательное имя объекта для использования (для размещения чека), вперед или назад (вперед означает противника), внутри или снаружи (внутри означает союзника), минимальное / максимальное расстояние от игрока, минимальное расстояние от других мест и минимальное расстояние от края карты. Вы также можете добавить обычные ограничения к нему. Указание playerArea или teamArea принудительно устанавливает местоположение в этой области, если эти области определены. Полезно для удержания TownCenter на острове игрока, а не через реку.
bool rmPlaceFairLocs (); Устанавливает места размещения fairLoc. После создания каждого fairLoc вы вызываете rmPlaceFairLocs, который вычисляет фактические позиции, по одной на игрока на fairLoc. Это просто позиции (или местоположения), поэтому вы можете использовать их для чего угодно, например для размещения юнитов или создания областей.
rmResetFairLocs (); Сбрасывает информацию о FairLoc. Как только вы закончили с набором fairLocs и хотите создать другой набор, вы должны вызвать rmResetFairLocs. Это очищает любые FairLocs, которые вы ранее добавили.
int rmGetNumberFairLocs (int playerID); Получает количество игроков fairLocs.
float rmFairLocXFraction (int playerID, int index); Получает у игрока справедливую локальную долю х.
float rmFairLocZFraction (int playerID, int index ); Получает долю игрока в fairLoc z.
Пример справедливого местоположения для TownCenters:
id = rmAddFairLoc ("TownCenter", true, false, 70, 120, 60, 40); / * пересылка за пределы * / rmAddObjectDefConstraint (id, TownCenterAvoidImpassableLand); rmAddObjectDefConstraint (id, playerConstraint);
if (rmPlaceFairLocs ()) { id = rmCreateObjectDef ("far TownCenter2"); rmAddObjectDefItem (id, "TownCenter", 1, 0.0); для (я = 1; < { for (j = 0; <rmGetNumberFairLocs (i)) rmPlaceObjectDefAtLoc (id, i, rmFairLocXFraction (i, j), rmFairLocZFraction (i, j), 1); }
7) ОГРАНИЧЕНИЯ
Ограничения используются для областей, связей и объектов. Они следят за тем, чтобы объекты избегали других объектов, чтобы объекты располагались вблизи определенных областей и подобных ограничений.
int rmCreateBoxConstraint (имя строки, float startX, float startZ, float endX, float endZ, float bufferFraction); Сделайте ограничение коробки. Боксовые ограничения - это просто четыре отрезка, которые подразделяют карту. Создание рамочного ограничения может использоваться для предотвращения слишком близкого
соприкосновения областей или объектов с центром int rmCreateAreaOverlapConstraint (имя строки, int areaID); Сделайте ограничение области перекрытия. Предотвращает перекрытие областей.
int rmCreateAreaConstraint (имя строки, int areaID); Создайте ограничение, которое заставляет что-то оставаться в области. Вы не можете указать расстояние, только то, что объект или область должны оставаться в пределах области.
int rmCreateAreaDistanceConstraint (имя строки, int areaID, плавающее расстояние); Сделайте ограничение по площади. Определяет минимальное расстояние, на которое объект или область может находиться от области. Полезно для предотвращения сближения ресурсов с ТС или другими ресурсами.
int rmCreateAreaMaxDistanceConstraint (имя строки, int areaID, расстояние с плавающей точкой); Сделайте ограничение по максимальному расстоянию. Определяет максимальное расстояние, на которое объект или область может быть от области. Полезно для того, чтобы держать ресурсы слишком далеко от игрока.
int rmCreateEdgeConstraint (имя строки, int areaID); Создайте ограничение, которое заставляет что-то оставаться в пределах области. Площадь краев не большая, так что это может быть сложно.
int rmCreateEdgeDistanceConstraint (имя строки, int areaID, плавающее расстояние); Сделайте ограничение расстояния до края области. Минимальное расстояние области или объекта может быть до края. int rmCreateEdgeMaxDistanceConstraint (имя строки, int areaID, расстояние с плавающей точкой); Сделайте ограничение площади края максимально допустимым. Максимальное расстояние области или объекта может быть от края.
int rmCreateCliffEdgeConstraint (имя строки, int areaID); Создайте ограничение, которое заставит что-то остаться в пределах края обрыва области.
int rmCreateCliffEdgeDistanceConstraint (имя строки, int areaID, расстояние с плавающей точкой ); Сделайте ограничение расстояния до края скалы.
int rmCreateCliffEdgeMaxDistanceConstraint (имя строки, int areaID, расстояние с плавающей точкой ); Сделайте ограничение максимальной длины края края обрыва. Края скалы обрабатываются не так, как другие области, и для них необходимо свое ограничение. Вам часто лучше рассказать объект или область, чтобы избежать непроходимой земли.
int rmCreateCliffRampConstraint (имя строки, int areaID); Создайте ограничение, которое заставляет что-то оставаться в пределах края склона области.
int rmCreateCliffRampDistanceConstraint (имя строки, int areaID, расстояние с плавающей точкой ); Сделайте ограничение расстояния до края ската.
int rmCreateCliffRampMaxDistanceConstraint (имя строки, int areaID, расстояние с плавающей точкой ); Установите ограничение по максимальному расстоянию до края склона. Рампы - это области скал, которые имеют разреженную местность, обычно для достижения вершины утеса. У Акрополя есть скаты, у которых есть башни на краях скатов.
int rmCreateClassDistanceConstraint (имя строки, int classID, расстояние с плавающей запятой); Сделайте ограничение расстояния класса. Определив класс объектов или областей, вы можете установить для него ограничение. - int playerConstraint = rmCreateClassDistanceConstraint («держаться подальше от игроков», classPlayer, 20);
int rmCreateTypeDistanceConstraint (имя строки, int classID, расстояние с плавающей точкой); Сделайте ограничение расстояния типа. Типы могут быть конкретными единицами, такими как Chicken, или абстрактными типами, такими как Huntable.
int rmCreateTerrainDistanceConstraint (имя строки, тип строки, допустимое значение bool, расстояние с плавающей точкой); Сделайте ограничение, чтобы избежать рельефа местности с определенной проходимостью. Это полезное ограничение, потому что у вас могут быть сухопутные объекты, избегающие непроходимой земли, такие как вода или скалы, или водные объекты, избегающие берега.
int avoImpassableLand = rmCreateTerrainDistanceConstraint («избежать непроходимой земли», «земля», false, 10.0) ;
int rmCreateTerrainMaxDistanceConstraint (имя строки, тип строки, допустимое значение bool, расстояние с плавающей запятой); Сделайте ограничение, чтобы быть близко к местности с определенной проходимостью. Полезно для хранения морских водорослей или транспорта в воде, но рядом с пляжем, или бегемотов или крокодилов на пляже у воды.
bool rmAddAreaConstraint (int areaID, int constraintID); Добавьте указанное ограничение в область. После того, как вы определили ограничение, вы должны сделать так, чтобы область придерживалась его.
bool rmAddFairLocConstraint (int fairLocID, int constraintID); Добавьте указанное ограничение в размещение fairLoc. После того, как вы определили ограничение, вот как вы заставляете его придерживаться.
bool rmAddObjectDefConstraint (int defID, int constraintID); Добавить указанное ограничение к данному объекту def. Как только вы определили ограничение, вот как вы заставляете объект придерживаться его.
rmConstraintID (имя строки); Получает идентификатор ограничения для данного имени ограничения.
8) ТОРГОВЫЙ МАРШРУТ
Торговые маршруты - новая функция в серии Age. Вы создаете торговый маршрут, размещая путевые точки для путей. Позже вы размещаете объекты «SocketTradeRoute» на торговом маршруте. Торговые маршруты должны быть созданы и построены сразу после того, как карта местности и зоны игрока были созданы. Все дополнительные объекты, такие как ресурсы, леса и т. Д., Должны быть размещены с ограничением торгового маршрута, чтобы избежать маршрутов. Кроме того, убедитесь, что вы всегда размещаете путевые точки на соединенной земле.
int rmCreateTradeRouteDistanceConstraint (имя строки, расстояние с плавающей точкой); Создает ограничение площади всех торговых путей, чтобы избежать их с расстоянием в метрах.
int rmCreateTradeRoute (); Создает торговый маршрут. Как и все другие создания rm для объектов и ландшафта, он имеет тип integer и может быть определен следующим образом: int tradeRoute1ID = rmCreateTradeRoute ();
bool rmAddTradeRouteWaypoint (int tradeRouteID, float startX, float startZ); Добавляет путевую точку в tradeRouteID с координатами startX, startZ (0.0-1.0) карты.
bool rmAddRandomTradeRouteWaypoints (int tradeRouteID, начало плавания X, начало плавания Z, изменение плавания X, изменение плавания Z); Добавляет случайную путевую точку к tradeRouteID с startX, координатами startZ (0.0-1.0) карты и вариацией случайной вариацииX, вариацией Z в метрах. Если вы хотите сделать свой торговый маршрут в виде петли или круга, то ваша последняя добавленная путевая точка должна иметь те же координаты, что и ваша первая «rmAddTradeRouteWaypoint».
bool rmBuildTradeRoute (int tradeRouteID, текстура строки); Строит торговый маршрут, определенный ранее. Текстура может быть «грязью», например.
вектор rmGetTradeRouteWayPoint (int tradeRouteID, расстояние с плавающей точкой); Получает местоположение сокета торгового маршрута на торговом маршруте. Расстояние - это длина торгового маршрута в процентах, 0,0 - начальная точка торгового маршрута, 1,0 - конец маршрута. Эта команда будет применена после того, как tradeRouteID был создан и собран.
9) ТРИГГЕРС
Эти команды используются для включения триггеров из редактора сценариев в сценарий случайной карты. Триггеры могут быстро усложняться, а также создавать несправедливую карту, поэтому их следует использовать с осторожностью. Полное объяснение всех триггеров выходит за рамки этой статьи, но вы можете сгенерировать случайный скрипт карты в редакторе сценариев, чтобы увидеть, как создаются триггеры - просто посмотрите на триггеры, как если бы вы их настраивали вручную. Вы также можете посмотреть файл « C: \ ... \ Age of Empires III \ trigger \ typetest.xml » для помощи в отладке триггеров RMS.
Кроме того, trigtemp.xsфайл генерируется каждый раз при загрузке вашей RMS в редактор карт. Он покажет вам все триггеры, которые вы установили на своей случайной карте. Этот файл находится в коде триггера xs, который немного отличается от RMS-файла. Вы можете найти этот файл в каталоге: " C: \ ... \ Мои документы \ Мои игры \ Age of Empires 3 \ trigger \ trigtemp.xs ".
rmCreateTrigger (string triggerName); Используется для создания нового триггера. Пример: rmCreateTrigger (" MyTrigger1 ");
rmSwitchToTrigger (int triggerID); Эта команда полезна для настройки триггеров игроком. Сначала нужно определить все триггеры, но затем вы можете переключиться на другие, чтобы указать их условия и эффекты. Пример: rmSwitchToTrigger (rmTriggerID (" MyTrigger1 "));
rmTriggerID (строка triggerName); Как и области и объекты, триггеры должны быть определены, прежде чем они могут быть использованы.
rmSetTriggerPriority (int priority); Устанавливает приоритет триггера. приоритет имеет значения от 0 (низкий) до 4 (самый высокий).
rmSetTriggerActive (bool active); Устанавливает активность триггера сразу после загрузки карты. Если вы хотите запустить этот триггер позже в игре, выберите «false», иначе «true».
rmSetTriggerRunImmediately (bool runImmediately); Параметр runImmediate всегда должен иметь значение «истина», если вы используете триггер для воспроизведения кинематографии или звуков.
rmSetTriggerLoop (bool loop); Устанавливает режим повторения триггера. Будьте осторожны, используя петли, так как они могут легко сойти с ума и остановиться. Лучше использовать 2 триггера вместо этого и стрелять затем навстречу друг другу, используя эффект триггера «Событие огня». rmAddTriggerCondition (string conditionType); rmSetTriggerConditionParam (строка paramName, строковое значение, bool add);
rmSetTriggerConditionParamInt (string paramName, int value, bool add); rmSetTriggerConditionParamFloat (строка paramName, значение с плавающей запятой, bool add); rmSetTriggerConditionParamArmy (строка paramName, int playerID, int armyID, bool add); Обратитесь к C: \ ... \ Age of Empires III \ trigger \ typetest.xml для получения списка доступных условий и их параметров.
rmAddTriggerEffect (string effectType); rmSetTriggerEffectParam (строка paramName, строковое значение, bool add); rmSetTriggerEffectParamInt (string paramName, int value, bool add); rmSetTriggerEffectParamFloat (строка paramName, значение с плавающей запятой, bool add); Обратитесь к C: \ ... \ Age of Empires III \ trigger \ typetest.xml для получения списка доступных эффектов и их параметров. rmSetTriggerEffectParamArmy (строка paramName, int playerID, int armyID, bool add); rmCreateArmy (int playerID, string armyName); rmAddUnitsToArmy (int playerID, int armyID, int objectDefID);Триггеры, которые влияют на армии, требуют, чтобы армии были определены в первую очередь. rmSetVCFile (строка имени файла); Вы можете настроить альтернативные файлы условий победы для своей RMS. Эта функция довольно сложна и должна использоваться только опытным пользователем.
Как вставить триггеры в ваш скрипт:
Порядок: 1. Рекомендуется добавлять все триггеры в конец скрипта, так как некоторым триггерам нужны параметры, которые уже были определены и размещены на карте. Добавьте все триггеры прямо перед последней скобкой " } " в скрипте xs. 2. Сначала создайте ВСЕ триггеры, которые вы хотите вставить в ваш скрипт, затем переключитесь на каждый триггер отдельно и вставьте условия, эффекты и их параметры. Это очень важно, так как вы не можете запустить триггер, который вы не создали ранее, и карта не будет загружаться. Пример настройки:
// Триггеры: for (j = 1; <= 14) { rmCreateTrigger (" MyTrigger " +к ); } / * выше теперь есть 14 триггеров, созданных с именами "MyTrigger1", "MyTrigger2" ... "MyTrigger14" * /
rmSwitchToTrigger (rmTriggerID (" MyTrigger1 ")); for (i = 1; <= cNumberNonGaiaPlayers) { rmAddTriggerEffect ("Предоставить ресурсы"); rmSetTriggerEffectParamInt ( "PlayerID", я); rmSetTriggerEffectParam ( "ResName", "Продукты питания"); rmSetTriggerEffectParamInt ( "Сумма", 1000); } rmSetTriggerPriority (4); rmSetTriggerActive (истина); rmSetTriggerRunImmediately (истина); rmSetTriggerLoop (ложь);
rmSwitchToTrigger (rmTriggerID (»
rmSwitchToTrigger (rmTriggerID (" MyTrigger14 ")); ...
Пожайлуста, оцените материал. Ваша оценка нам очень важна! Спасибо! ↓ ↓ ↓
|
Дата: 24/05/2019, 13:38 | Просмотров: 772 | Добавил: tupi857 | Автор: tupi857
|
Теги: статьи по Age of Empires III (AoE 3) |
| |