[Inform7] Analyse de commandes

Salut à tous !

Je vous sollicite pour un point de détail technique lié à l’analyse de commande.

After reading a command: if the player's command includes "[number]": now X is the number understood.
Est-il possible de faire la même chose, mais avec un type d’objet créé ? Par exemple Bidule ?

Bidule is a kind of thing.

Merci d’avance !

Malheureusement, ce n’est pas possible sans modifier la façon dont le parser fonctionne à bas niveau (Inform 6).

On peut écrire :

After reading a command: if the player's command includes "[bidule]":
Mais il n’y a pas moyen de récupérer l’objet qui a été trouvé comme cela, avec un « bidule understood », pour diverses raisons compliquées.

Il y a néanmoins des moyens de tricher. Il existe une extension qui permet de faire ce que tu veux, mais elle est un peu buggé et ne fonctionne pas toujours. Voici une solution qui fonctionne toujours en contournant le problème (attention, c’est un peu compliqué) :

[code]A bidule is a kind of thing.

The forced command is initially «  ».

For reading a command when forced command is not empty:
change the text of the player’s command to forced command.

After reading a command when forced command is empty (this is the custom parser rule):
if the player’s command matches « [bidule] »:
now forced command is « [player’s command] »;
reject the player’s command.

After reading a command when forced command is not empty (this is the empty forced command rule):
now forced command is «  ».

The empty forced command rule is listed after the custom parser rule in the After reading a command rulebook.

Biduling is an action applying to one thing.
Understand « [bidule] » as biduling.

Carry out biduling:
say « Le bidule trouvé est [the noun]. ».[/code]
Le principe est le suivant : on crée une action s’appliquant à un bidule, pour pouvoir le récupérer grâce à la variable « noun ». C’est donc l’action qui va s’occuper d’analyser l’objet. Le fonctionnement détaillé ci-dessous.

On a une variable « forced command » qui contiendra le texte d’une commande qu’on voudra forcer. Si elle est vide, le jeu accepte des commandes normalement ; si elle contient quelque chose, le jeu va exécuter cette commande à la place d’en demander une au joueur.

Le cœur du code est dans le « for reading a command ». Normalement, il faut éviter d’y toucher car c’est cette règle qui fait attendre que le joueur tape quelque chose. Mais là, si la variable mentionnée plus haut contient quelque chose, on met ce quelque chose dans la commande du joueur à la place de lui en faire entrer une.

Il y a deux règle « after reading a command ». La première est la principale, où tu mets tout le code qui analyse la commande du joueur. Elle ne se lance que quand « forced command » est vide car on ne veut pas intercepter les commandes forcées. Dans cette règle, si la commande du joueur correspond à un objet, alors on met la commande dans la variable « forced command » et on rejette la commande. Et du coup, la règle précédente va exécuter cette commande contenant le nom de l’objet, qui sera redirigée vers l’action adéquate.

La seconde règle vide « forced command » si elle contient quelque chose, pour pas qu’on force la commande indéfiniment. J’ai dû réordonner les règles car l’ordre est important mais Inform ne les ordonnait pas comme il fallait.

Enfin, il y a l’action, qui a pour commande le nom d’un bidule. C’est avec les règles standard de cette action que tu vas exécuter ton code concernant un bidule.

Voilà ! J’espère que c’était assez clair. Il est possible que ce code pose des problèmes, mais ça ne devrait pas arriver. En tout cas, c’est là qu’on voit les limites de la création de son propre analyseur à la place de celui d’Inform. Le code devient alambiqué, avec ces détours bizarres. Il se peut qu’il y ait une meilleure solution, mais je ne vois pas pour l’instant.

Merci Natrium pour cette réponse technique qui a dû quand même te prendre du temps.

C’est pas du petit code que tu me présentes là. Je l’ai compris dans ses grands principes. Après, tu vas forcément plus loin dans les mécaniques d’Inform que moi, le contraire aurait été étonnant. ^^

Je ne sais pas si je vais m’en servir. étant donné que je détourne déjà le comportement d’Inform, je redoute un peu un effet de bord entre nos codes. Néanmoins, et c’est le principal, je sais ne pas être passé à côté d’une petite ligne de commande magique qui aurait permis de faire ça sans souci.

J’ai, pour ma part, également contourné le problème. Au final, plutôt que d’envoyer directement l’objet à la commande et donc devoir se farcir l’analyse avec des types exotiques, j’envoie une commande qui inclus où trouver l’objet. Par exemple : « p 5 » pour « le cinquième objet dans les possessions ».

Encore merci d’être toujours aussi réactif et précis dans tes réponses ! :smiley: