Bibliothèque (French.h) : pistes d'amélioration

Suite à mes débuts d’abord en tant que beta-testeur et depuis peu codeur enthousiate (c’est le début :slight_smile:) de fiction interactive en français, un certain nombre de problématiques m’ont amené à me pencher sur la bibliothèque francophone de JL.

J’ouvre ce fil pour que l’on puisse y recenser les points que l’on pourrait améliorer dans la bibliothèque afin d’améliorer nos jeux en conséquence, et discuter de ces améliorations.

En espérant que le fil ne sera pas trop « fouillis ». Si besoin on pourra l’organiser en « sommaire » avec des liens vers d’autres fils (si certains points suscitent de la discussion)
Edit : nous avons maintenant un outil permettant de gérer les diverses demandes et propositions qui ne trouvent pas de réponse immédiate dans ce fil : informfr.tuxfamily.org/flyspray/ (sélectionner le projet informfr. L’inscription nécessite une validation manuelle par Otto Grimwald ou par moi-même, que vous pouvez demander sur ce fil. Sauf exception nous sommes très rapides)

NDM (Otto) : voir un (ancien) fil annexe si besoin est :
https://forum.fiction-interactive.fr/t/inform-6-parseur-idiot/129/1

*** 1 - la gestion des pronoms *** [en cours de résolution, bien avancé]

Le fait que « le/la/les » puisse être à la fois un article ou un pronom pose des problèmes gênants.
Ce problème a déjà son fil dédié (en tout cas la fin du fil) : ifiction.free.fr/forumBB/viewtop … =1729#1729

---------- Suite ----------
[30/11/2006] La version 2.1.1 améliore grandement la situation !

*** 2 - Ajout de verbes (verbe retirer) *** [quasiment validé, à faire]
Je suggère l’ajout du verbe retirer à la bibliothèque, en tant que synonyme de « enlever » (pour un vêtement).

Concrètement, ajouter ‹ retirer › en plus de ‹ enlever › et ‹ oter › déjà présents :

Verb 'enlever' 'oter' 'retirer'
* held -> Disrobe
* multiinside 'de'/'du'/'des' noun -> Remove;

Cela vous semble-t-il possible et souhaitable ?

---------- Suite ----------
[01/12/2006] L’avis de JL

*** 3 - affichage d’un <l’> devant <ê> et autres lettres accentuées *** [à valider]

Des caractères peuvent-ils être ajoutés à la fonction LanguageContraction ? Pour tester, j’ai ajouté le caractère ‹ ê › à la fonction, afin que « le être » soit affiché en « l’être ».

[ LanguageContraction text;
  if (text->0 == 'a' or 'e' or 'é' or 'è' or 'i' or 'o' or 'u' or 'h'
                 or 'A' or 'E' or 'I' or 'O' or 'U' or 'H') return 1;
  return 0;
];

Y a-t-il une raison particulière pour ne pas mettre tous les caractères accentués possiblement présents en début de mot dans la liste ?

---------- Suite ----------
[01/12/2006] L’avis de JL

[02/12/2006] Proposition de nouvelle version de la fonction (Samuel)

!*! ajouter d'autres voyelles (à accents) ?
[ LanguageContraction text;
  if (text->0 == 'a' or 'A' or 'à' or 'À' or 'â' or 'Â' or 'ä' or 'Ä'
      || text->0 == 'e' or 'E' or 'é' or 'É' or 'è' or 'È' or 'ê' or 'Ê' or 'ë' or 'Ë'
      || text->0 == 'i' or 'I' or 'î' or 'Î' or 'ï' or 'Ï'
      || text->0 == 'o' or 'O' or 'ô' or 'Ô' or 'ö' or 'Ö'
      || text->0 == 'u' or 'U' or 'û' or 'Û' or 'ü' or 'Ü' 
      || text->0 == 'h' or 'H') return 1;
  return 0;
];

