|
|
(7 intermediate revisions by 2 users not shown) |
Line 13: |
Line 13: |
| * WinVG.exe - утилита для просмотра просмотр моделей в игровом формате (m3d) | | * WinVG.exe - утилита для просмотра просмотр моделей в игровом формате (m3d) |
|
| |
|
| ==Миссии==
| |
|
| |
|
| Имейте в виду, что у миссий и сохранений одинаковый формат.
| | ==Миры (карты)== |
| | [[Создание и редактирование миров]] |
|
| |
|
| '''Создание'''
| | ==Миссии== |
| | | [[Редактирование миссий]] |
| Для создания миссий можно воспользоваться самой игрой. Запустите режим сражения, выберите цвет и фракцию. После создания сражения СРАЗУ сохраните его, после этого можете выходить из игры.
| |
| | |
| ==Редактирование== | |
| | |
| ===Объекты===
| |
| | |
| Для расстановки объектов необходимо активировать встроенный редактор миссий.
| |
| | |
| [Редактор]<br /> | |
| | |
| '''"Каталог игры"/Perimeter.ini''' (Открыть блокнотом)<br />
| |
| | |
| '''В файле:'''<br />
| |
| В разделе '''[Game]'''
| |
| '''StartSplash=1''' меняете на '''0'''
| |
| '''MissionEdit=0''' меняете на '''1'''<br />
| |
| В разделе '''[Graphics]'''
| |
| '''FullScreen=1''' меняете на '''0'''
| |
| | |
| {| style="border: 1px solid rgba(0, 255, 0, 1); border-left-width: 4px; background-color: rgba(0, 255, 0, 0.1);"
| |
| |Либо если вы пользуетесь патчем '''SetCustomResolution''' от @!!ex (входящий в состав [[Perimeter Wide screen]]), то просто поставьте галочку напротив '''Editor mode''' и нажмите '''Patch.'''
| |
| |}
| |
| | |
| Редактором хорошо работать с сохраненными играми.<br />
| |
| При создании нового мира (карты) редактором удобно выравнивать ландшафт до зерослоя под начальным положением всех игроков, после чего сохранив игру из папки "Каталог игры"/resource/save можно скопировать ваше сохранение (три файла: .dat,.gmp,.spg) в multiplayer или battle, с кое какими изменениями (читайте раздел Редактор сообщества).
| |
| | |
| Меню строений, юнитов, скверны, гео процессов - '''Клавиша: Insert'''<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
| |
| |}
| |
|
| |
|
| ==Модели== | | ==Модели== |
| | | [[Редактирование моделей]] |
| ===Установка и настройка инструментария===
| |
| | |
| Для работы с моделями необходим плагин meshexp.DLE для 3Ds max 5:
| |
| | |
| # Поместить файл '''meshexp.dle''' в папку '''plugins''' графического редактора 3DS Max;
| |
| # Открыть менеджер дополнительных утилит через меню '''Customize/Plug-in Manager''';
| |
| # Найти в нем строчку '''MESHEXP.DLE''' (в колонке '''Name'''). Обратите внимание, напротив имени утилиты в колонке '''Status''' стоит '''deferred'''. Необходимо загрузить плагин;
| |
| # Щелчком левой кнопки мыши выделить строчку с названием экспортера и, нажав правую кнопку, вывести меню, в котором выбрать пункт '''Selected Plug-in/Load'''. Зеленая точка в графе Status указывает на то, что плагин подключен, и можно приступать к работе.
| |
| | |
| Для просмотра моделей в игровом формате необходимо:
| |
| | |
| # Поместить файл '''WinVG.exe''' в папку с моделями (в игре это каталог установки Периметра\resource\models\main\);
| |
| # Запустить exe-файл;
| |
| # После запуска выбрать пункт меню '''File->Set effect directory''' и указать путь: каталог установки Периметра \RESOURCE\FX\;
| |
| # Просматривать файлы можно, открывая их через пункт меню '''File->Open''' или, выбирая модели в списке в правой части экрана;
| |
| # Повернуть модель в экране просмотра можно, зажав левую клавишу мыши и перемещая мышь. Перемещать модель в экране просмотра можно, зажав правую клавишу мыши, и перемещая мышь.
| |
| | |
| ===Экспортирование модели в игровой формат===
| |
| | |
| Изменив модель в 3Ds Max 5, необходимо сохранить ее для использования в игре:
| |
| | |
| # Выбрать пункт меню '''File/Export''';
| |
| # В окне сохранения выбрать тип файла '''M3D ver2.0 (*.M3D)''';
| |
| # Нажать кнопку Save;
| |
| # В появившемся окне '''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, эти параметры будут заполнены автоматически.
| |
| | |
| ===Анимация моделей===
| |
| | |
| '''Периметр - система анимации'''<br />
| |
| ''v1.0 / 21.03.2006''
| |
| | |
| Анимация юнита задаётся в виде графа, связями между узлами в нём являются анимационные цепочки. Сами узлы обозначают начало и конец цепочек. У зацикленных цепочек начало и конец совпадает. При запросе какой-либо цепочки по графу ищется путь до её начала от текущего положения (конец включённой в данный момент цепочки), затем цепочки согласно этому пути переключаются.
| |
| | |
| Кроме цепочки, из кода может быть запрошен и просто узел графа, работает это аналогично запросу цепочки.
| |
| | |
| Список цепочек:
| |
| {| class="wikitable"
| |
| !идентификатор!!значение!!тип
| |
| |-
| |
| |CHAIN_SWITCH_ON||включение||общие
| |
| |-
| |
| |style="color: black; background-color: silver;"|CHAIN_SWITCHED_ON||style="color: black; background-color: silver;"|включено||style="color: black; background-color: silver;"|общие
| |
| |-
| |
| |CHAIN_SWITCH_OFF||выключение||общие
| |
| |-
| |
| |style="color: black; background-color: silver;"|CHAIN_SWITCHED_OFF||style="color: black; background-color: silver;"|выключено||style="color: black; background-color: silver;"|общие
| |
| |-
| |
| |style="color: black; background-color: silver;"|CHAIN_UPGRADE_PREPARE||style="color: black; background-color: silver;"|подготовка апгрейда||style="color: black; background-color: silver;"|общие
| |
| |-
| |
| |style="color: black; background-color: silver;"|CHAIN_UPGRADE||style="color: black; background-color: silver;"|апгрейд||style="color: black; background-color: silver;"|общие
| |
| |-
| |
| |style="color: black; background-color: silver;"|CHAIN_BUILD[N]||style="color: black; background-color: silver;"|этап строительства||style="color: black; background-color: silver;"|здания
| |
| |-
| |
| |CHAIN_UNBUILD[N]||деконструкция этапа строительства||здания
| |
| |-
| |
| |style="color: black; background-color: silver;"|CHAIN_CLOSED||style="color: black; background-color: silver;"|закрыто||style="color: black; background-color: silver;"|общие
| |
| |-
| |
| |style="color: black; background-color: silver;"|CHAIN_OPEN||style="color: black; background-color: silver;"|открытие||style="color: black; background-color: silver;"|общие
| |
| |-
| |
| |style="color: black; background-color: silver;"|CHAIN_OPENED||style="color: black; background-color: silver;"|открыто||style="color: black; background-color: silver;"|общие
| |
| |-
| |
| |style="color: black; background-color: silver;"|CHAIN_CLOSE||style="color: black; background-color: silver;"|закрытие||style="color: black; background-color: silver;"|общие
| |
| |-
| |
| |style="color: black; background-color: silver;"|CHAIN_FIRE||style="color: black; background-color: silver;"|стрельба||style="color: black; background-color: silver;"|оружие
| |
| |-
| |
| |CHAIN_FIRE_PREPARE||подготовка к стрельбе||оружие
| |
| |-
| |
| |CHAIN_RESET||сброс||оружие
| |
| |-
| |
| |style="color: black; background-color: silver;"|CHAIN_CHARGE||style="color: black; background-color: silver;"|зарядка||style="color: black; background-color: silver;"|общие
| |
| |-
| |
| |style="color: black; background-color: silver;"|CHAIN_CHARGED||style="color: black; background-color: silver;"|заряжено||style="color: black; background-color: silver;"|общие
| |
| |-
| |
| |style="color: black; background-color: silver;"|CHAIN_DISCHARGE||style="color: black; background-color: silver;"|разрядка||style="color: black; background-color: silver;"|общие
| |
| |-
| |
| |style="color: black; background-color: silver;"|CHAIN_DISCHARGED||style="color: black; background-color: silver;"|разряжено||style="color: black; background-color: silver;"|общие
| |
| |-
| |
| |style="color: black; background-color: silver;"|CHAIN_DETACHED||style="color: black; background-color: silver;"|фрейм отсоединён от энергосистемы||style="color: black; background-color: silver;"|фреймы
| |
| |-
| |
| |style="color: black; background-color: silver;"|CHAIN_ATTACHED||style="color: black; background-color: silver;"|фрейм подсоединён к эренгосистеме||style="color: black; background-color: silver;"|фреймы
| |
| |-
| |
| |style="color: black; background-color: silver;"|CHAIN_DETACH||style="color: black; background-color: silver;"|отсоединение||style="color: black; background-color: silver;"|фреймы
| |
| |-
| |
| |style="color: black; background-color: silver;"|CHAIN_ATTACH||style="color: black; background-color: silver;"|присоединение||style="color: black; background-color: silver;"|фреймы
| |
| |-
| |
| |style="color: black; background-color: silver;"|CHAIN_DETACHED_INPUT||style="color: black; background-color: silver;"|заезд в отсоединённый фрейм||style="color: black; background-color: silver;"|фреймы
| |
| |-
| |
| |style="color: black; background-color: silver;"|CHAIN_DETACHED_OUTPUT||style="color: black; background-color: silver;"|выезд из отсоединённого фрейма||style="color: black; background-color: silver;"|фреймы
| |
| |-
| |
| |style="color: black; background-color: silver;"|CHAIN_ATTACHED_OUTPUT||style="color: black; background-color: silver;"|выезд из присоединённого фрейма||style="color: black; background-color: silver;"|фреймы
| |
| |-
| |
| |style="color: black; background-color: silver;"|CHAIN_ATTACHED_INPUT||style="color: black; background-color: silver;"|заезд в присоединённый фрейм||style="color: black; background-color: silver;"|фреймы
| |
| |-
| |
| |style="color: black; background-color: silver;"|CHAIN_PRODUCTION||style="color: black; background-color: silver;"|производство||style="color: black; background-color: silver;"|заводы
| |
| |-
| |
| |style="color: black; background-color: silver;"|CHAIN_DIE||style="color: black; background-color: silver;"|смерть||style="color: black; background-color: silver;"|общие
| |
| |-
| |
| |style="color: black; background-color: silver;"|CHAIN_MOVE||style="color: black; background-color: silver;"|движение||style="color: black; background-color: silver;"|юниты
| |
| |-
| |
| |style="color: black; background-color: silver;"|CHAIN_STOP||style="color: black; background-color: silver;"|остановка||style="color: black; background-color: silver;"|юниты
| |
| |-
| |
| |CHAIN_TAKEOFF||взлёт||лётные
| |
| |-
| |
| |CHAIN_LANDING||посадка||лётные
| |
| |}
| |
| | |
| Значение и тип довольно условны, часть цепочек напрямую из кода не используется, идентификаторы в этом случае не принципиальны и нужны только для наглядности. <br />
| |
| Используемые из кода цепочки обозначены серым.
| |
| | |
| Список узлов:
| |
| {| class="wikitable"
| |
| !идентификатор узла!!значение
| |
| |-
| |
| |style="color: black; background-color: silver;"|CHAIN_NODE_SWITCHED_ON||style="color: black; background-color: silver;"|включено
| |
| |-
| |
| |style="color: black; background-color: silver;"|CHAIN_NODE_SWITCHED_OFF||style="color: black; background-color: silver;"|выключено
| |
| |-
| |
| |CHAIN_NODE_OPENED||открыто
| |
| |-
| |
| |CHAIN_NODE_CLOSED||закрыто
| |
| |-
| |
| |CHAIN_NODE_UPGRADE_START||начало апгрейда
| |
| |-
| |
| |CHAIN_NODE_BUILD[N]||этап строительства
| |
| |-
| |
| |CHAIN_NODE_CHARGED||заряжено
| |
| |-
| |
| |CHAIN_NODE_DISCHARGED||разряжено
| |
| |-
| |
| |CHAIN_NODE_FIRE||стрельба
| |
| |-
| |
| |style="color: black; background-color: silver;"|CHAIN_NODE_DETACHED||style="color: black; background-color: silver;"|отсоединено от энергосистемы
| |
| |-
| |
| |style="color: black; background-color: silver;"|CHAIN_NODE_ATTACHED||style="color: black; background-color: silver;"|присоединено к энергосистеме
| |
| |-
| |
| |style="color: black; background-color: silver;"|CHAIN_NODE_DETACHED_OPENED||style="color: black; background-color: silver;"|отсоединено от энергосистемы / открыто
| |
| |-
| |
| |style="color: black; background-color: silver;"|CHAIN_NODE_ATTACHED_OPENED||style="color: black; background-color: silver;"|присоединено к энергосистеме / открыто
| |
| |-
| |
| |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, “Описание анимации”. Цепочки там объединены в анимационные группы, для независимой анимации частей объекта.
| |
| | |
| {| class="wikitable"
| |
| !идентификатор группы!!значение
| |
| |-
| |
| |ANIMATION_GROUP_ROOT||корневая группа, для основной анимации
| |
| |-
| |
| |ANIMATION_GROUP_CITY||фрейм – анимация города
| |
| |-
| |
| |ANIMATION_GROUP_PILLAR||фрейм – анимация колонн
| |
| |-
| |
| |ANIMATION_GROUP_ANIMATE||фрейм – анимация для оживления в подключенном состоянии
| |
| |-
| |
| |ANIMATION_GROUP_LIGHTING||ядра – источник света на колонне
| |
| |-
| |
| |ANIMATION_GROUP_CHARGING||ядра – визуализация зарядки
| |
| |-
| |
| |ANIMATION_GROUP_FIRE||оружие – отдельная группа для визуализации стрельбы
| |
| |}
| |
| | |
| Редактируемые параметры цепочки:
| |
| {| class="wikitable"
| |
| !параметр!!значение
| |
| |-
| |
| |chainID||идентификатор цепочки
| |
| |-
| |
| |chainName||имя цепочки в 3D модели
| |
| |-
| |
| |phase||начальная фаза цепочки, [0, 1]. Для цепочек, проигрываемых в обратном направлении ставить 1, для обычных 0
| |
| |-
| |
| |period||длительность цепочки, мс. Для цепочек, проигрываемых в обратном направлении ставить отрицательную
| |
| |-
| |
| |begin||идентификатор начала цепочки
| |
| |-
| |
| |end||идентификатор конца цепочки
| |
| |-
| |
| |periodDeviation||разброс длительности, если ненулевой, то period += rnd(perionDeviation), phase = rnd(1)
| |
| |-
| |
| |enableReverse||если = 1, то при запросе обратной по отношению к текущей цепочки (т.е. у них одинаковые начало и конец, но разное напревление) переход на неё происходит сразу (сделано исключительно для корректного отображения зарядки у ядер)
| |
| |-
| |
| |counter||служебные данные
| |
| |-
| |
| |soundID||идентификатор звукового события, привязанного к цепочке
| |
| |}
| |
| ===Подключение готовой модели в игру===
| |
| | |
| Для интеграции модели в игру необходимо:
| |
| # Положить текстуру в каталог установки Периметра '''\resource\models\main\textures''';
| |
| # Дополнительно положить текстуру в каталог расы:
| |
| ##'''каталог установки Периметра \resource\models\main\Empire''' - для Империи
| |
| ##'''каталог установки Периметра \resource\models\main\Exodus''' - для Исхода
| |
| ##'''каталог установки Периметра \resource\models\main\Harkbackhood''' - для Возврата
| |
| # Поместить в '''каталог установки периметра\resource\models\main''' файлы *.m3d (модели) и *.l3d (набор логики).
| |
| Текстуры могут иметь любой размер. Можно добавлять свои, дополнительные текстуры. Текстур обычно две RGB текстура и текстура микрорельефа – Bump. Normal Mapping не поддерживается.
| |
| | |
| ===Требования к моделям===
| |
| | |
| При создании модели следует четко придерживаться иерархии сцены, с которой можно ознакомиться в прилагаемых примерах. Обязательно наличие объектов group* и logic* с аналогичной иерархией. В зданиях также должен быть объект _base_.
| |
| Иерархия строится на основе привязок (в 3Ds Max 5 на главной панели слева третий значок “Select and Link” https://pp.userapi.com/c840223/v840223067/1243f/2hEDihQmgiw.jpg) Dummy объектов и мешей модели. Правильную иерархию можно посмотреть не только в прилагаемых к Золотому Изданию игры исходных моделях, а так же в программе для просмотра моделей WinVG.exe.
| |
| Логика иерархии прописана в коде игры, поэтому следует четко придерживаться иерархии. Каждый элемент под названием Group, это Dummy в 3DsMax с тем же названием. Иерархия древовидная.
| |
| | |
| Ограничения по анимации - не поддерживается скелетная анимация и морфинг, можно только двигать, вращать, масштабировать объект целиком (масштабировать можно по всем или по одной оси).
| |
| | |
| Кроме этого, есть анимация прозрачности материала, координат материала и видимость-невидимость.
| |
| Можно использовать и анимировать источники света “Omni” и некоторые его параметры.
| |
| | |
| ===Спецификация формата моделей и логики===
| |
| | |
| (скачать m3dl3d.docx: [https://drive.google.com/open?id=0B6q_T8-tsA4TWFB2M0FORWtfWDQ drive] [https://www.dropbox.com/s/dkfx12joawx2bm4/m3dl3d.docx?dl=0 dropbox]) (автор - @!!ex)
| |
| | |
| === Статья по модификации моделей (автор GREM) ===
| |
| | |
| {Итак, я все же собрался ее написать. Только не судите строго, а если
| |
| чего неправильно - критикуйте.} <br />
| |
| | |
| Будем рассматривать пример Лимо, так как он мной лучше всего изучен. <br />
| |
| | |
| Допустим, что у вас уже есть какая-то модель, осталось только затекстурировать и вставить в игру. И тут я обнаружил первое ограничение - можно нанести карту только на весь объект (в 3д максовском смысле, то что в одном габаритном контейнере) сразу, на части наносить разные карты нельзя, хотя проекций можно использовать много. Всякие карты отражений и рельефности надо включать в один материал. Далее, те участки модели, которые будут изменять цвет в зависимомти от вашего выбора (в сражениях или сетевой игре цвет можно выбрать, я про него говорю) надо вынести в отдельные объектs. А вот как этот объект отделить от остальных, чтоб он действовал, я пока не знаю, но это связано с материалом. <br />
| |
| С текстурами у меня все... <br />
| |
| Теперь как организовать анимацию... <br />
| |
| Чтоб модель вообще работала, нужно насоздавать объектов dummy со следующими именами и привязаны друг к другу они должны быть так (тут же я укажу и привязку модели к логическим объектам, обозначение: <br />
| |
| | |
| ''' "обект 1" > "объект 2" > "объект 4"''' <br />
| |
| ''' :''' <br />
| |
| ''' > "объект 3"''' <br />
| |
| | |
| означает: объект 4 зависит от объекта 2, который зависит в свою очередь от объекта 1, обеъкт 3 также непосредственно зависит от объекта 1): <br />
| |
| logic center > logic bashnia > logic dulo > logic fire > logic targeting a > logic targeting b <br />
| |
| :
| |
| > logic bound {это простой бокс, охватывающий всю модель}
| |
| | |
| Теперь объекты, управляющие моделью: <br />
| |
| | |
| '''group center > group bashnia > group dulo > group fire > omni01 {источник света, который нужен для вспышки лазера}''' <br />
| |
| ''': : :''' <br />
| |
| ''': : > group targeting a > group targeting b''' <br />
| |
| ''': : :''' <br />
| |
| ''': : > [имя ствола]''' <br />
| |
| ''': :''' <br />
| |
| ''': > [имя башни лимо]''' <br />
| |
| ''':''' <br />
| |
| '''> [имя корпуса лимо]''' <br />
| |
| | |
| Рекомендую логические объекты с названиями, отличающимися только словами logic и group создавать в одних и тех же координатах. <br />
| |
| Надо отметить, что корпус, или башня, или ствол могут состоять из нескольких частей, тогда все части прицепляются либо друг к другу, либо "параллельно". <br />
| |
| Что бы всышка лазера была, я объект omni01 копировал просто из оригинальной модели, я ее вам тоже дам. <br />
| |
| И еще тонкость: чтоб ствол вращался в правильном направлении, group dulo надо повернуть на 180 в любую сторону. <br />
| |
| Анимацию лучше оставить какая была, для этого сохраняем оригинальные файлы limo.m3d и limo.l3d куда нибудь в безопасное место, а свою работу сохраняем повер старых (как сохранить вы должны знать, если у вас есть плагин meshexp.dle). Старая анимация отобразится при сохранении в диалоге экспорта.
| |
| | |
| === Статья по модификации моделей (Игромания) ===
| |
| [https://www.igromania.ru/article/4707/Igrovoe_redaktirovanie.html Статья Игромании]
| |
| | |
| ==Миры==
| |
| | |
| ===Полезное для создания миров===
| |
| | |
| Для создания маленького мира на троих, для ровного расположения игроков на карте, координаты следующие:<br/>
| |
| '''Player1:''' x1024, y292<br/>
| |
| '''Player2:''' x1657, y1389<br/>
| |
| '''Player3:''' x390, y1389
| |
| | |
| ===Официальный редактор карт – SurMap3===
| |
| [[File:SurMap3.jpg|400px|thumb|right|Редактор миров SurMap]]
| |
| | |
| Выберите мир для редактирования из папки Worlds через меню File -> Open World As... (для создания нового мира необходимо открыть пустой шаблон в папке 001_EMPTY 4x4 или 001_EMPTY 2x2).
| |
| | |
| Панель инструментов в правой части экрана позволяет изменять ландшафт (насыпать или копать), используя простейший набор цветов. Панель инструментов в левой верхней части экрана позволяет работать с дополнительными опциями:
| |
| | |
| http://i.imgur.com/6cgg6vX.jpg Перемещение по поверхности мира.
| |
| | |
| http://i.imgur.com/5Bvo8cD.jpg Приближение или удаление камеры.
| |
| | |
| http://i.imgur.com/sRWJZvR.jpg Тулзер (инструмент для насыпания\выкапывания. Параметры тулзера (радиус, форма и свойства кисти) настраиваются на вспомогательной панели внизу экрана.
| |
| | |
| http://i.imgur.com/AcJYLsX.jpg Установка на мир готовой фигуры (пирамида, параметры настраиваются на вспомогательной панели внизу экрана).
| |
| | |
| http://i.imgur.com/pcN9voH.jpg Установка на мир готовой фигуры (круг, параметры настраиваются на вспомогательной панели внизу экрана).
| |
| | |
| http://i.imgur.com/DbeX2D8.jpg Работа с зеро-слоем, внизу экрана необходимо установить радиус инструмента.
| |
| | |
| http://i.imgur.com/P3WvOur.jpg Установка модели из списка внизу экрана.
| |
| | |
| http://i.imgur.com/hIXVFKO.jpg Наложение карты высот (карту необходимо выбрать из списка внизу экрана, после корректного размещения на мире нажать кнопку Put для перевода карты в рельеф).
| |
| | |
| http://i.imgur.com/lobi9pr.jpg Инструмент размытия контуров.
| |
| | |
| http://i.imgur.com/aPIp8AP.jpg Гео-инструмент для работы с рельефом (параметры настраиваются в нижней части экрана).
| |
| | |
| http://i.imgur.com/ixHbFYR.jpg Инструмент позволяет выделить прямоугольный участок мира и работать только в выделенной области.
| |
| | |
| По завершению работы с миром необходимо сохранить изменения через команду File -> Open World As... (для записи нового мира необходимо предварительно создать пустой каталог в папке Worlds). После завершения подготовки ландшафта можно наложить текстуру поверхности на мир. Предварительно подготовленную текстуру в формате TGA необходимо положить в папку мира, сохранив файл с текстурой под названием AllDamMap.tga (в папку также необходимо скопировать служебный файл leveledSurfaceTexture.tga - текстуру зерослоя).
| |
| | |
| http://i.imgur.com/SBqbcXl.jpg Данный инструмент используется в редакторе миров для наложения текстуры на готовый мир.
| |
| | |
| Все новые миры необходимо прописывать в списке миров - файле RESOURCE\Worlds\worlds.prm, в котором первая строка содержит количество миров, все остальные содержат имя файла и название папки (относительный путь к папке с миром).
| |
| | |
| === Официальный редактор геотекстур – GeoTool ===
| |
| [[File:GeoTool.JPG|300px|thumb|right|Редактор геотекстур GeoTool]]
| |
| | |
| {| style="border: 1px solid #F00; border-left-width: 4px; background-color: rgba(255, 0, 0, 0.1);"
| |
| |Редактор '''не предназначен''' для редактирования текстуры поверхности (шкурки мира).
| |
| |}
| |
| {| style="border: 1px solid #F00; border-left-width: 4px; background-color: rgba(0, 150, 255, 0.2);"
| |
| |Внимание! В официальной поставке редактора не хватает ряда текстур в папке GeoTx. При запуске редактора возникают ошибки, где написан путь и название отсутствующей текстуры. Следует пройти по тому пути, продублировать близкий по названию файл и дать ему название из ошибки и перезапустить программу. Проделываем данное действие пока ошибки не пропадут.
| |
| |}
| |
| | |
| '''Геотектуры - текстуры недр спанжа, обножаемые ковшами при терроформировании.'''
| |
| Высота, на которой текстура поверхности сменяется на геотекстуру задается специальной картой глубины внутри output.vmp.
| |
| | |
| Для работы с геотекстурами на мире используется инструмент '''GeoTool.exe'''. <br />
| |
| После запуска вам предложат выбрать мир из списка (список формируется с помощью worlds.prm, поэтому все новые миры необходимо предварительно прописать в этом файле). <br />
| |
| Затем необходимо установить в верхней панели (включающей ряд слотов с установленным по умолчанию значением Empty) значения Clear, Mixer или Painter (список возможных значений выводится по правому клику). <br />
| |
| Чтобы загрузить текстуру - выбираем слот левым кликом, затем выбираем текстуру в списке слева и переносим пункт списка на экран, зажав левую клавишу.
| |
| | |
| Если вам требуется открыть карту, то слоты геотекстур окажутся пустыми, чтобы загрузить геотекстуры карты нужно нажать "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===
| |
| [[File:PMC__.jpg|400px|thumb|Right|Perimeter Map Compiler]]
| |
| | |
| Внимание, редактор представляет собой компилятор карт.
| |
| | |
| Требование к карте глубины, grayscale или RGB, 16bit предпочтительно tiff (tif не поддерживается).
| |
| | |
| Создаются [https://yadi.sk/d/qbZn7zIhv5V_MA компилятором карт] (создатель - 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), то предлагаю свою схему установки мира, которая проверена и отработана.
| |
| | |
| # Прежде всего делаем запасную копию файла ПапкаПериметра\Resource\Worlds\worlds.prm.
| |
| # Затем в PMC открываем файл проекта, жмем "Install Map", закрываем PMC.
| |
| # Удаляем модифицированный PMC'ом вышеупомянутый worlds.prm, ставим на его место свою копию.
| |
| # Открываем worlds.prm, плюсуем к числу в самом начале файла единицу, затем пишем английское имя мира в самом конце списка наименований, с сохранением всех отступов (делайте их пробелами или Tab'ами, не суть важно). Имя мира должно быть написано заглавными буквами.
| |
| # В каталоге ПапкаПериметра\Resource\Worlds\ переименовываем папку с добавленным вами миром (UNREGISTERED) в то имя, которое было указано в worlds.prm.
| |
| # В папке ПапкаПериметра\Resource\Multiplayer\ переименовываем файлы UNREGISTERED с расширениями .dat, .gmp и .spg в имена, аналогичные имени, указанному в worlds.prm.
| |
| # Открываем в этой же папке .spg-файл Блокнотом. Он может довольно-таки долго загружаться. Меняем в самом начале в строке "worldName = "UNREGISTERED";" слово UNREGISTERED на world.prm-овское имя.
| |
| # В том же файле, после блока с именами, цветами и фракциями игроков, меняем в строке "originalSaveName = "resource\\battle\\UNREGISTERED.spg";" слово UNREGISTERED на world.prm-овское имя.
| |
| # Проделываем пункт 6 еще раз, но уже в папке ПапкаПериметра\Resource\Battle\ .
| |
| # Проделываем пункты 7 и 8 с .spg-файлом в папке ПапкаПериметра\Resource\Battle\ .
| |
| # Повторяем пункты 9 и 10 с файлами в папке ПапкаПериметра\Resource\Battle\Survival\ .
| |
| # Открываем btdbEditor'ом файл ПапкаПериметра\Resource\LocData\Russian\Text\Texts.btdb. В самом конце найдите пункт MapNames.UNREGISTERED, выделите его, и нажмите пункт меню "Edit -> Remove Item".
| |
| # Нажимаем пункт меню "Edit -> Add Item". В поле "Value Name" введите world.prm-овское имя мира (вид должен быть такой: MapNames.WORLDNAME). В поле "Value Data" вводите русскоязычное имя мира (рекомендуется заглавными буквами). Нажимайте кнопку "ОК".
| |
| #. Сохраняем файл с текстом на место прежнего. Впрочем, никогда не будет лишним сделать запасную копию файла. Можете запускать Периметр и любоваться на свой добавленный мир.
| |
| | |
| P.S.: обратите внимание, у вас может не работать без дополнительной обработки режим выживания (то есть через ~10 секунд после запуска засчитывается автопобеда)! Также возможен такой глюк, что на добавленном вами мире абсолютно все будет черным и невидимым. Пока что способ решения найден только один: отключить в настройках графики самозатенение.
| |
| | |
| ==== P-Launcher ====
| |
| Синхронизация карт в формате "Кустов" созданных в редакторе сообщества (разработчитк - Don Reba).
| |
| Фактически, даже если бы проект был завершен, сайт rul-clan.ru все равно давно не работает, а значит и синхронизация карт с сервером тоже.
| |
| | |
| Статус: заброшен ¯\_(ツ)_/¯
| |
| | |
| ===Экстрактор текстур и карты глубины из игровых карт===
| |
| | |
| Разработанный @!!ex’ом конвертер VMPToTIFF ([https://drive.google.com/open?id=0B6q_T8-tsA4TSUZ3Q1RMX2F1SG8 drive]) предназначен исключительно для извлечения растровых текстур и карты глубины из игровых карт (World/NAME_MAP/_.vmp) для использования в своих целях.
| |
| Для того, чтобы извлечь текстуры из карты игры, нужно .VMP файл перетянуть на файл VMPToTIFF.exe. В папке с бинарником .VMP появятся текстуры и карта высоты данной игровой карты.
| |
|
| |
|
| ==Эффекты== | | ==Эффекты== |
| [[File:FX___.jpg|300px|thumb|Right|описание]] | | [[File:FX___.jpg|300px|thumb|Right|FX_tool]] |
| ===Официальный редактор EffectTool === | | ===Официальный редактор EffectTool === |
| Устаревший официальный редактор, который нигде не публиковался открыто. На смену ему пришел FX_tool. | | Устаревший официальный редактор, который нигде не публиковался открыто. На смену ему пришел FX_tool. |
Line 955: |
Line 55: |
| === Видео === | | === Видео === |
|
| |
|
| В формате RAD Game Video (.bik), открывается в RAD Video Tools и [https://mpc-hc.org MPC-HC]. | | В игре v1.00-1.03 используется формат RAD Game Video (.bik), открывается в RAD Video Tools и [https://mpc-hc.org MPC-HC]. |
| | |
| | В игре v3+ опционально используется видео в контейнере mkv с кодеком vp9. |