[Inform 7] Chose intouchable et choix multiples

Salut à tous !

Me revoilà pour deux petites questions toutes bêtes.

Je sais que lorsqu’on déclare une nouvelle action, on peut préciser qu’elle nécessite par exemple un objet visible ou un objet touchable. Mais comment faut-il faire pour déclarer qu’un objet donné est juste visible, pas touchable ? Je demande ça dans le cadre de backdrop tel qu’un ciel ou un plafond, espérant ainsi empêcher les actions searching et touching qui, je présume, nécessite un objet touchable. Sinon, je peux toujours coder mes propres adjectifs, mais ce serait bête si c’est déjà prévu de base dans le système.

Seconde interrogation. Je sais qu’on peut poser au joueur des questions fermées. Je me sers du système. Mais comment s’y prend-on pour le faire choisir entre plusieurs propositions, genre faire ci, faire ça ou faire ceci ?
Je n’en ai pas spécialement besoin à l’instant T, mais c’est toujours utile d’ajouter des cordes à son arc.

Je vous remercie d’avance pour vous réponses ! :slight_smile:

Seconde interrogation. Je sais qu’on peut poser au joueur des questions fermées. Je me sers du système. Mais comment s’y prend-on pour le faire choisir entre plusieurs propositions, genre faire ci, faire ça ou faire ceci ?

Tu peux procéder par un menu chiffré ou par mots-clés, selon tes besoins…

Exemple 1

ChoixZombies is a truth state that varies. ChoixZombies is false.

Instead of opening the DoorOfTheDead :
say "Un groupe de zombies affreux sort du caveau." ;
say "1. Vous fuyez." ;
say "2. Vous restez pour combattre." ;
say "3. Vous vous roulez en boule par terre et attendez la mort en gémissant." ;
now ChoixZombies is true.

NumberEntering is an action applying to one number. Understand "[number]" as NumberEntering.

Instead of NumberEntering when ChoixZombies is true :
if the number understood is 1
begin ;
say "Vous fuyez." ;
otherwise if the number understood is 2 ;
say "Vous combattez." ;
otherwise if the number understood is 3 ;
say "Vous mourez." ;
otherwise ;
say "Entrez un chiffre entre 1 et 3." ;
end if.

Exemple 2 :

ChoixZombies is a truth state that varies. ChoixZombies is false.

Instead of opening the DoorOfTheDead :
say "Un groupe de zombies affreux sort du caveau." ;
say "- Vous FUYEZ." ;
say "- Vous RESTEZ pour combattre." ;
say "- Vous vous ROULEZ en boule par terre et attendez la mort en gémissant." ;
now ChoixZombies is true.

TextEntering is an action applying to one topic. Understand "[text]" as TextEntering .

Instead of TextEntering when ChoixZombies is true :
if the player's command includes "fuyez"
begin ;
say "Vous fuyez."  ; now ChoixZombies is false ;
otherwise if the player's command includes "restez" ;
say "Vous combattez." ; now ChoixZombies is false ;
otherwise if the player's command includes "roulez" ;
say "Vous mourez." ;  now ChoixZombies is false ;
otherwise ;
say "Entrez un des mots-clés indiqués." ;
end if.

à noter que si tu prends comme mot-clé un verbe à l’infinitif, tu dois d’abord le supprimer comme synonyme d’une action, par exemple si le choix est « Vous restez pour COMBATTRE », tu devras aussi faire :

Understand « combattre » as something new.

Sauf si éventuellement tu fais :

Instead of attacking when ChoixZombies is true : say "Vous attaquez" ; now ChoixZombies is false.

Merci pour les exemples. C’est instructif. :slight_smile:
Mais, il n’y a pas moyen de gérer ça par une méthode moins bricolée ? Je demande ça car pour gérer les questions fermées, il y a une instruction sur mesure :

Instead examining la monstrueuse peluche de combat rose: say "Voulez-vous attaquer ce monstre horrible ?" ; if player consents : end the story saying "Ho mon dieu, c’est trop horrible, vous êtes mort, mort et re mort !".

Pour les méthodes non-bricolées, faut demander à Natrium :stuck_out_tongue:

Que vois-je ? Un compliment ? :slight_smile: Mais bref, commençons par la première question.

Pour les choses non touchables :
Réponse courte : on ne peut pas.
Réponse longue : il faut bidouiller les règles d’accessibilité. L’exemple 216 montre comment faire (section 12.18). Sinon, il y a une extension qui implante ça de façon plus poussée, Far Away par Jon Ingold. Par contre il faut faire attention, car ça peut créer des problèmes si on teste la visibilité manuellement dans le code (« if le blabla est touchable »). Mais je pense que l’extension s’occupe de ça, donc il ne devrait pas y avoir de problèmes. Ce genre de chose aurait du être intégré à Inform, mais bon…

Pour les menus :
Ce sera toujours un peu bricolé, car Inform n’est pas vraiment fait pour ça, mais on peut faire mieux qu’une action. Si c’est vraiment ponctuel, et que ce n’est pas tout le jeu, il vaut mieux utiliser la règle « after reading a command ». Cette règle se déclenche après que le joueur a entré sa commande, mais avant qu’elle ne soit analysée.

