Технические заметки о gamebookformat

После недавнего выхода аудиообзора движка gamebookformat на диаласе, думаю, стоит поделиться некоторыми практическими аспектами.
Главное предварительное требование — установленный python 2.7. К сожалению, проект заброшен, обновлялся последний раз 5 лет назад. Для такого случая я использовал портативную версию python, чтобы с третьим не было конфликтов в переменных среды.
У движка есть возможность экспорта в разные форматы. В статье я покажу примеры для rtf, html и txt. Мне кажется, существует только два перспективных варианта использования движка:
1. Для создания печатной (или PDF) версии книги-игры.
2. Для генерации переходов и параграфов с последующим импортом в редактор митрил.

Теперь немного разберём язык разметки (урезанный markdown):

title = Пушка на каменном мосту
starttext = Приключение начинается с параграфа 1.
hideintrotext = Спрятать введение
showintrotext = Показать введение
resumetext = Загрузить сохранённую игру

= Введение
Книга-игра "Пушка на каменном мосту"
Эта история произошла давным-давно в одном волшебном государстве...

* start
[b]Старый чердак[/b]
Порыв сквозняка из маленького окошка на чердаке чуть не задул свечу на покосившемся подоконнике. Юный Оливер, инстинктивно прикрыл её ладонью. Он стоял в сгорбившись у самодельного стола и переписывал аптечные рецепты. Перо цокнуло по деревяшке вместо чернильницы и мальчик сбавил темп. Под ноги случайно закатился кожаный мячик. Оливер сначала не подал виду, а потом отложил перо и улыбка засветилась на лице.
Финт - [[FirstFint]]
Пас - [[FirstPass]]
Сильный удар - [[FirstHigh]]

* FirstFint
Оливер сделал несколько обманок перед будущим соперником.
В начале идёт настройка названий ссылок. title и starttext — относятся ко всем форматам вывода, остальные актуальны только для html. Текст аннотации, отображаемой в начале книги выделяется символом '='. Теги параграфов начинаются со '*', ссылка для перехода — '[[]]', жирный шрифт — '[b]'. Чтобы преобразовать исходный файл, необходимо просто указать выходной формат. Пример batch-скрипта для конвертации в разные форматы:

set PYTHONPATH=D:\Projects\TextGames\WebTerp\gamebook\Pyportable-2.7.10rc1\
set PATH=%PYTHONPATH%;%PYTHONPATH%\Scripts;%PATH%
python ..\gamebookformat\formatgamebook.py -S troll.gamebook out\troll.html
python ..\gamebookformat\formatgamebook.py troll.gamebook out\troll.rtf
python ..\gamebookformat\formatgamebook.py troll.gamebook out\troll.txt
pause

Существуют специальные ключи для включения связанных скриптов, отключения перемешивания параграфов. Я использовал вывод в txt для быстрого просмотра и возможности вычитки, html для отладки переходов и rtf для редактирования в word с печатью в PDF.
Я не буду касаться других форматов, потому что:
  • Для twine получается xml-формат, не очень удобный для редактирования. Мне больше нравиться переводить из markdown-twine в gamebookformat;
  • C Latex плотно не работал;
  • Dot для графа истории может быть полезен, но надо еще и рендерить его отдельно.
  • json в качестве отладочного не пробовал.
Приведу примеры, как выглядят используемые мной форматы.
Скрин для html-формата:


Скрин RTF:


TXT:


Итак, для отображения html необходимо чтобы рядом были gamebookformat.css и gamebookformatplay.js. Выглядит не очень на страничке. Если заморочиться, то можно подправить шаблоны, чтобы выводилась страничка лучше, с переводами строк и улучшенным форматированием. Однако, как мне кажется, он удобен больше для отладки книги-игры, чем для полноценного игрового файла. Можно html скомпоновать в статическую страничку, но уже с помощью внешних инструментов, я использовал embed.py.
Как уже говорил, мне нравится возможность транслировать twine-код в gamebookformat, хотя потом вручную надо немного подшаманить (ну там вырезать разные мультимедиа-теги). Вот пример питон-скрипта для этого:

