[I7]Effectuer une action un tour plus tard

Bonjour à toutes et à tous.
J’essaye de faire en sorte qu’en mangeant un champignon, un tour plus tard seulement, le joueur s’écroule et meurt. J’ai essayé de le faire grâce à une scène, mais je ne savais pas comment la faire démarrer lorsque le joueur mangeait le champignon, alors j’ai opté pour une autre solution, la voici :

Poison is a number that varies. Poison is 0. Before eating champignons, increase poison by 1. Every turn : Before doing something : if poison is 1 begin; increase poison by 1; continue the action; otherwise; continue the action; end if. Every turn : Before doing something : if poison is 2 begin; say "1"; stop the action; otherwise; continue the action; end if.
La ligne du say « 1 » est un test où j’y remplacerais mon texte et la mort du joueur.
Mon problème est que la seconde action a immédiatement lieu avant même d’avoir manger le champignon, ce qui affiche immédiatement 1.
Je ne suis pas sûr d’avoir été très clair, mais avec un peu de chance, vous comprendrez mon problème grâce au code ^^
Merci d’avance.

Je ne connais pas Inform 7 mais je peux donner une idée pour Inform 6, ça se ressemble sûrement niveau algorithmique.

En Inform 6 j’intercepterais l’action « Eat » dans l’objet champignon pour lancer un timer. Le timer décompte alors de 1 à 0 et une fois à zéro, le joueur meurt.
Ça donnerait quelque chose de ce style :

Object champi "champignon" player // on déclare l'id de l'objet, son nom, son parent with description "Un jouli champignon.", time_left, // on initialise la variable que StartTimer(champi,1) va définir comme valant 1. time_out [; // on précise ce qui se passe quand le décompte est achevé print "Ah ah vous êtes tout mouru.^"; deadflag = 3; // on tue le joueur. ], before [; Eat: StartTimer(champi,1); // on active le timer de l'objet champi avec une durée de 1 (qui se décrémente d'une unité par tour, et active time_out() lorsque le timer atteint 0) move champi to thedark; // thedark est une pièce générique où tout est noir, qui peut bien servir de poubelle. ], has edible; // pour préciser qu'il est mangeable en Inform 6

Voilà, tu utilises Inform 7 donc je ne sais pas si ça te parlera beaucoup, mais il est possible que le schéma soit assez proche.
Sinon Otto te répondra rapidement comme à son habitude je pense.

Une autre possibilité en s’inspirant de ce que tu as codé serait de définir une variable mange inhérente à l’objet champignon, initialisée à false et qui devient true quand on mange le champignon, et de tester à chaque tour si mange is true. Mais niveau exploitation des ressources c’est un test de plus à chaque tour pour peu que le joueur ne mange pas son champi, et ça s’accumule vite quand on a beaucoup d’objets.

J’viens de réussir à faire quelque chose qui pourrait faire l’affaire:

the pièce is a room. "Rien de particulier dans cette pièce."

The poison is in the pièce. "Un étrange petit flacon se trouve sur le sol."
The description is "Un petit flacon avec une étiquette représentant une tête de mort."
Understand "flacon" as poison.

Instead of drinking the poison: 
	remove the poison from play;
	the poison kills in 5 turns from now;
 	say "Beurk !!! Vous vous sentez un peu bizarre tout à coup."

At the time when the poison kills:
	say "Vous sentez un pincement au coeur de plus en plus douloureux. Tout vos muscles s'engourgissent. Vous avez du mal à respirer. Vous finissez par vous effondrez au sol sans vie...";
	end the game in death

Héhé, si ça marche j’avoue que Inform 7 a quelques aspects séduisants :slight_smile:
Mais je n’ai toujours pas le temps de m’y mettre ^^

Bravo Stab, je viens de tester ça fonctionne très bien. Je n’utilisais pas beaucoup ce type construction, et je ne savais pas qu’on pouvait faire quelque chose d’aussi simple et efficace que ça. Avec ce message je suis certain qu’on vient de gagner au moins 3 ou 4 nouveaux utilisateurs d’Inform 7 en France :wink:

La version plus compliquée, c’est avec une scène, comme ça :
(je reprends l’exemple d’un jeu, sauf qu’on est drogué et qu’on s’endort au lieu d’être empoisonné)

[code]

A person can be drugged. A person is usually not drugged.

Drinking coupe is getting drugged. Drinking bouteille is getting drugged.

Instead of getting drugged for the first turn:
now the player is drugged;
say « Vous prenez une gorgée de champagne. ».

Instead of getting drugged for the second turn, say « Vous reprenez une gorgée de champagne. ».

Instead of getting drugged for the third turn, say « Vous reprenez encore une gorgée de champagne. ».

Instead of getting drugged, say « Vous avez déjà trop bu. ». [sous entendu : toutes les autres fois quand ce n’est pas une exception comme les 3 premières fois]

PlayerDrugged is a scene. PlayerDrugged begins when player is drugged for the first turn.

PlayerDrugged ends when the time since PlayerDrugged began is at least 6 minutes. [1 minute = 1 tour, on utilise cela dans les scènes]

When PlayerDrugged ends:
say « Vous finissez par vous endormir. »;
wait for any key;
clear the screen;
move player to oubliettes.

Every turn when PlayerDrugged is happening:
say « [one of]Ce champagne était drôlement fort quand même, il vous a sacrément sonné.[or][or][at random] ». [ça c’est pour dire la phrase une fois sur 3 (il y a une manière plus élégante de le faire également mais là n’est pas la question][/code]