[Inform 7] Les fonctions, les procédures automatiques

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

Modérateurs: Stormi, Otto Grimwald

[Inform 7] Les fonctions, les procédures automatiques

Messagepar Corax le Mer Juil 06, 2016 8:39 am

Salut à tous !

Me revoilà, non pas avec un problème, j’ai l’impression de très bien m’en sortir pour l’instant, mon projet avance, mais avec l’envie de toujours plus comprendre le langage. Le sujet du jour, ce sont les fonctions, c’est-à-dire des parties de codes à exécuter à la demande, ou de façon automatique, le genre de chose utile pour développer le cœur du système d’un jeu. Le joueur n’est pas impliqué, tout du moins pas directement, il ne s’agit pas d’action déclenchée au clavier.

Actuellement, ce qui me fait office de fonction dans Inform 7, ce sont les rulebook.

Code: Tout sélectionner
Bidule is a rulebook.
An Bidule:
   [code de la fonction].


C’est pratique car très facilement utilisable au sein d’autres procédures.

Code: Tout sélectionner
Carry out Machinchose:
   [code...]
   Follow Bidule;
   [code...]


Mon seul petit souci actuellement, c’est que je ne sais pas comment passer des paramètres, des variables à la fonction telle que construite ainsi. Du coup, si j’ai besoin de variables, je les déclare de façon générale. Bon, après, les dites variables étant importantes, ce n’est pas vraiment un problème.

Voici ma batterie de questions :

Utiliser les rulebook ainsi est-il judicieux ? Si non, y a-t-il plus pratique encore ?
Comment transmettre une variable à la fonction ? Comment renvoyer une variable depuis une fonction ?
Enfin, est-il possible d’automatiser l’exécution d’une fonction ? Par exemple, faire en sorte qu’une partie de code s’exécute sitôt qu’une valeur donnée est modifiée ou qu’une certaine condition a lieu.

Merci d’avance pour vos réponses !
Corax
Grand Ancien
 
Messages: 282
Inscription: Mer Juin 08, 2016 10:00 am

Re: [Inform 7] Les fonctions, les procédures automatiques

Messagepar StephaneF le Mer Juil 06, 2016 11:06 am

Enfin, est-il possible d’automatiser l’exécution d’une fonction ? Par exemple, faire en sorte qu’une partie de code s’exécute sitôt qu’une valeur donnée est modifiée ou qu’une certaine condition a lieu.


Oui. Je ne suis pas le pro d'Inform7 ici, mais voici le genre de choses que je ferais, pour te donner une idée :

(en espérant que j'aie compris ta question...)

Code: Tout sélectionner
A person can be alive or dead. A person is usually alive.
The CurrentEnnemy is person that varies.

DistributionDeLoot is a recurring scene.
DistributionDeLoot begins when the CurrentEnnemy is dead.


Admettons que ton joueur attaque un PNJ : ce PNJ devient " the CurrentEnnemy ".
Admettons qu'il le tue : la scène se déclenche.

Code: Tout sélectionner
When DistributionDeLoot begins :
let T be a random thing in LootPourCadavresRoom ;
move T to the CurrentEnnemy ;
say "Vous fouillez le corps et trouvez : [T].".


Il faut définir ce qui met fin à la scène DistributionDeLoot, mais je pense que tu auras compris la logique du truc.
Dernière édition par StephaneF le Mer Juil 06, 2016 1:17 pm, édité 3 fois.
Avatar de l’utilisateur
StephaneF
Grand Ancien
 
Messages: 545
Inscription: Jeu Déc 27, 2007 3:53 pm
Localisation: Moselle

Re: [Inform 7] Les fonctions, les procédures automatiques

Messagepar Corax le Mer Juil 06, 2016 12:56 pm

Oui, effectivement, c’est possible de procéder comme ça, et dans le cadre de ton exemple, ça devrait bien marcher.

Néanmoins, l’usage des scènes ne me semble pas très indiquées lorsqu’on se retrouve uniquement dans des procédures d’arrière-plan. Je ne crois pas, par exemple, qu’une scène puisse débuter et prendre fin, éventuellement plusieurs fois de suite, entre deux actions du joueur. Quand j’utilise une procédure, son exécution doit être instantanée. Le déclanchement d’une procédure automatique devrait également être instantanée sans quoi ça risque de prédisposer aux bugs.
Corax
Grand Ancien
 
Messages: 282
Inscription: Mer Juin 08, 2016 10:00 am

Re: [Inform 7] Les fonctions, les procédures automatiques

Messagepar StephaneF le Mer Juil 06, 2016 1:18 pm

Je n'ai pas testé, mais regarde si ça marche :

Code: Tout sélectionner
At the time when the CurrentEnnemy is dead :
[ lancer la procédure ]


" is dead " ne marchera sûrement pas, ça doit être un truc du genre " when the CurrentEnnemy dies " , en indiquant au programme ce que signifie " to die " ... Qqun ici doit maîtriser ça.
Avatar de l’utilisateur
StephaneF
Grand Ancien
 
Messages: 545
Inscription: Jeu Déc 27, 2007 3:53 pm
Localisation: Moselle

Re: [Inform 7] Les fonctions, les procédures automatiques

Messagepar Corax le Mer Juil 06, 2016 5:21 pm

Je n’ai pas eu le temps de tester. Mais j’ai vu ta suggestion. Je vais fouiller en ce sens.

En tout cas merci pour tes propositions. :)
Corax
Grand Ancien
 
Messages: 282
Inscription: Mer Juin 08, 2016 10:00 am

Re: [Inform 7] Les fonctions, les procédures automatiques

Messagepar Natrium le Mer Juil 06, 2016 5:49 pm

Pour ce qui est de la question initiale, non, les livres de règles ne sont pas la meilleure solution. Déjà, je crois comprendre que tu crée un livre de règles par fonction, chacun comportant juste une règle ? Il vaut mieux dans ce cas juste écrire des règles qui sont dans aucun livre :
Code: Tout sélectionner
This is the do something very interesting rule: [il faut que le nom finissent par « rule »]
    say "Très intéressant !";

Instead of jumping, follow the do something interesting rule.


Mais c'est mieux ici d'utiliser des phrases. Ça permet d'avoir des arguments ou de retourner des valeurs :
Code: Tout sélectionner
[Sans arguments]
To do something interesting:
    say "Très intéressant !".

[Avec des arguments]
To  announce that (P - a person) finds (N - a number) interesting:
    say "[The P] trouve [N] très intéressant !".

[Retournant une valeur]
To decide what person is the interesting One:
    if a person (called P) carries le badge, decide on P;
    decide on the player.

Instead of jumping:
    do something interesting;
    announce that the player finds 42 interesting;
    now the interested One wears la couronne.

Il faut voir le chapitre 11 pour ça, notamment les sections 11.2, 11.3, 11.14, 11.16 et 11.17.


Il est possible de créer des règles ayant un argument (mais pas plus) ; c'est le cas avec les règles instead et autres, qui s'appliquent à des actions. Il est aussi possible que les règles retournent quelque chose. Mais globalement, les règles sont mieux si on veut avoir un comportement plus modulable (elles peuvent être remplacées, on peut les stocker dans des variables) ou bien pour prendre une décision. Pour ce dernier cas, on suit tout un livre de règles, et on attend que l'une d'elle réagisse. Là il faut lire à peu près tout le chapitre 19.

On pourrais aussi ajouter les activités dans le tas, mais on ne le fera pas. :) Après, c'est aussi un peu subjectif comme choix, c'est à l'usage et en explorant la source d'autres personnes qu'on arrive à choisir ce qui convient.


