Nouvelle extension scenic5sens.h

Dans le cadre des bugs firthworks.com/roger/downloads/scenic.h ), qui permet d’ajouter des descriptions sur des éléments du décor dans une propriété « scenic » de la salle dans laquelle on les voit.

Exemple :

       Object  forest "Forest"
         with  description "The forest...",
               name 'forest' 'wood',
               scenic  'tree' 'trees' 0 "The trees tower over you."
                       'shrub' 'shrubs' 0 "The shrubs don't."
                       'moss' 0 "The moss cowers under everything.",
               etc... ;

Cela permet d’ajouter de nombreux détails sans nécessiter la création d’un objet par élément du décor !

Autre avantage de cette extension, on peut en bonus taper « examine forest » qui aura le même effet que « look ». Normalement, en inform, la propriété name d’un lieu contient tous les objets sans importance, donc dans notre exemple, sans l’extension scenic.h, « examine forest » nous renverrait « You don’t need to refer to that ».

Malheureusement, l’extension se limite aux descriptions visuelles et ne permet pas d’utiliser le même mécanisme pour les autres sens (ouïe, toucher, odorat, goût). J’ai donc amélioré l’extension de base en une nouvelle extension « scenic5sens », que je propose d’intégrer au projet Lieux Communs (en fait c’est déjà fait, il ne me reste qu’à faire le commit).

Voici un exemple de code, tiré de lieux communs :

Object rive "Le long de la rivière." class Lieu
with 
    name 'rive',
    scenic_all
        'nuee' 'nuees' 'volutes' 'tentacules' 'engoulevent' 'insecte' 'insectes' 'ombre' 'ombres' 'oree' 'bois' 'houe' 'houes' 'peinture' 'motif' 'motifs' 'sable' 0 NULL,
    scenic_look
        'flot' 'flots' 'eau' 'eaux' 'riviere' 'fleuve' 0 "Alors que regarder l'eau couler avait jusqu'ici toujours eu un effet apaisant sur mon esprit, cette eau là avait sur moi un effet différent : étrange, presque effrayant."
        'couchant' 'soleil' 'crepuscule' 0 "La nuit n'allait pas tarder à tomber.", 
    scenic_smell
        'fruit' 'fruits' 'murs' 'pourris' 0 "Une odeur suave, sucrée, qui m'aurait presque donné envie d'y goûter."
        'mer' 'ocean' 'rumeur' 'saline' 0 "L'odeur de la mer était imprécise, noyée dans les autres odeurs de cet endroit. Etait-ce mon imagination qui me la faisait sentir ?",
    scenic_listen 
        'flot' 'flots' 'eau' 'eaux' 'riviere' 'fleuve' 0 "Curieusement, cette eau ne produisait aucun bruit en coulant."
        'chien' 'chiens' 0 "Les aboiements étaient lointains, mais inquiétants.",
    scenic_touch
        'flot' 'flots' 'eau' 'eaux' 'riviere' 'fleuve' 0 "Je glissai ma main dans l'eau. Elle était fraiche et agréable, mais quelque chose m'invitait à ne pas m'éterniser. Je la retirai à regret."
        'sable' 0 "J'avais trop peur d'en voir sortir un serpent pour oser y promener ma main.",
    scenic_taste
        'fruit' 'fruits' 'murs' 'pourris' 0 "J'avais faim, certes, mais pas au point de manger ces fruits pourris !",
    description [;
        Affiche(1);Joue(2);"^Voici où nous mènent nos pas, lorsqu'on les confie à nos pensées dérivantes...^^Las d'un voyage 
        où seules les parts obscures de mon imagination en étaient les étapes, je me trouvai malgré moi loin de tout, sur les rives d'un fleuve
        charriant des eaux sombres vers un Océan dont la rumeur saline me parvenait indistinctement.";
    ],
   ...

et voici un exemple de transcript :

Quelques remarques :

  • la propriété name des objets de lieux doit ne contenir que les mots qui désignent directement le lieu (dans notre exemple, c’est « rive », donc « regarder rive » sera équivalent à juste « regarder »),
  • les descriptions des éléments du décor cités dans scenic_all sont les mêmes quel que soit le verbe de « sens », sauf si une description est présente dans un autre scenic_xxx plus précis,
  • il est possible de remplacer les descriptions par des appels à des fonctions (fonctions à créer en dehors de l’objet),
  • Lorsqu’il y a « NULL » au lieu d’une description, c’est le message standard « Cela n’avait pas la moindre importance » (message MISC 39) qui est affiché,
  • un élément « scenic » ne peut contenir que 32 éléments maximum (la limite est vite atteinte !),
  • toute action sur un objet visible présent dans scenic_all, scenic_look, scenic_touch ou scenic_taste (pour listen et smell, je considère que l’objet n’est pas forcément visible, voir ci-dessous) ne provoquant pas l’affichage d’une description, provoquera l’affichage du message standard « Cela n’avait pas la moindre importance »,
  • un objet que l’on peut sentir (respectivement entendre), mais non cité dans « scenic_all » ou « scenic_look » ou « scenic_touch » ou « scenic_taste », sera considéré comme absent pour toute autre action que sentir (respectivement entendre) et on aura donc un message « Nulle chose de ce nom ne se trouvait ici ». C’est le cas dans l’exemple ci dessus pour l’océan et les chiens.
  • Les « 0 » ne sont là que comme séparateurs entre les mots et la description.

[b]Je propose donc l’intégration définitive de cette extension dans le projet Lieux Communs et son utilisation pour tous les objets de type « lieu ».

Mais avant cela, j’ai besoin de vos remarques, parce que c’est tout de même une modification assez intrusive (quoique en même temps simple).[/b]

moi cela me semble très bien ! Félicitation pour l’idée et la modif.
Cela ne me semble pas si intrusif car on peut intégrer progressivement les lieux, un lieu non référencé avec scenic continuera à fonctionner comme avant il me semble.

Presque. Il y a juste le changement (optionnel d’ailleurs) sur la gestion de la propriété « name » du lieu.

concrètement, cela donne quoi ? Sinon tu peux faire le commit avec l’extension, de toute façon si cela pose vraiment pb (mais j’en doute), on peut toujours le désinclure temporairement en commentant la ligne d’inclusion.

Concrètement, sans l’extension, tout ce que tu mets dans le « name » d’un lieu désigne des éléments du décors pour lesquels tu n’as pas mis de description.

Avec l’extension, tu ne mets dans « name » que ce qui désigne le lieu lui-même (comme pour les autres objets quoi), et le reste des objets tu les mets dans l’un des « scenic », avec la valeur « NULL » si tu n’as pas de description à leur donner.

De toutes façons, ce comportement là est paramétrable par une variable.

Adjugé pour le commit, je le fais ! [Edit : argh, j’ai encore un conflit ! C’est le deuxième aujourd’hui sur cpb.inf :slight_smile:]

Voilà, c’est fait.

Je vais faire un nouveau commit, c’est imminent, afin de fournir un moyen de dépasser la limite de 32 éléments par attribut « scenic_xxx », si vite atteinte en cas de décor riche.

Lorsque la limite est dépassée pour scenic_look, par exemple, ajouter une propriété scenic_look2 à l’objet.

On peut ainsi aller jusqu’à 4, et c’est valable pour chaque scenic_xxx.

cette extension est géniale, et tes modifications très pratiques également, voire même indispensable pour ajouter justement tout le piment à l’aventure.

J’ai un truc un peu bizarre, si j’ai cela dans le code :

scenic_look 'hiéroglyphes' 'gravures' 'statues' 0 "Des motifs gravés dans les murs, qui avaient certainement une signification dans une langue que je ne voulais pas connaître." 'blocs' 'verdatre' 'monolithes' 0 "Ces blocs d'une couleur écoeurante semblaient disposés selon un ordre inconnu et défiant toute harmonie humaine.", scenic_touch 'hiéroglyphes' 'gravures' 'statues' 0 "Tout ceci était disposé bien trop haut pour ma pauvre taille humaine, et c'était hors d'atteinte.",

j’obtiens cela, ce qui semble normal :

mais avec scenic tout seul, ou scenic_all, à la place de scenic_look on obtient cela :

cela ne réagit pas vraiment comme tu avais dit, il faut définir explicitement les objets avec scenic_look.

Je suis assez d’accord pour pouvoir avoir des objets uniquement accessible par le son ou l’odeur, mais cela me gêne un peu d’avoir la réponse « Nulle chose de ce nom ne se trouvait ici » alors que par exemple dans l’exemple de la mer que tu donnes on peut la voir de loin la mer, et elle se trouve là quand même. Peut -être qque chose comme « cela n’était pas accessible » serait plus générique, à la fois si cela n’existe pas du tout, et si c’est trop loin.

Oui, j’ai corrigé récemment un problème dans ma modification de l’extension. Peux-tu tester avec la version que je vais committer dans 2 minutes ?

oui cela fonctionne super bien maintenant, merci !
On devrait mettre une statue de toi dans R’lyeh pour la peine ! :wink:

Je ne vais pas tarder à faire un nouveau commit pour améliorer l’extension.

Dorénavant, on aura un message par défaut pour chacune des 5 actions (regarder, sentir, écouter, toucher/prendre, goûter/manger), et non plus pour tous le même « Miscellany 39 »