in_f = open('../src/main.twee', 'r') 
lines = in_f.readlines() 
  
#Simple process
for line in lines: 
   if len(line) > 2 and line[0:2] == '::':
      print('* '+line[2:].rstrip())
   elif len(line) > 2 and line[0:1] == '!':
      print('[b]'+line[1:].rstrip()+'[/b]')
   elif len(line) > 2 and line[0:2] == '<<':
      pass
   elif len(line) > 2 and line[0:4] == '[img':
      pass
   elif len(line) > 2 and line[0:2] == '[[':
      strWithLink = line.rstrip()[2:-2]
      pair = strWithLink.split('|')
      print(pair[0] + ' - [['+pair[1]+']]')
   else:
      print(line.rstrip())

Что могу сказать. Мне понравился движок для книг-игр своей минималистичностью, с возможностью не заморачиваться номерами параграфов, а работать с именованными ссылками. Потом, у него достаточно расширяемая архитектура с шаблонами, можно настроить под себя. К тому же я понял, что RTF можно немного доработать, добавить скрины, стили и получить неплохой подарочный вариант книги-игры! К сожалению, я не нашел гайдов для начинающих по верстке книг в word. Если знаете хороший ресурс по верстке, посоветуйте, пожалуйста в комментариях.
Я использовал txt-формат для вставки в митрил, но потом понял, что можно было вставлять и twine-код, с именованными ссылками. Вообще митрил позволяет сделать приличную PDF, всё отладить, но к сожалению, сам редактор недоступен для скринридеров.
Ссылка для скачивания демонстрационной игры и скрипты.

3 комментария

Oreolek
Ну что-то мало написал, gamebookformat всё ещё отличная штука. Особенно видно если есть хороший шаблон оформления (LaTeX или HTML), тогда получается именно полноценная игра, а не что-то выглядящее как отладка. Потому что он единственный даёт полноценные диаграммы (через dot), управление текстом через git и готовую игру на выходе, и это без глюкающего IDE.

Его надо гонять не на стандартных CYOA ссылках, а на крутых фичах. Например, там есть:
  • Перетасовка или частичная перетасовка параграфов с возможностью закрепления определённых (самая нужная фича)
  • Теги параграфов, при помощи которых можно генерировать несколько книг из одной (см. пример withoutdemo.gamebook, там отдельным параметром из книги генерится демоверсия на половину длины)
  • Теги форматов, когда какой-то параграф нужен только в определённом формате (например, он попадает в версию PDF, но пропускается в RTF)
  • Поддержка случайных переходов и кодовых слов
  • Встроенный инвентарь и счётчики, например, для денег
  • Встроенная проверка, до каких параграфов нельзя дойти (по ссылкам)

Но нет документации на всё это, поэтому статьи про GBF очень полезны. На мой взгляд, он всё ещё незаменим при работе над PDF и RTF. Для Twine есть twee, а на всём остальном проще работать сразу, чем потом копировать туда книгу на 300 параграфов

Я когда-то форкал для себя код, чтобы разрешить код на LaTeX прямо в игре. Это нестандартное поведение потому что GBF всё-таки про минимализм, а не код конкретных форматов прямо в параграфах, но TeX это самый продвинутый формат для PDF так что так.

Нашёл один из старых черновиков, вот тут можно посмотреть. Как скомпилю, выложу туда PDF.
Комментарий отредактирован: 4 мая 2020, 03:56
alastochkin
Александр, спасибо за комментарий. Я видел твой форк, но работ по нему не нашел или они есть? У тебя есть что-нибудь по красивой верстке книгр? Мне как технарю тяжело представить с чего начать дизайн страниц.
Oreolek
Вторая ссылка рассчитана как раз на мой форк, потому что там выводятся варианты выбора через TeX-пакет gamebook.

Я посоветую только верстать под формат A5 или делать широкие поля на A4. Без графики можно только поиграться с полями, шрифтами и цветами. Остальное в TeXе и так хорошо.