$C+
' ON BREAK GOSUB verif
' ramdisk!=TRUE
'
RESERVE FRE(0)+MALLOC(-1)-170000        !cad reserver 170000 octets de buffers
'
init
musique
init2
main
'
PROCEDURE xx
  IF FRE(0)<fff
    fff=FRE(0)
  ENDIF
  IF MALLOC(-1)<mmm
    mmm=MALLOC(-1)
  ENDIF
RETURN
'
PROCEDURE main
  '
  LOCAL image$                   !BLOC GRAPHIQUE DE LA DERNIERE IMAGE DE L'OBJET
  '
  DO                                                        !ON BOUCLE A PERPET'
    teste_fin                                      !TOUS LES TEXTES SONT-IL LUS?
    demande_objet                                        !QUEL OBJET EST CHOISI?
    REPEAT
      ~FRE(0)                                !NETTOYAGE PRIODIQUE DE LA MEMOIRE
      demande_peche                                      !QUEL PECHE EST CHOISI?
      IF fin_demande_peche!=FALSE                          !SI ON NE SORT PAS...
        recherche_references                     !ON CHERCHE LE TEXTE A AFFICHER
        '      affiche_image                         !ON AFFICHE L'IMAGE CORRESPONDANTE
        REPEAT                                                    !ON BOUCLE....
          affiche_image
          cree_fenetre(objet%,paragraphe%)         !ON OUVRE LA FENETRE DE TEXTE
          pre_scrolling                                    !ON GERE LE SCROLLING
          IF suite!=TRUE                               !UN AUTRE TEXTE A SUIVRE?
            INC paragraphe%                            !OUI, ON PASSE AU SUIVANT
          ENDIF
        UNTIL suite!=FALSE                                        !SINON ON SORT
      ENDIF
    UNTIL fin_demande_peche!=TRUE               !JUSQU'A CE QU'ON CHANGE D'OBJET
  LOOP
  '
