[Inform 7] Ordre d’exécution des règles

Bonjour à tous !

Et oui, jamais deux sans trois, comme on dit ! J’espère cependant ne pas trop submerger la section avec mes nouveaux sujets. Si je continue à poser de fréquentes questions, ne serait-il pas plus pratique que je les rassemble dans un topic générique ou que je passe par MP ?

Quoi qu’il en soit, le défi technique du jour est très simple à exposer.

Imaginons que lors du déroulement d’une action donnée, plusieurs règles After s’exécutent. Toutes ses règles comportent la consigne « continue the action », sauf une qui représente théoriquement la fin de l’action.

Comment faire en sorte que cette dernière règle After soit exécutée en dernier ? Si jamais elle s’exécute avant, elle va interrompre la chaîne et donc causer des problèmes.

Bon et tant que j’y suis, une autre question :

Est-il possible de redéfinir le texte par défaut d’une action sans passer par une règle After ?

Je vous remercie d’avance pour vos réponses et pour votre patience. J’espère vraiment ne pas déranger.

Je peux me tromper mais il me semble que dans ce cas, ça suit l’ordre lequel tu as écrit ton code…

Apparemment, non. J’ai déplacé les règles After que je voulais voir exécutées en dernier tout en bas de mon code et le résultat est le même. Elles continues à interrompre la chaîne, empêchant d’autres règles de prendre effet.

tu peux poster ton code ?

[code]After wearing a thing:
now qqch [mettre un équipement modifie les stats du personnage]
continue the action.

After wearing a thing:
dire « J’utilise [le noun]. ». [Pour redéfinir le message par défaut de l’action][/code]

Le problème est illustré par ce genre de configuration. Après, bien sûr, il y a plein de moyens d’y remédier, en rassemblant par exemple les deux règles en une seule. Néanmoins, pouvoir spécifier l’ordre d’exécution des règles permet de rester avec un code très modulaire, très souple.

Il me semble que pour redéfinir une action, il faut utiliser « before », et non pas « after »… Sinon tu auras le message par défaut, puis ton message personnalisé.
Ou mieux, « instead of ». Comme ça pas besoin de préciser : « stop the action ». Et je pense que s’il y a plusieurs règles elles seront toutes exécutées quand même (à vérifier)

Ben en fait, il y a plein de manière de procéder.
Before se produit avant l’action.
Instead se produit pendant l’action.
After se produit après l’action.
Avant, pendant, après, il y a déjà moyen de faire une chaîne claire de trois règles. (En écrivant ces lignes, je me dis que je me prends vraiment la tête pour rien. Je dois un peu trop avoir l’habitude des usines à gaz). Seulement, si lors d’un processus complexe on a besoin de plus de trois règles, on va se retrouver avec plusieurs règles Before, Instead ou After. C’est là qu’il devient utile de savoir dans quel ordre les règles de même niveau s’exécutent, surtout si l’une d’elle est susceptible de bloquer l’action.

Dans mon cas, j’utilise Before pour tester si l’action peut avoir lieu. J’ai plusieurs Before pour plusieurs tests mais peu m’importe dans l’ordre où ils se font. Je sais juste que si un test n’est pas bon, il bloque l’action et balance le texte adéquat à l’échec. Je n’utilise pas Instead pour ne pas devoir coder manuellement le fait d’équiper un objet. J’utilise donc l’action par défaut. J’utilise After pour donner les effets de l’objet sur le joueur. Et hop, si je veux en plus redéfinir le message par défaut d’une action, je me retrouve avec deux After et pour le coup, l’ordre d’exécution importe car si tous mes After permettent à l’action de se poursuivre, je vais avoir en plus le message par défaut, celui-là même que je veux remplacer.

Hum, il y a encore des gens qui lisent ? :slight_smile:

Bref, je cherche juste par mes questions à ajouter des cordes à mon arc, à apprendre de nouvelles instructions.

Tu as bien compris l’utilisation des règles after, before et instead, Corax, sauf pour une chose. :slight_smile: Ces règles sont là pour créer des exceptions dans le comportement « normal » d’une action. Il n’y a pas qu’elles, le tutoriel ne montrait que la base.

After permet de changer une réponse ponctuellement (pour un objet précis, par exemple). Pour changer une réponse par défaut partout, il faut utiliser le système de réponses (sans blague :wink:). Dans ton cas, ce sera :

The standard report wearing rule response (A) is "J'utilise [le noun].".

Ce bout de code peut même être utilisé dans un « now » pour modifier une réponse en cours de jeu.
Pour connaître le nom d’une réponse en particulier, il y a deux moyens : aller dans l’index, dans l’onglet « Actions », cliquer sur l’action voulue puis sur les petites bulles pour avoir les réponses de chaque règle ; ou taper la commande « responses » en jeu. Comme d’hab, la section qui va avec : 14.10.

Pour un effet standard d’action, il ne faut pas utiliser after mais carry out. Donc ta modification de stats doit se passer dans une règle « carry out wearing ». En faisant ces modifications, tu n’auras plus le problème d’ordre des règles. Pour en savoir plus sur les règles carry out, voir le chapitre « Advanced Actions », en particulier 12.9. Grosso modo, il y a 6 livres de règles pour les actions : before, instead et after pour les exceptions, et check, carry out et report pour le comportement normal. Ces trois derniers servent à vérifier si les conditions requises sont réunies, à effectuer les changements et à afficher le message par défaut, respectivement. Donc pour tes tests, il faut utiliser check.

Il y a quand même moyen de changer l’ordre des règles, mais en général il n’y en a pas besoin, Inform les classant généralement comme il faut. Et si on utilise les livres de règles appropriés (comme ici), on enlève beaucoup de problèmes. Si tu veux quand même savoir comment faire, ce sont les sections 19.4 et 19.16.

Enfin, je ne veux pas te décourager, mais faire un RPG (puisqu’il semble que c’est ça que tu fais) de manière efficace, c’est compliqué (c’est aussi ce que j’ai voulu faire dès que j’ai découvert Inform). Ceci dit, si ton système reste relativement simple, ça fait un bon entraînement.

(et au contraire, c’est bien que tu fasses plusieurs sujets — selon moi en tout cas, je ne sais pas pour les admins. Ça donne un peu plus de vie à notre forum pas très actif et ça permet de faire des recherches plus facilement pour savoir si un problème a déjà été résolu. Si tu faisais un gros sujet, ça deviendrait vite n’importe quoi, et par MP, ce serait à l’opposé de l’utilité d’un forum…)

Encore une fois, voilà des explications bien complètes, Natrium.
Je testerai tout ça à tête reposée mais je ne doute pas qu’avec ça, je vais m’en sortir.
En fait, je suis en train de me dire que j’ai pas mal de chose à revoir dans mon code. Ce n’est pas vraiment une surprise, j’ai fait avec ce que je connaissais et du coup, forcément, je tords les concepts pour mes besoins. Le fait est que ça marche quand même très bien. Informe est plutôt souple. Faut juste pas s’y perdre.

Concernant mon projet, je te rassure, il est faisable. Et pour cause, l’essentiel de la mécanique du jeu est déjà codé et fonctionnel. Mes études m’ont pas mal prédisposés à réaliser ce genre de choses. Sinon oui, je vise un RPG, avec des règles simples quand même, avec une dimension donjon crawler également. Je devrais « assez vite » pouvoir réaliser une maquette jouable. C’est le premier objectif. Après, je n’aurais qu’à enrichir le jeu avec plus d’éléments, plus d’histoires.

Au fait, petite question bonus : c’est possible de diviser son code source en plusieurs fichiers ? Je suis encore loin d’en avoir besoin, mais ça me permettrait d’anticiper sur une éventuelle division.

Je commence à connaître la doc par cœur, à force. ^^

Si tu veux avoir des exemples de source de RPG, il y a Reliques of Tolti-Aph, qui est un exemple sur le site d’Inform, et Kerkerkruip, un roguelike. Kerkerkruip est vachement compliqué par contre, et Reliques n’a pas été mis à jour pour 6L38.

Oui, c’est possible. Il faut créer un dossier « Extensions » dans le dossier materials de ton jeu, puis créer un dossier avec ton nom dans le dossier « Extensions ». Tes différents fichiers seront ainsi des extensions, mais propres à ton projet. Kerkerkruip est un exemple de code I7 en plusieurs fichiers.

Ok. Il y a des trucs particuliers à savoir sur les extensions, ou ça se limite à débuter par
« Nom de l’extension » by auteur
Puis à penser à inclure la dite extension au début de la source principale ?

Ho, il faut peut-être les installer au fait, comme les extensions françaises.

Non, il ne faut pas les installer (même si l’IDE te le demande), sinon ça les place dans le dossier spécial réservé aux extensions générales quelque part dans le système. Il faut juste les placer dans le dossier materials, et les inclure comme une extension normale. Pour la syntaxe à suivre, c’est

[code]Version 1/160617 of Blabla by Corax begins here.

Use authorial modesty.

[CODE I7 ICI]

Blabla ends here.[/code]
Il n’est pas obligatoire de mettre un numéro de version, et ce qui est après le slash est la date dans le format AAMMJJ. L’authorial modesty, c’est pour que ça ne liste pas l’extension quand le joueur utiliser la commande « version » (étant donné que c’est une fichier de jeu et pas une vraie extension, pas besoin de te rementionner dans les crédits). Le nom du fichier doit être le même que le titre et le nom du dossier doit être le même que l’auteur.

Sans numéro de version, ça donne

Blabla by Corax begins here.

On peut ajouter d’autres choses, comme une documentation, mais ça ne sert à rien ici. Le dernier chapitre de la doc explique tout ça.

Voilà. :slight_smile:

Je vais finir par devoir te mettre dans les crédits pour toutes tes précieuses explications techniques ! En tout cas, tu me fais gagner un temps précieux. Merci beaucoup !

Tu peux si tu veux, mais si on continue la chaîne, il faudra aussi remercier Otto car il m’a fait découvrir Inform grâce à son tuto, et la plupart des gens sur le forum, qui m’ont aidé. Et au final, je ne fais que redire ce qui est écrit dans la documentation… Il vaudra mieux que tu remercies tes futurs bêta-testeurs.

(et en tant que tel, je suis déjà dans tes crédits, pour l’extension française. C’est moi Nathanaël Marion !)

Oui, en effet. En plus, je le savais, l’ayant lu sur un autre topic de ce forum. Bon ben moi, je vais me pencher sur la rectification de mon code, intégrant ainsi les explications données ici. Sans doute à bientôt pour de nouvelles questions ! :slight_smile: