Моддинг катсцен в Fable: The Lost Chapters

Автор статьи: Torionel. Список команд и примеры переведены с fabletlcmod.com/wiki

Катсцена (англ. "cutscene", дословно — "вырезанная сцена" или "нарезанная сцена") — это скриптовой ролик, который демонстрируется игроку при наступлении определенных условий.

От простого видео, которые также могут использоваться в игре, катсцена отличается содержимым: оно не полностью статично, так как часть его (переменная часть катсцены) может меняться (подставляться) игрой в зависимости от сюжетных путей, которыми следует игрок.

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

Факты о катсценах в FTLC

  1. Катсцены можно пропускать, нажав Esc.
  2. В Fable: TLC графика катсцен полностью соответствует графике самой игры.
  3. Структурно катсцены являются составляющей файла script.bin и находятся в разделе CCutsceneDef.
  4. Катсцены активно задействуются в получаемых игроком заданиях (иногда и вне их).
  5. Катсцены взаимодействуют с содержимым локации (маркерами, персонажами, объектами), поэтому их редактирование тесно переплетается с моддингом локаций.
  6. Катсцены состоят из последовательности команд, написанных на чрезвычайно простом скриптовом языке.

Создание катсцен

Создавать собственные катсцены можно через Fable Explorer. Для этого нужно экспортировать любую имеющуюся катсцену в отдельный файл (образец), затем кликнуть правой кнопкой мыши по script.bin и выбрать пункт "Create New Entry".

В появившемся окне следует импортировать файл, задать название катсцены (это в Symbol Name; как правило, формат типа CS_NAME) и задать тип (Definition Type) CCutsceneDef (это один из немногих видов дефов, которые не находятся в game.bin).

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

Как правило, для редактирования катсцен Fable-моддеры используют CBox. Чтобы отредактировать катсцену, нужно открыть в CBox файл script.bin, раскрыть раздел CCutsceneDef, выбрать нужную катсцену и открыть ее. Далее будет доступно три режима (Mode 1, Mode 2, Mode 3) текстового редактирования, каждый из режимов отличается содержимым.

Также катсцены можно редактировать с помощью FE: разница в том, что здесь для редактирования катсцены нужно открыть в ней раздел Macro, SkipCond или SetupCond. Они соответствуют режимам редактирования CBox.

На самом же деле режимы редактирования соответствуют так называемым секциям катсцен. Катсцены делятся на секцию main (основная) и skip (то, что происходит, если во время катсцены нажать Esc; важно, что при этом содержимое локации должно стать таким же, как будто катсцену и не пропускали!). Назначение третьего режима (секции) неизвестно.

Язык катсцен

Катсцены в Fable TLC имеют ряд характерных команд, зная и комбинируя которые, можно отредактировать некоторые квесты до неузнаваемости.

Синтаксис команд

  1. Команды делятся на функции и классы (грубо говоря, класс — это некий объект, а функция описывает, что происходит с объектом или что он сам делает в катсцене, хотя деление довольно условное). И то, и другое еще имеет типы и виды.
  2. Каждая команда начинается с новой строки.
  3. Почти каждая команда имеет один или несколько параметров и соответствующие ему (им) значения (имя, число, или значение TRUE/FALSE). Значения бывают текстовыми (строчными, или string), булевыми (boolean, т.е. TRUE/FALSE), целочисленными (integer) и дробными (с плавающей точкой, известны как float). Можно также задавать имя собственное ("variable", т.е. "переменная"), к примеру, название объекта из game.bin и т.д. Всё как и всегда в программировании.
  4. Во всех катсценах переменная HERO класса Creature означает нашего персонажа.
  5. Регистр значений TRUE/FALSE не важен.
  6. Именные команды допускают группировку, т.е. перечисление нескольких имен собственных (например, названий маркеров) через запятую без пробелов после запятых.
  7. Именные команды допускают символ подчеркивания "_".
  8. Некоторые команды допускают двойную, тройную и т.д. группировку типа ИМЯ.НАЗВАНИЕКОМАНДЫ ЗНАЧЕНИЕ1, ЗНАЧЕНИЕ2...

Список функций

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

Функции с примечанием "Синхронная" выполняются после завершения катсцены. Параметры {внутри фигурных скобок} опциональны.

Функции типа Camera

DoCameraPreloading

Назначение неизвестно.

___

UseCamera

Location:variable{,unknown:integer?{,unknown:unknown{,unknown:unknown{,unknown:unknown}}}}

Пример: UseCamera SNAP

___

NoLoadUseCamera

Location:variable

Назначение неизвестно.

___

NoDialogCam

Unknown:boolean

Включает или выключает изменения камеры вместе с диалоговыми функциями персонажей.

___

CameraShake

Duration:float,Unknown:float

Тряска камеры. Продолжительность задаётся в секундах.

Примечание: синхронная.

___

WaitForCamera

Предположение: заставляет камеру двигаться к завершению катсцены.

___

WaitForMessageCamera

Unknown:variable

Назначение неизвестно.

Функции типа Thing

Функции этого типа описывают действия различных объектов (домов, сундуков, существ и т.д.).

SetGravityOnThing

Thing:variable,Unknown:boolean

___

PauseThing

Thing:variable,Pause:boolean

Ставит на паузу и убирает с паузы объекты, к примеру, анимацию, движение и т.д.

___

DrawThing

Thing:variable

___

TeleportThing

Unknown:unknown,Location:variable

___

PlayObjectAnim

Object:variable,Unknown:unknown{,Unknown:boolean}

Проигрывает связанную с объектом анимацию.

___

SetThingConscious

Thing:variable,Conscious:boolean

Делает объект "сознательным" ("conscious") или "несознательным" ("unconscious").

Пример: SetThingConscious FIGHTER,TRUE

___

FadeThingIn

Thing:variable

Постепенное появление объекта. Работает через жопу.

___

FadeThingOut

Thing:variable,Duration:float

Постепенное исчезание объекта.

Пример: FadeThingOut HERO,2

Функции типа Crowd

Название этого типа функций приблизительно переводится как "толпа" (самое близкое), "масса", "множество".

CrowdCreateMixed

ModelMale:enum,ModelFemale:enum,Marker:variable,Group:variable

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

Пример: CrowdCreateMixed CREATURE_KN_VILLAGER_MALE, CREATURE_KN_VILLAGER_FEMALE, MK_EXAMPLE, CROWD

___

CrowdAcquire

Group:variable

___

CrowdLookTo

Group:variable,Thing:variable

Заставляет толпу посмотреть в направлении объекта (Thing).

___

CrowdTeleport

Group:variable,Unknown:variable

Назначение неизвестно.

___

CrowdClearActions

Group:variable

Назначение неизвестно.

___

CrowdAnimate

Group:variable,Animation:enum,Unknown:float,Unknown:float,Unknown:float,Unknown:boolean,Unknown:boolean,Unknown:number

Анимирует толпу.

Пример: CrowdAnimate CROWD,SCRIPT_CHEER_3,0.5,0.05,0.05,TRUE,TRUE,2

___

CrowdCombatAnimate

Назначение неизвестно

Пример: CrowdCombatAnimate CROWDBANDITS, CS_WALK_BACKWARDS_01, 0.0,0.0,0.0,FALSE,TRUE,FALSE

___

CrowdRipplePosition

Group:variable,Unknown:unknown

Назначение неизвестно.

___

CrowdKill

Group:variable{,Unknown:float{,Unknown:boolean{Unknown:boolean}}}

Убивает толпу (всех персонажей, которые в неё входят), при этом остаётся добыча.

Пример: CrowdKill HHUndead,1.5,TRUE,TRUE

Функции типа Hero

Функции, сделанные специально для управления вашим персонажем.

GiveHero

Item:variable{,Unknown:unknown{,Unknown:unknown{,Unknown:boolean}}}

Даёт Герою вещь, название которой берётся из раздела OBJECT в game.bin.

Пример: GiveHero OBJECT_HERO_HAT_JOB_MASK,1,-1,TRUE

___

RemoveHeroClothes

Раздевает Героя (кроме труселей, конечно же).

___

GiveHeroHealth

Unknown:unknown

Задаёт здоровье Героя.

Пример: GiveHeroHealth MAX

___

GiveHeroMorality

Amount:number

Даёт Герою очки добра или зла (отрицательные числа — это зло, и наоборот).

___

HeroTattoo

Object:enum

Татуирует Героя определенной татуировкой.

Пример: HeroTattoo OBJECT_TATTOO_CARD_CHEST_01

___

HeroHair

Object:enum

Задает волосы и бороду Героя.

Примеры: HeroHair OBJECT_HERO_HAIR_YOUNG_01, HeroHair OBJECT_HERO_BEARD_TRAMP_01

___

PutInHeroHands

Object:enum

Дает что-нибудь в руки Герою. Значение NULL задает пустые руки. Можно всё, кроме оружия (см. ниже).

Пример: PutInHeroHands NULL

Cм. также сходную команду Creature.HoldInHand (ниже).

___

SetHeroWeapon

Weapon:variable

Задает оружие Героя, при этом оно будет висеть за спиной, Герой не будет брать его в руки.

___

RemoveHeroWeapons

Unknown:boolean

Назначение неизвестно.

___

TakeObjectFromHero

Object:variable

Взять объект из инвентаря Героя.

Пример: TakeObjectFromHero OBJECT_TROPHY_JOB_MASK_01

___

HeroWear

Object:enum

Надеть на Героя головной убор. Чтобы снять головной убор, задайте OBJECT_HERO_NO_HAT.

Пример: HeroWear OBJECT_HERO_HAT_JOB_MASK

___

GiveGold

