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

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]Bidule is a rulebook.
An Bidule:

.

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

[code]Carry out Machinchose:

[code…]
Follow Bidule;

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 !

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]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.[/code]

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

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.

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.

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

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.

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. :slight_smile:

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]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.[/code]

Mais c’est mieux ici d’utiliser des phrases. Ça permet d’avoir des arguments ou de retourner des valeurs :

[code][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.[/code]
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. :slight_smile: 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:

Every turn when le CurrentEnemy is dead: [blabla]

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.

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.

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 :

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 !

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

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 :

To decide what number is double (N - a number): decide on 2 * N.
Et après, on peut écrire des choses comme :

Instead of drinking la potion de vitalité: let vie be les PV of the player; now les PV of the player is double vie.

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

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 ! :smiley: