[I7]Effectuer une action un tour plus tard

Pour discuter des langages que nous utilisons pour réaliser nos jeux : problèmes, solutions, suggestions...

Modérateurs: Stormi, Otto Grimwald

[I7]Effectuer une action un tour plus tard

Messagepar ciseur68 le Mer Mar 03, 2010 2:26 pm

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 :
Code: Tout sélectionner
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.
-César-
Avatar de l’utilisateur
ciseur68
Investigateur
 
Messages: 79
Inscription: Mer Fév 10, 2010 6:43 pm

Re: [I7]Effectuer une action un tour plus tard

Messagepar Akien le Mer Mar 03, 2010 6:36 pm

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 :

Code: Tout sélectionner
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.
Avatar de l’utilisateur
Akien
Grand Ancien
 
Messages: 298
Inscription: Mer Mai 09, 2007 1:31 pm
Localisation: En Allemagne, en France ou au Danemark, ça dépend

Re: [I7]Effectuer une action un tour plus tard

Messagepar Akien le Mer Mar 03, 2010 6:45 pm

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.
Avatar de l’utilisateur
Akien
Grand Ancien
 
Messages: 298
Inscription: Mer Mai 09, 2007 1:31 pm
Localisation: En Allemagne, en France ou au Danemark, ça dépend

Re: [I7]Effectuer une action un tour plus tard

Messagepar Stab le Mer Mar 03, 2010 8:32 pm

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

Code: Tout sélectionner
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
Avatar de l’utilisateur
Stab
Celui qui attend à l'affût
 
Messages: 126
Inscription: Lun Jan 10, 2005 11:01 am
Localisation: R'lyeh

Re: [I7]Effectuer une action un tour plus tard

Messagepar Akien le Mer Mar 03, 2010 8:44 pm

Héhé, si ça marche j'avoue que Inform 7 a quelques aspects séduisants :)
Mais je n'ai toujours pas le temps de m'y mettre ^^
Avatar de l’utilisateur
Akien
Grand Ancien
 
Messages: 298
Inscription: Mer Mai 09, 2007 1:31 pm
Localisation: En Allemagne, en France ou au Danemark, ça dépend

Re: [I7]Effectuer une action un tour plus tard

Messagepar Otto Grimwald le Mer Mar 03, 2010 10:21 pm

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 ;)

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: Tout sélectionner


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]

Avatar de l’utilisateur
Otto Grimwald
Très Ancien
 
Messages: 3031
Inscription: Mar Aoû 24, 2004 12:02 pm


Retourner vers Questions techniques et aide pour votre code

Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 3 invités

cron