Создание модификаций

From Perimeter Community Wiki
Revision as of 12:10, 8 October 2023 by EFLFE (talk | contribs) (Created page with "==Официальный набор инструментов и материалов для модификации== '''Внимание! Техподдержка издателя не дает справок по работе представленного в Золотом Издании инструментария (техподдержки теперь вообще нет, за истечением времени). Разработчики не несут ответ...")
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigation Jump to search

Официальный набор инструментов и материалов для модификации

Внимание! Техподдержка издателя не дает справок по работе представленного в Золотом Издании инструментария (техподдержки теперь вообще нет, за истечением времени). Разработчики не несут ответственности за неверное функционирование игры и повреждения данных, вызванных некорректным использованием инструментария.

Пакет материалов включенный в состав Золотого Издания содержит исходные версии игровых моделей (в формате 3DS Max 5), а также набор инструментов для модификации.

Модели находятся в архиве каталоге установки игры \Bonus\Modification\Models.exe (скачать: root drive Surmap dropbox). Для установки материалов скачайте и укажите каталог для распаковки.

Кроме этого, в архиве (скачать: drive) находится инструмент для редактирования и создания новых миров для игры. Аналогично, для установки Surmap необходимо воспользоваться ссылкой и указать каталог для распаковки данных.

Остальные (официальные) инструменты модификации (скачать: drive dropbox) и включает:

  • meshexp.dle - Экспортер для 3DS Max 5
  • WinVG.exe - утилита для просмотра просмотр моделей в игровом формате (m3d)

Миссии

Имейте в виду, что у миссий и сохранений одинаковый формат.

Создание

Для создания миссий можно воспользоваться самой игрой. Запустите режим сражения, выберите цвет и фракцию. После создания сражения СРАЗУ сохраните его, после этого можете выходить из игры.

Редактирование

Объекты

Для расстановки объектов необходимо активировать встроенный редактор миссий.

[Редактор]

"Каталог игры"/Perimeter.ini (Открыть блокнотом)

 В файле:
В разделе [Game] StartSplash=1 меняете на 0 MissionEdit=0 меняете на 1
В разделе [Graphics] FullScreen=1 меняете на 0
Либо если вы пользуетесь патчем SetCustomResolution от @!!ex (входящий в состав Perimeter Wide screen), то просто поставьте галочку напротив Editor mode и нажмите Patch.

Редактором хорошо работать с сохраненными играми.
При создании нового мира (карты) редактором удобно выравнивать ландшафт до зерослоя под начальным положением всех игроков, после чего сохранив игру из папки "Каталог игры"/resource/save можно скопировать ваше сохранение (три файла: .dat,.gmp,.spg) в multiplayer или battle, с кое какими изменениями (читайте раздел Редактор сообщества).

Меню строений, юнитов, скверны, гео процессов - Клавиша: Insert

Для нормальной работы приложения возвращайте показатели в исходное положение.

Сохраненные миссии хранятся в папке Папка-Периметра\Resource\Saves\НомерПрофиля\НазваниеМиссии.spg (и еще два таких же файла, но с другими расширениями). Чтобы миссия была доступна как миссия для кампании, ее файлы нужно скопировать в папку ПапкаПериметра\Resource\Missions\ . После этого ее (миссию) можно указать в файле history.hst, о котором рассказано ниже... Вы можете изменить имя, фракцию и фрейм игрока и противника/противников, если откроете .spg файл Блокнотом или чем-то подобным. Там, в самом начале файла, вы можете увидеть четыре секции, отвечающие за четырех соответствующих игроков в разделе playersData. Прежде всего, вам там важны три строчки: "belligerent = значение;", "colorIndex = значение;", "name = "значение";". Первая строка отвечает за принадлежность игрока к определенной стороне, а также за модель фрейма:

 BELLIGERENT_EXODUS0 - Кластер, Исход
 BELLIGERENT_EXODUS1 - Арк-9, Исход
 BELLIGERENT_HARKBACKHOOD0 - Зодиак, Возврат
 BELLIGERENT_HARKBACKHOOD1 - Странник, Возврат
 BELLIGERENT_EMPIRE0 - Роутер, Империя
 BELLIGERENT_EMPIRE1 - Экзистор, Империя
 BELLIGERENT_EMPIRE_VICE - Наместник, вроде как Империя
 (При игре за Наместника недоступна ни одна из расовых лабораторий, даже Имперская)

Вторая строка отвечает за цвет игрока (0 - синий, 1 - голубой, 2 - красный, 3 - оранжевый, 4 - зеленый, 5 - желтый, 23 - розовый, 6 - белый (отсутствие цвета), 7 - черный (при отдалении плавно исчезает)). Можете попробовать выставить двум игрокам одинаковые цвета. Третья строка отвечает за имя игрока/компьютера. Скорее всего, вам не удастся задать какое-либо иное имя, кроме привязанного к значению первой строки. (То есть, если значение первой строки - BELLIGERENT_EMPIRE1, то, скорее всего, игра допустит только имена "Экзистор" и "Existor" для данного игрока) Боюсь, я описал все это несколько неясно, уж извините :) Аид

Скрипты

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

  • ".spg" - Скрипты миров. Может содержать в себе триггеры, включая ботов. Поскольку триггеры приходится прописывать индивидуально для каждого из четырех игроков, целесообразнее создавать триггеры отдельно (смотрите следующий пункт).
  • ".scr" - Скрипты миссий, ботов, кат-сцен и прочего, находятся в папке Scripts/Triggers. При добавлении или удалении триггера не забывайте менять число количества триггеров в начале скрипта.

Редактор скриптов от @!!ex для редактирования файлов типа ".scr"

Принципы работы с Advanced Perimeter Script Editor (APSL):

Основные операции по изменению триггеров происходят в окне Editor Window,
в которм скрипты представляются в виде Advanced Perimeter Script Language(APSL).
Этот язык разработан для упрощения работы со скриптами.
Общее описание языка расположено в файле Specification.
Быстрый доступ к зарезервированным словам,кондишенам, экшенам и константам можно получить по нажатию на Ctrl+Space.
Быстрый доступ содержит все экшены/кондишены, но не все константы. Нужные пока придется искать самостоятельно основываясь на примерах.

Общие правила написания скриптов на APSL:
1) Идентификатор триггера должен быть уникальным для данного игрока и должен быть записан в кавычках.
2) Регистр записи констант значения не имеет.
3) Соблюдения отступа не обязательно и не повлияет на откомпилированный скрипт.
4) Регистр записи блоков OR/AND,кондишенов и экшенов значения не имеет.
5) Регистр записи типа кондишена(NORMAL/INVERTED) значения не имеет.
6) Регистр записи типа триггера(SLEEPING/CHECKING) значения не имеет.
7) ПОМНИТЕ! При записи строковых констант регистр имеет значение! "String" и "string" не одно и тоже!
8) Наличие пустых строк не допустимо.
9) Компилятор не проверяет правильности написания констант, поэтому очень внимательно следити за этим!!!
10) Компилятор не проверяет количество кондишенов, поэтому внимательно следите, правильно ли вы указали их количество!

Принципы работы с Быстрым Доступом.

Прошу прощения за такое "кривое" название, но я просто не могу придумать корректного перевода. :) (прим. разраб.)

Использовать очень просто. Набираем начало нужного слова Например: UNIT_ нажимаем Ctrl+Space и в открывшемся списке содержащем все слова начинающиеся на UNIT_ выбираем нужное.
Быстрый доступ возможен только при редактировании скриптов на APSL.

Specification

Простейший триггер:

"Simple"
     AND
          0
     END
ACTION 0
LINKS
STATE CHECKING


Каждый тригер состоит из 5 основных элементов:
1)Название. В данном случае триггер называется Simple:
"Simple"

2)Условие(я) выполнения триггера. В данном случае триггер выполняется всегда:

     AND
          0
     END

3)Действие. В данном случае тригер не выполняет никаких действий:

ACTION 0

4)Ссылки. Список триггеров, которые активируются при выполнении текущего триггера. В данном случае список пустой:

LINKS

5)Статус триггера. Может быть либо CHECKING(выполняется, если выподнились все кондишены, после чего статус становится SlEEPING), либо SLEEPING(не выполняется). В данном случае триггер проверяется:

STATE CHECKING

Рассмотрим поподробнее блок:

     AND
          0
     END

AND означает, что над результатом всех кондишенов в блоке нужно произвести логическую операцию and.
Также в начале блока может стоять OR, тогда соответственно над результатами производится операция or.
Число идущее после обозначения логической операции обозначает количество вложенных конишенов (Вложенный блок также считается за одну команду).
В данном случае 0 означает, что блок не содержит условий.

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

     AND
          1
          NORMAL FrameState(AI_FRAME_STATE_INSTALLED,AI_PLAYER_TYPE_ME,100)
     END

Каждый блок может содержать в себе любое количество вложенных блоков. В данном случае имеется один вложенный блок типа OR:

     AND
          3
          INVERTED PlayerState(PLAYER_STATE_UNABLE_TO_PLACE_CORE)>
          NORMAL OR
               3
               NORMAL PlayerState(PLAYER_STATE_UNABLE_TO_PLACE_BUILDING)
               INVERTED ObjectExists(UNIT_ATTRIBUTE_CORE,AI_PLAYER_TYPE_ME,true)
               INVERTED OutOfEnergyCapacity(90.)
          END
          INVERTED EnegyLevelLowerReserve(100.)
     END

Каждый кондишн и вложенный блок имеет тип: либо NORMAL, либо INVERTED. NORMAL означает, что нужно взять результат кондишена без изменений, а INVERTED, что нужно взять противоположный.

Список кондишенов можно узнать в Conditions.
Список экшенов можно узнать в Actions.
Почти все кондишены и экшены имееют параметры. Список параметров можно получить в Variables.
Все парметры перечисляются в круглых скобках через запятую. ПЕРЕНОС СТРОКИ НЕ ДОПУСТИМ!
3 экщена, в которых дополнительные параметры указываются в следующих строках описаны в Specials.

Specials

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

SetControls(1) В качестве парметра указано количество блоков дополнительных парметров. Каждый блок имеет следующий вид:

controlID
enabled
visible
flashing
tabNumber

Где controlID указывает на кнопку интерфейса параметры которой меняем, enabled может принимать значения true/false, указывает на то, можно ли нажать эту кнопку или нет, visible может принимать значения true/false, указывает на то, видна ли эта кнопку или нет, flashing может принимать значения true/false, указывает на то, мигает ли кнопа или нет, tabNumber обычно принимает значени 0, зачем нужна мне не ясно.

Пример:

ACTION SetControls(2)
     SQSH_RELAY_ID
     true
     true
     true
     0
     SQSH_TAB_BUILD_ID
     true
     true
     true
     1
SquadAttack(...,1)

Имеет множество основных парметров последний из которых указывает на количество дополнительных параметров.
Каждый дополнительный параметр имеет вид:

unitsToAttack

Где unitsToAttack объекты, которые сквад должен атаковать в первую очередь.

Пример:

ACTION SquadAttack(true,CHOOSE_SQUAD_1,UNIT_ATTRIBUTE_PIERCER,UNIT_CLASS_STRUCTURE_GUN,true,1,0,0,0,120,1,false,0.,CHOOSE_SQUAD_2,false,false,false,6)
     UNIT_ATTRIBUTE_GUN_HOWITZER,
     UNIT_ATTRIBUTE_GUN_FILTH_NAVIGATOR,
     UNIT_ATTRIBUTE_GUN_SCUM_DISRUPTOR,
     UNIT_ATTRIBUTE_GUN_BALLISTIC,
     UNIT_ATTRIBUTE_CORE,
     UNIT_ATTRIBUTE_FRAME
AttackBySpecialWeapon(...,1)

Имеет множество основных парметров последний из которых указывает на количество дополнительных параметров.
Каждый дополнительный параметр имеет вид:

unitsToAttack

Где unitsToAttack объекты, которые супер оружие должно атаковать в первую очередь.

Пример:

ACTION AttackBySpecialWeapon(true,UNIT_ATTRIBUTE_GUN_SCUM_DISRUPTOR,UNIT_CLASS_FRAME | UNIT_CLASS_STRUCTURE_GUN,5)
     UNIT_ATTRIBUTE_BLACK_HOLE,
     UNIT_ATTRIBUTE_GUN_SCUM_DISRUPTOR,
     UNIT_ATTRIBUTE_GUN_BALLISTIC,
     UNIT_ATTRIBUTE_GUN_FILTH_NAVIGATOR,
     UNIT_ATTRIBUTE_CORE

Actions

Victory()

SetCamera(cameraSplineName,stepTime,cycles,smoothTransition)

Task(type,taskID,duration,syncroBySound,showTips)

TeleportationOut()

ActivateObjectByLabel(label)

DeactivateObjectByLabel(label)

Defeat()

Action()

Message(messageID,message,delay,duration,syncroBySound)

SetInterface(enableInterface)

SetCameraAtObject(object,playerType,transitionTime,setFollow,turnTime)

Delay(delay,showTimer,scaleByDifficulty)

ActivateAllSpots()

SwitchFieldOn(onlyIfAi,duration,energyReserve,allCores,onlyIfCoreDamaged)

KillObject(object)

DeactivateAllSpots()

OrderBuilding(onlyIfAi,building,placementStrategy,energyReserve,buildDurationMax,priority)

HoldBuilding(onlyIfAi,building)

InstallFrame(onlyIfAi)

RepareObjectByLabel(label)

OscillateCamera(duration,factor)

SquadOrderUnits(onlyIfAi,chooseSquadID,soldiers,officers,technics,energyReserve)

SwitchGuns(onlyIfAi,mode,gunID)

SellBuilding(onlyIfAi,building,sellFactor,damagePercent)

SetControls(Count*)

SquadAttack(onlyIfAi, chooseSquadID, attackByType, unitClassToAttack, offensive, unitsNumber, soldiers, officers, technics, attackTime, remutateCounter, holdProduction, squadFollowDistance, squadToFollowBy, ignoreLastTarget, returnToBase, interruptable, Count*)

AttackBySpecialWeapon(onlyIfAi,weapon,unitClassToAttack,Count*)

Conditions

Teleportation(teleportationType,playerType)

ObjectExists(object,playerType,constructedAndConstructing)

FrameState(state,playerType,spiralChargingPercent)

ObjectNearObjectByLabel(label,object,objectConstructed,playerType,distance)

KillObject(object,playerType)

SkipCutScene()

UnitClassUnderAttack(victimUnitClass,damagePercent,agressorUnitClass,playerType)

IsFieldOn()

ClickOnButton(controlID)

SquadSufficientUnits(playerType,chooseSquadID,unitType,compareOperator,unitsNumber,soldiers,officers,technics)

CutSceneWasSkipped(timeMax)

OutOfEnergyCapacity(chargingPercent)

PlayerState(playerState)

DifficultyLevel(difficulty)

CaptureBuilding(object,playerType)

MutationEnabled(unitType)

KillObjectByLabel(label)

ActivateSpot(type)

ObjectByLabelExists(label)

TerrainLeveledNearObjectByLabel(label,radius)

TimeMatched(time)

ToolzerSelectedNearObjectByLabel(label,radius)

SetSquadWayPoint()

EnegyLevelUpperReserve(energyReserve)

BuildingNearBuilding(distance,playerType1,playerType2)

EnegyLevelLowerReserve(energyReserve)

NumberOfBuildingByCoresCapacity(building,factor,compareOp,building2,playerType)

UnitClassIsGoingToBeAttacked(victimUnitClass,agressorUnitClass)

SquadGoingToAttack(chooseSquadID)

CheckBelligerent(belligerent)

WeaponIsFiring(gun)

OnlyMyClan()

Variables

