Discourse Frotz 🧙

¡Guau, un nuevo plugin! :tada: Este es un poco menos serio, aunque. :video_game:

Discourse Frotz


Ya no es necesario mencionar al bot (@) en cada paso. Una vez en juego, simplemente responde a él.

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

¿Qué es?

Es un ‘bot’ con el que puedes jugar a ficción interactiva, también conocida como juegos de aventuras de texto clásicos, en tu foro de Discourse. Es esencialmente un adaptador para el intérprete Z-machine estándar y asombroso llamado ‘frotz’ en David Griffith / frotz · GitLab

Cómo usarlo

La configuración agrega dos juegos; puedes agregar más en la configuración.

Cada entrada contiene un título y el nombre del archivo de la historia.

Para iniciar la interacción, necesitas mencionar al bot configurado en la configuración. Después de eso, responder a una de sus publicaciones es suficiente.

Para listar los juegos disponibles, primero debes mencionar al bot y preguntar:

@mybot list games

Esto te dará el rango de opciones.

Para iniciar un juego, escribe:

start game x sustituyendo x por el número de opción.

Si deseas cambiar a otro juego, puedes hacerlo; el plugin guarda tu progreso en cada movimiento, por lo que puedes volver a la primera historia en cualquier momento. El plugin mantiene una partida guardada para cada historia para cada usuario que la prueba.

Para continuar un juego existente, escribe:

continue game x sustituyendo x por el número de opción.

NB: Una reconstrucción completa destruirá todos los archivos de guardado. Este es un compromiso necesario.

¿Cómo juego un juego de FI?

Muchos “Meta” habrán crecido con estas cosas. Para aquellos menos familiarizados, consulta esta hoja de trucos: Play Some Interactive Fiction

Configuración

Crear el usuario del bot

(Disculpas, ¡automatizar esto está en mi lista!)

En una sesión ssh, ingresa a tu contenedor y a la consola de rails:

./launcher enter app
rails c

Luego haz esto:

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

Tu nuevo bot estará entonces disponible para configurarse en la interfaz de usuario. Ve a la configuración del usuario en la interfaz de usuario a través del botón de administrador y desactiva todas las notificaciones por correo electrónico. Actualiza el avatar a tu gusto.

Instalar Discourse Frotz

Actualizar tu app.yml

Esto es un poco más invasivo que un plugin habitual.

Agrega esto a 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 tus otras entradas de plugins.

Ahora también necesitas agregar el plugin Discourse BBCode!!

Reconstruye con el habitual ./launcher rebuild app

Ahora ve a la configuración del plugin y selecciona el usuario del bot que agregaste anteriormente:

image

Historias

Notarás que he incluido un par de historias. Puedes encontrar más en https://ifdb.tads.org/. Sin embargo, ¡cuidado con los límites de velocidad aquí! Obtener demasiadas historias del mismo lugar puede causar un error.

También ten en cuenta que las historias no están alojadas en servidores protegidos con HTTPS (tut tut).

Si insistes en cargar más, agréguelas a app.yml. También podrías agregarlas manualmente desde el símbolo del sistema, pero ten en cuenta que estas se borrarán en la próxima reconstrucción completa.

Habilitar FrotzBot para mensajes privados (se recomienda precaución)

Permite a los usuarios jugar en privado, pero el uso será menos transparente. Si tienes un servidor lo suficientemente grande, esto podría no ser un problema para ti. En cualquier caso, ten en cuenta las implicaciones para la capacidad. Como alternativa, anima a los usuarios a jugar en una Categoría designada.

image
por defecto: OFF

Si no está habilitado allí, el usuario recibirá un mensaje educado:

Restringir FrotzBot por Categoría

Puedes restringir el bot a una (lista de) Categoría para evitar llenar otras áreas:

¡Atajos de teclado!

Esto es realmente importante para mejorar la experiencia de ‘juego’. Y realmente solo necesitas recordar dos:

  • Shift-R para responder al bot

  • Ctrl-Enter para enviar tu siguiente movimiento

Limitaciones y consideraciones

No todos los formatos de historia y juegos son compatibles aún, ni es probable que lo sean. Hay muchos juegos que no funcionan debido a la naturaleza de sus protocolos de llamada y respuesta. Debido a la forma en que interactuamos publicación por publicación, tenemos que pedirle a Frotz que guarde el estado después de cada movimiento. Si un paso del juego no conduce a una indicación en la que el sistema pueda guardar (ignorando las indicaciones de “presiona cualquier tecla” o “Más” que deberían manejarse), entonces la historia no funcionará. Por ejemplo, en Act of Murder (¡gran juego!), la mujer en la puerta pregunta si eres un policía. Desafortunadamente, este es un estado del juego que no se puede guardar, por lo que falla este requisito y no veo una manera de hacer que funcione.

NB: El modo de lista de correo es un desastre con esto, así que asegúrate de que esto no sea algo que uses antes de intentar usar este plugin.

Podría argumentarse que es un poco derrochador de recursos del foro, ya que requiere al menos dos publicaciones por cada ‘movimiento’. Obviamente, a menudo es más apropiado jugar este tipo de juegos usando una interfaz de chat en lugar de un foro, pero podrías argumentar que esto podría usarse para crear guías de juego, ¿verdad? :wink:

Para una solución menos invasiva, considera: Turning a topic into interactive fiction ;)

Comentarios

¡Todos los comentarios son bienvenidos!

Créditos

Este plugin explota David Griffith / frotz · GitLab, el intérprete Z de Frotz, que es clonado y ‘compilado’ por el script de configuración.

Gracias a @P16 por permitirme usar extractos de código de un chatbot de código cerrado en el que trabajamos juntos.

45 Me gusta

¡Wooah, de vuelta!

Nuevas Funcionalidades

Habilitar FrotzBot para mensajes privados (¡bajo tu propio riesgo! ;))

Permite a los usuarios jugar en privado, pero el uso será menos transparente. Si tienes un servidor lo suficientemente grande, esto podría no ser un problema para ti.

image
por defecto: DESACTIVADO

Si no está habilitado, el usuario recibirá un mensaje amable:

Restringir a una lista de Categorías o permitir todas:


por defecto: ACTIVADO para todas las Categorías

10 Me gusta

¡Hola Robert! Gracias, ¡me encanta este plugin!
Lo intenté instalar en un entorno de desarrollo (sin Docker) y mi sistema solicitó la librería ncursesw al compilar dfrotz; tras instalarla, funcionó. ¿Será necesario hacer lo mismo en un entorno de producción con Docker?

1 me gusta

Lo probé en Producción y, para mi sorpresa, la compilación en Docker funcionó sin problemas. Siéntete libre de implementarlo en una instancia de Producción y dime cómo te va.

¡Me alegra que te guste!

2 Me gusta

Para aquellos como yo, que podrían perderse los últimos cabellos por esto:

hhgg.z3,9,7,3
eso es:

  story_header_lines = 9
  story_load_lines = 7
  story_save_lines = 3

y ahora, ¿cómo adaptarlo… :sweat_smile:, eso es una aventura dentro de una aventura…!

1 me gusta

Actualmente estoy trabajando con el mantenedor de Frotz para ver si podemos eliminar esas cosas. Es un enfoque que porté desde restful-Frotz, pero lejos de ser perfecto :slight_smile:

1 me gusta

¡Sí! ¡Lo encontré!
kheper.z8,20,15,4 funciona casi perfecto
para este:

:smiley:

no es nada, pero hay algo extraño

) Visualización por líneas DESACTIVADA
Modo de compresión MÁX, ocultando las 0 líneas superiores

se muestra una vez por Pause() con

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

1 me gusta

Jaja, sí, hay muchas peculiaridades y una variedad considerable en las historias. No puedo prometer dar soporte a todas.

Por ahora, mi enfoque está en:

  1. simplificar el código
  2. hacer el código más seguro
  3. agregar formato donde sea pragmático.

El punto #3 es sorprendentemente difícil.

1 me gusta

He realizado algunas mejoras en una rama de características:

Esto elimina las absurdas configuraciones de supresión, introduce la traducción a BBCode para admitir formato y color, aprovecha mejor las opciones de línea de comandos de Dumb Frotz, elimina la necesidad de escribir en un flujo de texto y corrige una vulnerabilidad.

Esta rama requiere que el plugin oficial de BBCode esté instalado.

Todavía estoy experimentando con ella. Siéntete libre de hacer lo mismo.

Probablemente la fusionaré después de algunas pruebas significativas.

1 me gusta

¿Necesita el plugin clonar todo el repositorio de frotz o solo que exista $home/frotz/dfrotz? Porque preferiría compilarlo una sola vez y guardar el binario entre reconstrucciones.

