Superposition éclairages

Me revoilà, toujours insatiable mais un peu honteux tout de même.

Pour moi, il y a deux sortes d’éclairages ( je schématise ) :

  • De construction : une salle est dark ou elle ne l’est pas.
  • De circonstance : le joueur coltine une lampe allumée ou éteinte.

Bon ! J’entre dans une salle dark avec ma lampe éteinte. Je n’y vois rien du tout. Normal.
J’allume ma lampe, la salle, dark ou pas dark, devient lighted et j’y vois. Toujours normal.
J’éteins ma lampe et la salle n’est plus lighted, mais là, raffinement ! Je voudrais continuer à y voir si la salle n’était pas dark initialement ( j’ai gaspillé de l’énergie et c’est honteux mais c’est mon affaire ) mais je voudrais ne plus rien y voir si la salle était dark initialement.

J’ai du mal à combiner tout ça ?

Je ne comprends pas vraiment ta question. Cependant, ta conception de la lumière dans Inform est erronée. Quand tu allumes ta lampe, l’endroit reste dark et ne devient pas lighted. C’est une propriété de l’endroit, qui en général ne change pas. Elle signifie simplement que l’endroit ne possède pas de source de lumière intrinsèque, c’est-à-dire qu’elle est sombre en l’absence de source de lumière externe.

En présence de la lampe, Inform voit qu’il y a une source de lumière, et fait en sorte que le joueur voit ce que l’emplacement contient, même s’il est dark. Si on éteint la lampe, Inform voit que l’emplacement est dark et qu’il n’y a plus de source de lumière, alors on se retrouve dans l’obscurité.

(En fait, dans le code Inform 6 sous-jacent, il n’y a qu’une seule sorte d’éclairage : un objet, que ce soit un endroit ou une chose, peut être lumineux. Si le joueur est en présence d’un objet lumineux, que ce soit l’emplacement ou une chose, alors il peut voir. Sinon il est dans le noir.)

Je pense deviner que tu l’as mal codé, et que tu mets la propriété « lighted » à tous les endroits quand le joueur allume la lampe, plutôt que d’ajouter la propriété « lit » à la lampe. Si c’est le cas, cela revient à dire que les endroits possèdent maintenant une source de lumière intrinsèque plutôt que de dire que la lampe devient une source de lumière. Et là, en plus que c’est conceptuellement faux, il faudrait stocker une liste des endroits sombres quelque part pour pouvoir revenir en arrière quand la lampe est éteinte.

Minimalement, ton code devrait ressembler à cela :

[code]La montagne is a room. La lampe is a switched off device in la montagne.
La grotte is inside from la montagne. La grotte is dark.

Carry out switching on la lampe:
now la lampe is lit.

Carry out switching off la lampe:
now la lampe is not lit.[/code]

C’était bien ça, merci. Je n’avais pas compris la façon dont la lumière est gérée dans Inform. Et avec une seule règle « every turn » on peut gérer la lumière dans tout un jeu.
Et alors je me suis dit : "Mais c’est vachement bien, ça ! Pourquoi ne pourrait-on pas gérer en même temps les moyens d’éclairage ? ". Avec une sorte d’espèce de règle comme celle-là :

every turn when location is in Donjon:
    if the location is not dark:
        now la torche is in location.

Et ça marche, mais pas comme je veux. En effet ( tu le sais mieux que moi ) la règle « every turn » s’exécute à la fin de l’action en cours. Et donc, quand j’entre dans une salle éclairée, la torche me suit comme prévu, mais on ne la voit pas. Si maintenant je fais un look, par contre, on la verra. Et je voudrais que quand la torche me suit, on la voie tout de suite ! Une espèce de backdrop intelligent dont on mesure tout l’intérêt !

Toi qui sais tout, rivière de connaissance, peux-tu m’aider ? :slight_smile:

Déjà, un problème avec ta règle every turn est qu’elle ne vérifie pas si la torche est déjà dans l’emplacement. Ça fait que le jeu va la redéplacer à chaque tour même si elle y est déjà. Ce n’est pas grave en soi mais ça ralentit le jeu (qu’un tout petit peu, certes) inutilement.

Sinon, pour ta question, tu veux une sorte de backdrop conditionnel ? Déplacer la torche avant un déplacement marcherait, alors :

Before going to a lighted room (caled destination) which is in donjon: now la torche is in destination.
(Je n’ai pas testé, mais l’idée est là.)

Il semblerait d’ailleurs qu’il existe une extension pour généraliser ce concet de backdrop conditionnel. Je n’ai pas essayé, alors je ne sais pas si elle est à jour.

Cependant, si la carte n’est pas dynamique et qu’aucun endroit ne passe de lighted à dark ou vice-versa, ça reste mieux de simplement lister les endroits où doit être la torche, comme un backdrop normal. Ça évite les calculs en jeu (même si, encore une fois, ça reste négligeable).

(Au passage et tant qu’on en parle, pour vérifier si le joueur est dans le noir, il me semble que c’est la condition est « if in darkness ». « If the location is dark » ne fonctionnera pas, car le joueur peut être dans un conteneur fermé dans un endroit illuminé, ou à l’inverse dans un endroit dark mais avec une lampe allumée.)

Merci pour tes précisions. De mon côté, j’ai trouvé ça :

Before printing the name of the location when location is in Donjon:
    if the location is not dark:
        now la torche is in location.

Ça marche, mais quels sont les inconvénients ?

Je ne pense pas qu’il y aura des effets secondaires. Je trouve juste que c’est moins intuitif, du point de vue conceptuel.

Je viens aussi de remarquer que, dans ma solution, il faut remplacer « Before » par « Carry out ». En effet, si une règle quelconque empêche le déplacement, le before va quand même se déclencher et la torche sera déplacée même si le joueur n’a pas pu bouger.

Enfin, en utilisant le printed name, je pense que tu n’as pas besoin de vérifier si l’emplacement est dark ou pas, étant donné que le nom ne s’affiche de toute façon que si l’endroit est illuminé. Il faudra quand même vérifier.

Et si tu gardes la condition, il y a moyen de raccourcir (à tester) en mettant l’adjectif directement dans l’en-tête :

Before printing the name of the lighted location when location is in Donjon: now la torche is in location.