Discourse Frotz 🧙

Uau, um novo plugin! :tada: Este é um pouco menos sério, embora. :video_game:

Discourse Frotz


Não é mais necessário mencionar o bot @ a cada passo. Uma vez em jogo, basta responder a ele.

Repositório Git: GitHub - merefield/discourse-frotz: A plugin that uses Frotz to give you an interactive fiction experience on your Discourse forum · GitHub

O que é

É um ‘bot’ com o qual você pode jogar ficção interativa, também conhecida como jogos clássicos de aventura de texto, no seu fórum Discourse. Ele funciona essencialmente como um adaptador para o interpretador Z-machine padrão e incrível chamado ‘frotz’, disponível em David Griffith / frotz · GitLab

Como usar

A configuração adiciona dois jogos; você pode adicionar mais nas configurações.

Cada entrada contém um Título e o nome do arquivo da história.

Para iniciar a interação, você precisa mencionar o bot definido nas configurações. Depois disso, responder a uma postagem dele é suficiente.

Para listar os jogos disponíveis, primeiro você precisa mencionar o bot e perguntar:

@meubot listar jogos

Isso fornecerá a variedade de opções.

Para iniciar um jogo, digite:

iniciar jogo x substituindo x pelo número da opção.

Se quiser mudar para outro jogo, você pode fazê-lo; o plugin salva seu progresso a cada movimento, permitindo que você retorne à primeira história a qualquer momento. O plugin mantém um save para cada história para cada usuário que tenta.

Para continuar um jogo existente, digite:

continuar jogo x substituindo x pelo número da opção.

NB: Uma reconstrução completa destruirá todos os arquivos de save. Isso é um compromisso necessário.

Como jogar um jogo de IF?

Muitos “Membros” cresceram com essas coisas. Para aqueles menos familiarizados, confira este guia rápido: Play Some Interactive Fiction

Configuração

Criar o Usuário Bot

(desculpas, automatizar isso está na minha lista!)

Em uma sessão ssh, entre no seu container e no console rails:

./launcher enter app
rails c

Em seguida, faça o seguinte:

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

Seu novo bot estará então disponível para configuração na interface do usuário (UI). Vá para as configurações do usuário na UI através do botão de administrador e desative todas as notificações por e-mail. Atualize o avatar conforme seu gosto.

Instalar Discourse Frotz

Atualize seu app.yml

Isso é um pouco mais invasivo do que um plugin comum.

Adicione isso ao 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

antes de suas outras entradas de plugin.

Agora você também precisa adicionar o plugin Discourse BBCode!!

Reconstrua com o habitual ./launcher rebuild app

Agora vá para as configurações do plugin e selecione o usuário bot que você adicionou anteriormente:

image

Histórias

Você notará que incluí algumas histórias. Você pode encontrar mais em https://ifdb.tads.org/.
Mas, cuidado com os limites de taxa aqui! Obter muitas histórias do mesmo local pode causar um erro.

Observe também que as histórias não estão hospedadas em servidores protegidos por HTTPS (tut tut).

Se você insistir em carregar mais, adicione-as ao app.yml. Você também pode adicioná-las manualmente no prompt de comando, mas saiba que elas serão apagadas na próxima reconstrução completa.

Habilitar FrotzBot para mensagens privadas (caution advised)

Permite que os usuários joguem em particular, mas o uso será menos transparente. Se você tiver um servidor grande o suficiente, isso pode não ser um problema para você. De qualquer forma, esteja ciente das implicações para a capacidade. Como alternativa, incentive os usuários a jogar em uma Categoria designada.

image
padrão: DESATIVADO

Se (ele/ela) não estiver habilitado lá, o usuário receberá uma mensagem educada:

Restringir FrotzBot por Categoria

Você pode restringir o bot a uma (lista de) Categoria para evitar encher outras áreas:

Atalhos de teclado!

Isso é realmente importante para melhorar a experiência de ‘jogo’. E você realmente só precisa lembrar de dois:

  • Shift-R para responder ao bot

  • Ctrl-Enter para enviar sua próxima jogada

Limitações e considerações

Nem todos os formatos de história e jogos são suportados ainda, nem é provável que sejam. Existem muitos jogos que não funcionam devido à natureza de seus protocolos de chamada e resposta. Por causa da forma como interagimos postagem por postagem, temos que pedir ao Frotz para salvar o estado após cada movimento. Se uma etapa do jogo não levar a um prompt no qual o sistema possa salvar (ignorando “pressione qualquer tecla” ou prompts “Mais” que devem ser tratados), a história não funcionará. Por exemplo, em “Act of Murder” (ótimo jogo!), a senhora na porta pergunta se você é um policial. Infelizmente, isso é um estado do jogo que não pode ser salvo, falhando nesse requisito, e não vejo como faríamos isso funcionar.

NB: O modo de lista de e-mails é um desastre com isso, então certifique-se de que isso não é algo que você usa antes de tentar usar este plugin!

É, sem dúvida, um pouco desperdiçador de recursos do fórum, pois requer pelo menos duas postagens para cada ‘jogada’. Obviamente, muitas vezes é mais apropriado jogar esse tipo de jogo usando uma interface de chat, em vez de um fórum, mas você pode argumentar que isso poderia ser usado para criar Walkthroughs? :wink:

Para uma solução menos invasiva, considere: Turning a topic into interactive fiction ;)

Feedback

Todo feedback é bem-vindo!

Créditos

Este plugin explora David Griffith / frotz · GitLab, o Frotz Z-Interpreter, que é clonado e ‘compilado’ pelo script de configuração.

Obrigado a @P16 por me permitir usar trechos de código de um chatbot de código fechado no qual trabalhamos juntos.

45 curtidas

Wooah, back again!

New Feature-rettes

Enable FrotzBot for private messages (at your peril! :wink: )

Allows users to play in private, but usage will be less transparent. If you have a big enough server this may not be an issue for you.

image
default: OFF

If (s)he is not enabled there, the user will get a polite message:

Restrict to a list of Categories, or allow all:


default: ON for all Categories

10 curtidas

Olá, Robert! Obrigado, eu realmente gosto desse plugin!
Tentei instalá-lo no ambiente de desenvolvimento (sem Docker) e o sistema solicitou a biblioteca ncursesw ao compilar o dfrotz. Após instalá-la, funcionou. Será que será necessário o mesmo em um ambiente de produção com Docker?

1 curtida

Testei em Produção e a compilação no Docker (para minha surpresa) funcionou imediatamente. Sinta-se à vontade para implantar em uma instância de Produção e me diga como ficou.

Fico feliz que você tenha gostado!!

2 curtidas

Para aqueles como eu, que podem perder os últimos fios de cabelo com isso:

hhgg.z3,9,7,3
isso é:

  story_header_lines = 9
  story_load_lines = 7
  story_save_lines = 3

e agora, como adaptar isso… :sweat_smile:, isso é uma aventura dentro de uma aventura…!

1 curtida

Atualmente estou trabalhando com o mantenedor do Frotz para ver se podemos eliminar essas coisas. É uma abordagem que adaptei do restful-Frotz, mas longe de ser perfeita :slight_smile:

1 curtida

Sim! Encontrei!
kheper.z8,20,15,4 quase funciona
para este aqui:

:smiley:

não é nada, mas há algo estranho

) Exibição do tipo linha DESLIGADA
Modo de compressão MÁXIMO, ocultando as 0 linhas superiores

é exibido uma vez por Pause() com

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

1 curtida

Haha, sim, há muitas peculiaridades e uma variedade considerável nas histórias. Não posso prometer dar suporte a todas.

No momento, meu foco está em:

  1. simplificar o código
  2. tornar o código mais seguro
  3. adicionar formatação onde for prático.

O item #3 é surpreendentemente difícil.

1 curtida

Empurrei algumas melhorias para uma branch de recurso: GitHub - merefield/discourse-frotz at formatting_security_and_simplification · GitHub

Isso elimina as configurações de supressão ridículas, introduz a tradução para BBCode para suportar formatação e cores, aproveita melhor as opções de linha de comando do Dumb Frotz, elimina a necessidade de escrever em um fluxo de texto e corrige uma vulnerabilidade.

Esta branch requer que o plugin oficial BBCode esteja instalado.

Ainda estou experimentando com isso. Sinta-se à vontade para fazer o mesmo.

Provavelmente farei o merge após alguns testes significativos.

1 curtida

O plugin precisa de todo o repositório frotz clonado ou basta que $home/frotz/dfrotz exista? Porque eu preferiria compilar apenas uma vez e salvar o binário entre as recompilações.