Экшены, экстеншены Возможные значения
teleportationType TELEPORTATION_TYPE_OMEGA /TELEPORTATION_TYPE_ALPHA
playerType AI_PLAYER_TYPE_ME /AI_PLAYER_TYPE_ANY /AI_PLAYER_TYPE_WORLD /AI_PLAYER_TYPE_ENEMY
object UNIT_ATTRIBUTE_OFFICER_PLANT /UNIT_ATTRIBUTE_HARKBACK_STATION1 /UNIT_ATTRIBUTE_LASER_CANNON /UNIT_ATTRIBUTE_ROCKET_LAUNCHER /UNIT_ATTRIBUTE_SUBTERRA_STATION1 /UNIT_ATTRIBUTE_SUBTERRA_STATION2 /UNIT_ATTRIBUTE_BOMB_STATION1 /UNIT_ATTRIBUTE_BOMB_STATION2 /UNIT_ATTRIBUTE_BOMB_STATION3 /UNIT_ATTRIBUTE_COMMANDER /UNIT_ATTRIBUTE_LASER_STATION1 /UNIT_ATTRIBUTE_LASER_STATION2 /UNIT_ATTRIBUTE_LASER_STATION3 /UNIT_ATTRIBUTE_ROCKET_STATION3 /UNIT_ATTRIBUTE_ROCKET_STATION2 /UNIT_ATTRIBUTE_ROCKET_STATION1 /UNIT_ATTRIBUTE_FRAME /UNIT_ATTRIBUTE_CORE /UNIT_ATTRIBUTE_COLLECTOR /UNIT_ATTRIBUTE_RELAY /UNIT_ATTRIBUTE_SOLDIER /UNIT_ATTRIBUTE_FLY_STATION1 /UNIT_ATTRIBUTE_SCUM_SPOT /UNIT_ATTRIBUTE_SCUM_SPOT2 /UNIT_ATTRIBUTE_SCUM_SPOT3
constructedAndConstructing true /false
state AI_FRAME_STATE_TELEPORTATION_STARTED /AI_FRAME_STATE_TELEPORTATION_ENABLED /AI_FRAME_STATE_INSTALLED /AI_FRAME_STATE_SPIRAL_CHARGING
spiralChargingPercent число от 0 до 100. Например: 100
label идентификатор метки. Строка в кавычках. Нaпример: "ядро"
objectConstructed true /false
distance число. Например: 150.
victimUnitClass UNIT_CLASS_STRUCTURE_ENVIRONMENT /UNIT_CLASS_FRAME /UNIT_CLASS_STRUCTURE_CORE /UNIT_CLASS_BASE /UNIT_CLASS_LIGHT /UNIT_CLASS_MEDIUM /UNIT_CLASS_HEAVY /UNIT_CLASS_AIR /UNIT_CLASS_AIR_HEAVY /UNIT_CLASS_STRUCTURE_GUN /UNIT_CLASS_MISSILE. Может быть указано несколько объектов через:
|
Например:
UNIT_CLASS_FRAME | UNIT_CLASS_STRUCTURE_CORE
damagePercent число. Например: 1
agressorUnitClass см. victimUnitClass
controlID SQSH_RELAY_ID /SQSH_STATION5_ID /SQSH_TAB_BUILD_ID
chooseSquadID CHOOSE_SQUAD_1 /CHOOSE_SQUAD_2 /CHOOSE_SQUAD_3 /CHOOSE_SQUAD_4 /CHOOSE_SQUAD_5
unitType UNIT_ATTRIBUTE_STRAFER
compareOperator COMPARE_GREATER_EQ
unitsNumber число. Например: 1
soldiers число. Например: 30
officers число. Например: 45
technics число. Например: 10
timeMax число. Например: 15
chargingPercent число. Например: 90.
playerState PLAYER_STATE_UNABLE_TO_PLACE_CORE /PLAYER_STATE_UNABLE_TO_PLACE_BUILDING
difficulty DIFFICULTY_HARD /DIFFICULTY_NORMAL /DIFFICULTY_EASY
type(ActivateSpot) FILTH /GEO. Может быть указано несколько объектов через:
|
Например:
FILTH | GEO
radius число. Например: 1.
time число. Например: 0
energyReserve число. Например: 100.
playerType1 см. PlayerType
playerType2 см. PlayerType
building UNIT_ATTRIBUTE_CORE /UNIT_ATTRIBUTE_SOLDIER_PLANT /UNIT_ATTRIBUTE_OFFICER_PLANT /UNIT_ATTRIBUTE_TECHNIC_PLANT /UNIT_ATTRIBUTE_COLLECTOR /UNIT_ATTRIBUTE_LASER_STATION1 /UNIT_ATTRIBUTE_ROCKET_STATION1 /UNIT_ATTRIBUTE_SUBTERRA_STATION1 /UNIT_ATTRIBUTE_FLY_STATION1 /UNIT_ATTRIBUTE_GUN_SUBCHASER /UNIT_ATTRIBUTE_GUN_HOWITZER /UNIT_ATTRIBUTE_GUN_BALLISTIC /UNIT_ATTRIBUTE_GUN_FILTH_NAVIGATOR /UNIT_ATTRIBUTE_GUN_SCUM_DISRUPTOR
factor число. Например: 0.1
compareOp COMPARE_LESS /COMPARE_GREATER
building2 см. building
belligerent BELLIGERENT_EXODUS0 /BELLIGERENT_HARKBACKHOOD0 /EMPIRE /HARKBACKHOOD /EXODUS
gun UNIT_ATTRIBUTE_GUN_SUBCHASER /UNIT_ATTRIBUTE_GUN_HOWITZER /UNIT_ATTRIBUTE_GUN_BALLISTIC /UNIT_ATTRIBUTE_GUN_FILTH_NAVIGATOR /UNIT_ATTRIBUTE_GUN_SCUM_DISRUPTOR
cameraSplineName идентификатор пути движения камеры. Строка в кавычках. Например: "Camera1"
stepTime число. Например: 7.8125e-003
cycles число. Например: 1059815424
smoothTransition true /false
type(Task) COMPLETED /ASSIGNED /FAILED
taskID Идентификатор сообщения в btdb файле. Например: "Mission Tasks.Mission 00.Task 1"
duration Число. Например: 5
syncroBySound true /false
showTips true /false
messageID Идентификатор сообщения в btdb файле. Например: "Mission Tips.Mission 00.Tip 2"
message Строка. Например: ""
delay Число. Например: 0
enableInterface true /false
transitionTime Число. Например: 0
setFollow true /false
turnTime Число. Например: 0
showTimer true /false
scaleByDifficulty true /false
onlyIfAi true /false
allCores true /false
onlyIfCoreDamaged true /false
placementStrategy PLACEMENT_STRATEGY_CORE /PLACEMENT_STRATEGY_STATION /PLACEMENT_STRATEGY_PLANT /PLACEMENT_STRATEGY_GUN /PLACEMENT_STRATEGY_SPECIAL_WEAPON
buildDurationMax Число. Например: 300
priority Число. Например: 1
mode ON /OFF
gunID см. gun
sellFactor AI_SELL_IF_DAMAGE_GREATER /AI_SELL_IF_GUN_CANT_REACH_BUILDINGS /AI_SELL_CLOSEST_TO_FRAME /AI_SELL_FAREST_FROM_FRAME
attackByType UNIT_ATTRIBUTE_LEECH /UNIT_ATTRIBUTE_DISINTEGRATOR /UNIT_ATTRIBUTE_PIERCER /UNIT_ATTRIBUTE_FILTH_SPOT0 /UNIT_ATTRIBUTE_FILTH_SPOT1 /UNIT_ATTRIBUTE_FILTH_SPOT2 /UNIT_ATTRIBUTE_FILTH_SPOT3 /UNIT_ATTRIBUTE_SCUM_SPLITTER /UNIT_ATTRIBUTE_SCUM_TWISTER /UNIT_ATTRIBUTE_SCUM_HEATER /UNIT_ATTRIBUTE_SCUM_THROWER /UNIT_ATTRIBUTE_SNIPER /UNIT_ATTRIBUTE_GYROID /UNIT_ATTRIBUTE_LEAMO /UNIT_ATTRIBUTE_CEPTOR /UNIT_ATTRIBUTE_R_PROJECTOR /UNIT_ATTRIBUTE_ROCKER /UNIT_ATTRIBUTE_NONE /UNIT_ATTRIBUTE_DIGGER /UNIT_ATTRIBUTE_SCUMER /UNIT_ATTRIBUTE_MORTAR /UNIT_ATTRIBUTE_WARGON /UNIT_ATTRIBUTE_BOMBER /UNIT_ATTRIBUTE_EXTIRPATOR /UNIT_ATTRIBUTE_UNSEEN
unitClassToAttack см. victimUnitClass
offensive true /false
attackTime число. Например: 120
remutateCounter число. Например: 1
holdProduction true /false
squadFollowDistance число. Например: 0.
squadToFollowBy см. chooseSquadID
ignoreLastTarget true /false
returnToBase true /false
interruptable true /false
weapon UNIT_ATTRIBUTE_GUN_BALLISTIC /UNIT_ATTRIBUTE_GUN_SCUM_DISRUPTOR /UNIT_ATTRIBUTE_GUN_FILTH_NAVIGATOR
Count* Число. Указывает количество дополнительных параметров. Подробнее этот вопрос рассмотрен в теме Specials

