Doc Donjon FI (v3)

Éditeur de fictions interactives avec interpréteur

Outils pour utilisateurs

Outils du site


reference:routines:simple

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentesRévision précédente
Prochaine révision
Révision précédente
reference:routines:simple [2022/10/11 22:43] jonathanreference:routines:simple [2026/06/16 21:50] (Version actuelle) – modification externe 127.0.0.1
Ligne 1: Ligne 1:
 ====== Routine simple ====== ====== Routine simple ======
  
-Une routine simple peut-être réutilisée à l’intérieur d’une autre routine (action, règle, réaction, afin de ne pas avoir à dupliquer certains blocs d’instructions que vous êtes amenés à utiliser à plusieurs endroits différents.+Une **routine simple** est un bloc d’instructions qu’on peut **réutiliser** depuis n’importe quelle autre routine (action, règle, réaction, ou une autre routine simple). Elle évite la duplication de code.
  
-===== Exemples simples =====+===== Définir et appeler une routine simple ===== 
 + 
 +==== Définition ====
  
 <code donjon> <code donjon>
-routine afficherContenuSac +routine remercier: 
-  dire "Votre sac [si le sac contient un objet]contient : [lister objets sac][sinon]est vide.[fin si]";+  dire "« Merci et à bientôt ! »".
 fin routine fin routine
 </code> </code>
 +
 +==== Appel ====
 +
 +Les deux formes ci-dessous sont équivalentes :
  
 <code donjon> <code donjon>
-le magasin est un lieu.+exécuter routine remercier. 
 +exécuter la routine remercier. 
 +</code> 
 + 
 +==== Exemple minimal complet ==== 
 + 
 +<file donjon wiki_routines_routine_simple_min> 
 +Le lieu de test est un lieu. 
 + 
 +routine remercier: 
 +  dire "« Merci ! »". 
 +fin routine 
 + 
 +action saluer: 
 +  exécuter la routine remercier. 
 +fin action 
 + 
 +règle avant commencer le jeu: 
 +  dire "Essayez : {/saluer/}"
 +fin règle 
 +</file> 
 + 
 +[[djnc>wiki_routines_routine_simple_min|tester cet exemple]] 
 + 
 +===== Paramètres typés (''ceci'' / ''cela'') ===== 
 + 
 +Une routine simple peut accepter jusqu’à deux paramètres typés ''ceci'' et ''cela'', déclarés dans un bloc ''définitions:'', et utilisés dans le bloc ''exécution:''. La forme courte (sans étiquette, comme plus haut) reste valide pour les routines sans paramètre. 
 + 
 +==== Types disponibles ==== 
 + 
 +^ Type             ^ Sémantique                                                          ^ Ce qu’on peut passer à l’appel                                                                  ^ 
 +| ''nombre''       | valeur entière, capturée à l’appel (lecture seule)                  | un littéral (''5''), la valeur d’un compteur, une propriété numérique                            | 
 +| ''texte''        | chaîne, capturée à l’appel (lecture seule)                          | une chaîne ''"…"'', l’intitulé d’un élément                                                       | 
 +| ''compteur''     | référence à un compteur (la routine peut le modifier)               | un compteur                                                                                       | 
 +| ''<classe>''     | référence à un élément du type ''<classe>'' (modifiable)            | un élément dont la classe hérite de ''<classe>'' (''objet'', ''lieu'', ''vivant'', ''dragon'', …) | 
 +| ''élément''      | catchall : n’importe quel élément du jeu (objet, lieu, personne, …) | un objet, un lieu, une personne… (le ''compteur'' n’en hérite pas — voir ligne « compteur »)     | 
 + 
 +L’article admis est ''un'' ou ''une'' (paramètre singulier). ''des'' est refusé. 
 + 
 +==== Définition et appel ==== 
 + 
 +<file donjon wiki_routines_routine_param_min> 
 +Le salon est un lieu. 
 +La potion est un objet dans le salon. 
 +Le score est un compteur initialisé à 0. 
 + 
 +routine LancerObjet: 
 +  définitions: 
 +    ceci est un objet. 
 +    cela est un nombre. 
 +  exécution: 
 +    dire "Vous lancez [intitulé ceci] avec [c cela] points de force."
 +fin routine 
 + 
 +routine ajusterScore: 
 +  définitions: 
 +    ceci est un compteur. 
 +  exécution: 
 +    changer ceci augmente de 10. 
 +    dire "Bonus ! Score : [c ceci]."
 +fin routine 
 + 
 +routine notifier: 
 +  définitions: 
 +    ceci est un texte. 
 +  exécution: 
 +    dire "Note : [ceci]"
 +fin routine 
 + 
 +règle après commencer le jeu: 
 +  exécuter routine LancerObjet avec la potion et 5. 
 +  exécuter routine ajusterScore avec le score. 
 +  exécuter routine notifier avec "Bienvenue !". 
 +fin règle 
 +</file> 
 + 
 +[[djnc>wiki_routines_routine_param_min|tester cet exemple]] 
 + 
 +==== Sans bloc ''définitions:'' ==== 
 + 
 +Sans bloc ''définitions:'', la routine n’attend aucun paramètre. ''exécuter routine X avec 5'' sur une telle routine remonte une erreur. 
 + 
 +==== Balises d’interpolation utiles ==== 
 + 
 +Dans le corps d’une routine paramétrée : 
 + 
 +  * paramètre de **classe** (''objet'', ''lieu'', ''personne''…) : ''[intitulé ceci]'', ''[le ceci]'', ''[nom ceci]'', ''[description ceci]'', etc. ; 
 +  * paramètre ''nombre'' ou ''compteur'' : ''[c ceci]'' (valeur), ''[s ceci]'' (« s » si la valeur n’est pas 1) ; 
 +  * paramètre ''texte'' : ''[ceci]'' substitue la chaîne capturée. 
 + 
 +===== Surcharge de routines ===== 
 + 
 +Plusieurs routines peuvent partager le même nom si leur signature diffère (arité ou types des paramètres). Le moteur choisit automatiquement la variante la **plus spécifique** à l’appel. 
 + 
 +<file donjon wiki_routines_routine_surcharge> 
 +Le salon est un lieu. 
 +La pomme est un objet dans le salon. 
 +Le chien est un vivant dans le salon. 
 + 
 +routine logger: 
 +  dire "ZERO."
 +fin routine 
 + 
 +routine logger: 
 +  définitions: 
 +    ceci est un objet. 
 +  exécution: 
 +    dire "OBJ : [intitulé ceci]."
 +fin routine 
 + 
 +routine logger: 
 +  définitions: 
 +    ceci est un vivant. 
 +  exécution: 
 +    dire "VIV : [intitulé ceci]."
 +fin routine 
 + 
 +règle après commencer le jeu: 
 +  exécuter routine logger.                   -- ZERO 
 +  exécuter routine logger avec la pomme.     -- OBJ 
 +  exécuter routine logger avec le chien.     -- VIV (vivant > objet) 
 +fin règle 
 +</file> 
 + 
 +[[djnc>wiki_routines_routine_surcharge|tester cet exemple]] 
 + 
 +**Règles de spécificité** : 
 + 
 +  * Un paramètre de type **classe** bat toujours un paramètre ''nombre'' / ''texte'' sur le même argument (« kind beats depth »). Conséquence : si on surcharge ''nombre'' et ''compteur'' pour le même nom, passer un compteur choisit la variante ''compteur''
 +  * Entre deux paramètres de classe, la classe la plus profonde gagne (''dragon'' > ''vivant'' > ''objet'' > ''élément''). 
 +  * Si plusieurs variantes ont la même spécificité maximale, le moteur renvoie une erreur (ambiguïté) ; il faut alors préciser un type plus spécifique. 
 + 
 +===== Appels différés avec arguments ===== 
 + 
 +Les appels différés (''dans N <unité>'') acceptent eux aussi des arguments : ''exécuter la routine X avec <arguments> dans N secondes''. Les arguments sont résolus **au moment du déclenchement** (et non à la programmation), puis la surcharge est choisie comme pour un appel immédiat. 
 + 
 +→ Voir [[reference:temps:programmer_routine|Programmer une routine]] pour un exemple jouable. 
 + 
 +===== Cas typique : factoriser un affichage ===== 
 + 
 +Une routine appelée depuis plusieurs actions affichant le même message : 
 + 
 +<file donjon wiki_routines_sac_inventaire> 
 +Le lieu de test est un lieu. 
 +Le sac est un contenant dans l'inventaire. 
 +La pomme est un objet vu ici. 
 +La clé est un objet vu ici. 
 + 
 +routine afficherContenuSac: 
 +  dire "Votre sac [si le sac contient un objet]contient : [lister objets sac][sinon]est vide.[fin si]"
 +fin routine 
 + 
 +action ouvrir le sac: 
 +  exécuter la routine afficherContenuSac. 
 +fin action 
 + 
 +action fouiller le sac: 
 +  exécuter la routine afficherContenuSac. 
 +fin action 
 + 
 +règle avant commencer le jeu: 
 +  dire "Essayez : {/prendre la pomme/} puis {/ouvrir le sac/} ou {/fouiller le sac/}."
 +fin règle 
 +</file> 
 + 
 +[[djnc>wiki_routines_sac_inventaire|tester cet exemple]] 
 + 
 +===== Programmer l’exécution d’une routine ===== 
 + 
 +Une routine simple peut être déclenchée après un délai en temps réel : 
 + 
 +<code donjon> 
 +règle après commencer le jeu: 
 +  exécuter la routine alarme dans 30 secondes. 
 +fin règle 
 +</code> 
 + 
 +→ Voir [[reference:temps:programmer_routine|Programmer une routine]]. 
 + 
 +===== Exemple plus consistant : magasin ===== 
 + 
 +Une routine ''remercier'' appelée par deux actions distinctes ''acheter'' et ''vendre''
 + 
 +<file donjon wiki_routines_magasin_remercier> 
 +Le magasin est un lieu
 +L'objet à acheter est un objet vu dans le magasin.
  
 routine remercier: routine remercier:
Ligne 19: Ligne 210:
  
 action acheter: action acheter:
-  dire "Vous achetez lobjet."+  dire "Vous achetez l'objet."
-  exécuter routine remercier.+  exécuter la routine remercier.
 fin action fin action
  
 action vendre: action vendre:
-  dire "Vous vendez lobjet.".+  dire "Vous vendez l'objet.".
   exécuter la routine remercier.   exécuter la routine remercier.
 fin action fin action
-</code>+ 
 +règle avant commencer le jeu: 
 +  dire "Essayez : {/acheter/} ou {/vendre/}."
 +fin règle 
 +</file> 
 + 
 +[[djnc>wiki_routines_magasin_remercier|tester cet exemple]] 
 + 
 +===== Voir aussi ===== 
 + 
 +  * [[reference:routines:|Routines]] — vue d’ensemble des 4 types. 
 +  * [[reference:routines:action:|Actions]] — routines déclenchées par les commandes joueur (acceptent ''ceci'' / ''cela''). 
 +  * [[reference:routines:regle:|Règles]] — routines avant/après un événement. 
 +  * [[reference:temps:programmer_routine|Programmer une routine]] — déclencher une routine après un délai. 
 + 
 +{{tag>routine routines routine_simple exécuter executer appel paramètre parametre paramètres parametres ceci cela surcharge factoriser réutiliser reutiliser différé differe programmer}} 
reference/routines/simple.1665521022.txt.gz · Dernière modification : (modification externe)