После недавнего выхода аудиообзора движка 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, всё отладить, но к сожалению, сам редактор недоступен для скринридеров.
Ссылка для скачивания демонстрационной игру и скрипты.
Ссылка:
https://ifhub.club/2020/05/04/tehnicheskie-zametki-o-gamebookformat.html