Модели

Установка и настройка инструментария

Для работы с моделями необходим плагин meshexp.DLE для 3Ds max 5:

  1. Поместить файл meshexp.dle в папку plugins графического редактора 3DS Max;
  2. Открыть менеджер дополнительных утилит через меню Customize/Plug-in Manager;
  3. Найти в нем строчку MESHEXP.DLE (в колонке Name). Обратите внимание, напротив имени утилиты в колонке Status стоит deferred. Необходимо загрузить плагин;
  4. Щелчком левой кнопки мыши выделить строчку с названием экспортера и, нажав правую кнопку, вывести меню, в котором выбрать пункт Selected Plug-in/Load. Зеленая точка в графе Status указывает на то, что плагин подключен, и можно приступать к работе.

Для просмотра моделей в игровом формате необходимо:

  1. Поместить файл WinVG.exe в папку с моделями (в игре это каталог установки Периметра\resource\models\main\);
  2. Запустить exe-файл;
  3. После запуска выбрать пункт меню File->Set effect directory и указать путь: каталог установки Периметра \RESOURCE\FX\;
  4. Просматривать файлы можно, открывая их через пункт меню File->Open или, выбирая модели в списке в правой части экрана;
  5. Повернуть модель в экране просмотра можно, зажав левую клавишу мыши и перемещая мышь. Перемещать модель в экране просмотра можно, зажав правую клавишу мыши, и перемещая мышь.

Экспортирование модели в игровой формат

Изменив модель в 3Ds Max 5, необходимо сохранить ее для использования в игре:

  1. Выбрать пункт меню File/Export;
  2. В окне сохранения выбрать тип файла M3D ver2.0 (*.M3D);
  3. Нажать кнопку Save;
  4. В появившемся окне Export Scene to .M3D File необходимо указать информацию об анимации (если она используется). Для этого необходимо нажать кнопку Add и заполнить поля:
  • Name - имя анимационной цепочки
  • start frame - номер первого кадра анимационной цепочки (для первой 0)
  • finish frame - номер последнего кадра анимационной цепочки
  • number frame - количество кадров анимации, чем больше, тем точнее. Не имеет смысл ставить цифру больше чем (finish-start).
  • precision vertex - минимальное число, при котором цепочка считается константной. (Скорее всего никогда не придется менять его.)
  • bump scale - влияет на рельефность бамп текстуры.
    При создании модели следует обратить внимание чтобы в ней были те же самые ноды 
    group* и logic* с аналогичной иерархией.
    В зданиях так-же должен быть объект _base_.

Если вы хотите изменить игровую модель, вы можете произвести экспорт в файл модели с заменой. При экспорте с заменой нет надобности указывать Name, start frame, finish frame, number frame, эти параметры будут заполнены автоматически.

Анимация моделей

Периметр - система анимации
v1.0 / 21.03.2006

Анимация юнита задаётся в виде графа, связями между узлами в нём являются анимационные цепочки. Сами узлы обозначают начало и конец цепочек. У зацикленных цепочек начало и конец совпадает. При запросе какой-либо цепочки по графу ищется путь до её начала от текущего положения (конец включённой в данный момент цепочки), затем цепочки согласно этому пути переключаются.

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

Список цепочек:

идентификатор значение тип
CHAIN_SWITCH_ON включение общие
CHAIN_SWITCHED_ON включено общие
CHAIN_SWITCH_OFF выключение общие
CHAIN_SWITCHED_OFF выключено общие
CHAIN_UPGRADE_PREPARE подготовка апгрейда общие
CHAIN_UPGRADE апгрейд общие
CHAIN_BUILD[N] этап строительства здания
CHAIN_UNBUILD[N] деконструкция этапа строительства здания
CHAIN_CLOSED закрыто общие
CHAIN_OPEN открытие общие
CHAIN_OPENED открыто общие
CHAIN_CLOSE закрытие общие
CHAIN_FIRE стрельба оружие
CHAIN_FIRE_PREPARE подготовка к стрельбе оружие
CHAIN_RESET сброс оружие
CHAIN_CHARGE зарядка общие
CHAIN_CHARGED заряжено общие
CHAIN_DISCHARGE разрядка общие
CHAIN_DISCHARGED разряжено общие
CHAIN_DETACHED фрейм отсоединён от энергосистемы фреймы
CHAIN_ATTACHED фрейм подсоединён к эренгосистеме фреймы
CHAIN_DETACH отсоединение фреймы
CHAIN_ATTACH присоединение фреймы
CHAIN_DETACHED_INPUT заезд в отсоединённый фрейм фреймы
CHAIN_DETACHED_OUTPUT выезд из отсоединённого фрейма фреймы
CHAIN_ATTACHED_OUTPUT выезд из присоединённого фрейма фреймы
CHAIN_ATTACHED_INPUT заезд в присоединённый фрейм фреймы
CHAIN_PRODUCTION производство заводы
CHAIN_DIE смерть общие
CHAIN_MOVE движение юниты
CHAIN_STOP остановка юниты
CHAIN_TAKEOFF взлёт лётные
CHAIN_LANDING посадка лётные

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

Список узлов:

