J’ai commencé à coder une toute petite fiction qui pourra éventuellement servir de préambule à une histoire plus longue, qui se passerait dans un train.
Il y a quelques mois je me suis lu la totalité de l’IBG (Inform Beginner’s Guide) et la moitié du DM4 (Inform Designer’s Manual) de Graham Nelson. Je ne commence pas sans quelques bases, donc, mais je pressens fortement que je vais rencontrer des tas de problèmes que vous avez sûrement déjà résolu, je vais donc utiliser ce fil pour vous poser des petites questions de temps en temps.
effectivement, première erreur, j’ai mis « le » dans le short_name du conducteur. Maintenant je vais tester pour voir comment le faire appeler « le » plutôt que « un ».
avec proper, j’obtiens logiquement « vous pouvez voir conducteur du tramway », donc ce n’est pas encore cela.
En fait la problématique c’est de faire afficher un article défini au lieu d’un article indéfini lors de l’affichage du bonhomme en tant qu’objet présent dans la salle.
Je vais peut-être devoir surcharger le message par défaut pour cet objet par un qui contiendra « (the) » ?
Ou carrément « Le conducteur du tramway vous regarde avec insistance » et basta.
Merci bien, c’est ce « article » qu’il me fallait.
Je m’inspirerai en effet autant que possible des sources publiées par les uns et les autres, mais en gardant un oeil critique sur ce qui pourra me paraître louche
En l’occurrence le « proper » est-il bien nécessaire ? J’ai déjà animate et male, et sans proper j’ai l’impression que cela fonctionne bien. Il y a un vice caché ?
[EDIT] Tiens j’avais justement le DM4 ouvert à la page qui mentionne la propriété « article » et il me dit que c’est là qu’on précise le nom de l’article indéfini pour l’objet. J’ai peur d’un retour de baton d’une telle « triche »
*** Question 2 ***
Le personnage est dans un lieu. Comment faire au plus simple pour que « regarder tramway » ait le même effet que « regarder » tout court ?
*** Question 3 ***
Cette question là est à 100 points car je crois qu’on atteint un certain niveau de difficulté. Nous allons voir si nous sommes à la hauteur. Toute ma considération à celui ou celle qui me donnera une solution.
C’est toujours mon conducteur de tram, j’ai un problème avec sa propriété « name ».
Solution 1 :
name 'conducteur'
Problème : l’expression « conducteur du tramway », utilisée dans la description (et donc susceptible d’être utilisée par le joueur), n’est pas reconnue.
Solution 2:
name 'conducteur' 'du' 'tramway'
Cela résoud le problème de la solution 1, mais en provoque deux nouveaux :
« du » utilisé tout seul est reconnu
« tramway » utilisé tout seul est reconnu et entre en conflit avec l’objet de décor ayant pour nom tramway, et rend ce dernier objet impossible à regarder.
SOLUTION REJETEE
Résoud l’un des problèmes de la solution 2 : tramway n’est plus reconnu, en fait l’objet de décor « tramway » a une plus grande priorité grace au ‹ .x › qui est devant le mot tramway dans le pname du conducteur.
En plus grâce au ‹ .o ›, on peut dire soit « conducteur du tramway » soit « conducteur du tram ».
Mais « du » tout seul reste reconnu, et j’ai du mal à m’en satisfaire. Je pensais que pname.h ferait en sorte que la présence du mot « conducteur » soit obligatoire, mais il semble que ce n’est pas le cas
Solution 4 (envisagée à peine sérieusement) :
Utiliser la solution 3 mais intercepter le « du », en créant un objet caché dont la propriété name vaudrait « du » et avec des réactions qui reprendraient celles qu’on a lorsqu’on essaie d’interagir avec un objet inexistant ? Un peu barbare non ?
Est-ce que quelqu’un a déjà rencontré ce type de problématique, et si oui, comment s’en est-il sorti ?
En évitant le problème (ne pas mettre « conducteur du tramway » dans la description et espérer que le joueur tapera uniquement « tramway », quitte à ce qu’il se prenne une réponse incompréhensible : « >regarder le conducteur du tramway => je n’ai compris que : regarder le conducteur du tramway ».) ?
En utilisant une botte secrète ?
En anglais ce serait plus facile :
pname '.x' 'tramway' 'driver'
et le tour est joué (quoique, si quelqu’un tente « tramway’s driver »…)
Sinon plus généralement pour ces pb d’ambiguité il y a une solution !
J’ai eu le même problème dans Ekphrasis : en effet, à un moment il faut tourner certaines faces d’une statue et donc quand on écrivait :
tourner face sud ouest
le parseur était paumé car il voyait face, sud, ouest…bref
Il fallait écrire :
Object faceso « face sud ouest »,
with parse_name [;
if (NextWord() ~= ‹ face › or ‹ ouest ›) return 0;
if (NextWord() == ‹ sud › && NextWord() == ‹ ouest ›)
return 3;
return 1;
],
…
A toi d’adapter, ca pourra te sortir d’affaire dans d’autres pbs.
Pas de points pour celle-là, chez moi ça ne marche pas.
« conducteur » est reconnu, mais pas « conducteur du tramway ». Est-ce que seul le premier mot est gardé ?
Allez, 100 points pour celle-là ! Cela me sortira en effet sûrement d’affaire ici et dans d’autres situations.
Mais je ne m’imaginais pas devoir jouer avec parse_name dès mon premier jour de codage… C’est tout de même dur pour un débutant en Inform.
Voilà, considérez la question 3 comme également résolue. J’ai ajouté la notion de nom obligatoire et d’adjectif, ce qui résoud mon problème (et par la même occasion j’ai jeté l’extension pname.h qui ne me satisfaisait pas pleinement car pas assez restrictive sur les adjectifs… Ils pouvaient toujours être employés sans le nom). J’ai l’impression de chipoter pour mon conducteur, mais je pense que cela me servira par la suite de savoir distinguer adjectif et nom.
On peut encore dire « regarder le conducteur du », mais ce n’est pas bien grave. Au moins « du » tout seul ne sera pas reconnu, et « conducteur du tramway » le sera.
Voilà comment j’ai fait, si cela peut servir à quelqu’un (j’ai modifié l’exemple du DM4 pour que les « adjectifs » puissent être aussi bien devant que derrière le(s) nom(s) :
Property adjective;
...
[ ParseNoun obj n m;
while (WordInProperty(NextWord(),obj,adjective) == 1) n++; wn--;
while (WordInProperty(NextWord(),obj,name) == 1) m++; wn--;
while (WordInProperty(NextWord(),obj,adjective) == 1) n++;
if (m == 0) return 0; return n+m;
];
et dans les objets [EDIT : la ligne « parse_name » est inutile car ParseNoun est appelée automatiquement par le parser, je l’ai donc commentée]:
On peut l’appeler l’homme du tram, le mec du tramway, le type… comme ça nous chante (voire l’homme tramway…)., mais pas le « tram » ni le « du » ni le « du tram » ni le « tram du »…
Par contre on peut dire « regarder le tramway du homme » mais si ça continue à force de capillotracter je n’aurais plus de cheveux. Bon, à moins que je n’ajoute un jour une contrainte sur l’ordre des mots…