Обсуждение Frotz 🧙

Вуаля, новый плагин! :tada: Хотя этот немного менее серьёзный. :video_game:

Discourse Frotz


Больше нет необходимости отмечать бота @ в каждом шаге. Как только игра начнётся, просто отвечайте ему.

Репозиторий Git: GitHub - merefield/discourse-frotz: A plugin that uses Frotz to give you an interactive fiction experience on your Discourse forum · GitHub

Что это такое

Это «бот», с помощью которого можно играть в интерактивную прозу, иначе говоря, классические текстовые квесты, на вашем форуме Discourse. По сути, это адаптер к стандартному и удивительному интерпретатору Z-машины под названием «frotz» по адресу David Griffith / frotz · GitLab

Как использовать

Настройка добавляет две игры; вы можете добавить больше в настройках.

Каждая запись содержит заголовок и имя файла истории.

Чтобы начать взаимодействие, нужно отметить бота, указанного в настройках, с помощью @. После этого достаточно ответить на его пост.

Чтобы перечислить доступные игры, сначала нужно упомянуть бота и спросить:

@mybot list games

Это покажет вам все доступные варианты.

Чтобы начать игру, введите:

start game x, заменив x на номер варианта.

Если вы захотите переключиться на другую игру, вы сможете это сделать; плагин сохраняет ваш прогресс после каждого хода, так что вы можете вернуться к первой истории в любое время. Плагин хранит сохранение для каждой истории для каждого пользователя, который в неё играет.

Чтобы продолжить существующую игру, введите:

continue game x, заменив x на номер варианта.

NB Полная пересборка уничтожит все файлы сохранений. Это необходимый компромисс.

Как играть в IF-игру?

Многие «Меты» выросли с такими играми. Для тех, кто менее знаком, ознакомьтесь с этой шпаргалкой: Play Some Interactive Fiction

Настройка

Создание пользователя-бота

(извините, автоматизация этого процесса есть в моём списке задач!)

В сессии SSH войдите в ваш контейнер и консоль Rails:

./launcher enter app
rails c

Затем выполните следующее:

u = User.create!(username: "Frotz", name: "FrotzBot", id:-5, email: "not@really.valid")
u.activate

Ваш новый бот станет доступен для настройки в интерфейсе. Перейдите к настройкам пользователя в интерфейсе через кнопку администратора и отключите всю электронную почту. Обновите аватар по своему вкусу.

Установка Discourse Frotz

Обновите ваш app.yml

Это немного более инвазивно, чем обычно для плагина.

Добавьте это в app.yml:

hooks:
  after_code:
    - exec:
        cd: $home
        cmd:
          - git clone https://gitlab.com/DavidGriffith/frotz
    - exec:
        cd: $home/frotz
        cmd:
          - make dfrotz
    - exec:
        cd: $home/frotz
        cmd:
          - mkdir savegames
    - exec:
        cd: $home/frotz
        cmd:
          - mkdir stories
    - exec:
        cd: $home/frotz/stories
        cmd:
          - wget -O zork1.z3 https://eblong.com/infocom/gamefiles/zork1-r119-s880429.z3
    - exec:
        cd: $home/frotz/stories
        cmd:
          - wget --no-check-certificate http://www.douglasadams.com/creations/hhgg.z3
    - exec:
        cd: $home/plugins
        cmd:
          - git clone https://github.com/merefield/discourse-frotz

перед другими записями плагинов.

Теперь вам также нужно добавить плагин Discourse BBCode!!

Пересоберите с помощью обычной команды ./launcher rebuild app

Теперь перейдите к настройкам плагина и выберите пользователя-бота, которого вы добавили ранее:

image

Истории

Вы заметите, что я включил несколько историй. Больше можно найти на https://ifdb.tads.org/.
Однако следите за лимитами запросов здесь! Получение слишком большого количества историй из одного источника может вызвать ошибку.

Также обратите внимание, что истории размещены на серверах, не защищённых HTTPS (увы-увы).

Если вы настаиваете на загрузке большего количества, добавьте их в app.yml. Вы также можете добавить их вручную из командной строки, но имейте в виду, что они будут удалены при следующей полной пересборке.

Включение FrotzBot для личных сообщений (требуется осторожность)

Позволяет пользователям играть в приватном режиме, но использование будет менее прозрачным. Если у вас достаточно мощный сервер, это может не стать проблемой. В любом случае учитывайте последствия для производительности. В качестве альтернативы поощряйте пользователей играть в специально отведённой категории.

image
по умолчанию: ВЫКЛ

Если он не включён, пользователь получит вежливое сообщение:

Ограничение FrotzBot по категориям