идентификатор узла значение
CHAIN_NODE_SWITCHED_ON включено
CHAIN_NODE_SWITCHED_OFF выключено
CHAIN_NODE_OPENED открыто
CHAIN_NODE_CLOSED закрыто
CHAIN_NODE_UPGRADE_START начало апгрейда
CHAIN_NODE_BUILD[N] этап строительства
CHAIN_NODE_CHARGED заряжено
CHAIN_NODE_DISCHARGED разряжено
CHAIN_NODE_FIRE стрельба
CHAIN_NODE_DETACHED отсоединено от энергосистемы
CHAIN_NODE_ATTACHED присоединено к энергосистеме
CHAIN_NODE_DETACHED_OPENED отсоединено от энергосистемы / открыто
CHAIN_NODE_ATTACHED_OPENED присоединено к энергосистеме / открыто
CHAIN_NODE_DEAD смерть
CHAIN_NODE_GROUND юнит на земле
CHAIN_NODE_FLIGHT юнит в воздухе
CHAIN_NODE_UNDERGROUND юнит под землёй


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

Для обычных юнитов при движении включается CHAIN_MOVE, при остановке – CHAIN_STOP. Подземным юнитам под землёй тоже включается CHAIN_STOP.

Зданиям при строительстве включается CHAIN_BUILD[N], в построенном сотоянии – CHAIN_SWITCHED_ON. Есть исключения – фреймы, ядра/трансмиттеры, порталы анимируются по-своему, см. в коде. Заводам при производстве включается CHAIN_PRODUCTION, по окончании производства – CHAIN_OPEN.

Скверна анимируется по-своему, в зависимости от типа, см. в коде.

Для боевых юнитов стрельба визуализируеттся в отджельной анимационной группе, если в оружии установлен флаг WEAPON_HAS_FIRE_CONTROLLER или в корневой анимационной группе, если установлен флаг WEAPON_ROOT_FIRE_ANIMATION. При стрельбе включается CHAIN_FIRE, по окончании стрельбы - CHAIN_SWITCHED_OFF. Если надо визуализировать зарядку оружия (установлен флаг WEAPON_NEED_CHARGE), то во время зарядки включается CHAIN_PRODUCTION.

Хранится анимация в AttributeLibrary, “Описание анимации”. Цепочки там объединены в анимационные группы, для независимой анимации частей объекта.

идентификатор группы значение
ANIMATION_GROUP_ROOT корневая группа, для основной анимации
ANIMATION_GROUP_CITY фрейм – анимация города
ANIMATION_GROUP_PILLAR фрейм – анимация колонн
ANIMATION_GROUP_ANIMATE фрейм – анимация для оживления в подключенном состоянии
ANIMATION_GROUP_LIGHTING ядра – источник света на колонне
ANIMATION_GROUP_CHARGING ядра – визуализация зарядки
ANIMATION_GROUP_FIRE оружие – отдельная группа для визуализации стрельбы

Редактируемые параметры цепочки:

параметр значение
chainID идентификатор цепочки
chainName имя цепочки в 3D модели
phase начальная фаза цепочки, [0, 1]. Для цепочек, проигрываемых в обратном направлении ставить 1, для обычных 0
period длительность цепочки, мс. Для цепочек, проигрываемых в обратном направлении ставить отрицательную
begin идентификатор начала цепочки
end идентификатор конца цепочки
periodDeviation разброс длительности, если ненулевой, то period += rnd(perionDeviation), phase = rnd(1)
enableReverse если = 1, то при запросе обратной по отношению к текущей цепочки (т.е. у них одинаковые начало и конец, но разное напревление) переход на неё происходит сразу (сделано исключительно для корректного отображения зарядки у ядер)
counter служебные данные
soundID идентификатор звукового события, привязанного к цепочке

Подключение готовой модели в игру

Для интеграции модели в игру необходимо:

  1. Положить текстуру в каталог установки Периметра \resource\models\main\textures;
  2. Дополнительно положить текстуру в каталог расы:
    1. каталог установки Периметра \resource\models\main\Empire - для Империи
    2. каталог установки Периметра \resource\models\main\Exodus - для Исхода
    3. каталог установки Периметра \resource\models\main\Harkbackhood - для Возврата
  3. Поместить в каталог установки периметра\resource\models\main файлы *.m3d (модели) и *.l3d (набор логики).

Текстуры могут иметь любой размер. Можно добавлять свои, дополнительные текстуры. Текстур обычно две RGB текстура и текстура микрорельефа – Bump. Normal Mapping не поддерживается.

Требования к моделям

При создании модели следует четко придерживаться иерархии сцены, с которой можно ознакомиться в прилагаемых примерах. Обязательно наличие объектов group* и logic* с аналогичной иерархией. В зданиях также должен быть объект _base_. Иерархия строится на основе привязок (в 3Ds Max 5 на главной панели слева третий значок “Select and Link” 2hEDihQmgiw.jpg) Dummy объектов и мешей модели. Правильную иерархию можно посмотреть не только в прилагаемых к Золотому Изданию игры исходных моделях, а так же в программе для просмотра моделей WinVG.exe. Логика иерархии прописана в коде игры, поэтому следует четко придерживаться иерархии. Каждый элемент под названием Group, это Dummy в 3DsMax с тем же названием. Иерархия древовидная.

Ограничения по анимации - не поддерживается скелетная анимация и морфинг, можно только двигать, вращать, масштабировать объект целиком (масштабировать можно по всем или по одной оси).

Кроме этого, есть анимация прозрачности материала, координат материала и видимость-невидимость. Можно использовать и анимировать источники света “Omni” и некоторые его параметры.

Спецификация формата моделей и логики

(скачать m3dl3d.docx: drive dropbox) (автор - @!!ex)

Статья по модификации моделей (автор GREM)

{Итак, я все же собрался ее написать. Только не судите строго, а если чего неправильно - критикуйте.}

Будем рассматривать пример Лимо, так как он мной лучше всего изучен.

