Katabasis, une descente aux enfers

Bon je me suis lancé dans l’écriture d’une petite if, et je sais qu’il est suicidaire d’en parler déjà car il y a une bonne probabilité que je perde ma motivation. Enfin pour l’instant je suis motivé donc je m’investis un peu.

L’intrigue n’est pas encore totalement posée, mais il s’agirait d’un homme qui se retrouve à dériver vers les Enfers (au sens mythologique du terme), et le joueur aurait à découvrir comment il est mort (pas fixé).

D’où κατάβασις (katabasis), qui à donné en français catabase, la descente aux enfers.

Et donc je crée ce fil pour pouvoir demander un soutien technique ou scénaristique quand j’en ai besoin, ce qui est le cas:
Le personnage navigue donc sur l’Achéron dans une petit barque miteuse, et j’aurais pour l’instant une seule question (ça risque de vite augmenter :stuck_out_tongue:) :

  1. La barque se retrouve dans une bonne partie des lieux du début, puisque le personnage navigue dessus. Y’a-t-il un moyen moins redondant d’obtenir cet effet sans lister chaque salle dans l’attribut found_in ?

Voilà merci d’avance :slight_smile:

Réponse partielle : bas de la page 108 du DM4 (ou chercher « found_in » dans l’index)

La problématique citée dans cette page 108 : faire figurer une étoile dans toutes les pièces dont la classe est « OutsideRoom », plutôt que de remplir le found_in de la liste des salles concernées.

bon courage et bonne motivation pour cette histoire !
Tiens nous au courant.

Merci :slight_smile:

Bon j’ai déjà réussi à coder 4 salles sans me tirer une balle, c’est pas mal. Par contre, la zone suit ce schéma (c’est pas du code mais c’était pour qu’il me change pas le formatage ^^) :

terre / | \ terre - lac - terre | fleuve

J’ai donc introduit dans les 3 salles de terre l’initial suivant:

initial [; print "Vous accostez votre embarcation à la rive du lac.^"; return false; ],
Mais la solution n’est pas viable pour les déplacements latéraux, à pied, entre les zones de terre. J’aurais sûrement la réponse en cherchant demain matin dans le DM4, mais si jamais ça vous prend moins de deux minutes à rédiger je suis preneur.

Sur ce, bonne soirée.

Solution à deux centimes : mets de l’eau entre toutes les terres comme ça tu es obligé d’accoster :slight_smile:

Sinon la solution que je vois est d’utiliser une variable permettant de savoir si dans la salle précédente tu étais dans l’eau ou non.

je ne dis pas cela spécialement pour faire de la pub pour Inform 7, mais par rapport à ce dont parlait Stormi un peu plus tôt : au niveau du design, il est facile avec I7 de définir différentes régions avec des caractéristiques différentes (terre et eau). Ainsi dans ce cas on dirait :

[code]« Test de deplacements » by « Otto ». Use full-length room descriptions.
The former location is a room that varies.

First carry out going rule:
change the former location to the location.

Terre1 is north from lac. Terre2 is east from lac. Terre3 is west from lac. Terre1 is northwest from terre2. Terre1 is northeast from terre2. Fleuve is south from lac.

Enfer is a region. Terre is a region. Eau is a region.

Terre1, Terre2, Terre3 are in terre. Lac and Fleuve are in eau. Terre and eau are in Enfer.

The description of the terre1 is « [if the former location is in terre]Vous continuez votre expédition.[otherwise]Vous accostez votre embarcation à la rive.[end if] ».

The description of the terre2 is « [description of terre1] ».
The description of the terre3 is « [description of terre1] ».
The description of the lac is « [description of terre1] ».
The description of the fleuve is « [description of terre1] ».

test me with « se/nw/s/n/se/w/w »[/code]

extrait :

Je suis d’accord pour dire qu’avec inform 7 un desing de ce genre est facilité. Je viens de découvrir hier soir une fonction permettant de rendre un objet visible partout (comme le ciel : la prop everywhere). Dans ton cas précis, ce que propose Otto est pas mal. toutefois, si tu restes sur I6, tu peux par exemple : (écrit de tête, non testé :slight_smile: )


!Dans le global

Global Terre;

!dans la sub Initialise

Terre=false;

!ensuite:

object terre1 "terre"
with description "Vous êtes sur la terre",

s_to ...
sw_to ...

before[;
if (Terre=true){print "Vous cheminez sur la terre ";return;};
else {print "Vous naviguez sur l'eau";return;};
 
Terre=true;  !car ce lieu est de la terre


],

has light;



object lac1 "lac"
with description "Vous êtes sur le lac",

s_to ...
sw_to ...

before[;
if (Terre=true){print "Vous cheminez sur la terre ";return;};
else {print "Vous naviguez sur l'eau";return;};
 
Terre=false;  !car ce lieu est de l'eau. En gros, cette variable sert à indiquer quel sera le prochain message affiché


],

has light;

Bon je ne sais pas si j’ai bien répondu à ton problème…

Sous inform 6 pour faire un objet visible partout c’est très simple aussi :

Object ciel "ciel"
with description "Le ciel est bleu comme l'azur.",
found_in [; return true],
has scenery;

Mais je reconnais que la syntaxe d’inform 7, au moins pour un anglophone, est intéressante pour un non programmeur.

Merci beaucoup pour vos réponses ! Inform 7 à l’air assez intéressant mais je préfère apprendre à bien utiliser Inform 6 qui reste encore majoritaire avant de m’y attaquer.

J’ai trouvé une solution assez simple, pour le problème d’embarquement/accostage, mais vu comme je patauge en Inform elle n’est arrivée qu’après de multiples tests.

En fait j’ai placé un initial dans les salles concernées:

initial [; Go: if (noun ~= n_obj) { print "Vous réembarquez sur votre frêle embarcation, craintif de la voir s'effriter lorsque vous y apposez le pied.^"; return false; } ],

De ce type là. Pour l’instant ça marche, y’a sûrement d’autres façons d’obtenir le même résultat, mais je voulais exposer celle là au cas où elle soit obsolète ou dépréciée.

Ta solution marche (si j’ai bien compris c’est selon la direction d’où tu viens que tu modules la réponse), cependant si tu avais un grand nombre de salles une solution mieux codée à mon avis serait d’utiliser une variable « dans_barque » :

  • tu initialises dans_barque à 1 ou 0 selon que tu commences le jeu dans la barque ou non
  • quand tu entres dans une salle où tu es sensé être dans la barque, si dans_barque vaut 0 tu affiches un message disant que tu montes dans la barque, et tu mets dans_barque à 1.
  • quand tu arrives sur une terre, si dans_barque vaut 1 alors tu affiches un message disant que tu accostes, et tu mets dans_barque à 0

(tu peux même faire une classe LieuTerre et une classe LieuEau auxquels tu donnes les comportements cités ci-dessus afin de ne pas avoir à les dupliquer entre les différents lieux)

Exemple (non testé)

Class LieuTerre
with initial [; 
    if (dans_barque==1) 
    {
        dans_barque=0;
        "Vous accostez votre barque et posez pied à terre.";
    }
];

Class LieuEau
with initial [; 
    if (dans_barque==0) 
    {
        dans_barque=1;
        "Vous montez dans la barque et vous éloignez de la rive.";
    }
];

Object un_lieu
class LieuEau
with description "Le milieu du lac";

Ah oui en effet ta solution me semble bien plus viable pour une quantité importante de lieux et je risque de l’utiliser en fonction de comment va avancer l’histoire (parce qu’après il y a navigation sur l’Acheron, le Styx, etc. je sais pas encore comment je vais gérer tout ça).

Merci bien :slight_smile:
Je vais m’arrêter là pour ce soir. J’avance lentement mais sûrement, déjà une salle avec la description pleine et le maximum de descriptions d’objets cités. Faut que j’attaque les salles environnantes et les verbes maintenant ^^

Le projet est toujours actif, oui oui. J’ai pas beaucoup codé dernièrement parce que je faisais des recherches poussées sur la topographie des Enfers grec, mais je commence à bien maîtriser le sujet et je peux continuer.

J’aurais une question pour qui veut, notamment pour Adrien car « Cité des Eaux » est le seul jeu qui me vienne à l’esprit qui utilise ce système mais je ne trouve pas son code source à étudier, donc je demande ici:

J’aimerais pouvoir mettre du texte en relief, des citations, comme dans la « Cité des Eaux » où des bribes de texte sont citées dans un cadre à l’arrivée dans un nouveau lieu majeur. Stormi me parlait de « box » mais je n’ai pas réussi à en tirer grand chose, bien que j’avoue ne pas avoir testé beaucoup des possibilités qui me venaient à l’esprit.

essaye qque chose dans ce style :

[code] #ifdef TARGET_ZCODE;
ClearScreen();
#ifnot; ! TARGET_GLULX;
glk_window_clear(gg_mainwin);
#endif; ! TARGET_

    box "Test de boite.";[/code]

(peut-être que clearscreen() fonctionne maintenant avec glulx sans passer par un test de version, mais si ton jeu n’utilise pas glulx de toute façon, clearscreen suffira)