Редактирование миссий: Difference between revisions

From Perimeter Community Wiki
Jump to navigation Jump to search
(Created page with "Имейте в виду, что у миссий и сохранений одинаковый формат. '''Создание''' Для создания миссий можно воспользоваться самой игрой. Запустите режим сражения, выберите цвет и фракцию. После создания сражения СРАЗУ сохраните его, после этого можете выходить из игры.")
 
 
(One intermediate revision by the same user not shown)
Line 4: Line 4:


Для создания миссий можно воспользоваться самой игрой. Запустите режим сражения, выберите цвет и фракцию. После создания сражения СРАЗУ сохраните его, после этого можете выходить из игры.
Для создания миссий можно воспользоваться самой игрой. Запустите режим сражения, выберите цвет и фракцию. После создания сражения СРАЗУ сохраните его, после этого можете выходить из игры.
==Редактирование==
===Объекты===
Для расстановки объектов необходимо активировать встроенный редактор миссий.
[Редактор]<br />
'''"Каталог игры"/Perimeter.ini''' (Открыть блокнотом)<br />
  '''В файле:'''<br />
  В разделе '''[Game]'''
  '''StartSplash=1''' меняете на '''0'''
  '''MissionEdit=0''' меняете на '''1'''<br />
  В разделе '''[Graphics]'''
  '''FullScreen=1''' меняете на '''0'''
Редактором хорошо работать с сохраненными играми.<br />
При создании нового мира (карты) редактором удобно выравнивать ландшафт до зерослоя под начальным положением всех игроков, после чего сохранив игру из папки "Каталог игры"/resource/save можно скопировать ваше сохранение (три файла: .dat,.gmp,.spg) в multiplayer или battle, с кое какими изменениями (читайте раздел Редактор сообщества).
Меню строений, юнитов, скверны, гео процессов - '''Клавиша: Insert, либо F'''<br />
Для нормальной работы приложения возвращайте показатели в исходное положение.<br />
Сохраненные миссии хранятся в папке Папка-Периметра\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" для данного игрока) Боюсь, я описал все это несколько неясно, уж извините :) Аид
===Скрипты===
Редактируются вручную или редактором скриптов. Также, в некоторых файлах скриптов задана логика ботов для режима Сражений/мультиплеерной игры.<br />
*'''".spg"''' - Скрипты миров. Может содержать в себе триггеры, включая ботов. Поскольку триггеры приходится прописывать индивидуально для каждого из четырех игроков, целесообразнее создавать триггеры отдельно (смотрите следующий пункт).<br />
*'''".scr"''' - Скрипты миссий, ботов, кат-сцен и прочего, находятся в папке Scripts/Triggers. При добавлении или удалении триггера не забывайте менять число количества триггеров в начале скрипта.<br />
[https://yadi.sk/d/6wS_MPzh3LUgYV '''Редактор скриптов от @!!ex'''] для редактирования файлов типа ".scr"
'''Принципы работы с Advanced Perimeter Script Editor (APSL):'''
Основные операции по изменению триггеров происходят в окне Editor Window,<br />
в которм скрипты представляются в виде Advanced Perimeter Script Language(APSL).<br />
Этот язык разработан для упрощения работы со скриптами.<br />
Общее описание языка расположено в файле Specification.<br />
Быстрый доступ к зарезервированным словам,кондишенам, экшенам и константам можно получить по нажатию на Ctrl+Space.<br />
Быстрый доступ содержит все экшены/кондишены, но не все константы. Нужные пока придется искать самостоятельно основываясь на примерах.<br />
'''Общие правила написания скриптов на APSL:'''<br />
1) Идентификатор триггера должен быть уникальным для данного игрока и должен быть записан в кавычках.<br />
2) Регистр записи констант значения не имеет.<br />
3) Соблюдения отступа не обязательно и не повлияет на откомпилированный скрипт.<br />
4) Регистр записи блоков OR/AND,кондишенов и экшенов значения не имеет.<br />
5) Регистр записи типа кондишена(NORMAL/INVERTED) значения не имеет.<br />
6) Регистр записи типа триггера(SLEEPING/CHECKING) значения не имеет.<br />
7) ПОМНИТЕ! При записи строковых констант регистр имеет значение! "String" и "string" не одно и тоже!<br />
8) Наличие пустых строк не допустимо.<br />
9) Компилятор не проверяет правильности написания констант, поэтому очень внимательно следити за этим!!!<br />
10) Компилятор не проверяет количество кондишенов, поэтому внимательно следите, правильно ли вы указали их количество!<br />
'''Принципы работы с Быстрым Доступом.'''
''Прошу прощения за такое "кривое" название, но я просто не могу придумать корректного перевода. :) (прим. разраб.)''
Использовать очень просто. Набираем начало нужного слова Например: UNIT_ нажимаем Ctrl+Space и в открывшемся списке содержащем все слова начинающиеся на UNIT_ выбираем нужное.<br />
Быстрый доступ возможен только при редактировании скриптов на APSL.
==== Specification ====
Простейший триггер:
<pre>
"Simple"
    AND
          0
    END
