! _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. [ ParseNameRelay wd num; wd = NextWord(); while (WordInProperty(wd, self.self_obj, name)) { num++; wd = NextWord(); } return num; ]; [ DesertCheckUnder obj; if (figure.number == obj) { "Vous apercevez brièvement deux petits yeux qui brillent sous ", (the) obj, "."; } "Vous vous penchez, et vous voyez seulement du sable."; ]; [ DesertGoaled obj; remove obj; if (figure.number == obj) { figure.number = ChooseHome(); if (figure.number) { "^Une petite silhouette se creuse un chemin hors du sable qui vient de tomber. Vous avez à peine le temps d'apercevoir sa forme @{2014} humaine @{2014} avant qu'elle ne file derrière vous et ne disparaisse."; } else { "^Une petite silhouette se creuse un chemin hors du sable qui vient de tomber. Elle file dans une direction, puis une autre; mais il n'y a plus d'endroit où s'abriter."; } } ]; [ ChooseHome ix obj count; count = 0; ix = random(101); while (count < 3) { switch (ix % 3) { 0: obj = desstereo; 1: obj = descomputer; 2: obj = desfuton; } if (obj in Desert) return obj; ix++; count++; } return 0; ]; [ Suffer; if (figure.number) "^[BUG] figure.number pas zéro"; figure.weakness++; switch (figure.weakness) { 2: print "^La silhouette avance plus lentement désormais.^"; 3: print "^La silhouette s'effondre sur le sable. Non @{2014} elle bouge encore, bien que juste à quatre pattes maintenant.^"; 4: print "^La silhouette tombe. Après quelques secondes... elle ne bouge toujours pas.^^Les sables la recouvrent rapidement.^"; remove figure; player.weakness = 0; player.orders = EndSuffering; } ]; [ EndSuffering; if (action == ##Take && noun == book) { <>; } if (action ~= ##Wait or ##Look or ##Sleep or ##Wake or ##Inv or ##Examine or ##Search) "Rien d'autre à faire que d'attendre."; player.weakness++; if (player.weakness < 3 || book.saw_blank == false) { return false; } print "La petite silhouette s'extirpe des sables. Elle est morte.^^"; print "@<< Tu as gagné, dit-elle. Okay, c'est à nouveau mon tour. @>>^^"; print ">...^Rien d'autre à faire. Le temps passe.^^"; print "Le soleil grimpe plus haut.^"; deadflag = 2; ]; Object Desert "chez vous" with articles "votre" "votre" "votre", seenonce false, description [; print "Le terrain est presque désert. Des dunes roulent vers le soleil levant ; une petite ombre traîne derrière elles, mais elle disparaîtra bientôt. Le ciel est mat et d'un bleu vide.^"; DescribeParagraph(self); rtrue; ], startup [; StartDaemon(figure); StartDaemon(desstereo); ], before [; Go: "Vous faites les cent pas pendant un moment."; Exit: "Mais le taxi n'est pas encore là !"; Listen: if (noun == 0) { if (desstereo in self) <>; "Vous n'entendez rien. L'hélicoptère est parti depuis bien longtemps."; } Examine: switch (noun) { d_obj: <>; u_obj: <>; } rfalse; ]; Object -> desertsand "sable" with name 'sable' 'sables' 'dune' 'dunes', article "le", description "Ce sable est exactement semblable à tout le sable que vous avez vu dans votre vie.", before [; Search: <>; BlowOn: "Quelques grains de sable s'éloignent en roulant."; Take: "Vous prenez une pincée de sable. Il glisse entre vos doigts."; Push, Pull: "Vous poussez du sable avec votre pied."; Dig: "Vous creusez pendant un moment."; ], has scenery; Object -> desertshade "ombre" with name 'ombre' 'ombres', description "Les ombres rétrécissent à vue d'@oeil. Les dunes ne sont pas grandes ici, et le soleil se lève rapidement.", before [; Search: <>; Examine: rfalse; Enter: "Même en vous allongeant, vous ne pouvez plus vous abriter derrière les dunes."; default: "Ce sont juste des ombres."; ], has female scenery; Object -> desertsky "ciel" with name 'ciel', description "Le ciel est complètement bleu, écrasé par la lumière du soleil.", before [; Search: <>; Examine: rfalse; default: "Vous ne pouvez rien faire avec le ciel."; ], has scenery; Object -> desertsun "soleil" with name 'soleil' 'lumiere', description "De l'hydrogène en fusion. Mortel, inévitable. Blanc, écrasant de chaleur.", before [; Search: <>; Examine: rfalse; default: "Vous ne pouvez rien faire au soleil."; ], has scenery; Object -> figure "petite silhouette" with name 'petite' 'silhouette' 'petit' 'personnage' 'forme' 'humain' 'yeux' 'mouvement', description [; if (self.number) "Vous n'avez toujours pas réussi à la voir clairement."; print "Une petite silhouette humaine"; switch (self.weakness) { 0: print " marche"; 1: print " marche avec peine"; 2: print " titube"; default: print " rampe"; } " sur le sable. Elle n'a pas l'air de vous remarquer."; ], nosubdescribe [; return (self.number ~= 0); ], subdescribe [; print "Une petite silhouette marche sur le sable."; rtrue; ], number desfuton, weakness 0, before [; Find: if (self.number) "Vous ne savez pas vraiment où elle est passée."; "Elle est ici."; Search: if (self.number) "Vous ne savez pas vraiment où elle est."; "Vous essayez de scruter les yeux de la silhouette. Ils sont distants. Ils ne vous voient pas."; Push, Pull, Turn, Lower: if (self.number) "Vous ne savez pas vraiment où elle est."; print "Vous poussez une vague de sable vers la silhouette. Elle trébuche et glisse sous la vague @{2014} vite enfouie. Après quelques secondes, des grains de sable roulent sur le côté, et elle ressort à la surface.^"; Suffer(); rtrue; Touch: if (self.number) "Vous ne savez pas vraiment où elle est."; print "Vous vous agenouillez et passez votre doigt sur le front de la silhouette. Elle secoue la tête, aveugle, puis s'évanouit. Vous la regardez d'un air soucieux mais, quelques instants plus tard, elle se relève avec difficulté.^"; Suffer(); rtrue; Attack: if (self.number) "Vous ne savez pas vraiment où elle est."; print "Vous vous baissez et donnez une gifle vers la petite silhouette. Le coup ne la touche pas, mais il fait tourbillonner un peu de sable ; la silhouette baisse la tête et se protège les yeux du déluge qui la fouette.^"; Suffer(); rtrue; Take, Raise: if (self.number) "Vous ne savez pas vraiment où elle est."; print "Vous formez une coupe de vos mains autour de la silhouette et la levez en l'air @{2014} une forme humaine tombée à genoux dans votre poignée de sable. Vous la regardez ; la lumière du soleil bouillonne dans le chaudron de vos doigts. La silhouette s'aplatit peu à peu. Mais le sable coule entre vos doigts, et la silhouette tombe à terre, d'où elle se relève lentement à nouveau.^"; Suffer(); rtrue; Wave: if (self.number) "Vous ne savez pas vraiment où elle est."; print "Vous tapez du pied. Le sable ondule en silence, et la silhouette trébuche et tombe. Elle se relève vite, et continue de marcher.^"; Suffer(); rtrue; BlowOn: if (self.number) "Vous ne savez pas vraiment où elle est."; print "Vous vous accroupissez et soufflez sur la petite silhouette. Du sable chaud tourbillonne. Après quelques secondes, la silhouette sort en titubant du nuage de sable en se couvrant les yeux.^"; Suffer(); rtrue; Listen: "Vous ne parvenez pas à distinguer de mots."; ], life [; Kiss: if (self.number) "Vous ne savez pas vraiment où elle est."; if (verb_word == 'embrasser') { print "Vous vous agenouillez et portez vos lèvres sur le front de la silhouette. Elle secoue la tête, aveugle, puis s'évanouit. Vous la regardez d'un air soucieux, mais quelques instants plus tard elle se relève avec difficulté.^"; } else { print "Vous entourez doucement la silhouette de votre main pendant un instant. Quand vous relâchez, la silhouette tombe, prostrée, vidée, et desséchée. Elle finit par tressaillir et se remettre debout.^"; } Suffer(); rtrue; Give, Show: if (self.number) "Vous ne savez pas vraiment où elle est."; "La petite silhouette ne semble pas vous voir."; Ask, Tell, Answer, Order: if (self.number) "Vous ne savez pas vraiment où elle est."; print "Pendant que vous parlez, des courants d'air tourbillonnent sur le sable. La silhouette s'agrippe à ses vêtements et continue en chancelant, en vous ignorant.^"; Suffer(); rtrue; ], opentime 0, daemon [ ix; self.opentime++; if (parent(self) == 0) { StopDaemon(self); return; } if (self.number == 0) { if (self.opentime >= random(3)+1) { self.opentime = 0; switch (random(97) % 7) { 0: print "^La silhouette regarde autour d'elle, se protégeant les yeux avec sa main, puis continue dans une direction légèrement différente.^"; 1: print "^La silhouette semble se parler à elle-même.^"; 2: print "^La silhouette semble clamer quelque chose pour elle-même.^"; 3: print "^La silhouette s'arrête, creuse pendant un moment dans le sable, puis continue de marcher.^"; 4: print "^La silhouette s'arrête et regarde autour d'elle un instant, en se protégeant les yeux avec sa main.^"; 5: print "^La silhouette fouille brièvement ses vêtements, puis continue son chemin.^"; 6: print "^La silhouette ferme les yeux pendant quelques secondes.^"; } } return; } if (self.opentime == 2 && random(99) < 60) { print "^Quelque chose bouge sous ", (the) self.number, ".^"; return; } if (self.opentime >= random(3)+2) { ix = ChooseHome(); if (ix ~= self.number) { self.opentime = 0; self.number = ix; print "^Quelque chose détale près de votre pied.^"; } } ], has scenery animate female; ! neuter? Object -> desfuton "canapé" with self_obj futon, parse_name ParseNameRelay, articles "votre" "votre" "votre", subdescribe "Votre canapé est proche.", description [ ix; print "Le canapé est clairement sur la pente douce d'une des dunes. Le cadre est à moitié enfoui et quelques lignes de sable coulent sur les plis des coussins, mais au final c'est toujours le même bon vieux canapé.^"; ix = children(self); if ((player notin self && ix > 0) || ix > 1) { print "^Sur le canapé"; if (player in self) print " à côté de vous"; WriteListFrom(child(self), TERSE_BIT + ENGLISH_BIT + ISARE_BIT + CONCEAL_BIT); print ".^"; } rtrue; ], before [; Enter: print "Vous vous asseyez, et vous êtes assis sur du sable. Le canapé s'est désintégré sans un bruit ou une dernière parole.^"; while (child(self)) { move child(self) to Desert; } DesertGoaled(self); rtrue; LookUnder: DesertCheckUnder(self); rtrue; Pull, Push, Turn: "Vous arrivez à peine à déplacer le canapé sur une surface solide. Contre le sable, aucun espoir."; Dig: "Toujours pas de monnaie."; ], react_before [; Exit: if (player in self) { move player to parent(self); if (keep_silent == 0) { print "Vous vous levez.^"; } rtrue; } ], has supporter enterable transparent scenery; Object -> desstereo "chaîne stéréo" with self_obj stereo, parse_name ParseNameRelay, subdescribe "La chaîne stéréo est appuyée contre une dune.", description [; print "La chaîne stéréo est vieille, datant d'une ère où @<< noir mat @>>, @<< sans relief @>>, @<< opaque @>> étaient les maîtres mots si l'on voulait être branché. Désormais elle est posée sur une pile de sable et semble perdue..."; self.song(); " est en train de passer."; ], before [; LookUnder: DesertCheckUnder(self); rtrue; SwitchOn: "La chaîne stéréo est déjà allumée."; SwitchOff: print "Un reportage brouillé se fait entendre quand vous approchez la main du bouton. @<< Val... de la Mort... randonn... disparus depuis... toujours... espoir, disent... @>>^^... Des nouvelles pas très fraîches. Vous appuyez sur le bouton : clic. La chaîne stéréo devient silencieuse, puis devient blanche, et plonge instantanément dans les sables.^"; DesertGoaled(self); rtrue; Listen: print "La chaîne stéréo joue le morceau "; self.song(); "."; ], opentime 99, number 0, song [; switch (self.number) { 1: print "@<< À la claire fontaine @>>"; 2: print "@<< L'eau vive @>>"; 3: print "@<< La rivière de notre enfance @>>"; 4: print "@<< Quand t'es dans le désert @>>"; 5: print "@<< Écoute-moi @>>"; 6: print "@<< C'est impossible @>>"; 7: print "@<< Tes peurs t'envahissent @>>"; ! *** inventé 8: print "@<< Se venger sur les petits hommes @>>"; ! *** inventé 9: print "@<< Roi du désert @>>"; ! *** inventé 10: print "@<< Je marche seul @>>"; ! *** pas vraiment 11: print "@<< Seul @>>"; 12: print "@<< Marche à l'ombre @>>"; ! *** ou juste ombre } ], daemon [; if (parent(self) == 0) { StopDaemon(self); return; } self.opentime++; if (self.opentime >= random(3)+2) { self.number++; self.opentime = 0; if (self.number > 12) self.number = 12; print "^Clic. La chaîne stéréo joue maintenant "; self.song(); print ".^"; } ], has scenery female; Object -> descomputer "ordinateur" with self_obj computer, parse_name ParseNameRelay, subdescribe "Votre ordinateur est assis d'un air suffisant, de la même couleur que le sable.", description [; if (self.number == 0) "L'introduction du jeu est affichée en haut de l'écran,suivie d'une invite de commandes."; else "Le dernier message du jeu clignote en bas de l'écran."; ], number 0, before [; Search: <>; Play, TypeOn: print "Vous"; if (random(97) < 50) print " posez un genou"; else print " vous accroupissez"; if (random(103) < 66) print " dans le sable"; if (self.number == 0) print " et jouez encore une fois au jeu."; else print ", recommencez, et jouez une fois de plus."; self.number++; switch (self.number) { 2: print " Vous n'arrivez pas plus loin."; 3: print " Une fin différente, cette fois-ci, mais ça revient au même."; 5: print " Vous n'allez pas aller bien loin."; 7: print " Rien ne change, jamais."; 9: print " Vous vous décidez à prendre les choses en main."; 12: print " Vous allez faire payer quelqu'un d'autre pour vos erreurs."; 15: print " Vous avez bien l'intention de changer votre position."; 19: print " Si vous gagnez, vous gagnez seul."; 24: print " Vous aimeriez bien avoir de l'ombre."; 28: self.number = 23; } new_line; rtrue; LookUnder: DesertCheckUnder(self); rtrue; SwitchOn: "L'ordinateur est déjà allumé."; SwitchOff: print "@<< La seule façon de gagner, c'est de ne pas jouer @>> clignote sur l'écran. Vous levez les yeux au ciel. Le plus vieux des mensonges ; personne n'y croit plus depuis longtemps."; print "Vous appuyez sur le bouton d'alimentation ; l'ordinateur laisse échapper un petit soupir et s'effondre.^"; DesertGoaled(self); rtrue; Open: "Ce modèle-là ne peut être ouvert qu'à l'usine."; Smell: "L'ordinateur dégage une odeur de silicium brûlant."; ], has scenery;