[I6] Nouvelle extension: OneWordParsing

Je viens de finir une extension qui permet de reconnaître les commandes formées simplement du nom d’un objet. Il y a une extension I7 qui permet déjà de faire ça, et vous avez sans doute déjà vu cette interface dans des jeux I7 comme Blue Lacuna et Walker & Silhouette, ou dans Pirates des Charaïbes de Mnemocyon ; c’est la même chose, mais pour I6 :slight_smile:

Concrètement, vous avez deux modes :

  • « accepter les verbes » (définir la constante ALLOW_VERBS) : le joueur peut toujours taper tous ses verbes préférés, mais il peut aussi taper les noms des objets pour les examiner;
  • « refuser les verbes » (constante DONT_ALLOW_VERBS) : aucun verbe, on peut juste taper le nom des objets.

C’est pas forcément un effet qui est souvent utilisé, quoique j’aime bien la possibilité de juste taper le nom de l’objet pour l’examiner ; en tout cas, vous avez maintenant l’extension pour ça en I6 :slight_smile:

C’est peut être l’occasion de faire sans les bibliothèques.
Sinon : #Ifdef DONT_ALLOW_VERBS; [ BeforeParsing pos; #Ifdef TARGET_ZCODE; pos = parse->5; #Ifnot; ! TARGET_GLULX pos = parse->3; #Endif; ! TARGET_ LTI_Insert(pos, 'x'); LTI_Insert(pos+1, ' '); Tokenise__(buffer,parse); ]; #Endif;#Ifdef DONT_ALLOW_VERBS;doit être équivalent à ça, non ? : [spoiler]#IfNDef MyParserError;
[ MyParserError ;
L__M(##Miscellany, 27); ! I didn’t understand that sentence : customise this to tell the player to not use any verbs!
return true;
];
#Endif;

[ AnythingToken ;
while (NextWordStopped() ~= -1) ; return GPR_PREPOSITION;
];

[ OneWordSub;
<>;
];

[ OneWordFailSub;
#Ifdef DONT_ALLOW_VERBS;
MyParserError();
#Endif;
#Ifdef ALLOW_VERBS;
L__M(##Miscellany, 38); ! I don’t recognise that verb
#Endif;
return true;
];

#Ifdef DONT_ALLOW_VERBS;
! We don’t allow the use of verbs
! This is done by prefacing all the commands by ‹ verb ›
[ BeforeParsing pos ;
#Ifdef TARGET_ZCODE;
pos = parse->5;
#Ifnot; ! TARGET_GLULX
pos = parse->3;
#Endif; ! TARGET_
LTI_Insert(pos, ‹ v ›);
LTI_Insert(pos+1, ‹ e ›);
LTI_Insert(pos+2, ‹ r ›);
LTI_Insert(pos+3, ‹ b ›);
LTI_Insert(pos+4, ‹ l ›);
LTI_Insert(pos+5, ‹ e ›);
LTI_Insert(pos+6, ‹ s ›);
LTI_Insert(pos+7, ‹ s ›);
LTI_Insert(pos+8, ’ ');
Tokenise__(buffer,parse);

];

Verb ‹ verbless ›

  • noun ->OneWord
  • AnythingToken ->OneWordFail;

#Endif;[/spoiler]

Difficile sans casser toute la mécanique d’Inform et pas sûr que cela soit d’un grand intérêt ; saisir : > x objet ou : > objet…

Bien vu ! Je sais pas pourquoi mais je m’étais dit que ça serait bien de laisser la possibilité à l’auteur de déterminer quelle action correspond à « objet », mais c’est sans doute inutile ; et si quelqu’un veut changer l’action, c’est facile à faire. Du coup j’ai simplifié un peu mon code - merci !
Par contre je voudrais donner la possibilité à l’auteur de définir son propre message d’erreur sans avoir à modifier L__M(##Miscellany), parce qu’il faut sans doute dire quelque chose de plus que « je ne comprends pas » si l’interface est non-standard ; du coup j’ai gardé le Anything et MyParserError.
Et vu que je veux faire ça, il faut définir une grammaire « un nom ou n’importe quoi », et je peux pas mapper ça à « x » à cause des bibliothèques : si j’inclus la bibli après Grammar, ça me dit que je définis BeforeParsing deux fois, alors il faut l’inclure avant, mais du coup si je dis « Extend ‹ x › » il me dit ‹ c’est pas encore défini ›, et si je dis « Verb ‹ x › » il me dit « tu le définis deux fois ». :confused: Si tu as une idée…

En ce qui concerne les biblis, c’est vrai que si on fait un truc avec une interface de 1 mot on pourrait se passer de pas mal de code des bibliothèques Inform (genre, tout Grammar et tous les messages de French/English, et pas mal de parserm.h) et gagner de la place. Cela étant on peut aussi décider de rester sur I6 parce qu’on connaît le langage et parce que le résultat sera jouable sur toutes les plateformes (enfin moi c’est ça qui me fait peur dans le fait de recoder un système). Ou alors il faudrait faire une grosse extension qui condense tout le code de la bibliothèque dans ce cas précis, et on n’aurait même plus besoin d’inclure Parser, Verblib et tout - c’est peut-être ça que tu voulais dire ? Ca me paraît plus compliqué.

Pour l’interface, j’ai lu dans quelques reviews (de Blue Lacuna notamment) que c’était apprécié de certains joueurs : genre tu vois un objet, tu tapes le nom pour en savoir plus, et ensuite seulement tu essaies de faire des actions dessus - apparemment y’en a qui aiment bien. Je sais pas trop ce que tu veux dire par ‹ casser toute la mécanique d’Inform › (c’est juste un truc rattrapé dans UnknownVerb, comme « parlons » et « marchez »), mais bon voilà, si y’en a qui veulent essayer, y’a le code.

Merci pour tes retours en tout cas!

Euh… non ; j’ai pas trop la tête dans Inform.

Non, justement. Il y a énormément de fictions interactives faites notamment en Basic avec des contraintes d’un autre temps. Le compilateur Inform — sans les bibliothèques (toutes les bibliothèques), reste un très bon logiciel pour créer des fictions interactives. Il n’y a pas de raison que ce qui était possible en Basic ne le soit pas avec I6.

Je pensais que tu utilisais BeforeParsing() aussi avec ALLOW_VERBS, mais ce n’est pas le cas.
Ceci dit, dans le cas de DONT_ALLOW_VERBS, cela peut poser des problèmes si tu veux utiliser quand même le verbe ‹ inv › pour avoir accès à un inventaire, ce qui peut être intéressant avec ce type de jeu.

Sinon, plutôt que UnknownVerb(), tu peux utiliser LanguageIsVerb() — voir dans parserm.h :#Ifdef LanguageIsVerb; if (verb_word == 0) { i = wn; verb_word = LanguageIsVerb(buffer, parse, verb_wordnum); wn = i; } #Endif; ! LanguageIsVerb
Tu jetteras un œil dans parserm.h, juste après LanguageIsVerb() : ce que tu veux faire avec avec ALLOW_VERBS, rediriger un noun vers un ##Examine, la bibliothèque le fait déjà avec les directions nseoud, qui sont elles aussi des nouns redirigés vers un ##Go ; c’est le même cas.

!!! J’avais complètement oublié, non seulement l’inventaire, mais aussi les verbes meta genre sauver / charger / recommencer !! Heureusement que tu m’y as fait penser - hop, ajouté à l’extension !
(J’ai dû faire une ‹ general parsing routine › qui fait tous les verbes meta en français et en anglais, pour ceux que ça intéresse ; c’est pas tout fini, il manque quelques verbes de debug, mais bon.)

Je vais regarder LanguageIsVerb, je connaissais pas du tout - merci!

J’ai essayé Glulx et les accents et à part avec ‹ œ ›, je n’ai pas eu de problèmes : http://auraes.free.fr/tmp/accents.inf
À quoi servent les IsAnA(),IsAnE(), etc. ?
(Si tu veux supporter ‹ æ › et ‹ œ › à la saisie, il faut les transformer en ‹ ae › ‹ oe ›.)
update
Pour « ‹ æ › et ‹ œ › à la saisie » inutile de chercher à les dissocier, car la saisie n’est pas en UTF-8. Et de toute façon qui irait saisir ‹ > nœud › au lieu de ‹ > noeud › !?

Ah oui exact pour æ et œ, merci. Je changerai ça quand j’aurai le temps.

IsAnA et tout ont la même fonction que les trucs dans ton switch, mais je les ai aussi utilisées dans LanguageContraction, qui détermine si il faut mettre « le » ou « l’ » (et m’, s’, etc). C’est juste pour réutiliser du code et le rendre plus maintenable. (Et du coup il faut que œ soit reconnu comme un o, pour la contraction, et c’est donc à transforme_lettre ou enleve_accents de rajoute un e en plus… mmh…)