[Inform7] Intercepter undo

Pour discuter des langages que nous utilisons pour réaliser nos jeux : problèmes, solutions, suggestions...

Modérateurs: Stormi, Otto Grimwald

[Inform7] Intercepter undo

Messagepar Corax le Mar Juil 25, 2017 1:33 pm

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 :
Code: Tout sélectionner
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 :
Code: Tout sélectionner
Use UNDO prevention.

Néanmoins, elle ne me convient pas car elle provoque quand même l'affichage d'un message.
L'utilisation de la commande « annuler » n'est pas autorisée dans ce jeu.


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. :)

Merci d'avance
Corax
Grand Ancien
 
Messages: 282
Inscription: Mer Juin 08, 2016 10:00 am

Re: [Inform7] Intercepter undo

Messagepar filiaa le Mar Juil 25, 2017 5:39 pm

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.
filiaa
Investigateur
 
Messages: 85
Inscription: Dim Fév 23, 2014 10:07 pm

Re: [Inform7] Intercepter undo

Messagepar Corax le Mar Juil 25, 2017 6:18 pm

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.
Corax
Grand Ancien
 
Messages: 282
Inscription: Mer Juin 08, 2016 10:00 am

Re: [Inform7] Intercepter undo

Messagepar Natrium le Mar Juil 25, 2017 7:41 pm

filiaa a écrit:Ton problème avec "undo" découle du fait que c'est une action "out of the world"

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 :

Code: Tout sélectionner
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: Tout sélectionner
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".

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.)
Avatar de l’utilisateur
Natrium
Grand Ancien
 
Messages: 1164
Inscription: Mar Oct 04, 2011 11:18 pm

Re: [Inform7] Intercepter undo

Messagepar Corax le Mar Juil 25, 2017 8:16 pm

Ok, ok...
La seconde solution est typiquement le truc sorti de l'espace que je n'aurais jamais trouvé ! :)

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.

Code: Tout sélectionner
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 .
Corax
Grand Ancien
 
Messages: 282
Inscription: Mer Juin 08, 2016 10:00 am

Re: [Inform7] Intercepter undo

Messagepar filiaa le Mer Juil 26, 2017 1:56 pm

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 ».


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 ?
filiaa
Investigateur
 
Messages: 85
Inscription: Dim Fév 23, 2014 10:07 pm

Re: [Inform7] Intercepter undo

Messagepar Mule hollandaise le Mer Juil 26, 2017 3:08 pm

Je crois qu'il y a "oops" et c'est tout. (Il me semble! Et si ça existe encore dans I7!)
Mule hollandaise
Grand Ancien
 
Messages: 1123
Inscription: Mar Aoû 29, 2006 10:57 pm

Re: [Inform7] Intercepter undo

Messagepar Natrium le Mer Juil 26, 2017 3:28 pm

Corax a écrit:La seconde solution est typiquement le truc sorti de l'espace que je n'aurais jamais trouvé ! :)

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.

filiaa a écrit:(oui, je pense à toi, paragraphe 11.2 qui met saving et undoing sur un pied d'égalité !)

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.

Mule hollandaise a écrit:Je crois qu'il y a "oops" et c'est tout. (Il me semble! Et si ça existe encore dans I7!)

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 ».
Avatar de l’utilisateur
Natrium
Grand Ancien
 
Messages: 1164
Inscription: Mar Oct 04, 2011 11:18 pm

Re: [Inform7] Intercepter undo

Messagepar Corax le Mer Juil 26, 2017 6:17 pm

Après test, "encore" n'échappe pas à mon système, mais "oops", si. J'ai droit à :
Désolé, impossible de corriger.

Je vais lui faire sa fête, comme "undo".
Corax
Grand Ancien
 
Messages: 282
Inscription: Mer Juin 08, 2016 10:00 am

Re: [Inform7] Intercepter undo

Messagepar filiaa le Mer Juil 26, 2017 9:04 pm

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 ?
filiaa
Investigateur
 
Messages: 85
Inscription: Dim Fév 23, 2014 10:07 pm

Re: [Inform7] Intercepter undo

Messagepar Natrium le Mer Juil 26, 2017 9:20 pm

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 :
Jeu fictif a écrit:Salle du trésor
Vous pouvez voir un coffre.

>déverrouiller voffre
Vous ne voyez rien de tel, à moins que cela ne soit sans grande importance.

>euh coffre
Vous déverrouillez le coffre.

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.
Avatar de l’utilisateur
Natrium
Grand Ancien
 
Messages: 1164
Inscription: Mar Oct 04, 2011 11:18 pm


Retourner vers Questions techniques et aide pour votre code

Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 1 invité

cron