Journal Un générateur d'événements aléatoires

Posté par (page perso) . Licence CC by-sa
Tags : aucun
10
24
sept.
2013

Il y a quelques temps, j'utilisais un logiciel permettant de générer des noms au hasard, mais également de créer des extraits de textes en assemblant aléatoirement des portions à partir de tables existantes (quelques exemples vont suivre plus bas).

Il existe plusieurs logiciels similaires pour réaliser cela facilement, mais aucun n'est libre. Et les autres projets qui ont ce type de fonctionnalité (parfois libres), sont bien trop limités dans leur utilisation.

Dans les logiciels existants, deux sortent du lot : TableSmith et inspiration pad. C'est ce dernier que j'ai utilisé, mais TableSmith offre des possibilités similaires. Parmi les paramètres pouvant être définis, on trouve la création de listes dans lesquelles piocher, comme dit plus haut, mais aussi la fréquence de répétition de chaque ligne, ainsi que la probabilité qu'un ligne a d'apparaître

Par exemple, si on veut créer ce genre de trames de « conte » :

Il était une fois, une paysanne qui jouait à nethack. Mais Ozzy Osbourne, avec 4 de points de vie, lui rendait la vie difficile.

Il était une fois, une paysanne qui faisait du point de croix. Mais systemd, avec 6 de points de vie, lui rendait la vie difficile.

Il était une fois, une paysanne qui faisait du point de croix. Mais un kobold, avec 12 de points de vie, lui rendait la vie difficile.

Il était une fois, un roi qui revenait d'un pays merveilleux. Mais un dragon, avec 6 de points de vie, lui rendait la vie difficile.

Il était une fois, une magicienne qui jouait à nethack. Mais un dragon, avec 10 de points de vie, lui rendait la vie difficile.

On peut définir ce type de tables ainsi :

Table: Histoire
Il était une fois, [@heros] qui [@action]. Mais [@ennemi], avec {2d6} de points de vie, lui rendait la vie difficile.


Table: heros
une princesse
un roi
5:une paysanne
un laboureur
un aventurier
une magicienne

Table: action
revenait d'un pays merveilleux
achetait des pommes sur le marché
faisait du point de croix
jouait à nethack

Table: ennemi
le grand méchant loup
la vilaine sorcière
Ozzy Osbourne
un gnome
un dragon
systemd
un kobold
un troll de {1d3} mètres de haut qui sentait très mauvais

L'exemple ici est trivial, mais certains ont déjà réalisé des tables inspirées par des études de folkloristes, sur la typologie de contes populaires par exemple. On peut plus généralement avec ce type d'outil créer des monstres et trésors pour des jeux de rôle, mais chacun peut imaginer toutes les possibilités que cet outil apporte.

Où je voulais en venir, c'est qu'inspiration pad existe bien en version binaire pour Linux et FreeBSD (pour utiliser avec cgi), mais les sources ne sont pas disponibles, ce qui veut dire qu'il est difficile de le voir comme un outil pérenne, d'autant plus que cette version en ligne de commande n'est plus proposée dans la dernière sortie de ce logiciel.

S'il devait être réimplémenté, quelle serait la meilleure solution selon vous ? À mon sens le mieux serait de pouvoir l'utiliser depuis un navigateur, c'est à dire proposer un générateur soit en php, soit en javascript. Évidemment, ça pourrait fonctionner également en ruby, en python, mais php ou javascript sont disponibles quasiment partout.

Je vois surtout comme avantage pour le javascript que cela évite une surcharge de calcul côté serveur, que cela fonctionnera sans doute dans la plupart des navigateurs (sauf chez ceux qui le désactivent), et que cela peut même fonctionner en local (hors ligne) chez l'utilisateur lambda.

L'avantage pour le php c'est que l'on a peut-être plus de contrôle sur les données affichées, si par exemple ça doit repasser par un second filtre de calcul, et que cela fonctionnera à l'identique quel que soit le vecteur de navigation (parfois js ça plante sur certains navigateurs). De plus cela permet de scripter facilement en utilisant php en ligne de commande, si on veut malgré tout l'utiliser en local, chose que l'on ne peut faire en javascript à ma connaissance (enfin, peut-être que ça peut le faire quand même avec node.js).

Autre question qui se pose, quelle serait la syntaxe à réimplémenter ? En créer une nouvelle de toute pièce, en reprenant ce qui semble le meilleur de TableSmith et d'Inspiration Pad ? Ou bien choisir le langage de l'un ou l'autre ? Inspiration Pad semble le plus populaire, et sa syntaxe est claire et propre.

Est-ce que cela risquerait de poser des problèmes légaux vis à vis de la syntaxe ? Est-ce qu'il est permis de réimplémenter ainsi un logiciel existant (et lui faire concurrence, même s'il est gratuit) ? Vous allez sans doute me répondre que les brevets logiciels n'ont pas cours en europe ?

TableSmith a été réimplémenté en php, mais le code n'est pas disponible :
http://www.squid.org/rpg-random-generator

Il est utilisé en javascript ici : http://www.mythosa.net/rpggen/ (donc par le même auteur que TableSmith lui-même), mais l'outil qui a converti les tables en une sorte de javascript n'est pas non plus disponible.

Quoi qu'il en soit, les autres générateurs basés sur des outils que l'on connaît, ne sont pas très pratiques. Par exemple celui-ci semble intéressant, mais ce n'est qu'un outil en ligne basé sur mediawiki (et le code source des modifications n'est pas accessible non plus) : http://www.random-generator.com/index.php?title=Main_Page

Cet autre est en javascript, et ça semble être le plus proche de ce que je recherche :
http://www.path-o-logic.com/misc/RandListGen_adventurehooks_working.html

Néanmoins, le fait de devoir entrer les données dans un formulaire n'est pas très pratique. Ça serait vraiment beaucoup mieux de parser un texte externe.

Le but de ce journal, hormis d'avoir des retours éventuels d'expérience avec d'autres outils de ce style, serait de proposer un super sujet pour ceux qui recherchent un projet de programmation :)

Pour ceux que ça intéresse, voici une liste d'outils disponibles : http://www.squid.org/rpg-random-generator

  • # Hmm

    Posté par (page perso) . Évalué à 9.

    Kamoulox!

    • [^] # Re: Hmm

      Posté par . Évalué à 5.

      je relance de 2 et queue d'chouette !

      "Gentoo" is an ancient african word, meaning "Read the F*ckin' Manual". "Gentoo" also means "I am what I am because you all are freaky n3rdz"

      • [^] # Re: Hmm

        Posté par . Évalué à 5.

        Tu peux pas y'a Lennart en opposition en case 3.

  • # tableau + nombre aléatoire

    Posté par (page perso) . Évalué à 1.

    Je pense que ça ne doit pas être très dure à implémenter soit-même. Le plus long doit être de remplir une première fois les tableaux.

    En gros, tu fais un tableau de chaîne de caractère héros de taille nh, un tableau action de taille na, un tableau ennemi de taille ne…
    tu tires autant de nombre aléatoire que tu as de tableau suivant la loi de ton choix. La loi uniforme étant un bon choix.

    Et tu ressorts l'entrée du tableau correspondant à ton entrée.

    La réalité, c'est ce qui continue d'exister quand on cesse d'y croire - Philip K. Dick

  • # Outil vaguement similaire en Java

    Posté par . Évalué à 2. Dernière modification le 24/09/13 à 17:43.

    Je me souviens (il y a 6 ou 7 ans) d'un outil en Java permettant de dessiner des graphes pour générer du texte.

    Les graphes dessinés étaient composés :

    • de nœuds, contenant du texte
    • d'arcs orientés

    Le texte final était généré en parcourant aléatoirement un graphe et en concaténant les textes des nœuds. Le graphe en question devait évidemment comporter au moins un nœud initial et un nœud final.

    Ça vous évoque quelque chose ?

    • [^] # Re: Outil vaguement similaire en Java

      Posté par . Évalué à 3.

      Oui, c'est sur http://www.charabia.net/ ! Je m'en suis servi il y a quelques temps, c'était très pratique et les essais philosophiques sont à mourir de rire. L'outil est en GPL et c'est bien du Java.

      • [^] # Re: Outil vaguement similaire en Java

        Posté par . Évalué à 1.

        Merci. C'est bien cet outil.

        Je retrouve avec plaisir les leçons de vie de Janclod :

        You see, [il soupire] premièrement, on est tous capable de donner des informations à chacun puisque the final conclusion of the spirit is perfection Et tu as envie de le dire au monde entier, including yourself.

  • # more info?

    Posté par . Évalué à 2.

    "L'avantage pour le php c'est que l'on a peut-être plus de contrôle sur les données affichées, si par exemple ça doit repasser par un second filtre de calcul, et que cela fonctionnera à l'identique quel que soit le vecteur de navigation (parfois js ça plante sur certains navigateurs)."

    Un second filtre de calcul ? Donne un exemple, c'est trop abstrait. Javascript si tu te tiens à des choses basiques comme ça, t'auras peu d'emmerdes.

    "De plus cela permet de scripter facilement en utilisant php en ligne de commande, si on veut malgré tout l'utiliser en local, chose que l'on ne peut faire en javascript à ma connaissance (enfin, peut-être que ça peut le faire quand même avec node.js)."

    La manière la plus facile, crée un fichier .html en local où tu mets ton javascript (et html), et ouvre le .html dans ton navigateur, ça marche offline et sans installer de serveur php, sur la machine de n'importe quel barbare. Node.js c'est si tu veux faire du javascript exécuté côté serveur (comme du php du coup).

    "Autre question qui se pose, quelle serait la syntaxe à réimplémenter ? En créer une nouvelle de toute pièce, en reprenant ce qui semble le meilleur de TableSmith et d'Inspiration Pad ? Ou bien choisir le langage de l'un ou l'autre ? Inspiration Pad semble le plus populaire, et sa syntaxe est claire et propre."

    C'est toi qui les connait, c'est toi qui sait laquelle tu préfères, les fonctions qui existent ou au contraire qui manquent.

    "Est-ce que cela risquerait de poser des problèmes légaux vis à vis de la syntaxe ?"

    Non. Les brevets ne sont pas sur les formats, ils sont sur les algorithmes. Et ici "lire des lignes d'un fichier et en choisir au hasard selon des critères avancés", ça serait un peu difficile à faire passer comme brevet…

    "Néanmoins, le fait de devoir entrer les données dans un formulaire n'est pas très pratique. Ça serait vraiment beaucoup mieux de parser un texte externe."

    Pas compris. Tu veux pouvoir uploader le fichier de tables plutôt que le mettre dans un formulaire ?

    • [^] # Re: more info?

      Posté par (page perso) . Évalué à 2.

      oui ce n'était pas très clair. Par "second filtre" en php j'entendais passer le résultat dans une autre fonction, par exemple ça pourrait générer un nom aléatoirement, et l'utiliser dans un jeu de rôle en ligne en php, pour créer des personnages.

      et ouvre le .html dans ton navigateur,

      mais du coup ce n'est pas scriptable, ce qui est moins pratique.

      Tu veux pouvoir uploader le fichier de tables plutôt que le mettre dans un formulaire ?

      oui, pour la même raison que plus haut. Du coup le php me semblerait quand même le plus adapté.

      « I approve of any development that makes it more difficult for governments and criminals to monopolize the use of force. » Eric Raymond

      • [^] # Re: more info?

        Posté par . Évalué à 1.

        "par exemple ça pourrait générer un nom aléatoirement, et l'utiliser dans un jeu de rôle en ligne en php, pour créer des personnages."

        En fait, je ne vois pas ton truc dans sa globalité. Si tu veux faire un jeu de rôle en ligne en php, alors il est clair qu'un générateur d'histoire en javascript, ou en ruby ou quoi que ce soit ne conviendra pas.

        "mais du coup ce n'est pas scriptable, ce qui est moins pratique."

        Pas scriptable avec le shell et curl, tu veux dire ? Parce que le javascript, il sera bien exécuté par ton navigateur, même en local.
        C'est vraiment pas clair du tout ton besoin. Tu veux faire quoi exactement dans le cas présent ? Un jeu en ligne en PHP ? Un générateur dont tu te serviras pour compléter un jeu de rôle pas sur ordi ?

        "Du coup le php me semblerait quand même le plus adapté."

        Alors là je sais pas trop, mais je pense qu'on doit pouvoir s'arranger pour que le javascript lise le fichier qui est seléctionné dans une boite de dialogue.

        • [^] # Re: more info?

          Posté par (page perso) . Évalué à 2. Dernière modification le 25/09/13 à 12:02.

          En fait, je ne vois pas ton truc dans sa globalité.

          c'est pour faire un outil multi-usage, type oulipo ou pataphysique.

          Pas scriptable avec le shell et curl, tu veux dire ?

          oui, surtout en shell.

          Il y a cela qui fonctionne bien, pour créer des dictionnaires de mots :
          http://carnelian.game-host.org/~ken/wordsynth.html

          Mais c'est un peu trop spécifique pour cet usage.

          « I approve of any development that makes it more difficult for governments and criminals to monopolize the use of force. » Eric Raymond

  • # compatibilité et perenité

    Posté par (page perso) . Évalué à 0. Dernière modification le 25/09/13 à 01:08.

    À moins qu'il y ait des vraies limitations je voterais plutôt pour réutiliser une syntaxe existante. De préférence la plus populaire tant qu'elle n'est pas trop dégueulasse.

    La question du langage dans lequel implémenter le bousin me semble un faux problème. Tu prend n'importe quelle langage .NET et c'est réutilisable partout.

    pertinent adj. Approprié : qui se rapporte exactement à ce dont il est question.

  • # Sinon

    Posté par . Évalué à 1.

    c’est quoi le jdr auquel tu joues ?

    • [^] # Re: Sinon

      Posté par (page perso) . Évalué à 2.

      aucun pour le moment, c'était plus pour avoir un générateur universel d'idées

      « I approve of any development that makes it more difficult for governments and criminals to monopolize the use of force. » Eric Raymond

Suivre le flux des commentaires

Note : les commentaires appartiennent à ceux qui les ont postés. Nous n'en sommes pas responsables.