Основы скриптов объектов в локациях Fable: TLC

Автор статьи: Torionel

Скрипт объекта — это последовательность параметров, которые детально описывают объекты в игровых локациях. Скриптов в каждой локации столько же, сколько и объектов. Скрипты локаций находятся в файлах формата .tng и имеют начало, середину и конец. Важно не путать скрипты объектов в TNG-файлах со скриптами из файла script.bin (в последнем случае речь идёт о других скриптах — тех, которые описывают квесты).

Для начала вы должны узнать об особых идентификаторах — UID'ах. Здесь будет уместно привести цитату моддера LostInGeneral с портала fabletlcmod.com:

"Прежде всего, вы должны знать, что такое UID. Вы будете работать с ними немного. Взгляните на любой TNG-файл, и вы заметите, что у каждого скрипта есть UID. Деревни, маркеры, люди, здания, объекты, так называемые «святые участки» (holy sites) – у всего есть UID. Считайте, что это своего рода идентификационный номер каждого скрипта: он должен быть уникальным, ведь он действительно большой, этот UID, не так ли?".

Теперь пройдемся по самому скрипту, начиная с первой строки:

  • NewThing AICreature; — если стоит такое, значит, это скрипт NPC.
  • NewThing Marker; — с этого начинается скрипт маркера, которые нужны для самых разных целей;
  • NewThing Building; — какая-либо постройка, скажем, дом;
  • NewThing Village; — скрипт, формально "создающий" в какой-либо локации поселение;
  • NewThing Object; — естественно, что с этой строки начинается скрипт какого-либо объекта в более привычном смысле.

Если вы хотите создать объект в локации (заспаунить, spawn) не через визуальный редактор Chocolate Box (CBox), а по-старинке (вручную, через блокнот или Notepad++), то начать скрипт нужно с одной из этих строк — в соответствии с тем, что вы собираетесь создать.

Идём дальше.

  • Player 1; — самое большое значение, которое тут может быть, это 4. Пока это нам не нужно.
  • UID xxxxxxxxxxxxxxxxxxxx; — об этом уже говорилось выше.
  • DefinitionType "BLABLABLA_BLABLABLA"; — объект из раздела OBJECT или существо из раздела CREATURE в файле game.bin.

Пример с бочонком: DefinitionType "OBJECT_BARREL_BREAKABLE". Пример с ассассином: DefinitionType "CREATURE_ASSASSIN".

  • ScriptName NULL;
  • ScriptData "NULL"; — если вы не занимаетесь созданием в локации барда либо телохранителя, то оставьте в обеих строках NULL.
  • ThingGamePersistent TRUE;
  • ThingLevelPersistent TRUE; — объясним на примере торговца. Если значение в этих полях установлено в TRUE, то если вы купите у этого торговца вещь, она у него уже не появится после повторного входа в локацию. Если значением будет FALSE, то наоборот.

После этого идут строки с координатами объекта:

  • StartCTCPhysicsNavigator; — начало этого самого скрипта, если вы создаете в локации NPC;
  • если создаете объект, то должно быть StartCTCPhysicsStandard;
  • PositionX 19.37793; — эти строки определяют позицию вашего объекта или NPC в .tng-файле.
  • PositionY 32.345947;
  • PositionZ 100.210526;
  • RHSetForwardX -0.2222; — скорее всего, вам не придется изменять эту строку.
  • RHSetForwardY 0.974978; — обратите внимание, с помощью изменения значения в этой строке можно вертеть объект (уменьшение значения — по часовой стрелке, увеличение — соответственно, против часовой стрелки).
  • RHSetForwardZ 0.0; — не понадобится.
  • RHSetUpX -0.000583; — кажется, эти строчки отвечают за наклон объекта.
  • RHSetUpY -0.000133;
  • RHSetUpZ 0.999994;
  • EndCTCPhysicsNavigator; — конец скрипта расположения объекта.

Эта часть скрипта решает, сможем ли мы "выделять" объект в игре:

  • StartCTCTargeted; — начало данной части скрипта.
  • Targetable TRUE; — делает объект выделяемым. Всегда ставьте 'TRUE' для NPC.
  • EndCTCTargeted; — конец.
  • StartCTCTalk; — начало части скрипта NPC, отвечающей за разговор с какими-либо командами. Вам вряд-ли понадобится изменять это, когда вы будете писать скрипт для создания в локации своего NPC.
  • EndCTCTalk; — конец данной части скрипта.
  • StartCTCEditor; — начало части скрипта, которая имеет дело с редактором (чтобы лучше понять, о чем речь, загрузите в CBox любую локацию, выделите любой объект и нажмите на CTCEditor). Единственная команда, которую тут возможно вписать — должен ли объект находиться на одном месте. Вряд ли вам это понадобится.
  • EndCTCEditor; — конец данной части скрипта.
  • StartCTCVillageMember; — часть скрипта, которая определяет, к какой деревне принадлежит NPC.
  • VillageUID xxxxxxxxxxxxxxxxxxxx; — UID деревни. Если задано значение 0, NPC не является членом какой-либо деревни.
  • EndCTCVillageMember; — конец данной части скрипта.
  • StartCTCContainerRewardHero; — начало "контейнерного" скрипта. Если вы заспаунили что-либо, куда можно засунуть вещи, скажем, разбиваемый бочонок, то можно вставить туда эту часть скрипта. Она должна иметь следующий формат:

StartCTCContainerRewardHero;
ContainerContents[0] "OBJECT_BRIAR_ROSE_IMPOSTER_SWORD";
ContainerContents[1] "OBJECT_BRIAR_ROSE_SWORD";
EndCTCContainerRewardHero;

Важно: для сундуков такая схема не сработает.

  • EndCTCContainerRewardHero; — конец данной части скрипта.

Больше интересного о Fable — в нашем Telegram-канале и чате