Le fonctionnement : si on ne précise rien, l’extension utilise les messages suivants :

  • regarder : message Miscellany 39 (le message qui dit que cela n’est pas utile dans le jeu)
  • sentir : utilisation du message par défaut des bibliothèques lorsqu’on sent un objet sans description olfactive (du style « je ne sens rien de particulier »)
  • écouter : utilisation du message par défaut des bibliothèques lorsqu’on sent un objet sans description auditive (du style « je n’entends rien de particulier »)
  • toucher/prendre : utilisation du message par défaut des bibliothèques lorsqu’on veut toucher un objet qui n’a pas de description (du style « je sais tenir mes mains tranquilles »)
  • goûter/manger : utilisation du message par défaut des bibliothèques quand on veut goûter un objet qui n’a pas de description gustative (du style « je ne remarque rien de particulier »)
  • autres actions : message miscellany 39.

Mais on peut aussi préciser juste avant l’inclusion de l’extension les constantes suivantes (extrait de Lieux Communs):

Constant ScenicErrorOther = "Je n'y voyais aucune utilité."; Constant ScenicErrorLook = NULL; ! utiliser le message par défaut Miscellany 39 Constant ScenicErrorSmell = NULL; ! utiliser le message par défaut pour "Smell" Constant ScenicErrorListen = NULL; ! utiliser le message par défaut pour "Listen" Constant ScenicErrorTouch = NULL; ! utiliser le message par défaut pour "Touch" Constant ScenicErrorTaste = "Je ne mettais pas n'importe quoi dans ma bouche.";

(remarquer le message pour le goût, parce que je préfère un tel message que celui par défaut qui laisse entendre que le joueur a goûté l’objet… ce qui conduit à des situations cocasses : goûter les bois… goûter le soleil…)

J’oubliais une question : vous semble-t-il qu’il y a d’autres actions que celles liées aux 5 sens qui mériteraient leur attribut scenic dédié, ou est-ce qu’on considère qu’il ne faut pas trop compliquer l’extension et que pour tout le reste il faut utiliser des objets classiques ?

Question pour Otto : j’ai remarqué que tu utilises de préférence « scenic_all » plutôt que « scenic_look » pour les descriptions visuelles. Y a-t-il une raison particulière à cela ?

(Question pour tous les autres : cf mon post précédent :slight_smile:)

salut, cela m’a l’air tout bon ce que tu as fait là !
Pour répondre à ta question, j’utilise de préférence scenic_all car avec le message par défaut qu’il y avait avant, je préférais avoir un lien vers l’objet plutôt que "Nulle chose de ce nom ne se trouvait ici. ", ou alors cela m’obligeait à ajouter en plus un scenic_look + scenic_all. Mais je vais regarder comment cela fonctionne dorénavant avec les nouveautés.

Oui, avec les « nouveautés » cela devrait devenir plus logique d’utiliser scenic_look pour la vue, et on aura les messages par défaut de la bibliothèque pour les autres sens.

scenic_all est plutôt réservé aux éléments de décor que l’on ne souhaite pas décrire du tout, avec un message NULL pour qu’un simple « Cela n’avait pas d’importance » ou équivalent soit affiché.

exemple :

    scenic_all 'truc' 'sans' 'importance' 0 NULL,

J’ai fait une mise à jour de l’extension scenic5sens.h, on a maintenant la possibilité d’ajouter un scenic_allactions qui va répondre pour toutes les actions non gérées par un autre scenic (scenic_look, scenic_smell, même scenic_all qui gère les 5 sens d’un coup). Cela permet de mettre un message plus spécifique pour les joueurs qui tentent de manipuler les objets du décor (allumer, pousser, tirer, monter sur, entrer dans, …).

La dernière version est sur le dépôt subversion, ici : svn.tuxfamily.org/viewvc.cgi/out … r_informfr

Exemple d’utilisation dans Citronille :

Object lieu_foret_est "Forêt est" class Foret
  with  description "Vous êtes toujours en pleine forêt. À cet endroit le terrain commence à monter vers l'est, menant à une colline boisée.",
        scenic_look 'colline' 'boise' 'boisee' 0 "La colline est couverte d'arbres, comme le reste de la forêt."
        'terrain' 0 "Rien de particulier à dire sur le terrain.",
        scenic_allactions 'colline' 'boise' 'boisee' 0 "Si la colline vous intéresse, c'est à l'est.",

Résultat :

[code]Forêt est
Vous êtes toujours en pleine forêt. À cet endroit le terrain commence à monter vers l’est, menant à une colline boisée.

Citroen volette là, d’un air impatient.

Vous pouvez voir aussi des herbes hautes et des arbres.

x colline
La colline est couverte d’arbres, comme le reste de la forêt.

sentir colline
Si la colline vous intéresse, c’est à l’est.

monter sur la colline
Si la colline vous intéresse, c’est à l’est.

nettoyer la colline
Si la colline vous intéresse, c’est à l’est.[/code]
L’action « sentir colline » aurait pu être interceptée avec un simple scenic_all, mais les deux autres (et toute idée farfelue passant par la tête du joueur) sont gérées par scenic_allactions. Sans cela, on aurait eu un message du type « Vous n’en voyez pas l’utilité » (au mieux) ou « Ce n’est pas une chose à laquelle vous aurez à vous référer au cours du jeu. » (au pire), selon le paramétrage.

Voilà, rien de sensationnel, mais ça ajoute un petit plus à cette extension pratique pour les paresseux (hein Akien !)

et dans le cas où cette section n’est pas renseignée, cela donne quoi ?

Pour le nom, scenic_anyaction ou scenic_any_action (n’importe quelle action) cela ne serait pas plus anglais que scenic_allactions ?

Il y a plusieurs cas de figure. Si l’action est une action portant sur les 5 sens (attention take est assimilé à touch, eat et drink à taste), on prend soit le message standard pour chaque sens concerné, soit les messages définis dans les constantes ScenicErrorXXX.
Pour les autres actions, c’est par défaut le message Miscellany 39 qui est utilisé ("« Ce n’est pas une chose à laquelle vous aurez à vous référer au cours du jeu. », qu’on avait remplacé dans lieux communs par « C’était sans importance » ou approchant), mais ce message est vite casseur d’ambiance (dans la première version de Rats on en avait à la pelle), alors il est préférable de le remplacer en définissant la constante ScenicErrorOther.

exemple :

[code]Global ScenicFlag = 4; ! la propriété name d’un lieu permet de l’examiner

Constant ScenicErrorOther = « Vous n’y voyez aucune utilité. »;
Constant ScenicErrorLook = NULL; ! utiliser le message par défaut Miscellany 39
Constant ScenicErrorSmell = NULL; ! utiliser le message par défaut pour « Smell »
Constant ScenicErrorListen = NULL; ! utiliser le message par défaut pour « Listen »
Constant ScenicErrorTouch = « Vous n’y voyez aucune utilité. »;
Constant ScenicErrorTaste = « Vous n’y voyez aucune utilité. »;
Include « scenic5sens »;
[/code]
(Remarque : il vaut mieux définir un ScenicErrorTouch et un ScenicErrorTaste pour éviter d’avoir à gérer quand un objet ne peut pas être pris/touché ou mangé/bu/goûté, ce qui est presque toujours le cas pour les objets du décor, sauf précisé autrement.)

Pour une action sur un terme défini dans au moins un scenic_xxx :

  • Pour une action sur un sens, on regarde d’abord si le scenic_xxx du sens concerné est défini, puis s’il y a un scenic_all, puis s’il y a un scenic_allactions.
  • Pour une action autre (tirer, monter sur…), on regarde juste s’il y a un scenic_allactions, puis si ce n’est pas le cas on affiche le message Misc 39 (ou ScenicErrorOther si défini) pour dire en gros que l’objet existe mais sans importance.

Dernière chose, si on définit pour certains termes uniquement un scenic_smell et/ou un scenic_listen, l’objet n’est pas observable et aucune autre action qu’écouter/sentir ne peut être effectuée. C’est utilisé dans lieux communs pour les cris des chiens et certaines odeurs je crois. Si un autre scenic_xxx quel qu’il soit est défini, l’objet est toujours manipulable et les « trous » sont comblés avec les messages par défaut ou les constantes ScenicErrorXXX.

Pour le nom, je n’en sais rien, scenic_allactions me semble déjà correct en anglais et refléter le sens que je voulais lui donner, mais anyactions peut aussi sûrement convenir.

J’ai apporté une correction d’un bug dans le cas où la constante ScenicErrorTaste était laissée à NULL par celui qui utilise l’extension (trouvé lors du test du jeu Rats d’Akien).

La dernière version est toujours au même endroit : svn.tuxfamily.org/viewvc.cgi/out … r_informfr

Ceux qui l’ont utilisée sont encouragés à mettre à jour.

Je note ici un problème pour tenter de le corriger plus tard : lorsqu’on tente une action qui nécessite à la fois un « noun » et un « second » (creuser … avec …) par exemple, le message dit « Vous ne voyez rien de tel, à moins que cela ne soit sans grande importance. » au lieu de ScenicErrorOther ou « Vous n’y voyez pas d’utilité. »

Autre problème : les actions sur le lieu (sortir de + un nom désignant le lieu) ne sont pas bien gérées si on choisit la solution scenic5sens.