Допустим, что у вас уже есть какая-то модель, осталось только затекстурировать и вставить в игру. И тут я обнаружил первое ограничение - можно нанести карту только на весь объект (в 3д максовском смысле, то что в одном габаритном контейнере) сразу, на части наносить разные карты нельзя, хотя проекций можно использовать много. Всякие карты отражений и рельефности надо включать в один материал. Далее, те участки модели, которые будут изменять цвет в зависимомти от вашего выбора (в сражениях или сетевой игре цвет можно выбрать, я про него говорю) надо вынести в отдельные объектs. А вот как этот объект отделить от остальных, чтоб он действовал, я пока не знаю, но это связано с материалом.
С текстурами у меня все...
Теперь как организовать анимацию...
Чтоб модель вообще работала, нужно насоздавать объектов dummy со следующими именами и привязаны друг к другу они должны быть так (тут же я укажу и привязку модели к логическим объектам, обозначение:

"обект 1" > "объект 2" > "объект 4"
 :
> "объект 3"

означает: объект 4 зависит от объекта 2, который зависит в свою очередь от объекта 1, обеъкт 3 также непосредственно зависит от объекта 1):
logic center > logic bashnia > logic dulo > logic fire > logic targeting a > logic targeting b

> logic bound {это простой бокс, охватывающий всю модель}

Теперь объекты, управляющие моделью:

group center > group bashnia > group dulo > group fire > omni01 {источник света, который нужен для вспышки лазера}
: : :
: : > group targeting a > group targeting b
: : :
: : > [имя ствола]
: :
: > [имя башни лимо]
:
> [имя корпуса лимо]

Рекомендую логические объекты с названиями, отличающимися только словами logic и group создавать в одних и тех же координатах.
Надо отметить, что корпус, или башня, или ствол могут состоять из нескольких частей, тогда все части прицепляются либо друг к другу, либо "параллельно".
Что бы всышка лазера была, я объект omni01 копировал просто из оригинальной модели, я ее вам тоже дам.
И еще тонкость: чтоб ствол вращался в правильном направлении, group dulo надо повернуть на 180 в любую сторону.
Анимацию лучше оставить какая была, для этого сохраняем оригинальные файлы limo.m3d и limo.l3d куда нибудь в безопасное место, а свою работу сохраняем повер старых (как сохранить вы должны знать, если у вас есть плагин meshexp.dle). Старая анимация отобразится при сохранении в диалоге экспорта.

Статья по модификации моделей (Игромания)

Статья Игромании

Миры

Полезное для создания миров

Для создания маленького мира на троих, для ровного расположения игроков на карте, координаты следующие:
Player1: x1024, y292
Player2: x1657, y1389
Player3: x390, y1389

Официальный редактор карт – SurMap3

Редактор миров SurMap

Выберите мир для редактирования из папки Worlds через меню File -> Open World As... (для создания нового мира необходимо открыть пустой шаблон в папке 001_EMPTY 4x4 или 001_EMPTY 2x2).

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

6cgg6vX.jpg Перемещение по поверхности мира.

5Bvo8cD.jpg Приближение или удаление камеры.

