! ~ ~ ~ ~ L i e u x c o m m u n s ~ ~ ~ ~ ! ! une fiction interactive ! ! Copyright (c) 2007 ! ! Licence-type BSD ! Tous droits réservés. ! La redistribution et l'utilisation sous forme binaire ou de code source, ! avec ou sans modification, est autorisée à condition que les conditions suivantes soient respectées: ! ! 1. Les redistributions du code source doivent conserver l'indication de copyright ci-dessus, ! cette liste de conditions et la renonciation suivante. ! 2. Les redistributions sous forme binaire doivent reproduire l'indication de copyright ci-dessus, ! cette liste de conditions et la renonciation suivante dans la documentation et/ou les autres ! accessoires fournis avec la distribution. ! 3. Toutes les publicités mentionnant les caractéristiques ou l'utilisation de ce logiciel doivent ! mentionner la phrase suivante : ! "Ce produit inclus un logiciel et du travail développés par la communauté de la fiction ! interactive francophone (http://ifiction.free.fr/) et internationale, ainsi que par les créateurs ! du système INFORM (http://www.inform-fiction.org)." ! 4. Les noms des créateurs et développeurs ne peuvent être utilisés pour approuver ou promouvoir ! les produits dérivés de ce logiciel sans une permission écrite spécifique préalable. ! CE LOGICIEL EST FOURNI PAR LES TITULAIRES DU COPYRIGHT ET LES PARTICIPANTS "TEL QUEL" ! ET TOUTES LES GARANTIES EXPLICITES OU IMPLICITES, Y COMPRIS, MAIS NON LIMITÉES A CELLES-CI, ! LES GARANTIES IMPLICITES DE COMMERCIALISATION ET D'ADÉQUATION À UN USAGE PARTICULIER SONT DÉNIÉES. ! EN AUCUN CAS LES TITULAIRES DU COPYRIGHT OU LES PARTICIPANTS NE PEUVENT ÊTRE TENUS POUR ! RESPONSABLE DES DOMMAGES DIRECTS, INDIRECTS, FORTUITS, PARTICULIERS, EXEMPLAIRES OU CONSÉCUTIFS ! À UNE ACTION (Y COMPRIS, MAIS NON LIMITÉS À CEUX-CI, L'ACQUISITION DE MARCHANDISES OU DE SERVICES ! DE REMPLACEMENT; LES PERTES D'UTILISATIONS, DE DONNÉES OU FINANCIÈRES; OU L'INTERRUPTION ! D'ACTIVITÉS) DE QUELQUE MANIÈRE QUE CES DOMMAGES SOIENT CAUSÉS ET CECI POUR TOUTES LES THÉORIES ! DE RESPONSABILITÉS, QUE CE SOIT DANS UN CONTRAT, POUR DES RESPONSABILITÉS STRICTES OU DES ! PRÉJUDICES (Y COMPRIS DUS À UNE NEGLIGENCE OU AUTRE CHOSE) SURVENANT DE QUELQUE MANIÈRE QUE CE ! SOIT EN DEHORS DE L'UTILISATION DE CE LOGICIEL, MÊME EN CAS D'AVERTISSEMENT DE LA POSSIBILITÉ ! DE TELS DOMMAGES. ! BSD type licence ! Copyright (c) 2007 ! All rights reserved. ! ! Redistribution and use in source and binary forms, with or without ! modification, are permitted provided that the following conditions ! are met: ! 1. Redistributions of source code must retain the above copyright ! notice, this list of conditions and the following disclaimer. ! 2. Redistributions in binary form must reproduce the above copyright ! notice, this list of conditions and the following disclaimer in the ! documentation and/or other materials provided with the distribution. ! 3. All advertising materials mentioning features or use of this software must display the following acknowledgement: ! "Ce produit inclus un logiciel et du travail développés par la communauté de la fiction interactive francophone (http://ifiction.free.fr/) et internationale, ainsi que par les créateurs du système INFORM (http://www.inform-fiction.org)." ! 4. The name of the author may not be used to endorse or promote products ! derived from this software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR ! IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES ! OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. ! IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, ! INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT ! NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ! DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ! THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ! (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF ! THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. Constant Story "Lieux communs"; Constant Headline "^Une série d'aventures hors du temps.^^Copyright (c) 2007 ifiction.free.fr ^^Veuillez taper 'aide' ou 'options' si c'est la première fois que vous jouez à ce jeu.^^"; Release 4 ; #ifdef DEBUG; message "Cette version est compilée avec les outils de débogage..."; #endif; !-------------------------------------------- ! Variables et constantes !-------------------------------------------- #ifdef TARGET_ZCODE; #ifnot; ! TARGET_GLULX; Constant GG_MAPWIN_ROCK 210; Global gg_mapwin = 0; Global gg_musicchan = 0; Global gg_musicchan2 = 0; Global musicon = 1; Global modesonore = 1; Global musique_actuelle = 0; Global image_actuelle = 0; Global musique_prevue = 0; Global modeimages = 1; ! pour activer les images Global modeppc = 0; ! pour désactiver les images du jeu, et activer une présentation simplifiée pour pocket pc. (TODO) Global sepia = 1; ! pour activer le mode sepia #endif; Global jeucomplet = 1; Global modereplay = 0; Global scene_en_cours = 0; ! 0 pour aucune scène en cours Global scene_31_visitee = false; Global scene_37_visitee = false; Global scene_39_visitee = false; Global scene_86_visitee = false; Global scene_125_visitee = false; Global scene_172_visitee = false; Global scene_190_visitee = false; !-------------------------------------------- ! Parser !-------------------------------------------- Replace Identical; ! pour la gestion des adjectifs Replace UnlockSub; Replace LockSub; Replace RestartSub; Replace AfterGameOver; ! pour remettre à zero l'affichage après un game over Include "Parser"; ! - - - - Score etc -------- !Constant NO_SCORE; !Constant DEATH_MENTION_UNDO; Constant TASKS_PROVIDED; Constant NUMBER_TASKS = 10; Array task_scores -> 4 4 4 4 4 4 4 2 1 1; ! à utiliser avec Achieved(numéro) ; Constant MAX_SCORE = 45; ! TODO a definir à la fin (verifier que cela correspond) Constant OBJECT_SCORE 1; Constant ROOM_SCORE 1; [ PrintRank; print ", me donnant le rang "; if (score >= 35) "de directeur de recherches de l'Université Miskatonic."; if (score >= 25) "d'investigateur confirmé."; if (score >= 10) "d'investigateur débutant."; if (score >= 5) "d'étudiant."; "de touriste."; ]; !-------------------------------------------- ! Attributs et propriétés !-------------------------------------------- Property adjective; ! pour la gestion des adjectifs Attribute lisible; ! pour le verbe lire Attribute feuilletable; ! pour le verbe feuilleter !-------------------------------------------- ! Directives de remplacement !-------------------------------------------- ! (Samuel, inspiré de pname.h) ! Cette fonction est recopiée de parserm.h, avec un ajout pour tenir ! compte de la propriété "adjective." [ Identical o1 o2 p1 p2 n1 n2 i j flag; if (o1 == o2) rtrue; ! This should never happen, but to be on the safe side if (o1 == 0 || o2 == 0) rfalse; ! Similarly if (parent(o1) == compass || parent(o2) == compass) rfalse; ! Saves time ! What complicates things is that o1 or o2 might have a parsing routine, ! so the parser can't know from here whether they are or aren't the same. ! If they have different parsing routines, we simply assume they're ! different. If they have the same routine (which they probably got from ! a class definition) then the decision process is as follows: ! ! the routine is called (with self being o1, not that it matters) ! with noun and second being set to o1 and o2, and action being set ! to the fake action TheSame. If it returns -1, they are found ! identical; if -2, different; and if >=0, then the usual method ! is used instead. if (o1.parse_name ~= 0 || o2.parse_name ~= 0) { if (o1.parse_name ~= o2.parse_name) rfalse; parser_action = ##TheSame; parser_one = o1; parser_two = o2; j = wn; i = RunRoutines(o1,parse_name); wn = j; if (i == -1) rtrue; if (i == -2) rfalse; } ! This is the default algorithm: do they have the same words in their ! "name" (i.e. property no. 1) properties. (Note that the following allows ! for repeated words and words in different orders.) p1 = o1.&1; n1 = (o1.#1)/WORDSIZE; p2 = o2.&1; n2 = (o2.#1)/WORDSIZE; ! for (i=0 : ii, " "; } new_line; ! for (i=0 : ii, " "; } new_line; for (i=0 : ii == p2-->j) flag = 1; if (flag == 0) rfalse; } for (j=0 : ji == p2-->j) flag = 1; if (flag == 0) rfalse; } ! DEBUT MODIFICATION POUR LES ADJECTIFS ! test sur la propriété adjective : ! deux objets qui ont le même "name" mais ! pas le même "adjective" if ((o1 provides adjective) ~= (o2 provides adjective)) rfalse; if (o1 provides adjective && o2 provides adjective) { n1=(o1.#adjective)/WORDSIZE; n2=(o2.#adjective)/WORDSIZE; ! If there are a different number of words in the adjective ! properties, they are distinguishable. if (n1 ~= n2) rfalse; p1=o1.&adjective; p2=o2.&adjective; for (i=0 : ii == p2-->j) flag = 1; if (flag == 0) rfalse; } for (j=0 : ji == p2-->j) flag = 1; if (flag == 0) rfalse; } } ! FIN MODIFICATION POUR LES ADJECTIFS ! print "Which are identical!^"; rtrue; ]; ! (2007-05-06 Samuel) plutôt que de modifier French1PSP.h, nous devrions ! modifier les messages ici même, et laisser la bibliothèque tranquille ! pour ce genre de choses Object LibraryMessages ! Pour remplacer certains messages standard with before [; Search : "Je savais tenir mes mains tranquilles."; Miscellany: if (lm_n == 38) "Hum... J'ai bien peur de ne pas comprendre ce que vous voulez faire."; if (lm_n == 33) "Je ne pouvais pas m'exprimer ainsi, il me fallait reformuler ou décomposer ma phrase."; ]; !-------------------------------------------- ! VerbLib et autres !-------------------------------------------- Include "VerbLib"; Include "Infglk"; #ifdef TARGET_ZCODE; #ifnot; ! TARGET_GLULX; [ InitGlkWindow winrock; switch (winrock) { GG_STATUSWIN_ROCK: rtrue; } rfalse; ]; #endif; ! TARGET_ !-------------------------------------------- !------------------------------------------------------------------------------- ! Routines à appeler dans le code !------------------------------------------------------------------------------- [ ChooseObjects obj code; if (code<2) { if (obj has scenery) return 2; rfalse; } if (action_to_be==##Eat && obj has edible) return 3; if (obj hasnt scenery) return 2; return 1; ]; [Attend; if (modereplay == 0) KeyCharPrimitive(); ]; [Pause; if (modereplay == 0) KeyDelay(40); ]; ! ------ Image Resize ----- #ifdef TARGET_ZCODE; #ifnot; ! TARGET_GLULX; ! retirer le ! pour inclure, j'ai commenté cela pour eviter les erreurs de compilation avec le makefile ! (avec kate sous kde, c'est ctrl + shift + d ! [ gwin_image_draw_auto x y z w a b o; ! o=glk_window_get_rock(x); ! if (o==GW_PERSISTANT_ROCK) o=GW_Persistant_Win; ! if (o has aspected) return gwin_image_draw_aspect(x,y,z,w,a,b); ! else return gwin_image_draw(x,y,z,w,a,b); ! ]; ! [ gwin_image_draw x y z w a b; ! if (GW_Abilities &GWIN_DROK) ! if(y ofclass routine) return rundrawrout(x,y,z,w,a,b); ! else ! return glk_image_draw_scaled(x,y,z,w,a,b); ! ]; ! [ gwin_image_draw_aspect x y z w a b ww hh ii jj; ! if (~~(GW_Abilities &GWIN_DROK)) return; ! if(y ofclass routine) return rundrawrout(x,y,z,w,a,b); ! ! glk_image_get_info(y,gg_arguments, gg_arguments+WORDSIZE); ! ww=gg_arguments-->0; ! hh=gg_arguments-->1; ! ii=(a*100)/ww; ! ii = proportion to scale x ! jj=(b*100)/hh; ! jj = proportion to scale y ! if (ii>jj) ! since horizontal scaling is bigger, ! ! we will scale vertically and pad on the left ! { ! ww=(ww*jj)/100; ! z=z+((a-ww)/2); ! a=ww; ! } ! else if (jj>ii) ! { ! hh=(hh*ii)/100; ! w=w+((b-hh)/2); ! b=hh; ! } ! prepdrawrout(x, y,z,w,a,b); ! return glk_image_draw_scaled(x,y,z,w,a,b); ! ]; ! ! [ gwin_image_drawf x y z w; ! if (GW_Abilities &GWIN_DROK) ! if (y ofclass Routine) return rundrawrout(x,y,z,w); ! else ! return glk_image_draw(x,y,z,w); ! ]; ! [ rundrawrout x y z w a b; ! prepdrawrout(x,y,z,w,a,b); ! return y(); ! ]; ! [ prepdrawrout x y z w a b; ! draw_params-->0=x; ! draw_params-->1=y; ! draw_params-->2=z; ! draw_params-->3=w; ! draw_params-->4=a; ! draw_params-->5=b; ! ! ]; #endif; ! TARGET_ ! ------ Fin Image Resize ----- [Affiche k; #ifdef TARGET_ZCODE; k=0; !pour retirer le warning de compilation #ifnot; ! TARGET_GLULX; if (modeimages == 1 || modeimages == 2 || modeimages == 3) { if (gg_mapwin) {} else { gg_mapwin = glk_window_open(gg_mainwin, (winmethod_Left+winmethod_Fixed),500, wintype_Graphics, GG_MAPWIN_ROCK); } image_actuelle = k; glk_image_draw(gg_mapwin,k, 0, 0); if (sepia == 1) {glk_image_draw(gg_mapwin,100, 0, 0);} ! pour image sepia if (sepia == 2) { glk_image_draw(gg_mapwin,100, 0, 0);! pour image sepia (1x) glk_image_draw(gg_mapwin,101, 0, 0);} ! pour bordure étrange poulpe if (modeimages == 2) {glk_image_draw(gg_mapwin,110, 0, 0) ; glk_image_draw(gg_mapwin,120, 0, 0) ;} ! banniere + sep if (modeimages == 3) {glk_image_draw(gg_mapwin,112, 0, 0) ; glk_image_draw(gg_mapwin,120, 0, 0) ;} ! banniere poulpe + sep } #endif; ! TARGET_ ]; [Affichette k; #ifdef TARGET_ZCODE; k=0; !pour retirer le warning de compilation #ifnot; ! TARGET_GLULX; if (modeimages == 1 || modeimages == 2 || modeimages == 3) { if (gg_mapwin) {} else { gg_mapwin = glk_window_open(gg_mainwin, (winmethod_Left+winmethod_Fixed),500, wintype_Graphics, GG_MAPWIN_ROCK); } glk_image_draw(gg_mapwin,image_actuelle, 0, 0); glk_image_draw(gg_mapwin,k, 0, 0); if (sepia == 1) {glk_image_draw(gg_mapwin,100, 0, 0);} ! pour image sepia if (sepia == 2) {glk_image_draw(gg_mapwin,100, 0, 0); ! pour image sepia glk_image_draw(gg_mapwin,101, 0, 0);} ! pour bordure étrange poulpe if (modeimages == 2) {glk_image_draw(gg_mapwin,110, 0, 0) ; glk_image_draw(gg_mapwin,120, 0, 0) ;} ! banniere + sep if (modeimages == 3) {glk_image_draw(gg_mapwin,112, 0, 0) ; glk_image_draw(gg_mapwin,120, 0, 0) ;} ! banniere poulpe + sep } #endif; ! TARGET_ ]; [Joue k; #ifdef TARGET_ZCODE; k=0; !pour retirer le warning de compilation #ifnot; ! TARGET_GLULX; if (modesonore == 1) { if (gg_musicchan) {} else { gg_musicchan = glk_schannel_create(0); } glk_schannel_play_ext(gg_musicchan, k, 1, 0); } #endif; ! TARGET_ ]; [Musique k; ! pour utiliser la commande musique off #ifdef TARGET_ZCODE; k=0; !pour retirer le warning de compilation #ifnot; ! TARGET_GLULX; if (musicon == 1) { musique_prevue = k ; if (musique_prevue == musique_actuelle) { rtrue ; } if (musique_prevue ~= musique_actuelle) { if (gg_musicchan2 ) { musique_actuelle = k ; } else { gg_musicchan2 = glk_schannel_create(2); musique_actuelle = k ; musique_prevue = k ; } glk_schannel_play_ext(gg_musicchan2, k, 1, 2); musique_actuelle = k ; } } #endif; ! TARGET_ ]; [Nettoie; #ifdef TARGET_ZCODE; ClearScreen(); #ifnot; ! TARGET_GLULX; glk_window_clear(gg_mainwin); #endif; ! TARGET_ ]; #ifdef TARGET_ZCODE; #ifnot; ! TARGET_GLULX; [ IdentifyGlkObject phase type ref rock res id; res = res; id = id; ! <- These are just warning squashers if (phase == 0) { ! Zero out references to our objects. gg_mapwin = 0; gg_musicchan = 0; gg_musicchan2 = 0; } if (phase == 1) { ! Reset our windows, streams and filerefs. switch (type) { 0: switch (rock) { GG_MAPWIN_ROCK: gg_mapwin = ref; } 1: ! stream 2: ! fileref } } if (phase == 2) { ! Update our objects. ! RedrawMapInMapWindow(); ! Or do anything you like... return location.description(); } return; ]; #endif; ! TARGET_ [Gras; ! style Gras #ifdef TARGET_ZCODE; #ifnot; ! TARGET_GLULX; glk_set_style(style_Emphasized); #endif; ! TARGET_ ]; [Italique; ! Italique #ifdef TARGET_ZCODE; #ifnot; ! TARGET_GLULX; glk_set_style(style_Note); #endif; ! TARGET_ ]; [Normal; ! style normal #ifdef TARGET_ZCODE; #ifnot; ! TARGET_GLULX; glk_set_style(style_Normal); #endif; ! TARGET_ ]; !-------------------------------------------- ! Modèles d'objets (déclarations de classes) !-------------------------------------------- Include "classes.inf"; ! fichier de définition des classes, pour segmenter un peu le code ! et éviter d'avoir un fichier cpb.inf de deux kilomètres de long !-------------------------------------------- ! Plan des lieux (pièces, portes...) !-------------------------------------------- ! cf 99 Salem story - the cottage of an aged witch-wherein after her death are found sundry terrible things. Object debut " " class Lieu with name 'debut', description [; #ifdef TARGET_ZCODE; #ifnot; ! TARGET_GLULX; glk_image_draw(gg_mapwin,110, 0, 0) ; glk_image_draw(gg_mapwin,120, 0, 0) ; #endif; ! TARGET_ print "Après avoir cheminé quelques heures dans des territoires pour moi encore relativement familiers, je m'étais retrouvé à continuer cette balade vers un chemin inconnu, sans m'en rendre tout à fait compte à ce moment.^^Je pouvais ainsi poursuivre au "; gras(); print "nord "; normal(); print "et longer la rive d'un fleuve allant vers un océan non répertorié sur les cartes du monde actuel, ou bien aller à l'"; gras(); print "ouest "; normal(); print "pour continuer mon exploration vers d'autres contrées et leurs étranges aventures.^^Il n'était également possible de faire un crochet vers l'"; gras(); print "est "; normal(); print "pour essayer d'obtenir un peu d'"; gras(); print "aide "; normal(); print "là-bas, ou enfin retourner au "; gras(); print "sud "; normal(); print "pour découvrir les autres "; gras(); print "options "; normal(); print "qui m'étaient réservées.^"; ], each_turn[; ], before [; ], n_to rive, w_to [; <> ; ], e_to [; <> ; ], s_to [; <> ; ], cant_go "Je n'avais pas d'autres choix à ce moment de l'aventure.", has scenery; Object rive "Le long de la rivière^" class Lieu with name 'rive' 'rives', scenic_all !éléments sans importance et sans description 'nuee' 'nuees' 'volutes' 'tentacules' 'engoulevent' 'insecte' 'insectes' 'ombre' 'ombres' 'oree' 'houe' 'houes' 'peinture' 'motif' 'motifs' 'sable' 'horizon' 'chemin' 'terre' 'fleur' 'fleurs' 'animal' 'animaux' 0 NULL, scenic_all2 'escalier' 'echelle' 'marche' 'marches' 'roue' 'roues' 'poignee' 'fenetre' 'fenetres' 'vitre' 'vitres' 'toit' 0 "Les éléments de la roulotte ne retenaient pas autant mon attention que ce qui était à l'intérieur.", scenic_look 'flux' 'flot' 'flots' 'eau' 'eaux' 'sombres' 'riviere' 'fleuve' 0 "Alors que regarder l'eau couler avait jusqu'ici toujours eu un effet apaisant sur mon esprit, cette eau-là avait sur moi un effet différent : étrange, presque effrayant." 'couchant' 'soleil' 'crepuscule' 0 "La nuit n'allait pas tarder à tomber." 'arbre' 'arbres' 'bois' 'foret' 'feuille' 'feuilles' 'tronc' 'feuillage' 'feuillages' 0 "Les arbres ne présentaient aucun signe particulier.", scenic_look2 'oiseau' 'oiseaux' 'canard' 'canards' 0 "Ces oiseaux se déplaçaient nonchalamment sur le bord du fleuve, comme engourdis par le crépuscule.", scenic_smell 'fruit' 'fruits' 'murs' 'pourris' 0 "Une odeur suave, sucrée, qui m'aurait presque donné envie d'y goûter." 'mer' 'ocean' 'rumeur' 'saline' 0 "L'odeur de la mer était imprécise, noyée dans les autres odeurs de cet endroit. Etait-ce mon imagination qui me la faisait sentir ?" 'volutes' 'fragrances' 0 "Des odeurs exotiques." , scenic_listen 'flux' 'flot' 'flots' 'eau' 'eaux' 'riviere' 'fleuve' 0 "Le bruit de l'eau qui coule était agréable, mais pas autant que d'habitude." 'chien' 'chiens' 'aboiement' 'aboiements' 'fous' 0 "Les aboiements étaient lointains, mais inquiétants." 'mer' 'ocean' 0 "La mer était trop lointaine pour que je perçoive le bruit des vagues.", scenic_listen2 'oiseau' 'oiseaux' 'canard' 'canards' 0 "Les oiseaux se mouvaient en silence, mais poussaient de temps à autre un petit cri strident.", scenic_touch 'flux' 'flot' 'flots' 'eau' 'eaux' 'riviere' 'fleuve' 0 "Je glissai ma main dans l'eau. Elle était fraiche et agréable, mais quelque chose m'invitait à ne pas m'éterniser. Je la retirai à regret." 'sable' 0 "J'avais trop peur d'en voir sortir un serpent pour oser y promener ma main.", scenic_taste 'fruit' 'fruits' 'murs' 'pourris' 0 "J'avais faim, certes, mais pas au point de manger ces fruits pourris !", description [; if (self.viewed == 0) { self.viewed = 1 ; Affiche(1); Joue(2); print "Voici où nous mènent nos pas, lorsqu'on les confie à nos pensées dérivantes...^^Las d'un voyage dont seules les parts obscures de mon imagination en étaient les étapes, je me trouvai malgré moi loin de tout, sur les rives d'un fleuve charriant des eaux sombres vers un Océan dont la rumeur saline me parvenait indistinctement.^"; } else { Affiche(1); Joue(2); print "Je me trouvais sur les rives d'un fleuve, non loin d'un Océan dont la rumeur saline me parvenait indistinctement.^" ; } if (cabane in rive) { print "^Échouée comme un animal agonisant, une roulotte colorée faisait face à la rive. De l'intérieur montaient des volutes parfumées aux fragrances évocatrices.^"; rtrue ;} ], viewed 0, each_turn[k; k = random(20); switch(k) { 1: "^Les volutes d'un gris plombé des nuées déroulaient lentement leurs tentacules dans le couchant comme une présence de mauvais augure."; 2: "^Le cri lancinant d'un engoulevent chargeait l'atmosphère d'une tension certaine."; 3: "^Dans le crépuscule naissant, les insectes crissaient et chantaient."; 4: "^Le flux velouté du fleuve me plongeait dans un endormissement inquiétant."; 5: "^Le disque du soleil disparaissait sous l'horizon, comme meurt la flamme de votre dernière bougie avant de vous retrouver dans le noir absolu."; 6: "^Les aboiements fous des chiens me firent sursauter, mais ils étaient loin."; 7: "^La brise du soir me caressait comme la main d'une tentatrice aux intentions malicieuses."; 8: "^Plus que jamais, la marque du Destin pesait sur le chemin que j'allais suivre."; 9: "^Les odeurs suaves des fruits mûrs, tombés et pourris, rongés par la vermine, diffusaient leurs entêtantes fragrances."; 10: "^Une vipère se contorsionna sur le sable, avant de rejoindre les flots du fleuve dans sa reptation repoussante."; 11: "^Des ombres inquiétantes se dressaient depuis l'orée des bois tout proches."; } ], before [; Smell : if (~~noun || noun==self) "Nombreuses étaient les odeurs qui m'entouraient : senteurs des fruits trop mûrs, légère rumeur remontant de l'Océan, volutes parfumées montant de la roulotte..."; Listen : if (~~noun || noun==self) "Le son de l'eau qui coule dans le contexte de ce moment n'était pas spécialement relaxant, et des bruits agressifs et stridents d'oiseaux ou d'animaux ne venaient pas adoucir celui du fleuve."; Swim : "Je n'avais pas spécialement envie d'être mouillé."; ], in_to InRoulotte, cant_go "Des ombres furtives, peut-être issues de mon esprit, se dressaient sur mon chemin et me faisaient revenir à nouveau vers les abords de la rivière.", has scenery; Object cabane "roulotte" rive with name 'roulotte' 'cabane' 'wagon' 'maison' 'habitation' 'dedans' 'porte', adjective 'coloree' 'colore' 'bois' 'defraichi' 'defraichie' 'ouverte', description [; Affiche(4); "Sur un chemin oublié gisait un wagon de bois dépourvu de roues, enfoncé dans la terre depuis bien longtemps. Les houes n'avaient pas connu d'attelage depuis des années, et la peinture autrefois de motifs floraux colorés était alors défraîchie, comme le souvenir amer d'un bon temps hélas révolu.^^La porte en était entrouverte, invitant à l'exploration, une exploration probablement hasardeuse, voire dangereuse, mais après tout, j'étais un peu ici pour cela."; ], before [; Enter : PlayerTo(InRoulotte); rtrue ; Smell : "Les odeurs en provenance de la roulotte m'incitaient à y entrer."; Search : print "Je me décidai à monter dans la roulotte afin d'en examiner le contenu.^"; <>; Open : "La porte était déjà entrouverte."; Close : "La porte ne semblait pas pouvoir se fermer complètement, à cause des déformations du bois causées par l'humidité."; ], has female container open enterable scenery; Object InRoulotte "À la croisée des Lieux Communs^" class Lieu with name 'roulotte' 'cabane' 'croisee' 'maison' 'habitation', scenic_all 'mur' 'murs' 'clou' 'porte' 'poussiere' 0 NULL 'bougie' 'bougies' 'cierge' 'cierges' 'carte' 'cartes' 'jeu' 'tarot' 0 "Des ustensiles dédiés à une magie dont je ne voulais rien savoir...", scenic_all2 'vermine' 'humidite' 0 "Il n'était pas bien étonnant de trouver des dégradations naturelles dans un tel endroit." 'chale' 'visage' 'yeux' 'oeil' 'doigt' 'doigts' 'ongles' 0 NULL, scenic_look 'angle' 'angles' 'larges' 'aigus' 'changeants' 0 "Ces angles me semblaient bien louches, mais après tout, il n'allait pas en sortir des monstres ou des animaux fantastiques non ?", description [; Musique(81); Affiche(5); print "Jusqu'au dénouement ultime de mon étrange exploration, je ne pus clairement "; Italique(); print "saisir"; Normal(); print " la réelle nature de cet endroit.^^Ce lieu avait selon toute évidence des proportions plus importantes en son intérieur qu'en son extérieur, mais là n'était pas seulement sa particularité : les "; Italique();print "angles";Normal(); print " de la pièce unique étaient tantôt trop aigus, tantôt trop larges, et parfois même, d'une minute à l'autre, changeants. Une multitude d'artifices mystiques encombraient l'endroit, ainsi que des ouvrages anciens pourris par l'humidité et la vermine.^"; ], in_to "J'étais déjà dans la roulotte.", cant_go "Un sentiment indicible m'invitait à rester plus encore en ce lieu étrange, même si j'avais la trouble impression que je n'y rencontrerais que l'impie et la folie.", out_to [; rfalse;], time_left 3, time_out [; move Sorciere to InRoulotte; if (player in InRoulotte) { sorciere.viewed = 1 ; Joue(200); print "^Soudain, un courant d'air glacial entoura mes chevilles comme le tentacule d'une créature invisible et presque immatérielle, montant le long de mon corps comme un noyé s'agrippant à la grève, et enveloppant mon visage d'un baiser mortel.^"; Attend(); print "^Terrifié, je sentis la "; Italique();print "chose";Normal(); print " s'arracher de moi avec la violence d'une répulsion soudaine, puis errer dans la roulotte, faisant vrombir les bouteilles, tourner les pages et onduler les macabres reliques dans un tintinnabulement léger.^"; Attend(); Affichette(6); print "^Je me retournai soudainement, et m'aperçus le coeur battant qu'une présence froide m'observait, une silhouette de vieille femme recouverte d'oripeaux colorés, et qui, derrière le masque de ses années passées, semblait sourire de mon innocence. ^^Avait-elle été là depuis le début ? Je voulais ignorer la réponse que malgré moi je croyais connaître.^"; ! il est interressant je pense de provoquer une plongée progressive dans le surnaturel, ces dernières questions ! sont posées là pour montrer que le héros souhaite se complaire dans un fantastique qu'il croit imaginer ! donc qu'il maitrise, alors que des forces sont en branle malgré lui, et dont il sera, ultimement, la victime. rtrue ; }; rtrue; ], initial [; jeucomplet = 1; if (sorciere.viewed == 0) { remove Sorciere ; StartTimer(InRoulotte, 2); rtrue ; }; ], has scenery; Object Babioles "babioles" InRoulotte with description [; print "Des ustensiles dédiés à une magie dont je ne voulais rien savoir...^" ; if (pendentif125 has concealed) { give pendentif125 ~concealed ; print "Par contre en explorant un peu plus ces babioles, je trouvai un joli pendentif accroché à un clou sur le mur.^" ; } ], before [; Search: give pendentif125 ~concealed ; print "Je trouvai un joli pendentif accroché à un clou sur le mur.^"; rtrue; Take: "Tout cela ne m'aurait servi à rien." ; ], name 'babioles' 'artifices' 'artifice' 'ustensiles' 'mystiques', has scenery female pluralname ; Object LivresDivers "livres pourris" InRoulotte with description [; print "Ces livres devaient contenir un ancien savoir, ou bien peut-être seulement des recettes de charlatans...^" ; ], before [; Search: if (Livre37 has concealed) { give Livre37 ~concealed ; print "En regardant un peu tous ces livres, l'un d'eux attira plus particulièrement mon attention.^"; rtrue ; } else { print "Je ne trouvai rien d'autre de notable.^" ; rtrue ; } Take: "Tout cela ne m'aurait servi à rien."; ], name 'ouvrages' 'livres', adjective 'anciens' 'pourris', has scenery pluralname ; !-------------------------------------------- ! Le Joueur !-------------------------------------------- Object heros "moi" debut with short_name [; return L__M(##Miscellany, 18);], description "Longtemps j'avais cherché à savoir qui j'étais vraiment.^^Comme tous les autres, j'avais tenté de me fondre dans la société et de me plier à ses normes, et à ses usages, tout en ayant la sourde intuition que dans les franges obscures de mon esprit, j'étais destiné à voir d'autres cieux et contempler des splendeurs indicibles.^^Et je me retrouvais ici, à la recherche de réponses à des questions dont la seule formulation pourrait faire basculer le commun dans la folie.", before [; Attack, Cut : if (actor == player) { "Quelque chose me retenait encore en cette vie, malgré ses angoisses et ses douleurs."; } Tell: "Je ne savais pas quoi dire."; ], after NULL, life NULL, each_turn [; if (colosse172.time_left > 0) { colosse172.positionB = colosse172.positionA ; colosse172.positionA = location ; move colosse172 to colosse172.positionB ; ! TODO A modifier au final pour donner une trajectoire plus intéressante. print "Les pas de la créature faisaient trembler la terre.^" ; } ; ], time_out NULL, describe NULL, capacity 100, parse_name 0, has concealed animate proper transparent; !------------------------------------------------------------------------------- ! PNJ !------------------------------------------------------------------------------- Object Sorciere "Sorcière" class Femme with name 'sorciere' 'vieille' 'femme' 'gitane' 'fantome' 'spectre', viewed 0, description [; Affichette(6); "Oui, penseriez-vous, voici une sorcière gitane comme celle qui vous attend dans le recoin sombre d'une fête foraine, celle qui vous effrayait étant enfant et voici un pauvre niais tremblant qui la dévisageait avec une fascination terrifiée.^^ Mais oubliez cette sorcière de fête et oubliez même la sorcière au nez crochu de vos contes : les couleurs chamarrées du châle qui l'enveloppait comme un linceul étaient flétries par le temps, et quant à son visage, perdu dans les ombres, seuls des angles étranges semblaient en émerger, et pour ses yeux, non pas l'étincelle de la vie, mais deux puits béants vers ce qui est plus que de l'obscurité : le néant, le vide cosmique dont la contemplation rend fou.^^ Des doigts non seulement squelettiques mais blancs comme des os, se terminant par des ongles crochus teintés de rouge, et un halo irisé qui parfois soulignait sa silhouette : non, plus j'osais lever les yeux sur cette silhouette, plus j'en étais certain : la gitane n'avait jamais été vraiment en vie, et jamais vraiment humaine non plus."; ], initial [; Affichette(6); print "Enveloppée par des ombres vivantes, la sorcière attendait, caressant sa boule de cristal.^" ; ], life [ran; Attack: Affichette(6); "Non. J'étais terrifié."; Kiss: Affichette(6); "Franchement, elle n'était pas trop mon style de femme..."; Ask, Tell: Affichette(6); print "Un rire étranglé, éclairé d'un sourire difforme, fut sa seule réponse.^^La voyant pointer son index décharné sur sa boule de cristal, je m'en approchai et discernai dans les brumes diaphanes les contours"; ran = random(3); switch(ran) { 1: print " d'une plage dans la nuit.^"; !2: print "^Elle regarda ensuite vers sa boule, et m'invita à faire de même. J'ai vu alors se matérialiser dans la boule un petit chalet dans un paysage de neige. ^"; ! possibilité de présenter de nouveaux mondes à explorer 2: print " d'un petit chalet dans un paysage de neige. ^"; 3: print " d'une momie dans un musée. ^"; 4: print " d'une cité cyclopéenne perdue dans les profondeurs de l'océan.^"; 5: print " d'une maison abandonnée.^"; 6: print " d'un jardin à la française habité par des créatures étranges.^"; 7: print " d'un désert coloré servant d'écrin à une statue colossale entourée d'un campement singulier.^"; } rtrue ; ], has proper; !-------------------------------------------- ! Routines de remplacement !-------------------------------------------- ! [ DeathMessage; ! if (deadflag == 3) print "Your secret identity has been revealed"; ! if (deadflag == 4) print "You have been SHAMEFULLY defeated"; ! if (deadflag == 5) print "You fly away to SAVE the DAY"; ! ]; ! (Samuel, tiré et amélioré de pname.h) gestion des adjectifs ! et gestion aussi des mots de liaison comme dans "boule DE cristal" ! => de est accepté, ainsi que d'autres mots que l'on peut trouver ! entre deux mots désignant un même objet. [ ParseNoun obj n m p w; w = NextWord(); while((WordInProperty(w,obj,name) == 1) || (WordInProperty(w,obj,adjective) == 1) || (w=='de' or 'du' or 'des' or 'd^' or 'la' or 'le' or 'l^' or 'en' or 'a' or 'au' or 'aux')) { ! remarque : si un mot est à la fois dans name et adjective, il ne sera ! compté qu'une fois, pour la propriété name if (WordInProperty(w,obj,name) == 1) { m++; p=0; } else { if (WordInProperty(w,obj,adjective) == 1) { n++; p=0; } else { ! Si le mot est 'de', 'du', 'des', 'la', 'en', 'a', 'au' ,'aux' : if (w=='de' or 'du' or 'des' or 'd^' or 'la' or 'le' or 'l^' or 'en' or 'a' or 'au' or 'aux') { ! ajouter 1 à la variable p, qui contient le score à retirer ! au final (afin de revenir en arrière en cas d'occurrences qui ne ! sont pas comprises entre deux noms reconnus). n++; ! compter ce mot comme pertinent est discutable, ! mais sans cela cela ne fonctionne pas p++; } } } w = NextWord(); } wn = wn -p -1; ! retour arrière car le dernier mot lu n'a pas été reconnu if (m == 0) return 0; return (m+n-p); ]; [ MyUnknownVerb word; #Ifndef DESACTIVER_IMPERATIF_DPS; ! impératif 2e personne du singulier ! (ne pas le désactiver si vous souhaitez l'indicatif ! à la 1e personne du singulier) if (word=='crie') return 'crier'; if (word=='danse') return 'danser'; if (word=='dechire') return 'dechirer'; if (word=='ecris') return 'ecrire'; if (word=='feuillete') return 'feuilleter'; if (word=='utilise') return 'utiliser'; if (word=='lis') return 'lire'; if (word=='pleure') return 'pleurer'; if (word=='ris') return 'rire'; if (word=='rouvre') return 'rouvrir'; #Endif; #Ifndef DESACTIVER_IMPERATIF_DPP; ! impératif 2e personne du pluriel if (word=='criez') return 'crier'; if (word=='dansez') return 'danser'; if (word=='dechirez') return 'dechirer'; if (word=='ecrivez') return 'ecrire'; if (word=='feuilletez') return 'feuilleter'; if (word=='utilisez') return 'utiliser'; if (word=='lisez') return 'lire'; if (word=='pleurez') return 'pleurer'; if (word=='riez') return 'rire'; if (word=='rouvrez') return 'rouvrir'; #Endif; #Ifndef DESACTIVER_INDICATIF_PPS; ! présent de l'indicatif 1e personne du singulier ! (nécessite l'impératif, 2e personne du singulier) if (word=='vais') return 'aller'; ! exception #Endif; #Ifndef DESACTIVER_IMPERATIF_PPP; ! impératif 1e personne du pluriel ! (identique à l'indicatif 1e personne du pluriel) if (word=='crions') return 'crier'; if (word=='dansons') return 'danser'; if (word=='dechirons') return 'dechirer'; if (word=='ecrivons') return 'ecrire'; if (word=='feuilletons') return 'feuilleter'; if (word=='utilisons') return 'utiliser'; if (word=='lisons') return 'lire'; if (word=='pleurons') return 'pleurer'; if (word=='rions') return 'rire'; if (word=='rouvrons') return 'rouvrir'; #Endif; return false; ]; !------------------------------------------------------------------------------- ! Core !------------------------------------------------------------------------------- [Initialise; !location=rive; !ClearScreen(); Nettoie(); ! appel pour eviter warning de compilation Gras(); ! appel pour eviter warning de compilation Italique(); ! appel pour eviter warning de compilation Normal(); ! appel pour eviter warning de compilation ! deplacement des objets move Galet39 to Tiroir; move GlobeNeige31 to Table; move CartePostale190 to Livre37; move Sablier172 to Tiroir; lookmode = 2; ChangePlayer(heros); !< options >; ! ne pas utiliser ici #ifdef TARGET_ZCODE; #ifnot; ! TARGET_GLULX; if (modeppc == 1) { modeimages = 0 ; glk_window_clear(gg_mainwin); ! glk_image_draw(gg_mainwin,3,0,0); glk_image_draw(gg_mainwin,111,0,0); attend(); glk_window_clear(gg_mainwin); gg_mapwin = glk_window_open(gg_mainwin, (winmethod_Left+winmethod_Fixed),0, wintype_Graphics, GG_MAPWIN_ROCK); } if (modeimages == 1) { glk_window_clear(gg_mainwin); glk_image_draw(gg_mainwin,3,0,0); !gwin_image_draw_auto(13,13,13,gg_mainwin,3,3,3); attend(); glk_window_clear(gg_mainwin); gg_mapwin = glk_window_open(gg_mainwin, (winmethod_Left+winmethod_Fixed),500, wintype_Graphics, GG_MAPWIN_ROCK); } #endif; ! TARGET_ ]; !-------------------------------------------- ! Les différentes scènes du jeu !-------------------------------------------- ! ! LIEUX / objet déclencheur / Objet à rapporter / Objet alternatif ! ------------------------------------------------------------------------------------------ Include "scene39.inf" ; ! PLAGE / Galet39 (1) / +ocarina39(4) / idole(1) Include "scene31.inf" ; ! CHALET / GlobeNeige31 (1) / +Statuette31(4) / rien ? Include "scene190.inf"; ! MUSÉE / CartePostale190 (1) / +Bandelette190 (4) / rien Include "scene125.inf"; ! OCEAN / pendentif125 / +pendentif125 de corail (4) / rien Include "scene86.inf" ; ! MAISON / ourson86 (1) / +couteau86b (4) / livre(*) Include "scene37.inf" ; ! JARDIN / Livre37 (1) / flute (4) (on rapporte rien?)/ rien ? Include "scene172.inf"; ! DESERT / Sablier172 (1) / +Chaine172 (4) (chaine) / sablier (1) Include "fin.inf"; ! score : 1 point pour objet déclencheur ; 1 ou 2 points obj alternatif ; 4 points pour obj à rapporter. ! 0 = plage 1 = chalet ; 2 = bandelette ; 3 = pend corail ; ! 4 = couteau2 ; 5 = jardin flute ;6 = chaine172 ! ! + 1 pour torche31 fabriquee; ! + 1 pour cristal31 (-1 si on le casse ou perd) ; ! + 1 pour piloter sous-marin ; ! + 1 pour portes musicales? ! Max = 40 Object Boule "boule de cristal" InRoulotte with number 0, parse_name [ i ; self.number = 0; while (true) { switch (NextWord()) { 'boule', 'cristal': self.number = 0; i++; 'de', 'la', 'sorciere' : if (i>0 && self.number==0) i++; ! x boule DE cristal, x boule DE LA SORCIERE 'avenir' : self.number = 1; i++; 'nuit', 'plage', 'neige', 'chalet', 'momie', 'musee', 'cite', 'cyclopeenne', 'ocean', 'maison', 'abandonnee', 'jardin', 'creatures', 'etranges', 'desert', 'colore', 'statue', 'colossale', 'campement' : self.number = 2; i++; default: return (i); } } ], description [; Look, Examine : Affichette(7); switch (self.number) { !0: "Une boule de cristal mystérieuse."; 0: if (Sorciere notin location) "Une boule transparente, animée d'ombres tantôt irisées et tantôt diaphanes.^^Pourrais-je y voir mon avenir ?" ; else "Une boule transparente, pas plus grande que le crâne d'un enfant. Je me demandai alors pourquoi je pensais à un crâne d'enfant en regardant cet objet animé d'ombres tantôt irisées et tantôt diaphanes : probablement la tendresse morbide avec laquelle la gitane le caressait ; et dans la fascination qu'elle exerçait sur l'esprit, on eût pu lui deviner une puissance tentatrice et diabolique remontant aux mythes primordiaux du Mal.^^Pourrais-je y voir mon avenir ?"; !1: "Je n'avais malheureusement pas le talent pour prédire cela. Mais avec le recul, et la clairvoyance que donnait l'écoulement du temps sur mon propre passé, je me suis rendu compte que c'était parfois mieux de rester dans l'ignorance."; 1: "Avec la clairvoyance que donne l'écoulement du temps sur son propre passé, j'avais réalisé que les hommes vivaient sur de placides ilots d'ignorance, pour leur bonheur éphémère."; 2: "Ces lieux et ces objets apparurent furtivement dans la boule de cristal, mais je ne pus les contempler bien longtemps, la sorcière faisant continuellement de grands gestes maniérés dans le but d'éloigner ma concentration de la boule, ou peut-être de m'hypnotiser... ^Peut-être était-il possible de les rejoindre malgré tout, en trouvant un agent réactif plus puissant que cette boule ?"; !3: Demarrer31(); !4: Demarrer190(); } default: "Des objets du décor."; ], before [; ! [; Touch: print "Cela restait insaisissable."; rtrue ; ], Touch, Take: "Sous mes doigts le matériau de l'artefact se tiédit et réagit, et même frissonna comme un animal étrange, et cette pensée dérangeante me fit retirer bien vite ma main."; Search, Consult : <>; ], has female ; Object Armoire "armoire" InRoulotte with description "Une armoire en bois à moitié pourri. Elle n'avait plus de portes, et les rayonnages intérieurs étaient presque tous cassés.", before [; Open,Close: "Il n'y avait plus de porte sur cette armoire."; LookUnder: if (Ourson86 has concealed) { print "Je trouvai un ourson en peluche sous ce meuble.^" ; give Ourson86 ~concealed ; rtrue ; } Search: print "Je ne trouvai rien dedans, par contre j'en profitai pour regarder également sous l'armoire.^"; <> ; ], name 'armoire' 'meuble', has static female; Object Table "table" InRoulotte with description [; give GlobeNeige31 ~concealed ; give Tiroir ~concealed ; print "Une table réalisée dans un bois fruitier. Elle possèdait un unique tiroir, et divers bibelots, du même genre que ce que l'on pouvait trouver dans le reste de ce lieu, étaient posés dessus.^" ; if (GlobeNeige31 in self) { print "Un globe à neige en verre attira particulièrement mon attention.^" ; } ], before [; Search: print "Le bois de cette table était bien marqué par les années.^"; give Tiroir ~concealed ; rtrue; Open: <> ; ], name 'table' 'bibelots', has supporter static female ; Object Tiroir "tiroir" InRoulotte with description "Un tiroir destiné à contenir de petits objets.", name 'tiroir', adjective 'table', before [; Take: "Je n'aurais rien fait avec un tiroir dans les mains."; Search: << open tiroir >> ; Open: give Table open ; give self ~concealed ; rfalse ; ! print "J'ouvris le tiroir.^" ; ], has container concealed openable ~open; ! ============== ! Fonctions pour le jeu ! ============== [StopperScene lascene init_tout; switch (lascene) { '31' : Stopper31(init_tout); ! '37' : Stopper37(init_tout); '39' : Stopper39(init_tout); '86' : Stopper86(init_tout); '125' : Stopper125(init_tout); ! '172' : Stopper172(init_tout); '190' : Stopper190(init_tout); } rtrue; ]; [Perdu silencieux; if (jeucomplet == 0) { Attend(); deadflag=1; print "^Je terminai mon aventure ici." ; ! #ifdef TARGET_ZCODE; ! #ifnot; ! TARGET_GLULX; ! if (modeimages == 1) ! { glk_window_close(gg_mapwin,0);} ! #endif; ! TARGET_ rtrue ; } else { StopperScene(scene_en_cours, true); ! stopper scene et joueur perd objets gagnes scene_en_cours = 0; Attend(); if (~~silencieux) { print "^Soudain, la scène parut se dissoudre, et je retrouvai ce lieu qui commençait à m'être familier : j'étais de retour dans la roulotte.^"; Attend(); } PlayerTo(InRoulotte); rtrue ; } ]; [Gagne silencieux; if (jeucomplet == 0) { Attend(); deadflag=2; print " ^J'avais terminé cette partie." ; rtrue ; } else { StopperScene(scene_en_cours, false); ! stopper scene mais joueur garde objets gagnes scene_en_cours = 0; Attend(); if (~~silencieux) { print "^Soudain, la scène parut se dissoudre, et je retrouvai ce lieu qui commençait à m'être familier : j'étais de retour dans la roulotte.^"; Attend(); } PlayerTo(InRoulotte) ; rtrue ; } ]; [reinitialise_scenes; !Initialise() ; ! ne pas ajouter ici, sinon cela pose pb ensuite... jeucomplet = 0 ; turns = 0; StopTimer(colosse172); give Piece172 ~visited; give Piece172 ~visited; Piece172.viewed=0; Piece37aileD.viewed = 0; Piece37jardinetG.viewed = 0; Piece37aileD.viewed=0; Piece37jardinetG.viewed=0; Piece37rotonde.viewed=0; Stopper125(true); Stopper190(true); Stopper86(true); Stopper39(true); Stopper31(true); ]; [DeplacerObjetsPortails x; objectloop(x ofclass ObjetPortail) { x.eviter_perte(); ! éviter que le joueur ne perde l'objet dans une scène } ]; ! ========= Les menus du jeu ===================== Include "menus.inf"; ! --------------------Extension "scenic5sens.h"----------------------- ! Cette extension permet d'ajouter aux lieux des attributs "scenic_xxx" ! contenant des descriptions pour les objets du décor pour lesquels ! la création d'un objet n'est pas indispensable. Global ScenicFlag = 4; Constant ScenicErrorOther = "Je n'y voyais aucune utilité."; Constant ScenicErrorLook = NULL; ! utiliser le message par défaut Miscellany 39 Constant ScenicErrorSmell = NULL; ! utiliser le message par défaut pour "Smell" Constant ScenicErrorListen = NULL; ! utiliser le message par défaut pour "Listen" Constant ScenicErrorTouch = "Je n'y voyais aucune utilité."; Constant ScenicErrorTaste = NULL; ! utiliser le message par défaut pour "Taste" Include "scenic5sens"; ! --------------------------------------------------------------- Include "FrenchG1PSP.h"; ! ----------- Ajouts de verbes ------------------- Include "verbes.inf"; ! fichier de définition des verbes, pour segmenter un peu le code ! et éviter d'avoir un fichier cpb.inf de deux kilomètres de long ! TODO / TOCHECK pb removing pot de fleur brisé / pelle à chaque action ! MoveFloatingObjects();