Combiner des objets avec Inform 7

Bonsoir à tous,

Comme je l’avais annoncé il y a maintenant quelques mois, je travaille sur l’écriture d’une adaptation du jeu vidéo Largo Winch sous Inform 7. Après avoir bien avancé sur la chose, je rencontre un petit souci!

J’aurais besoin de combiner 2 objets afin d’en obtenir un troisième. Après avoir effectué une petite recherche, j’ai créé une action avec le code suivant:

Combining it with is an action applying to two things.

Ensuite, j’ai tenté d’utiliser une règle instead of afin de retirer les 2 objets concernés au joueur pour lui confier l’objet créé.
La compilation du projet s’est bien passée mais ça ne fonctionne pas en jeu. Lorsque je tape la commande « Combiner A avec B », j’obtiens le message: Vous ne pouvez pas utiliser plusieurs objets avec ce verbe.
Je ne parviens pas à trouver la solution…
J’ai donc besoin d’un petit coup de pouce!

Vous en remerciant par avance,

Loïc

Tu as dit que tu as créé l’action avec :

Combining it with is an action applying to two things.

Mais as-tu ajouté une ligne de compréhension ? Comme cela :

Understand "combiner [a thing] with [a thing]" as combining it with.

Parce que le message que tu obtiens vient vraisemblablement d’un problème avec les lignes « understand » associées à l’action. Si tu nous disais lesquelles tu as écrites, on pourrait t’aider.

J’ai passé un peu de temps à réfléchir sur le problème parce que je trouvais ça intéressant de le résoudre pour peut-être l’ajouter dans mon jeu en cours.

Voici donc ce que j’ai pu faire :

[code]« assemblement » by Landry

Section objets et lieu

The salon(m) is a room.
A brosse(f) is in the salon.
A manche(m) is in the salon.
the balai is something.

Section action assembling

Assembling is an action applying to two carried things. Understand « assembler [something] avec [something] » as assembling.

table of assemblement
recette resultat description
{manche, brosse} balai « Vous insérer le manche dans la brosse et voici un balai fonctionnel ! »
{brosse, manche} balai « Vous insérer le manche dans la brosse et voici un balai fonctionnel ! »

Z is a list of objects that varies.

carry out assembling :[effectuation de l’action assembling]
truncate Z to 0 entries;[réduire la liste Z à 0 entrées]
add the noun to Z;[ajouter le premier nom tapé dans la commande à la liste Z]
add the second noun to Z;[ajouter le second nom tapé dans la commande à la liste Z]
if there is a resultat corresponding to a recette of Z in the table of assemblement:[s’il y a un résultat qui coreespond à la liste z dans la table d’assemblement]
say « [a description corresponding to a recette of Z in the table of assemblement] »;
Now the player is carrying the resultat corresponding to a recette of Z in the table of assemblement;[maintenant le joueur porte le balai]
Now the noun is part of the resultat corresponding to a recette of Z in the table of assemblement;[maintenant le manche est une partie du balai]
Now the second noun is part of the resultat corresponding to a recette of Z in the table of assemblement;[maintenant la brosse est une partie du balai]
otherwise:
say « Vous ne parvenez pas à assembler [the noun] avec [the second noun] »;
stop the action.

test me with « actions/take brosse/take manche/assembler manche avec manche/assembler brosse avec manche/i ».[/code]

J’ai fais le choix lorsque l’action assembler est effectuée de faire en sorte que les objets de départ deviennent des parties de l’objet d’arrivé, ainsi ils ne disparaissent pas et on peut envisager de faire une action désassembler…

Bon je pense que le code n’est pas hyper élégant et qu’il y aurait pas mal d’amélioration à lui apporter mais ça fonctionne à peu près. Je ne sais pas ce que les anciens en dirons, j’aimerais bien avoir un retour pour savoir comment il peut être amélioré, en tout cas n’hésite pas à t’en service si il te convient.

Ma réponse est assez longue, alors je tiens tout d’abord à préciser que tout ce code n’est pas nécessaire par rapport à la question initiale si les combinaisons ne sont pas un élément clef du jeu. Dans ce cas, on peut juste bloquer l’action avec une règle check et gérer les cas où ça fonctionne avec des instead.

Pour répondre à Landry :

Ton code est pas mal ! C’est une bonne idée de mettre une liste dans un tableau si on veut systématiser le truc. Cependant, comme chaque combinaison ne peut contenir que deux éléments (et pas un nombre indéterminé), ce serait peut-être mieux d’à la place écrire deux colonnes, chacune correspondant à un élément. Il faudrait aussi pouvoir éviter de spécifier deux fois chaque recette, sauf bien sûr si l’ordre des objets peuvent mener à des résultats différents.

Du coup, je le verrais plutôt comme suit :

  • On parcourt le tableau.
  • Si le premier ingrédient de la ligne en cours est le noun et le second ingrédient est le second noun, ou bien si le premier ingrédient est le second noun et le second ingrédient est le noun, on effectue la combinaison, comme tu l’as fait.

Si tu veux vraiment garder la liste, ce serait mieux de transformer la liste de « travail » en variable d’action, plutôt que de la mettre en variable globale, ça fait un peu plus « propre » et plus flexible.

Aussi, dans l’idéal, pour suivre les conventions d’Inform, il aurait été mieux de mettre la réponse quand ça ne fonctionne pas dans un règle check.

Enfin, pour la question du désassemblage, ça peut poser problème de garder les ingrédients en jeu, parce que le joueur pourra toujours interagir avec eux. On pourrait simplement utiliser deux propriétés sur les produits qui contiennent les ingrédients, ou utiliser des relations.

D’ailleurs, plutôt que d’utiliser un tableau, j’aurais peut-être utilisé des relations pour tout, en fait. Je n’ai pas testé, mais ça donnerait quelque chose de ce genre :

[code]Composition relates various things to various things.
The verb to be made of means the composition relation.
The verb to make means the reversed composition relation.

Le balai is made of le manche. Le balai is made of la brosse.

The combining action has a thing called the combined object.

Setting action variables for combining:
if something (called product) is made of the noun:
if the product is made of the second noun:
now the combined object is the product;
else:
now the combined object is the player.
[on va utiliser le joueur pour détecter si la combinaison ne mène nulle part.]

Check combining something with something:
if the combined object is the player, say « Vous ne parvenez pas à assembler [the noun] avec [the second noun] » instead;

Carry out combining:
now the player carries the combined object.[/code]
Et pour une éventuelle action pour récupérer les objets, il faudrait vérifier comme cela :

repeat with T running through things that make the noun: now the player carries T; now the noun is nowhere.
Bien sûr, un tableau peut être mieux en fonction du projet, mais les relations font peut-être un peu plus « informien ».