J’ai fait un exemple vite fait, à titre « éducatif », mais ça doit être possible de faire mieux (et j’ai peut-être oublié des cas). Par exemple, il faut forcément attendre la fin du tour pour que le joueur fasse son choix, donc les règles qui se déroulent à chaque tour vont se lancer, ce qui n’est pas souhaitable. J’ai utilisé des tableau pour que ce soit modulable facilement, mais on peut aussi faire les vérifications au cas par cas à la place, s’il n’y a qu’un seul menu dans tout le jeu.

[code]Table of Choix 1
Topic Option Réponse
« bonjour/salut » « Dire BONJOUR. » « Bonjour, le joueur[_]! »
« au revoir » or « adieu » « Dire AU REVOIR. » « Ce n’est pas gentil. »

Le menu actuel est un nom de tableau qui varie.
menu en cours est initialement faux.

To montrer (T - un nom de tableau):
maintenant menu en cours est vrai;
maintenant le menu actuel est T;
let N be 0;
parcourir T:
incrémenter N;
dire « [N]. [entrée Option][à la ligne] ».

After reading a command while menu en cours est vrai:
[Si le joueur a entré un nombre.]
si la player’s command correspond à « [number] »:
let N be the number understood;
si N > nombre de lignes du menu actuel or N <= 0:
dire « Veuillez entrer un nombre entre 1 et [nombre de lignes du menu actuel]. »;
rejeter la commande du joueur;
choisir la ligne N du menu actuel;
dire « [entrée Réponse][à la ligne] »;
maintenant menu en cours est faux;
rejeter la commande du joueur;
[Sinon si le joueur a entré du texte.]
sinon:
parcourir le menu actuel:
si la player’s command correspond à l’ entrée Topic:
dire « [entrée Réponse][à la ligne] »;
maintenant menu en cours est faux;
rejeter la commande du joueur;
dire « Veuillez faire un choix parmi les options présentées. »;
rejeter la commande du joueur.

Instead of jumping:
montrer table of Choix 1.[/code]
Je n’ai pas trop commenté, j’espère que ce sera assez clair. La colonne « Réponse » dans le tableau peut être remplacée par une colonne de règles pour exécuter des instructions plutôt que de juste afficher un texte. Pour plus d’infos sur ce genre de tableau avec des topics, voir la section 16.13.

Sinon, pour ne pas avoir à attendre la fin du tour (sans plonger dans I6), on peut facilement assigner chaque choix à une touche du clavier, et afficher le résultat quand cette touche est appuyée. J’ai fait ça dans le Chant des dunes (voir « Part 2 - Affichage du menu principal » du fichier mis en lien), gros projet que j’ai à peine commencé (il faut vraiment que je m’y remette). Il faudra adapter un peu par contre (si cette solution t’intéresse, je peux toujours la montrer dans un cas plus général). Ou alors il doit y avoir des extensions qui permette de faire comme mon exemple, mais quand on veut dans le code et pas à la fin du tour, mais je n’ai pas cherché.

Ouais, tout de suite ça fait plus pro :frowning:

Merci Natrium. Je comprends les exemples. Après, si je veux me lancer là-dedans, va falloir que j’expérimente à fond les tableaux. Ce ne sera probablement pas pour tout de suite. Mon projet actuel n’est pas un pur donjon crowler, les méthodes que j’ai mis en place me semble suffire. Vous pourrez peut-être sous peu en juger. J’ai quasiment achevé le prototype.

En revanche, maintenant que j’ai une idée assez précise de ce que permet de faire Inform, je ne peux m’empêcher de songer à ce que pourrait être un pur donjon crowler, ou un authentique RPG. J’accorde beaucoup d’importance à l’accessibilité d’un jeu. Aussi est-il indispensable de faciliter au maximum la tâche du joueur. Les menus à choix multiple semblent être un outil efficace.

Je suis également un grand adepte de l’uniformisation. Dès qu’on s’engage dans quelque chose de volumineux, je trouve préférable de mettre un place un système global qui facilite par la suite l’intégration des éléments de jeux plutôt que de se reposer sur une montagne d’exceptions.

@ Azathoth :
Les méthodes bricolées fonctionnent très bien aussi. Et Inform étant particulièrement souple, il se prête particulièrement bien au bricolage, enfin je trouve. ^^

Je te conseille vraiment d’expérimenter les tableaux. C’est vraiment utilise pour faire du code propre et modulable, et on peut vraiment faire plein de choses avec (comme créer des objets ou des types d’objet avec des tableaux).

Il faut vraiment que tu joues à Kerkerkruip alors. (au passage, c’est « crawler » avec un « a »).

hummmm ?

[code]Le jardin est un endroit.
A fruit is a kind of thing. A fruit is usually edible.
Some fruits in le jardin are defined by the Table of fruits.

Table of fruits
fruit description goût
la pomme « Un beau fruit rouge. » « acide »
la fraise « Un petit fruit. » « sucré »
la framboise « Un fruit rose. » « délicieux »

After eating un fruit, dire « [Le noun] a un goût [goût du noun]. ».[/code]
Il n’y a donc pas besoin de taper à chaque fois « La pomme est un fruit. La description de la pomme est … ». On peut aussi créer des types d’objet (plutôt que des objets) comme ça.
Section 16 du chapitre « Tables ».

Promis, quand tu seras sur ton lit de mort, j’arriverai avec un bouquet de fleurs et le manuel d’Inform que j’aurai lu, en entier.

En effet, c’est pratique. :slight_smile:

Je pense que ce sera l’inverse. Quand tu seras sur ton lit de mort, je viendrai te lire le manuel en entier pour que tu puisse quitter ce monde en paix. :slight_smile: