Questions diverses sous GLULX et inform

Oui sur le forum… les boutons citer répondre, … sont long à s’afficher.

Est-il possible en I6 de déplacer un objet dans un container sans le prendre dans son inventaire ?

Par exemple, je souhaite que

mettre truc dans bol

fonctionne. Mon bol est container, et mon objet truc est normal. Avec la commande précédente, il me réponds:

vous devez avoir truc en main avant de pouvoir le déplacer

mais je ne ne souhaite pas que l’objet soit prenable…

Peut-on contourner cela ?

(C’est quoi ce gag avec les smileys ? :astonished: :astonished: :open_mouth: :sunglasses: )

Je pense que tu peux le faire avec Extend sur le verbe mettre.

Un truc du style :

[code]Extend « mettre » first

  • noun ‹ dans › container → Mettre;[/code]

Et un MettreSub qui effectue le travail voulu.

[ MettreSub; move noun to second; print "Vous déplacez ", (the) noun, " dans ", (the) second, "."; rtrue; ];

Bon bien sur faut développer un peu sinon tous les objets pourront aller dans un container.
Tu peux par exemple rajouter if (noun ofclass deplacable), ou un truc du style.

oui cela parait bien comme ça.
Pour ne pas avoir de problème avec les autres objets, tu peux ajouter un attribut « transferable » ou « versable » ce qui te permettra par exemple de verser les corn flakes dans le bol, et ce type d’objets uniquement, sans que le joueur ait à les manipuler.

Pour les smileys, j’en avais fait avec une petite tête de grenouille, c’est un peu petit, mais au moins ça change.

Merci, ça marche. :slight_smile:

Je vais effectivement rajouter un test sur les attributs, sinon je risque d’avoir des surprises.

Euhhh… Comment on rajoute un attribut ? Merci.

Tant que j’y suis, je souhaite dans un bout de code faire en sorte de déplacer un objet dans le lieu où se trouve déjà un objet. J’ai tenté :

move biduleadeplacer to machin.found_in ; 

Mais ça n’a pas l’air de marcher… :cry: j’ai fait afficher directement machin.found_in, il me renvoie 0…

J’avais essayé avec machin.location mais ce ne doit pas être la bonne propriété… si je ne me trompe pas, location est bien l’endroit où est le joueur ?

Avec la commande tree en mode debug, les lieux (et les objets) sont suivis d’un numéro. Dois-je utiliser cela alors ? Apparemment, tout est stocké sous forme numérique… :confused:

Salut,

désolé, j’avais pas les réponses sous la main quand j’ai vu ton message l’autre fois (mes connaissances en inform6 sont un peu rouillées), et j’avais oublié le message ensuite.

Pour les attributs, apparemment les infos c’est ici : inform-fiction.org/manual/html/s3.html#p68

dans ton cas cela pourrait donner ça :

[code]Attribute transferable;

Object cafe « grains de café »
with /…/
has transferable;
[/code]

Et pour le bol tu fais un test genre « if bol has transferable » (je pense)

Pour le second problème, essaye plutôt :

move biduleadeplacer to parent(machin) ;

cf. inform-fiction.org/manual/html/s3.html

Je ne sais pas s’il existe un moyen simple de connaître le lieu dans lequel est un objet, notamment parce qu’un objet peut être à plusieurs endroits à la fois avec found_in. J’espère que tu ne déplaces pas d’objets vers des objets présents simultanément en plusieurs endroits sinon ça risque de compliquer pas mal les choses.
Ce que je ferais c’est partir du modèle objet, et chercher l’objet qui contient l’objet cible (ça peut être un lieu s’il y est directement, mais aussi un conteneur). Il existe sûrement une fonction pour obtenir le parent direct d’un objet, sinon il faut boucler sur tous les objets de type lieu, identifiés par une classe Lieu par exemple, avec objectloop(x ofclass Lieu) et tester s’ils contiennent directement ou indirectement la cible (soit avec « in », qui n’est pas récursif, soit avec IndirectlyContains qui est récursif, fonctionne donc même s’il y a imbrication)

Il existe sûrement une fonction pour obtenir le parent direct d'un objet

voir plus haut : parent(objet)

J’ai pu faire marcher les attributs, merci. :slight_smile:

Par contre, le coup des objets m’a l’air religieusement compliqué. Je vais faire autrement et tenter de contourner le problème.

Pour cela, j’ai juste besoin d’une précision : les conditions ifs prennent-t’elle en compte les parenthèses ? J’ai bien parcouru le DM4, mais je n’ai pas obtenu de réponse claire…

Puis-je faire un truc du genre :

si (ça ET ça ) OU (ça et ça)

A priori oui pour les parenthèses.

J’ai un lieu avec une échelle. Je souhaite que l’on puisse monter à l’échelle.

J’ai rajouté dans les propriétés de l’objet :

[code]before[;
GoUp : print « Vous grimpez à l’échelle »;move player to…;
];

[/code]

Mais quand je tape « monter sur l’échelle »

Il me réponds « Vous ne pouvez pas y monter »… :frowning:

Et est-il possible d’ajouter des synonymes à un verbe sans bricoler les biblis ? Je sais faire en I7 mais pas en I6… merci d’avance.

L’action à intercepter sur l’échelle n’est pas GoUp mais Enter (un coup d’oeil sur la définition du verbe en question dans FrenchG.h le montre).

GoUp c’est si on tape « monter » seul, sans objet.

Pour ajouter des synonymes à un verbe je ne sais pas si c’est facilement réalisable. Le plus simple est peut-être de définir le nouveau verbe avec la même grammaire que son synonyme (grammaire à copier depuis renchG.h)

et pourtant avec parent(objet) c’est très facile, c’est comme si tu indiquais un lieu directement.

Sauf si l’objet est contenu dans un autre objet :wink:
Mais sinon j’appuie la remarque d’Otto.

ah oui effectivement. Il faudrait presque tester si le parent est un container, si c’est le cas, on prend son parent, etc.
C’est plus simple dans inform 7 :slight_smile: → move player to the location of trucmuche.

Donc en gros j’ai juste à coder :

move bidule to parent(objetinitial) ;

Effectivement, c’est très simple :slight_smile: .

Bon ça avance mais j’ai encore des problèmes… (pensez à faire des sauvegardes d’ailleurs quand vous codez !!)

Je cherche à modifier le message qui s’affiche lorsque le joueur gagne ou pert le jeu. J’ai ajouté la sub suivante, mais elle ne marche pas… (« Expected routine name but found DeathMessage »). Je l’ai prise dans le DM4.

[ DeathMessage;
      if (deadflag == 1) 
          print "You have been captured";
];

Ou si vous avez une source à me conseiller…

Tu as sûrement défini DeathMessage trop tard dans ton code, après l’inclusion d’une lib qui doit le définir pour toi si tu ne l’as pas fait.

Existe-il une limitation au niveau de la longueur maximale (en caractères) d’une ligne de code I6 ? J’ai en effet une ligne un peu longue qu’Inform ne veut pas compiler. Il me renvoie une erreur du type « Bare property. self.prop intented ? »… C’est juste une ligne de la forme :

print « blabla […] fin de blabla »;

Je vais tout de même revérifier les lignes d’avant, on ne sait jamais…