ACTION 0
LINKS
STATE CHECKING
</pre>
Каждый тригер состоит из 5 основных элементов:<br />
1)Название. В данном случае триггер называется Simple:<br />
"Simple"
2)Условие(я) выполнения триггера. В данном случае триггер выполняется всегда:
<pre>
    AND
          0
    END
</pre>
3)Действие. В данном случае тригер не выполняет никаких действий:
<pre>
ACTION 0
</pre>
4)Ссылки. Список триггеров, которые активируются при выполнении текущего триггера. В данном случае список пустой:
<pre>
LINKS
</pre>
5)Статус триггера. Может быть либо CHECKING(выполняется, если выподнились все кондишены, после чего статус становится SlEEPING), либо SLEEPING(не выполняется). В данном случае триггер проверяется:
<pre>
STATE CHECKING
</pre>
Рассмотрим поподробнее блок:
<pre>
    AND
          0
    END
</pre>
AND означает, что над результатом всех кондишенов в блоке нужно произвести логическую операцию and.<br />
Также в начале блока может стоять OR, тогда соответственно над результатами производится операция or.<br />
Число идущее после обозначения логической операции обозначает количество вложенных конишенов (Вложенный блок также считается за одну команду).<br />
В данном случае 0 означает, что блок не содержит условий.
Следующий блок содержит одно условие, поэтому число равно 1.
<pre>
    AND
          1
          NORMAL FrameState(AI_FRAME_STATE_INSTALLED,AI_PLAYER_TYPE_ME,100)
    END
</pre>
Каждый блок может содержать в себе любое количество вложенных блоков. В данном случае имеется один вложенный блок типа OR:
<pre>
    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
</pre>
Каждый кондишн и вложенный блок имеет тип: либо NORMAL, либо INVERTED. NORMAL означает, что нужно взять результат кондишена без изменений, а INVERTED, что нужно взять противоположный.
Список кондишенов можно узнать в Conditions.<br />
Список экшенов можно узнать в Actions.<br />
Почти все кондишены и экшены имееют параметры. Список параметров можно получить в Variables.<br />
Все парметры перечисляются в круглых скобках через запятую. ПЕРЕНОС СТРОКИ НЕ ДОПУСТИМ!<br />
3 экщена, в которых дополнительные параметры указываются в следующих строках описаны в Specials.<br />
==== Specials ====
Существует три экшена-исключения, в которых присутствуют дополнительный параметры. Количество дополнительных параметров указывается в конце основных.
SetControls(1)
В качестве парметра указано количество блоков дополнительных парметров.
Каждый блок имеет следующий вид:
<pre>
controlID
enabled
visible
flashing
tabNumber
</pre>
Где controlID указывает на кнопку интерфейса параметры которой меняем,
enabled может принимать значения true/false, указывает на то, можно ли нажать эту кнопку или нет,
visible может принимать значения true/false, указывает на то, видна ли эта кнопку или нет,
flashing может принимать значения true/false, указывает на то, мигает ли кнопа или нет,
tabNumber обычно принимает значени 0, зачем нужна мне не ясно.
Пример:
<pre>
ACTION SetControls(2)
    SQSH_RELAY_ID
    true
    true
    true
    0
    SQSH_TAB_BUILD_ID
    true
    true
    true
    1
SquadAttack(...,1)
</pre>
Имеет множество основных парметров последний из которых указывает на количество дополнительных параметров.<br />
Каждый дополнительный параметр имеет вид:
<pre>
unitsToAttack
</pre>
Где unitsToAttack объекты, которые сквад должен атаковать в первую очередь.
Пример:
<pre>
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)
</pre>
Имеет множество основных парметров последний из которых указывает на количество дополнительных параметров.<br />
Каждый дополнительный параметр имеет вид:
<pre>
unitsToAttack
</pre>
Где unitsToAttack объекты, которые супер оружие должно атаковать в первую очередь.
Пример:
<pre>
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
</pre>
==== Actions ====
<pre>
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*)
</pre>
==== Conditions ====
<pre>
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()
</pre>
==== Variables ====
{| class="wikitable"
!Экшены, экстеншены!!Возможные значения
|-
|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. Может быть указано несколько объектов через: <pre>|</pre> Например: <pre>UNIT_CLASS_FRAME | UNIT_CLASS_STRUCTURE_CORE</pre>
|-
|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. Может быть указано несколько объектов через: <pre>|</pre> Например: <pre>FILTH | GEO</pre>
|-
|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
|}

Latest revision as of 04:57, 10 May 2024

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

Создание

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

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

Объекты

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

[Редактор]

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

 В файле:
В разделе [Game] StartSplash=1 меняете на 0 MissionEdit=0 меняете на 1
В разделе [Graphics] FullScreen=1 меняете на 0

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

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

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

Сохраненные миссии хранятся в папке Папка-Периметра\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