.gui в TA: Kingdoms — деревья виджетов с разделением пробелами
Источник: coreprime/kbot @ 0ab97bf · Редактировать на GitHub
TA: Kingdoms рисовала главное меню, лобби, игровой HUD и диалоговые окна по файлам
.gui— своеобразному формату описания виджетов с разделением пробельными символами. Хотя внешне он похож на собственные файлы интерфейса TA (тоже.gui), формат TA:K устроен иначе, и одни файлы нельзя подставить вместо других.
Note
Подкоманды для .gui из TA:K в kbot пока нет — формат описан здесь
для полноты и как основа для будущих инструментов. Эти файлы всё равно
можно изучать вручную: это обычный текст ASCII.
Что перед вами
Файл .gui — это плоская последовательность виджетов. Виджет-заголовок
файла объявляет общее число виджетов и глобальные метаданные (фоновое
изображение, горячие клавиши); каждый следующий виджет описывает один
элемент интерфейса.
Типичный виджет выглядит так:
4 1 ← widget type (4 = button), unused flag (always 1)
1 ← unused (always 1 except in headers)
2 196 79 95 20 1 0 0 0 ← bounds: type, X, Y, W, H, flags…
3 0 0 0 0 ← colour: type, R, G, B, A
1 0 0 ← unused (always 1 0 0)
1 14 hattfont11.gaf ← font: type, len, name
12 PlayerColor 2 12 ← control name + state count
3 ← number of gaf frames that follow
1 17 singlemachine.gaf 14 SingleMachine0 0 18 ← disabled frame
1 17 singlemachine.gaf 14 SingleMachine0 1 18 ← pressed frame
1 17 singlemachine.gaf 14 SingleMachine0 2 18 ← released frame
3 ← number of strings that follow
2 0 0 2 0 4 Exit 2 0 4 Exit 3 ← state strings (disabled, pressed, up)
1 7 Default
1 12 skirmish.wav ← sound played when activated
1 7 Default
2 0 16 Play the Machine ← tooltip / mouseover help
0 ← number of child widgets
Токены разделяются пробельными символами. Первый токен каждого виджета — идентификатор типа виджета; всё остальное идёт по схеме, своей для каждого типа.
Строки с префиксом длины
Главная хитрость формата: перед каждой строкой стоит её длина в символах — отдельным целочисленным токеном. Поэтому строки могут содержать пробелы, но парсер должен сначала прочитать длину.
1 14 MainScreen.gaf
^ ^^ ^^^^^^^^^^^^^^
│ │ │
│ │ └─ the string itself (14 characters)
│ └─ length
└─ string-flavour prefix (1 = literal string)
Пустая строка записывается как 1 0 0 (префикс, нулевая длина, а пустая
полезная нагрузка означает «пустую строку»). Повторяющиеся префиксы
1/0 очень легко разобрать неверно, если просто разбить файл на
токены по пробелам и начать считать, — читать нужно последовательно, в
порядке виджетов.
Important
Найти в .gui «третью кнопку» поиском grep толком не получится —
структура последовательная, а не адресуемая. Редакторы, написанные под
этот формат, — последовательные парсеры.
Типы виджетов
Встречающиеся идентификаторы типов виджетов:
| ID | Виджет | Примечания |
|---|---|---|
2 |
Заголовок / форма | Первый виджет в файле. Содержит фон, горячие клавиши, число потомков. |
4 |
Кнопка | 3 состояния (недоступна / нажата / отпущена). |
5 |
Флажок | Матрица из 5 состояний (недоступен, выкл.-нажат, вкл.-нажат, выкл.-отпущен, вкл.-отпущен). |
9 |
Рамка | Невидимый контейнер; группирует виджеты только визуально. |
12 |
Контейнер полосы прокрутки | Задаёт границы ползунка и его кнопок «больше/меньше». |
14 |
Кнопка полосы прокрутки (больше / меньше / ползунок) | За каждым 12 следуют три таких. |
15 |
Список | Заполняется во время выполнения; шаблоны почти пусты. |
17 |
Переключатель (radio button) | 3 состояния. |
18 |
Кнопка с несколькими состояниями | Кнопка, циклически перебирающая N состояний (например, выбор «сложности ИИ»). |
19 |
Изображение + подпись | Комбинированный виджет TA:K для статичной картинки с подписью. |
У каждого типа фиксированная схема токенов после идентификатора типа. Каноническая схема, восстановленная Dark Rain, сохранена в исходных материалах, сопровождающих этот репозиторий.
Общий вид виджета
[TYPE] 1
1
2 [X] [Y] [W] [H] 1 0 0 0
3 [colour: A R G B]
1 0 0
1 [font: length name]
[control-name length] [name] 2 3
[N]
1 [len] [gaf] [len] [seq] [frame] 9 × N
[N]
2 0 0 2 [string set] × N entries inline
1 7 Default
1 [len] [activate.wav]
1 7 Default
2 0 [help length] [help text]
[child-count]
В зависимости от типа виджета меняются величина [N] и устройство
набора строк; схемы в исходных материалах описывают каждый тип.
Коды выравнивания
Внутри набора строк:
| Код | Выравнивание |
|---|---|
0 |
По центру |
1 |
По левому краю |
2 |
По правому краю |
У виджета с одним состоянием вы увидите, например, 2 0 6 Player; у
кнопки с тремя состояниями — все три состояния подряд, например
2 0 0 2 0 6 Player 2 3 6 Play2r 3.
Разбор примера — главное меню
2 1
2 0 0 640 480 1 1 0 0
3 255 255 255 255
1 0 0
1 0
8 MainMenu 1 2
2
1 15 TitleScreen.tsf 7 JPGTest 0 9
1 15 TitleScreen.tsf 7 JPGTest 1 9
2
2 0 0 2 0 0 2
1 0
1 0
2 0 24 #Enter#Play#Esc#Previous
6
Читаем сверху вниз:
2 1— виджет типа 2 (заголовок), флаг 1.2 0 0 640 480 1 1 0 0— границы от начала координат, 640×480, плюс четыре токена флагов.3 255 255 255 255— запись цвета: непрозрачный белый.8 MainMenu 1 2— имя элемента управления «MainMenu» (8 символов) и1 2в конце.- Две записи
TitleScreen.tsf JPGTest— фоновое изображение (две одинаковые ссылки — движку нужны обе). 2 0 24 #Enter#Play#Esc#Previous— привязки клавиш:Enterсрабатывает на элементе с именем «Play»,Esc— на «Previous».6— форма содержит 6 дочерних виджетов, которые идут сразу за ней.
Фоны TSF и GAF
Виджет-заголовок поддерживает два источника фона:
.tsf— текстовая форма полноцветной анимации TA:K, которую загрузчик интерфейса читает напрямую. Для статичного меню это тонкая обёртка вокруг JPG (пример сTitleScreen.tsfоборачиваетTitleScreen.jpg), но тот же формат описывает и полноценные многокадровые анимации. Двоичное и текстовое устройство — в TAF / TSF; kbot разбирает обе формы и пересобирает их round-trip..gaf— стандартная анимация TA: Kingdoms. Заголовок ссылается на последовательность внутри GAF, и движок проигрывает её как фон.
В любом случае формат требует указать запись изображения дважды подряд; на самом деле отрисовывается только вторая копия. Это известная особенность.
Подводные камни
Warning
В файле .gui нет ни контрольной суммы, ни маркеров для
восстановления. Один неверно посчитанный токен числа потомков молча
сдвинет все последующие виджеты. Движок загрузит файл (структуру он не
проверяет), но виджеты окажутся не на своих местах, имена элементов
управления не найдутся, или появятся кнопки-призраки.
- Пробельные символы значимы только как разделители токенов. В файлах из комплекта Cavedog встречаются и пробелы, и табуляции; любую серию пробельных символов считайте одним разделителем.
- Число потомков должно быть точным. Виджет-рамка (тип 9), который
заканчивается на
4, забирает следующие четыре виджета верхнего уровня себе в потомки. Ошибитесь в числе — и остаток формы развалится. - Виджеты списков и полос прокрутки в файлах из комплекта игры — по сути пустые шаблоны: движок заполняет их во время выполнения из состояния скрипта. Заполнять их статически нет смысла.
- Для загрузки большинства изменённых файлов
.guiв TA:K нужен ключ командной строки-disablecavedogverification. Без него движок отвергает любой файл, хеш которого не совпадает со встроенным списком. - Одни файлы падают в распакованном виде, другие — в упакованном. Сам формат стабилен, но загрузчик движка ведёт себя по-разному для слоёв виртуальной файловой системы и для прямого доступа к каталогу. При моддинге проверяйте оба варианта.
См. также
- TAF / TSF — полноцветная анимация и её текстовая форма
.tsf, на которую заголовки.guiссылаются для фонов меню. - GAF — на анимации
.tafс палитрой ссылаются повсюду в файлах.gui. - PCX — соглашение о носителях палитр, которое TA:K использует
для
.tafс палитрой. - Заметки о трудностях форматов TA:K в исходных материалах этого репозитория — практические подводные камни при переносе ресурсов TA в TA:K.
- Глоссарий.