En espérant que cela ne pose pas de problèmes particuliers d’encodage selon le système. J’ai mis des lettres improbables (trouver « Ä » en début de mot, ce n’est pas évident à trouver, mais on ne sait jamais, quelqu’un peut inventer un mot qui commence toujours par une majuscule et qui commence par cette lettre là…

*** 4 - Gestion de « au/aux/à le/à la/à l’ » lors de l’affichage *** [en cours, besoin d’aide]
Je n’ai pas trouvé de moyen simple d’afficher automatiquement « vous faites signe au conducteur » ou « vous faites signe aux voyageurs » ou « vous faites signe à l’homme ».
En effet, en anglais dans tous les cas ce sera « to the » et on ne se pose pas de question.

J’ai donc écrit une petite fonction, probablement améliorable, afin de permettre l’utilisation de code tel que :

print "Vous faites signe ", (to_the) noun, ".^";

La fonction :

Array TabTemp1 -> 255;
Array TabTemp2 -> 255;
! Cette fonction permet d'afficher correctement "à la" "à l'" "au" ou "aux"
! selon le contexte.
! A AMELIORER : REUSSIR A NE PAS UTILISER DE VARIABLES GLOBALES
[ to_the obj;
    if (obj has pluralname) 
    {
        print "aux ";
        obj.short_name.print();
    }
    else 
    {
        !faire un tableau qui ne contient que le premier caractère de short_name
        obj.short_name.print_to_array(TabTemp1);
        TabTemp2->0 = TabTemp1->2;
        if (obj has male && LanguageContraction(TabTemp2)==0) 
        {
            print "au ";
            obj.short_name.print();
        }
        else 
        {
            print "à ", (the) obj;
        }
    }
];

Je ne suis pas complètement satisfait du code. J’ai pas mal galéré avec les tableaux, et je regrette d’avoir à déclarer deux tableaux globaux hors de la fonction. Si quelqu’un sait comment faire mieux…

A améliorer éventuellement : gérer une propriété, si elle est présente, similaire à ‹ articles ›, qui permettrait de spécifier explicitement que l’on dit par exemple « au haricot » et non pas « à l’haricot », pour un objet haricot.

Bref, je ne suis pas certain qu’en l’état actuel cela soit intégrable à la bibliothèque, ni même certain que cela soit souhaitable, mais je serais intéressé d’avoir votre retour.

Un développement similaire pourrait être fait pour « du/de l’/de la/des »…

---------- Suite ----------
[01/12/2006] ça existe déjà pour « du/de la/des », mais ne gère pas encore de cas « de l’ ». Le code de la fonction « to_the », que l’on pourrait d’ailleurs renommer « AAuAux » pour être cohérent, pourrait suivre le même modèle. Je remarque d’ailleurs que mon code ci-dessus ne gère pas les noms propres correctement.

Le code actuel de DeDuDes dans French.h :
(noter l’idée, bien que non opérationnelle pour l’instant, de réutiliser le formatage (the) pour savoir si le mot commence par un l’, plutôt que de tout refaire comme dans ma fonction ci-dessus.)

[ DeDuDes obj; ! ex : descendre... sortir...
  if (obj == player) { print "de vous"; return; }
  if (obj has pluralname)  { print "des ", (name) obj; return;}
  if (obj has female or proper) { print "de ", (the) obj; return;} ! ex : de la voiture, de Paris
  !*! test ci-dessous à effectuer avec @output_stream (ZCode) et avec PrintAnyToArray (Glulx) ?
  ! if ((the)obj="l'...") {print "de ", (the) obj; return;} ! ex : de l'avion
  print "du ", (name) obj; return; ! ex : du train, du Nautilus (le Nautilus ne doit donc pas être considéré comme proper !*!)
];

[01/12/2006] L’avis de JL

*** 5 - ordres aux personnages à l’impératif *** [à étudier]

Actuellement, on peut dire « conducteur, sortir » ou « demander au conducteur de sortir », mais pas « conducteur, sors ».
Si l’on veut pouvoir utiliser cette manière de donner des ordres, la gestion de l’impératif est importante, que cela soit dans nos propres jeux ou dans des traductions de jeux anglophones.

Je suis conscient que ce n’est peut-être pas une mince affaire, et je n’ai pas étudié la question en détail.

--------- Suite ----------
[01/12/2006] L’avis de JL

et bien, quel boulot ! Félicitation pour tes découvertes et projets.

Par contre

il me semble que « au haricot » doit forcément fonctionner (je viens de tester : au haricot et à l’haricot fonctionnent en fait), donc ce que tu voudrais c’est empêcher d’écrire de façon incorrecte en français ? Je pense que ce n’est pas trop un problème dans le sens où les gens ne vont pas s’amuser à taper cela, et bon, s’ils le font par erreur, on dira qui peut le plus peut le moins…

en tout cas c’est super que tu te penches sur la question de l’amélioration de la bibliothèque francophone.

Non, c’est au niveau de l’affichage que je veux un français correct, pas à la saisie : « vous ne pouvez parler au haricot », et non « vous ne pouvez parler à l’haricot ». (code : print « Vous ne pouvez parler », (to_the) noun)

ok, effectivement, l’argument est recevable.
Mais c’est vrai que souvent il vaut mieux essayer de faire des réponses assez générales pour éviter de se retrouver avec des cafouillages dans les articles. En tout cas s’il est possible d’améliorer la bibliothèque pour rendre les réponses plus précises, c’est un bon point.

Hop, j’ai mis à jour les 5 points avec leur statut.

*** 6 - faire la différence entre « et » et « et »*** [à étudier]

En anglais, et donc en français, il y a deux mots séparés en inform pour dire « et » :

  • and (et) => « prends la carotte et le lapin »
  • then (puis) => « prends la carotte puis mange-la »

En français, on a aussi terriblement envie d’écrire cela, peut-être plus qu’en anglais : « prends la carotte et mange-la », qui donne un message d’erreur parce qu’on ne peut pas voir l’objet « mange ».

Dans l’idéal, le parseur pourrait faire la distinction entre « et » utilisé en tant que « and » et « et » utilisé en tant que « puis ».

  • et « then » est suivi d’un verbe (ou d’un pronom, mais après bidouille de JL le pronom repasse derrière le verbe… sauf que ça suppose qu’on ait déjà reconnu « then » pour séparer… l’oeuf ou la poule ?)
  • et « and » est suivi d’un mot désignant un objet.

Est-ce qu’à partir de ça on peut envisager quelque chose ?

---------- Suite ----------
[01/12/2006] L’avis de JL

Superbe, en effet !

*** 2

Oui, pourquoi pas ? Penser à rajouter « retire »/« retirons »/« retirez » dans la fonction UnknownVerb.

A part ça il doit y avoir d’autres verbes à rajouter, je le crains. Les auteurs en rencontrent sans doute aux cours du développement de leur jeu. Une autre manière est de partir de la liste des actions en anglais (comme Disrobe) pour vérifier qu’elles sont formulables en français.

*** 3

A priori aucun problème pour rajouter ‹ ê ›, c’est sans doute un oubli.

*** 4

La fonction me semble compliquée (il faut dire que je ne sais plus trop lire la syntaxe des tableaux en Inform ; en fait je suis un peu rouillé là). Il y a sans doute l’histoire du « h » aspiré ou pas (comme dans « haricot »), qui correspond peut-être à LanguageContraction, même si cette fonction ne semble pas traiter actuellement le problème [Edit: en fait LanguageContraction ne semble être appelée que lorsque la propriété articles n’existe pas].

(sinon pour cette histoire de « h » aspiré, il n’y avait pas déjà une propriété qui gère ça ? revoir le manuel du traducteur [Edit: oui, en fait la propriété articles permet de gérer le cas du « haricot » ; donc au lieu de rajouter une autre propriété il doit suffire de tester cette propriété articles (ou plutôt le résultat de l’affichage de (the) noun ; il faut peut-être écrire dans un buffer pour avoir cela, car obtenir l’article seul n’est peut-être pas possible) à l’intérieur de la fonction AAuAux et d’en déduire l’affichage correct ; mais ce n’est peut-être pas si facile, un peu comme dans DeDuDes le cas « de l’avion » que je n’avais pas codé sur le moment (trop difficile ?)])

*** 5

Ce n’est peut-être pas si compliqué, mais je ne sais pas d’où vient le problème. Il y a une remarque dans LanguageToInformese qui dit que les manipulations sur les tirets ne résolvent rien dans le cas d’un ordre donné à quelqu’un d’autre. C’est peut-être simplement parce que le pronom n’est plus à la première place mais à la troisième, peut-être que c’est plus compliqué que ça.

*** 6

C’est vrai que la solution Inform n’est pas très agréable (« . » pour séparer les actions, « , » interdit). « Puis » n’est pas ambigu à première vue, par contre « et », même si TADS se débrouille, si ça n’a pas été fait en anglais c’est mauvais signe car c’est le même problème. Ou alors c’était pour coller au parseur d’Infocom ?

Info : j’ai mis à jour les 6 « points » avec leur statut, les réponses de JL et autres éléments.

J’ai également fait une proposition de codage pour le point 3.

Sauf avis contraire, dans quelque temps je supprimerai certains messages pour garder le fil bien clair, en ne conservant que les messages de résumé des différents sujets.

Pour le code proposé, si ça ne ralentit pas trop le programme, pourquoi pas. A part ça, pour les retours à la ligne le plus simple et (peut-être) le plus rapide semble être de n’utiliser que des « or » :

!*! ajouter d'autres voyelles (à accents) ?
[ LanguageContraction text;
  if (text->0 == 'a' or 'A' or 'à' or 'À' or 'â' or 'Â' or 'ä' or 'Ä'
      or 'e' or 'E' or 'é' or 'É' or 'è' or 'È' or 'ê' or 'Ê' or 'ë' or 'Ë'
      or 'i' or 'I' or 'î' or 'Î' or 'ï' or 'Ï'
      or 'o' or 'O' or 'ô' or 'Ô' or 'ö' or 'Ö'
      or 'u' or 'U' or 'û' or 'Û' or 'ü' or 'Ü' 
      or 'h' or 'H') return 1;
  return 0;
];

j’ai testé avec que des or, mais la fonction renvoyait alors « 1 » pour un mot qui commence par un « c » ! Je me suis dit qu’il y avait peut-être une limite au nombre de « or ».

Sinon, ça ne devrait pas ralentir l’affichage puisque la fonction n’est pas appelée souvent et ce ne sont que de simples tests. Je pense que ça ne devrait pas ralentir d’une manière perceptible.

Oui, c’est sans doute très proche en terme de vitesse. Ca devrait même donner le même résultat. Bizarre quand même cette histoire, j’essaierai de tester ça un jour. Bref. A moins que le « or » ne fonctionne correctement qu’avec des caractères non-spéciaux, les spéciaux étant peut-être décomposés en plusieurs caractères non-spéciaux, dont le « c » ? (Edit: en fait non, les caractères accentués semblent fonctionner à ce stade comme les autres ; le problème viendrait plutôt du nombre de « or » utilisés) Bref.

J’ai rajouté cette ligne dans la fonction Initialize d’un jeu:

print 'c' == 'a' or 'A' or 'à' or 'À' or 'â' or 'Â' or 'ä' or 'Ä' or 'e' or 'E' or 'é' or 'É' or 'è' or 'È' or 'ê' or 'Ê' or 'ë' or 'Ë' or 'i' or 'I' or 'î' or 'Î' or 'ï' or 'Ï' or 'o' or 'O' or 'ô' or 'Ô' or 'ö' or 'Ö' or 'u' or 'U' or 'û' or 'Û' or 'ü' or 'Ü' or 'h' or 'H';
Cela fait planter le compilateur. La ligne la plus longue qui a fonctionné est celle-ci :

print 'c' == 'a' or 'A' or 'à' or 'À' or 'â' or 'Â' or 'ä' or 'Ä' or 'e' or 'E' or 'é' or 'É' or 'è' or 'È' or 'ê' or 'Ê' or 'ë' or 'Ë' or 'i' or 'I' or 'î' or 'Î' or 'ï' or 'Ï' or 'o' or 'O' or 'ô'; ! or 'Ô' or 'ö' or 'Ö' ! or 'u' or 'U' or 'û' or 'Û' or 'ü' or 'Ü' ! or 'h' or 'H';
Cela affiche le chiffre 0 (pour « faux »).
Bref je vais poser la question sur rec.arts.int-fiction pour voir si le problème est connu.
(Edit: la question est disponible sur groups.google.com/group/rec.arts … f3e4080efe )
En attendant, ce que tu proposes est sans doute la meilleure solution.
(Edit: ceci semble confirmé dans la discussion mentionnée ci-dessus)

Finalement pour « or » il s’agissait d’un bug connu du compilateur 6.30. La version 6.31 n’a pas ce problème. La limite au nombre d’éléments est bel et bien 27 :
inform-fiction.org/patches/C63013.html

Il y a un petit problème avec la mise à jour des bibliothèques pour I7 windows… voici ce que me renvoie I7:

Je ne vois pas trop ce qu’il se passe… mais j’ai eu aussi un pb avec le fichier batch. (il manquait 2 fichiers à copier)

quels fichiers manquait-il ?