[i7] Format livre dont vous êtes le héros

Salut à tous,

Me voici cette fois avec une question indépendante du projet sur lequel je travaille. Enfin, une question, c’est plutôt une réflexion sur laquelle je suis curieux d’avoir votre avis. Je me suis demandé comment réaliser une fiction au format livre dont vous êtes le héros avec i7, c’est-à-dire une fiction à choix multiples. Au lieu de taper son instruction, le joueur n’aurait à saisir que le numéro de l’action parmi celles qui lui sont proposées. C’est plus simple, mais du coup plus accessible et toujours rudement efficace. Voici comment je m’y prendrais.

D’abord, neutraliser toutes les actions standards par quelque chose du genre :

Instead doing anything other than [...]: dire "Message d’erreur".

Il faudra exclure certaines actions et donc les placer à la place de […].

Ensuite, créer les actions de choix sur ce modèle :

Choix1 is an action applying to nothing. Comprendre "1" comme Choix1. Report Choix1: dire "Choix indisponible".

Créer cinq actions différentes, ça parait déjà pas mal. Pour utiliser ses actions, il faut considérer les rooms non plus comme des endroits, mais comme des événements. En effet, dans un livre dont vous êtes le héros, le personnage progresse d’événements en événements, plus que de lieux en lieux. Quoi qu’il en soit, les nouvelles actions seront employées de façon on ne peut plus basique :

Instead Choix1 when player is in [...]: dire "Texte"; [Et probablement une instruction déplaçant le joueur à un autre événement.]

Voilà pour le concept de base. Ce n’est pas bien compliqué à mettre en place, il faudra juste penser à décrire les choix aux joueurs. Qu’en pensez-vous ? Ça vous semble viable ou quelque chose d’importance m’a échappé ? Bien sûr, je n’ai volontairement pas pris en compte tous les cas particuliers qu’on peut rencontrer, tel qu’un choix n’apparaissant que sous certaines conditions. Tout est faisable, mais je ne suis pas là pour vous assommer avec d’indigestes pavés textuels.

Voilà, voilà !

C’est exactement ce sur quoi je travaille, je t’envoie un mail avec un exemple de code, les extensions nécessaires, etc.

Ok, curieux de lire ça. ^^

En général, s’il faut bricoler chaque truc au cas par cas — ici en créant une action différente par choix —, alors c’est qu’il y a quelque chose qui cloche. En tout cas, je t’avais déjà montré une solution qui fonctionne avec l’activité « reading a command » et des tableaux.

Tu pourrais écrire modifier mon exemple en ajoutant

A room has a table name called menu. Et tu pourras ainsi créer un menu pour chaque endroit-événement.

Il y a des extensions qui font ça aussi, comme l’a dit Azathoth. D’ailleurs, Azathoth, tu pourrais aussi lister les extensions ici, comme ça tous les lecteurs du forum auront accès à ces infos.

Sinon, tu peux utiliser Twine, mais il me semble que ce n’est pas top pour les malvoyants.

Twine ne gère pas (ou beaucoup plus poussivement) les déplacements d’objets et de PNJ, par exemple.

Inform fait ça très bien et permet donc de varier les choix voire d’insérer du non-linéaire dans ton LDVELH, du genre pour la room MarchéDeLaVille :

say "- Vous visitez les étals." ;
if the météo is pluvieuse, say "- Au lieu de visiter les étals, vous vous abritez de la pluie, dans un passage couvert adjacent." ;
if Natrium is in MarchéDeLaVille, say "- Vous allez vers Natrium et lui demandez si blablabla." ;
if the player has a domicile, say "- Vous rentrez chez vous." ;

Voilà un exemple de mon code pour le jeu que je fais pour la Comp de cette année.

Natrium va pas aimer, comme d’hab, mais ça marche très bien.

(sachant que : Texting is an action applying to one topic. Understand « [text] » as texting.)

[code]AvancezAvancez2 is a room. « [line break]Un homme perd patience, invective les gardes, se met à crier.[line break][line break]« Pourquoi ça va aussi lentement, on est des citoyens libres ! » ».

After printing the locale description when the player is in AvancezAvancez2 :
say « • Vous vous [fcs]écartez[endfcs] de lui autant que possible. » ;
say « • Vous tentez de le [fcs]calmer[endfcs]. » ;
say « • Vous vous [fcs]joignez[endfcs] à ses protestations. ».

