Portes - Actions inversées

Bonjour,

Sous I7, je rencontre un soucis avec la gestion des portes.

Le joueur est dans les jardins.
Une Remise au sud.
Entre les deux, une porte Locked.
La clef se trouve dans les Jardins. ( mais la clef n’est pas dans l’inventaire du joueur )

Le problème est que je me retrouve avec une gestion inversée de la détention ou non de la clef.

Logiquement, j’ai codé que si le joueur ne possède pas la clef, alors il s’affiche " vous n’avez pas la clef"
if the player does not carry KEY3:
say « Vous n’avez pas la clef. »;

Et que si le joueur a la clef , alors la porte s’ouvre :
otherwise if the player does carry KEY3:
now the PORTE-REMISE is not locked;
say "Vous déverrouillez la porte avec la clef

Mais il se passe l’inverse de l’effet attendu :
Je ne prends pas la clef, mais lorsque j’entre la commande " ouvrir porte avec clef", la porte s’ouvre.
Pour que cela fonctionne il faut que j’inverse « does carry » et « does not carry »

Et dans ce cas, après la commande ouvrir, s’intercale le message intempestif (prenant d’abord Clef)

ouvrir porte avec clef
(prenant d’abord Clef)
Vous n’avez pas la clef.

Voici mon code original ( avec l’effet inversé de celui attendu)
Désolé de ces messages à répétition mais je sèche et j’y ai passé presque 4 heures hier à triturer le code dans tous les sens.

[code]Include French by Eric Forgeot.
Use French Language.

JARDINS-DU-PALAIS is a room.

IN-SHED is a room.
The printed name of IN-SHED is « REMISE ».
Understand « remise » as IN-SHED.

PORTE-REMISE is a door.
PORTE-REMISE is scenery.
PORTE-REMISE is lockable and locked.
Understand « porte » as PORTE-REMISE.
PORTE-REMISE is south of JARDINS-DU-PALAIS and north of IN-SHED.

KEY3 is in JARDINS-DU-PALAIS.
KEY3 unlocks the PORTE-REMISE.
The printed name of KEY3 is « clef ».
Understand « clef » as KEY3.

[l’analyse est inversée. déverouille la porte alors qu’il est décclaré la condition "does not carry " ]
Instead of unlocking the PORTE-REMISE with KEY3:
if the player does not carry KEY3:
say « Vous n’avez pas la clef. »;
otherwise if the PORTE-REMISE is not locked:
say « La porte ne semble pas verouillée. »;
otherwise if the player does carry KEY3:
now the PORTE-REMISE is not locked;
say « Vous déverrouillez la porte avec la clef. »[/code]

Là, comme ça, je ne vois pas (mais je n’ai pas testé). Il y a peut-être un problème avec le joueur qui prend la clef automatiquement avant que la règle instead n’aie lieu, ce qui cause un conflit ?

Aussi, il faut écrire « carries » et pas « does carry » (même si les deux fonctionne peut-être, je n’ai jamais vérifié).

Et enfin, la règle instead est de toute façon inutile : étant donné que tu déclare que la clef déverrouille la porte, alors il n’y a pas besoin de le gérer manuellement. Inform se chargera lui-même de vérifier si les conditions sont remplies, de déverrouiller la porte et d’afficher les messages appropriés.

Une fois encore, je ne suis pas hyper sûre de ce que je vais dire, mais je pense que ça vient du fait qu’Inform essaie de faciliter la vie du joueur, en effectuant pour lui certaines actions quand elles sont possibles, et requises pour pouvoir effectuer l’action requise par le joueur. En particulier, si il veut faire quelque chose qui requiert un objet qui est dans la pièce, Inform va le prendre pour le joueur (si c’est possible) avant d’effectuer l’action. C’est l’implicit take.

Par exemple, mettons que je veuille manger un bonbon, dans la vraie vie, je vais juste me dire « je vais manger un bonbon », pas, « je vais ouvrir la bonbonnière, prendre un bonbon, puis seulement le manger », même si, si on veut être précis, c’est ce qu’on fait. Inform émule en quelque sorte ce comportement, et nous permet de ne pas avoir à taper chaque étape.

Là, si tu lui dis « ouvrir porte avec clef », il va regarder si la porte est verrouillée, voir qu’elle l’est, et essayer de la déverouiller. Il sait quelle clef il doit utiliser pour ça, et il se rend compte que le joueur ne l’a pas, mais qu’elle est accessible, il va donc la prendre, avant de réessayer de la dévérouiller, puis de l’ouvrir.

Je te conseil de regarder le paragraphe 18.34 Implicitly taking something, qui t’explique (entre autres) comment empêcher l’implicit take sur certains objets (si tu trouves que ça rend les choses trop faciles) et modifier le message qui apparaît pendant un implicit take si le (prenant d’abord Clef) ne te plaît pas.

Et en soi, vu que tu as écrit « KEY3 unlocks the PORTE-REMISE. », tu ne devrais pas avoir besoin de recoder l’action complètement, la clef devrait fonctionner et afficher des messages par défaut qui sont probablement similaires à ceux que tu as écrit.

EDIT : Le temps d’écrire ce pavé, j’ai été devancée…

J’ai simplifié le code de gestion de porte.

Effectivement, I7 prend automatiquement la clef si elle est située dans la pièce.
Travaillant sur la traduction d’un vieux jeu, il fallait prendre la clef puis ouvrir la porte avec la clef…Plus lourd ( 25 ans d’age) mais j’aurais voulu retraduire cela mais bon…

