FG
Издание о Fable

Моддинг катсцен
Автор статьи: 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, выбрать нужную катсцену и открыть её. Далее будет доступно 3 режима (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-канале