Instead of texting when the player is in AvancezAvancez2 and DescenteBateau is true :
if the player[‹ ]s command matches « écartez »
begin ;
increment SoumissionElena ; clear the screen ; move the player to HommeEstPlaqué ;
otherwise if the player[ ›]s command matches « calmer » ;
clear the screen ; move the player to HommeSécrase ;
otherwise if the player[‹ ]s command matches « joignez » ;
decrement SoumissionElena ; clear the screen ; move the player to PlusieursCoups ;
otherwise ;
say "[line break]Cliquez sur l[ ›]un des liens proposés." ;
end if.[/code]

Ici, chaque room correspond, disons, à un paragraphe de la narration, comme dans un LDVELH classique. Même si rien ne m’empêche, une fois que les événements se calment dans le jeu, par exemple, d’envoyer le joueur dans un room " classique ", qui décrit un lieu et les objets qu’ils contient.

Les balises FCS et ENDFCS servent à créer des liens cliquables, comme dans mon jeu L’Observatoire. Ça n’a rien d’obligatoire, mais c’est pratique, et comme ça peut être que le joueur est moins tenté de taper des commandes fantaisistes au clavier.

Voici le code :

[code]Include Basic screen effects by Emily Short.

Include Flexible Windows by Jon Ingold.

Include Basic Hyperlinks by Emily Short.

Include Hyperlink Interface by Leonardo Boselli.
[Topic hyperlink highlighting is true. Parser highlighting is true. Hyperlinks required is true. ]

[Include Inline Hyperlinks by Erik Temple.]

Table of Common Color Values (continued)
glulx color value assigned number
g-pure-blue 255 [== $0000FF]
g-pure-green 65280 [== $00FF00]
g-pure-cyan 65535 [== $00FFFF]
g-pure-yellow 16776960 [== $FFFF00]
g-pure-magenta 16711935 [== $FF00FF]
g-pure-red 16711680 [== $FF0000]
g-dark-red 11141120 [== $AA0000]

Table of User Styles (continued)
style name justification obliquity indentation first-line indentation boldness fixed width relative size glulx color
special-style-1 left-right-justified no-obliquity 15 -4 bold-weight proportional-font 0 g-pure-blue
special-style-2 left-right-justified no-obliquity 15 -4 bold-weight proportional-font 0 g-pure-red

To say fcs :
say « [t][first custom style] ».

To say endfcs:
say « [roman type] ».

First when play begins: now object hyperlink highlighting is false; now the style of topic-word is hyperlink-bold-style.[/code]

Ceci dit moi je suis sous 6G60. Je ne sais pas comment tout ça fonctionne (ou pas) avec la dernière version d’Inform.

Tout à fait d’accord. Cependant, j’ai dû mal expliquer mon principe car il est loin d’être aussi bricolé.

Comment fonctionne i7 de façon classique ? On utilise des actions telle que examining, going, searching, taking, etc. Ces actions sont plutôt nombreuses.
Moi, je propose simplement d’utiliser à la place Choix1, Choix2, Choix3, Choix4 et Choix5. Et je propose de s’en servir exactement tel qu’i7 le prévoie. Cinq actions pour tous le jeu. S’il s’avère qu’à un moment donné, une scène réclame plus de choix, il suffit d’en ajouter. Même si au final il y en a 10, ce sera toujours largement inférieur au nombre d’actions standards, toujours plus simple.

Quelque chose de bricolé contraint à taper énormément de code superflue par manque d’automatisation, de rationalisation. C’est pour ça qu’à mon sens, ce que je propose n’est pas si bricolé que ça. Ça demande très peu de code, c’est accessible à tout le monde et en prime, ça doit être léger en mémoire.

Le seul défaut à ce système, c’est qu’imaginons que dans une scène, 4 choix sont possibles, mais que le numéro 3 est désactivé, le joueur va s’en rendre compte puisque le jeu va lui proposer les choix 1, 2 et 4. Mais est-ce vraiment un problème ?

En fait, il faut surtout que j’explique la démarche à laquelle j’ai tendance à me conformer lorsque je code. Lorsque je veux faire quelque chose, j’essaie toujours de le faire le plus simplement possible. Car plus c’est simple, plus c’est gérable. Et plus c’est gérable, plus on peut faire compliqué au final car on peut combiner les choses simples. Je ne me tourne vers les concepts avancés que si la simplicité confine au bricolage, donc à la lourdeur du code ou au massacre de mémoire.

Cela dit, faut vraiment que je me mettent aux tableaux. C’est une lacune que de ne pas toucher à ce genre de choses.

@ Azathoth :
Oula, va falloir que je lise ça tranquillement. Mais c’est sympa de voir ce qu’on peut faire avec des extensions.

La méthode d’Azthath offre sans doute plus de possibilités, mais si c’est pour faire un LDVELH simple, il existe « Adventure Book by Edward Griffiths. » : inform7.com/extensions/Edward%20 … index.html

Je posterai un exemple tout à l’heure.

Voilà c’est toujours un peu le même exemple (que j’avais donné avec twine etc) : anamnese.online.fr/site2/textall … /play.html

Et ça utilise « Adventure Book by Edward Griffiths ». On pourra rajouter également des hyperliens, mais d’un autre côté comme cela ça donne toujours l’impression d’utiliser un parser…

Sympa l’exemple. Il fait cependant bugger mon lecteur d’écran. Mais c’est peut-être ma faute, j’ai tendance à être un peu trop frénétique avec les touches. De toute façon, ça c’est un détail qui ne concerne que moi.

Bref, que dire de plus ? Il faudrait sans doute que je me penche sur le sujet du LDVELH avec un projet en tête, ça orienterait mes propos. En tout cas, merci à vous pour vos retours. Et bon courage Azathoth pour ton travail. :slight_smile:

ah zut, peut-être que c’est le CSS qui ne passe pas, il faudra que je regarde à l’occasion. Les autres jeux du site passent-il correctement, par exemple celui-ci : ifiction.free.fr/parchment/?stor … us/zeus.z5 ?

J’ai fait un petit test rapide. Je n’ai à priori pas de bug sur ce jeu. Je testerai de nouveau ton exemple pour te confirmer s’il y a bien un bug. Ce serait bête que tu te lances dans des modifications si c’est juste moi qui ai fait une mauvaise manipulation.

@ Otto Grimwald :
J’ai retesté ton exemple. Il semble effectivement que j’ai des bugs. Pas grand-chose cela dit. C’est de temps en temps le focus qui merde lorsque j’entre une commande, ce qui me contraint à jouer de la tabulation pour poursuivre la FI. Après, ça doit vraiment être spécifique aux lecteurs d’écran.

@Azathoth

Effectivement, je n’aime pas. En fait, c’est surtout l’action « texting » qui me gêne. Puisqu’il s’agit d’analyser la commande du joueur en entier sans qu’elle ne mène à une action en tant que tel, il vaut sûrement mieux utiliser une règle « after reading a command », qui s’utilise à peu près de la même façon. Utiliser une action peut rapidement mener à des effets de bord indésirables.

(Aussi, tu utilises player’s command dans une action, ce qui n’est pas bien pour diverses raisons techniques. Il faut utiliser topic understood. Player’s command, il ne faut l’utiliser que dans after reading a command.)

Certes, mais comme Corax parlait d’« événements » et non d’« endroits » à proprement parler, il n’y a pas tant besoin de déplacer des objets (mais c’est vrai qu’Inform reste mieux si on veut garder la modélisation du monde).
[b]

@Corax[/b]

Ce n’est pas le seul défaut. Imagine que tu décides en plein milieu de la conception d’ajouter une option à un menu, mais pas en dernière position. Ça décalera toutes les options en dessous et tu seras obligé de changer toutes les actions les concernant (par exemple si tu ajoutes une option à la position 3, tu devras changer « choix3 » en « choix4 », « choix4 » en « choix5 » et ainsi de suite). Si tu en oublies un, boum, bug incompréhensible pour le joueur. C’est ça l’avantage des tableaux : tu peux mettre ton tableau dans l’ordre que tu veux, puisque ce sera l’association entre chaque colonne et l’ordre des lignes qui déterminera tout.

@ Natrium :
C’est juste. Le système que j’évoque ici ne convient qu’à une petite histoire. Ce peut-être aussi une méthode accessible à quelqu’un qui n’a vraiment pas envie de se prendre la tête avec du code. Me concernant, je l’ai déjà abandonné au profit de la méthode évoqué dans « [i7] Tableau avec des instructions ». Dans cette méthode, il n’y a plus qu’une seule action, celle qui fait le lien entre le numéro du choix et la règle associée.

Concernant ce qu’évoquait Azatoth, c’est vrai que je ne me soucie plus vraiment des objets au sens technique du terme dans un LDVELH. En fait, pour moi, le LDVELH n’a pas du tout le même objectif qu’une FI classique.
Une FI classique, ça me donne envie d’offrir au joueur un maximum de liberté, de construire un monde. Ça me donne aussi envie de mettre l’accent sur la technique et vous pouvez le constater dans la Boussole des Brumes.
Dans un LDVELH, c’est presque le contraire. C’est le scénario, l’histoire qui prime. Du moment que la technique est propre et fonctionnel, ça me suffit.

Enfin voilà !

Je vais essayer de remplacer Texting par " after reading a command " , juste pour te faire plaisir. Mais explique-moi ces fameux " effets de bord indésirables " :sunglasses:

Ben il suffit de jouer à L’Observatoire pour s’en rendre compte. Ça n’affiche rien si le joueur tape une ligne vide, il faut désactiver toutes les autres actions, ça peut ne rien afficher si le joueur tape une commande invalide…

Il y a aussi un autre effet : l’extension française modifie la commande, mais après after reading a command. Ça peut donc être moins bien ou mieux d’utiliser cette règle à cause de ça, ça dépend.

Mettons que le joueur tape « le brûler ». À l’étape after reading a command, le player’s command est « le brûler ». Mais une fois que l’action a démarré, le player’s command est « bruler -le » (sans accent et avec le pronom déplacé). Il faut donc gérer les accents et les « le/la/les » en début de commande différemment selon la méthode utilisée.

Je pense que question « philosophie du langage », after reading a command est mieux. Ou alors tu utilises des objets pour modéliser chaque choix, comme je l’avais déjà suggéré. Après, on ce n’est pas si grave : d’une part c’est subjectif, et d’autre part tant que ça fonctionne bien dans ton jeu, ça va.

Tout cela est parfaitement volontaire et assumé, oui.

Le joueur a des liens sur lesquels cliquer, ou vraiment s’il a envie de se faire ch… il peut en effet TAPER les mots-clés, mais le jeu est conçu, oui, pour précisément NE RIEN AFFICHER si le joueur tape n’importe quoi d’autre.

Je vais d’ailleurs faire disparaître le " command prompt " pour bien faire comprendre qu’on est pas censé taper quoi que ce soit.

Je m’attendais plutôt à ce que tu me parles de "bugs " liés à ma façon de faire.

Ceci étant, je ne l’ai pas systématisé (parce que dans certaines situations ça ne m’arrange pas), mais j’ai bel et bien crée divers types d’objets qui modélisent des choix.

Ben pour moi il s’agit de bugs. :stuck_out_tongue:

Comme je l’ai dit, dans ton cas ça doit aller (même s’il est possible qu’il y ait d’autres effets indésirables, je ne sais pas). C’est juste que de manière générale, after reading a command me semble meilleur, car ça « casse » moins de choses. Par exemple, si tu veux qu’une partie du jeu se déroule normalement, avec un parser, et bien il suffit de mettre la règle after reading a command dans une condition ; avec ta manière, ce n’est pas possible car tous les verbes sont désactivés.

Tout ça pour dire que je suis partisan du « même si je n’en ai pas besoin, je code de manière général, au cas où ». Pour toi, si tu n’es qu’en mode LDVELH, alors ça ce n’est pas si grave.

Ce n’est pas une bonne pratique pour moi. Il faut toujours indiquer à l’utilisateur s’il quelque chose qu’il a fait n’est pas correct.

Question à mille euros : sachant que mes jeux utilisent des liens hypertextes et que je fais disparaître le " > " du prompt , pourquoi mettrais-je un message d’erreur si le joueur TAPE un mot quelconque alors qu’il était censé cliquer sur l’un des choix proposés ? :slight_smile:

Enfin, ne te force pas à y répondre, je crois qu’on ne sera de toutes façons jamais d’accord. Par contre tu ne peux pas appeler " bugs " des choix de design qui ne te plaisent pas. Je te demandais quels plantages purs et durs du programme mon système pouvait provoquer : il n’y en a pas.