[I7]Donner une quantité à un objet

Bonjour à toutes et à tous :smiley:
Et non, ma disparition n’a pas été due à un abandon du langage I7 mais à mon manque de temps.
Je reviens pour une question qui m’a bloqué lors de mon avancement : j’aimerais que l’on puisse ramasser un fruit, mais qu’il soit toujours présent ensuite dans le « Vous pouvez voir X et Y ».
Merci d’avance :slight_smile:

je n’ai pas très bien compris. Pourrais-tu donner un exemple de code de ton fruit, puis dans quel contexte tu souhaites le voir avec le « vous pouvez voir… »

Alors, voila voila voila ce que j’aimerais qu’on voit :

Voici ce que j’aurais aimé ^^
J’espère avoir été clair cette fois ci :slight_smile:

ok, c’est très clair.

Par contre comme on ne sait pas forcément la finalité de ce choix, j’espère ne pas répondre à côté. Déjà j’imagine que tu veux donner l’impression que c’est rempli de bananes, et que le joueur peut se servir une fois, mais que c’est inutile d’en reprendre plus.
Dans ce cas, on ne va pas travailler sur une classe d’objets, mais sur un objet unique pluriel, et sur un autre qui va le remplacer une fois que tu as le premier en main, pour donner l’illusion qu’il y en a encore. Intellectuellement je trouve cela moins intéressant que de modéliser parfaitement un véritable objet multiple, mais cela permet de simuler ton effet facilement.

Some bananes2 are in void. The printed name of bananes2 is "bananes".

Before taking bananes:
	move bananes2 to location;
	continue the action.

Explications : Ce que j’appelle « void » (l’espace vide) est un lieu que je créé toujours dans mes jeux, qui n’est pas accessible au joueur et qui me sert de « placard » pour mettre des objets en attende ou pour m’en débarrasser. C’est rapide à écrire et à utiliser.

Ici donc une fois qu’on a pris les bananes, on les remplace par un objet qui a l’étiquette « banane », mais qu’on ne peut atteindre en appelant le mot « banane », vue qu’elles s’appellent bananes2. Ainsi quand on demande à prendre les bananes quand on les a déjà, cela donne cette réponse. Les puristes diront que si le joueur avait l’idée de taper « prendre banane2 », cela ferait une sorte de bug, aussi on peut toujours protéger cela en rajoutant une règle genre "instead of taking bananes2, say « Vous en avez déjà assez. ».

Ensuite, on peut également prévoir le cas où on aurait perdu ou mangé ces premières bananes, on devrait pouvoir en reprendre de nouveau, il suffirait donc au moment où on perd ou on lâche ces bananes de les déplacer de nouveau dans la pièce à banane et de retourner banane2 dans void. Bien entendu, cela ne pose pas de problème si la première banane a été définitivement perdues (mangée, volée etc), mais pas si on les dépose quelque part. Dans ce cas, si on lâche les bananes dans une autre pièce, et qu’on revient en prendre dans la première, que se passe-t-il si on retourne ensuite à l’endoit où on a lâché les bananes ? Elles n’y sont plus, ou si on créé un nouvel objet manipulable en tant que banane, indifférencié des premières, on ne pourra plus les manipuler si ils sont dans la même pièce (avec une réponse absurde genre « lequel voulez-vous prendre, les bananes ou les bananes »)

Je vois encore un bogue possible, c’est si on lâche les bananes dans une autre pièce, et qu’on les reprend aussitôt, cela fera apparaître bananes2 dans cette nouvelle pièce.

Aussi pour plus de sureté, on peut écrire :

Before taking bananes: if the location is pièce_à_bananes begin; move bananes2 to location; continue the action; otherwise; continue the action; end if.

Si on est bourrin, il y a plus simple :

Before taking bananes: move bananes2 to pièce_à_bananes; continue the action.

Si on créait une classe d’objet banane, et qu’on en mettait plusieurs en scènes, cela n’indiquerait pas qu’on en a déjà si on en reprenait. Il serait possible de poser des conditions, mais ce genre d’objet multiple est un peu périlleux à mettre en place car on a parfois des réponses inattendues.
Il faudrait que je compare avec un jeu tout en anglais si c’est pareil, et que je me renseigne sur le forum anglophone à ce sujet, pour connaître la bonne utilisation et les résultats attendus.
Ces objets multiples avec classe vont bien lorsqu’on manipule les objets un par un, ou qu’on les prends tous, mais parfois cela fait des clash, par exemple s’ils y en a 30 dans une pièce, par terre, on peut dire « prendre bananes », et cela indique 30 fois : ok, mais si on donne de nouveau cette commande, cela dira « rien n’est disponible ».

Pour créer cela on fait :

A banane is a kind of thing. A banane is female. 

11 bananes are in pièce_à_bananes.

Avec des conditions on peut influer sur son utilisation, mais comme j’ai dit on a des fois de résultats bizarre et il faudrait que je me renseigne plus sur le sujet, car c’est maintenant un sujet de moquerie ici :slight_smile:

Enfin, si tu utilises le code donné plus haut, il y a encore un petit bogue, mais qui semble toucher aussi Inform 6 (à vérifier, en tout cas c’est le même code qu’inform 7 à ce niveau), c’est à dire qu’au lieu de dire « vous les avez déjà », cela va dire « vous l’avez déjà », et c’est incohérent avec le sujet pluriel.

Pour corriger cela, tu peux utiliser ce code qui teste encore plus les conditions (non testé mais cela devrait fonctionner correctement), et est de ce fait plus rigoureux et logique (j’aurais même dû proposer cela en premier…) :

Before taking bananes: if the player is carrying bananes begin; say "Vous en avez déjà suffisamment."; stop the action; otherwise; if the location is pièce_à_bananes begin; move bananes2 to location; continue the action; otherwise; continue the action; end if; end if.

Peut-être même que c’est utilisable avec des objets multiples (à tester)

Pour corriger le truc dans Inform 6, je pense qu’il faudrait écrire dans french.h :

5: if (noun has pluralname) print "Vous les avez déjà.^"; else print "Vous l'avez déjà.^";

:astonished:

Je tiens vraiment à ce que tu saches que je te suis très reconnaissant Otto, tu me donnes des réponses tellement complètes… Un énorme merci, encore une fois :smiley:

Encore une toute petite question sur ce sujet avant de savoir tout ce que je veux… Y aurait-il une ligne de code permettant de placer un objet dans l’inventaire du joueur ?

De rien, quand on a un nouvel auteur, il faut le chouchouter :slight_smile:
J’avais un peu peur que la réponse soit trop confuse, c’est bien si cela a pu t’aider.

En plus cela m’intéresse d’avoir les retours des utilisateurs, et cela me permet de savoir quoi aborder et quels points préciser dans la nouvelle version du tutoriel, donc n’hésite pas à poser des questions.

Pour placer un objet dans l’inventaire, il suffit de dire :

Move objet to player

(« now player is carrying objet » cela devrait fonctionner également, et c’est valable également pour les personnages non joueur)