¿No estoy seguro de por qué te importaría? Los recursos de los que estamos hablando son comparativamente mínimos (6 MB para todo el repositorio después de make, frente a gigabytes para el foro). Clona todo el repositorio y luego solo compila dfrotz. Quizás eso sea un poco ineficiente, pero creo que la simplicidad y la repetibilidad son más importantes. Podría entrar en más detalles y realizar un clon parcial, pero eso haría que el script de compilación fuera más complejo y menos robusto. ¿Vale la pena? Siéntete libre de sugerir una optimización. Todo esto se está construyendo dentro del contenedor, por lo que se limpiará cada vez que se limpie el contenedor.

Solo estoy intentando optimizar para mi servidor pequeño, no pidiéndote que cambies la instalación general.

1 me gusta

¡Este es un complemento realmente genial! Me recuerda a un videojuego “clásico” creado hace años (no recuerdo el nombre).

3 Me gusta

¡Es una gran sugerencia para una futura optimización si puedo mantenerla simple y robusta. ¡Gracias!

1 me gusta

Sí, hay muchos clásicos jugables. Más en el enlace del OP.

2 Me gusta

¡Gran actualización: :tada: :kiwi_fruit:

(Esto ha requerido meses de trabajo ocasional en segundo plano y coordinación con el equipo de Frotz).

Presentamos formato de color completo y texto monoespaciado para las historias

Esta gran actualización viene con una serie de mejoras:

  • AÑADIDO soporte para formato de color y texto monoespaciado
  • MEJORADO: configuración simplificada; ya no requiere calibración de encabezado y pie de página, solo el título deseado y el archivo de la historia, ¡yupi!
  • MEJORADO: utiliza la gem Open3 para comandos del sistema, reduciendo el riesgo de abusos/vulnerabilidades.
  • MEJORADO: interacción interna con la línea de comandos para eliminar la necesidad de archivos de flujo; ahora maneja más solicitudes o las de “presiona cualquier tecla”.

¡AHORA REQUIERE el plugin Discourse BBCode!!

Esto requirió la colaboración del mantenedor de Frotz, David Griffiths, y de uno de los miembros muy activos de esa comunidad, Borg323, quien escribió las extensiones BBCode según el estándar BBCode de Discourse. ¡Muchísimas gracias a ambos! Tuvimos que ser un poco creativos para que funcionara el texto monoespaciado, ¡pero la solución es realmente genial!

Algunos ejemplos del nuevo formato (no he probado completamente estas historias, son solo ejemplos de formato)

y observa la brújula de colores aquí:

PROBLEMAS CONOCIDOS: Hay muchos juegos que no funcionan debido a la naturaleza de sus protocolos de llamada y respuesta. Si un paso del juego no te lleva a una indicación donde puedas guardar (ignorando las indicaciones de “presiona cualquier tecla” o “Más” que deberían manejarse), la historia no funcionará. Por ejemplo, en Act of Murder (¡gran juego!), la mujer en la puerta te pregunta si eres policía. Desafortunadamente, esto es un estado del juego que no se puede guardar, por lo que no cumple este requisito y no veo cómo podríamos hacerlo funcionar.

Probablemente haya juegos que ahora sean compatibles con Discourse Frotz y que antes no lo eran… ¡por favor, experimenta, pero ten en cuenta la limitación mencionada arriba!

Házmelo saber si tienes problemas para que esto funcione y afinaré las instrucciones según sea necesario.

8 Me gusta

Un recordatorio de que puedes usar atajos de teclado para mejorar tu experiencia con este plugin:

  • Shift-R para responder al bot

  • Ctrl-Enter para enviar tu siguiente movimiento

(Atajos de teclado estándar por defecto).

5 Me gusta

¡Hola Robert!
Finalmente tuve tiempo de avanzar. Hasta ahora todo bien, funcionó directamente en el entorno de producción :+1:

Curiosamente, Frotz no puede responder a mensajes privados a menos que también lo configure en alguna categoría :thinking:
Siguiente paso: ¡a jugar! :grinning_face_with_smiling_eyes:

1 me gusta

¡Gracias por el informe!

Ya lo he solucionado: FIX: behaviour of private messages playing permission setting · merefield/discourse-frotz@34b022e · GitHub

Nota: ¡hay que añadir algunas pruebas unitarias!

2 Me gusta

Intenté añadir :grin: en una fuente,

¡va a ser divertido!

1 me gusta