RETURN
'
PROCEDURE vigil(max_x%,max_y%,max_xx%,max_yy%,sauvegarde!)
  '
  REPEAT                                      !ON ATTEND QU'ON RELACHE LA SOURIS
  UNTIL NOT MOUSEK
  '
  IF ramdisk!=TRUE
    PRINT AT(1,1);"malloc ";MALLOC(-1)'"fre ";FRE(0)''''
  ENDIF
  '
  REPEAT                                       !ET ON ATTEND UN EVENEMENT SOURIS
    IF MOUSEX>max_xx%                          !ET ON L'EMPECHE DE SORTIR DU
      SETMOUSE max_xx%,MOUSEY                  !CADRE FIXE
    ELSE IF MOUSEX<max_x%
      SETMOUSE max_x%,MOUSEY
    ELSE IF MOUSEY>max_yy%
      SETMOUSE MOUSEX,max_yy%
    ELSE IF MOUSEY<max_y%
      SETMOUSE MOUSEX,max_y%
    ENDIF
    SHOWM
    '
    IF sauvegarde!=TRUE AND ASC(INKEY$)=27    !SI LA SAUVEGARDE EST PERMISE...
      sauvegarde                              !ON LA FAIT EN TAPANT "ESC"
    ENDIF
    '
  UNTIL MOUSEK
  '
  souris_x%=MOUSEX                     !ON MEMORISE LES COORDONNES DE LA SOURIS
  souris_y%=MOUSEY
  souris_bouton%=MOUSEK                              !AINSI QUE L'ETAT DU BOUTON
  HIDEM                                        !ON REFAIT DISPARAITRE LE CURSEUR
  '
RETURN
'
PROCEDURE teste_fin
  '
  IF paragraphes_lus%=pointeur_paragraphes%-1
    the_end
  ENDIF
  '
RETURN
'
PROCEDURE demande_objet
  ARRAYFILL icone_objets!(),FALSE          !RAZ DE CHAQUE INDICATEUR D'AFFICHAGE
  '
  FOR i%=1 TO pointeur_paragraphes%     !ON VOIT S'IL RESTE QUELQUE CHOSE A LIRE
    '
    '      ON BASCULE LES INDICATEURS S'IL RESTE DES TEXTES CORESPONDANT A CETTE
    '                                   REFERENCE (SAUF "8"=INDICATEUR DE SUITE)
    IF reference_peche%(i%)<>8 AND paragraphe_lu!(i%)=FALSE
      IF indicateur!(indicateur_paragraphes_prealables%(i%))=TRUE
        icone_objets!(reference_objet%(i%))=TRUE
      ENDIF
    ENDIF
  NEXT i%
  '
  hide_screen2                                    !ON MASQUE PUDIQUEMENT L'ECRAN
  CLS
  palette(palette_bureau$)
  SPUT bureau$                                             !AFFICHAGE DU FOND
  FOR i%=1 TO nombre_objets%                     !AFFICHAGE DE L'ICONE DE CHAQUE
    IF icone_objets!(i%)=TRUE               !OBJET OU IL RESTE DES TEXTES A LIRE
      PUT objet_x%(i%),objet_y%(i%),icone_objets$(i%)
    ENDIF
  NEXT i%
  show_screen2                              !ON REAFFICHE L'ECRAN D'UN SEUL COUP
  '
  CLR objet%                            !RAZ DU NUMERO DE L'ICONE OBJET DESIGNEE
  REPEAT                      !ON SCANNE LA SOURIS POUR DESIGNER UNE ICONE OBJET
    vigil(0,0,319,160,TRUE)
    FOR i%=1 TO nombre_objets%       !L'ENDROIT CLIQUE CORRESPOND A UNE ICONE???
      IF icone_objets!(i%)=TRUE             !(SEULEMENT SI CELLE-CI EST ALLUME)
        IF souris_x%>=objet_x%(i%) AND souris_x%<=objet_xx%(i%) AND souris_y%>=objet_y%(i%) AND souris_y%<=objet_yy%(i%) AND souris_bouton%=1
          objet%=i%                               !OK? ON MEMORISE SON NUMERO...
        ENDIF
      ENDIF
    NEXT i%
  UNTIL objet%<>0     !ON CONTINUE JUSQU'A TEMPS QUE LA SOURIS DESIGNE UNE ICONE
  '
RETURN
'
PROCEDURE demande_peche
  '
  ARRAYFILL icone_peches!(),FALSE          !RAZ DE CHAQUE INDICATEUR D'AFFICHAGE
  '
  FOR i%=1 TO pointeur_paragraphes%    !ON VOIT QUELS SONT LES ICONES PECHE QUE
    IF reference_objet%(i%)=objet% AND paragraphe_lu!(i%)=FALSE !L'ON PEUT AFFICHER (SELON LES TEXTES A LIRE)
      IF indicateur!(indicateur_paragraphes_prealables%(i%))=TRUE
        icone_peches!(reference_peche%(i%))=TRUE
      ENDIF
    ENDIF
  NEXT i%
  '
  hide_screen2                                                 !ON CACHE L'ECRAN
  palette(palette_bureau$)
  SPUT bureau$ !ON REAFFICHE LE FOND DU BUREAU ET L'ICONE OBJET DEJA DESIGNEE
  PUT objet_x%(objet%),objet_y%(objet%),icone_objets$(objet%)
  '
  fin_demande_peche!=TRUE
  FOR i%=1 TO nombre_peches%                   !AFFICHAGE DES ICONES OU IL RESTE
    IF icone_peches!(i%)=TRUE                                 !DES TEXTES A LIRE
      PUT peche_x%(i%),peche_y%(i%),icone_peches$(i%)
      fin_demande_peche!=FALSE       !OK,IL RESTE ENCORE QUELQUE CHOSE A LIRE...
    ENDIF
  NEXT i%
  '
  show_screen2                              !ON REAFFICHE L'ECRAN D'UN SEUL COUP
  '
  IF fin_demande_peche!=FALSE                !SI DES ICONES ONT ETE AFFICHEES...
    REPEAT                                !ON ATTEND QU'ON AIT RELACHE LA SOURIS
    UNTIL MOUSEK=0
    CLR peche%                                  !RAZ DU NUMERO DE L'ICONE CLIQEE
    REPEAT
      vigil(0,162,319,199,FALSE) !ON SCANNE LA SOURIS POUR DESIGNER UNE ICONE PECHE
      FOR i%=1 TO nombre_peches%    !ET ON VOIT SI L'ENDROIT CLIQUE CORRESPOND A
        IF icone_peches!(i%)=TRUE                             !UNE ICONE ALLUME
          IF souris_x%>=peche_x%(i%) AND souris_x%<=peche_xx%(i%) AND souris_y%>=peche_y%(i%) AND souris_y%<=peche_yy%(i%) AND souris_bouton%=1
            peche%=i%
          ENDIF
        ENDIF
      NEXT i%
    UNTIL peche%<>0 OR souris_bouton%=2        !ON SORT SI UNE ICONE EST CLIQUE
  ENDIF                      !OU SI ON A APPUY SUR LE BOUTON DROIT DE LA SOURIS
  '
  IF peche%=0
    fin_demande_peche!=TRUE   !ON BASCULE L'INDICATEUR DE SORTIE SI BOUTON DROIT
  ENDIF
  '
RETURN
'
PROCEDURE recherche_references
  '
  CLR i%
  REPEAT        !ON CHERCHE DANS LA LISTE DES TEXTES LE PREMIER QUI CORRESPOND A
    INC i%     !L'OBJET ET AU PECHE CHOISI (SI LES INDICATEURS DU TEXTE SONT OK)
  UNTIL objet%=reference_objet%(i%) AND peche%=reference_peche%(i%) AND indicateur!(indicateur_paragraphes_prealables%(i%))=TRUE AND paragraphe_lu!(i%)=FALSE
  '
  IF i%>pointeur_paragraphes%                              !SI RIEN N'EST TROUVE
    the_end                                               !ON ARRETE TOUT (????)
  ENDIF
  '
  paragraphe%=i%                                !SINON C'EST CE TEXTE QU'ON LIRA
  '
RETURN
'
PROCEDURE affiche_image
  IF ancien_objet%=objet%                !SI L'OBJET CHOISI EST LE MEME QU'AVANT
    palette(palette_image$)
    SPUT image$                                !PAS BESOIN DE RECHARGER L'IMAGE!
  ELSE                                           !SINON ON LA CHARGE NORMALEMENT
    ancien_objet%=objet%                  !ON REACTUALISE LE DERNIER OBJET VU...
    fichier$="IMAGES\"+RIGHT$("0"+STR$(objet%),2)+".pi1"
    ramdisk
    ice_load(fichier$)                           !ON CHARGE L'IMAGE...
    ice_disp(adresse_image%)                     !ON L'AFFICHE...
    palette_image$=palette$                      !ON MEMORISE LA PALETTE
    palette(palette$)                            !ON MET LA PALETTE...
    SGET image$                        !ET ON LA CAPTURE POUR LA PROCHAINE FOIS
  ENDIF
  '
RETURN
'
PROCEDURE sauvegarde
  '
  LOCAL a$,b$,fichier$
  CLR a$,b$
  CLS
  '
  FOR i%=1 TO pointeur_indicateurs%           !ON RASSEMBLE TOUS LES INDICATEURS
    IF indicateur!(i%)=FALSE                !DANS UNE SEULE CHAINE DE CARACTERES
      a$=a$+"0"
    ELSE
      a$=a$+"1"
    ENDIF
  NEXT i%
  '
  FOR i%=1 TO pointeur_paragraphes%
    IF paragraphe_lu!(i%)=FALSE
      b$=b$+"A"
    ELSE
      b$=b$+"B"
    ENDIF
  NEXT i%
  '
  fichier$="textes\page.sav"
  OPEN "o",#1,fichier$
  PRINT #1;a$
  PRINT #1;b$
  CLOSE
  fin
  '
RETURN
'
PROCEDURE chargement
  '
  LOCAL a$,b$,fichier$
  '
  CLR paragraphes_lus%
  '
  fichier$="textes\page.sav"
  IF EXIST(fichier$)
    OPEN "i",#1,fichier$
    INPUT #1;a$
    INPUT #1;b$
    CLOSE
    KILL fichier$
    '
    FOR i%=1 TO pointeur_indicateurs%
      IF MID$(a$,i%,1)="0"
        indicateur!(i%)=FALSE
      ELSE
        indicateur!(i%)=TRUE
      ENDIF
    NEXT i%
    '
    FOR i%=1 TO pointeur_paragraphes%
      IF MID$(b$,i%,1)="A"
        paragraphe_lu!(i%)=FALSE
      ELSE
        paragraphe_lu!(i%)=TRUE
        INC paragraphes_lus%
      ENDIF
    NEXT i%
  ENDIF
  '
RETURN
'
PROCEDURE the_end
  CLS
  fichier$="textes\page.sav"
  IF EXIST(fichier$)
    KILL "fichier$)"
  ENDIF
  cree_fenetre(9,pointeur_paragraphes%)
  pre_scrolling
  CLS
  DO
  LOOP
RETURN
'
PROCEDURE pre_scrolling
  ' reference_objet%(paragraphe%)=0          !ON DETRUIT LES REFERENCES DU TEXTE
  '  reference_peche%(paragraphe%)=0         !(POUR NE PAS LE LIRE DEUX FOIS...)
  paragraphe_lu!(paragraphe%)=TRUE
  '
  INC paragraphes_lus%                                     !UN TEXTE LUS DE PLUS
  '
  '                      ON BASCULE L'INDICATEUR "=" (VOIR LE TEXTE ORIGINAL...)
  indicateur!(indicateur_paragraphes%(paragraphe%))=TRUE
  '                             LE TEXTE APPELLE T'IL UNE SUITE AUTOMATIQUEMENT?
  IF UPPER$(indicateur$(indicateur_paragraphes%(paragraphe%)))="SUITE"
    suite!=TRUE
  ELSE
    suite!=FALSE
  ENDIF
  '
  scrolling
RETURN
'
PROCEDURE scrolling
  LOCAL a$,mouvement%,souris_motif%
  '
  moyenne%=(y%+yy%)/2
  moyenne1%=(y%+y%+yy%)/3
  moyenne2%=(y%+yy%+yy%)/3
  HIDEM
  SETMOUSE (x%+xx%)/2,moyenne%
  SHOWM
  '
  DO
    REPEAT
      souris_y%=MOUSEY
      souris_bouton%=MOUSEK
      '
      IF MOUSEX>xx%
        SETMOUSE xx%,MOUSEY
      ELSE IF MOUSEX<x%
        SETMOUSE x%,MOUSEY
      ELSE IF MOUSEY>yy%
        SETMOUSE MOUSEX,yy%
      ELSE IF MOUSEY<y%
        SETMOUSE MOUSEX,y%
      ENDIF
      '
      souris_y%=MOUSEY
      '
    UNTIL souris_bouton%
    '
    EXIT IF souris_bouton%>1
    '
    IF souris_y%>moyenne2%
      mouvement%=souris_y%-moyenne2%
    ELSE IF souris_y%>moyenne%
      mouvement%=1
    ELSE IF souris_y%<moyenne1%
      mouvement%=souris_y%-moyenne1%
    ELSE IF souris_y%<moyenne%
      mouvement%=-1
    ENDIF
    '
    '
    '
    '                     !on fait "monter" le texte
    IF mouvement%>0 AND premiere_ligne%+max_lignes%<=nombre_lignes%
      IF premiere_ligne%+max_lignes%+mouvement%>=nombre_lignes% OR mouvement%=0
        mouvement%=1
      ENDIF
      '
      hide_screen2
      GET x%+10,y%+2+mouvement%,xx%-8,yy%-2,a$  !on capture le bloc
      PUT x%+10,y%+2,a$                         !qu'on d‚cale vers le haut
      FOR i%=1 TO mouvement%                    !puis on remplit la partie vide
        display_text(premiere_ligne%+max_lignes%+i%-1,yy%-2-mouvement%+i%)
      NEXT i%
      show_screen2
      ADD premiere_ligne%,mouvement%       !on update le pointeur
    ENDIF
    '
    '
    '                     !on fait "descendre le texte"
    IF mouvement%<0 AND premiere_ligne%>1
      IF premiere_ligne%+mouvement%<=0
        mouvement%=-1
      ENDIF
      '
      hide_screen2
      '
      GET x%+10,y%+2,xx%-8,yy%-2+mouvement%,a$
      PUT x%+10,y%+2-mouvement%,a$
      ADD premiere_ligne%,mouvement%       !on update le pointeur
      FOR i%=-1 DOWNTO mouvement%           !puis on remplit la partie vide
        display_text(premiere_ligne%-i%-1,y%+1-i%)
      NEXT i%
      show_screen2
      '
    ENDIF
  LOOP
  '
  '
RETURN
'
PROCEDURE verif
  '
  CLS
  FOR i%=1 TO pointeur_indicateurs%
    PRINT indicateur$(i%);TAB(22);indicateur!(i%)
  NEXT i%
  ~INP(2)
  '
  CLS
  FOR i%=1 TO pointeur_paragraphes%
    PRINT paragraphe_lu!(i%);
  NEXT i%
  ~INP(2)
  '
  CLS
  PRINT paragraphes_lus%,pointeur_paragraphes%
  ~INP(2)
  fin
RETURN
'
PROCEDURE init
  CLS                     !ON EFFACE L'ECRAN (INDISPENSABLE POUR LE COMPILATEUR)
  init_resolution                   !ON TESTE SI ON EST EN MOYENNE RESOLUTION...
  mouse_off                                             !ON DECONNECTE LA SOURIS
  init_routines                              !ON CHARGE LES ROUTINES SON ET TINY
  xb2%=XBIOS(2)            !ADRESSE INVARIABLE DE L'ECRAN (POUR LE SCROLLING...)
RETURN
'
PROCEDURE init2
  init_objets
  init_peches
  init_icones
  init_indicateurs
  init_fenetres
  init_souris
  '  init_pub
  init_texte
  chargement
  mouse_on
RETURN
'
PROCEDURE init_resolution
  IF XBIOS(4)<>0                         !SI ON EST PAS EN BASSE RESOLUTION...
    ALERT 3,"basse r‚solution,|  scrogneugneu!!",1,"fichtre!",a%
    END
  ENDIF
RETURN
'
PROCEDURE init_indicateurs
  nombre_indicateurs%=30                              !NOMBRE MAXI D'INDICATEURS
  pointeur_indicateurs%=0                         !CLEAR DU NOMBRE D'INDICATEURS
  nombre_paragraphes%=110                                 !NOMBRE MAXI DE TEXTES
  DIM indicateur$(nombre_indicateurs%)     !NOM DES INDICATEURS UTILISES PAR MOI
  DIM indicateur!(nombre_indicateurs%)                   !INDICATEUR EN LUI-MEME
  DIM paragraphe_lu!(nombre_paragraphes%)
  '
  '                                      !NUMERO DE L'INDIC CRE A CHAQUE TEXTE:
  DIM indicateur_paragraphes%(nombre_paragraphes%)
  '                            !NUMERO DE L'INDIC NECESSAIRE POUR LIRE CE TEXTE:
  DIM indicateur_paragraphes_prealables%(nombre_paragraphes%)
  '
  indicateur!(0)=TRUE                       !INDICATEUR VIRTUEL TOUJOURS POSITIF
  '
RETURN
'
PROCEDURE init_objets
  nombre_objets%=8                                              !NOMBRE D'OBJETS
  DIM objet$(nombre_objets%)                                !NOM DE CHAQUE OBJET
  RESTORE objets
  FOR i%=1 TO nombre_objets%                        !QU'ON LIT DANS LES DATAS...
    READ objet$(i%)
  NEXT i%
  CLR ancien_objet%
RETURN
'
PROCEDURE init_peches
  nombre_peches%=7                                             !NOMBRE DE PECHES
  DIM peche$(nombre_peches%+1)   !NOM DE CHAQUE PECHE (+1 POUR L'INDIC SUITE...)
  RESTORE peches
  FOR i%=1 TO nombre_peches%+1                      !QU'ON LIT DANS LES DATAS...
    READ peche$(i%)
  NEXT i%
RETURN
'
PROCEDURE init_icones
  '
  DIM icone_objets!(nombre_objets%)                 !ICONES ALLUMES OU ETEINTES
  DIM icone_peches!(nombre_peches%+1)        !(+1 POUR L'INDICATEUR DE SUITE...)
  '
  DIM icone_objets$(nombre_objets%)                 !BLOCS GRAPHIQUES DES ICONES
  DIM icone_peches$(nombre_peches%)
  '
  DIM objet_x%(nombre_objets%)                !COORDONNES DES ICONES DES OBJETS
  DIM objet_y%(nombre_objets%)
  DIM objet_xx%(nombre_objets%)
  DIM objet_yy%(nombre_objets%)
  '
  DIM peche_x%(nombre_peches%)                 !COORDONNE DES ICONES DES PECHES
  DIM peche_y%(nombre_peches%)
  DIM peche_xx%(nombre_peches%)
  DIM peche_yy%(nombre_peches%)
  '
  RESTORE coordonnees_objets                 !LECTURE DES COORDONNES DES OBJETS
  FOR i%=1 TO nombre_objets%
    READ objet_x%(i%),objet_y%(i%),objet_xx%(i%),objet_yy%(i%)
  NEXT i%
  '
  RESTORE coordonnees_peches
  FOR i%=1 TO nombre_peches%                  !CALCUL DES COORDONNES DES PECHES
    READ peche_x%(i%),peche_y%(i%),peche_xx%(i%),peche_yy%(i%)
  NEXT i%
  '
  FOR i%=0 TO 15                                          !EFFACEMENT DE L'ECRAN
    SETCOLOR i%,0,0,0
  NEXT i%
  '
  fichier$="IMAGES\10.PI1"              !CHARGEMENT DE L'IMAGE DE FOND
  ramdisk
  ice_load(fichier$)
  ice_disp(adresse_image%)
  SGET bureau$                                     !CAPTURE DU BUREAU
  '
  fichier$="IMAGES\11.PI1"                      !CHARGEMENT DES ICONES
  ramdisk
  ice_load(fichier$)
  ice_disp(adresse_image%)
  '
  FOR i%=1 TO nombre_peches%                      !CAPTURE DES ICONES DES PECHES
    GET peche_x%(i%),peche_y%(i%),peche_xx%(i%),peche_yy%(i%),icone_peches$(i%)
  NEXT i%
  '
  FOR i%=1 TO nombre_objets%                      !CAPTURE DES ICONES DES OBJETS
    GET objet_x%(i%),objet_y%(i%),objet_xx%(i%),objet_yy%(i%),icone_objets$(i%)
  NEXT i%
  '
  CLS                     !ON EFFACE L'ECRAN AVANT D'APPELLER LA ROUTINE PALETTE
  palette_bureau$=palette$               !ON MEMORISE LA PALETTE DE L'IMAGE...
  '
RETURN
'
PROCEDURE init_routines
  INLINE routine_decomp%,5000
RETURN
'
PROCEDURE init_fenetres
  INC nombre_objets%
  '                           !COORDONNES DES FENETRES DE TEXTE (UNE PAR IMAGE)
  DIM fenetre_x%(nombre_objets%),fenetre_y%(nombre_objets%)
  DIM fenetre_xx%(nombre_objets%),fenetre_yy%(nombre_objets%)
  '
  RESTORE fenetres
  FOR i%=1 TO nombre_objets%             !QU'ON LIT DANS LES DATAS
    READ fenetre_x%(i%),fenetre_y%(i%)
    READ fenetre_xx%(i%),fenetre_yy%(i%)
  NEXT i%
  '
  DEC nombre_objets%                   !ON RAMENE LE NOMBRE D'OBJETS A 8 (9=FIN)
RETURN
'
PROCEDURE init_souris
  INLINE souris%,74
  FOR i%=0 TO 73
    souris$=souris$+CHR$(PEEK(souris%+i%))
  NEXT i%
RETURN
'
PROCEDURE datas_init
fenetres:
  DATA 10,100,310,190
  DATA 10,100,310,190
  DATA 10,100,310,190
  DATA 120,10,310,190
  DATA 10,100,310,190
  DATA 10,100,310,190
  DATA 10,100,310,190
  DATA 10,10,200,190
  DATA 10,100,310,190
  '
objets:
  DATA LUNETTES,CUILLERE,FLEUR,CARNET,DICO,BIJOUX,CLES,ARGENT,FIN
  '
peches:
  DATA ORGUEIL,AVARICE,GOURMANDISE,ENVIE,LUXURE,COLERE,PARESSE,suite
  '
coordonnees_objets:
  DATA 238,51,283,88
  DATA 222,110,268,151
  DATA 195,0,266,39
  DATA 0,17,57,54
  DATA 27,55,106,103
  DATA 131,32,178,64
  DATA 276,19,319,50
  DATA 133,69,188,101
  '
coordonnees_peches:
  DATA 184,162,227,199
  DATA 0,162,43,199
  DATA 46,162,89,199
  DATA 276,162,319,199
  DATA 92,162,135,199
  DATA 138,162,181,199
  DATA 230,162,273,199
  '
RETURN
'
PROCEDURE init_texte
  LOCAL i%,j%,long%,temps
  '
  DIM bloc_text$(2000)    !BLOCS GRAPHIQUES CONTENANT L'IMAGE DU TEXTE (1/LIGNE)
  text%=MALLOC(110000)                                !BUFFER CONTENANT LE TEXTE
  pointeur_text%=text%                                 !POINTEUR DU BUFFER TEXTE
  '
  FOR k%=1 TO nombre_objets%                         !UN FICHIER TEXTE PAR OBJET
    temps=TIMER
    presentation                                              !ON FAIT PATIENTER
    fichier$="TEXTES\TXT_"+STR$(k%)+".TXT"   !ON CHARGE LE FICHIER COMPACT
    ramdisk
    e%=C:routine_ice%(W:0,L:V:fichier$,L:*buffer_text%,L:*long%)
    IF e%<>0
      STOP
    ENDIF
    '
    BMOVE buffer_text%,pointeur_text%,long%-2       !ON MET LE TEXTE A LA FIN...
    ADD pointeur_text%,long%-2                                        !DU BUFFER
    '
    POKE pointeur_text%,ASC("œ")                              !PETITE CORRECTION
    POKE pointeur_text%+1,ASC("œ")            !ON RAJOUTE UN PSEUDO RETURN ("œ")
    ADD pointeur_text%,2                                     !A LA FIN DU BUFFER
    '
    ~MFREE(buffer_text%)                   !ON SE DEBARASSE DU BUFFER PROVISOIRE
    '
    REPEAT
    UNTIL temps+1000<TIMER
  NEXT k%
  '
  init_indicateurs_texte                                 !ET ON PASSE A LA SUITE
  '
RETURN
'
PROCEDURE init_indicateurs_texte
  '
  LOCAL i%
  '
  DIM paragraphe%(nombre_paragraphes%)      !INDEX DE DES DEBUTS DES PARAGRAPHES
  paragraphe%(1)=0
  CLR pointeur_paragraphes%                         !NOMBRE TOTAL DE PARAGRAPHES
  CLR paragraphes_lus%                                !NOMBRE DE TEXTES DEJA LUS
  '
  '                                NUMERO DE L'OBJET ASSOCIE A CHAQUE PARAGRAPHE
  DIM reference_objet%(nombre_paragraphes%)
  '                                  NUMERO DU PECHE ASSOCIE A CHAQUE PARAGRAPHE
  DIM reference_peche%(nombre_paragraphes%)
  '
  FOR i%=1 TO nombre_objets%                  !ON CHARGE CHAQUE FICHIER INDEX...
    fichier$="TEXTES\REF."+STR$(i%)
    ramdisk
    OPEN "I",#1,fichier$                                       !ON OUVRE LE FICHIER
    index$=SPACE$(LOF(#1))                  !ON CREE UNE VARIABLE DE LA LONGUEUR
    CLOSE                         !DU FICHIER INDEX (>256 SIGNES DONC PAS INPUT)
    BLOAD fichier$,VARPTR(index$)     !ON CHARGE LE FICHIER A PARTIR DE SON ADRESSE
    j%=1                                !ON SCANNE A PARTIR DU PREMIER CARACTERE
    indicateur_fin!=FALSE
    REPEAT
      INC pointeur_paragraphes%                   !ON CREE UN NOUVEAU PARAGRAPHE
      '
      lookindex         !INSTRUCTION (A$) SUIVANTE... (REFERENCES DU PARAGRAPHE)
      reference_objet%(pointeur_paragraphes%)=i%
      reference_peche%(pointeur_paragraphes%)=VAL(a$)
      '
      lookindex                                       !LONGUEUR DU PARAGRAPHE...
      paragraphe%(pointeur_paragraphes%)=paragraphe%(pointeur_paragraphes%-1)+VAL(a$)
      '
      lookindex                           !INDICATEURS "&" (CF TEXTE) PREALABLES
      indicateur$=a$
      IF indicateur$<>"NADA"                        !SI CET INDICATEUR EXISTE...
        indicateur_trouve!=FALSE            !ON LE CHERCHE DANS LA LISTE DE CEUX
        FOR k%=1 TO pointeur_indicateurs%                       !DEJA IDENTIFIES
          IF indicateur$=indicateur$(k%)                             !IL EXISTE?
            indicateur_trouve!=TRUE                                         !OK!
            indicateur_paragraphes_prealables%(pointeur_paragraphes%)=k%
            ' PRINT "&";indicateur$;" reference ";k%
          ENDIF
        NEXT k%
        '
        IF indicateur_trouve!=FALSE                            !IL N'EXISTE PAS?
          INC pointeur_indicateurs%                                  !ON LE CREE
          indicateur$(pointeur_indicateurs%)=indicateur$
          indicateur_paragraphes_prealables%(pointeur_paragraphes%)=pointeur_indicateurs%
          ' PRINT "&";indicateur$;" cr‚ation "
        ENDIF
      ENDIF
      '
      lookindex                         !INSTRUCTION SUIVANTE...(INDICATEUR "=")
      indicateur$=a$                                      !ON CAPTURE SON NOM...
      IF indicateur$<>"NADA"                         !LE CAS ECHEANT S'IL EXISTE
        indicateur_trouve!=FALSE                 !ON LE CHERCHE DANS LA LISTE DE
        FOR k%=1 TO pointeur_indicateurs%                  !CEUX DEJA IDENTIFIES
          IF indicateur$=indicateur$(k%)                             !IL EXISTE?
            indicateur_trouve!=TRUE                                         !OK!
            indicateur_paragraphes%(pointeur_paragraphes%)=k%
            ' PRINT "=";indicateur$;" r‚f‚rence ";k%
          ENDIF
        NEXT k%
        '
        IF indicateur_trouve!=FALSE            !SINON ON LE CREE COMME AU DESSUS
          INC pointeur_indicateurs%
          indicateur$(pointeur_indicateurs%)=indicateur$
          indicateur_paragraphes%(pointeur_paragraphes%)=pointeur_indicateurs%
          ' PRINT "=";indicateur$;" cr‚ation "
        ENDIF
      ENDIF
      '
    UNTIL indicateur_fin!=TRUE            !ON S'ARRETE A LA FIN DU FICHIER INDEX
    ' depart%=paragraphe%(pointeur_paragraphes%)
  NEXT i%
  '
RETURN
'
PROCEDURE lookindex
  j1%=INSTR(index$,"œ",j%)           !ON CHERCHE LE PROCHAIN PSEUDO RETURN ("œ")
  IF j1%<>0 AND j1%<>LEN(index$)            !SI ON EST PAS A LA FIN DE LA CHAINE
    a$=MID$(index$,j%,j1%-j%)                !ON CAPTURE LE MOT ENTRE LES DEUX œ
    j%=j1%+1                                          !ET ON DEPLACE LA POINTEUR
  ELSE
    indicateur_fin!=TRUE                         !SION LE FICHIER INDEX EST FINI
    a$=MID$(index$,j%,LEN(index$)-j%)            !ET ON CAPTURE LE DERNIER "MOT"
  ENDIF
RETURN
'
PROCEDURE presentation
  CLS
  SELECT k%          !K% EST LE NUMERO DU TEXTE EN TRAIN D'ETRE LU SUR DISQUETTE
  CASE 1
    carre("la belle zohra",100,80,"771")
    carre("(morceaux de bravoure)",100,120,"704")
    TEXT 0,180,319,"fran‡ois coulon"
    TEXT 0,190,319,"les logiciels d'en face 1992.reproduction interdite"
  CASE 2
    carre("graphismes faustino ribeiro",25,20,"437")
  CASE 3
    carre("programmation pascal piat",25,180,"275")
  CASE 4
    carre("musique erik ecqier",100,0,"743")
  CASE 5
    carre("un grand merci …:",150,20,"743")
    carre("emmanuel talmy",50,100,"743")
    carre("sans qui ce logiciel... etc.",70,180,"177")
  CASE 6
    carre("miss zohra c‚lestibus est habill‚e...",0,100,"607")
    carre("...par aristide aristibus",20,150,"607")
  CASE 7
    carre("‚crit et r‚alis‚ par fran‡ois coulon",0,99,"073")
  CASE 8
    carre("… la famille paspire...",100,180,"555")
  ENDSELECT
RETURN
'
PROCEDURE carre(texte$,x%,y%,couleur$)
  SETCOLOR 0,0,0,0                                      !FOND DE L'ECRAN EN NOIR
  SETCOLOR 15,7,7,5                                              !TEXTE EN JAUNE
  DEFTEXT 1,1,0,6                                   !ON CHOISIT UN TEXTE EN GRAS
  IF y%>100                             !SI LE TEXTE DOIT ETRE AFFICHE EN BAS...
    SETCOLOR 1,VAL("&H"+couleur$)                !ON CHOISIT LA DEUXIEME COULEUR
    DEFFILL 2,1,1
  ELSE
    SETCOLOR 2,VAL("&H"+couleur$)                       !SINON C'EST LA PREMIERE
    DEFFILL 3,1,1
  ENDIF
  PBOX x%,y%,x%+12,y%+12                  !ON TRACE UN PETIT CARRE DE COULEUR...
  TEXT x%+15,y%+8,LEN(texte$)*8,texte$                                  !ET LE TEXTE A COTE...
RETURN
'
PROCEDURE ramdisk
  LOCAL fichier2$,znort%,long%,i%,j%
  IF ramdisk!=TRUE                                      !SI LE RAMDISK EXISTE...
    REPEAT
      i%=j%
      j%=INSTR(fichier$,"\",i%+1)  !CAPTURE DU NOM DU FICHIER A CHARGER (SANS PATH)
    UNTIL j%=0
    '
    fichier2$="E:"+MID$(fichier$,i%)         !PATH QU'ON REMPLACE PAR CELUI DU RAMDISK
    IF EXIST(fichier2$)                   !SI LE FICHIER EXISTE DEJA SUR LE RAMDISK
      fichier$=fichier2$
    ELSE
      OPEN "i",#99,fichier$             !SINON ON REGARDE LA LONGUEUR DU FICHIER...
      long%=LOF(#99)
      CLOSE
      IF DFREE(5)>long%+80000 AND MALLOC(-1)>long%             !ASSEZ DE PLACE?
        znort%=MALLOC(long%)          !ON CREE UN BUFFER DE LA TAILLE DU FICHIER
        BLOAD fichier$,znort%                  !ON CHARGE LE FICHIER DANS LE BUFFER
        BSAVE fichier2$,znort%,long%                !ET ON LE SAUVE DANS LE RAMDISK
        ~MFREE(znort%)                     !ON SUPPRIME LE BUFFER DEVENU INUTILE
      ENDIF
    ENDIF
  ENDIF
RETURN
'
PROCEDURE shoot_text
  '
  LOCAL j%,ligne%,mot$,temps
  '
  timer=temps
  ERASE bloc_text$()
  DIM bloc_text$(1000)
  '
  CLR ligne%,nombre_lignes%,mot$
  premiere_ligne%=1
  hide_screen
  CLS
  FOR j%=paragraphe%(paragraphe%-1) TO paragraphe%(paragraphe%)-1
    '
    i%=PEEK(j%+text%)
    mot$=mot$+CHR$(i%)
    '
    IF i%=156
      mot$=LEFT$(mot$,LEN(mot$)-1)
      IF ligne%+LEN(mot$)<max_colonnes%
        PRINT mot$
        shoot_ligne
        CLR ligne%,mot$
      ELSE
        shoot_ligne
        PRINT mot$
        shoot_ligne
        CLR mot$,ligne%
      ENDIF
    ENDIF
    '
    IF i%=32
      IF ligne%+LEN(mot$)<max_colonnes%
        PRINT mot$;
        ADD ligne%,LEN(mot$)
        CLR mot$
      ELSE
        PRINT
        shoot_ligne
        PRINT mot$;
        ligne%=LEN(mot$)
        CLR mot$
      ENDIF
    ENDIF
    '
  NEXT j%
  '
  show_screen
  REPEAT
  UNTIL TIMER>temps+200
  '
RETURN
'
PROCEDURE shoot_ligne
  LOCAL i%
  FOR i%=0 TO 8              !on scanne toute la hauteur de la ligne
    INC nombre_lignes%       !et on capture chaque ligne de l'‚cran
    GET 0,i%,max_colonnes%*8-1,i%,bloc_text$(nombre_lignes%)
  NEXT i%
  CLS                        !puis on efface l'‚cran
RETURN
'
PROCEDURE cree_fenetre(objet%,paragraphe%)
  LOCAL i%
  x%=fenetre_x%(objet%) !ON PREND LES COORDONNEES CORRESPONDANT A L'OBJET CHOISI
  y%=fenetre_y%(objet%)
  xx%=fenetre_xx%(objet%)
  yy%=fenetre_yy%(objet%)
  '
  max_colonnes%=(xx%-x%-10)/8         !ON CALCUL LE NOMBRE DE SIGNES PAR COLONNE
  max_lignes%=(yy%-y%)-3           !ON LAISSE UNE PETITE MARGE EN HAUT ET EN BAS
  shoot_text                                      !ON CAPTURE LE DESSIN DU TEXTE
  GRAPHMODE 1
  DEFFILL 1,1,1                                   !ON DESSINE UN RECTANGLE BLANC
  PRBOX x%,y%-1,xx%,yy%
  COLOR 0
  RBOX x%,y%-1,xx%,yy%                                    !ET UN CADRE NOIR AUTOUR
  RBOX x%-1,y%-1,xx%+1,yy%
  COLOR 1
  RBOX x%-2,y%-2,xx%+2,yy%+1
  RBOX x%-3,y%-2,xx%+3,yy%+1
  FOR i%=1 TO max_lignes%
    display_text(i%,y%+1+i%)        !ET ON AFFICHE LES PREMIERES LIGNES DU TEXTE
  NEXT i%
RETURN
'
PROCEDURE display_text(ligne%,niveau%)
  PUT x%+10,niveau%,bloc_text$(ligne%),12 !on l'affiche … l'endroit voulu
RETURN
'
PROCEDURE ice_load(fichier$)
  LOCAL erreur%
  INLINE routine_ice%,968
  erreur%=C:routine_ice%(W:0,L:V:fichier$,L:*adresse_image%,L:*longueur_image%)
  IF erreur%<>0
    STOP
  ENDIF
  palette$=SPACE$(32)
  BMOVE adresse_image%+2,VARPTR(palette$),32
RETURN
'
PROCEDURE ice_disp(adresse_image%)
  BMOVE adresse_image%+34,XBIOS(3),32000
  ~MFREE(adresse_image%)
RETURN
'
PROCEDURE palette(palette$)
  ~XBIOS(6,L:VARPTR(palette$))
RETURN
'
PROCEDURE hide_screen
  ecran%=MALLOC(32000)       !ON OUVRE UN BUFFER DE LA TAILLE DE L'CRN
  BMOVE XBIOS(3),ecran%,32000     !ON COPIE L'CRAN DEDANS
  ~XBIOS(5,L:ecran%,L:-1,L:-1)!ON CACHE CE QUI SE PASSE ¶ L'CRAN
  VSYNC
RETURN
'
PROCEDURE show_screen
  ~XBIOS(5,L:XBIOS(2),L:XBIOS(2),W:-1)   !ON RTABLIT L'AFFICHAGE NORMAL
  ~MFREE(ecran%)                   !ON FERME LE BUFFER
RETURN
'
PROCEDURE hide_screen2
  ecran2%=MALLOC(32000)       !on ouvre un buffer de la taille de l'‚cran
  BMOVE XBIOS(3),ecran2%,32000     !on copie l'‚cran dedans
  ~XBIOS(5,L:-1,L:ecran2%,L:-1)!on cache ce qui se passe … l'‚cran
  VSYNC
RETURN
'
PROCEDURE show_screen2
  ~XBIOS(5,L:xb2%,L:xb2%,W:-1)   !on r‚tablit l'affiche normal
  ~MFREE(ecran2%)          !on ferme le buffer
RETURN
'
PROCEDURE mouse_on
  OUT 4,8
  DEFMOUSE souris$
RETURN
'
PROCEDURE mouse_off
  OUT 4,18
  HIDEM
RETURN
'
PROCEDURE musique
  '
  @init_musique
  FOR beat%=1 TO 5
    @rythme(beat%)
    @charge_son
    SETCOLOR 0,7,7,7
    SETCOLOR 15,0,0,0
    @clavier_sonore
    SETCOLOR 0,0,0,0
  NEXT beat%
  @fin_musique
  '
RETURN
'
PROCEDURE init_musique
  son%=10                                   !NOMBRE MAXI DE SAMPLES
  SPOKE &H484,PEEK(&H484) AND &HFE          !PAS DE BIP CLAVIER
  '
  DIM son$(son%),frequence_son%(son%)
  DIM sous_titre1$(son%),sous_titre2$(son%)
  '
  RESTORE musique
  DEFFILL 0,2,8
  PBOX 0,0,319,199
  SETCOLOR 0,0,0,0
  '
RETURN
'
PROCEDURE rythme(rythme%)
  '
  FOR i%=10 DOWNTO 1              !RAZ DES BUFFERS CONTENANT LES SAMPLES
    son$(i%)=""
  NEXT i%
  CLR son%
  '
  ancienne_adresse%=adresse_rythme%
  '
  fichier$="SONS\BEAT"+STR$(rythme%)+".CMP"
  ramdisk
  e%=C:routine_decomp%(L:0,L:VARPTR(fichier$),L:*adresse%,L:*long%)
  IF e%<>0
    STOP
  ENDIF
  adresse_rythme%=adresse%
  longueur_rythme%=long%
  '
  frequence_rythme%=10000
  '
  @stop_sample
  f%=C:routine_decomp%(L:adresse_rythme%,L:longueur_rythme%,W:frequence_rythme%,W:65535,W:15,L:*suiveuse%)
  ~MFREE(ancienne_adresse%)
  '
RETURN
'
PROCEDURE charge_son
  REPEAT
    READ nom_son$,frequence_son%(son%+1),sous_titre1$(son%+1),sous_titre2$(son%+1)
    IF nom_son$<>"FIN"
      INC son%
      fichier$="SONS\"+nom_son$+".CMP"
      ramdisk
      fichier2$=fichier$
      e%=C:routine_decomp%(L:0,L:VARPTR(fichier$),L:*adresse%,L:*long%)
      son$(son%)=SPACE$(long%)
      BMOVE adresse%,VARPTR(son$(son%)),long%
      ~MFREE(adresse%)
    ENDIF
  UNTIL nom_son$="FIN"
  '
RETURN
'
PROCEDURE clavier_sonore
  REPEAT
  UNTIL INKEY$=""
  REPEAT
    IF TIMER>temps_sous_titre+500 AND sous_titre!=TRUE     !APRES UN PETIT TEMPS
      t(23,SPACE$(40))                                 !ON EFFACE LE SOUS-TITRE
      t(22,SPACE$(40))
      sous_titre!=FALSE
    ENDIF
    '
    a$=INKEY$                                              !ON SCANNE LE CLAVIER
    IF ASC(a$)=27           !SI C'EST UN CODE ESCAPE, ON PASSE TOUS LES COUPLETS
      beat%=10
      stop_sample                                           !ET ON ARRETE LE SON
    ENDIF
    '
    a%=ASC(RIGHT$(a$,1))-58                  !UNIQUEMENT LES TOUCHES DE FONCTION
    IF a%<=son% AND a%>=0           !TOUCHE DE FONCTION CORRESPONDANT A UN SON??
      @mix(a%)                                  !ON EMET LE SAMPLE CORRESPONDANT
      temps_sous_titre=TIMER       !DEBUT DU DCOMPTE DE L'AFFICHE DU SOUS_TITRE
      sous_titre!=TRUE
      t(22,SPACE$(40))
      @t(23,SPACE$(40))                  !ON EFFACE CELUI QU'IL Y AVAIT AVANT...
      t(22,sous_titre1$(a%))
      @t(23,sous_titre2$(a%))                          !ON AFFICHE LE NOUVEAU...
      sous_titre1$(a%)=""                  !POUR NE L'AFFICHER QU'UNE SEULE FOIS
      sous_titre2$(a%)=""
      '
    ENDIF
  UNTIL suiveuse%=0 OR a%=10                     !ON SORT SI C'EST LA TOUCHE F10
  '
  REPEAT                                              !ON VIDE LE BUFFER CLAVIER
  UNTIL INKEY$=""
RETURN
'
PROCEDURE mix(numero_son%)
  ~C:routine_decomp%(L:-VARPTR(son$(numero_son%)),L:LEN(son$(numero_son%)),W:frequence_son%(numero_son%),W:100)
RETURN
'
PROCEDURE stop_sample
  ~C:routine_decomp%(L:-1)  !FORCAGE DE LA FIN DU SAMPLE
RETURN
'
PROCEDURE fin_musique
  @stop_sample
  ~MFREE(adresse_rythme%)
  ERASE son$()
  ERASE frequence_son%()
  ERASE sous_titre$()
RETURN
'
PROCEDURE data_fichiers_musique
musique:
  DATA 1cemonsi,7500,"ce monsieur!",""
  DATA 1safemme,7500,"sa femme!",""
  DATA 1lechame,7500,"le chameau!",""
  DATA 1smala,7500,"et toute la smala!",""
  DATA fx_batte,10000,"",""
  DATA fx_flute,5000,"",""
  DATA fx_synth,5000,"",""
  DATA fx_tromp,7500,"",""
  DATA fx_tromp,10000,"",""
  DATA FIN,0,"",""
  '
  DATA 2coinfli,7500,"des coins o—","les flics ne vont plus"
  DATA 2kararab,7500,"y'a des quartiers arab'",""
  DATA 2karbret,7500,"si c'‚tait des quartiers bretons...",""
  DATA 2gensnan,7500,"some people from Nanterre,","some people from Belleville!"
  DATA fx_boing,5000,"",""
  DATA fx_couic,5000,"",""
  DATA fx_siren,5000,"",""
  DATA fx_guita,5000,"",""
  DATA fx_guita,7500,"",""
  DATA FIN,0,"",""
  '
  DATA 3BOPARLE,7500,"ces beaux-parleurs","de la t‚l‚vision?"
  DATA 3FAITFRA,7500,"qu'est-ce qu'ils ont fait","pour la france?"
  DATA 3PASMILI,7500,"les trois quarts du temps, y z'ont","pas fait leur service miliaire"
  DATA 3UNPEUPE,7500,"y sont meme un peu p‚d‚ sur les bords!",""
  DATA fx_hey,7500,"hey hey hey!",""
  DATA fx_cuivr,7500,"",""
  DATA fx_dzoin,7500,"",""
  DATA fx_dehem,7500,"",""
  DATA fx_dehem,10000,"",""
  DATA FIN,0,"",""
  '
  DATA 4algefra,7500,"nous n'‚tions pas pour","l'alg‚rie francaise"
  DATA 4algesah,7500,"nous ‚tions pour l'alg‚rie et","le sahara francais!"
  DATA 4sousoff,7500,"les sous-off' de la coloniale,","dont j'‚tais"
  DATA FIN,0,"",""
  '
  DATA 5haine,7500,"qui a la haine de l'‚tranger?",""
  DATA 5terrfra,7500,"la terre de france, elle est","d'abord aux fran‡ais"
  DATA 5collabo,7500,"on nous parle des collabos,","y z'en ont fait moins"
  DATA 5clepen,7500,"c'est Le Pen (de ch'val)",""
  DATA 5antifra,7500,"est anti-fran‡ais",""
  DATA 5abrutis,7500,"nous sommes des a.....s",""
  DATA fx_beat,7500,"",""
  DATA fx_glin1,7500,"",""
  DATA fx_glin2,7500,"",""
  DATA FIN,0,"",""
RETURN
'
PROCEDURE t(ligne%,texte$)
  TEXT 160-LEN(texte$)*4,ligne%*8,texte$
RETURN
'
PROCEDURE fin
  ~MFREE(text%)
  ~FRE(0)
  mouse_on
  SHOWM
  IF ramdisk!=FALSE
    SYSTEM
  ELSE
    END
  ENDIF
RETURN
'
' -----------------------------------------------------------------------------