Je m'y mets, et je vais avoir besoin d'aide :)

oui mais dans ce dernier cas personne n’aura l’idée de taper cela. Et dans le cas où qqu’un le ferait (faute de frappe…), il n’ira sans doute pas se plaindre que cela n’est pas cohérent !

Oui je me rends compte que je titille un peu trop. Mais j’aime ma distinction adjectif/nom :slight_smile:

Joli travail!! J’aime bien aussi cette distinction!

Par contre, je remarque avec amertume que ni « gars du tram », ni même « traminot » ne fonctionnent dans ton jeu. C’est nul.

Merci, mais je n’ai fait que suivre le manuel :wink:. En revanche en relisant le chapitre concerné dans le DM4 je me suis rendu compte que mon implémentation n’est pas optimale : je ne devrais pas avoir à mettre de parse_name dans les objets, puisque ParseNoun est sensée être appelée automatiquement.

Vous l’attendiez avec impatience le moment où vous pourriez stormiser, hein, avouez tous !
Ok, je note et j’améliore :slight_smile:. On pourra même dire le traminot du tram si tu veux.

Bon, après deux jours sur le tram et son conducteur qui a un rôle on ne peut plus restreint, je vais essayer de me bouger et d’avancer sur la suite. C’est qu’on peut en passer du temps à peaufiner (mais le résultat est tellement mieux :slight_smile:) !

Au sujet de la propriété « adjective » et de sa prise en compte, j’ai dû modifier une fonction de parserm.h à l’aide de la directive Replace :

Dans votre code :

Avant l’inclusion de Parser.h :

Replace Identical;

et après l’inclusion de Parser.h :

! Cette fonction est recopiée de parserm.h, avec un ajout pour tenir
! compte de la propriété adjective.
[ Identical o1 o2 p1 p2 n1 n2 i j flag;
    if (o1 == o2) rtrue;  ! This should never happen, but to be on the safe side
    if (o1 == 0 || o2 == 0) rfalse;  ! Similarly
    if (parent(o1) == compass || parent(o2) == compass) rfalse; ! Saves time

    !  What complicates things is that o1 or o2 might have a parsing routine,
    !  so the parser can't know from here whether they are or aren't the same.
    !  If they have different parsing routines, we simply assume they're
    !  different.  If they have the same routine (which they probably got from
    !  a class definition) then the decision process is as follows:
    !
    !     the routine is called (with self being o1, not that it matters)
    !       with noun and second being set to o1 and o2, and action being set
    !       to the fake action TheSame.  If it returns -1, they are found
    !       identical; if -2, different; and if >=0, then the usual method
    !       is used instead.

    if (o1.parse_name ~= 0 || o2.parse_name ~= 0) {
      if (o1.parse_name ~= o2.parse_name) rfalse;
      parser_action = ##TheSame; parser_one = o1; parser_two = o2;
      j = wn; i = RunRoutines(o1,parse_name); wn = j;
      if (i == -1) rtrue;
      if (i == -2) rfalse;
    }

    !  This is the default algorithm: do they have the same words in their
    !  "name" (i.e. property no. 1) properties.  (Note that the following allows
    !  for repeated words and words in different orders.)

    p1 = o1.&1; n1 = (o1.#1)/WORDSIZE;
    p2 = o2.&1; n2 = (o2.#1)/WORDSIZE;

    !  for (i=0 : i<n1 : i++) { print (address) p1-->i, " "; } new_line;
    !  for (i=0 : i<n2 : i++) { print (address) p2-->i, " "; } new_line;

    for (i=0 : i<n1 : i++) {
        flag = 0;
        for (j=0 : j<n2 : j++)
            if (p1-->i == p2-->j) flag = 1;
        if (flag == 0) rfalse;
    }

    for (j=0 : j<n2 : j++) {
        flag = 0;
        for (i=0 : i<n1 : i++)
            if (p1-->i == p2-->j) flag = 1;
        if (flag == 0) rfalse;
    }


 ! DEBUT MODIFICATION POUR LES ADJECTIFS
 ! test sur la propriété adjective :
 ! deux objets qui ont le même "name" mais
 ! pas le même "adjective"
   if ((o1 provides adjective) ~= (o2 provides adjective)) 
    rfalse;

  if (o1 provides adjective && o2 provides adjective) 
  { 
    n1=(o1.#adjective)/WORDSIZE; n2=(o2.#adjective)/WORDSIZE;

    ! If there are a different number of words in the pname
    ! properties, they are distinguishable.
    if (n1 ~= n2) 
      rfalse;

    p1=o1.&adjective; p2=o2.&adjective; 

    for (i=0 : i<n1 : i++) 
    {
        flag = 0;
        for (j=0 : j<n2 : j++)
            if (p1-->i == p2-->j) flag = 1;
        if (flag == 0) rfalse;
    }

    for (j=0 : j<n2 : j++) 
    {
        flag = 0;
        for (i=0 : i<n1 : i++)
            if (p1-->i == p2-->j) flag = 1;
        if (flag == 0) rfalse;
    }
  }
 ! FIN MODIFICATION POUR LES ADJECTIFS

    !  print "Which are identical!^";
    rtrue;
];

Cette modification est nécessaire si deux objets partagent la même propriété « name » et ne sont différenciés que par la propriété « adjective ».

Exemple :

  1. name ‹ conducteur ›, adjective=‹ du › ‹ tramway ›
  2. name ‹ conducteur ›, adjective=‹ du › ‹ train ›
    => sans cette modification, « regarder conducteur » ne demandera pas de précision mais affichera la description du premier défini dans le code.
    Avec la modification de la fonction Identical, on aura le comportement attendu : « préciser : le conducteur du tramway ou le conducteur du train ? »

(Note à moi-même) L’extension scenic.h répond à cette question.