!==========================================================
Constant Story "Life On Mars?";

! Le tiret cadratin
Zcharacter table + '@{2014}';

Constant Headline
 	"^Une aventure par Hugo Labrande.^Tapez @<< aide @>> pour obtenir l'aide du jeu.^";
Release 2;

! Cover art : adapté de :  NASA, "'Pillinger Point' Overlooking Endeavour Crater On Mars", http://mars.nasa.gov/multimedia/images/?ImageID=6355


! ################################ TRUCS MOCHES / TECHNIQUES ############################

Constant NO_SCORE;
Constant DEATH_MENTION_UNDO;

! Abréviations françaises
Abbreviate "c'est" "C'est" "était " "u'est-ce" "de " "ne " "pas " "on " " d'" " n'" " l'" " la" "il " " un" "les" "sse" "ssi" " ma" "s de l" "s so";
! Abréviations de ponctuation
Abbreviate " ; " " @{2014} " ". " "..." ", ";
! Abréviations de conjonctions
Abbreviate "dans " "pour " " com" "avec " "si " "et " "que " " qu" "plus " "mais" "ais" "où ";
! Abréviations terminaisons
Abbreviate "ant " "ent " "ait " "st " "er " "tion";
! Abréviations deuxième personne du pluriel
Abbreviate " vous" "Vous " "votre" "ous " "ez ";
! Abréviations Inform
Abbreviate ".^^" "^^ ";
! Abréviations spécifiques au jeux
Abbreviate "@@64aresmail.com" "Ares Space" "    Bonjour" "Charlotte" "                                          " "            " "[Chris Tacker] " "Dr Diane Peters" ", d" "cette " "être " "mission" "ordialement," "ordinateur";

Replace OffersLight;
Replace DrawStatusLine;
Replace LanguageVerb;

Include "Parser";

Object LibraryMessages ! must be defined between Parser and VerbLib
with before [;
	Wait: if (location == devantquartierspeur) { <<CompterDoigts>>; } else {
		if (location == bureau or devantserre or devantporte or couloir or serre) { "Vous laissez quelques secondes s'écouler, en écoutant distraitement la chanson qui résonne dans le bureau."; } else { "Vous laissez quelques secondes s'écouler, mais vous vous ennuyez rapidement."; }
		}
];

Include "VerbLib";


! Le menu des emails a ses propres headers

Constant AltNKEY__TX  = "S = suivant";
Constant AltPKEY__TX  = "P = précédent";
Constant AltQKEY__TX  = "        Q = retour"; !huit espaces pour aligner à droite
Constant AltRKEY__TX  = "ENTRÉE = lire email";
Global isItTheMailMenu=0;

!Include "DMenus";
Include "DMenusSpecial";
Include "EffetsDeTexte";
Include "BeforeParsingLifeOnMarsfr";         ! transforme tous les synonymes de email (e mail, e-mails, messages, courriels...) en emails

[ OffersLight obj;
  if (obj == nothing)
    rfalse;
  else
    rtrue;
];


! Status line with no score or turns (taken straight from library)
[ DrawStatusLine width posa posb;
    #Ifdef TARGET_GLULX;
    ! If we have no status window, we must not try to redraw it.
    if (gg_statuswin == 0)
        return;
    #Endif;

    ! If there is no player location, we shouldn't try to draw status window
    if (location == nothing || parent(player) == nothing)
        return;
    StatusLineHeight(gg_statuswin_size);
    MoveCursor(1, 1);
    width = ScreenWidth();
    posa = width-26; posb = width-13;
    spaces width;
    MoveCursor(1, 2);
    if (location == thedark) {
        print (name) location;
    }
    else {
        FindVisibilityLevels();
        if (visibility_ceiling == location)
            print (name) location;
        else
            print (The) visibility_ceiling;
    }
    MainWindow(); ! set_window
];

