Salut, et BONNE ANNÉE !!! Plein de bonheur, la santé, et la pêpêche pour ce forum de qualité qu’est IFiction-FR >
Adonc. MAVH-II, la revanche du mammifère ongulé artiodactyle et ruminant, autrement dit de la Giraffa camelopardalis, girafe bavarde du nord.
MAVH 1ère mouture étant arrivé à un stade de maturation (juste) suffisant pour être dégusté, il est temps pour moi de migrer vers un nouvel objectif. Voici mon constat. En leur temps, les Livres Dont Vous Êtes Le Héros ont créé une vraie culture, avec ses us et coutumes, dont la plus fameuse est la célèbre proposition « Rendez-vous au 42 ». Je pense qu’il est temps de créer un nouveau mètre étalon. À l’ère du numérique, miser sur un format XML me semble raisonnable. C’est pourquoi je vous propose un brouillon de schéma XML de livre interactif numérique :
[code]
Zero J
Mon premier Défi Fantastique
Cybermédiéval
0
GPL2
2016-12-31
1.02
Super bouquin dont vous êtes le héros !
Minotaure amoureux ok
<menu>
<action on="Vérifier le contenu de votre sac à dos">
montrerInventaire();
</action>
<action on="Soigner vos blessures">
seSoigner();
</action>
<action on="Utiliser la Clef d'Or">
utiliserCleOr();
</action>
</menu>
<page id="Prime">
<text>
Vous êtes <v>playername</v>. Bienvenue. <r>Allez au menu !</r>
</text>
<react on="Allez au menu !">
goto("Menu principal");
</react>
</page>
<page id="Menu principal">
<text>
<h1>Menu principal</h1>
<r>Faire ceci...</r>
<r>Faire cela...</r>
<r>Retour</r>
</text>
<react on="Faire ceci...">
appendText("Je fais ceci...");
</react>
<react on="Faire cela...">
goto("Faire cela");
</react>
<react on="Retour">
goto("Prime");
</react>
</page>
<page id="Faire cela">
<text>
Autre chose.
</text>
</page>
</book>
[/code]Largement self-expliquant, je crois, si vous faites marcher votre imagination. Ça représente assez bien ce que je suis sur le point de faire, et je serais bien sûr très heureux de recevoir vos suggestions, remarques, …etc.
Est-ce que tu connais le traité de Babel ? C’est un standard qui a été créé en 2006 pour unifier les données bibliographiques de FI. La première partie (le ) pourrait en tirer partie.
Sinon, es-tu sûr que ça n’a pas été déjà fait ? Ce serait bête de réinventer la roue. Sinon ça peut être une bonne idée.
Non je ne connaissais pas le Traité de Babel, merci ! Du coup on peut ajouter quelques informations supplémentaires dans le head :
<!DOCTYPE MULTIPATHFICTION>
<mpfiction>
<head>
<title>Mon premier Défi Fantastique</title>
<genre>Cybermédiéval</genre>
<series>Renard Solitaire</series>
<seriesnumber>1</seriesnumber>
<author>Zero J</author>
<contact>
<author_email>lerenard@gmail.com</author_email>
<url>http://renard.solitaire.free.fr</url>
</contact>
<language>French</language>
<price>0</price>
<license>GPL2</license>
<publish_date>2016-12-31</publish_date>
<version>1.02</version>
<description>
Super bouquin dont vous êtes le héros !
</description>
<changelog>
<change version="1.01" date="2016-12-31">
Minotaure amoureux ok
</change>
</changelog>
</head>
<book>
<menu>
<action on="Vérifier le contenu de votre sac à dos">
montrerInventaire();
</action>
<action on="Soigner vos blessures">
seSoigner();
</action>
<action on="Utiliser la Clef d'Or">
utiliserCleOr();
</action>
</menu>
<page id="Prime">
<text>
Vous êtes <v>playername</v>. Bienvenue. <r>Allez au menu !</r>
</text>
<react on="Allez au menu !">
goto("Menu principal");
</react>
</page>
<page id="Menu principal">
<text>
<h1>Menu principal</h1>
<r>Faire ceci...</r>
<r>Faire cela...</r>
<r>Retour</r>
</text>
<react on="Faire ceci...">
appendText("Je fais ceci...");
</react>
<react on="Faire cela...">
goto("Faire cela");
</react>
<react on="Retour">
goto("Prime");
</react>
</page>
<page id="Faire cela">
<text>
Autre chose.
</text>
</page>
</book>
</mpfiction>
J’ai aussi remplacé « ifiction » par « mpfiction », parce que je me suis rendu compte que ifiction était plus large, et englobait aussi les jeux comme Orphée par exemple, où l’on tape les commandes au clavier. MultipathFiction est plus proche de ce que j’ai en tête : une simple fiction à embranchements multiples.
Il y a déjà un format existant : QML. Mais il me semble moins puissant puisqu’il ne donne pas accès au Javascript du navigateur, et moins élégant, avec ses grosses balises en plein milieu du texte. Ca mélange la vue et le contrôle, je trouve pas ça propre. En fait le plus gros défaut de QML c’est surtout d’exister déjà : c’est beaucoup moins drôle de l’utiliser que de fabriquer soit même un tel langage. Il y en a peut-être d’autres.
bravo pour ton travail et ton enthousiasme. Je ne suis pas fan du xml (même si c’est moins pire que du binaire), à la rigueur ça peut passer s’il y a un IDE en face qui en tire partie et évite de se taper toutes les balises à la main. À mon avis, pour ce que tu vises, un fichier texte simple serait plus adapté, et plus lisible pour tes utilisateurs, même avec une petite syntaxe minimale
Alors je suis maintenant sur la version MAVH .IV ! (oui le 3 était un navet, même pas sorti en salle)
Pour l’instant j’ai fait un travail sur l’interface (visible sur http://mavh.free.fr). L’idée c’est d’avoir des « espaces » qu’on peut disposer librement sur une surface. On peut imaginer par exemple un espace pour l’histoire, un autre pour l’équipement, …etc. Un peu comme une feuille d’aventure si vous voulez. A terme il y aura plusieurs surfaces, et le joueur pourra passer de l’une à l’autre d’un simple clic.
Après, l’idée c’est d’en faire une petite plateforme multijoueur peer2peer. Vous connaissez le principe du MOBA : League of Legends, DOTA… J’imagine un MOBA textuel ! Une arène dans laquelle des joueurs peuvent s’affronter en ligne, dans un jeu au tour par tour. Avec une petite goutte de jeux de cartes façon Magic The Gathering. Mais le tout dans un environnement textuel à liens cliquables, comme un Livre Dont Vous Etes Le Héros, mais multijoueur.
Bref. Ca bosse !
Hop, un brouillon de code :
Modèle d'espace :
# Titre | Phrase d'appel
Corps de texte
@ Déclencheur > Action
& Menu
Modèle de menu :
€ Intitulé
& Sous-menu
@ Déclencheur > Action
Définition de routine :
% Phrase d'appel
Corps de proccédure
Actions :
a est b.
a augmente de b.
a diminue de b.
a fait partie de b.
a ne fait plus partie de b.
on peut dire que a.
on ne peut plus dire que a.
si a : b.
si a : b ; sinon : c.
a n'existe plus.
a correspond à b.
a ne correspond plus à b.
dans a s'ajoute b.
il y a une surface a.
il n'y a plus de surface a.
l'espace a est visible dans la surface b.
l'espace a n'est visible que dans la surface b.
l'espace a est invisible.
l'espace a est visible dans toutes les surfaces.
Conditions :
a est b
a n'est pas b
a est plus que b
a est moins que b
a fait partie de b
a ne fait pas partie de b
a existe
il y a une surface a
il n'y a pas de surface a
il y a un espace a
il n'y a pas d'espace a
a est visible dans b
a est visible dans une surface
a est invisible
a est visible dans toutes les surfaces
C’est très intéressant tout ça…
Tu pourrais mettre une « vraie » aventure dans une des fenêtres ? Parce que là ça change radicalement depuis l’autre interface.
Me demandes-tu si à terme on pourra mettre une histoire dans une des fenêtres, ou si je pourrais en mettre une maintenant pour voir l’effet que ça fait ?
D’accord, je n’avais pas compris. Oui c’est une réécriture complète, mais j’ai du mal à choisir un « scope », un domaine d’utilité pour ce moteur. J’ai toujours tendance à me laisser envahir par une douce folie des grandeurs. La bonne nouvelle, c’est que j’en suis conscient, donc je peux corriger le tir.
C’est un moteur de jeu, donc ça passe forcément par un langage de programmation ou de définition du jeu (ça tombe bien, c’est justement ce qui me fait frétiller). En choisissant d’utiliser un langage très proche du langage naturel, je m’oriente vers (ou je rend accessible ce moteur à) un public pas ou peu à l’aise avec la programmation. Voilà un point. Un autre point, qui tire le projet dans une direction opposée, c’est le désir de proposer un langage puissant, de le concevoir. Un troisième point c’est la tentation de faire de MAVH un outil généraliste, dont on peut se servir d’organiseur par exemple. Ou autre chose. Il y a donc beaucoup de forces en jeu, de désirs contradictoires, et un peu d’arrogance aussi. Il faut que j’arrive à proposer quelque chose qui soit à la fois humble et smart.
Autre chose qui me trotte en tête aussi, c’est que si je fais un langage très simple, les utilisateurs vont (et c’est normal) pousser le langage dans ses derniers retranchements, le pousser au maximum de ses possibilités pour lui faire faire des choses pour lesquelles il n’était pas prévu à l’origine. Face à cela, je pense qu’il faut que le moteur repose sur des fondations conceptuelles solides et claires. Et c’est un vrai défi.
Techniquement, voici 3 choses que j’aime.
Avoir de petites unités appelées « objets », qui encapsulent des informations et des comportements, et qui communiquent, me semble intéressant. J’aime particulièrement la structure publish/subscribe. Comme twitter en un sens : un objet peut « suivre » d’autres objets, et émettre des messages. Quand un objet émet un message, tous les objets qui le suivent reçoivent ce message. La réception de messages déclenche des comportements.
J’aime aussi le string-rewriting. Si vous cherchez Thue, vous tomberez notamment sur un langage ésotérique appelé « Thue », qui est Turing-complet, et qui ne fonctionne que par remplacement de sections de chaînes de caractères. C’est juste génial. Alors pris tout seul, c’est assez peu pratique, mais ça peut venir en complément, comme un léger système de macro.
Un petit dernier : j’aime bien l’idée d’énoncer des vérités, d’avoir des règles, et de pouvoir automatiser les déductions en fonction des vérités énoncées et des règles disponibles. Là c’est une petite goutte de prolog, ou plutôt de datalog (je n’aime pas l’idée que prolog puisse si facilement tourner en boucle infinie). Cela fonctionnerait plutôt par patterns : s’il est vrai que est parent de , et que est une femme :cela implique que est la mère de . Mais attention aux boucles infinies.
Voilà dans quoi j’évolue en ce moment !
MAVH .IV Code
basic
<variable> est <valeur>
<variable> augmente de <nombre>
<variable> diminue de <nombre>
si <conditions> : <actions>
si <conditions> : <actions> ; sinon : <actions>
<valeur> fait partie de <liste>
<valeur> ne fait plus partie de <liste>
au hasard : <actions>
pubsub
<message>
<agent> est observé
<agent> n'est plus observé
thue
<texte> correspond à <texte>
<texte> ne correspond plus à <texte>
rulez
il est vrai que <assertion>
il est faux que <assertion>
s'il est vrai que <assertions> : cela implique que <assertions>
s'il est vrai que <assertions> : cela n'implique plus que <assertions>
react
quand <événements> : <actions>
quand <événements> : il ne se passe rien
en cas d'erreur : <actions>