Não sei por que você se importaria? Os recursos de que estamos falando são comparativamente pequenos (6 MB para todo o repositório após o make, versus gigabytes para o fórum?). Ele clona o repositório inteiro e depois apenas compila o dfrotz. Talvez isso seja um pouco desperdiçado, mas a simplicidade e a reprodutibilidade são mais importantes, na minha opinião. Poderia entrar em mais detalhes e realizar um clone parcial, mas isso tornaria o script de build mais complexo e menos robusto. Vale a pena? Sinta-se à vontade para sugerir uma otimização. Tudo isso é construído dentro do contêiner, então será limpo sempre que o contêiner for limpo.

Estou apenas tentando otimizar para o meu servidor pequeno, não pedindo que você altere a instalação geral.

1 curtida

Este é um plugin muito legal! Isso me lembra de um jogo de computador “clássico” que foi criado há anos (esqueci o nome).

3 curtidas

É uma ótima sugestão para uma otimização futura, desde que eu possa mantê-la simples e robusta. Obrigado!

1 curtida

Sim, há muitos clássicos jogáveis. Mais no link do OP.

2 curtidas

Grande atualização: :tada: :kiwi_fruit:

(Isso levou meses de trabalho esporádico em segundo plano e coordenação com a equipe Frotz).

Apresentando formatação de cores completa e texto monoespaçado para histórias

Esta grande atualização vem com várias melhorias:

  • ADICIONADO suporte a formatação de cores e texto monoespaçado
  • MELHORADO configurações simplificadas: não é mais necessário calibrar cabeçalho e rodapé, apenas o título desejado e o arquivo da história, uhuu!
  • MELHORADO usa o gem Open3 para comandos do sistema, reduzindo o risco de abusos/vulnerabilidades.
  • MELHORADO interação interna com a linha de comando para remover a necessidade de arquivos de fluxo, agora lida com prompts de mais/pressione qualquer tecla

Agora REQUER o plugin Discourse BBCode!!

Isso exigiu a colaboração do mantenedor do Frotz, David Griffiths, e de um dos membros muito ativos daquela comunidade, Borg323, que escreveu as extensões BBCode contra o padrão BBCode do Discourse. Muitos muitos agradecimentos a eles! Tivemos que ser um pouco criativos para fazer o texto monoespaçado funcionar, mas a solução é realmente ótima!

Alguns exemplos da nova formatação (ainda não testei completamente essas histórias, são apenas exemplos de formatação)

e observe a bússola colorida aqui:

PROBLEMAS CONHECIDOS: Existem muitos jogos que não funcionam devido à natureza de seus protocolos de chamada e resposta. Se uma etapa do jogo não leva você a um prompt no qual você pode salvar (ignorando os prompts de “pressione qualquer tecla” ou “Mais”, que devem ser tratados), então a história não funcionará. Por exemplo, em Act of Murder (ótimo jogo!), a senhora na porta pergunta se você é policial. Infelizmente, isso é um estado do jogo que não pode ser salvo, então falha nesse requisito e não vejo como faríamos isso funcionar.

Provavelmente existem jogos que agora são compatíveis com o Discourse Frotz e que não eram antes… por favor, experimentem, mas note a limitação acima!

Avise-me se tiver algum problema para fazer isso funcionar e refinarei as instruções conforme necessário.

8 curtidas

Lembrete de que você pode usar atalhos de teclado para melhorar sua experiência com este plugin:

  • Shift+R para responder ao bot

  • Ctrl+Enter para enviar sua próxima jogada

(Atalhos de teclado padrão).

5 curtidas

Oi, Robert!
Finalmente tive tempo de avançar. Até agora, tudo certo: funcionou direto em produção :+1:

Estranhamente, o frotz não consegue responder a mensagens privadas, a menos que eu também o configure em alguma categoria :thinking:
Próximo passo: jogar :grinning_face_with_smiling_eyes:

1 curtida

Obrigado pelo relatório!

Já corrigi isso: FIX: behaviour of private messages playing permission setting · merefield/discourse-frotz@34b022e · GitHub

NTS: preciso adicionar alguns testes unitários!

2 curtidas

Tentei adicionar :grin: na fonte,

vai ser divertido!

1 curtida