[ FakeStatusLine str width posa posb; ! pour la scène finale (move player to location marche pas parce que y'a pas de tours)
    #Ifdef TARGET_GLULX;
    ! If we have no status window, we must not try to redraw it.
    if (gg_statuswin == 0)
        return;
    #Endif;

    StatusLineHeight(gg_statuswin_size);
    MoveCursor(1, 1);
    width = ScreenWidth();
    posa = width-26; posb = width-13;
    spaces width;
    MoveCursor(1, 2);
    print (string) str;
    MainWindow(); ! set_window
];


[ w8 ;
  KeyCharPrimitive();
];

[ ChooseObjects obj code ;
  if (code == 2 && action_to_be == ##Enter && location == bureau) {  ! autant s'asseoir sur les bons trucs au lieu de s'asseoir sur Bob
  	if (verb_word == 'asseoir' && obj == chaise) { return 4; }
  	if (obj == sacdecouchage) { return 3; }
  	return 2;
  }
  if (code == 2 && obj == portesdb) { return 0; }    ! la porte de la salle de bains n'est pas importante, donc elle perd toujours l'égalité
];

[ LanguageVerb i;		! en anglais surtout "I only understood you as far as you wanted to emails"
				! mais aussi en français avec les accents et tout
#Ifdef LIBRARY_FRENCH;
    switch (i) {
      'i//','inv','inventaire':
               print "inventaire";
      'r//':   print "regarder";
      'x//':   print "examiner";
      'z//':   print "attendre";
      'v//':   print "regarder";
      'a//':   print "attendre";
      '!//':   print "dire";
      '?//':   print "demander";
      'q//':   print "quitter";
      'verrouiller': print "verrouiller";
      'deverrouiller': print "deverrouiller";
      'emails': print "consulter emails";
      'calmer': print "se calmer";
      'detendre': print "se détendre";
      default: rfalse;
    }
    rtrue;
#Endif;
#Ifdef LIBRARY_ENGLISH;
    switch (i) {
      'i//','inv','inventory':
               print "take inventory";
      'l//':   print "look";
      'x//':   print "examine";
      'z//':   print "wait";
      'emails': print "consult emails";
      default: rfalse;
    }
    rtrue;
#Endif;
];


! ################################ FIN DES TRUCS MOCHES / TECHNIQUES ############################




! Variable de plot
Global avancement = 4748;
! Jour 1, 4748: il faut manger
! Jour 1, 4749: il faut lire le mail des tofus
! Jour 1, 4750: on peut compter les tofus
! Jour 1, 4751: on peut répondre les tofus
! Jour 2, 4752: il faut répondre à zozo
! Jour 2, 4753: il faut lire le mail du robot
! Jour 2, 4754: il faut aller manger
! Jour 2, 4755: on a mangé, va chercher le robot
! puis 4755 + entrer : DANCE DANCE DAAAAAAAANCE

! Nécessaire pour contrôler la vitesse du Printslow de EffetsDeTexte
Global EMAIL_SPEED = 2;
Constant BEACH_BOYS_SPEED = 2;
Constant BEACH_BOYS_LONG  = 1;
Global TYPING_SPEED_FAST = 1;
!Global TYPING_SPEED_SLOW = -1;

! Vitesse de défilement des trucs du jeu
Global BASE_DELAY = 7;

! Durée de chaque chanson
Constant SONG_LENGTH = 2;

Include ">lifeonmars_emails";




!==========================================================
! Le bureau

Object bureau "Bureau"
	with couloirenter 0,
	description "Tout est plongé dans une semi-obscurité, comme toujours. Votre couchage est roulé en boule, chiffonné à sa place habituelle dans le coin de la pièce. Dans le coin opposé, une chaise et un bureau, sur lequel se trouve votre ordinateur, qui joue toujours la même liste de lecture, en boucle. Vous passez le plus clair de votre temps ici, en allant de temps en temps à la serre. Ça vous convient.^^Au nord, une petite séparation, comme une alcôve, mène à la porte de la serre. Le couloir vers le reste de la base est au sud.",
	n_to devantserre,
	s_to [; if (avancement == 4748) {"Vous n'aimez pas vous aventurer dans cette partie-là de la base, et d'ailleurs c'est bien pour ça que vous avez déplacé votre sac de couchage ici. En plus, il faudrait que vous mangiez, pour une fois que vous en avez envie.";} if (avancement == 4749) {"Vous n'aimez pas vous aventurer dans cette partie-là de la base, et d'ailleurs c'est bien pour ça que vous avez déplacé votre sac de couchage ici. En plus, il faudrait que vous regardiez vos emails.";} if (avancement == 4750 && self.couloirenter==0) {print "Vous vous arrêtez en face du couloir, le regardant fixement. Vous n'aimez pas ce couloir. Il vous éloigne de votre zone de confort. Bien sûr, vous êtes seule ici. Mais allez dire ça à votre c@oeur, qui s'emballe déjà."; self.couloirenter=1;} return couloir; ],
	cant_go "Vous ne pouvez pas aller par là ; d'ici vous pouvez aller vers la serre au nord, ou dans le couloir au sud.",
	robotlocation "le bureau",
	before [; Listen: if (noun == 0) {EcouterMusique(); rtrue;}
		Sleep: <<Enter sacdecouchage>>;
		Sing: Chanter(); rtrue;
		],
	compass_look [obj;
		if (obj == s_obj) { <<Examine mockcouloir>>; }
		if (obj == n_obj) { <<Examine mockalcove>>; }
		if (obj == out_obj) { <<Examine nooutside>>;}
	],
has scenery concealed;

Object desk "bureau" bureau
	with description "Un bureau en métal, assemblé à partir de pieds et de plaques en métal standardisées. C'est l'@oeuvre des robots, qui l'ont assemblé avant que vous arriviez, de même que la chaise en face du bureau. Ceci dit, vous auriez pu aussi bien les construire vous-même : l'idée derrière ce système de pièces standardisées était que n'importe qui puisse construire à peu près n'importe quel meuble en passant quelques heures à suivre le mode d'emploi. Et idem pour le désassemblage : tout doit être utilisable et réutilisable pour tout, vu que les ressources sont si rares.",
	name 'bureau' 'desk' 'meuble' 'metal' 'froid',
has scenery supporter concealed;

Object ordi "ordinateur" desk
	with seen 0,
	description [; print "Ça n'est qu'un terminal, un écran et des périphériques ; tout le travail et les calculs sont faits par l'ordinateur de la base, en sous-sol, un ordinateur gigantesque construit patiemment par les robots au fil des missions. L'ordinateur de la base centralise et interprète toutes les données de tous les systèmes de la base, de l'humidité de la serre à la pression des sas ; quand il faut, il envoie des directives à Bill et Bob, qui sont en quelque sorte ses bras et jambes. Il était fait pour contrôler des milliers de systèmes et des dizaines de robots, mais vu que la majeure partie de la base est fermée, il est quelque peu sous-utilisé ; il passe ses journées à afficher vos mails et à jouer de la musique."; if (self.seen==0) {self.seen=1; print "^^[Pour consulter votre messagerie et/ou répondre à vos messages, utilisez la commande >CONSULTER EMAILS ou >EMAILS]";} "";
		],
	name 'ordi' 'ordinateur' 'unite' 'centrale' 'ecran' 'station' 'travail' 'machine' 'terminal' 'musique' 'chanson',
	before [; SwitchOn: "L'ordinateur est déjà allumé.";
		SwitchOff: "Si vous l'éteignez, vous serez seule avec vos pensées dans le silence le plus total. Donc vous ne l'éteignez pas.";
		Listen: EcouterMusique(); rtrue;
		UtiliserCopy, VagueConsult: <<Examine messagerie>>;
		],
has scenery concealed;

Object messagerie "messagerie" desk
	with description [; AfficherMails(); rtrue;],
	name 'emails' 'messagerie' 'boite' 'client' 'logiciel' 'nouveau' 'nouveaux' 'nouvel',
	!   BeforeParsingLifeOnMarsfr transforme directement tous les synonymes de emails en "emails"
	before [;
		Take, Search, VagueConsult: AfficherMails(); rtrue;
		Answer, Repondre: <<RepondreTacker>>;
		],
has scenery concealed female;

Object chaise "chaise" bureau
	with description "Comme tous les meubles de la base, cette chaise a été construite à partir de quelques rails de métal, assemblés par les robots avant votre arrivée. Le coussin d'air qu'ils ont fixé dessus est indigent, pas même un centimètre d'épaisseur. Vous détestez cette chaise ; elle est toujours froide, inconfortable, et ces jours-ci elle semble même être moins stable que d'habitude. Alors vous gigotez dessus quand vous n'avez rien à faire, ou quand vous attendez qu'un email arrive, et un de ces jours elle s'effondrera et ça sera bien fait pour elle.",
	name 'chaise' 'siege' 'grincante' 'inconfortable' 'meuble' 'froid' 'froide' 'metal' 'instable',
	before [;
		Enter: print "Vous vous asseyez sur la chaise, qui bouge sous votre poids mais semble tenir à peu près droit, pour consulter vos emails."; KeyDelay(10*BASE_DELAY); AfficherMails(); print "^Vous vous levez de la chaise.^"; rtrue;
	],
has scenery supporter concealed female;

Object sacdecouchage "sac de couchage" bureau
	with description "Roulé en boule, dans le coin de la pièce où vous dormez, la fermeture éclair béante (vous ne fermez jamais la fermeture éclair, à cause des cauchemars). Quand son lit est un coussin d'air d'un demi-centimètre d'épaisseur attaché à un sac de couchage en plastique, à quoi bon faire son lit le matin. Il vous tient chaud, certes, mais pour le reste, il n'est ni très confortable, ni doux ; tout est spartiate, ici. Vous avez l'impression que si vous pouviez dormir dans un vrai lit, avec un matelas épais et des couvertures qui vous enveloppent de chaleur douce et rassurante, si vous pouviez y dormir une nuit @{2014} non, une semaine @{2014} un mois @{2014} plutôt une éternité @{2014} vos problèmes seraient résolus.",
	name 'sac' 'couchage' 'matelas' 'futon' 'combinaison' 'skay' 'sky' 'oreiller' 'lit' 'couverture' 'fermeture' 'eclair' 'air' 'coussin',
	before [; Take, Push, Pull: "Vous regardez ce lit pathétique, puis vous soupirez. Il est finalement très bien là où il est.";
		Enter: switch(avancement) {
			4748, 4749: "C'est tentant, mais vous venez de vous y allonger pendant six heures de suite. Dr Peters a raison : même si ça semble inutile, essayer de bouger ses muscles et de faire quelque chose aussi régulièrement que possible. C'est une bataille de tous les jours, et vous ne savez même pas pourquoi vous la menez encore @{2014} un instinct stupide de survie qui se bat contre vous.";
			4750, 4751: print "Vous regardez votre sac de couchage, et vous sentez tout à coup prise d'une lassitude incontrôlable, comme cela vous arrive souvent. À quoi bon, tout ça ? À quoi bon faire tout ce cirque, à quoi ça avance ? Vous n'avez qu'une envie, c'est de vous recroqueviller sur vous-même. Et qui pourra vous en empêcher ? Vous faites ce que vous voulez.^^"; w8(); Cauchemar(); rtrue;
			default: "Vous aimeriez bien, mais vous venez de vous lever et il y a déjà beaucoup à faire ; essayons de profiter du fait que vous soyez debout et à peu près motivée ce matin.";
			}
		Attack: "Vous donnez un vague coup de pied mou dans le sac de couchage. Vous n'avez même plus la volonté de vous énerver, de vous battre.";
		Close: "Vous regardez la fermeture éclair, et détournez la tête en frissonnant. Cette nuit-là fut la plus terrible de toutes, et vous n'aviez pas dormi pendant deux jours en suivant, traumatisée par ces images si nettes, et cette sensation d'étouffement. Depuis, vous ne fermez plus la fermeture éclair.";
		],
has enterable concealed openable open;


Object nooutside "dehors"
	with name 'planete' 'paysage' 'fenetre' 'fenetres//p' 'mars' 'environnement' 'sable' 'rouge' 'tempete' 'mur' 'par',
	description "La base est fermée, hermétique, et sans fenêtre vers l'extérieur. Une fenêtre est plus fragile qu'un mur, et ne sert pas à grand-chose: dehors, rien que de la poussière rouge à perte de vue et des tempêtes de sable.",
	before "La base est fermée, hermétique, et sans fenêtre vers l'extérieur. Une fenêtre est plus fragile qu'un mur, et ne sert pas à grand-chose: dehors, rien que de la poussière rouge à perte de vue et des tempêtes de sable.",
	found_in bureau devantserre serre couloir devantporte reserve devantquartiers devantportepeur devantquartierspeur,
has scenery concealed proper;


!==========================================================
! Devant la serre

Object devantserre "Devant la serre"
	with description "À travers la porte vitrée sur votre droite, orientée est, vous pouvez voir la serre de la base, qui vous permet de survivre pour l'instant @{2014} et pour combien de temps ? Il y a quelques légumes bizarres et deux ou trois plantes qui tentent de survivre dans ce sol martien froid et hostile, sans cesse contrôlées par l'ordinateur central pour des conditions optimales. Au sud, c'est la pièce où vous vivez ; le coin salle de bain est un peu plus au nord.",
	robotlocation "la porte de la serre",
	e_to [; <<Open porteserre>>;],
	in_to [; <<Open porteserre>>;],
	s_to bureau,
	n_to [; <<Enter portesdb>>; ],
	cant_go "Il n'y a rien par là ; vous pouvez aller au sud, vers la pièce principale, ou entrer dans la serre. Vous pourriez aussi entrer dans le coin salle de bains au nord, mais vous n'en avez pas vraiment envie.",
	before [; Listen: EcouterMusique(); rtrue;
		Sleep: dontSleepHere(); rtrue;
		Sing: Chanter(); rtrue;
		],
	compass_look [obj;
		if (obj == n_obj) { <<Examine portesdb>>; }
		if (obj == s_obj) { <<Examine mockbureau>>; }
		if (obj == e_obj or in_obj) { <<Examine mockserre>>; }
		if (obj == out_obj) { <<Examine nooutside>>;}
	],
has scenery concealed ;

Object porteserre "porte de la serre"
	with description "Une porte en plexiglas sépare la serre du reste de la base ; les conditions de températures et d'humidité doivent être optimales à tout moment, et cette porte est un véritable sas étanche.",
	name 'porte' 'serre' 'sas' 'entree' 'vitree' 'transparente' 'plexiglas',
	parse_name [ w i n first ; ! je voudrais bien utiliser phrase_name mais ça rend la traduction difficile malheureusement :/
		w = NextWord(); i=0; n=0; first=w;
		while (WordInProperty(w, self, name) || w == 'de' or 'la' or 'en'){
			if (w == 'de' or 'la' or 'en') { i++; }
			else { if (n~=0) {n=n+1+i;} i=0; }
			w = NextWord();
		}
		if (first == 'serre' && n == 1) {return 0;}
		return n;
	],
	found_in devantserre serre,
	before [; Close: "La porte est déjà fermée.";
		Attack: "Vous frappez sur la porte, mais elle bouge à peine : elle est très solide, bien entendu.";
		Open: print "Vous ouvrez la porte et "; if (location == serre) {print "sortez de";} else {print "entrez dans";} print " la serre."; if (location == serre) {PlayerTo(devantserre); rtrue;} else {PlayerTo(serre); rtrue;}
	],
has scenery concealed openable female;

Object portesdb "porte de la salle de bains" devantserre
	with description "Derrière cette porte se trouve le coin salle de bains. Mais vous n'avez pas vraiment besoin d'y aller.",
	name 'porte' 'salle' 'bains' 'bain',
	before [; Close: "La porte est déjà fermée.";
		Open, Pull, Push, Enter: "Vous n'avez pas besoin d'aller aux toilettes, et votre prochaine douche peut attendre. De toute façon, qui pourrait se soucier de votre odeur corporelle ici ?";
	],
has scenery concealed openable female;


!==========================================================
! La serre


Object serre "Serre martienne"
	with description "Il fait chaud dans cette serre, et presque trop chaud. Le sol martien est froid, dur, et il faut sans cesse maintenir les plantes qui tentent de pousser ici sous perfusion d'eau, qui coule par un système d'irrigation goutte à goutte contrôlé par l'ordinateur central. Les quelques plantes, ainsi que les légumes que vous êtes censée manger, essaient tant bien que mal de survivre dans ces conditions, loin de leur écosystème naturel, dans un confort plus que spartiate qui tient plus de la survie que de la vie. Elles ont l'air faibles et fatiguées, presque déprimées ; vous vous demandez si, même avec tous les efforts de l'ordinateur, elles vont durer bien longtemps. Vous pouvez sortir de la serre par l'ouest.",
	w_to [; <<Open porteserre>>;],
	out_to [; <<Open porteserre>>;],
	cant_go "La seule sortie de la serre est à l'ouest.",
	robotlocation "la serre",
	before [; Listen: EcouterMusique(); rtrue;
		Sleep: dontSleepHere(); rtrue;
		Sing: Chanter(); rtrue;
	],
	compass_look [obj;
		if (obj == w_obj or out_obj) { <<Examine porteserre>>; }
	],
has scenery concealed female;

Object plantes "plantes martiennes" serre
	with description [; print "Quelques plantes poussent dans la serre, mais vous auriez du mal à dire de quel type @{2014} en plus, elles sont pendantes, noircies, molles, déprimées, sans doute rendues irreconnaissables par la vie ici. Il y a aussi quelques légumes, qui sont censés vous nourrir mais ont eux aussi du mal à pousser ; des carottes violettes, des salades rouges, des champignons noirs et des pommes de terre orange, qui poussent tant bien que mal dans la terre ocre et infertile. Il y aurait dû y avoir plus de plantes ici, plus de diversité, des nouvelles graines, et mêmes des lombrics pour commencer à créer un semblant d'écosystème, mais tout est parti en fumée, bien entendu. Il n'y a plus qu'à attendre encore cinq longs mois et essayer de survivre."; if (avancement == 4748 && roomba1.decouvert<2) {print "^^"; DecouverteBob(); rtrue;} "";],
	name 'plante' 'plantes//p' 'ogm' 'martien' 'martiens' 'martienne' 'martiennes//p' 'nourriture' 'subsistance' 'carotte' 'carottes//p' 'salade' 'salades//p' 'laitue' 'laitues//p' 'champignon' 'champignons//p' 'patate' 'patates//p' 'pomme' 'pommes//p' 'terre' 'potager' 'carre' 'plantation' 'culture' 'legume' 'legumes//p' 'feuillage' 'feuillages//p',
	parse_name [ w n;
		w = NextWord(); n=0;
		! mouvemen = translation hack
		while (WordInProperty(w, self, name) || (w == 'mouvemen' or 'mouvement' && roomba1.decouvert==1) ) { n++; w = NextWord(); }
		return n;
		],
	before [; Eat, Take: switch(avancement) {
			4748: DecouverteBob(); rtrue;
			4754: "Vous grignotez vaguement un légume que vous trouvez sans goût. Il vous faut quelque chose de plus consistant, de plus protéiné que ça.";
			default: "Vous grignotez vaguement un légume que vous trouvez sans goût. Vous n'avez pas envie de manger, de toute façon.";
			}
		Search: if (roomba1.decouvert == 1) { <<Take self>>; } else {<<Examine self>>; }
		Compter: "Il est difficile de compter exactement, car certains légumes ne sont encore que des petites pousses et vous les manqueriez sûrement. Mais le potager est bien garni @{2014} il n'y a pas beaucoup de terre où rien n'est planté, optimisation des réserves nutritives oblige.";
		],
	before_implicit [;
		Take: if (action_to_be == ##Eat) return 2;
	],
has scenery concealed pluralname edible female;

Object irrig "système d'irrigation" serre
	with description "Entre les plantes serpente un petit tuyau d'arrosage au goutte à goutte, contrôlé par l'ordinateur central, qui fait couler de l'eau lorsque les capteurs dans la terre lui disent qu'il faut de l'eau. C'est la solution la plus efficace en eau pour garder les plantes hydratées et en vie. Et ça n'est que ça, finalement : une perfusion qui dispense chichement une ressource précieuse et limitée à une plante exilée, arrachée de son écosystème et qui se sent souffrir et presque mourir inexorablement. Cette pensée ferait presque naître un sourire noir au coin de vos lèvres.",
	name 'systeme' 'irrigation' 'eau' 'goutte' 'tuyau' 'arrosage',
	before [; SwitchOff: "Le système d'irrigation est contrôlé par l'ordinateur central, et vous n'en avez pas le contrôle ; l'ordinateur gère lui-même la serre, pour un rendement optimal.";
		Cut: "Une telle action serait irrévocable, et vous doutez qu'il y ait beaucoup de tuyaux de rechange dans la base.";
		],
has scenery concealed ;


!==========================================================
! Le couloir

Object couloir "Couloir"
	with description "Vous n'avez jamais aimé ce couloir @{2014} pour être plus précise, vous ne vous êtes jamais sentie à l'aise en y marchant, et vous n'avez vraiment pas besoin de ça en ce moment. Il est petit, plutôt étroit, et le néon qui l'éclaire clignote une lumière blafarde. Il ne vous dit rien qui vaille. C'est aussi pour cela que vous avez déplacé votre sac de couchage dans la pièce principale, au nord d'ici, pour ne pas à avoir à marcher dans ce couloir tous les soirs pour rejoindre les quartiers, qui sont à côté de la porte condamnée à l'extrémité sud du couloir.",
	s_to devantporte,
	n_to bureau,
	cant_go "Le couloir va du nord au sud.",
	robotlocation "le couloir",
	before [; Listen: if (noun == 0) {"Vous ne pouvez pas entendre le grésillement grâce à la musique dans l'autre pièce, mais vous savez qu'il est là. En fait, si vous vous concentrez suffisamment, vous arrivez à l'entendre... Ou est-ce juste votre imagination qui vous joue des tours ?"; }
		Sleep: dontSleepHere(); rtrue;
		Sing: Chanter(); rtrue;
		],
	compass_look [obj;
		if (obj == n_obj) { <<Examine mockbureau>>; }
		if (obj == s_obj) { <<Examine mockporte>>; }
	],
has scenery concealed ;

Object malfunclamp "néon" couloir
	with description "Ce néon clignote plutôt rapidement, et émet un grésillement insupportable dans le silence ; heureusement, vous n'arrêtez jamais la musique de l'ordinateur, pour ne pas l'entendre, et aussi parce que le silence finirait de vous rendre folle. Il doit bien y avoir un moyen de le changer, mais vous ne savez pas où sont les autres néons, et vous n'avez pas vraiment envie de le faire. Vous évitez donc le couloir, c'est plus simple.",
	name 'neon' 'lampe' 'clignote' 'lumiere' 'cassee' 'casse' 'clignotant' 'clignotante',
	before [; Listen: "Vous ne pouvez pas entendre le grésillement grâce à la musique dans l'autre pièce, mais vous savez qu'il est là. En fait, si vous vous concentrez suffisamment, vous arrivez à l'entendre... Ou est-ce juste votre imagination qui vous joue des tours ?";
		Take: "Le néon est chaud, et de toute façon vous ne savez pas où sont les autres néons.";
		],
has scenery concealed;




!============================================================
! La porte condamnée

Object devantporte "Devant la porte condamnée"
	with description "De l'autre côté de la porte, le noir total, ou presque. Il s'agit du reste de la base, dont les circuits n'ont pas été activés après la catastrophe. Les ressources sont rares, on ne peut pas se permettre de vous laisser accès à toute la base, elle était prévue pour vous quatre. On a mis tout ce dont vous avez besoin dans une aile ; dites-nous si vous avez besoin d'autre chose mais ça devrait aller. La réserve est juste à côté, vers l'est ; à l'ouest, là où le couloir forme un angle, se trouve le dortoir où l'équipage était censé dormir, qui est maintenant vide, et le couloir vers la pièce principale va vers le nord.",
	w_to [; if (avancement == 4754) {"La réserve est tout près, et vous avez une faim de loup. Vous vous occuperez de Bob dans deux minutes.";} else {return devantquartiers;} ],
	e_to reserve,
	in_to reserve,
	n_to couloir,
	s_to "La porte est contrôlée par l'ordinateur central, lui-même contrôlé par la base. De toute façon, c'est vrai que vous n'avez pas vraiment besoin de plus d'espace vide, sombre et déprimant ; celui que vous avez est suffisant.",
	cant_go "Vous pouvez entrer dans la réserve ou revenir dans le couloir au nord ; ou aller vers les quartiers de l'équipage, mais vous n'y rentrerez pas. La porte en plexiglas est contrôlée par la base, et n'a pas été ouverte depuis un moment.",
	robotlocation "la porte condamnée",
	before [;
		Sleep: dontSleepHere(); rtrue;
		Sing: Chanter(); rtrue;
		Listen: EcouterMusique(); rtrue;
	],
	compass_look [obj;
		if (obj == e_obj or in_obj) {<<Examine mockreserve>>;}
		if (obj == n_obj) {<<Examine mockcouloir>>;}
		if (obj == s_obj) {<<Examine porte>>;}
		if (obj == out_obj) { <<Examine nooutside>>;}
	],
has scenery concealed ;

Object porte "porte condamnée" devantporte
	with description "Vous avez beau plisser les yeux, vous ne parvenez pas à distinguer la moindre forme de l'autre côté de la porte @{2014} ils ont dû fermer les volets, et aucune lumière n'est allumée bien entendu, ce qui fait que ce qui est de l'autre côté de la porte est un océan d'obscurité. Vous n'aimez pas regarder de l'autre côté ; une peur, primale, du noir, mais aussi le dégoût que vous inspire votre propre image, que vous voyez se refléter sur le plexiglas de la porte. Sans parler des cauchemars qu'il vous arrive de faire.",
	name 'porte' 'fermee' 'condamnee' 'sas' 'ferme' 'bloque' 'bloquee' 'condamne',
	before [; Open, Push, Pull: <<Go s_obj>>;
		Attack: "Vous frappez lourdement la porte de la paume de votre main, ce qui ne produit qu'un bruit mat. Mais votre c@oeur se met à battre un peu plus vite ; des images de monstres qui se réveillent et surgissent de l'obscurité vous traversent l'esprit, et vous devez vous forcer à regarder ailleurs et respirer calmement pour oublier ces stupidités.";
		],
has female scenery concealed openable;

Object reflet "reflet" devantporte
	with description "Vous vous forcez à regarder votre reflet, mais vous ne pouvez affronter cette vision bien longtemps. Ce que vous voyez pendant ces quelques secondes est une créature blafarde, aux cheveux noirs, les yeux comme deux abîmes noirs au milieu du visage, le corps décharné, voûté, à peine humain. Vous reconnaissez cette créature, sans vous reconnaître en elle ; quelque part, elle n'est pas vous, mais elle vous est familière : c'est comme si vous cohabitiez avec elle, tout en ne vous approchant pas d'elle, indifférente, ou bien la regardant de loin avec dégoût et mépris.",
	name 'reflet' 'moi' 'miroir' 'image' 'plexiglas' 'verre' 'corps' 'yeux' 'cheveux' 'creature' 'vision' 'visage',
	article "votre",
	before [; Push: "Vous approchez votre main du plexiglas, contemplant la paume de votre reflet s'approchant de la vôtre. Mais la froideur de la porte vous rappelle que cet espoir de contact humain n'est qu'une chimère.";
		Attack: "Au début, il vous arrivait de le faire, tant la colère et la douleur vous aveuglaient. Après tout, vous n'aviez personne à qui faire des reproches, personne pour faire face à votre colère face à une telle injustice, votre douleur insondable, votre honte d'avoir survécu. Le travail avec le Dr Peters vous a quelque part convaincu que cela était vain ; ne reste qu'un dégoût indifférent, méprisant.";
		Take: "Vous ne pouvez pas faire cela.";
	],
has scenery concealed;

!============================================================
! La réserve

Object reserve "Dans la réserve"
	with peur 0,
	description "La réserve est une petite pièce toute en longueur, avec des étagères en métal qui courent tout le long du mur, et au fond, le coin cuisine @{2014} rudimentaire, un évier et deux plaques de cuisson. Bien entendu, quasiment tous les vivres ont été perdus dans l'accident, et ce qui reste ici sont les rations de survie, en quelque sorte. Les étagères sont donc quasiment toutes vides, à part les deux les plus proches de la porte, qui elles sont raisonnablement bien remplies ; mais elles sont remplies en majorité de ce @<< tofu de l'espace @>>, comme tout le monde l'appelait, même si il y a d'autres choses comme les sauces, votre dernier bout d'humanité. Vous pouvez ressortir vers le couloir principal et la porte condamnée.",
	w_to [; if (avancement > 4754) {
			if (self.peur==0) { self.peur = 1; print "Vous revenez vers la porte condamnée, plongée dans une semi-obscurité ; vous sentez votre estomac se nouer, comme tenaillé par un mauvais pressentiment. La peur vous emplit, sans que vous sachiez trop pourquoi.";}
			return devantportepeur;
		} else {return devantporte;} ],
	out_to [; <<Go w_obj>>; ],
	cant_go "Vous pouvez seulement sortir de la réserve par l'ouest.",
	robotlocation "la réserve",
	before [;
		Sleep: dontSleepHere(); rtrue;
		Sing: Chanter(); rtrue;
		Listen: "Vous n'entendez plus vraiment la musique ici.";
	],
	compass_look [obj;
		if (obj == w_obj or out_obj) {<<Examine mockporte>>;}
	],
has scenery concealed;

Object plaques "plaques de cuisson" reserve
	with description "Deux plaques de cuisson électriques, comme il y en a plein sur Terre. Les casseroles et poêles doivent être quelque part par là, vous ne savez plus trop où @{2014} pour être honnête, ça fait un moment que vous ne vous en êtes pas servie : vous n'avez plus la patience de cuisiner, d'attendre, de prendre un risque, d'essayer quelque chose de nouveau.",
	name 'plaque' 'plaques//p' 'cuisson' 'a//' 'induction' 'cuire' 'cuisine' 'burner' 'electrique' 'electriques//p' 'deux',
	before [; SwitchOn: "Ça fait une éternité que vous n'avez pas fait cuire quelque chose. Parfois vous vous dites que ça serait bien si vous essayiez de cuisiner quelque chose, pour une fois ; mais la motivation disparaît vite, et vous n'avez jamais envie de faire cet effort-là.";
		SwitchOff: "Elles sont déjà éteintes.";
		],
has female pluralname scenery concealed;

Object evier "évier" reserve
	with description "Un évier en métal, presque banal à part la forme du robinet : une sorte de tube incurvé en métal, avec un détecteur de mouvements à sa base. Bien sûr, comme pour toutes les sources d'eau sur la base, l'eau qui s'écoule est scrupuleusement récupérée, traitée et réutilisée ; vous en avez besoin, ainsi que les plantes. Cependant, ça n'est pas comme si vous manquiez totalement d'eau : il y a pas mal de glace sur Mars, et de plus les piles à combustible qui alimentent la base (en partie, l'autre partie de l'énergie venant du Soleil) créent de l'eau en plus de l'énergie. Mais tout ça coûte de l'énergie ou de l'hydrogène, donc tout est contrôlé et réutilisé, dans le but d'en gaspiller le moins possible.",
	name 'evier' 'eau' 'robinet' 'metal' 'cuve' 'detecteur' 'capteur' 'mouvement' 'mouvements//p' 'base',
	before [; SwitchOn, DetecMouvements: "Vous passez la main devant le détecteur de mouvements, et un peu d'eau coule du robinet. Un gaspillage d'au moins un dé à coudre d'eau ; espérons que ça fasse rager Koskinen, pensez-vous avec un sourire noir.";
		SwitchOff: "L'évier ne coule pas.";
		Turn: "C'est un de ces éviers avec détecteur de mouvements ; c'est plus hygiénique, et plus futuriste.";
		],
has switchable scenery concealed;

Object etageres "étagères" reserve
	with description "Les étagères sont en métal, bien entendu @{2014} faites avec les mêmes pièces que, par exemple, votre chaise de bureau. Bien sûr, maintenant que vous êtes toute seule et que la charge utile s'est évaporée, il y a quatre fois trop d'étagères dans cette pièce, mais ça les robots ne pouvaient pas le savoir. Personne ne pouvait le savoir.",
	name 'etagere' 'etageres//p' 'meuble' 'meubles//p' 'rangement' 'rangements//p' 'rayon' 'rayons//p' 'rayonnage' 'rayonnages//p' 'metal',
	before [; Search: "Les étagères sont pour la plupart vides, à part celles les plus proches de la porte, qui sont remplies de rations de survie : pains de tofu, sel, sauces, compotes et boîtes de conserve.";
		Empty: <<Take tofu>>;
		Compter: "Il y en a huit.";
	],
has female pluralname scenery concealed container transparent;

Object reserves "réserves de nourriture" reserve
	with description "Du faux tofu, des sauces, quelques compotes, et un petit nombre de boîtes de conserve pour les jours de fête. Vos maigres réserves de nourriture, que vous essayez de faire durer du mieux que vous pouvez. Enfin si vous êtes honnête avec vous-même, ça n'est pas tout à fait vrai : vous mettez un point d'honneur à les gérer avec un tout petit peu trop de discipline et de zèle. Se contenter du minimum, pour ne pas risquer la famine ; se mettre un tout petit peu en danger, puis s'en écarter ; s'habituer au manque, l'organiser, le contrôler, pour ne plus en souffrir et en tirer un réconfort.",
	name 'reserves//p' 'nourriture' 'bouffe' 'ersatz' 'compote' 'boite' 'boites//p' 'conserve' 'conserves//p' 'plat' 'plats//p',
	before [; Eat, Take: if (avancement == 4754) {"Juste des compotes ou des sauces ne calmeront pas votre faim. Il va falloir manger un de ces fichus pains protéinés...";} else {"Pour l'instant, la sensation de faim s'est arrêtée, inutile donc de manger.";}
		Compter: "Tacker vous a juste demandé de compter les pains de tofu @{2014} s'il voulait un inventaire complet des réserves de nourriture, il n'avait qu'à le demander. Et ça semble épuisant rien que d'y penser.";
		],
	before_implicit [;
		Take: if (action_to_be == ##Eat) return 2;
	],
has female pluralname scenery concealed edible;

Object tofu "tofu de l'espace" etageres
	with description [; print "Tout le monde appelait ça @<< tofu de l'espace @>>, en rigolant. Et c'est vrai que ça ressemble un peu au tofu : c'est une sorte de petit pain en forme de parallélépipède dans un film transparent, ça n'a pas de goût et c'est plein de protéines. Mais le tofu est un mensonge @{2014} un mensonge nécessaire si vous voulez être capable d'en manger. En réalité, c'est tout simplement ce qui est produit par une machine spéciale, quelque part sous la base, à partir d'ingrédients divers, débris végétaux, oligo-éléments, et surtout, déchets humains. Oui, c'est tout simplement de la merde recyclée. C'est dégoûtant, mais de toute façon, vous n'avez pas le choix, c'est plus ou moins votre seul complément en protéines ici. (Le "; style underline; print "Valiant"; style roman; print " contenait des germes de soja, mais ils sont donc partis en fumée.) Certains jours, vous ne vous sentez pas la force d'en manger ; mais d'autres jours, cela vous paraît être la punition adéquate, et cette image vous rassure presque : celle d'une astronaute ratée coincée sur un purgatoire désertique pour une éternité, condamnée à manger sa propre merde."; "";
		],
	name 'tofu' 'tofus//p' 'espace' 'proteine' 'proteines//p' 'recycle' 'recycles//p' 'pain' 'pains//p' 'bloc' 'blocs//p' 'caca' 'cacas//p' 'merde' 'merdes//p' 'fade' 'marron' 'plastique' 'transparent' 'film' 'complement' 'complements//p' 'supplement' 'supplements//p',
	before [; Eat, Take: if (avancement == 4754) {AdvancePlot(); "Calmer la faim une fois pour toutes, même si c'est en mangeant un de ces pains dégueulasses. Vous en prenez un sur le dessus de l'étagère et commencez à enlever l'emballage.^^Le pain est quasiment assez petit pour rentrer tout entier dans votre bouche. Eurf, pourquoi avez-vous pensé à ça @{2014} maintenant vous imaginez votre bouche remplie toute entière de cette pâte épaisse et sans aucun goût. Vous fermez les yeux et respirez, puis mangez une bouchée. Bien sûr, ça n'a aucun goût ; vous prenez une pincée de sel, que vous mettez dans votre bouche : c'est tolérable, mais pas encore ça. De toute façon, ça n'est jamais ça. Si la charge utile de la navette ne s'était pas évaporée, vous auriez eu toutes sortes d'épices et d'herbes à planter, et même quelques arômes chimiques en plus ; mais là, sans rien, c'est juste insupportable.^^Au bout d'une dizaine de minutes à lutter contre le dégoût, vous finissez à grand-peine le pain de protéines. Vous vous sentez plus rassasiée, mais vous avez envie de vomir. Se nourrir ici est un combat, difficile et vraiment peu gratifiant. Pas étonnant que vous soyez déprimée, et vous êtes sûre qu'un b@oeuf bourguignon vous guérirait instantanément. Cinq mois avant le retour du goût...";} else {<<Eat reserves>>;}
		Compter: switch(avancement) {
			4750: AdvancePlot(); "Bon, alors, voyons voir ça.^^Vous placez votre bras derrière la pile de tofu sur l'étagère, puis d'un grand coup vous balayez tout ça hors de l'étagère. Les pains de tofu valsent et s'écrasent sur le sol. Cette destruction, bien qu'un peu puérile bien entendu, vous procure une joie certaine, et vous éclatez de rire.^^Vous vous penchez et commencez à ramasser les pains de tofu, les posant au fur et à mesure, par groupes de cinq, sur l'étagère. Vous comptez à voix haute, pour couvrir le silence, et pour ne pas perdre le compte. Finalement, au bout d'une dizaine de minutes, vous arrivez au bout de la pile. @<< Cent seize ! @>> faites-vous, fièrement. Puis vous vous répétez mentalement le chiffre plusieurs fois, pour être sûre de ne pas l'oublier. Il faudrait maintenant que vous alliez répondre au mail du Major.";
			4751: "Il y en a 116.";
			4752, 4753, 4754: "Il y en a cent... quelque chose. Vous avez déjà oublié le chiffre, depuis hier. Pas grave.";
			4755: "Vous ne vous souvenez plus de combien il y en avait quand vous avez compté hier, mais une chose est sûre, il y en a un de moins maintenant.";
			}
		],
	before_implicit [;
		Take: if (action_to_be == ##Eat) return 2;
	],
has scenery concealed edible;

Object sauces "sauces" etageres
	with description "Sur ces étagères, il y a du sel (en quantité industrielle @{2014} il y a beaucoup de dépôts de sel sur la surface de Mars, que les robots peuvent collecter) et quelques sauces. Et les sauces sont malheureusement en quantité limitée, importées directement de Terre, pour la plupart déshydratées (à part quelques échantillons, pour retrouver les sensations terriennes et remonter le moral). Du ketchup, de la mayonnaise, de la sauce piquante. C'est sans doute ce qu'il y a de plus goûtu sur la base, en tout cas ce que vous préférez ; il vous est difficile de ne pas vous en servir à chaque repas, et vous avez l'impression que c'est la seule trace de goût, la seule trace de Terre qu'il vous reste. Et les réserves diminuent de jour en jour. Si un jour elles venaient à s'épuiser...",
	name 'sauce' 'sauces//p' 'piquante' 'piquantes//p' 'ketchup' 'mayo' 'mayonnaise' 'piment' 'piments//p' 'forte' 'fortes//p' 'condiment' 'condiments//p' 'goutue' 'goutues//p' 'sel',
	before [; Eat, Take: <<Eat reserves>>;
		Compter: "Pas vraiment besoin de s'inquiéter pour le sel, il y en a en quantités illimitées sur Mars. Quand aux sauces, il reste à peine une demi-douzaine de petits échantillons non déshydratés, et plusieurs dizaines @{2014} une cinquantaine ? une centaine ? @{2014} de paquets déshydratés. Pas vraiment de quoi en manger tous les jours, quoi.";
		],
	before_implicit [;
		Take: if (action_to_be == ##Eat) return 2;
	],
has female pluralname scenery concealed edible;

!============================================================
! Les quartiers

Object devantquartiers "Devant les quartiers de l'équipage"
	with description "Au nord se trouve la pièce où les lits superposés ont été placés ; la lumière de l'extérieur fait apparaître le pied d'un des lits contre le mur. C'était censé être le dortoir, les quartiers de l'équipage où tout le monde se serait retiré pour la nuit. La seule fois où vous y êtes rentrée, vous avez éclaté en sanglots au bout d'une minute, et vous n'y êtes jamais revenue. Votre sac de couchage est dans la pièce principale, votre pièce, votre caverne ; cette pièce est juste un vestige d'une ère passée, qui n'est plus, et elle est pleine de fantômes, tapis dans l'obscurité la plus totale. Vous pouvez revenir devant la porte condamnée en vous dirigeant vers l'est.",
	e_to devantporte,
	n_to [; if (player in devantquartiers) {	! On teste qui veut aller dedans, pour permettre aux roombas d'y aller
			"Votre c@oeur bat la chamade rien que d'y penser. Hors de question. Vous ne vous sentez pas capable d'y revenir, jamais. C'est là où se trouvent l'obscurité, la peur, les souvenirs, la culpabilité. Vous évitez cette pièce comme la peste.";
			} else {return quartiers;}
	],
	in_to [; <<Go n_obj>>; ],
	cant_go "Les quartiers de l'équipage sont au nord, mais vous n'y rentrerez pas. Autant revenir devant la porte condamnée, vers l'est.",
	robotlocation "les quartiers de l'équipage",
	before [; Listen: "Vous n'entendez plus vraiment la musique ici.";
		Sleep: dontSleepHere(); rtrue;
		Sing: Chanter(); rtrue;
	],
has scenery concealed ;

Object lits "lits superposés" devantquartiers
	with description "La lumière du couloir fait apparaître le pied d'un des lits superposés, près de la porte ; vous pouvez vaguement distinguer la forme d'un sac de couchage posée sur le cadre du lit. Vous savez que l'autre lit superposé est au fond de la pièce, contre le mur opposé. Mais vous préférez ne pas y penser trop longtemps.",
	name 'lit' 'lits//p' 'cadre' 'sac' 'couchage' 'superpose' 'superposes//p' 'couchette' 'couchettes//p' 'couchage' 'couchages//p' 'pied' 'pieds//p' 'metal',
	before [; Take: "Vous ne poserez pas le pied dans cette pièce, même pour une demi-seconde.";
		],
has scenery concealed;

Object quartiers "Quartiers de l'équipage"
	with description "Il fait noir, et vous ne pouvez rien voir.",
	e_to devantquartiers,
	out_to devantquartiers,
has scenery concealed;

!============================================================
! La porte condamnée quand on a peur

Object devantportepeur "Devant la porte condamnée"
	with description "Fait-il plus sombre ici qu'il y a quelques instants ? Bizarrement, on dirait. Vous vous sentez peu rassurée ici, tout d'un coup ; c'est comme si il faisait plus noir, comme si l'obscurité était plus épaisse, plus menaçante de l'autre côté de la porte, comme si votre reflet était plus flou. Vous fermez les yeux quelques secondes, mais quand vous les rouvrez, c'est la même chose, et votre c@oeur s'emballe un peu. Peut-être la peur d'aller dans les quartiers, à l'ouest.",
	w_to [; print "Bon, quand il faut y aller... Vous respirez un grand coup avant de vous avancer vers les..."; w8(); print "^^Un éclair soudain sur votre gauche, dans votre vision périphérique. Derrière la porte. Enfin vous croyez ? Vous vous tournez face à la porte, doucement. Ça n'est pas possible, tout de même, sûrement une..."; w8(); print "^^NON vous n'aviez pas rêvé vous sursautez et courez hors de portée de cette obscurité mais vous arrivez devant les quartiers eux aussi plongés dans le noir @{2014} respire, respire bon sang, calme-toi calme-toi."; return devantquartierspeur; ],
	e_to reserve,
	in_to reserve,
	n_to "Bien sûr, il vous faut secourir Bob. Mais vous avez un mauvais pressentiment @{2014} pire, en fait, carrément la peur au ventre. Votre estomac est noué, vous avez du mal à respirer. Vous fermez les yeux quelques secondes, appuyée contre le mur. Courage.",
	s_to "Cette porte vous terrifie soudainement. Infranchissable, et qui sait ce qu'il s'y tapit derrière ? Si vous l'ouvriez, vous êtes prête à parier que quelque chose vous sauterait dessus. Ou que les ténèbres envahiraient la base comme une fumée noire et maléfique.",
	cant_go "Vous pourriez revenir dans la réserve, et le couloir est au nord. Mais il faudrait vraiment aller voir pourquoi Bob est bloqué dans les quartiers de l'équipage, vers l'ouest.",
	robotlocation "la porte condamnée",
	before [;
		Sleep: dontSleepHere(); rtrue;
		Sing: "Vous fredonnez une chanson d'une voix mal assurée, pour essayer de penser à autre chose.";
		Listen: "Vous essayez d'écouter la chanson au loin, mais vous n'arrivez pas à vous concentrer assez.";
	],
	compass_look [obj;
		if (obj == e_obj or in_obj) {<<Examine mockreserve>>;}
		if (obj == n_obj) {<<Examine mockcouloir>>;}
		if (obj == s_obj) {<<Examine portepeur>>;}
	],
has scenery concealed ;

Object portepeur "porte condamnée" devantportepeur
	with description [; print "Ce noir, si intense... vous terrifie, même si vous savez que c'est stupide. Vous tentez de contrôler votre respiration. Tout va bien, ce n'est rien. Tu es seule sur Mars, il n'y a personne d'autre, aucune trace de vie, rien, nada. Même pas un insecte. La solitude absol"; w8(); print "^^Qu'est-ce que c'était que ça ?^^Un petit éclair de lumière de l'autre côté de la porte. Vous restez là, pétrifiée. C'était jaune, comme une bougie, ou un ver luisant @{2014} en tout cas, pas comme une petite diode qui s'allume et s'éteint. Qu'est-ce qui a bien pu"; w8(); print "^^AH!^^Vous prenez les jambes à votre cou, et courez pour atteindre les quartiers, ce qui ne fait rien pour vous calmer ; vous déglutissez à grand-peine, vous sentant comme bloquée, encerclée par l'obscurité."; PlayerTo(devantquartierspeur); rtrue;
		],
	name 'porte' 'fermee' 'condamnee' 'sas' 'ferme' 'bloque' 'bloquee' 'condamne',
	before [; Open, Push, Pull: <<Go s_obj>>;
		Attack: print "Ce noir, si intense... vous terrifie, même si vous savez que c'est stupide. Vous vous forcez à rire pour dissiper l'angoisse : bien entendu, vous êtes seule, c'est bête. Il n'y a rien derrière cette stupide porte. Vous riez, puis tout en riant, par bravade ou pour essayer de dédramatiser encore plus, vous frappez la porte de plexiglas. Rien ne se passe, c'est à peine si elle vibre. Vous riez."; w8(); print "^^C'était quoi ça ?"; w8(); print "^^Vous êtes quasiment sûre d'avoir vu une lueur s'allumer et s'éteindre très rapidement de l'autre côté de la porte. La lueur n'a rien éclairé, mais... Qui... Comment..."; w8(); print "Encore une @{2014} cette fois-ci, vous vous enfuyez sans demander votre reste, et atterrissez devant les quartiers. Ça n'arrange pas votre peur ; vous voilà haletante, presque pétrifiée."; PlayerTo(devantquartierspeur); rtrue;
		],
has female scenery concealed openable;

Object refletpeur "reflet" devantportepeur
	with description [; print "Vous levez les yeux tant bien que mal pour regarder votre reflet, une impression floue de votre silhouette, que vous étudiez avec lassitude et une sorte de répulsion sourde. Votre enveloppe charnelle se"; w8(); print "^^Qu'est-ce que c'était que ça ? Vous fixez votre regard sur le point sur votre gauche qui vient de s'éclairer brièvement. C'était une lueur, c'était un éclair d'une lumière jaune, comme une bougie qui... Non, vous avez dû mal voir..."; w8(); print "^^La même, un peu plus basse, comme un peu plus... proche ?^^C'est trop ; vous vous éloignez vivement de la porte, sans lui tourner le dos, aussi rapidement que vous pouvez, le souffle coupé. Vous tournez dans le couloir, pour vous retrouver face au dortoir plongé dans l'obscurité ; vous vous adossez au mur, terrifiée."; PlayerTo(devantquartierspeur); rtrue;
		],
	name 'reflet' 'moi' 'miroir' 'image' 'plexiglas' 'verre' 'corps',
	article "votre",
	before [; Push: print "Vous levez les yeux tant bien que mal pour regarder votre reflet, une impression floue de votre silhouette, que vous étudiez avec lassitude. C'est vous, ça ? Pourtant, quand vous bougez, elle bouge. Vous approchez votre main du plexiglas, comme pour toucher cette"; w8(); print "^^Qu'est-ce que c'était que ça ? Vous fixez votre regard sur le point sur votre gauche qui vient de s'éclairer brièvement. C'était une lueur, c'était un éclair d'une lumière jaune, comme une bougie qui... Non, vous avez dû mal voir..."; w8(); print "^^La même, un peu plus basse, comme un peu plus... proche ?^^C'est trop ; vous vous éloignez vivement de la porte, sans lui tourner le dos, aussi rapidement que vous pouvez, le souffle coupé. Vous tournez dans le couloir, pour vous retrouver face au dortoir plongé dans l'obscurité ; vous vous adossez au mur, terrifiée."; PlayerTo(devantquartierspeur); rtrue;
		Attack: print "Vous levez les yeux tant bien que mal pour regarder votre reflet, une impression floue de votre silhouette, que vous étudiez avec répulsion. C'est vous, ça ? L'ombre de vous-même, pensez-vous avec un sourire dédaigneux. Regardez l'astronaute, l'exploratrice des mondes"; w8(); print "^^Qu'est-ce que c'était que ça ? Vous fixez votre regard sur le point sur votre gauche qui vient de s'éclairer brièvement. C'était une lueur, c'était un éclair d'une lumière jaune, comme une bougie qui... Non, vous avez dû mal voir..."; w8(); print "^^La même, un peu plus basse, comme un peu plus... proche ?^^C'est trop ; vous vous éloignez vivement de la porte, sans lui tourner le dos, aussi rapidement que vous pouvez, le souffle coupé. Vous tournez dans le couloir, pour vous retrouver face au dortoir plongé dans l'obscurité ; vous vous adossez au mur, terrifiée.";  PlayerTo(devantquartierspeur); rtrue;
		Take: "Vous ne pouvez pas faire cela.";
	],
has scenery concealed;

!============================================================
! Les quartiers quand on a peur

Object devantquartierspeur "Devant les quartiers de l'équipage"
	with description "Vous respirez à grandes goulées d'air, qui vous brûle les poumons ; la tête tourne, les yeux troubles, l'estomac contracté. La terreur pure qui coule dans vos veines. Y a-t-il quelque chose, quelqu'un ici ? Impossible, impossible vous dites-vous. Mais alors pourquoi cette sensation d'être épiée, entourée par l'ombre sinistre ? Vous tentez de vous calmer en fixant la petite lumière qui clignote dans la pièce sombre au nord ; c'est Bob, et il a besoin de vous.",
	e_to "Partir, sortir d'ici @{2014} mais pour aller où ? Cette base est une bulle hermétique, vous ne pouvez aller nulle part. Et demain quand tout sera fini, Bob sera toujours coincé, et vous devrez revenir. Courage @{2014} mais la terreur vous saisit et l'idée de rentrer dans cette pièce vous donne presque envie de vomir. La situation est insoluble ; votre c@oeur bat à cent à l'heure, vous êtes incapable de vous concentrer sur quoi que ce soit. De désespoir, de peur, ou pour tenter de vous donner du courage, vous hurlez.",
	n_to [; if (player in devantquartierspeur) {	! On teste qui veut aller dedans, pour permettre aux roombas d'y aller
			if (avancement == 4755) {SceneFinale(); rtrue;}
			} else {return quartiers;}
	],
	in_to [; <<Go n_obj>>; ],
	cant_go "Vous vous sentez prisonnière, que faire, où aller, où @{2014} Bob, Bob, Bob est là, Bob est dans les quartiers, Bob a besoin de vous.",
	before [; Listen: "Le petit robot émet des petits bips de temps en temps, comme un petit appel au secours.";
		Sleep: "Ça n'est pas une bonne idée @{2014} et si, enfin c'est bête, mais et si il y avait vraiment quelque chose ici ?";
		Sing: "Vous êtes terrifiée @{2014} vous ne parvenez pas à vous concentrer sur une chanson.";
		#Ifdef LIBRARY_FRENCH;      ! hack pour la traduction
		CrierSansPrecision: "De désespoir, de peur, ou pour tenter de vous donner du courage, vous hurlez.";
		#Endif;
	  ],
	robotlocation "les quartiers de l'équipage",
has scenery concealed ;

Object litspeur "lits superposés" devantquartierspeur
	with description "Les seuls meubles de la pièce. Des meubles en métal froid, et Bob a l'air de s'être renversé derrière celui de droite. Si seulement ils n'étaient pas là, vous pourriez vous arrêter de penser aux monstres qui se tapissent sous les lits pour sortir la nuit tombée agripper les pieds des petites filles @{2014} enfin, calme-toi, bon sang, quel âge tu as !?",
	name 'lit' 'lits//p' 'cadre' 'sac' 'couchage' 'superpose' 'superposes//p' 'couchette' 'couchettes//p' 'couchage' 'couchages//p' 'pied' 'pieds//p' 'metal',
	before [; Take: "Prendre les @{2014} vous vous mettez à penser de façon incohérente. Vous fermez les yeux et tentez de vous calmer, mais ça ne marche pas, alors vous essayez de hurler, et le son de votre cri qui rebondit sur les murs vides vous calme quelque peu, mais la peur reste bien présente.";
		],
has scenery concealed;


!==========================================================
! Les objets vides qui correspondent aux pièces attenantes

Class PieceVoisine
	with before [;
		Search, LookUnder: <<Examine self>>;
	],
has scenery concealed enterable ;

PieceVoisine mockbureau "bureau"
	with found_in devantserre couloir,
	description [; switch(location) {
		devantserre: "Au sud se trouve la pièce principale, le bureau dans lequel vous passez le plus clair de votre temps.";
		couloir: "Au nord se trouve la pièce principale, le bureau dans lequel vous passez le plus clair de votre temps.";
		} ],
	#Ifdef LIBRARY_FRENCH; ! hack sordide parce qu'on traduit "bureau" par "desk" pour l'objet bureau...
	name 'bureau' 'piece' 'principale',
	#Endif;
	#Ifdef LIBRARY_ENGLISH;
	name 'office' 'piece' 'principale',
	#Endif;
	before [; Enter: switch(location) {
			devantserre: <<Go s_obj>>;
			couloir: <<Go n_obj>>;
		}
		Push, Pull, Turn, Take, Touch: "Vous n'êtes pas dans cette pièce.";
	],
has ;

PieceVoisine mockalcove "alcôve"
	with found_in bureau,
	description "Au nord se trouve une petite alcôve, qui mène devant la serre et la salle de bains.",
	name 'separation' 'sas' 'alcove' 'serre' 'salle' 'bains' 'bain' 'porte',
	before [; Enter: <<Go n_obj>>;
	],
has female;

PieceVoisine mockserre "serre"
	with found_in devantserre,
	description "Derrière la porte vitrée à l'est se trouve la serre de la base, où quelques plantes poussent tant bien que mal dans le sol martien.",
	name 'serre' 'plante' 'plantes//p' 'nourriture' 'legume' 'legumes//p' 'carre' 'potager' 'plantation',
	before [; Eat, Take, Pull, Push, Turn, LookUnder, Touch: "Vous n'êtes pas à l'intérieur de la serre.";
		Enter: <<Open porteserre>>;
	],
has female;

PieceVoisine mockcouloir "couloir"
	with found_in bureau devantporte devantportepeur,
	description [; switch(location) {
			bureau: "Au sud se trouve le couloir qui mène vers le reste de la base.";
			devantporte: "Au nord se trouve le couloir qui mène vers le bureau et la serre.";
			} ],
	name 'couloir' 'corridor' 'passage',
	before [; Enter: switch(location) {
			bureau: <<Go s_obj>>;
			devantporte: <<Go n_obj>>;
			devantportepeur: <<Go n_obj>>;
			}
	],
has ;

PieceVoisine mockporte "porte condamnée"
	with found_in couloir reserve,
	description [; switch(location) {
			couloir: "Vous apercevez la porte condamnée à l'extrémité sud du couloir.";
			reserve: "Vous apercevez la porte condamnée juste au dehors de la réserve.";
			} ],
	name 'porte' 'fermee' 'condamnee' 'sas' 'ferme' 'bloque' 'bloquee' 'condamne',
	before [; Enter: switch(location) {
			couloir: <<Go s_obj>>;
			reserve: <<Go out_obj>>;
			}
		Open, Close, Push, Pull, Turn, Take, Touch: "Vous en êtes trop loin.";
	],
has female;

PieceVoisine mockreserve "réserve"
	with found_in devantporte devantportepeur,
	description "L'entrée de la réserve est juste à côté, vers l'est.",
	name 'entree' 'reserve',
	before [; Enter: <<Go in_obj>>;
	],
has female;



!==========================================================
! Les robots

[ moveRoomba obj loc routinecount i dir rand;
	! Choisit une des sorties au hasard (hasard peut-être pipé) et y va
	! Inspiré de l'extension dirs.h
	loc = parent(obj);
	routinecount = 0;
	objectloop(i in Compass) {
		if (loc provides (i.door_dir)) {
			if (loc.(i.door_dir) ofclass Object && loc.(i.door_dir) ~= nothing) {
				routinecount = routinecount+1;
				if (routinecount == 1) 	{dir = loc.(i.door_dir);}
					else		{rand = random(routinecount); if (rand==1) {dir = loc.(i.door_dir);}}
			}
		}
	}
	if (routinecount>0) {
		move obj to dir;
		if (player in loc) {print_ret "^", (The) self, " roule d'un air décidé vers ", (string) dir.robotlocation, ".";}
		if (player in dir) {print "^"; print (The) self; " arrive d'un air décidé dans la pièce.";}
		}
	return true;
];


Class Robot
	with
	described 0,
	nom1 0,
	nom2 0,
	desc 0,
	short_name [; if (self.described==0) {print (string) self.nom2;} else {print (string) self.nom1;} return true;],
	description [; self.described=1; give self proper; print_ret (string) self.desc;],
	before [; Take, Push, PushDir, Pull, Turn: "Il roule plutôt vite @{2014} et en plus, il pèse une tonne.";
		Compter: if (roomba1 in location && roomba2 in location) {"Il y a Bob, et il y a Bill. Eh oui, les deux robots sont ici, dans la même pièce. Passionnant.";} else {"Il y a un robot ici.";}
		#IfDef LIBRARY_FRENCH;             ! Grmbl garder le même code pour la traduction
		ParlerSansPrecision: <<Tell self>>;
		#Endif;
		Taste: <<Kiss self>>;
		SwitchOn: print_ret (The) self, " est déjà allumé @{2014} il l'est en permanence.";
		Open, SwitchOff: "Vous ne savez pas comment faire ça. De toute façon, la base ne vous laisserait sûrement pas faire.";
		],
	daemon [i ;
		i = random(15); switch(i) {
			1: if (player in parent(self)) {print "^"; print (The) self; " roule de quelques centimètres, une diode clignotant sur son dos. Il a l'air très affairé.";}
			2: if (player in parent(self)) {print "^"; print (The) self; " s'arrête net, et ne clignote plus. Il pense.";}
			3: if (player in parent(self)) {print "^"; print (The) self; " tourne d'un côté, puis de l'autre ; un micro-conflit dans ses priorités, vite résolu.";}
			4: moveRoomba(self); return true;
			5: moveRoomba(self); return true;
			6: moveRoomba(self); return true;
		}
		],
	life [; Tell, Ask, Answer, Show, Give: "Ces robots ne sont pas doués de conscience @{2014} pas moyen d'interagir avec eux. Ils n'avaient pas prévu que quelqu'un pourrait se retrouver seul dans la base et aurait besoin de compagnie...";
		Attack: "Vous seriez sans doute celle des deux qui aurait le plus mal.";
		Kiss: "Euh... non. Vous êtes peut-être seule, mais ça ne vous viendrait jamais à l'esprit.";
	],
	orders "Vous ne pouvez pas donner des ordres directement aux robots. En théorie il y a bien un moyen, en passant par une interface sur l'ordinateur, mais vous ne vous en êtes jamais servi depuis votre arrivée. Ils se débrouillent très bien comme ça.",
has animate ;


Robot roomba1
	with
	decouvert 0,
	nom1 "Bob",
	nom2 "robot rouge",
	desc "Le petit robot rouge, c'est Bob. Vous ne savez pas trop pourquoi, mais c'est le nom qu'on lui a donné. C'est l'un des deux robots qui cohabitent avec vous. Ils bougent, mais ne sont pas doués de conscience, et ne sont pas vraiment capables d'interagir avec vous @{2014} la robotique n'a pas évolué assez vite pour faire des robots qui auraient pu vous tenir compagnie. Ils sont contrôlés par l'ordinateur central, qui leur donne toutes sortes de tâches à effectuer dans la base, que ce soit s'occuper des plantes, nettoyer la moquette, ou même analyser des échantillons.",
	name 'robot' 'drone' 'petit' 'animal' 'compagnie' 'rouge' 'esclave' 'domestique' 'bob',
has ;


Object roomba1coince "Bob"
	with description "Vous ne pouvez pas vraiment le voir, mais ses clignotements rouges se reflètent un peu sur les murs blancs : il est derrière le lit superposé de droite. Mais pourquoi était-il là ? Et surtout comment s'est-il renversé ? Ils ne se renversent jamais, retombent toujours sur leurs pattes... Une vision nette et horrible vous traverse l'esprit, celle d'un gobelin affreux assis sur le robot retourné, vous attendant avec un sourire maléfique @{2014} ah putain, arrête, Charlotte, tu débloques ! Il n'y a pas de gobelins, c'est dans ta tête ! Rentre, prends Bob, ressort !",
	name 'robot' 'drone' 'petit' 'animal' 'compagnie' 'jaune' 'bob' 'lumiere' 'diode',
	each_turn [ i; i=random(8); switch(i) {
			1: "Vous voyez la petite diode rouge de Bob clignoter toute seule dans le noir.";
			2: "Le petit robot émet des petits bips de temps en temps, comme un petit appel au secours.";
			}
		],
	before [; Push, Pull, Take, Touch: "Vous rentrez, vous le prenez, ou vous le retournez, et vous sortez. Facile. Allez, courage. Courage courage courage.";
		],
has animate concealed scenery ;

Robot roomba2
	with
	nom1 "Bill",
	nom2 "robot jaune",
	desc "Lui, c'est Bill. Bill et Bob, les deux robots de la base. Mis à part leur couleur, ils sont rigoureusement identiques @{2014} aucune différence, que ça soit dans la répartition des tâches ou la personnalité, puisqu'ils n'en ont pas. Ce sont des robots idiots, des serviteurs de l'ordinateur central, qui gardent cette base en état. Ils n'arrêtent pas, en tout cas @{2014} ils ont sûrement plus de travail que ce qu'ils ont été conçus pour faire, puisque vous ne faites aucune des tâches que vous auriez été censée faire. C'est tout aussi bien : ils sont plus efficaces que vous, de toute façon. Vous avez besoin de temps, ou d'autre chose, mais en tout cas pas de suivre des ordres.",
	name 'robot' 'drone' 'petit' 'animal' 'compagnie' 'jaune' 'esclave' 'domestique' 'bill',
has ;


!==========================================================
! Personnage principal

Object moimeme "vous-même" bureau
  with short_name
       [;  return L__M(##Miscellany, 18);
       ],
       compteurmusique SONG_LENGTH,
       musiqueecoutee 0,
       compteur 5,
       description "Une enveloppe vide. L'ombre de vous-même. Vous avez cassé tous les miroirs, pour ne pas vous voir.",
       before [; Smell: "Il y a une odeur, c'est sûr. Mais ça ne vous dérange pas. Votre prochaine douche peut attendre.";
       ],
       each_turn [ i;
                ! Chaque tour du jeu il faut augmenter le compteur, mais on met un peu de random pour prendre en compte
                !   la durée des chansons, le fait qu'on est peut-être arrivé au milieu d'une chanson, la durée différente des actions...
       		if (self.compteurmusique < SONG_LENGTH && random(2) == 1) {self.compteurmusique++;}

       		! Hint machine
       		self.compteur++;
       		if (self.compteur == 15) {    ! Quelques hints
       			self.compteur = 0; switch(avancement) {
       				4748: "^Votre estomac grogne, et la sensation de faim est plutôt intense. Il vous faut trouver de quoi manger, pour le calmer un petit moment.";
       				4749: "^Vous ressentez une envie grandissante d'aller consulter vos emails. C'est fou comme votre cerveau peut être autant conditionné à un son spécifique. Ou peut-être êtes-vous juste en manque de communication.";
       				4751: if (e4749.replied==1) {
       					style underline;
       					self.compteur = 8;
       					i = random(6); switch(i){
       						1: print "^Qu'est-ce que tu fous encore ici, ma pauvre ? À quoi bon ? Tu ne sers à rien ici, ce sont les robots qui font tout.";
       						2: print "^Les secours ? Ils ne viendront jamais. Ils t'ont dit qu'ils arrivaient, mais comment ont-ils fait pour trouver des astronautes prêts pour une mission sur Mars, juste après ce qui venait de se passer ?";
       						3: print "^Les secours viendront peut-être, mais tu crois vraiment qu'ils vont te laisser repartir ? Il n'y a pas de navette retour. Ils vont te faire rester là, te faire bosser de gré ou de force. Ou te tuer.";
       						4: print "^Tout est de ta faute. Si tu n'avais pas appuyé sur ce bouton, ils seraient encore en vie. Tu les as tués, ni plus ni moins.";
       						5: print "^Tu donnerais ta vie pour qu'il ne soit pas mort, n'est-ce pas ? C'est trop tard. Il est mort.";
       						6: print "^Tu n'es bonne à rien. Regarde-toi te traîner comme une loque. Inutile, un gâchis d'oxygène.";
       					}
       					style roman; "^Les pensées négatives reviennent... Vous avez du mal à les éviter en ce moment. Et vous savez que quand elles commencent, il n'y a qu'une seule chose à faire pour les chasser, c'est vous recroqueviller dans votre lit et vous vider l'esprit, méditer, ou dormir. C'est comme ça. Ça ira peut-être mieux plus tard.";
       					}
       				     else {"^Il faudrait que vous envoyez ce mail à Tacker, avant d'oublier combien de pains protéiques il y a @{2014} 116, 116, 116, répétez-vous mentalement.";}
       				4754: "^Il faut vraiment que vous fassiez quelque chose à propos de ce robot @{2014} mais d'abord, manger, vite.";
       				4755: "^Allez, maintenant il faut aller secourir Bob. Courage...";
       				}
       		}
       	],
       time_out NULL, describe NULL,
       after NULL,    life NULL,
       capacity 100, parse_name 0,
       orders 0, number 0,
has  concealed animate proper transparent;

!==========================================================
! Routines

[ Initialise;
        LandingScreen();

	lookmode = 2;	! Mode verbeux
	inventory_style = ENGLISH_BIT+RECURSE_BIT+FULLINV_BIT;	! Inventaire décrit en une phrase
	ChangePlayer(moimeme);
	location = bureau;

	"^^17 heures. Une sensation désagréable de faim se fait sentir, pour la première fois de la journée. Il vous faut nourrir votre corps. Vous restez allongée dix minutes de plus, les pensées s'entrechoquant dans votre tête, comme d'habitude. Mais pour une fois, votre cerveau ne repousse pas l'idée, et aujourd'hui vous vous convainquez presque facilement de la nécessité de vous extraire de votre lit pour manger. Avec un long soupir, vous vous relevez.^^";
];

Constant MIN_SCREEN_WIDTH = 160;

[ DrawTitleBox ;
	box "     Life On Mars?     "
	    ""
	    "          par          "
	    ""
	    "     Hugo Labrande     ";
	print "^^^^^^^^";
	return;
];

[ LandingScreen i ;

	DrawTitleBox();

	! Est-ce que l'interpréteur est assez grand
	i = 0->33;
	if (i<MIN_SCREEN_WIDTH) {
		print "^Attention : pour des raisons de confort de lecture, le jeu nécessite une largeur d'écran d'au moins ", MIN_SCREEN_WIDTH, " colonnes ; actuellement la fenêtre dans laquelle vous lancez le jeu a une largeur de ", i, " colonnes. Si vous le pouvez, veuillez redimensionner la fenêtre dans laquelle se lance le jeu, et appuyez sur Entrée.^";
		w8();

		ClearScreen();
		DrawTitleBox();
		print "^Attention : pour des raisons de confort de lecture, le jeu nécessite une largeur d'écran d'au moins ", MIN_SCREEN_WIDTH, " colonnes ; actuellement la fenêtre dans laquelle vous lancez le jeu a une largeur de ", i, " colonnes. Si vous le pouvez, veuillez redimensionner la fenêtre dans laquelle se lance le jeu, et appuyez sur Entrée.^";
		i = 0->33;
		if (i<MIN_SCREEN_WIDTH) {
			print "^Le jeu détecte que la largeur est toujours insuffisante (", i, " colonnes au lieu de ", MIN_SCREEN_WIDTH, " idéalement) ; il est fortement recommandé de redimensionner votre fenêtre. Si vous ne le pouvez pas (par exemple, si vous jouez à ce jeu en ligne), il est recommandé de télécharger un interpréteur comme Gargoyle et de l'utiliser pour jouer à ce jeu. Désolé pour la gêne occasionnée !^";
			w8();
		} else { print "^La fenêtre est désormais assez grande, merci !^"; }

	}

	! Est-ce que l'interpréteur supporte les effets temporels
	if (IsTimeSupported() == false) {
		print "^Le jeu a détecté que vous jouez sans doute depuis une page Web, ou du moins depuis un interpréteur qui ne peut pas gérer les effets temporels. Ces effets temporels sont utilisés par le jeu de façon importante ; votre expérience risque ainsi d'être relativement éloignée du jeu tel que conçu par l'auteur, même si ça n'aura pas d'influence majeure sur la jouabilité. Pour voir tous les effets du jeu, il est recommandé d'utiliser un programme interpréteur tel que Gargoyle ou Frotz ; mais vous pouvez tout de même continuer si vous le désirez !^";
	} else {    ! Vitesse de défilement du texte
		print "^Calibration de la vitesse du jeu :^";
		! Est-ce que c'est nécessaire ? Après tout, c'est pas forcément ça le problème, c'est peut-être d'avoir à lire le mail et les pensées en même temps...
		Progressif("  Est-ce que cette ligne s'affiche trop rapidement pour votre confort de lecture ?",EMAIL_SPEED);
		print "^  >";
		if (YesOrNo()){
			EMAIL_SPEED = EMAIL_SPEED-1;                if (EMAIL_SPEED == 0) { EMAIL_SPEED--; }
			TYPING_SPEED_FAST = TYPING_SPEED_FAST-1;    if (TYPING_SPEED_FAST == 0) { TYPING_SPEED_FAST--; }
			!TYPING_SPEED_SLOW = -2;
			BASE_DELAY = BASE_DELAY + 2;
			Progressif("  Et comme ça, est-ce que c'est toujours trop rapide pour vous ?",EMAIL_SPEED);
			print "^  >";
			if (YesOrNo()) {
				EMAIL_SPEED = EMAIL_SPEED-1;              if (EMAIL_SPEED == 0) { EMAIL_SPEED--; }
				TYPING_SPEED_FAST = TYPING_SPEED_FAST-1;  if (TYPING_SPEED_FAST == 0) { TYPING_SPEED_FAST--; }
				!TYPING_SPEED_SLOW = -3;
				BASE_DELAY = BASE_DELAY + 2;
				print "Entendu ; le jeu a fait des ajustements, en espérant que cela vous convienne !";
			} else { print "Entendu ! La vitesse a été calibrée.";}
		} else { print "Entendu ! La vitesse a été calibrée.";}
		print " Vous pouvez dans tous les cas modifier cette vitesse pendant le jeu, en tapant @<< vitesse plus @>> pour accélérer le défilement, ou @<< vitesse moins @>> pour le ralentir.";
		print "^";
	}

	! Consulter les trigger warnings
	print "^Voulez-vous consulter les avertissements liés au contenu du jeu ? ("; Afficher("content warnings",ITALIQUE); print ")";
	print "^>";
	if (YesOrNo()) {
		Afficher("^Avertissement lié au contenu du jeu :^", GRAS);
		print "^   Ce jeu contient une scène sanglante/gore, des jurons standards, et quelques scènes effrayantes, et vous incarnez un personnage qui souffre de dépression et de stress post-traumatique.^";
		w8();
	}

	! Lien vers la playlist Spotify/Youtube
	print "^Enfin, pour vous plonger dans l'ambiance, vous pouvez écouter la playlist officielle du jeu, formée des titres que Charlotte écoute tout au long de l'aventure.^";
	print "	    Playlist Spotify: http://doiop.com/LifeOnMarsSpotify^";
	print "	    Playlist Youtube: http://doiop.com/LifeOnMarsYoutube^";

        print "^^[Appuyez sur une touche pour commencer le jeu...]";
        w8();
	ClearScreen();
	"";
];


[ dontSleepHere ;
	"Vous ne dormez pas ici, mais dans le bureau.";
];


[ AdvancePlot i j ;
	moimeme.compteur = 5;
	! AdvancePlot() = AdvancePlot(1)
	if (i==0) {i=1;}
	for (j=0: j<i: j++){
	switch(avancement) {
		4748: avancement++; give e4749 ~concealed;
		4749: avancement++; give e4750 ~concealed;
		4750: avancement++; give e4751 ~concealed;
		4751: avancement++; give phantomemail ~concealed; give e4752 ~concealed;
		4752: avancement++; give e4753 ~concealed; remove roomba1; StopDaemon(roomba1); move roomba1coince to devantquartierspeur;
		4753: avancement++; give e4754 ~concealed;
		4754: avancement++;
		default: rtrue;
	}
	}
];

[ DecouverteBob ;
	switch(roomba1.decouvert) {
		0: roomba1.decouvert=1; "Étrangement, derrière un feuillage, il vous a semblé percevoir du mouvement. Vous retirez rapidement votre main et vous figez. C'est impossible, à moins que...";
		1: roomba1.decouvert=2; move roomba1 to serre; StartDaemon(roomba1); move roomba2 to quartiers; StartDaemon(roomba2); "Doucement, vous faites le tour du feuillage d'où semblait provenir le mouvement...^^Quelque chose de rouge, qui...^^Ah ! Tout va bien, c'est un des robots de la station. L'espace d'un instant, vous aviez cru que... Mais non, c'est impossible @{2014} bien sûr que vous êtes toute seule sur cette station. Ça ne pouvait être que les robots.";
		2: AdvancePlot(); "Vous grattez un peu la terre, et trouvez deux carottes qui ont l'air mangeables, ainsi que quelques champignons de taille acceptable, et quelques feuilles d'une laitue. Vous enfournez votre récolte dans votre bouche ; les légumes sont plutôt fades, et le peu de goût qu'ils ont est différent des légumes terriens, ce qui fait toujours un drôle d'effet. Il ne vous faut pas plus de cinq minutes pour terminer votre repas, si l'on peut appeler ça comme ça ; vous frottez vos mains pour en enlever la terre tout en vous redressant. Les robots se chargeront de replanter, quand les senseurs dans la terre auront détecté que les légumes ont été cueillis.^^Tiens, vous avez un email @{2014} votre ordinateur vient d'en faire le bruit.";
		3: "Les quelques légumes que vous venez de manger ont quelque peu calmé la faim. Vous reviendrez plus tard, peut-être.";
	}
];

[ Cauchemar ;
	AdvancePlot(4752-avancement);

	print "Allez, ça suffit pour aujourd'hui. La lassitude, la fatigue, le vide vous pèsent, et vous vous sentez glisser sur une mauvaise pente. La meilleure stratégie, c'est de vous coucher, méditer, faire le vide, vous laisser emporter par le sommeil ; fort heureusement, vous avez toujours réussi à trouver le sommeil rapidement quand vous le vouliez, et ce depuis toute petite. Votre cerveau fatigue et commence à avoir des ratés, alors plutôt que de se battre contre lui, au risque de se faire submerger, mieux vaut le débrancher et espérer qu'il sera plus frais et nettoyé demain.";
	print "^^Vous vous glissez dans votre sac de couchage, et vous fermez les yeux. Les pensées s'entrechoquent encore dans votre esprit, mais vous connaissez la solution. Vous commencez à compter, lentement, en partant de cinquante @{2014} vous aviez découvert avec le Dr Peters que compter à rebours conjurait dans votre esprit des images de navette spatiale, de lancement, de stress, et faisait ressurgir le traumatisme. Lentement, doucement, régulièrement, en se concentrant bien sur chaque syllabe...";
	if (isTimeSupported() == 1) {
		ApresAttenteIncompressible("^^Cinquante...", 10*BASE_DELAY);
		AfficherApresAttente("^Cinquante-et-un...", 3*BASE_DELAY);
		AfficherApresAttente("^Cinquante-deux...", 3*BASE_DELAY);
		AfficherApresAttente("^Cinquante-trois...", 4*BASE_DELAY);
		AfficherApresAttente("^Cinquante-quatre...", 5*BASE_DELAY);
		AfficherApresAttente("^Cinquante-cinq...", 5*BASE_DELAY);
		AfficherApresAttente("^Cinquante-six...", 6*BASE_DELAY);
		AfficherApresAttente("^Cinquante-sept...", 8*BASE_DELAY);
		ApresAttenteIncompressible("",10*BASE_DELAY);
	} else {
		w8(); print "^^Cinquante..."; w8();
		print "^Cinquante-et-un..."; w8();
		print "^Cinquante-deux..."; w8();
		print "^Cinquante-trois..."; w8();
		print "^Cinquante-quatre..."; w8();
		print "^Cinquante-cinq..."; w8();
		print "^Cinquante-six..."; w8();
		print "^Cinquante-sept..."; w8();
	}
	w8();
	ClearScreen();

	FakeStatusLine("Dans le sous-marin");
	print "^^";
	Afficher("Dans le sous-marin", GRAS);
	print "^Les parois sont nues, les couleurs grises et vertes. Un périscope, relevé, en face de vous.";
	if (isTimeSupported() == 1) {
		print "^^>";
		ApresAttenteIncompressible("",6*BASE_DELAY);
		Progressif("abaisser périscope", TYPING_SPEED_FAST);
	} else { w8(); print "^^>"; print "abaisser périscope"; w8(); }
	AfficherApresAttente("^Le périscope est très haut. Vous sautez pour l'atteindre, mais vous n'y arrivez pas.^^Derrière vous, Eduardo vous sourit. @<< Je t'aide. @>>^^Vous sentez ses mains sur vos hanches, et vous sautez, et vous arrivez à vous suspendre au périscope, puis à monter sur la tour, tout en haut.", 2*BASE_DELAY);
	print "^^";
	FakeStatusLine("Sur le sous-marin");
	Afficher("Sur le sous-marin", GRAS);
	print "^Vous vous tenez sur l'écoutille en métal du sous-marin. Vous regardez autour de vous. Il fait sombre, c'est le coucher du soleil. Le ciel est rougeâtre, l'eau bleue foncée. Pas une vague, comme un miroir d'eau limpide. Au loin, une île.";
	if (isTimeSupported() == 1) {
		print "^^>";
		ApresAttenteIncompressible("",10*BASE_DELAY);
		Progressif("descendre", TYPING_SPEED_FAST);
	} else { w8(); print "^^>"; print "descendre"; w8(); }
	AfficherApresAttente("^Vous descendez dans le bateau.^^", 2*BASE_DELAY);
	FakeStatusLine("Dans le sous-marin");
	Afficher("Dans le sous-marin", GRAS);
	print "^Les murs à l'intérieur sont droits, et couverts d'instruments et de cadrans que vous ne parvenez pas à lire distinctement. Vos amis sont au plafond, en train de flotter @{2014} vous êtes sous l'eau, qui s'est infiltrée dans la coque. Un bouton rouge est posé sur le sol.";
	if (isTimeSupported() == 1) {
		print "^^>";
		ApresAttenteIncompressible("",8*BASE_DELAY);
		Progressif("pousser bouton rouge", TYPING_SPEED_FAST);
	} else {w8(); print "^^>"; print "pousser bouton rouge"; w8(); }
	ApresAttenteIncompressible("^Vous poussez le bouton rouge, et les trois autres crient, hurlent. Vous ne sentez rien, mais vous sursautez. Leurs cris sont bien distincts et écorchent vos oreilles.^^", 2*BASE_DELAY);
	AfficherApresAttente("L'extincteur à côté de vous émet de la vapeur, comme une cocotte-minute. Un sifflement horrible, et un son aigu, croissant en intensité et en hauteur, comme une alarme ou un avion qui s'écrase. Eduardo vous regarde, l'air de ne pas comprendre ce qui lui arrive, les yeux lourds de reproches.^^", 4*BASE_DELAY);
	AfficherApresAttente("Le visage déformé par la haine, Michel se jette sur vous, et vous le repoussez. Sa tête cogne une barre et il se met à saigner à l'intérieur de son scaphandre. Il se met à bouillir à l'intérieur de son scaphandre, tout ce que vous pouvez voir sont des bulles rouges et son visage se décomposer, des déchirures partout sur son crâne. Vous voulez fermer les yeux mais vous ne pouvez pas.^^", 9*BASE_DELAY);
	ApresAttenteIncompressible("Une explosion, et des débris qui flottent parallèlement à vous, au ralenti. Des bouts de métal, les aiguilles des cadrans, du verre, des couteaux.^^", 14*BASE_DELAY);
	AfficherApresAttente("Vous ne pouvez détacher votre regard du visage d'Eduardo, déchiré par les milliers de projectiles, sa peau pelée et détachée de son crâne par lambeaux, le rouge des muscles, le rouge du sang, son cri de douleur, son visage qui s'émiette, le déchirement horrible de sa peau...^^", 6*BASE_DELAY);
	ApresAttenteIncompressible("Vous vous retournez, et une grenade est face à vous, vous en voyez tous les détails, et elle se fige, puis vous explose à la figure...", 9*BASE_DELAY);
	ApresAttenteIncompressible("",8*BASE_DELAY);
	w8();

	ClearScreen(); Afficher("^^^^^^^^^^                                                                            [AAAAAAAAAAAAAAAAAAAAAAAAH]", ITALIQUE); style roman;
	if (isTimeSupported() == 1) { ApresAttenteIncompressible("",2*BASE_DELAY);} else {w8();}
	ClearScreen();

	AfficherApresAttente("^^^Vous vous réveillez, hurlante, tremblante, contractée, assise, puis vite debout, à quatre pattes, roulée en boule.^^Votre c@oeur bat très vite, trop vite, il va vous lâcher. Vos respirations ne sont que des gémissements aigus, des halètements, des sanglots.", 2*BASE_DELAY);
	AfficherApresAttente("^^Après quelques secondes, voire minutes, de cette terreur intense, vous parvenez à reprendre le contrôle de vous-même, tant bien que mal. Celui-là était précis. Ils le sont tous. Des dizaines de détails terribles qui vous hantent. Des rêves morbides dont vous pouvez encore vous souvenir des moindres détails, des semaines plus tard. Tous semblables, tous différents, tous terrifiants.^^Tant bien que mal, vous vous relevez, et vous étirez en soupirant. Vous détestez les journées qui commencent par des cauchemars. Vous n'arrivez jamais à vous en défaire complètement, et le nuage reste au-dessus de votre tête toute la journée. Toutes les journées commencent par des cauchemars, ces jours-ci.", 10*BASE_DELAY);

	ApresAttenteIncompressible("",5*BASE_DELAY);   ! small nicety if the player is standing on the space key
	w8();
	Afficher("^^");
	Afficher("Bureau", GRAS);
	print "^Tout est plongé dans une semi-obscurité, comme toujours. Votre couchage est roulé en boule, chiffonné à sa place habituelle dans le coin de la pièce. Dans le coin opposé, une chaise et un bureau, sur lequel se trouve votre ordinateur, qui joue toujours la même liste de lecture, en boucle. Vous passez le plus clair de votre temps ici, en allant de temps en temps à la serre. Ça vous convient.^^Au nord, une petite séparation, comme une alcôve, mène à la porte de la serre. Le couloir vers le reste de la base est au sud.^^Vous avez un nouvel email, apparemment.^";

	return true;
];

[ BeachBoys ;
	FakeStatusLine("Californie");
	style underline;
	if (IsTimeSupported() == false) {   ! ugh, parchment, I hate that you don't support timed effects...
		print "^^^After six hours of school,"; print " I've had enough for the day"; w8();
		print "^I hit the radio dial"; print " and turn it up all the way"; w8();
		print "^I gotta"; print " daaaaaaaaaaaaaance "; w8();
		print "right on the "; print "spoooooooooooooooot"; w8();
		print "^The beat's really "; print "hooooooooooooooot"; w8();
		print "^Daaaance"; print " [dance] "; w8();
		print "daaaance"; print " [dance] "; w8();
		print "daaaance"; print " [dance] "; w8();
		print " yeah!"; w8();
		print "^^When I feel put down"; print " I try to shake it off quick"; w8();
		print "^With my chick by my side"; print " the radio does the trick"; w8();
		print "^I gotta"; print " daaaaaaaaaaaaaance "; w8();
		print "right on the "; print "spoooooooooooooooot"; w8();
		print "^The beat's really "; print "hooooooooooooooot"; w8();
		print "^Daaaance"; print " [dance] "; w8();
		print "daaaance"; print " [dance] "; w8();
		print "daaaance"; print " [dance] "; w8();
		print " yeah!"; w8();
		style roman;
		return true;
	}

	Progressif("^^^After six hours of school,", BEACH_BOYS_SPEED); KeyDelay(2);
	Progressif(" I've had enough for the day", BEACH_BOYS_SPEED); KeyDelay(2);
	Progressif("^I hit the radio dial", BEACH_BOYS_SPEED); KeyDelay(2);
	Progressif(" and turn it up all the way", BEACH_BOYS_SPEED); KeyDelay(2);

	Progressif("^I gotta", BEACH_BOYS_SPEED);
	Progressif(" daaaaaaaaaaaaaance ", BEACH_BOYS_LONG);
	Progressif("right on the ", BEACH_BOYS_SPEED);
	Progressif("spoooooooooooooooot", BEACH_BOYS_LONG); KeyDelay(3);
	Progressif("^The beat's really ", BEACH_BOYS_SPEED);
	Progressif("hooooooooooooooot", BEACH_BOYS_LONG); KeyDelay(10);
	Progressif("^Daaaance", BEACH_BOYS_LONG); print " [dance] "; KeyDelay(7);
	Progressif("daaaance", BEACH_BOYS_LONG); print " [dance] "; KeyDelay(7);
	Progressif("daaaance", BEACH_BOYS_LONG); print " [dance] "; KeyDelay(7); Progressif(" yeah!", BEACH_BOYS_LONG); KeyDelay(7);

	Progressif("^^When I feel put down", BEACH_BOYS_SPEED); KeyDelay(2);
	Progressif(" I try to shake it off quick", BEACH_BOYS_SPEED); KeyDelay(2);
	Progressif("^With my chick by my side", BEACH_BOYS_SPEED); KeyDelay(2);
	Progressif(" the radio does the trick", BEACH_BOYS_SPEED); KeyDelay(2);

	Progressif("^I gotta", BEACH_BOYS_SPEED);
	Progressif(" daaaaaaaaaaaaaance ", BEACH_BOYS_LONG);
	Progressif("right on the ", BEACH_BOYS_SPEED);
	Progressif("spoooooooooooooooot", BEACH_BOYS_LONG); KeyDelay(3);
	Progressif("^The beat's really ", BEACH_BOYS_SPEED);
	Progressif("hooooooooooooooot", BEACH_BOYS_LONG); KeyDelay(10);
	Progressif("^Daaaance", BEACH_BOYS_LONG); print " [dance] "; KeyDelay(7);
	Progressif("daaaance", BEACH_BOYS_LONG); print " [dance] "; KeyDelay(7);
	Progressif("daaaance", BEACH_BOYS_LONG); print " [dance] "; KeyDelay(7); Progressif(" yeah!", BEACH_BOYS_LONG); KeyDelay(7);
	style roman;
];

[ SceneFinale ;
	print "Un dernier cri de rage, de douleur, de peur. Allez, il faut rentrer maintenant !^^Vous vous avancez doucement, en tremblant, en serrant les dents, la mâchoire contractée comme jamais. Vous vous forcez à la détendre, vous respirez par la bouche bruyamment mais doucement. Chanter, voilà, ça vous aidera. Chanter n'importe quoi, quelque chose de rythmé, d'entraînant. Vous fredonnez d'une voix frêle, tout en continuant à avancer.";
	ApresAttenteIncompressible("^^Un pas dans l'obscurité @{2014} c'est bien @{2014} ça ira, ne te focalise pas dessus, c'est juste une chambre plongée dans le noir",14*BASE_DELAY); AfficherApresAttente(" @{2014} deux pas @{2014} tout va bien @{2014} putain je suis toute entière dans le noir @{2014} ça va ça va @{2014} concentre-toi sur autre chose",6*BASE_DELAY);
	ApresAttenteIncompressible("^^Tout va bien. Vous faites un pas de plus, deux pas, et rien ne se passe. Derrière vous, la lumière du couloir vous rassure. Vous n'êtes pas loin de Bob. C'est bientôt fini. Encore quelques pas...", 8*BASE_DELAY);
	ApresAttenteIncompressible("",10*BASE_DELAY);
	w8();
	style underline;
	ClearScreen();

	print "^^^                                                                        [c'était quoi ça]";
	if (isTimeSupported() == 1) {ApresAttenteIncompressible("",4*BASE_DELAY);} else {w8();} ClearScreen();
	print "^^                             [putain - AAH]";
	if (isTimeSupported() == 1) {ApresAttenteIncompressible("",4*BASE_DELAY);} else {w8();} ClearScreen();
	print "^^^^^                                                         [froid]";
	if (isTimeSupported() == 1) {ApresAttenteIncompressible("",1*BASE_DELAY);} else {w8();} ClearScreen();
	print "^^^^^                                                         [glauque]";
	if (isTimeSupported() == 1) {ApresAttenteIncompressible("",1*BASE_DELAY);} else {w8();} ClearScreen();
	print "^^^^^                                                         [visqueux]";
	if (isTimeSupported() == 1) {ApresAttenteIncompressible("",2*BASE_DELAY);} else {w8();} ClearScreen();
	print "^^^^^                                                         [sur ma cheville]";
	if (isTimeSupported() == 1) {ApresAttenteIncompressible("",2*BASE_DELAY);} else {w8();} ClearScreen();
	print "^^^^^                                                         [autour de ma cheville]";
	if (isTimeSupported() == 1) {ApresAttenteIncompressible("",3*BASE_DELAY);} else {w8();} ClearScreen();
	KeyDelay(4*BASE_DELAY);
	print "^^^                                                                   [COURIR]";
	if (isTimeSupported() == 1) {ApresAttenteIncompressible("",2*BASE_DELAY);} else {w8();} ClearScreen(); style roman;

	FakeStatusLine("Devant les quartiers de l'équipage");
	Afficher("^Devant les quartiers de l'équipage", GRAS);
	print "^Vous vous tenez devant la pièce où les lits superposés ont été placés ; la lumière de l'extérieur fait apparaître le pied d'un des lits, contre le mur. C'était censé être le dortoir, les quartiers de l'équipage où tout le monde se serait retiré pour la nuit. La seule";
	if (isTimeSupported() == 1) {ApresAttenteIncompressible("",4*BASE_DELAY);} else {w8();} ClearScreen();
	print "^^^                                                                   [COURIR]";
	if (isTimeSupported() == 1) {ApresAttenteIncompressible("",2*BASE_DELAY);} else {w8();} ClearScreen();

	FakeStatusLine("Devant la porte condamnée");
	Afficher("^^Devant la porte condamnée", GRAS);
	print "^De l'autre côté de la porte, le noir total, ou presque. Il s'agit du reste de la base, dont les circuits n'ont pas été activés après la catastrophe. Les ressources sont rares, on ne peut pas se permettre de vous laisser accès à toute la base, elle était prévue pour vous quatre. On a";
	if (isTimeSupported() == 1) {ApresAttenteIncompressible("",4*BASE_DELAY);} else {w8();} ClearScreen();
	print "^^^                                                                   [FUIR]";
	if (isTimeSupported() == 1) {ApresAttenteIncompressible("",2*BASE_DELAY);} else {w8();} ClearScreen();

	FakeStatusLine("Couloir");
	Afficher("^^Couloir",GRAS);
	print "^Vous n'avez jamais aimé ce couloir @{2014} pour être plus précise, vous ne vous êtes jamais sentie à l'aise en y marchant, et vous n'avez vraiment pas besoin de ça en ce moment. Il est petit, plutôt étroit, et le néon qui l'éclaire clignote une lumière blafarde. Il ne vous dit";
	ApresAttenteIncompressible("",3*BASE_DELAY); ClearScreen();
	print "^^^                                                                   [PUTAIN]";
	KeyDelay(2*BASE_DELAY); ClearScreen();
	print "^^^                                                                   [calme-toi]";
	KeyDelay(1*BASE_DELAY); ClearScreen();
	print "^^^                                                                   [CALME-toi]";
	KeyDelay(1*BASE_DELAY); ClearScreen();
	print "^^^                                                                   [calme-TOI]";
	KeyDelay(1*BASE_DELAY); ClearScreen();
	print "^^^                                                                   [CALME-TOI]";
	ApresAttenteIncompressible("",3*BASE_DELAY); ClearScreen();
	style roman;

	FakeStatusLine("BUREAU");
	Afficher("^^BUREAU",GRAS);
	!KeyDelay(8); print "^^^Bureau.";
	ApresAttenteIncompressible("",2*BASE_DELAY); print "^^^Tout va bien. Rien à craindre. Rien.";
	KeyDelay(1*BASE_DELAY); style underline;			      print "                          [C'ÉTAIT QUOI ÇA]"; style roman;
	ApresAttenteIncompressible("",2*BASE_DELAY); print "^^Duuuuuuu calme, duuuuuuu calme.";
	KeyDelay(1*BASE_DELAY); style underline;			print "                                [JE L'AI SENTI JE TE JURE JE L'AI SENTI]"; style roman;
	KeyDelay(2*BASE_DELAY); print "^^Oui.";
	ApresAttenteIncompressible("",4*BASE_DELAY); print "^^Moi aussi.";

	ApresAttenteIncompressible("",8*BASE_DELAY); style underline; print "^^                                                                         [qu'est-ce qu'on va faire]"; style roman;

	KeyDelay(4*BASE_DELAY); print "^^Soit il y a vraiment quelque chose";
	KeyDelay(1*BASE_DELAY); style underline; 			    print "                               [je deviens folle]";
	KeyDelay(3*BASE_DELAY); print "^                                                                   [je deviens folle j'ai des hallucinations]";
	KeyDelay(4*BASE_DELAY); print "^                                                                   [ÇA va revenir]";
	KeyDelay(2*BASE_DELAY);  print "^                                                                   [ça va revenir me rendre folle me tuer]";
	KeyDelay(2*BASE_DELAY); print "^                                                                   [je veux que ça disparaisse]";
	ApresAttenteIncompressible("",4*BASE_DELAY); print "^                                                                   [je veux pas être folle]";
	ApresAttenteIncompressible("",2*BASE_DELAY); print "^                                                                   [je veux pas mourir]";
	ApresAttenteIncompressible("",6*BASE_DELAY); print "^                                                                   [je veux survivre]";
	ApresAttenteIncompressible("",10*BASE_DELAY);
	style roman; w8(); ClearScreen();

	print "^^^Votre bras droit s'approche de votre ordinateur. Vous ne vous sentez plus trop dans votre corps. Une sensation de légèreté, de détachement. Vous vous regardez ouvrir le dossier @<< MUSIQUE @>> de votre ordinateur. Vous la trouvez facilement, vous cliquez dessus, et les baffles font résonner cette musique joyeuse. Exactement ce que vous voulez. De la joie. Des vagues. Du soleil. Vous êtes en Californie. Vous souriez. Vous vous laissez transporter. Votre corps danse comme il n'a jamais dansé. Vous fermez les yeux et vous vous abandonnez à la musique.";

	ApresAttenteIncompressible("",5*BASE_DELAY);
	KeyDelay(15*BASE_DELAY); ClearScreen();

	BeachBoys();
	ApresAttenteIncompressible("",4*BASE_DELAY);
	KeyDelay(6*BASE_DELAY);

	deadflag=3; return true;
];

[ DeathMessage;
  if (deadflag == 3) print "Ceci est la fin de l'aventure";
];

!==========================================================
! La musique

! Playlist : Youtube: http://doiop.com/LifeOnMarsYoutube (https://www.youtube.com/playlist?list=PL1MA5urIRAOZhRotJiL3rWaaJ-TRD4rEm)
!            Spotify: http://doiop.com/LifeOnMarsSpotify (https://open.spotify.com/user/mulehollandaise/playlist/4qnfAbBppQgBMDeVjW5ffc)

[ AfficherChanson i;
	switch(i) {
		1: Afficher("Green Calx", ITALIQUE); print ", d'Aphex Twin.";
		2: Afficher("Schottkey 7th Path", ITALIQUE); print ", d'Aphex Twin.";
		3: Afficher("Mitternacht", ITALIQUE); print ", de Kraftwerk.";
		4: Afficher("Asteroid", ITALIQUE); print ", de Kyuss.";
		5: Afficher("Min Myllest Til Vinterland", ITALIQUE); print ", de Satyricon.";
		6: if (e4742.seen==1) {Afficher("The Rain Chapter VI", ITALIQUE);} else {Afficher("One of These Days", ITALIQUE);} print ", de "; if (e4742.seen==1) {print "Cyclicity of Catastrophe.";} else {print "Mechanical Goblin.";}
		7: Afficher("Kladfvgbung Micshk", ITALIQUE); print ", d'Aphex Twin.";
		8: Afficher("Get Faster, Cry For Happy", ITALIQUE); print ", d'An Albatross.";
		9: Afficher("Voice @{2014} The Man-Eating Pig of Madidi", ITALIQUE); print ", d'An Albatross.";
		10: Afficher("All Hail the New Flesh", ITALIQUE); print ", de Strapping Young Lad.";
		11: Afficher("Private Hell", ITALIQUE); print ", d'Alice in Chains.";
		12: Afficher("Cemetary Gates", ITALIQUE); print ", de Pantera.";
		13: Afficher("Cock/Ver10", ITALIQUE); print ", d'Aphex Twin.";
		14: Afficher("Les Regrets", ITALIQUE); print ", de Les Discrets.";
		15: Afficher("Cemetery Kisses", ITALIQUE); print ", de Sleeping Peonies.";
		16: Afficher("Ethica Odini", ITALIQUE); print ", d'Enslaved.";
		17: Afficher("I Don't Love", ITALIQUE); print ", de Have A Nice Life.";
		18: Afficher("Odinist", ITALIQUE); print ", de Blut Aus Nord.";
		19: Afficher("Elevation", ITALIQUE); print ", de Blut Aus Nord.";
		20: Afficher("Happy Camper (Carpe B.U.M.)", ITALIQUE); print ", de Strapping Young Lad.";
	}
	return true;
];

[ EcouterMusique i;
	if (moimeme.compteurmusique == SONG_LENGTH) {
		i = random(20); moimeme.compteurmusique = 0;

		if (location == devantporte) {print "Vous tendez l'oreille et essayez de distinguer quelle chanson joue au loin dans la pièce principale. Ah oui, ça c'est ";}
		if (location == serre) {print "Vous entendez toujours la musique, mais le son est étouffé par les murs de la serre. C'est "; }

		AfficherChanson(i);
		switch(i) {
		1: print " Des synthés enveloppants et une mélodie sans queue ni tête, des cris de panthère.";
		2: print " Des grésillements incessants et une mélodie entêtante, jouée par un synthétiseur avec de l'écho.";
		3: print " Un thème court menaçant, des bruits électroniques et des cris extraterrestres qui se perdent dans un écho martien.";
		4: print " Des guitares distordues et floues, de l'écho inquiétant, une impression de grand espace poussiéreux.";
		5: print " Une guitare médiévale qui répète inlassablement la même mélodie, dans un vent glacé et noir.";
		6: if (e4742.seen==1) {print " C'est pas mal du tout en fait, les guitares saturées à fond donnent bien une impression de mousson, le tempo est lourd et l'ambiance inquiétante à souhait.";} else {print " Un album-concept bruitiste sur une planète-décharge, fou mais mine de rien très évocateur.";}
		7: print " Des bruits de mécanisme répétitifs qui tissent une mélodie intriguante.";
		8: print " Une explosion de sons sans queue ni tête qui rappelle un carnaval inquiétant, avec des paroles hurlées inintelligibles. Bizarrement, ça détend.";
		9: print " Des éclats de voix qui vous rappellent vaguement la navette, puis une explosion à peine contrôlée de violence, qui alterne avec des passages calmes évoquant une faune bizarre.";
		10: print " De l'ultra-violence mélodique, avec un degré remarquable de détail et d'ambiance. L'impression de se prendre une vague de plein fouet tout en continuant de danser.";
		11: print " Lent, lourd, dépressif, avec des guitares enveloppantes et un chant empli de douleur, ça correspond parfaitement à votre état d'esprit.";
		12: print " Hanté, torturé, violent, et ces cris de douleur à la fin...";
		13: print " Une batterie samplée brutale, rythmée, avec des textures électroniques qui se superposent, et des calmes parmi la tempête.";
		14: print " Des guitares enveloppantes, de la réverb, un rythme lent qui vous porte comme un océan.";
		15: print " Triste mais beau, avec ses guitares qui se réverbèrent à l'infini et un écho qui rend tout indistinct, sauf des cris torturés presque étouffés par la sérénité mélancolique des instruments.";
		16: print " Vous ne pouvez jamais vous empêcher de marquer le rythme du pied en l'écoutant ; pourtant, elle est complexe et variée, et ce chant guttural est tellement gargouillant que ç'en est intrigant.";
		17: print " Un chant triste qui chante l'abandon pendant qu'une tempête d'électrons se déchaîne autour. Vous vous sentez très proche de cette chanson.";
		18: print " Dense, noir, une guitare au riff étrange, l'impression d'être dans une montagne sombre et brumeuse.";
		19: print " Une guitare entêtante et des synthés saturés d'écho, qui créent une ambiance extrêmement vive. Les arbres vous manquent.";
		20: print " Extrême, c'est le mot ; tout est dans l'asphyxie, la violence et la colère.";
		}
	}
	else {
		if (location == devantporte) {print "Vous tendez l'oreille et essayez de distinguer quelle chanson joue au loin dans la pièce principale. ";}
		if (location == serre) {print "Vous entendez toujours la musique, mais le son est étouffé par les murs de la serre. "; }

		i = moimeme.musiqueecoutee;
		print "C'est toujours "; AfficherChanson(i);
	}

	moimeme.musiqueecoutee = i;
	"";
];

[ Chanter ;
	if (location == devantquartiers or reserve) {"Vous fredonnez doucement une des chansons de la liste de lecture.";}

	if (location == devantporte) { "Vous écoutez la musique, dont le son est lointain, et il vous faut quelques secondes pour reconnaître la chanson ; mais vous y parvenez, et chantez la mélodie pendant quelques secondes."; }

	if (moimeme.musiqueecoutee == 6 && e4742.seen==1) {! la chanson qu'elle vient de télécharger
		"Vous fredonnez un peu en suivant l'air de la chanson ; vous ne l'avez pas autant écoutée que les autres, mais elle est plutôt bien restée dans votre cerveau finalement.";
	} else { "Vous fredonnez un peu en suivant l'air de la chanson ; à force d'écouter cette liste de lecture, vous connaissez ces chansons par c@oeur."; }
];



!==========================================================
! Menu d'aide

Constant number_prefix = "neuv";

[ about ;
	Afficher("^Life On Mars?", GRAS);
	"^Vous incarnez une astronaute, piégée sur Mars après un atterrissage raté qui a tué le reste de votre équipe. Les secours sont loin et mettront plusieurs mois à arriver, et en attendant, vous devez tenir...^^Ce jeu fut originellement publié sous le pseudonyme de Brad Bradbury, pour la septième édition de la Compétition de Fictions Interactives Francophones, qui se tint début 2014. Il remporta cette Compétition, avec un score final de 8.28/10 !^^Ce jeu est relativement court (comptez une bonne heure de jeu), et convient aux joueurs débutants. Pour une meilleure qualité de lecture durant certaines phases de jeu, il est recommandé de maximiser la taille de la fenêtre dans laquelle le jeu apparaît.^^Le jeu utilise des effets temporels, notamment pour l'affichage des emails. La première fois que vous lisez un email, appuyer sur une touche permet d'accélérer le défilement de l'email ; les fois suivantes, vous ne verrez en général plus les pensées de Charlotte, et appuyer sur une touche vous permet d'afficher l'email entier d'un seul coup. Vous pouvez également accélérer le défilement du texte avec la commande @<< vitesse plus @>>, ou le ralentir avec @<< vitesse moins @>>.^^Le code source (Inform 6) de ce jeu est disponible sur le site de l'auteur, ainsi que l'extension EffetsDeTexte, utilisée ici notamment pour tous les effets temporels.";
];

[ version ;
	"La version 1 de ce jeu, publiée en janvier 2014, remporta la septième édition de la Compétition de Fictions Interactives Francophones, avec un score final de 8.28/10.^^Vous jouez actuellement à la version 2 du jeu, publiée plus d'un an plus tard, en même temps que la traduction en anglais, qui participa à l'IFComp. La version 2 ajoute plus de réponses, corrige plusieurs bugs de la version 1 (dont les passages qui se déroulaient trop vite, qui était un problème majeur de la version 1), et introduit de nouvelles fonctionnalités, notamment celles relatives à la vitesse de défilement du texte.";
];

[ thankYou ;
	Afficher("^Life On Mars?", GRAS);
	print "^Un jeu par Hugo Labrande.^^Merci à :^^Graham Nelson, créateur de l'excellent système Inform 6.^JL Pontico pour les bibliothèques françaises.^Aux votants de la 7ème FrenchComp pour m'avoir permis de décrocher ma première French Comp et aussi pour leurs retours, ainsi qu'à tous les autres joueurs qui m'ont signalé des bugs ou fait part de leurs impressions, positives et négatives. Un merci en particulier à Eriorg pour ses transcripts, et Flap pour ses retours.^Aux bêta-testeurs de la version 2 : Michael Fransioli, Sam Kabo Ashwell, Andrew Watt, et surtout Andrew Schultz, qui ont fait un super boulot pour m'aider à améliorer la jouabilité du jeu et corriger mes fautes d'anglais.^^Khelwood, pour sa bibliothèque très utile @<< DMenus.h @>> utilisée ici pour les menus.^^Kazuki Mishima pour "; Afficher("The Endling Archive", ITALIQUE); print " et Christine Love pour "; Afficher("Digital: A Love Story", ITALIQUE); print " et "; Afficher("Analog: A Hate Story", ITALIQUE); print " @{2014} ça n'était pas fait exprès au départ, mais le système d'emails ici est bien entendu inspiré par ces jeux.^^Pour l'ambiance du jeu, Duncan Jones pour "; Afficher("Moon", ITALIQUE); print ", et tous les artistes musicaux cités dans le jeu.^^";
	"";
];




!==========================================================
! Grammaire

Include "FrenchG";
Include "FrenchGAugmented";
Include "MenuAide";

[ CompterDoigtsSub;
	if (location == devantquartierspeur) { "Vous essayez de @{2014} vous détendre, en comptant comme @{2014} Dr Peters vous a appris, mais votre esprit part @{2014} dans tous les sens. Vous tremblez, et fermez les yeux, en essayant au moins de respirer profondément et régulièrement @{2014} ça sera déjà ça."; }
	else { "Une bonne technique pour combattre le stress, que le Dr Peters vous a apprise : compter lentement mais régulièrement, en fermant les yeux, concentrée sur votre respiration. Par exemple entre 90 et 100 @{2014} comme la fin d'un compte de cache-cache, et l'allusion à l'insouciance et la joie vous aide, bizarrement. Vous prenez un moment pour le faire ; quand vous ouvrez les yeux, vous vous sentez un peu mieux."; }
];

[ CompterSub;
	"Vous ne voyez pas trop l'intérêt de compter cela.";
];

! Il faut ce code pour la version anglaise, mais il est déjà dans FrenchGAugmented (qui n'est pas traduite)
[ UtiliserCopySub;
  if (noun has edible) {print "(manger ", (the) noun, ")^"; <<Eat noun>>;}
  if (noun has clothing) {print "(enfiler ", (the) noun, ")^"; <<Wear noun>>;}
  if (noun has switchable && noun has on) {print "(éteindre ", (the) noun, ")^"; <<SwitchOff noun>>;}
  if (noun has switchable && noun hasnt on) {print "(allumer ", (the) noun, ")^"; <<SwitchOn noun>>;}
  if (noun has door) {print "(ouvrir ", (the) noun, ")^"; <<Open noun>>;}
  if (noun has openable && noun has open) {print "(fermer ", (the) noun, ")^"; <<Close noun>>;}
  if (noun has openable && noun hasnt open) {print "(ouvrir ", (the) noun, ")^"; <<Open noun>>;}
  if (noun has container) {print "(vider ", (the) noun, ")^"; <<Empty noun>>;}
  "Il va falloir être plus précis sur la façon dont vous voulez utiliser ", (the) noun, ".";
];

[ UtiliserDeuxCopySub;
  if (noun has container && second has container)
   {print "(vider ", (the) noun, " dans ", (the) second, ")^"; <<EmptyT noun second>>;}
  if (noun in player && second has container)
   {print "(mettre ", (the) noun, " dans ", (the) second, ")^"; <<Insert noun second>>;}
  #Ifdef LIBRARY_FRENCH;
  if (noun in player && (second has animate || second has talkable))
   {print "(donner ", (the) noun, " ", (to_the) second, ")^"; <<Give noun second>>;}
  #Endif;
  #Ifdef LIBRARY_ENGLISH;
  if (noun in player && (second has animate || second has talkable))
   {print "(donner ", (the) noun, " to the ", second, ")^"; <<Give noun second>>;}
  #Endif;
  "Il va falloir être plus précis sur la façon dont vous voulez utiliser ", (the) noun, " avec ", (the) second, ".";
];

[ VitesseSub ;
	"[Pour augmenter la vitesse de défilement du texte, tapez @<< vitesse plus @>> ; pour la diminuer, tapez @<< vitesse moins @>>.]";
];
[ AugVitesse ;
	if (EMAIL_SPEED == 10) { return false; }
	EMAIL_SPEED = EMAIL_SPEED+1;                if (EMAIL_SPEED == 0) { EMAIL_SPEED++; }
	TYPING_SPEED_FAST = TYPING_SPEED_FAST+1;    if (TYPING_SPEED_FAST == 0) { TYPING_SPEED_FAST++; }
	!TYPING_SPEED_SLOW = -2;
	BASE_DELAY = BASE_DELAY - 2;                if (BASE_DELAY < 3) { BASE_DELAY = 3; }
	return true;
];
[ DimVitesse ;
        if (EMAIL_SPEED == -10) { return false; }
	EMAIL_SPEED = EMAIL_SPEED-1;                if (EMAIL_SPEED == 0) { EMAIL_SPEED--; }
	TYPING_SPEED_FAST = TYPING_SPEED_FAST-1;    if (TYPING_SPEED_FAST == 0) { TYPING_SPEED_FAST--; }
	!TYPING_SPEED_SLOW = -2;
	BASE_DELAY = BASE_DELAY + 2;		    if (BASE_DELAY > 25) { BASE_DELAY = 25; }
	return true;
];
[ VitessePlusSub ;
	if (AugVitesse() == true) {
		Progressif("[Les emails s'afficheront désormais à la même vitesse que cette ligne.]",EMAIL_SPEED);
	} else { print "[Impossible d'augmenter la vitesse de défilement du texte plus que ça !]"; }
	"";
];
[ VitesseMoinsSub ;
	if (DimVitesse() == true) {
		Progressif("[Les emails s'afficheront désormais à la même vitesse que cette ligne.]",EMAIL_SPEED);
	} else { print "[Impossible de diminuer la vitesse de défilement du texte plus que ça !]"; }
	"";
];

[ DetecMouvementsSub ;
	"Ceci ne produit aucun effet.";
];

Verb 'compter' 'denombrer'
*		->CompterDoigts
* noun		->Compter;

Verb 'calmer'
* 'vous'	->CompterDoigts;
Verb 'relax'
*		->CompterDoigts;
Verb 'detendre'
* 'vous'	->CompterDoigts;
Verb 'respirer'
*               ->CompterDoigts
* 'profondement'/'regulierement'	->CompterDoigts;

#Ifdef LIBRARY_FRENCH;
Extend only 'utiliser' replace
* noun				-> UtiliserCopy
* noun 'avec' noun	-> UtiliserDeuxCopy;
#Endif;
#Ifdef LIBRARY_ENGLISH;
Verb 'utiliser'
* noun				-> UtiliserCopy
* noun 'avec' noun	-> UtiliserDeuxCopy;
#Endif;

! Gestion de la vitesse de scrolling
Verb meta 'vitesse'
*		->Vitesse
* 'plus'/'+'	->VitessePlus
* 'moins'/'-'	->VitesseMoins;
#Ifdef LIBRARY_FRENCH;
Verb meta 'accelerer' 'augmenter'
* 'vitesse'	->VitessePlus
* 'vitesse' 'des' 'emails'	->VitessePlus
* 'vitesse' 'defilement'	->VitessePlus
* 'vitesse' 'de' 'defilement'	->VitessePlus
* 'vitesse' 'de' 'defilement' 'des' 'emails'	->VitessePlus;
Verb meta 'ralentir' 'diminuer'
* 'vitesse'			->VitesseMoins
* 'vitesse' 'des' 'emails'	->VitesseMoins
* 'vitesse' 'defilement'	->VitesseMoins
* 'vitesse' 'de' 'defilement'	->VitesseMoins
* 'vitesse' 'de' 'defilement' 'des' 'emails'	->VitesseMoins;
#Endif;
#Ifdef LIBRARY_ENGLISH;
Verb meta 'slow'
* 'down'				->VitesseMoins
* 'down' 'speed'			->VitesseMoins
* 'down' 'scrolling' 'speed'		->VitesseMoins
* 'down' 'emails' 'scrolling' 'speed'	->VitesseMoins
* 'down' 'emails'			->VitesseMoins;
Verb meta 'increase'
* 'emails' 'speed'			->VitessePlus
* 'scrolling' 'speed'			->VitessePlus
* 'emails' 'scrolling' 'speed'		->VitessePlus;
Verb meta 'decrease'
* 'emails' 'speed'			->VitesseMoins
* 'scrolling' 'speed'			->VitesseMoins
* 'emails' 'scrolling' 'speed'		->VitesseMoins;
#Endif;

! verbe à la noix pour "passer la main devant le détecteur de mouvement"
Extend only 'passer'
* 'la'/'ma'/'une' 'main' 'devant' noun		->DetecMouvements
* 'les'/'mes' 'mains' 'devant' noun		->DetecMouvements
* 'main'/'mains' 'devant' noun			->DetecMouvements;

Extend only 'agiter'
* 'la'/'ma'/'une' 'main' 'devant' noun		->DetecMouvements
* 'les'/'mes' 'mains' 'devant' noun		->DetecMouvements
* 'main'/'mains' 'devant' noun			->DetecMouvements;




!==========================================
! Verbes pour l'utilisation de l'ordinateur

[ EmailsSub ;
	if (location == bureau) {AfficherMails(); rtrue;} else {"Vous ne pouvez pas consulter vos emails ici.";}
];

[ RepondreSub;
	rfalse;
];

[ RepondreTackerSub;
	if (location ~= bureau) {"Vous ne pouvez pas consulter vos emails ici.";}
	switch(avancement){
		4750: "Il faudrait d'abord aller compter les bouts de tofu.";
		4751: ClearScreen(); <Examine e4749>; AfficherMails(); rtrue;
		default: "Vous n'avez pas besoin de répondre à un email pour le moment.";
	}
	return true;
];

! BeforeParsingLifeOnMarsfr s'occupe de transformer "e mails", "mèl", "email", etc
Verb 'emails'
*		->Emails
* 'tacker'	->RepondreTacker;
#Ifdef LIBRARY_FRENCH;       ! truc pour garder le même code source dans les deux langues
Extend 'emails'
* 'de' 'tacker'	->RepondreTacker;
#Endif;

! >CONSULT NOUN n'existe pas en anglais
#Ifdef LIBRARY_ENGLISH;
[ VagueConsultSub ;
	"You cannot consult ", (the) self, ".";      ! because in this game you can't consult anything but the computer/emails
];

Extend 'consult' first
* noun		->VagueConsult;
#Endif;

! Extend 'lancer' 'demarrer' avec les noms de l'ordinateur et de la messagerie

Extend 'lancer' first
* 'client'			->Emails
* 'messagerie'			->Emails;
#Ifdef LIBRARY_FRENCH;       ! truc pour garder le même code source dans les deux langues
Extend 'lancer' first
* 'client' 'de' 'messagerie'	->Emails
* 'client' 'messagerie'		->Emails;
#Endif;
#Ifdef LIBRARY_ENGLISH;       ! truc pour garder le même code source dans les deux langues
Extend 'lancer' first
* 'emails' 'client'	->Emails;
#Endif;

Extend only 'repondre' first
* 'a' 'tacker'			->RepondreTacker
* 'tacker'			->RepondreTacker
! c'est moche mais c'est comme ça avec BeforeParsingLifeOnMarsfr
* 'au' 'emails' 'de' 'tacker'	->RepondreTacker
* 'au' 'emails'			->RepondreTacker
* 'a' 'l^' 'emails' 'de' 'tacker'->RepondreTacker
* 'a' 'l^' 'emails'		->RepondreTacker
* 'a' noun				->Repondre;