Amount:integer

Дает Герою золото.

___

Функции типа Miscellaneous ("Прочее")

Здесь собраны все оставшиеся функции.

___

AnimationPause

Pause:boolean

Назначение неизвестно.

___

AnimationPhysics

On:boolean

Назначение неизвестно.

___

AskQuestion

Text:string

Задает вопрос с вариантами ответа "да/нет" (неизвестно, из каких именно ответов мы выбираем).

Пример: AskQuestion TEXT_QST_B04_GM_QUESTION_LEAVING_TO_GRAVEYARD

Примечание: синхронная.

___

AToSkip

Disabled:boolean

Если TRUE, запрещает возможность пропустить катсцену. Не забудьте отменить этот параметр в конце катсцены.

___

Create

Object:enum,Location:variable,Var:variable{,Unknown:boolean{,Unknown:variable}}

Создает новый объект для использования в катсцене. Название объекта берется из раздела OBJECT в game.bin, локация означает стартовый маркер локации берётся из TNG-файла, а параметр Var задаёт имя объекта, который будет в катсцене. Фактически это еще один способ спауна объектов (первый изучался в главе про моддинг локаций).

Для удаления объекта используйте функцию Remove (см. ниже).

___

Remove

Object:variable

Удаляет объект (существо, дом, стул и т.д.).

___

PlayMysic

Music:enum{,Unknown:boolean}

Начинается проигрывать музыку (задавайте в Music номер аудиофайла). Использование MUSIC_SET_NULL прекращает воспроизведение.

Cм. также сходные команды: MuteSounds, EnableSounds.

___

FadeIn

{Duration:float{,Unknown:float}}

Включает постепенное появление изображения, продолжительность задается в секундах.

___

FadeOut

{Duration:float{,Unknown:float}}

Включает постепенное исчезание изображения, продолжительность задается в секундах.

___

StayFadedOut

Назначение неизвестно.

___

GamePause

Duration:float

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

___

ScriptFrame

Unknown:boolean

Назначение неизвестно.

___

DoScriptFrame

Count:integer

(Прим. глав. ред.: тут не нашли точного перевода.) Do script frames aka. proceed a number frames. Count specifies the frame count.

___

MuteSounds

Unknown:boolean

Назначение неизвестно.

___

EnableSounds

Unknown:boolean

Вы предположите, что эта команда включает или выключает звуки? А вот и нет)

___

PlaySound

Target:enum,Sound:variable,Unknown:unknown

Предположение: Target определяет расположение звука на мировой карте. Может принимать значение NULL.

Пример: PlaySound HERO,$SOUND,CRITERIA

___

PutUpYourSwords

{Unknown:boolean}

Заставляет персонажей убрать оружие (как минимум — у самого Героя).

___

RemoveExtras

{Remove:boolean{,Location:variable{,Unknown:variable{,Unknown:unknown}}}}

В качества Extras здесь персонажи. Команда перемещает их. Remove удаляет их или заставлять вернуться, Location — место, куда движок должен их поместить. Вот одни из возмозных значений: LIMBO, RETURN.

___

WaitActiceDialog

Ждет завершения текущего диалога.

Примечание: синхронная.

___

SetChestOpen

Chest:variable,Open:boolean

Открывает или закрывает сундуки. В Chest указывается название сундука в ScriptName.

___

SetDoorOpen

Door:variable,Open:boolean

Открывает или закрывает двери, ворота и т.д. В Door указывается название сундука в ScriptName.

Пример: SetDoorOpen DragonGate

___

StartTimeCode

Назначение неизвестно.

___

KeepEntityMap

{Unknown:boolean}

Назначение неизвестно.

___

Get

Unknown:variable,Unknown:variable

Задать переменную для глобального объекта.

Пример: Get Dragon,DRAGON

___

RegisterActor

Object:variable

Предположение: регистрирует в катсцене глобальный объект.

___

EnableBlackScreenSubtitles

Предположение: показывает текст, даже на черном экране.

___

CreateEffect

Effect:enum,Target:variable,Var:variable{,Unknown:float{,Unknown:boolean}}

Присваивает объекту эффект. Effect — название эффекта, Target — объект/вещи, существо, которому требуется эффект, Var — переменная, использующаяся для эффекта из скрипта.

Пример: CreateEffect DG_SOUL_SWIRL,HERO

Cм. также сходную команду: RemoveEffect

___

DummyEffect

Unknown:enum,Object:variable,Unknown:unknown,Var:variable,Unknown:boolean

Object — объект, которому требуется эффект. Var — переменная, отсылающая к эффекту из скрипта.

Пример: DummyEffect JACK_OF_BLADES_MASK_FINAL,HERO,WEAPON_FOCUS_01,MASKGLOW,TRUE

___

RemoveEffect

Effect:variable

Удаляет эффект. Effect — перменная, использованная ранее в функции CreateEffect.

___

1 2

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