[I6] >acheter x sur y

Bonjour à tous,

Je suis en train de corriger les bugs dans mon jeu « Homeland Security », et je suis tombé sur un problème qui me laisse perplexe, et qui demande peut-être une meilleure connaissance des bibliothèques que celle que j’ai :wink:

Voilà mon problème : mon héros doit acheter un billet d’avion sur Internet. Il est devant un ordinateur, et il n’y a pas d’objet qui réagit au terme « billet » puisqu’il n’en a pas encore acheté. Je voudrais que le joueur puisse « acheter billet », « acheter billet sur Internet » et « acheter billet sur ordinateur ». Je me suis donc dit, plutôt que de coder les verbes salement, je vais essayer de faire joujou avec parse_name :

parse_name [ n w ;
w = NextWord();
if (action_to_be == ##Buy) {	! Reconnaître "acheter billet" sans hardcoder le verbe
 if (w == 'billet') {
  w = NextWord();
  if (w) {
   if (w=='sur') {w = NextWord();} 		! "acheter billet sur..."
   if (w=='Internet' or 'internet') {return 2;}	! "acheter billet sur Internet"
   while (w) {
    if (w == 'ordinateur' or 'ordi' or 'pc' or 'ecran' or 'libre' or 'service' or 'libre-service') {n=n+2;}
    w = NextWord();
    }
   return n;
  }
  else { return 2; }  ! "acheter billet"
 }
}
while (w) {
 if (w == 'ordinateur' or 'ordi' or 'pc' or 'ecran' or 'libre' or 'service' or 'libre-service') {n++;}
 w = NextWord();
}
return n;
],
....
before [; Buy: if (parse-->3 == 'billet') {<<Internet>>;} ],

Dans ce deuxième cas, voilà les réponses que j’obtiens :

>acheter billet
Vous achetez le billet.
>acheter ordinateur
L'ordinateur n'est pas à vendre
(Jusque là, ça va !)

>acheter billet internet
Vous achetez le billet.
>acheter billet sur internet
Merci de reformuler: je n'ai compris que : acheter l'ordinateur

>acheter billet ordinateur
Vous achetez le billet.
>acheter billet sur ordinateur
Merci de reformuler: je n'ai compris que : acheter l'ordinateur

J’ai remarqué que « acheter x sur y » donnait un « merci de reformuler », et ici j’ai l’impression que ce message apparaît presque par défaut (sans même consulter le parse_name, d’après mes tests) : est-ce que la bibliothèque refuse automatiquement toute commande de type « >acheter x sur y », ou est-ce que je m’y prends mal ? Si c’est la bibliothèque, y’a-t’il moyen de la changer tout en préservant la cohérence (par exemple, si y est un supporter ou container et que x est dans y, renvoyer « acheter x ») ou est-ce trop compliqué ? (ça doit être trop compliqué, vu qu’il faudrait dans ce cas revoir toutes les structures >action x sur y où y supporte x…)

Merci de votre aide !

PS: l’autre solution serait de bidouiller avec les verbes :

[code]
Extend ‹ acheter ›

  • ‹ billet › → AchatBillet;
  • ‹ billet › ‹ sur › ‹ Internet › → AchatBillet;
  • ‹ billet › ‹ sur › noun → AchatBilletOrdi

[ AchatBilletSub ;
if (location == salledel’ordi) {<<AchatBillet;>>} else {« Vous ne voyez rien de tel, à moins que… »;}
];

[ AchatBilletOrdi ;
if (noun == ordinateur) {<>;} else {« Vous ne pouvez pas acheter de billet sur » (the) noun;}
// Ou quelque chose comme ça
];
[/code]
J’ai pas essayé, mais ça devrait marcher ; c’est assez moche tout de même, mais si ça résout le problème on va pas chipoter.

à mon avis pour ce genre de truc rapide et spécifique à un jeu, le mieux serait d’utiliser les verbes qui sont prévus pour cela.

En y réfléchissant au calme, je pense que tu as raison : le fait que « > action x sur y » ne soit pas reconnu de manière assez globale (ie pour aucune action que j’ai essayée) me pousse à dire que ce n’est pas un bug, c’est une feature. (Ca doit sans doute mener à des cas particuliers problématiques, tout ça… Ou simplement c’est d’un intérêt limité.) Implanter les verbes est la solution la plus simple et la plus rapide. Du coup, j’ai implanté 16 variantes du verbe « acheter » (4 synonymes de « billet »…) et ça marche !

J’aurais dit comme Otto, ce que tu appelles la solution « moche » est bien moins moche que de bidouiller ParseName :astonished:

C’est ce que j’ai fait, et bon, ça prend de la place dans le code source mais c’est pas très grave.
Et figure-toi que j’ai dû bidouiller ParseName comme un fou pour résoudre tous les bugs du jeu :stuck_out_tongue: (si ce débogage intensif du jeu m’a appris quelque chose, c’est que ParseName c’est super puissant !! ^^)

Merci pour votre aide en tout cas, j’en vois le bout et je pense sortir la version 2 du jeu d’ici la semaine prochaine ! :slight_smile: