! _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. Constant MAXIMPS 12; Array goalimps --> MAXIMPS; Global impcount = 0; Global goalcount = 0; Object goalhandler with initial [; StartDaemon(self); ], imp [; "[BUG] pas d'imp"; ], daemon [ ix jx kx; #ifdef DEBUG; if (debug_flag & 4 ~= 0) { for (ix=0 : ixix, ": imp^"; } } ! not entirely accurate; if an imp calls Goaled(Obj), the object's ! imp will be run that turn also. #endif; for (ix=0 : ixix; if (jx.imp == NULL) kx = -1; else kx = jx.imp(); if (kx == -1) { for (kx=ix : kxkx = goalimps-->(kx+1); } impcount--; ix--; } } ]; [ Goaled obj; if (~~(obj provides prereqs)) { print "[BUG] Goaled(", (name) obj, "): pas de prereqs^"; rfalse; } if (obj has goal_complete) return; goalcount++; give obj goal_complete; if (obj provides imp) { goalimps-->impcount = obj; impcount++; } ]; [ GoalOpen obj addr num ix jx; if (~~(obj provides prereqs)) { print "[BUG] GoalOpen(", (name) obj, "): pas de prereqs^"; rfalse; } if (obj has goal_complete) rfalse; addr = obj.&prereqs; num = (obj.#prereqs) / WORDSIZE; for (ix=0 : ixix; if (jx == true) continue; switch (metaclass(jx)) { Object: if (jx hasnt goal_complete) rfalse; Routine: if (jx() == false) rfalse; default: print_ret "[BUG] GoalOpen(", (name) obj, "): valeur étrange ", jx; } } rtrue; ]; [ GoalClosed obj; return (obj has goal_complete); ]; [ GoalEverOpen obj; if (obj has goal_complete) rtrue; return GoalOpen(obj); ]; [ KillImp obj; if (~~(obj provides imp)) { print_ret "[BUG] KillImp(", (name) obj, "): pas d'imp"; } obj.imp = NULL; ]; #ifdef ZDEBUG; [ GoalsScope obj; if (scope_stage == 1) rfalse; if (scope_stage == 2) { objectloop (obj provides prereqs) { PlaceInScope(obj); } rtrue; } "Ça n'est pas un objectif"; ]; [ GoalListSub obj isopen isclosed any; ! 0: open and closed. 1: all. 2: only open. 3: only closed. objectloop (obj provides prereqs) { isopen = GoalOpen(obj); isclosed = GoalClosed(obj); any = false; if (isopen && noun == 0 or 1 or 2) { any = true; print (name) obj, ": ouvert^"; } if (isclosed && noun == 0 or 1 or 3) { any = true; print (name) obj, ": fermé^"; } if (noun == 1 && (~~any)) { print (name) obj, ": pas encore^"; } } ]; [ ZapOpenGoalSub addr num ix; print "Ouverture de : ", (the) noun, "^"; addr = noun.&prereqs; num = (noun.#prereqs) / WORDSIZE; for (ix=0 : ixix = true; } ]; [ ZapCloseGoalSub; print "Fermeture de :", (the) noun, "^"; Goaled(noun); ]; #endif; ! --- individual goal utilities Object firstgoal with name 'premierbut' 'premier' 'but', prereqs true, number 0, imp [; self.number++; switch (self.number) { 2: print "^En y réfléchissant, comme pour les gueules de bois, le problème est probablement la déshydratation. Votre bouche est comme de la laine sèche.^"; 7: print "^Vous avez toujours soif.^"; 15: print "^Vous vous passez la langue sur vos dents sèches^"; 16: self.number = 3; } ]; Global background_counter = 0; [ BackgroundInfo obj str; if (obj.background_flag) rtrue; obj.background_flag = true; background_counter++; print "^("; if (str) print (string) str, " "; switch (background_counter) { 1: print "C'est, bien sûr, le Om de la Vallée de la Mort @{2014} moitié festival artistique, moitié secte, une semaine au fond du désert où les gens s'exposent, font l'amour, prennent de la drogue, et entretiennent constamment, vingt-quatre heures sur vingt-quatre, le ", (emph) "OM.", " Le sable, la chaleur, et des milliers de gorges. Un espace hors du monde ; avec aucune obligation autre que de joindre le chant, aussi fort que vous puissiez chanter."; 2: print "Rien n'est interdit au Om. @<< La loi s'arrête au niveau de la mer. @>> Quelque part dans le pays, pour une semaine, une communauté se forme par la simple volonté. Pas de contrôle ; juste le désir, et la connaissance de ce que le désert peut faire. Et le Om. Chaque religion chante, vous vous rappelez l'avoir lu."; 3: print "L'expérience est censée vous transformer. Et, honnêtement, vous avez besoin de transformation. Encore un mois comme ça et on ne fera pas la différence entre vous et l'appartement @{2014} beige, sans caractéristiques, et à louer pour pas cher. À l'Om de la Vallée de la Mort, disent-ils, vous avez peut-être des coups de soleil, soif et une grosse fatigue, mais vous êtes vivant. Il n'y a pas mieux. Vous avez prévu d'essayer la randonnée nocturne zen en solitaire."; default: print "[BUG] background info"; } ")"; ]; Object tickets "billets d'avion" with name 'avion' 'billet' 'billets', description [; print "Vos billets aller-retour pour la Californie."; if (~~self.seenonce) { self.seenonce = true; print " Vous les regardez fixement pendant un instant @{2014} perdu dans l'idée du désert."; } new_line; rtrue; ], seenonce false, after [; Take: if (self hasnt general) { give self general; "D'accord. Quelque chose vous gratte la plante du pied quand vous vous penchez pour ramasser les billets."; } ], prereqs water, imp [; StartMotorNoise(); BumpSand(livingsand); return -1; ], has rescuable pluralname; ! general means taken Global ticket_counter = 0; [ CheckTicket obj; if (obj.ticket_search >= 2) { if (obj.ticket_search == 3) "Vous avez beau regarder plusieurs fois, les billets d'avion ne sont pas là."; obj.ticket_search = 3; "Les billets d'avion ne sont toujours pas là."; } obj.ticket_search = 2; ticket_counter++; if (ticket_counter < 3) { " Non, les billets ne sont pas là."; } Goaled(tickets); move tickets to Apartment; print_ret "Non, les billets ne sont @{2014} ", (emph) "A-hah!", " Ils sont là, en fin de compte ! Les billets glissent au sol et restent là, avec un air narquois..."; ]; [ StartMotorNoise; move motornoise to Apartment; StartDaemon(motornoise); ]; [ StopMotorNoise; StopDaemon(motornoise); remove motornoise; ]; Object motornoise "bruits" with name 'bruit' 'bruits' 'helicoptere' 'helico', before [; Listen: "Vous entendez un hélicoptère quelque part, survolant la nuit."; Examine: <>; Find: "Quelque part dehors et plus haut."; default: "Vous ne pouvez qu'entendre l'hélicoptère."; ], number 0, daemon [; self.number++; switch (self.number) { 3: print "^Le bruit d'un hélicoptère vous parvient faiblement à travers la fenêtre fermée.^"; 5: print "^L'hélicoptère se rapproche.^"; 7: print "^Le bruit de l'hélicoptère s'évanouit peu à peu.^"; 10: print "^Vous entendez à peine l'hélicoptère à présent.^"; 11: StopMotorNoise(); } ], has scenery pluralname;