Par contre il faut conserver le DOOR is UNLOCKED sinon la porte est automatiquement refermée quand le joueur passe la porte !

I7 accepte le « does carry » , le « carries » et aussi le « is carrying » - j’ai testé les trois.

Dans tous les cas, merci pour vos réponses.

[code]Include French by Eric Forgeot.
Use French Language.

JARDINS-DU-PALAIS is a room.

IN-SHED is a room.
The printed name of IN-SHED is « REMISE ».
Understand « remise » as IN-SHED.

PORTE-REMISE is a door.
PORTE-REMISE is scenery.
PORTE-REMISE is lockable and locked.
Understand « porte » as PORTE-REMISE.
PORTE-REMISE is south of JARDINS-DU-PALAIS and north of IN-SHED.

KEY3 is in JARDINS-DU-PALAIS.
KEY3 unlocks the PORTE-REMISE.
The printed name of KEY3 is « Clef ».
Understand « clef » as KEY3.

Instead of unlocking the PORTE-REMISE with KEY3:
if the PORTE-REMISE is not locked:
say « La porte ne semble pas verouillée. »;
otherwise if the player carries KEY3:
say « Vous déverrouillez la porte avec la clef. »;
now the PORTE-REMISE is not locked.[/code]

Oui, plus c’est simple, mieux c’est.

Mais je ne comprends toujours pas pourquoi tu as besoin de garder la règle instead. SI tu la supprimes, tu auras exactement le même comportement (à part peut-être les messages qui ne seront pas les même par défaut), et en mieux car Inform a déjà pensé à tous les cas possibles.

Ça c’est juste bizarre. Par défaut, ça ne devrait pas arriver…

Et désolé, filiaa ! :wink:

Je veux coller au mieux au jeu original que je transcris.
Il faut donc je modifie les messages originaux.

Cela demande pas mal de boulot d adaptation.
Les jeux ont bien evolues depuis 25 ans et faisaient preuve d une certaine lourdeur qui leur ajoute aussi un peu de charme

Pour info les jeux magnetic scroll sont jouables en ligne sur le site suivant
msmemorial.if-legends.org/games.htm/pawn.php

Stephane.

Oui, c’est vrai. Mais si tu veux faire une copie exacte du jeu d’origine, ça ne suffira pas car Inform doit avoir plein de messages différents des anciens jeux.

Sur 6L38, il est très facile de modifier les messages par défaut, ce qui n’est pas le cas sur 6G60 (c’est possible, mais il faut passer par une extension).

Voila, passage à la 6L38 effectué.
Un peu de syntaxe déjà corrigée.

La grosse partie restant à corrigée étant la gestion des objets cachés et des portes.
Mais j’avance.

Bah, du coup, il semblerait que ça soit possible de bloquer l’implicit take.

Inform donne cet exemple :

Rule for implicitly taking the curare: say "Ordinarily you'd pick up the curare in order to be able to do that, but this seems like a good moment for caution." instead.
Là, vu qu’il le bloque pour un seul objet, il met quand même un message pour expliquer au joueur pourquoi son action n’aboutit pas…

Si tu veux juste bloquer ça sans rien afficher, et sur tout les objets, j’imagine que :

Rule for implicitly taking something: do nothing.
ou quelque chose du style, devrait fonctionner. Après j’ai pas essayé encore…

C’est ça, mais à mon avis ce n’est vraiment pas une bonne idée de ne rien dire, du point de vue du joueur…

Et si je veux modifier la règle lorsque le joueur rentre un verbe suivi de rien ?
( la réponse par défaut étant [Pouvez-vous préciser ce qui est concerné par cette action ?]

j’ai essayé avec « nothing » mais ça ne colle pas

Rule for implicitly taking nothing: say "Eh, je ne vous suis pas." instead.

Le implicit take est toujours effectué par Inform lui-même, jamais par le joueur, aussi, je pense qu’il s’exerce toujours sur quelque chose, Inform sait qu’on ne peut pas prendre rien, il n’essayera donc jamais de le faire.

Ce que tu cherches à modifier, c’est le message d’erreur qui apparaît quand on utilise un verbe qui requiert un noun tout seul (par défaut « Pouvez-vous préciser ce qui est concerné par cette action ? »). L’activité en question s’appelle supplying a missing noun. Le chapitre 18.32 explique comment ça marche en détail.
Pour le changer, il faudrait écrire quelque chose du genre :

Rule for supplying a missing noun while taking : say "Eh, je ne vous suis pas.".

Là, ça va changer la phrase juste pour prendre. Ça doit être possible de changer pour tous les verbes concernés à la fois, mais je ne suis pas sûre que c’est une bonne idée, puisque cette activité, dans certains cas, ne se contente pas d’afficher un message d’erreur, et du coup c’est un peu risqué de faire de grosses modifications d’un coup.

Oui, il faut utiliser l’activité que filiaa a indiqué, mais il faut aussi ajouter une ligne de compréhension sans objet pour l’action concernée :

Understand "prendre" as taking.

Du coup, il n’y a presque aucun risque à le généraliser pour toutes les actions, étant donné que la plupart doivent toutes être utilisées avec un objet.

J’imagine que, pour généraliser le comportement sans tout faire à la main, il faut plonger dans I6, mais modifier le parser est toujours dangereux et lourd.

Oui cela fonctionne en créant la ligne « understand … » avant.

Merci