Pour ce qui est de lancer quelque chose à un moment particulier, je pense qu'Azathoth a raison, il n'y a que les scènes (mais on ne peut pas avoir plusieurs instances d'une scène simultanément). Ou alors il faut utiliser des every turn pour vérifier à chaque tour si quelque chose a changé.

Je ne pense par contre pas que son dernier code fonctionne. Il me semble qu'on ne peut pas tester une condition comme ça. Il faudrait utiliser un every turn:
Code: Tout sélectionner
Every turn when le CurrentEnemy is dead: [blabla]
Avatar de l’utilisateur
Natrium
Grand Ancien
 
Messages: 1165
Inscription: Mar Oct 04, 2011 11:18 pm

Re: [Inform 7] Les fonctions, les procédures automatiques

Messagepar Corax le Mer Juil 06, 2016 6:50 pm

Bien. On dirait que je vais avoir pas mal de lecture. Ceci dit, je pense que je vais juste changer mes rulebook en simple rule pour ce qui a déjà été codé, en tout cas pour la plupart des cas. Les phrases me seront plus utiles dans des cas spécifiques. Encore que bon... à voir.

Sinon, je pense avoir eu mes réponses. Je pourrais continuer à poser des questions, mais ça deviendrait de la palabre sur les concepts d’Inform. Pas sûr que ce soit très constructif.

En tout cas merci, encore une fois.
Corax
Grand Ancien
 
Messages: 282
Inscription: Mer Juin 08, 2016 10:00 am

Re: [Inform 7] Les fonctions, les procédures automatiques

Messagepar StephaneF le Mer Juil 06, 2016 7:29 pm

Non, je pense que toute question est bonne à poser. Lire le manuel est... fastidieux, et tout problème concret est une bonne occasion de se replonger dans les règles de la programmation.
Avatar de l’utilisateur
StephaneF
Grand Ancien
 
Messages: 545
Inscription: Jeu Déc 27, 2007 3:53 pm
Localisation: Moselle

Re: [Inform 7] Les fonctions, les procédures automatiques

Messagepar Corax le Dim Fév 04, 2018 6:13 pm

Salut à tous !

Je déterre ce vieux sujet pour éclaircir un petit point nébuleux. C’est amusant, ça doit bien faire des mois que j’y songe de temps en temps, mais ne m’étant jamais servi du point en question, l’occasion ne se présente que maintenant. ^^

C’est à propos des phrases qui retournent une valeur. Je ne sais pas, il y a toujours un truc qui m’échappe et pourtant, ça a pas l’air bien compliqué. Natrium a donné cet exemple :

Code: Tout sélectionner
To decide what person is the interesting One:
    if a person (called P) carries le badge, decide on P;
    decide on the player.


Quelle est la définition de cette phrase en version minimale, c’est-à-dire en retirant tous les mots qui ne sont là que pour former le langage naturel mais dont le compilateur n’a pas besoin ?
La définition peut-elle accepter des arguments ?

Et après, comment utiliser cette phrase, comment stocker la valeur ?

Puis-je avoir un autre exemple, avec une phrase dont le but est simplement de retourner la valeur qu’elle reçoit en argument, après l’avoir multiplié par 2 ?

Merci d’avance !
Corax
Grand Ancien
 
Messages: 282
Inscription: Mer Juin 08, 2016 10:00 am

Re: [Inform 7] Les fonctions, les procédures automatiques

Messagepar Natrium le Lun Fév 05, 2018 6:49 pm

Pour une phrase retournant une valeur, il faut qu'elle commence par cela, en remplaçant le mot « type » par un type d'Inform (person, number, thing…)

Code: Tout sélectionner
To decide what type is

Ce qui suit est le nom que l'on va utiliser pour faire appel à la phrase.

Et il faut qu'elle contienne « decide on » quelque part pour faire une décision.

Pour les arguments, c'est comme pour les phrases normales, des parenthèses spécifiant le type d'objet attendu et le nom qui sera utilisé dans la phrase pour y faire référence.

Un exemple minimal serait donc :

Code: Tout sélectionner
To decide what number is double (N - a number):
    decide on 2 * N.

Et après, on peut écrire des choses comme :

Code: Tout sélectionner
Instead of drinking la potion de vitalité:
    let vie be les PV of the player;
    now les PV of the player is double vie.
Avatar de l’utilisateur
Natrium
Grand Ancien
 
Messages: 1165
Inscription: Mar Oct 04, 2011 11:18 pm

Re: [Inform 7] Les fonctions, les procédures automatiques

Messagepar Corax le Lun Fév 05, 2018 9:04 pm

Merci Natrium ! ^^
Clair et précis, comme toujours ! :)

Hum, il me semble avoir répondu exactement la même chose dans le sujet précédent. Mais qui puis-je quand c'est clair et précis comme ça ! :D
Corax
Grand Ancien
 
Messages: 282
Inscription: Mer Juin 08, 2016 10:00 am


Retourner vers Questions techniques et aide pour votre code

Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 1 invité

cron