sRWJZvR.jpg Тулзер (инструмент для насыпания\выкапывания. Параметры тулзера (радиус, форма и свойства кисти) настраиваются на вспомогательной панели внизу экрана.

AcJYLsX.jpg Установка на мир готовой фигуры (пирамида, параметры настраиваются на вспомогательной панели внизу экрана).

pcN9voH.jpg Установка на мир готовой фигуры (круг, параметры настраиваются на вспомогательной панели внизу экрана).

DbeX2D8.jpg Работа с зеро-слоем, внизу экрана необходимо установить радиус инструмента.

P3WvOur.jpg Установка модели из списка внизу экрана.

hIXVFKO.jpg Наложение карты высот (карту необходимо выбрать из списка внизу экрана, после корректного размещения на мире нажать кнопку Put для перевода карты в рельеф).

lobi9pr.jpg Инструмент размытия контуров.

aPIp8AP.jpg Гео-инструмент для работы с рельефом (параметры настраиваются в нижней части экрана).

ixHbFYR.jpg Инструмент позволяет выделить прямоугольный участок мира и работать только в выделенной области.

По завершению работы с миром необходимо сохранить изменения через команду File -> Open World As... (для записи нового мира необходимо предварительно создать пустой каталог в папке Worlds). После завершения подготовки ландшафта можно наложить текстуру поверхности на мир. Предварительно подготовленную текстуру в формате TGA необходимо положить в папку мира, сохранив файл с текстурой под названием AllDamMap.tga (в папку также необходимо скопировать служебный файл leveledSurfaceTexture.tga - текстуру зерослоя).

SBqbcXl.jpg Данный инструмент используется в редакторе миров для наложения текстуры на готовый мир.

Все новые миры необходимо прописывать в списке миров - файле RESOURCE\Worlds\worlds.prm, в котором первая строка содержит количество миров, все остальные содержат имя файла и название папки (относительный путь к папке с миром).

Официальный редактор геотекстур – GeoTool

File:GeoTool.JPG
Редактор геотекстур GeoTool
Редактор не предназначен для редактирования текстуры поверхности (шкурки мира).
Внимание! В официальной поставке редактора не хватает ряда текстур в папке GeoTx. При запуске редактора возникают ошибки, где написан путь и название отсутствующей текстуры. Следует пройти по тому пути, продублировать близкий по названию файл и дать ему название из ошибки и перезапустить программу. Проделываем данное действие пока ошибки не пропадут.

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

Для работы с геотекстурами на мире используется инструмент GeoTool.exe.
После запуска вам предложат выбрать мир из списка (список формируется с помощью worlds.prm, поэтому все новые миры необходимо предварительно прописать в этом файле).
Затем необходимо установить в верхней панели (включающей ряд слотов с установленным по умолчанию значением Empty) значения Clear, Mixer или Painter (список возможных значений выводится по правому клику).
Чтобы загрузить текстуру - выбираем слот левым кликом, затем выбираем текстуру в списке слева и переносим пункт списка на экран, зажав левую клавишу.

Если вам требуется открыть карту, то слоты геотекстур окажутся пустыми, чтобы загрузить геотекстуры карты нужно нажать "File > Load textures" и в папке с нужным вам миром открыть файл geoTx.xml

При работе с геотекстурами можно копать и насыпать, чтобы видеть как будут вести себя геотекстуры в игре. Для этого в редакторе есть специальный инструмент File:Geotool2.JPG, действие которого инвертируется зажатием клавиши Shift. Зажимая ctrl можно перемещать рампу клиппинга.

После завершения работы с геотекстурами необходимо записать изменения. При записи необходимо указать временной имя, для этого нажимаем File > Save Texture. В нашем примере было введено временное название "2". После сохранения изменений в выбранной папке появятся 4 файла. Их необходимо перенести в каталог соответствующего мира, переименовав следующим образом:

 2.geoLattice.bin -> geoLattice.bin
 2.geoPal.xml -> geoPal.xml
 2.xml -> geoTx.xml
 2.pal.pal -> inGeo.act

Редактор сообщества - Perimeter Map Compiler

Perimeter Map Compiler

Внимание, редактор представляет собой компилятор карт.

Требование к карте глубины, grayscale или RGB, 16bit предпочтительно tiff (tif не поддерживается).

Создаются компилятором карт (создатель - Don Reba), с помощью различных изображений в формате .bmp (8bit), .tiff(8-16bit), .tga(8bit) для редактирования которых лучше пользоваться Adobe Photoshop. К слову, можно в 3D-редакторе (3ds max, Maya, Z-brush, Blender, 3D-Coat) или редакторах ландшафтов (World Mashine) сделать серую модель рельефа нужного мира и рендерить карту глубины z-depth в виде Top (сверху) в ортопроекции (способ создания heightmap в 3Ds Max). После - без динамичного света и затенения рендерить модели с текстурой.

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

  1. Прежде всего делаем запасную копию файла ПапкаПериметра\Resource\Worlds\worlds.prm.
  2. Затем в PMC открываем файл проекта, жмем "Install Map", закрываем PMC.
  3. Удаляем модифицированный PMC'ом вышеупомянутый worlds.prm, ставим на его место свою копию.
  4. Открываем worlds.prm, плюсуем к числу в самом начале файла единицу, затем пишем английское имя мира в самом конце списка наименований, с сохранением всех отступов (делайте их пробелами или Tab'ами, не суть важно). Имя мира должно быть написано заглавными буквами.
  5. В каталоге ПапкаПериметра\Resource\Worlds\ переименовываем папку с добавленным вами миром (UNREGISTERED) в то имя, которое было указано в worlds.prm.
  6. В папке ПапкаПериметра\Resource\Multiplayer\ переименовываем файлы UNREGISTERED с расширениями .dat, .gmp и .spg в имена, аналогичные имени, указанному в worlds.prm.
  7. Открываем в этой же папке .spg-файл Блокнотом. Он может довольно-таки долго загружаться. Меняем в самом начале в строке "worldName = "UNREGISTERED";" слово UNREGISTERED на world.prm-овское имя.
  8. В том же файле, после блока с именами, цветами и фракциями игроков, меняем в строке "originalSaveName = "resource\\battle\\UNREGISTERED.spg";" слово UNREGISTERED на world.prm-овское имя.
  9. Проделываем пункт 6 еще раз, но уже в папке ПапкаПериметра\Resource\Battle\ .
  10. Проделываем пункты 7 и 8 с .spg-файлом в папке ПапкаПериметра\Resource\Battle\ .
  11. Повторяем пункты 9 и 10 с файлами в папке ПапкаПериметра\Resource\Battle\Survival\ .
  12. Открываем btdbEditor'ом файл ПапкаПериметра\Resource\LocData\Russian\Text\Texts.btdb. В самом конце найдите пункт MapNames.UNREGISTERED, выделите его, и нажмите пункт меню "Edit -> Remove Item".
  13. Нажимаем пункт меню "Edit -> Add Item". В поле "Value Name" введите world.prm-овское имя мира (вид должен быть такой: MapNames.WORLDNAME). В поле "Value Data" вводите русскоязычное имя мира (рекомендуется заглавными буквами). Нажимайте кнопку "ОК".
  14. . Сохраняем файл с текстом на место прежнего. Впрочем, никогда не будет лишним сделать запасную копию файла. Можете запускать Периметр и любоваться на свой добавленный мир.

P.S.: обратите внимание, у вас может не работать без дополнительной обработки режим выживания (то есть через ~10 секунд после запуска засчитывается автопобеда)! Также возможен такой глюк, что на добавленном вами мире абсолютно все будет черным и невидимым. Пока что способ решения найден только один: отключить в настройках графики самозатенение.

P-Launcher

Синхронизация карт в формате "Кустов" созданных в редакторе сообщества (разработчитк - Don Reba). Фактически, даже если бы проект был завершен, сайт rul-clan.ru все равно давно не работает, а значит и синхронизация карт с сервером тоже.

Статус: заброшен ¯\_(ツ)_/¯

Экстрактор текстур и карты глубины из игровых карт

Разработанный @!!ex’ом конвертер VMPToTIFF (drive) предназначен исключительно для извлечения растровых текстур и карты глубины из игровых карт (World/NAME_MAP/_.vmp) для использования в своих целях. Для того, чтобы извлечь текстуры из карты игры, нужно .VMP файл перетянуть на файл VMPToTIFF.exe. В папке с бинарником .VMP появятся текстуры и карта высоты данной игровой карты.

Эффекты

описание

Официальный редактор EffectTool

Устаревший официальный редактор, который нигде не публиковался открыто. На смену ему пришел FX_tool.

Официальный редактор FX_tool

Эффекты создаются редактором FX_tool. Редактор использовался К-Д Лаб при создании эффектов игры, никогда публично не публиковался. На данный момент в свободном доступе отсутствует.

Сценарий

Цепь Миров

Archive.

Для редактирования файла scenario.hst используйте редактор сценариев (в разработке, на этот раз Da_Net_Naverno создатель), содержащий окно предварительного просмотра. Инструкция в справке программы.

Тексты

Чтобы редактировать тексты игры, воспользуйтесь btdbEditor'ом (автор - Don Reba). Просто откройте файл [папка с игрой]\RESOURCE\LocData\Russian\Text\Texts.btdb

Мультимедиа

Голос

В кампании (формат Wav): [папка с игрой]\RESOURCE\LocData\Russian\Voice. Внутри 2 папки (формат ogg): Briefings - брифинги, Tips - голос в миссиях (т. е. непосредственно на самом мире).

Музыка

В папке [папка с игрой]\RESOURCE\Music , в формате ogg.

Видео

В формате RAD Game Video (.bik), открывается в RAD Video Tools и MPC-HC.