Вы можете ограничить бота одной (или списком) категорий, чтобы не заполнять другие разделы:

Горячие клавиши!

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

  • Shift-R — ответить боту

  • Ctrl-Enter — отправить следующий ход

Ограничения и соображения

Пока поддерживаются не все форматы историй и игры, и маловероятно, что они будут поддержаны в будущем. Многие игры не работают из-за особенностей их протоколов запросов и ответов. Поскольку мы взаимодействуем пост за постом, нам нужно просить Frotz сохранять состояние после каждого хода. Если один шаг игры не приводит к подсказке, на которой система может сохранить состояние (игнорируя подсказки «нажмите любую клавишу» или «ещё», которые должны обрабатываться), то история не будет работать. Например, в игре «Act of Murder» (отличная игра!) женщина у двери спрашивает, полицейский ли вы. К сожалению, это состояние игры, которое нельзя сохранить, поэтому оно не соответствует требованию, и я не вижу способа заставить это работать.

NB Режим списка рассылки с этим плагин — катастрофа, поэтому убедитесь, что вы не используете его, прежде чем пытаться применить этот плагин!

Можно сказать, что это немного расточительно для ресурсов форума, так как требуется как минимум два поста для каждого «хода». Очевидно, что для таких игр чаще уместнее использовать чат-интерфейс, а не форум, но вы можете возразить, что это можно использовать для создания гайдов по прохождению? :wink:

Для менее инвазивного решения рассмотрите: Turning a topic into interactive fiction ;)

Отзывы

Все отзывы приветствуются!

Благодарности

Этот плагин использует David Griffith / frotz · GitLab — интерпретатор Z-машины Frotz, который клонируется и собирается скриптом настройки.

Спасибо @P16 за возможность использовать фрагменты кода из закрытого чат-бота, над которым мы работали вместе.

45 лайков

Ух ты, снова привет!

Новые фишки

Включите FrotzBot для личных сообщений (на свой страх и риск! :wink: )

Это позволяет пользователям играть в приватном режиме, но использование станет менее прозрачным. Если у вас достаточно мощный сервер, это может не стать проблемой.

image
по умолчанию: ВЫКЛ

Если он не включён, пользователь получит вежливое сообщение:

Ограничьте список категорий или разрешите все:


по умолчанию: ВКЛ для всех категорий

10 лайков

Привет, Роберт! Спасибо, мне очень нравится этот плагин!
Я попробовал установить его в среде разработки (без Docker), и система попросила библиотеку ncursesw при сборке dfrotz. После её установки всё заработало. Будет ли то же самое в продакшн-среде с Docker?

1 лайк

Я протестировал в продакшене, и сборка в Docker (к моему удивлению) заработала сразу. Не стесняйтесь развернуть на продакшен-инстансе и дайте знать, как всё получится.

Рад, что вам понравилось!!

2 лайка

Для тех, кто, как и я, может потерять последние волосы из-за этого:

hhgg.z3,9,7,3
это значит:

  story_header_lines = 9
  story_load_lines = 7
  story_save_lines = 3

А теперь, как это адаптировать… :sweat_smile:, это приключение внутри приключения…!

1 лайк

Я сейчас работаю с разработчиком Frotz, чтобы посмотреть, сможем ли мы отказаться от этого. Это подход, который я перенёс из restful-Frotz, но он далёк от идеала :slight_smile:

1 лайк

Да! Нашёл!
kheper.z8,20,15,4 почти работает.
Для этой игры:

:smiley:

Это ничего страшного, но есть что-то странное:

) Отображение по строкам: ВЫКЛ
Режим сжатия: МАКС, скрыто 0 верхних строк

Отображается один раз функцией Pause() с кодом:

[Pause notNeeded;
@read_char 1 notNeeded;
rtrue;
];

1 лайк

Ха, да, в историях много особенностей и довольно большое разнообразие. Я не могу обещать поддержку всех.

Сейчас мой фокус на:

  1. упрощении кода
  2. повышении безопасности кода
  3. добавлении форматирования там, где это практично.

Пункт №3 оказывается удивительно сложным.

1 лайк

Я внес несколько улучшений в ветку функции:

Это избавляет от глупых настроек подавления, добавляет поддержку BBCode для форматирования и цвета, более эффективно использует возможности командной строки Dumb Frotz, устраняет необходимость записи в текстовый поток и закрывает уязвимость.

Для работы этой ветки требуется установленный официальный плагин BBCode.

Я всё ещё экспериментирую с ней. Если хотите, можете попробовать и вы.

Скорее всего, я объединю ветку после некоторых значимых тестов.

1 лайк

Требуется ли для плагина полный клон репозитория frotz, или достаточно наличия $home/frotz/dfrotz? Я бы предпочел скомпилировать его один раз и сохранять бинарный файл между пересборками.

Не совсем понятно, почему это должно вас волновать? Ресурсы, о которых мы говорим, сравнительно ничтожны (6 МБ для всего репозитория после сборки против гигабайтов для форума?). Скрипт клонирует весь репозиторий, а затем компилирует только dfrotz. Возможно, это немного расточительно, но, на мой взгляд, простота и повторяемость важнее. Я мог бы углубиться в детали и выполнить sparse clone, но это сделало бы скрипт сборки более сложным и менее надежным. Стоит ли оно того? Не стесняйтесь предложить оптимизацию. Всё это собирается внутри контейнера, поэтому будет очищено при очистке контейнера.

Я просто пытаюсь оптимизировать для своего небольшого сервера, а не прошу вас менять общую установку.

1 лайк

Это действительно крутой плагин! Это напоминает мне об «классической» компьютерной игре, созданной много лет назад (я забыл название).

3 лайка

Это отличное предложение для будущей оптимизации, если я смогу сделать его простым и надежным. Спасибо!

1 лайк

Да, есть много играбельных классических игр. Подробнее по ссылке в первом сообщении.

2 лайка

БОЛЬШОЕ обновление: :tada: :kiwi_fruit:

(над этим работали в фоновом режиме несколько месяцев с периодическими перерывами и в координации с командой Frotz).

Представляем поддержку полноцветного и моноширинного форматирования для историй

Это крупное обновление сопровождается рядом улучшений:

  • ДОБАВЛЕНО: поддержка цветного форматирования и моноширинного текста
  • УЛУЧШЕНО: упрощённые настройки — больше не требуется калибровка заголовка и подвала, достаточно указать только желаемое название и файл истории, ура!
  • УЛУЧШЕНО: использование Open3 gem для системных команд, что снижает риск злоупотреблений и уязвимостей.
  • УЛУЧШЕНО: внутреннее взаимодействие с командной строкой — больше не нужны файлы потоков, теперь система корректно обрабатывает запросы «ещё» или «нажмите любую клавишу».

Теперь требуется плагин Discourse BBCode!!

Для реализации этого потребовалось сотрудничество с разработчиком Frotz Дэвидом Гриффитсом и одним из самых активных участников сообщества, Borg323, который написал расширения BBCode в соответствии со стандартом BBCode для Discourse. Огромное большое спасибо им! Нам пришлось проявить немного креативности, чтобы заставить работать моноширинный текст, но решение получилось отличным!

Вот несколько примеров нового форматирования (я ещё не полностью протестировал эти истории, это просто примеры форматирования):

Обратите внимание на цветной компас здесь:

ИЗВЕСТНЫЕ ПРОБЛЕМЫ: Существует множество игр, которые не работают из-за особенностей их протоколов запроса и ответа. Если один шаг игры не приводит вас к подсказке, где можно сохранить прогресс (игнорируя запросы «нажмите любую клавишу» или «ещё», которые должны обрабатываться), то история не будет работать. Например, в игре Act of Murder (отличная игра!) женщина у двери спрашивает, полицейский ли вы. К сожалению, это состояние игры, в котором нельзя сохранить прогресс, поэтому оно не соответствует требованиям, и я не вижу способа заставить это работать.

Возможно, теперь есть игры, которые стали совместимы с Discourse Frotz, хотя раньше не были… пожалуйста, экспериментируйте, но учитывайте указанное выше ограничение!

Сообщайте мне о любых проблемах при настройке, и я при необходимости уточню инструкции.

8 лайков

Напоминаем, что вы можете использовать сочетания клавиш, чтобы улучшить взаимодействие с этим плагином:

  • Shift+R — ответить боту

  • Ctrl+Enter — отправить ваш следующий ход

(Стандартные сочетания клавиш «из коробки»).

5 лайков

Привет, Роберт!
Наконец-то у меня появилось время продолжить, и пока всё отлично — всё заработало сразу в рабочей среде :+1:

Странно, что frotz не может отвечать в личных сообщениях, если я не настрою это также в какой-либо категории :thinking:
Следующий шаг — играть :grinning_face_with_smiling_eyes:

1 лайк

Спасибо за отчет!

Я уже исправил это: FIX: behaviour of private messages playing permission setting · merefield/discourse-frotz@34b022e · GitHub

NTS: нужно добавить несколько модульных тестов!

2 лайка

Я попытался добавить :grin: в исходный текст,

это будет весело!

1 лайк