! _Shade_ ! Special source-code edition ! Copyright 2000-2002 Andrew Plotkin ! http://www.eblong.com/zarf/if.html ! This source code is provided for personal, educational use only. ! See README file for details. [ LivingLookNooks; if (kitchen in Apartment && bathroom in Apartment) { print " Le coin cuisine d'un côté et le coin salle de bains de l'autre, avec une penderie entre les deux."; return; } if (bathroom in Apartment) { print " Le coin salle de bains et la penderie sont sur le côté."; return; } if (kitchen in Apartment) { print " Le coin cuisine d'un côté et la penderie de l'autre."; return; } print " La penderie sur l'un des côtés."; ]; Object Apartment "appartement" with articles "Votre" "votre" "votre", seenonce false, description [ ix; if (GoalClosed(window)) { print "Les rayons du soleil découpent la pièce comme du beurre, jaillissant de la fenêtre. L'appartement est désormais pratiquement nu ; les murs et le plafond sont complètement blancs, à part la fenêtre, la porte d'entrée fermée, et le miroir en pied en travers d'eux.^^"; print "Le canapé est au centre de la pièce. À côté de lui repose, penchée sur une pile de sable, la fidèle chaîne stéréo.^"; DescribeParagraph(self); rtrue; } ix = FindZone(player); switch (ix) { futon, Apartment: if (~~self.seenonce) { new_line; print "C'est étrange de constater à quel point la lumière rend votre appartement plus lugubre... Une obscurité crépusculaire emplit jusqu'aux coins, en haut des murs. Votre lampe de bureau brille jaune, mais les ombres vous forcent à tirer sur votre regard.^^"; print "Ce n'est pas un super appartement, pour être honnête."; } else { print "Vous regardez votre unique et petite pièce."; } if (desk in Apartment) print " Un bureau, couvert de papiers, avec un ordinateur poussiéreux enterré sur le côté."; print " Votre canapé"; if (player in futon && self.seenonce) print ", sur lequel vous vous asseyez"; print "."; print " Une chaîne stéréo achetée d'occasion"; if (crate in Apartment) print " posée sur une boîte en carton"; print "."; LivingLookNooks(); kitchen: print "Vous regardez votre unique et petite pièce. "; kitchen.description(); print "^Le reste de votre pièce est essentiellement occupé par votre canapé"; if (desk in Apartment) print ", et le bureau d'ordinateur dans le coin"; print "."; if (bathroom in Apartment) print " Le coin salle de bains est en face de vous, et la penderie à côté."; else print " La penderie est en face de vous."; print " La chaîne stéréo est posée sur"; if (crate in Apartment) print " une boîte en carton"; else print " du sable par terre"; print "."; bathroom, shower: if (player in shower) { shower.description(); print "^Derrière le rideau, votre appartement est"; } else { print "Vous regardez votre unique et petite pièce. "; bathroom.description(); print "^Le reste de la pièce est"; } print " essentiellement occupé par votre canapé"; if (desk in Apartment) print ", et le bureau d'ordinateur dans le coin"; print "."; if (kitchen in Apartment) print " Le coin cuisine est en face de vous, et la penderie sur l'un des côtés."; else print " Le placard est sur l'un des côtés."; print " La chaîne stéréo est posée sur"; if (crate in Apartment) print " une boîte en carton"; else print " du sable par terre"; print "."; desk: print "Vous jetez des regards autour de vous. "; desk.description(); print "^Derrière vous, le canapé occupe l'essentiel de votre appartement."; print " Une stéréo achetée d'occasion repose sur"; if (crate in Apartment) print " une boîte en carton"; else print " du sable par terre"; print "."; LivingLookNooks(); default: print "[BUG] Joueur pas dans la zone."; } print " Un miroir large tente de doubler la taille de la pièce (ça marche à moitié)."; print " Une fenêtre, dont le store est"; if (windowshade hasnt open) print " baissé"; else print " relevé"; print ", et la porte d'entrée"; if (frontdoor hasnt open) print ", solidement fermée"; else print ", grande ouverte"; print ".^"; if (self.seenonce) { if (desk in Apartment) { print "^La pièce est encore trop sombre, excepté le coin où la lampe de bureau éclaire trop, au contraire.^"; } else { print "^La pièce est très sombre, maintenant. L'obscurité rampe autour du store.^"; } } DescribeParagraph(self); if (~~self.seenonce) { print "^Vous êtes vautré sur le canapé, fixant les ténèbres. Vos yeux sont comme sablonneux. Mais c'est trop tard -- ou tôt -- plus le temps de dormir. Dans quelques heures, votre taxi arrivera.^"; self.seenonce = true; } rtrue; ], before [; Go: "Vous avez assez tourné en rond hier soir."; Exit: if (player notin self) rfalse; <>; Listen: if (noun == 0) { if (motornoise in self) { if (stereo in self && stereo has on) { ; new_line; } <>; } if (stereo in self) <>; } else if (noun == u_obj) { if (GoalOpen(kitchen) || GoalOpen(bathroom)) "Le grincement se fait plus important."; } Examine: switch (noun) { d_obj: if (GoalClosed(tickets)) "C'est un peu sableux."; else "C'est un peu poussiéreux."; } rfalse; ], locseealso kitchen bathroom, sand_obj 0, leave_fragment " [BUG] sorti dans l'hyperespace", enter_fragment " [BUG] émergé de l'hyperespace"; Object -> apartmentproxy "salon" with name 'piece' 'principale' 'appartement' 'salon', before [; Examine, Search: <>; Enter: if (player in Apartment) "Mais vous êtes déjà dans le salon."; MoveToZone(Apartment, 1); rtrue; Receive: <>; ], has scenery; Object -> crate "boîte en carton" with name 'boite' 'en' 'carton' 'support', description "La boîte dans laquelle votre ordinateur est arrivé. Elle est cabossée et usée maintenant, mais elle tient encore la prestigieuse fonction de support de poste radio.", before [; Take: if (GoalOpen(self)) <>; "La boîte en carton est utile où elle est."; Open, Search: if (OIU(self)) rtrue; if (GoalOpen(self)) <>; "Vous savez bien que c'est vide."; Close: if (OIU(self)) rtrue; if (GoalOpen(self)) <>; "La boîte en carton est déjà fermée."; Attack: if (OIU(self)) rtrue; if (GoalOpen(self)) <>; "Cela produit un bruit sourd assez plaisant."; Touch: if (GoalOpen(self)) { Goaled(self); remove self; BumpSand(livingsand); "Vous le touchez à peine, et la boîte en carton s'effondre subitement. Du sable se répand sur le sol du salon. La radio s'enfonce ; en quelques instants, la boîte est réduite en lambeaux, qui s'enfoncent immédiatement dans le sable."; } rfalse; Rub, Push, Pull: if (GoalOpen(self)) <>; rfalse; ], prereqs [; return (GoalClosed(bathsink) || GoalClosed(kitchensink)); ], imp [; fridge.startup(); return -1; ], has scenery female; Global stereosmartcount = 0; Object -> stereo "chaîne stéréo" with name 'chaine' 'stereo' 'radio', description [; print "La chaîne stéréo est vieille, datant d'une ère où @<< noir mat @>>, @<< sans relief @>> et @<< opaque @>> étaient les maîtres mots si l'on voulait être branché. Elle fonctionne toujours, cela dit"; if (self has on) { print ", comme les bribes de "; self.song(); print " l'illustrent"; } "."; ], before [; Listen: if (self hasnt on) "La chaîne stéréo est éteinte."; print "Vous écoutez "; self.song(); "."; LookUnder: if (crate in Apartment) { "La stéréo repose sur la boîte en carton."; } rfalse; ], after [; SwitchOn: self.number = random(32761); StartDaemon(self); print "La radio grésille, cherche, puis trouve une station."; if (~~self.seenonce) { self.seenonce = true; print " Ahhh, votre station amateur indie/world/techno. Enfin vous pensez qu'ils l'appellent comme ça. C'est un peu un format @<< ce qui passe par la tête du DJ @>>.^^"; } else { print " "; } print "La pièce se remplit du son d'"; self.song(); "."; SwitchOff: "Vous éteignez la radio."; ], startup [; if (self hasnt on) { self.number = random(32761); print "^Soudainement, la pièce s'emplit du son d'"; self.song(); print ". Quoi ? Ah, oui -- vous aviez bidouillé le minuteur de la stéréo pour servir de radio-réveil, quand vous pensiez qu'il était toujours possible de dormir. Super. C'est le matin, bien que le monde, dehors, soit encore dans la nuit. Le taxi devrait arriver bientôt."; print "^^Presque immédiatement, le flash info débute.^"; give self on; StartDaemon(self); } else { print "^La radio émet un *clic* alors qu'"; self.song(); print " s'arrête et le flash info arrive. Quoi ? Ce doit être le matin, bien que le monde, dehors, soit encore dans le noir. Le taxi devrait arriver bientôt.^"; } self.number = -1; self.opentime = 0; ], seenonce false, number 0, opentime 2, longcount 0, daemon [; if (self hasnt on || parent(self) == 0) { StopDaemon(self); return; } if (self.number == -1) { self.opentime++; switch (self.opentime) { 2: print "^@<< De nouvelles allégations concernant le financement de la campagne... @>> (Oh, des infos fascinantes aujourd'hui.)^"; 3: print "^@<< Échanges tendus entre superpuissances aujourd'hui... @>> (Quoi ? il y a encore des superpuissances ?)^"; 4: print "^@<< Trois personnes portées disparues au Om de la Vallée de la Mort en Californie... @>> (Attendez.) @<< Le festival artistique en plein désert a été secoué hier quand trois visiteurs ne sont pas parvenus pas à rentrer de leur escapade au clair de lune. La police californienne fouille la zone. @>> (Vous vous résolvez à lire une nouvelle fois ce guide du camping en plein désert.)^"; 5: print "^@<< Dans l'actualité économique, la bourse en chute lib... @>> (Vous perdez à nouveau tout intérêt.)^"; 6: self.number = random(32761); self.opentime = 0; print "^@<< Et c'est, hum... à peu près tout. Place à la musique, les amis, @>> et "; self.song(); print " commence à jouer.^"; } rtrue; } self.opentime++; if (self.opentime >= random(3) + 3) { self.opentime = 0; self.number = random(32761); self.longcount++; if (self.longcount >= 15) { self.longcount = 0; print "^La radio marmonne, @<< Vous êtes sur, euh, 103... 'ka'-'té'-'oh'-'ah'... Votre source de rythme intergalactique... @>> Vous entendez presque les gargouillis de la pipe à eau à l'arrière plan. Après un instant, "; self.song(); print " commence à jouer.^"; } else { print "^La radio passe "; self.song(); print ".^"; } } ], song [ num redundant flag; redundant = 0; num = self.number; if (num == -1) { print "les actualités"; rtrue; } flag=0; ! est-ce que c'est un style régional (=1) ou un adjectif ? print "une "; switch (num % 11) { 0: print "berceuse"; 1: print "mélopée"; 2: print "fugue"; 3, 4, 5: print "chanson"; 6, 7: print "mélodie"; 8, 9, 10: print "composition"; ! devrait être 'morceau' pour 'tune', mais c'est plus simple si tout est féminin ici } print " "; if (num % 97 > 31) { flag=1; switch (num % 13) { 0: print "afro-"; redundant++; 1: print "indo-"; 2: print "reggae-"; 3: print "antarctico-"; 4: print "sino-"; 5: print "philippo-"; 6: print "hispano-"; 7: print "balto-"; 8: print "polono-"; 9: print "hypno-"; 10: print "australo-"; 11: print "franco-"; 12: print "appalacho-"; } } switch (num % 19) { 0: print "manx"; 1: print "celtique"; 2: print "coréenne"; 3: print "japonaise"; 4: print "javanaise"; 5: print "balinaise"; 6: print "slave"; 7: print "hmong"; 8: print "basque"; 9: print "andalouse"; 10: print "nigériane"; redundant++; 11: print "électronique"; 12: print "sumérienne"; 13: print "atalante (?)"; 14: print "inuite"; 15: print "estonienne"; 16: print "maori"; 17: print "shaker"; 18: print "dominicaine"; } if (redundant==2) { stereosmartcount++; if (stereosmartcount == 1) print " (d'accord, c'est redondant)"; } if (flag==0) { print " "; switch (num % 13) { 0: print "lancinante"; 1: print "effrayante"; 2: print "jazzy"; 3: print "retentissante"; 4: print "nerveuse"; 5: print "électrisante"; 6: print "apaisante"; 7: print "calme"; 8: print "violente"; 9: print "animée"; 10: print "vive"; 11: print "rythmée"; 12: print "répétitive"; } } ], has scenery switchable ~on female; Object -> luggage "bagages" with name 'bagages' 'valise' 'valises' 'affaires', description [; print "Vous avez fait et refait vos valises : tente incassable, nourriture lyophilisée, crème solaire, boussole, couverture chauffante, sous-vêtements longs et faux tatouages clinquants, une paire de chaussures de marche, une de danse et une de randonnée. Vous êtes prêt pour le Om de la Vallée de la Mort !^"; BackgroundInfo(self, "Aussi prêt que vous pourrez l'être."); if (GoalOpen(tickets)) { if (self.ticket_search == 0) { self.ticket_search = 1; print "^Oh nan... Vous n'avez pas laissé vos billets dans vos bagages quand même ?^"; } } ], ticket_search 0, background_flag false, subdescribe "Vos bagages sont empilés en désordre vers la porte.", before [; Open, Search: if (OIU(self)) rtrue; if (GoalOpen(self)) { Goaled(self); remove self; BumpSand(livingsand); "Vous attrapez la poignée de votre valise -- qui crépite sèchement dans votre main. En quelques secondes silencieuses, la colonne de valises et de duvets se sont désintégrés en sable blanc sur le sol du salon."; } if (GoalOpen(tickets)) { print "Vous ouvrez rapidement chaque valise et fouinez dedans, en essayant de ne pas trop chambouler vos rangements... "; CheckTicket(self); rtrue; } "Oh non... Vous avez passé des heures à empiler le tout pour optimiser l'espace de rangement. Si vous farfouillez les bagages maintenant vous craignez d'être encore en train de ranger quand le taxi arrivera."; Close: if (OIU(self)) rtrue; "Tous les bagages sont déjà fermés."; Push, Pull, Take: if (OIU(self)) rtrue; if (GoalOpen(self)) <>; "C'est à peine portable @{2014} j'insiste : ", (emph) "à peine."; Touch: if (GoalOpen(self)) <>; Empty, EmptyT: <>; ], prereqs closet stove, has scenery pluralname; Object -> plant "plante" with name 'plante' 'en' 'pot' 'de' 'fleur' 'terreau', short_name [; switch (self.number) { 0: print "jacinthe"; 1: print "chlorophytum"; 2: print "palmier"; 3: print "cactus"; default: print "[BUG]"; } rtrue; ], parse_name [ wd num altwd; switch (self.number) { 0: altwd = 'jacinthe'; 1: altwd = 'chlorophytum'; 2: altwd = 'palmier'; 3: altwd = 'cactus'; default: altwd = 'plante'; } wd = NextWord(); while (WordInProperty(wd, self, name) || wd == altwd) { num++; wd = NextWord(); } return num; ], subdescribe [; if (self has female) { print "Une "; } else { print "Un "; } self.short_name(); print " est dans un pot à côté de la fenêtre."; rtrue; ], number 0, ! 0: hyacinth; 1: spider plant; 2: palm; 3: cactus startup [ level; if (self.number >= level) return; self.number = level; if (level > 0) { give self ~female; } ! added for translation self.waterlevel = 0; ], waterlevel 1, description [; print "Cette plante est votre seule vraie responsabilité. "; print (The) self, " se trouve vers la fenêtre, buvant la lumière du soleil (sauf la nuit) et prospérant malgré votre manque de compétences en jardinage."; switch (self.waterlevel) { 1: if (self has female) { print " Même si elle a l'air un peu sèche en ce moment...";} else { print " Même s'il a l'air un peu sec en ce moment...";} 0: if (self has female) { print " Même si elle semble très sèche.";} else { print " Même s'il a l'air très sec.";} } new_line; rtrue; ], before [; Push, Pull, Take: if (OIU(self)) rtrue; "La plante est bien là où elle est."; Touch: if (OIU(self)) rtrue; switch (self.waterlevel) { 1: "Le terreau est un peu sec."; 0: "Le sol est très sec."; 2: "Le sol est humide."; 3: "Le sol est très humide."; } Attack: if (OIU(self)) rtrue; "La plante a assez de problèmes comme ça."; ], receive_water [; if (self.number > 0) { "Alors que vous transportez le verre vers ", (the) self, ", votre pied glisse (vous devriez ", (emph) "vraiment", " nettoyer ce sable). L'eau se répand partout... sauf dans le pot."; } if (self.waterlevel >= 3) { print "Si vous l'arrosez encore, ses racines vont pourrir.^"; return 2; } self.waterlevel++; "Vous arrosez la plante."; ], has scenery female ; Object -> mirror "miroir" with name 'plein' 'long' 'large' 'miroir' 'reflet', description [; print "Le côté opposé du miroir est aussi"; if (GoalClosed(window)) print " lumineux"; else print " sombre"; " que celui-ci. C'est comme une métaphore : vous rêvez de plus d'espace, mais la routine remplit toute votre vie."; ! dur dur de traduire ça ], before [; Search, Examine: if (OIU(self)) rtrue; if (GoalOpen(self)) <>; self.description(); rtrue; Touch: if (OIU(self)) rtrue; if (GoalOpen(self)) <>; "Vous avancez votre main et touchez son reflet. C'est du verre."; Pull, Push, Take: if (OIU(self)) rtrue; "Le miroir est fermement accroché au mur."; Attack: if (OIU(self)) rtrue; "Sept ans de malheur ", (emph) "et", " un bazar à nettoyer. Vous vous abstenez."; Enter: if (OIU(self)) rtrue; if (GoalOpen(self)) { print "Vous regardez dans le miroir. Le côté opposé est aussi clair que celui-ci. Avec le soleil derrière vous, seul votre visage est dans l'ombre @{2014} les murs, la porte, vos meubles, sont tous complètement éclairés. Derrière votre reflet et le montant de la fenêtre, la rue dehors, les maisons et les arbres, sont tous @{2014}^^"; print (emph) "La rue dehors?"; print "^^Vous vous retournez brusquement.^^"; KeyPause(); print "^^^"; while (child(player)) { move child(player) to Apartment; } PlayerTo(FakeApartment); give stereo ~on; Goaled(self); rtrue; } "Vous sortez et rentrez dans des miroirs, maintenant ? On ne doit pas être loin du pays des merveilles."; ], prereqs window, has scenery; Object -> frontdoor "porte d'entrée" with name 'entree' 'porte', description "La porte d'entrée est blanche et rectangulaire @{2014} oui, une porte, quoi. Elle est fermée.", seenonce false, before [; Open: if (OIU(self)) rtrue; if (GoalEverOpen(window)) { if (~~self.seenonce) { self.seenonce = true; desk.opentime = 9; ! no honk for a couple of turns print "Vous ouvrez la porte.^^Au dehors, c'est la nuit noire. Vous voyez à peine... rien. Pas de taxi, pas d'étoiles, même pas de lampadaires. Le monde se termine sur le pas de votre porte.^^^"; print (emph) "La nuit commence à entrer, doucement."; "^^^Vous êtes debout, dos à la porte fermée. Vous fermez vos yeux, puis vous forcez à les ouvrir ; le noir, c'est pire que le sable. Ça n'est plus très drôle maintenant... vous vous concentrez et essayez de ralentir votre respiration."; } else { "Vous ne voulez pas ça."; } } "Le soleil n'est pas levé ; la lumière que vous avez ici ne ferait que s'échapper dans la nuit. De toute façon, le taxi n'est pas encore arrivé, alors il n'y a nulle part où aller."; Search: if (OIU(self)) rtrue; "La porte est fermée."; Close: if (OIU(self)) rtrue; "La porte est déjà fermée."; Enter: if (OIU(self)) rtrue; if (GoalEverOpen(window)) <>; "Le taxi n'est pas encore arrivé."; ], has scenery female; Object -> window "fenêtre" with name 'fenetre', description [; if (windowshade hasnt open) { "Le store est baissé."; } "Dehors, des dunes roulent vers un soleil levant. Rien d'autre n'est visible. Seule la lumière du soleil, qui vous brûle, en plein dans la figure. Et du sable."; ], before [; Examine, Search: self.description(); rtrue; Attack: if (OIU(self)) rtrue; "Vous perdriez votre caution. Et aussi la climatisation."; Open, Close: if (OIU(self)) rtrue; "La vitre de la fenêtre est scellée; elle ne peut être ni ouverte ni fermée. Pour une question d'efficacité énergétique. Honnêtement, ça vous va comme ça."; Enter: "Vous ne pouvez pas traverser le verre."; LookUnder: if (OIU(self)) rtrue; "Quelqu'un a écrit ici, au stylo-bille."; ], prereqs kitchen bathroom desk, has scenery transparent female; Object -> -> windowshade "store de la fenêtre" with name 'fenetre' 'store' 'rideau' 'rideaux', parse_name [ wd firstwd num; wd = NextWord(); firstwd = wd; while (WordInProperty(wd, self, name)) { num++; wd = NextWord(); } if (num == 1 && firstwd == 'fenêtre') return 0; return num; ], description [; print "Le store est un drap en plastique blanc @{2014} plutôt jaune, peut-être. Avec un de ces mécanismes roulant, qui ne fonctionne jamais vraiment."; if (self hasnt open) " Le store est baissé face à l'obscurité qui précède l'aube."; else " Le store est enroulé jusqu'en haut."; ], before [; Search: if (self hasnt open) "Le store est opaque."; <>; LookUnder: if (self hasnt open) <>; <>; Pull, Turn: if (self hasnt open) <>; else <>; Enter: <>; Open, Raise: if (OIU(self)) rtrue; if (GoalOpen(window)) { KillImp(desk); frontdoor.seenonce = true; give self open; BumpSand(livingsand); plant.startup(3); RescueContents(closet); remove closet; Apartment.seenonce = 2; Goaled(window); print "Et si vous ne voyez pas de taxi dehors ? Que ferez vous ?... mais le klaxon virulent revient. Vous tirez brusquement sur le cordon du store, et il se relève violemment.^^^"; print (emph) "L'aveuglante lumière du jour inonde la pièce."; new_line; rtrue; } if (self has open) "Le store est déjà relevé."; "Les ténèbres rampent déjà autour des bords du store. Vous n'avez aucune envie de regarder la nuit dans les yeux."; Close, Lower: if (OIU(self)) rtrue; if (self hasnt open) "Le store est déjà baissé."; "Et si la nuit revenait?"; ], has scenery ~open; Object -> closet "penderie" with name 'penderie' 'penderie', parse_name [ wd num altwd; if (GoalOpen(self)) altwd = 'porte'; else altwd = 'penderie'; wd = NextWord(); while (WordInProperty(wd, self, name) || wd == altwd) { num++; wd = NextWord(); } return num; ], seenonce 0, description [ ix firsttime; print "La penderie"; if (self.seenonce == 0) { self.seenonce = 1; firsttime = 1; print " (si vous pouvez l'appeler comme ça)"; } print " est un renfoncement peu profond"; if (bathroom in Apartment) print " à côté de la salle de bains"; else print " à côté de, heu, là où la salle de bains se trouvait"; print "."; if (self hasnt open) { if (~~(GoalOpen(self))) print " [BUG:]"; print " C'est fermé.^"; if (self.seenonce < 2) { self.seenonce = 2; print "^Attendez. Il ne manquait pas une porte à cette penderie quand vous avez emménagé ?^"; } rtrue; } ix = child(self); if (~~ix) { if (GoalClosed(self)) print " La penderie est à moitié pleine de sable, mais le reste est vide."; else print " La penderie est vide."; } else { if (GoalClosed(self)) { print " Scrutant les profondeurs, vous voyez des coulures de sable, et aussi "; } else { print " Scrutant les"; if (firsttime) print " (hum...)"; print " profondeurs, vous voyez "; } WriteListFrom(ix, TERSE_BIT + ENGLISH_BIT + CONCEAL_BIT); print "."; } new_line; rtrue; ], before [; Search, Examine: if (OIU(self)) rtrue; self.description(); rtrue; Enter: if (self hasnt open) "La penderie est vide."; "Ce n'est pas une penderie dans laquelle on peut tenir. C'est même à peine une penderie dans laquelle on peut accéder."; Open: if (OIU(self)) rtrue; if (GoalClosed(self)) "La penderie ne se refermera certainement jamais plus."; if (~~GoalOpen(self)) "La penderie n'a pas de porte. Elle en a peut-être eu une, s'il s'agit bien de marques de charnières sur le cadre, mais elle a dû connaître par le passé plusieurs propriétaires et des douzaines de couches de peintures."; Goaled(self); give self open; BumpSand(livingsand); "Vous approchez la main de la poignée ; puis vous hésitez ; puis vous approchez votre main à nouveau.^^ Vous auriez même pu ne pas vous en donner la peine. La porte de la penderie sort de ses gonds avant que vous ne puissiez la toucher. Vous reculez, évitant de peu le contreplaqué lorsqu'il s'écrase sur le sol, enseveli sous le torrent de sable qui s'écoule de la penderie.^^Après quelques secondes, la pièce est à nouveau calme."; Close: if (OIU(self)) rtrue; if (GoalClosed(self)) <>; if (~~GoalOpen(self)) <>; "La penderie est déjà fermée."; ], prereqs [; return (GoalClosed(bathsink) || GoalClosed(kitchensink)); ], imp [; fridge.startup(); return -1; ], startup [; if (GoalOpen(self) && self has open) give self ~open; ], has scenery container open female; Object -> -> jacket "vieux manteau" with name 'vieux' 'manteau' 'veste' 'xoron', article "un", description [; print "Votre manteau est accroché dans la penderie. C'est, bien sûr, votre ", (emph) "vieux", " manteau @{2014} à moitié imperméable mais entièrement miteux @{2014} utilisable uniquement pour errer dans la ville."; if (GoalClosed(luggage)) { new_line; rtrue; } print " Votre ", (emph) "nouveau", " manteau, coupe-vent coupe-pluie coupe-sable Xoron@{2122}, adapté au camping en plein désert, est soigneusement emballé dans votre valise.^"; BackgroundInfo(self, "Non pas que la valise soit un élément important."); if (GoalOpen(tickets)) { if (self.ticket_search == 0) { self.ticket_search = 1; print "^Vous portez maintenant le manteau depuis que vous y avez récupéré les billets d'avion...^"; } } ], ticket_search 0, background_flag false, before [; Take, Wear: if (OIU(self)) rtrue; "Vous n'avez pas besoin de votre vieille veste."; Search: if (OIU(self)) rtrue; if (GoalOpen(tickets)) { print "Vous fouillez la myriade de poches de votre vieux manteau. "; CheckTicket(self); rtrue; } "C'est juste un vieux manteau."; ], has static; Object -> -> vacuum "aspirateur" with name 'portable' 'aspirateur' 'entraille' 'entrailles', description [; print "L'aspirateur est un modèle @<< portable @>> @{2014} ce qui veut dire qu'il n'est pas pratique à transporter, mais trop petit pour être vraiment efficace. Heureusement, vous ne générez pas beaucoup de poussière."; if (self has open) { print "L'aspirateur est ouvert, et l'on voit ses entrailles."; } new_line; rtrue; ], before [ ix jx zowd; SwitchOn, Squeeze: if (OIU(self)) rtrue; ix = FindZone(player); if (ix && ix has supporter) "Vous ne pouvez pas utiliser l'aspirateur en étant assis."; jx = parent(self); if (~~(jx ofclass Zone || jx == Apartment || jx == player)) { print "L'aspirateur n'aspirera pas grand-chose"; if (jx has supporter) print " sur ", (the) jx; else print " dans ", (the) jx; "."; } switch (ix) { kitchen: zowd = " de la cuisine"; bathroom: zowd = " de la salle de bains"; shower: zowd = " de la cabine de douche"; default: zowd = ""; } if (self has open) { print "L'aspirateur ne peut pas être allumé quand il est ouvert."; if (self.number) print " Non pas qu'il semble marcher d'une quelconque manière maintenant."; new_line; rtrue; } if (self.number >= 5) { if (self.number >= 10) "Vous pressez la poignée. Rien ne se passe. L'aspirateur est cassé."; self.number = 10; Goaled(self); "Vous pressez la poignée. L'aspirateur fait un bruit désagréable, une sorte de grincement, puis s'arrête complètement. Le sable a dû être de trop pour lui."; } print "Vous pressez la poignée, et l'aspirateur commence à bourdonner"; if (self.number < 2) print " diligemment"; else print ", quoiqu'en gémissant un peu"; print ". Vous faites quelques aller-retours sur le sol", (string) zowd, ""; if (GoalOpen(self) || GoalClosed(self)) { self.number++; if (ix && ix.sand_obj && ix.sand_obj.number > 0) { if (ix.sand_obj.number < 3) BumpSand(ix.sand_obj); ". Mais on dirait que ça ne fait que disperser le sable sur le sol. En fait, on dirait qu'il y a plus de sable que quand vous avez commencé."; } else { if (ix) BumpSand(ix); ". Mais après quelques mouvements, vous entendez un raclement étrange."; } } print " pendant quelques instants. Ça ne fait pas grande différence, mais ça vous donne la sensation d'être propre.^"; rtrue; SwitchOff: if (OIU(self)) rtrue; "Cet aspirateur s'éteint automatiquement."; Open: if (OIU(self)) rtrue; if (self has open) "C'est déjà ouvert."; give self open; if (self.number) { self.number = 10; Goaled(self); ix = FindFloorZone(player); if (ix) BumpSand(ix); "Vous ouvrez le boîtier de l'aspirateur. Du sable s'échappe @{2014} partout sur le sol. Que diable se passe-t-il ?"; } "Vous ouvrez le boîtier de l'aspirateur. À l'intérieur se trouvent, hé bien, les entrailles de l'aspirateur. Vous n'avez jamais vraiment compris ce qu'il se passait là-dedans, mais elles n'ont pas l'air très différentes cette fois-ci."; Close: if (OIU(self)) rtrue; if (self hasnt open) "C'est déjà fermé."; if (self.number) { "Vous essayez de fermer le boîtier, mais le sable s'est infiltré dans les joints. Vous ne pouvez pas vraiment complètement le fermer, même en y tapant dessus."; } give self ~open; "Vous refermez l'aspirateur."; Examine: if (self has open && self.number) <>; Search: if (OIU(self)) rtrue; if (self hasnt open) "L'aspirateur est fermé."; if (self.number) { print "Les entrailles de l'aspirateur sont remplies de sable."; if (~~self.seenonce) { self.seenonce = true; print " Vous ne comprenez pas vraiment comment ça se fait."; } new_line; rtrue; } "À l'intérieur, ben, ce sont les entrailles de l'aspirateur. Vous n'avez jamais vraiment compris ce qui se passait là-dedans, mais ça n'a pas l'air différent de d'habitude."; Receive: if (self hasnt open) "L'aspirateur est fermé."; "Il n'y a pas d'espace vide dans l'aspirateur."; Wave: if (self has open && self.number) <>; Empty, EmptyT: if (OIU(self)) rtrue; if (self hasnt open) "L'aspirateur est fermé."; if (self.number) { ix = FindFloorZone(player); if (ix && ix.sand_obj == 0) BumpSand(ix); "Un peu plus de sable s'écoule hors de l'aspirateur."; } "Les entrailles de l'aspirateur ne peuvent être enlevées."; Enter: if (verb_word == 'allumer') <>; ], seenonce false, after [; Take: "Ok. (Vraiment pas pratique.)"; ], number 0, prereqs tickets, opentime 0, imp [; self.opentime++; switch (self.opentime) { 1: stereo.startup(); 5: print "^Ce doit être le matin, en fait @{2014} votre métabolisme est en train de se réveiller.^"; 6: print "^Vous commencez vraiment à avoir faim.^"; 11: print "^Votre estomac grogne.^"; 18: print "^Vous réfléchissez aux options d'alimentation disponibles.^"; 23: self.opentime = 9; } ], has rescuable ~open; Zone futon "canapé" with name 'canape', articles "Votre" "votre" "votre", description [ ix; print "Le canapé est clairement sur la pente douce de la colline de la vie. Cette chauffeuse sert à la fois de canapé et de lit (bien que médiocre, dans les deux cas) ce qui en fait le meuble le plus important que vous possédez.^"; ix = children(self); if ((player notin self && ix > 0) || ix > 1) { print "^Assis sur le canapé"; if (player in self) print " à vos côtés"; WriteListFrom(child(self), TERSE_BIT + ENGLISH_BIT + ISARE_BIT + CONCEAL_BIT); print ".^"; } rtrue; ], leave_barrier "Vous n'arriverez pas à grand-chose affalé sur le canapé. Vous vous en êtes bien rendu compte depuis quelques heures.", leave_fragment " vous levez", enter_fragment [; if (random(101) < 40) print " vous affalez sur le canapé"; else print " vous asseyez"; rtrue; ], locseealso kitchen bathroom, before [; LookUnder: if (OIU(self)) rtrue; if (player in self) print "Vous vous tordez, tête en bas, et"; else print "Vous vous penchez et"; if (Apartment.sand_obj && Apartment.sand_obj.number > 2) { print " voyez une petite"; if (Apartment.sand_obj.number < 5) print " sinon un peu de sable"; else print " à part du sable"; "."; } " voyez de la poussière et des cochonneries quelconques sous le canapé. Rien d'anormal."; Pull, Push, Turn: if (OIU(self)) rtrue; "Le canapé est théoriquement facile à déplacer. En pratique, vous vous en fichez."; Dig: if (OIU(self)) rtrue; "Pas de monnaie, navré."; ], react_before [; Exit: if (player in self) { if (self.leave_barrier == NULL) { return self.Zone::react_before(); } self.leave_barrier = NULL; move player to Apartment; Goaled(firstgoal); "Vous vous redressez à la verticale. C'est fou à quel point le manque de sommeil se ressent comme une gueule de bois, seulement avec la fête en moins."; } ], has supporter; Zone desk "bureau" with name 'bureau', description [ num; print "Le bureau est, évidemment, un bazar organisé ; des piles de papiers se chevauchent sur plusieurs centimètres d'épaisseur. L'ordinateur, un bloc beige poussiéreux et obsolète depuis plusieurs générations, émerge courageusement de ces différentes couches sédimentaires. Et la lampe pend au-dessus du tout.^"; if (computer has on) { print "^Un message indiquant ", (emph) "game over ", "clignote à l'écran.^"; } num = Locale(self, "Vous voyez", "Vous voyez aussi"); if (num) { print " sur le bureau.^"; } rtrue; ], nolocifin true, leave_fragment " vous levez", enter_fragment " vous asseyez au bureau", locseealso kitchen bathroom, before [ count ix; LookUnder: if (OIU(self)) rtrue; if (Apartment.sand_obj && Apartment.sand_obj.number > 2) { print "Rien sous le bureau"; if (Apartment.sand_obj.number < 5) print " sinon un peu de sable"; else print " à part du sable"; "."; } "Rien d'intéressant sous le bureau."; Take, Push, Pull: if (OIU(self)) rtrue; "Le bureau est trop lourd à porter."; Search: if (OIU(self)) rtrue; if (GoalOpen(self) || GoalOpen(tickets)) <>; count = 0; objectloop (ix in self) { if (ix hasnt concealed && ix hasnt scenery) count++; } print "À part l'ordinateur, la lampe et les piles de papier"; if (count == 0) ", il n'y a rien sur le bureau."; print ", vous voyez "; WriteListFrom(child(self), TERSE_BIT + ENGLISH_BIT + CONCEAL_BIT); "."; ], prereqs closet shower, opentime 0, imp [; if (~~GoalClosed(kitchen)) return; if (~~GoalClosed(bathroom)) return; self.opentime++; switch (self.opentime) { 3: print "^Vous entendez une voiture approcher à l'extérieur.^"; 4: print "^Une voiture klaxonne dehors.^"; 6: print "^La voiture klaxonne à nouveau, de manière plus empressée. Votre taxi @{2014} sans aucun doute.^"; 7: print "^Le taxi klaxonne à plusieurs reprises.^"; 9: print "^Le taxi klaxonne à plusieurs reprises. Le bruit vous semble plus faible à présent.^"; 11: self.opentime = 6; } ], has supporter; Object -> papers "papiers" with name 'papier' 'papiers' 'strates' 'pile' 'piles', description [; print "Les papiers englobent tout ce que vous avez fait, pensé, ou écrit cette année. Et rien de tout cela ne vaut vraiment la peine qu'on y jette un @oeil.^"; if (GoalOpen(tickets)) { if (self.ticket_search == 0) { self.ticket_search = 1; print "^Ou @{2014} hum... Peut-être avez vous laissé vos billets d'avion sur le bureau hier, avant cette session de travail tardive sur vos fictions interactives ?^"; } } rtrue; ], seenonce false, ticket_search 0, before [; Examine: if (OIU(self)) rtrue; if (GoalOpen(desk)) <>; self.description(); rtrue; Search, LookUnder: if (OIU(self)) rtrue; if (GoalOpen(desk)) { plant.startup(2); RescueContents(desk); move computer to Apartment; give computer ~on; remove desk; Goaled(desk); "Vous soulevez précautionneusement les piles de papiers, en essayant d'éviter une avalanche. Oui, du sable est dispersé derrière.^^Précautionneusement ? Vous raflez une pile de papier hors du bureau ; c'est une pluie de sable qui heurte le sol. Ah ! Vous en poussez une autre, puis une autre, et balayez toute la masse par dessus bord. Du sable blanc tombe en cascade partout. Tout en riant, vous sentez le bureau partir lui aussi.^^", (emph) "Pop.", " Oups. Ça, c'était l'ampoule, qui vient d'imploser. Tout à coup l'appartement est sombre et silencieux."; } if (GoalOpen(tickets)) { print "Vous soulevez précautionneusement les piles de papiers, en essayant d'éviter une avalanche. "; CheckTicket(self); rtrue; } "Rien, dans tout ce bazar, que vous ne souhaitiez revoir, vraiment..."; Take, Push, Pull: if (OIU(self)) rtrue; if (GoalOpen(desk) || GoalOpen(tickets)) <>; print "Quoi ? Et désorganiser vos piles ?? Vous ne retrouveriez plus la moindre chose après"; if (~~self.seenonce) { self.seenonce = true; print "... enfin, ce n'est pas comme si vous aviez déjà cherché quelque chose dans ces piles auparavant. Votre vie se contente d'accumuler, c'est votre choix, elle ne construit pas"; } "."; ], has scenery pluralname; Object -> lamp "lampe" with name 'bureau' 'lampe' 'linge' 'pince' 'pinces//p', parse_name [ wd firstwd num; wd = NextWord(); firstwd = wd; while (WordInProperty(wd, self, name)) { num++; wd = NextWord(); } if (num == 1 && firstwd == 'bureau') return 0; return num; ], description "La lampe est un objet étrange, avec un pied en cou de cygne, trouvé dans un vide-grenier. Elle est serrée sur le côté du bureau, et équilibrée par une ribambelle de pinces à linge. La lampe projette un halo jaune inconfortable autour du bureau ; et elle vous fait mal aux yeux...", before [; Search: if (OIU(self)) rtrue; "Vous plissez les yeux dans la lumière aveuglante. Si la vérité est dans le coin, elle vous est invisible."; Take, Pull, Push, Turn: if (OIU(self)) rtrue; "Vous n'osez pas bidouiller ça. Seul un arrangement précaire de pinces et d'étaux empêche la lampe de s'écrouler à plat et de mettre le feu à votre bureau."; Touch: if (OIU(self)) rtrue; "La lampe est chaude."; SwitchOn: if (OIU(self)) rtrue; "La lampe est déjà allumée."; SwitchOff: if (OIU(self)) rtrue; "Vous ne voulez pas qu'il fasse noir."; ], has scenery female; Object -> computer "ordinateur" with name 'ordinateur' 'poussiereux' 'beige' 'bloc' 'ecran' 'clavier' 'textuelle' 'jeu' 'aventure' 'if' 'interactive' 'fiction', seenonce false, description [; print "L'ordinateur a plusieurs années, et est incompatible avec quasiment tout sauf l'électricité. Vous vous en servez pour écrire @{2014} enfin, c'est ce que vous essayez de vous faire croire.^"; if (self has on) { if (~~self.seenonce) { self.seenonce = true; print "^En ce moment, par contre, il y a un jeu sur l'écran @{2014} une de ces aventures textuelles, ou fictions interactives, ou n'importe quel nom qu'ils leur donnent ce mois-ci @{2014} le seul genre de jeu que votre antiquité beige peut lancer, en tout cas."; } print "^Le message @<< Game Over! @>> clignote, maussade. Vous aviez commencé ", (emph) "Ready, Okay!", " hier soir, pour essayer de vous distraire jusqu'au matin. Mais vous n'arrivez même pas à la moitié du jeu sans que l'insuline tombe à zéro."; } else { print "^L'ordinateur est éteint.^"; } rtrue; ], nosubdescribe [; return (self in desk); ], subdescribe "L'ordinateur a survécu, bizarrement, et est posé sur une pile de sable.", before [; Examine, Search: if (OIU(self)) rtrue; self.description(); rtrue; Play, TypeOn: if (OIU(self)) rtrue; if (self hasnt on) "L'ordinateur n'est pas allumé."; "Vous avez essayé toutes vos idées deux fois, et vous en avez assez d'essayer. Peut-être que vous aurez une autre idée plus tard."; SwitchOff: if (OIU(self)) rtrue; if (self hasnt on) "L'ordinateur est déjà éteint."; give self ~on; "Vous appuyez sur le bouton d'alimentation ; l'ordinateur laisse entendre un petit soupir et s'éteint."; SwitchOn: if (OIU(self)) rtrue; if (self has on) "L'ordinateur est déjà allumé."; "Vous appuyez sur le bouton d'alimentation ; rien ne se passe. Super. Quelque chose a enfin grillé dans les entrailles de votre merveille à douze mégahertz, et vous ne mourrez plus jamais dans une aventure textuelle."; Attack: if (OIU(self)) rtrue; if (self has on) "La violence n'est pas une solution à ce jeu."; else "Vous donnez un coup, au cas où. Mais vous appuyez encore une fois sur le bouton d'alimentation et l'ordinateur est toujours éteint."; Smell: if (OIU(self)) rtrue; if (self has on) "L'ordinateur sent l'ozone et la poussière brûlée."; "Vous vous approchez. Eh oui, l'odeur d'isolant brûlé s'échappe de l'aération."; Open: if (OIU(self)) rtrue; "Ce modèle ne peut être ouvert qu'à l'usine. (Et d'après ce que vous en savez, l'usine a été détruite pendant l'inondation de Pyongyang en 1990.)"; LookUnder: if (OIU(self)) rtrue; "Oui, votre ordinateur a des petits pieds."; ], has scenery on; Object -> todo "liste de tâches" with name 'liste' 'to' 'do' '-do' 'todo' 'taches//p', articles "Votre" "votre" "votre", description [; print "La liste de tâches pour votre voyage imminent est un fouillis de lignes barrées et de corrections griffonnées."; if (GoalClosed(window)) { " Elle est complètement illisible."; } if (GoalOpen(window)) { print " Tout en bas de la page, vous voyez écrit :^"; print " @{2014} appeler taxi^"; print " @{2014} attendre taxi^"; print " @{2014} regarder, s'assurer que c'est bien le taxi avant d'ouvrir la porte^"; " (Cette dernière ligne est écrite à la va-vite, nerveusement.)"; } if (GoalClosed(bathsink) || GoalClosed(kitchensink)) { print " Au milieu de la page, vous voyez :^"; if (GoalOpen(closet)) print " @{2014} faire le ménage dans la penderie^"; if (GoalOpen(crate)) print " @{2014} acheter un meuble pour la chaîne stéréo^"; if (GoalOpen(stove)) print " @{2014} ne pas laisser les plaques allumées^"; if (GoalOpen(fridge)) print " @{2014} dégivrer le frigo^"; if (GoalOpen(shower)) print " @{2014} déboucher la bonde de la douche^"; if (GoalOpen(luggage)) print " @{2014} prendre des chaussettes propres^"; if (GoalOpen(cupboard)) print " @{2014} enlever le paquet du placard de la cuisine^"; if (GoalOpen(desk)) print " @{2014} trouver les notes du jeu pour l'IFComp^"; if (GoalOpen(toilet)) print " @{2014} mettre les notes du jeu dans les toilettes et tirer la chasse^"; if (GoalOpen(kitchen)) print " @{2014} ne pas aller dans la cuisine !^"; if (GoalOpen(bathroom)) print " @{2014} ne pas aller dans la salle de bains !^"; rtrue; } if (GoalOpen(bathsink) || GoalOpen(kitchensink)) { " Zut, encore une tâche que vous avez ratée @{2014} il faut arroser la plante."; } if (GoalOpen(vacuum)) { " Mmh. Vous avez coché @<< Passer l'aspirateur @>> ; vous vous souvenez l'avoir fait. Mais regardez dans quel état est le sol."; } if (GoalOpen(tickets)) { " Là, près du bas de la feuille ; @<< Acheter billets d'avion @>>, et c'est coché. Mais alors où les avez-vous mis ? Le bureau ? La poche de votre manteau ? Est-ce que vous les avez mis dans vos bagages par accident ?"; } " Cependant, on dirait que tout est déjà fait. La dernière ligne est @<< Appeler le taxi @>>, et elle est cochée, et vous voilà à attendre."; ], before [; Examine, Search: if (OIU(self)) rtrue; self.description(); rtrue; ], has rescuable female; Object -> book "guide de voyage" with name 'voyage' 'survie' 'livre' 'schmendrick' 'desert' 'camping' 'guide', saw_blank false, number 0, description [; if (GoalClosed(mirror)) { if (player.orders == 0) { print (emph) "Le guide élémentaire du désert", " @{2014} vous l'étudiez depuis très longtemps. Récupération d'humidité de faible concentration, cycles biologiques des arthropodes, différences de taille entre sable, gravier et sable fin. Et, bien entendu, les aspects artistiques de la chaleur, du temps, de la distance, et de la mort.^"; switch (random(91) % 9) { 0: print "^Vous aimez tout particulièrement lire"; 1: print "^Vous relisez"; 2: print "^Vous cherchez"; 3: print "^Vous tombez sur"; 4: print "^Vous étudiez"; 5: print "^Vous mémorisez"; 6: print "^Vous lisez en diagonale"; 7: print "^Vous aimez lire"; 8: print "^Vous contemplez"; } switch (random(107) % 9) { 0: print " les chapitres sur"; 1: print " une section sur"; 2: print " quelques tableaux sur"; 3: print " les quelques pages sur"; 4: print " quelques paragraphes sur"; 5: print " les points à savoir sur"; 6: print " le chapitre sur"; 7: print " un page sur"; 8: print " un essai sur"; } self.number++; switch (self.number) { 1: print " les ossements"; 2: print " la faim"; 3: print " les scorpions"; 4: print " la soif"; 5: print " les serpents"; 6: print " les tempêtes de sable"; 7: print " les insolations"; 8: print " les piqûres"; 9: print " la soif"; 10: print " les dunes"; 11: print " l'aridité"; default: print " la soif"; self.number = 0; } "."; } else { self.saw_blank = true; "La couverture est usée maintenant. Les pages sont toutes blanches."; } } if (GoalClosed(fridge) || GoalClosed(shower) || GoalClosed(luggage)) { print (emph) "Le Guide Schmendrick du désert", " @{2014} vous le bachotez depuis une éternité. Un puits sans fond, des kilomètres d'information : les couleurs du silence, les bruits de la chaleur et des rayons du soleil, la sensation qu'ont les grands espaces sur votre peau, et la mort. Ça semble tellement beau.^"; rtrue; } if (GoalClosed(vacuum)) { print (emph) "Le Guide Schmendrick pour camper dans le désert", " @{2014} vous le bachotez depuis plusieurs semaines. Un volume énorme d'informations étranges : taux de transpiration, facteurs de coups de soleil, comment éviter de mourir de soif, comment éviter de mourir de chaud. Ça a l'air ardu.^"; BackgroundInfo(self, "Mais c'est pour ça que vous allez faire ce voyage."); rtrue; } print (emph) "Le Guide Schmendrick pour camper dans le désert", " @{2014} vous le bachotez depuis plusieurs semaines. Un volume énorme d'informations étranges : taux de transpiration, facteurs de coups de soleil, comment fixer des haubans sur sa tente, et faire un alambic à condensation avec un sac poubelle et une boîte de conserve. Vous seriez sans doute capable de réécrire le livre à la main de mémoire ; et rien de tout ça n'a de foutu sens pour vous.^"; BackgroundInfo(self, "C'est pour ça que vous allez faire ce voyage, après tout."); rtrue; ], background_flag false, before [; Examine, Search, Open: if (OIU(self)) rtrue; self.description(); rtrue; ], has rescuable;