[Inform7] Intercepter undo

Salut à tous,

Capter toutes les actions du joueur est une nécessité lorsqu’on veut tout contrôler. Je pensais y être parvenu en jouant sur ses deux règles :

After reading a command:
For printing a parser error when the latest parser error is the I beg your pardon error:

Soit il y a une saisie du joueur et ça passe par la première règle, soit il n’y a aucune saisie du joueur et ça passe par la seconde règle.
Il semble cependant que la commande « undo » ne passe par aucune des deux. Elle échappe donc à mon contrôle.

Je sais qu’il existe une option pour la bloquer :

Use UNDO prevention.

Néanmoins, elle ne me convient pas car elle provoque quand même l’affichage d’un message.

Est-il possible de capter la commande « undo » avant qu’elle n’agisse ?
Existe-t-il d’autres commandes qui passent outre les deux règles que j’évoque en début de message ?

Je sais que je rendre désormais dans le fignolage, mais, hum, je ne sais pas, mon côté despotique aime bien tout vé rouiller proprement. :slight_smile:

Merci d’avance

Ton problème avec « undo » découle du fait que c’est une action « out of the world », comme « save » et « quit ». D’après le paragraphe 12.15 du guide d’Inform, ces actions spécifiques ne sont pas concernées par les « Before », « After » ou « Instead ».

Je ne sais pas vraiment comment résoudre ton problème, mais dans les deux exemples donnés après le dit paragraphe, ils utilisent « Check saving… » pour contourner l’impossibilité d’utiliser un « Before ». En gros, il est possible d’utiliser « Check », « Carry out » et « Report », je te laisse (ou je laisse quelqu’un de plus expérimenté que moi) déterminer ce qu’il faut utiliser pour avoir l’effet voulu.

Salut filiaa,

Sur le coup, je me suis dit que tu avais raison, mais après test, je doute que ce soit ça. En effet, à l’heure actuelle, les commandes pour sauvegarder, charger ou même les commandes utilisées pour débugger le jeu sont bloquées par mon système. Je n’ai trouvé que ‹ undo › qui passe outre.

Et non, « undo » n’est même pas une action. Le parser vérifie si la commande est « undo » très tôt, avant même « after reading a command ».

Deux solutions s’offrent donc à toi.

Tu peux utiliser « use undo prevention » et changer la réponse :

The immediately undo rule response (A) is "Blablabla".

Ou tu peux modifier le code I6 sous-jacent pour remplacer les mots permettant d’annuler par quelque chose d’impossible à taper (au sens du parser). Par exemple, un mot commençant par une virgule ou contenant une espace. Il te suffit de copier ce qui suit quelque part dans ta source.

[code]Include (-
Constant AGAIN1__WD = ‹ encore ›;
Constant AGAIN2__WD = ‹ g// ›;
Constant AGAIN3__WD = ‹ encore ›;
Constant OOPS1__WD = ‹ oops ›;
Constant OOPS2__WD = ‹ oops ›; ! ‹ o// ›;
Constant OOPS3__WD = ‹ euh ›;
Constant UNDO1__WD = ‹ ,impossible ›;
Constant UNDO2__WD = ‹ ,impossible ›;
Constant UNDO3__WD = ‹ ,impossible ›;

Constant ALL1__WD = ‹ tous ›;
Constant ALL2__WD = ‹ toutes ›;
Constant ALL3__WD = ‹ tout ›;
Constant ALL4__WD = ‹ tout ›;
Constant ALL5__WD = ‹ tout ›;
Constant AND1__WD = ‹ et ›;
Constant AND2__WD = ‹ et ›;
Constant AND3__WD = ‹ et ›;
Constant BUT1__WD = ‹ mais pas ›;
Constant BUT2__WD = ‹ excepte ›;
Constant BUT3__WD = ‹ sauf ›;
Constant ME1__WD = ‹ moi ›;
Constant ME2__WD = ‹ toi ›; !*! nous ? moi-même ?
Constant ME3__WD = ‹ vous ›;
Constant OF1__WD = ‹ de ›;
Constant OF2__WD = ‹ de ›;
Constant OF3__WD = ‹ du ›;
Constant OF4__WD = ‹ de ›;
Constant OTHER1__WD = ‹ autre ›;
Constant OTHER2__WD = ‹ autre ›;
Constant OTHER3__WD = ‹ autre ›;
Constant THEN1__WD = ‹ alors ›;
Constant THEN2__WD = ‹ puis ›;
Constant THEN3__WD = ‹ ensuite ›;

Constant NO1__WD = ‹ n// ›;
Constant NO2__WD = ‹ non ›;
Constant NO3__WD = ‹ non ›;
Constant YES1__WD = ‹ o// ›;
Constant YES2__WD = ‹ y// ›;
Constant YES3__WD = ‹ oui ›;

Constant AMUSING__WD = ‹ amusing ›;
Constant FULLSCORE1__WD = ‹ fullscore ›;
Constant FULLSCORE2__WD = ‹ full ›;
Constant QUIT1__WD = ‹ quit ›; !*! « q// » ?
Constant QUIT2__WD = ‹ quitter ›;
Constant RESTART__WD = ‹ recommencer ›;
Constant RESTORE__WD = ‹ charger ›;
-) instead of « Vocabulary » in « Language.i6t ».[/code]
Avec ça, le mot « undo » n’existera plus, et il y aura aucun moyen d’annuler.

(Pour les curieux : le code ci-dessus permet de remplacer une section dans le code I6, celle qui définit les mots spéciaux du parser comme « tout » ou « encore ». J’ai remplacé UNDO1__WD, UNDO2__WD et UNDO3__WD, qui sont ceux qui permettent d’annuler.)

Ok, ok…
La seconde solution est typiquement le truc sorti de l’espace que je n’aurais jamais trouvé ! :slight_smile:

J’allais dire que la première solution ne me convenait pas, mais ça, c’était avant d’avoir eu une petite idée toute bête.

To say annuleinvisible:
    try displaying;
    stop the action.
[Sachant que displaying est mon looking revisité et qu'il dispose de l'effacement de l'écran afin de le reconstruire.]
The immediately undo rule response (A) is "[annuleinvisible]".

Je viens de tester, ça marche. Du coup, le ‹ undo › ne provoque rien de visible pour le joueur.

Merci en tout cas Natrium, et à toi aussi filiaa .

Tiens, c’est marrant ça ! Comme quoi, la mécanique d’Inform est vraiment complexe… Et je me suis fait avoir par la doc, qui est un peu trompeuse pour le coup (oui, je pense à toi, paragraphe 11.2 qui met saving et undoing sur un pied d’égalité !). Même si c’est vrai que j’aurais pu vérifier dans l’Index, j’aurais vu qu’undo est pas listé dans les actions…

Du coup, il y en a d’autres, des trucs comme undo qui sont pas des actions ? Ils ont un nom ?

Je crois qu’il y a « oops » et c’est tout. (Il me semble! Et si ça existe encore dans I7!)

Certes, c’est un peu impossible à trouver si on ne connaît pas les rouages d’Inform.

Pour ta solution, utiliser une substitution est exactement ce à quoi je pensais. Je pense aussi que ça tient plus d’un genre de hack et que la solution Inform 6 est la plus « correcte », mais ça ne doit pas changer grand-chose au final.

Quel est le nom du chapitre ? J’ai essayé de trouver de quoi tu parles mais je n’ai pas réussi. S’il y a une ambiguïté, ça peut être bien de le signaler.

Oui, oui, ça existe encore. Même que je l’utilise régulièrement. À noter que la traduction française est « euh ».

Et comme on peut le voir dans le code I6 écrit plus haut, il y a aussi « encore ». Néanmoins, ces deux cas (oops et encore) ne devraient pas poser problème à Corax, car elles renvoient une commande (corrigée dans le cas de oops, la précédente dans le cas de encore), donc au final c’est capturé par « After reading a command ».

Après test, « encore » n’échappe pas à mon système, mais « oops », si. J’ai droit à :

Je vais lui faire sa fête, comme « undo ».

J’imagine que « encore » sert à répéter l’action précédente, mais « oops », c’est censé servir à quoi ? C’est une commande vraiment utilisée par les joueurs ou c’est apparu dans une fiction historique ou marquante et ça a été gardé dans Inform par tradition ?

C’est gardé par tradition mais peu de gens l’utilisent. Ça sert à corriger la commande précédente et ça fonctionne de cette manière :

C’est vrai que ce n’est pas forcément utile, car il suffit d’utiliser la flèche haut pour réafficher la dernière commande et la modifier (et encore, ça peut être un peu plus lent de faire comme ça puisqu’il faut ensuite utiliser la flèche gauche pour venir au niveau du « v » et le remplacer par un « c »). Mais c’est pratique sur mobile, où il n’y a pas de flèche haut. En tout cas, j’ai pris l’habitude de l’utiliser, et je trouve ça utile.

Pour en revenir au problème de Corax, le « oops » ne devrait pas poser problème puisqu’il réinjecte l’ancienne commande avec correction, sauf si le jeu juge que c’est impossible de corriger l’ancienne commande (ou si on ne tape rien après). Donc il faut effectivement penser à le gérer.