====== Routine simple ====== 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. ===== Définir et appeler une routine simple ===== ==== Définition ==== routine remercier: dire "« Merci et à bientôt ! »". fin routine ==== Appel ==== Les deux formes ci-dessous sont équivalentes : exécuter routine remercier. exécuter la routine remercier. ==== Exemple minimal complet ==== 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 [[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 | | '''' | référence à un élément du type '''' (modifiable) | un élément dont la classe hérite de '''' (''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 ==== 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 [[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. 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 [[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 '') acceptent eux aussi des arguments : ''exécuter la routine X avec 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 : 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 [[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 : règle après commencer le jeu: exécuter la routine alarme dans 30 secondes. fin règle → Voir [[reference:temps:programmer_routine|Programmer une routine]]. ===== Exemple plus consistant : magasin ===== Une routine ''remercier'' appelée par deux actions distinctes ''acheter'' et ''vendre''. Le magasin est un lieu. L'objet à acheter est un objet vu dans le magasin. routine remercier: dire "« Merci et à bientôt ! »". fin routine action acheter: dire "Vous achetez l'objet.". exécuter la routine remercier. fin action action vendre: dire "Vous vendez l'objet.". exécuter la routine remercier. fin action règle avant commencer le jeu: dire "Essayez : {/acheter/} ou {/vendre/}.". fin règle [[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}}