$C+ RESERVE 200000 mini_malloc%=40000 ON BREAK GOSUB fin ' ste!=STE? ' ste!=0 !pour tester avec un STF stf!=NOT (ste!) ' initialisation_absolue generique main ' PROCEDURE main DO !ON COMMENCE A BOUCLER INDEFINIEMENT aventure|=@choix_aventure !ON CHOISIT PARMI LES 3 AVENTURES initialisation_relative !ON CHARGE LES TEXTES CORRESPONDANTS.. . fadeout(palette$) REPEAT !ET ON BOUCLE POUR L'AVENTURE nouvelle_scene(scene_actuelle|) !ON INITIALISE LA SCENE image(scene_actuelle|) !ON CHARGE UNE IMAGE VENTUELLE texte$=texte$(scene_actuelle|) !ON DETERMINE LE TEXTE ecran$=@affiche_texte$(texte$) !QU'ON AFFICHE... suite_forcee!=@suite_forcee(scene_actuelle|) IF suite_forcee!=FALSE !S'IL Y A DES MOTS A CLIQUER... mots_clicables(ecran$) fadein_mid REPEAT mot$=@clic_mot$(ecran$) !ON ATTEND QU'ON CLIQUE QUELQUE PART IF suite_forcee!=FALSE !SI ON NE SORT PAS PAR UN "LOAD" OU UN "ESC" scene_actuelle|=@aiguillage(scene_actuelle|,mot$) !ON FAIT CLIGNOTER LE MOT (S'IL CORRESPOND A QUELQUE CHOSE) ENDIF UNTIL deplacement!=TRUE !ON BOUCLE JUSQU'A CE QU'ON CHANGE DE SCENE ENDIF UNTIL escape!=TRUE !ON CHANGE D'AVENTURE SI ON TAPE "ESCAPE" fin_aventure LOOP RETURN ' PROCEDURE generique tag cprint("un logiciel de Fran‡ois Coulon",8,3) cprint("&",9,3) cprint("Sylvie Sarrat, Faustino Ribeiro, Laurent Cotton",10,3) cprint("programmation: Pascal Piat noiz': Erik Ecqier",12,3) cprint("Les logiciels d'en face 1992. Reproduction, location et revente interdites",18,3) ' IF stf! !SI C'EST UN STF f=FRE() RESERVE 20000 fichier$=STR$(RAND(max_musiques|)+1)+"zikmu.mod" musique(fichier$) !DEBUT D'UNE MUSIQUE fin_musique !ON ARRETE LA MUSIQUE SUR UN STF (PAS D'INTERRUPTIONS) RESERVE f ELSE attente ENDIF ' noircit_ecran CLS ' RETURN PROCEDURE tag LOCAL crayon$,numero|,i|,ecran1%,ecran2%,fichier_ecriture$ HIDEM !ON CACHE LA SOURIS CLS noircit_ecran !ON CACHE CE QUI VA S'AFFICHER DIM x2|(2000),y2|(2000) !ON DECLARE LE TABLEAU DES COORDONNES DEFFILL 1,2,8 !ET ON DESSINE LE "CRAYON" PBOX 0,0,5,2 !UN RECTANGLE... COLOR 3 PLOT 0,0 !AVEC LES 4 COINS EN MOINS PLOT 0,2 PLOT 5,0 PLOT 5,2 GET 0,0,5,2,crayon$ !ON LE CAPTURE CLS ' fichier_ecriture$="1.ecr" ecriture%=MALLOC(4000) !ON OUVRE UN BUFFER BLOAD fichier_ecriture$,ecriture% !ON CHARGE LE FICHIER point2&=DPEEK(ecriture%) !ON REPERE LE NOMBRE DE COORDONNES X,Y FOR i%=1 TO point2& !ET ON LES CAPTURE DANS UN TABLEAU x2|(i%)=PEEK(ecriture%+2*i%) y2|(i%)=PEEK(ecriture%+2*i%+1) NEXT i% ~MFREE(ecriture%) !ON FERME LE BUFFER INUTILE ' SETCOLOR 1,7,7,7 !ON VALIDE LES COULEURS SETCOLOR 0,0,0,0 !BORDS NOIRS, FOND BLANC... SETCOLOR 3,7,7,7 SETCOLOR 2,4,4,7 ' FOR i%=1 TO point2& !ON TRACE LES POINTS UN PAR UN PAUSE 0.002 x1&=x2|(i%)+194 !(ON LES REPLACE AU CENTRE DE L'ECRAN y1&=y2|(i%) !(CAR ILS NE SONT CODES QUE DE 0 ¶ 255) PUT x1&,y1&,crayon$ NEXT i% ' ' ERASE x2|(),y2|() !SINON ON FERME LES TABLEAUX ' RETURN FUNCTION choix_aventure HIDEM fichier$="0MENU.PI1" !NOM DE L'IMAGE CONTENANT LES CARACTERES charge_image(fichier$) !ON CHARGE L'IMAGE... ~XBIOS(5,L:-1,L:-1,0) !ON PASSE EN BASSE RESOLUTION image_ecran(adresse_image%) !ON L'AFFICHE (SANS FAIRE VOIR LA PALETTE) ' IF ste! !ON DEMARRE LA MUSIQUE (QU'ON ARRETERA +TARD) fichier$=STR$(RAND(max_musiques|)+1)+"zikmu.mod" musique(fichier$) !DEBUT D'UNE MUSIQUE ENDIF ' ' fadein(palette$) !ET ON LA FAIT APPARAITRE IF MOUSEX>310 !SI LA SOURIS DEPASSE L'ECRAN A DROITE SETMOUSE 310,MOUSEY !ON LA REPLACE A BON ENDROIT ENDIF SHOWM !AVANT DE L'AFFICHER REPEAT IF MOUSEX>310 SETMOUSE 310,MOUSEY ENDIF UNTIL MOUSEK !ATTENTE D'UN CLIC SOURIS HIDEM !ON CACHE LA SOURIS ' choix|=INT(MOUSEX*3/320)+1 DEFFILL 0,2,8 FOR i%=1 TO 3 !ON EFFACE LES TITRES DES DEUX AVENTURES IF i%<>choix| !QUI NE SONT PAS SELECTIONNES PBOX (i%-1)*106,0,(i%-1)*106+105,199 ENDIF NEXT i% ' fin_musique !ON ARRETE LA MUSIQUE (SUR STE) RETURN choix| !ON RETOURNE LA VALEUR 1, 2 OU 3 SELON L'ABSCISSE ENDFUNC ' PROCEDURE initialisation_absolue GRAPHMODE 1 OPTION BASE 1 !TABLEAUX COMMENCANT A L'ELEMENT 1 (ET NON 0) initialisation_resolution noircit_ecran initialisation_constantes initialisation_fonte initialisation_fond initialisation_souris RETURN PROCEDURE initialisation_constantes SPOKE &H484,PEEK(&H484) AND &HFE ! PAS DE BIP CLAVIER max_musiques|=3 !NOMBRE DE MUSIQUES DE PRESENTATION max_colonnes|=75 !NOMBRE DE CARACTERE PAR LIGNE max_lignes|=18 !NOMBRE MAXI DE LIGNES SUR L'ECRAN largeur_caractere|=8 !LARGEUR EN PIXEL DE CHAQUE CARACTERE hauteur_caractere|=11 marge_gauche|=3 !MARGE DE GAUCHE EN CARACTERES ' !MARGE EN NOMBRE DE PIXELS: marge_gauche_pixel&=marge_gauche|*largeur_caractere| ' ' ON PRECALCULE LES COORDONNES SUR L'ECRAN DE CHAQUE CARACTERE ' DIM x_texte%(max_colonnes|,max_lignes|),y_texte%(max_colonnes|,max_lignes|) FOR i%=1 TO max_colonnes| FOR j%=1 TO max_lignes| x_texte%(i%,j%)=(i%-2)*largeur_caractere|+marge_gauche_pixel& y_texte%(i%,j%)=PRED(j%)*hauteur_caractere|+1 NEXT j% NEXT i% ' ' max_mots|=25 !NOMBRE MAXI DE MOTS "CLICABLES" A CHAQUE SCENE taille_image%=32000 !TAILLE D'UNE IMAGE CAPTUREE ' !CARACTERES COMPOSANT UN MOT: ' alphabet$="AZERTYUIOPQSDFGHJKLMWXCVBNŠ€¶_"+CHR$(131)+CHR$(180)+CHR$(136)+CHR$ (147)+CHR$(181)+CHR$(139) ' 131: a^ 180: OE 136: e^ 181: oe 139: i¹ RETURN PROCEDURE initialisation_resolution CLS !ON EFFACE L'ECRAN IF XBIOS(4)<>1 !SI ON EST PAS EN MOYENNE RESOLUTION ALERT 3,"Passez en moyenne r‚solution",1,"SVP",a% SYSTEM !ON REVIENT AU BUREAU ENDIF RETURN PROCEDURE initialisation_fonte ' LOCAL fichier$,i&,j|,pointeur_caracteres|,max_caracteres| CLR pointeur_caracteres| ' !NOM DE L'IMAGE CONTENANT LES CARACTERES A CAPTURER fichier$="0FONTE.PI2" charge_image(fichier$) !ON CHARGE L'IMAGE... image_ecran(adresse_image%) !ON L'AFFICHE (SANS FAIRE VOIR LA PALETTE) ' max_caracteres|=182 DIM caractere$(max_caracteres|) !BLOCS CORRESPONDANT A CHAQUE CARCTERE FOR j|=7 TO 200 STEP hauteur_caractere| FOR i&=0 TO 600 STEP largeur_caractere|+1 INC pointeur_caracteres| !ON CAPTURE LE DESSIN DE CHAQUE IF pointeur_caracteres|<=max_caracteres| !CARACTERE GET i&,j|+1,i&+largeur_caractere|-1,j|+hauteur_caractere|-1,caractere$(p ointeur_caracteres|) ELSE EXIT IF 0=0 ENDIF IF pointeur_caracteres|>max_caracteres| EXIT IF 0=0 ENDIF NEXT i& NEXT j| ' RETURN PROCEDURE initialisation_fond ' ' ON CHARGE DANS UN BUFFER L'IMAGE A METTRE DERRIERE LE TEXTE ' fond%=MALLOC(32066) ecran_texte%=MALLOC(32000) !ON OUVRE EGALEMENT LE BUFFER POUR LA PARTIE TEX TE fichier$="0FOND.PI2" BLOAD fichier$,fond% ' ' ET ON NE GARDE QUE L'ADRESSE DE L'IMAGE ELLE MEME (PAS LE HEADER) ' ADD fond%,34 ' RETURN PROCEDURE initialisation_souris ' ' ' Mouse-Convert data in string LET risou$=MKI$(14)+MKI$(1) LET risou$=risou$+MKI$(0) LET risou$=risou$+MKI$(0) LET risou$=risou$+MKI$(1) FOR i%=1 TO 16 READ backgrnd LET risou$=risou$+MKI$(backgrnd) NEXT i% FOR i%=1 TO 16 READ foregrnd LET risou$=risou$+MKI$(foregrnd) NEXT i% DATA 0,2,0,10,58,230,900,3596,6152,12312,8208,8240,8224,8288,192,3968 DATA 0,6,30,116,460,1800,7192,12304,24624,16416,16480,16448,16576,24960,16128, 0 DEFMOUSE risou$ RETURN ' PROCEDURE initialisation_relative initialisation_textes initialisation_tableaux initialisation_cache debut_aventure RETURN PROCEDURE initialisation_textes ' LOCAL fichier$,erreur% CLR nombre_scenes| ' fichier$="TEXTES"+STR$(aventure|)+".TEX" ' ' debut_texte%=MALLOC(65000) !TAILLE MAXI THEORIQUE D'UN TEXTE BLOAD fichier$,debut_texte% ' nombre_scenes|=PEEK(debut_texte%)*256+PEEK(debut_texte%+1) ' !ON RECAPTURE LE NOMBRE DE SCENES (CODE SUR 2 OCTETS) pointeur%=debut_texte%+2 ' ' ON REPERE L'OCTET NUL QUI DELIMITENT LE DEBUT DE CHAQUE PARAGRAPHE ' DIM texte$(160) !TABLEAU CONTENANT LE TEXTE DE CHAQUE SCENE ' FOR i%=1 TO nombre_scenes| texte$(i%)=CHAR{pointeur%} ADD pointeur%,LEN(texte$(i%))+1 NEXT i% ' ~MFREE(debut_texte%) DEC nombre_scenes| !ON NE TIENT PAS COMPTE DE LA DERNIERE SCENE ("FIN") ' RETURN PROCEDURE initialisation_tableaux LOCAL i%,j%,scene|,fichier$,espace%,phrase$,longueur%,index%,pointeur% DIM fonction_mot$(nombre_scenes|,max_mots|)!MOTS QUI VONT "REAGIR" DIM aiguillage|(nombre_scenes|,max_mots|) !SCENE CORRESPONDANT AU MOT... DIM condition&(nombre_scenes|,max_mots|) !SCENE DEVANT AVOIR ETE VUE (OU NON SI NEGATIF) DIM pointeur_mots|(nombre_scenes|) !NOMBRE DE MOTS POUR CHAQUE SCENE DIM scene_visitee!(nombre_scenes|) !LE JOUEUR EST-IL PASSE PAR CETTE SCENE? DIM phrase$(nombre_scenes|,max_mots|) !PHRASE EXPLICATIVE A CHAQUE MOT CLIQUE DIM image_a_charger$(nombre_scenes|) !NOM DES FICHIERS IMAGE A CHARGER A CHAQUE SCENE DIM rouge1|(nombre_scenes|),vert1|(nombre_scenes|),bleu1|(nombre_scenes|) !COMPOSANTE DE LA COULEUR DU FOND DU TEXTE DIM rouge2|(nombre_scenes|),vert2|(nombre_scenes|),bleu2|(nombre_scenes|) ' ARRAYFILL rouge1|(),4 !ON REMPLIT PAR DEFAUT LES COMPOSANTES ARRAYFILL vert1|(),7 !(FOND DU TEXTE VERT CLAIR) ARRAYFILL bleu1|(),0 ARRAYFILL rouge2|(),1 ARRAYFILL vert2|(),7 ARRAYFILL bleu2|(),0 ' fichier$="TEXTES"+STR$(aventure|)+".ind" ' index%=MALLOC(11000) !TAILLE MAXI THEORIQUE D'UN FICHIER .IND DECOMPACTE BLOAD fichier$,index% ' pointeur%=index% REPEAT !ON VA DECODER TOUT CA... ligne$=CHAR{pointeur%} !ON CAPTURE UNE LIGNE (SEPARES PAR UN OCTET NUL ) instruction$=LEFT$(ligne$,1) !ON REGARDE LE PREMIER CARACTERE ADD pointeur%,LEN(ligne$)+1 !ON DEPLACE D'AVANCE LE POINTEUR ligne$=MID$(ligne$,2) !ON SAUTE LE PREMIER CARACTERE DE LA LIGNE ' SELECT instruction$ ' CASE "&" !ON INDIQUE UNE IMAGE A CHARGER? ' scene|=ASC(LEFT$(ligne$,1)) !ON REPERE LE NUMERO DE LA SCENE fichier$=MID$(ligne$,2) !LE NOM DU FICHIER IMAGE A CHARGER image_a_charger$(scene|)=fichier$ !ON LE STOCKE DANS UN TABLEAU ' CASE "%" !LA COULEUR DE FOND DU TEXTE?? ' scene|=ASC(LEFT$(ligne$,1)) rouge1|(scene|)=VAL(MID$(ligne$,2,1)) vert1|(scene|)=VAL(MID$(ligne$,3,1)) bleu1|(scene|)=VAL(MID$(ligne$,4,1)) rouge2|(scene|)=VAL(MID$(ligne$,5,1)) vert2|(scene|)=VAL(MID$(ligne$,6,1)) bleu2|(scene|)=VAL(MID$(ligne$,7,1)) ' CASE "#" !UN MOT CLICABLE? scene|=ASC(LEFT$(ligne$,1)) !ON LIT LE NUMERO DE LA SCENE ' INC pointeur_mots|(scene|) !ET UN MOT EN PLUS! espace%=INSTR(ligne$," ",2) !ON REPERE LE CARACTERE ESPACE fonction_mot$(scene|,pointeur_mots|(scene|))=MID$(ligne$,2,espace%-2) condition&(scene|,pointeur_mots|(scene|))=ASC(MID$(ligne$,espace%+2,1))*VAL(MID$(ligne$,espace%+1,1)+"1") aiguillage|(scene|,pointeur_mots|(scene|))=ASC(MID$(ligne$,espace%+3)) CLR phrase$ phrase$=phrase$+MID$(ligne$,espace%+4) phrase$(scene|,pointeur_mots|(scene|))=phrase$ ' ENDSELECT ' UNTIL ASC(instruction$)=0 !ON CONTINUE JUSQU'A LA FIN DU FICHIER ~MFREE(index%) !ET ON DETRUIT LE BUFFER PROVISOIRE ' RETURN PROCEDURE initialisation_cache ' nombre_cache%=(MALLOC(-1)-mini_malloc%)/taille_image% !ON OUVRE UN FICHIER CON TENANT LES IMAGES IF nombre_cache%<=0 !DEJA CHARGEES,EN FONCTION DE LA nombre_cache%=1 !MEMOIRE DISPONIBLE ENDIF DIM adresse_cache%(nombre_cache%),numero_cache%(nombre_cache%),palette_cache$( nombre_cache%) FOR i%=1 TO nombre_cache% !ON OUVRE LES BUFFERS adresse_cache%(i%)=MALLOC(taille_image%) !POUR NE PAS FAUSSER LE MALLOC(-1) NEXT i% RETURN PROCEDURE debut_aventure scene_actuelle|=1 !ON DEBUT A LA SCENE 1 ARRAYFILL scene_visitee!(),FALSE !RAZ DES INDICATEURS deplacement!=TRUE !ET INDIQUE QU'ON DOIT CHANGER DE SCENE RETURN PROCEDURE fin_aventure noircit_ecran !ON CACHE L'ECRAN ERASE texte$() !ET ON DETRUIT TOUS LES TABLEAUX ERASE fonction_mot$() ERASE aiguillage|() ERASE condition&() ERASE pointeur_mots|() ERASE scene_visitee!() ERASE phrase$() ERASE image_a_charger$() ERASE rouge1|(),vert1|(),bleu1|() ERASE rouge2|(),vert2|(),bleu2|() FOR i%=1 TO nombre_cache% ~MFREE(adresse_cache%(i%)) NEXT i% ERASE adresse_cache%(),numero_cache%(),palette_cache$() escape!=FALSE ~FRE(0) RETURN ' PROCEDURE fin ' !SI ON INTERROMPT LE PROGRAMME INTERPRETE ~MFREE(debut_texte%) !ON FERME LE BUFFER TEXTE (IL DOIT DEJA L'ETRE) ~MFREE(index%) !LE BUFFER INDEX (IL DOIT DEJA L'ETRE) ~MFREE(adresse_image%) ~MFREE(fond%-34) ~MFREE(ecran_texte%) FOR i%=1 TO nombre_cache% ~MFREE(adresse_cache%(i%)) NEXT i% SETCOLOR 0,7,7,7 !ON REMET LES COULEURS FOND ET TEXTE SETCOLOR 3,0,0,0 !NORMALEMENT fin_musique RESERVE EDIT END RETURN ' PROCEDURE nouvelle_scene(scene|) scene_visitee!(scene|)=TRUE !ON MARQUE LE PASSAGE deplacement!=FALSE !LE JOUEUR N'A PAS (ENCORE)CHANGE DE SALLE... CLR option_mot$ !AUCUN MOT ENCORE CLIQU RETURN FUNCTION affiche_texte$(texte$) ' LOCAL longueur_texte%,i%,j%,ligne_max$,b$,return$,return%,longueur% ' i%=1 WHILE LEFT$(texte$,1)="œ" !ON SUPPRIME D'EVENTUELS SIGNES "œ" (RETOUR CHAR IOT) texte$=MID$(texte$,2) !AU DEBUT DU TEXTE WEND ' longueur_texte%=LEN(texte$) CLR b$ HIDEM ' ' ON JUSTIFIE LE TEXTE POUR UN AFFICHAGE EN 80 COLONNES, ET ON RENVOIT UNE ' VARIABLE ALPHA CONTENANT DES ESPACES A LA FIN DE CHAQUE LIGNE ' REPEAT ' ligne_max$=MID$(texte$,i%,max_colonnes|) return$=LEFT$(ligne_max$,INSTR(ligne_max$,"œ")) return%=LEN(return$) ' SELECT return% ' CASE 0 !SI AUCUN CODE "œ" N'EST PRESENT,ON COUPE LE TEXTE ligne_max$=LEFT$(ligne_max$,RINSTR(ligne_max$," ")) b$=b$+ligne_max$+SPACE$(max_colonnes|-LEN(ligne_max$)) ADD i%,LEN(ligne_max$) ' CASE 1 !SI C'EST UN RETURN SEUL ON CREE UNE LIGNE BLANCHE INC i% b$=b$+SPACE$(max_colonnes|) ' DEFAULT !SINON ON COMBLE D'ESPACE LE RESTE DE LA LIGNE DEC return% ligne_max$=LEFT$(return$,return%) b$=b$+ligne_max$+SPACE$(max_colonnes|-return%) ADD i%,return%+1 ENDSELECT ' UNTIL i%>=longueur_texte% ' b$=b$+SPACE$(LEN(b$) MOD max_colonnes|) !ON COMBLE DE LIGNES BLANCHES avant!=TRUE !LE TEXTE EN HAUT ET EN BAS REPEAT !POUR OBTENIR UN TEXTE COUVRANT IF avant!=FALSE !TOUT L'ECRAN ET BIEN CENTRE b$=b$+SPACE$(max_colonnes|) !(ON COMMENCE PAR AJOUTER UNE avant!=TRUE !LIGNE BLANCHE AU DEBUT) ELSE b$=SPACE$(max_colonnes|)+b$ avant!=FALSE ENDIF UNTIL LEN(b$)>=max_lignes|*max_colonnes| !JUSQU'A CE QUE LE TEXTE DEPASSE ' !LE NOMBRE DE SIGNES SUR L'ECRAN BMOVE fond%,XBIOS(2),taille_image% !ON AFFICHE LE FOND ' IF scene_actuelle|=1 !SI ON EST A LA PREMIERE SCENE CLR dedicace2$ !ON IMPRIME LA DEDICACE (VIDE DANS LE dedicace$=MID$("&,™oABCDEF ",5) dedicace$=TRIM$(dedicace$) !CODE SOURCE ET REPEREE PAR "&,™O" FOR i%=1 TO LEN(dedicace$) !ON LA DECODE (PAS VISIBLE DS LE SOUR CE dedicace2$=dedicace2$+CHR$(ASC(MID$(dedicace$,i%,1)) XOR 71) NEXT i% print(dedicace2$,1,1,4) !ET ON L'CRIT EN HAUT DE L'CRAN ENDIF ' longueur%=LEN(b$) !ON SCANNE TOUTE LA LONGUEUR DU TEXTE CLR j% FOR i%=1 TO longueur% STEP max_colonnes| INC j% texte$=TRIM$(MID$(b$,i%,max_colonnes|))!ET ON ECRIT LA LIGNE AVEC LA ROUTINE print(texte$,1,j%,4) !MAISON, SANS ESPACE AVANT ET APRES NEXT i% ' ~FRE(0) ~MALLOC(-1) ' RETURN b$ ' ENDFUNC FUNCTION suite_forcee(scene|) IF UPPER$(fonction_mot$(scene|,1))="SUITE" !SI LE MOT A CLIQUER EST "SUITE" HIDEM !DIRECTEMENT SUR LA SCENE fadein_mid attente !SPCIFIE fadeout_mid deplacement!=TRUE !ALORS IL N'Y A PAS DE CHOIX scene_actuelle|=aiguillage|(scene|,1) !POSSIBLE, ON S'AIGUILLE RETURN TRUE ELSE RETURN FALSE !SINON ON AGIT NORMALEMENT ENDIF ENDFUNC FUNCTION clic_mot$(texte$) ' LOCAL x&,y&,i%,a$,longueur_texte%,pointeur2%,clavier$ ' longueur_texte%=LEN(texte$) CLR mot$ ' SHOWM REPEAT !ON SCRUTE LE CLAVIER... ~FRE(1) clavier$=RIGHT$(INKEY$,1) undo!=FALSE IF ASC(clavier$)=98 !FONCTION HELP (98=HELP) help ENDIF IF MOUSEK=2 AND image_chargee!=TRUE !ON SWITCHE SUR L'IMAGE (BOUTON DROIT) BMOVE XBIOS(2),ecran_texte%,taille_image% !ON MEMORISE L'ECRAN TEXTE affiche_image(adresse_cache%(scene_cache%),palette_cache$(scene_cache%),FA LSE) !ON AFFICHE LE DESSIN palette_texte !ON RESTORE LA PALETTE TEXTE BMOVE ecran_texte%,XBIOS(2),taille_image% !ET L'ECRAN TEXTE ENDIF ~FRE(1) UNTIL MOUSEK=1 OR undo!=TRUE !UN MOT EST CLIQUE?? (BOUTON GAUCHE) (A MOINS QUE L'ON REVIENNE AU DEBUT DE L'AVENTURE) ' ' ON CAPTURE LES COORDONNEES DE LA SOURIS QU'ON CONVERTIT EN UNE SEULE ' x&=INT(MOUSEX/largeur_caractere|)+1-marge_gauche| IF x&<0 !LA PRESENCE DE LA MARGE PERMETTRAIT DES COORDONNES x&=0 !NEGATIVES... ENDIF y&=INT(MOUSEY/hauteur_caractere|) pointeur_mot%=y&*max_colonnes|+x& !CONVERSION EN COORD. ABSOLUES ' ' SI L'ENDROIT POINT EST BIEN UN CARACTERE AUTORIS, ' ON REGARDE QUEL MOT DANS LE TEXTE Y CORRESPOND ' CLR mot2$ IF pointeur_mot%longueur_texte% !ON S'EN VA SI ON ARRIVE A LA FIN DU TE XTE a$=MID$(texte$,pointeur2%,1) !ON CAPTURE CE CARACTERE IF INSTR(alphabet$,UPPER$(a$)) !SI CE CARACTERE FAIT PARTIE DE CEUX CO MPOSANT UN MOT mot$=mot$+a$ !ON L'AJOUTE AU MOT "CLIQU" sortie!=FALSE !ET ON CONTINUE ELSE sortie!=TRUE !SINON LE MOT EST TERMIN ENDIF UNTIL sortie!=TRUE ' pointeur2%=pointeur_mot% !MEME CHOSE POUR LES CARACTERES REPEAT !SITUES AVANT L'ENDROIT CLIQU DEC pointeur2% EXIT IF pointeur2%<=0 a$=MID$(texte$,pointeur2%,1) IF INSTR(alphabet$,UPPER$(a$)) mot$=a$+mot$ sortie!=FALSE ELSE sortie!=TRUE ENDIF UNTIL sortie!=TRUE ' ENDIF ' pointeur_mot%=pointeur2%+1 !ON GARDE LES COORD. EXACTES DU DEBUT DU MOT ' HIDEM IF undo!=TRUE CLR mot$ ENDIF RETURN mot$ !ET ON RENVOIT CE MOT EN TOUTES LETTRES ' ENDFUNC FUNCTION aiguillage(scene_actuelle|,mot$) LOCAL i|,condition&,nouvelle_scene| nouvelle_scene|=scene_actuelle| CLR numero_mot| ' IF mot$<>"" !SI LE MOT N'EST PAS VIDE FOR i|=1 TO pointeur_mots|(scene_actuelle|) !ON SCANNE TOUS LES MOTS-CLES ' !ON LE CHERCHE DANS LA LISTE IF UPPER$(fonction_mot$(scene_actuelle|,i|))=UPPER$(mot$) condition&=condition&(scene_actuelle|,i|) ' !ON TESTE SI LA CONDITION ' !EST SATISFAITE (NEGATIVE OU POSITIVE) IF (condition&>0 AND scene_visitee!(ABS(condition&))=TRUE) OR (condition &<0 AND scene_visitee!(ABS(-condition&))=FALSE) numero_mot|=i| ! SI C'EST OK ON VALIDE LE MOT ENDIF ENDIF ' NEXT i| ' IF numero_mot|<>0 !SI LE MOT EST DANS LA LISTE... ' IF option_mot$=mot$ !SI LE MOT A DEJA ETE CLIQU PRCDEMENT surligner_mot(ecran$,mot$,pointeur_mot%,6) !ON LE REFAIT CLIGNOTER deplacement!=TRUE !ET ON CHANGE DE SCENE fadeout_mid nouvelle_scene|=aiguillage|(scene_actuelle|,numero_mot|) ' ELSE !SI C'EST LA PREMIERE FOIS QU'ON LE CLIQUE option_mot$=mot$ !ON LE VALIDE ' !ON EFFACE LA LIGNE DE COMMENTAIRES: cprint(SPACE$(max_colonnes|),max_lignes|,0) ' !ON AFFICHE LES NOUVEAUX COMMENTAIRES: cprint(CHR$(34)+mot$+CHR$(34)+" : "+phrase$(scene_actuelle|,numero_mot|) +"...",max_lignes|,6) ' !ET ON SURLIGNE LE MOT PLUS BRIEVEMENT: surligner_mot(ecran$,mot$,pointeur_mot%,3) REPEAT !ET ON NE CONTINUE QUE SI LA SOURIS EST RELACHE: UNTIL MOUSEK=0 ' SI LA SCENE DE DESTINATION EST LA MEME QUE LA SCENE ACTUELLE ' (QUAND PAR EX UNE ACTION A DEJA ETE FAITE) ON EVITE LE FONDU IF aiguillage|(scene_actuelle|,numero_mot|)=scene_actuelle| numero_mot|=0 option_mot$="" ENDIF ' ENDIF ENDIF ENDIF ' RETURN nouvelle_scene| ' ENDFUNC PROCEDURE surligner_mot(texte$,mot$,pointeur_mot%,cycles|) ' LOCAL x&,y&,i| ' y&=INT(pointeur_mot%/max_colonnes|)+1 !CALCUL DES COORD. A PARTIR DU MOT x&=(pointeur_mot% MOD max_colonnes|) !CLIQUE... ' FOR i|=1 TO cycles| !SELON LE NOMBRE DE FOIS QUE LE MOT DOIT CLIGNOTER IF ODD(i|)=TRUE !ON LE SURLIGNE UNE FOIS SUR DEUX print(mot$,x&,y&,7) PAUSE 1 ELSE !UNE FOIS SUR DEUX print(mot$,x&,y&,4) !ON LE REAFFICHE NORMALEMENT PAUSE 1 !ET ON ATTEND UNE FRACTION DE SECONDE ENDIF NEXT i| ' RETURN PROCEDURE print(texte$,colonne&,ligne&,mode|) ' DEC colonne& ' DEC ligne& FOR z%=1 TO LEN(texte$) !ON AFFICHE UN PAR UN LES CARACTERES ' !SELON LEUR IMAGE RESPECTIVE CAPTURE DANS LE ' !FICHIER "0FONTE.PI1" ' PUT (colonne&+PRED(z%))*largeur_caractere|+marge_gauche_pixel&,ligne&*h auteur_caractere|+1,caractere$(ASC(MID$(texte$,z%,1))),mode| PUT x_texte%(colonne&+z%,ligne&),y_texte%(colonne&+z%,ligne&),caractere$(ASC (MID$(texte$,z%,1))),mode| NEXT z% RETURN ' ' PROCEDURE cprint(texte$,ligne&,mode|) ' ' !CENTRE UNE LIGNE D'APRES LE NOMBRE DE CARACTERE PAR COLONNE print(texte$,(max_colonnes|-LEN(texte$))/2,ligne&,mode|) RETURN PROCEDURE attente REPEAT !ON ATTEND QU'ON RELACHE TOUT UNTIL INKEY$="" AND MOUSEK=0 REPEAT UNTIL INKEY$<>"" OR MOUSEK<>0 !PUIS QU'ON ACTIVE LA SOURIS OU LE CLAVIER REPEAT UNTIL INKEY$="" AND MOUSEK=0 !PUIS QU'ON RELACHE TOUT A NOUVEAU RETURN PROCEDURE image(scene|) ' LOCAL fichier$,fichier_present! ' IF image_a_charger$(scene|)<>"" !LA SCENE CHARGE-T-ELLE UNE IMAGE? ' !ON CREE LE NOM DU FICHIER COMPLET D'ICELLE fichier$=UPPER$(image_a_charger$(scene|)) image_chargee!=TRUE !ON SAIT QU'ON PEUT CHARGER L'IMAGE scene_cache%=@cache(scene|) !ON VOIT SI ELLE EST PRESENTE DANS LE CACHE IF scene_cache%=0 !NON?? scene_cache%=@chargement_hard(fichier$) !ON CHARGE DANS LE CACHE ENDIF ' !ON MONTRE L'IMAGE DU CACHE affiche_image(adresse_cache%(scene_cache%),palette_cache$(scene_cache%),TRUE ) ELSE image_chargee!=FALSE !S'IL N'Y A PAS D'IMAGES ON EMPECHERA LE ENDIF !SWITCH MOYENNE/BASSE RESOLUTION (BOUTON DROIT) ' ' RETURN FUNCTION chargement_hard(fichier$) ' CLR nouveau_numero% FOR i%=nombre_cache% DOWNTO 1 !ON DOIT CHARGER L'IMAGE SUR LE IF numero_cache%(i%)=0 !DISQUE...ON CHERCHE L'ENDROIT OU LA nouveau_numero%=i% !CASER DANS LA MEMOIRE CACHE ENDIF NEXT i% ' IF nouveau_numero%=0 !SI PAS D'ENDROIT VIDE, ON PREND UN nouveau_numero%=RAND(nombre_cache%)+1 !EMPLACEMENT AU HASARD ENDIF ' charge_image(fichier$) !ON CHARGE L'IMAGE... noircit_ecran !ON MASQUE L'ECRAN image_ecran(adresse_image%) !ON L'AFFICHE... (SANS MONTRER LA PALETTE) ' numero_cache%(nouveau_numero%)=scene| !ET ON MEMORISE TOUT CA DANS ' SGET image_cache$(nouveau_numero%) !LE FICHIER "CACHE" BMOVE XBIOS(2),adresse_cache%(nouveau_numero%),taille_image% palette_cache$(nouveau_numero%)=palette$ !AINSI QUE LA PALETTE ' RETURN nouveau_numero% !ON RENVOIT LE NUMERO DANS LEQUEL SE TROUVE L'IMAGE ' ENDFUNC PROCEDURE affiche_image(adresse_image%,palette$,fondu!) ~FRE(1) IF image_chargee!=TRUE !SI IL Y A UNE IMAGE A MONTRER... HIDEM !ON CACHE LA SOURIS noircit_ecran ~XBIOS(5,L:-1,L:-1,0) !ON PASSE EN BASSE RESOLUTION noircit_ecran BMOVE adresse_image%,XBIOS(2),taille_image% IF fondu!=FALSE palette(palette$) ELSE fadein(palette$) !ON FAIT APPARAITRE L'IMAGE ENDIF attente !ON ATTEND.... noircit_ecran ~XBIOS(5,L:-1,L:-1,1) !ON REPASSE EN MOYENNE RESOLUTION SHOWM !ON MONTRE LA SOURIS IF fondu!=FALSE palette_texte ELSE ' noircit_ecran ENDIF ENDIF RETURN PROCEDURE charge_image(fichier$) adresse_image%=MALLOC(32066) !BUFFER DE LA TAILLE D'UNE IMAGE DEGAS PI1 BLOAD fichier$,adresse_image% !ON LA CHARGE (DECOMPACTAGE AUTOMATIQUE) palette$=SPACE$(32) !ET ON CAPTURE LA PALETTE AU DEBUT BMOVE adresse_image%+2,VARPTR(palette$),32 RETURN PROCEDURE image_ecran(adresse_image%) ' ' ON DEPLACE L'IMAGE (SANS LA PALETTE) DANS LA MEMOIRE ECRAN BMOVE adresse_image%+34,XBIOS(3),taille_image% ~MFREE(adresse_image%) !ET ON LIBERE LE BUFFER PROVISOIRE RETURN ' PROCEDURE fadein(palette2$) LOCAL i%,j%,pas,p% DIM depart(16,3),arrivee%(16,3),increment(16,3) FOR i%=1 TO 16 couleur$=RIGHT$("00"+HEX$(DPEEK(VARPTR(palette2$)-2+2*i%)),3) FOR j%=1 TO 3 arrivee%(i%,j%)=VAL(MID$(couleur$,j%,1)) NEXT j% NEXT i% ' pas=15 FOR i%=1 TO 16 FOR j%=1 TO 3 increment(i%,j%)=arrivee%(i%,j%)/pas NEXT j% NEXT i% ' FOR p%=1 TO pas VSYNC FOR i%=1 TO 16 SETCOLOR i%-1,depart(i%,1),depart(i%,2),depart(i%,3) NEXT i% FOR i%=1 TO 16 FOR j%=1 TO 3 ADD depart(i%,j%),increment(i%,j%) NEXT j% NEXT i% NEXT p% palette(palette$) ERASE depart(),arrivee%(),increment() ' RETURN PROCEDURE fadeout(palette2$) LOCAL i%,j%,pas,p% DIM depart(16,3),arrivee%(16,3),increment(16,3) FOR i%=1 TO 16 couleur$=RIGHT$("00"+HEX$(DPEEK(VARPTR(palette2$)-2+2*i%)),3) FOR j%=1 TO 3 depart(i%,j%)=VAL(MID$(couleur$,j%,1)) NEXT j% NEXT i% ' pas=15 FOR i%=1 TO 16 FOR j%=1 TO 3 increment(i%,j%)=depart(i%,j%)/pas NEXT j% NEXT i% ' FOR p%=1 TO pas VSYNC FOR i%=1 TO 16 SETCOLOR i%-1,depart(i%,1),depart(i%,2),depart(i%,3) NEXT i% FOR i%=1 TO 16 FOR j%=1 TO 3 SUB depart(i%,j%),increment(i%,j%) NEXT j% NEXT i% NEXT p% noircit_ecran ERASE depart(),arrivee%(),increment() ' RETURN PROCEDURE fadein_mid LOCAL i%,j%,pas,p% !ON FAIT UN FADE IN DIM depart(4,3),arrivee%(4,3),increment(4,3) !EN MOYENNE RESOLUTION arrivee%(1,1)=0 !(AFFICHAGE DU TEXTE) arrivee%(1,2)=0 arrivee%(1,3)=0 arrivee%(2,1)=rouge1|(scene_actuelle|) arrivee%(2,2)=vert1|(scene_actuelle|) arrivee%(2,3)=bleu1|(scene_actuelle|) arrivee%(3,1)=rouge2|(scene_actuelle|) arrivee%(3,2)=vert2|(scene_actuelle|) arrivee%(3,3)=bleu2|(scene_actuelle|) arrivee%(4,1)=7 arrivee%(4,2)=7 arrivee%(4,3)=7 ' pas=15 FOR i%=1 TO 4 FOR j%=1 TO 3 increment(i%,j%)=arrivee%(i%,j%)/pas NEXT j% NEXT i% ' FOR p%=1 TO pas VSYNC FOR i%=1 TO 4 SETCOLOR i%-1,depart(i%,1),depart(i%,2),depart(i%,3) NEXT i% FOR i%=1 TO 4 FOR j%=1 TO 3 ADD depart(i%,j%),increment(i%,j%) NEXT j% NEXT i% NEXT p% palette_texte ERASE depart(),arrivee%(),increment() ' RETURN PROCEDURE fadeout_mid LOCAL i%,j%,pas,p% DIM depart(4,3),arrivee%(4,3),increment(4,3) depart(1,1)=0 depart(1,2)=0 depart(1,3)=0 depart(2,1)=rouge1|(scene_actuelle|) depart(2,2)=vert1|(scene_actuelle|) depart(2,3)=bleu1|(scene_actuelle|) depart(3,1)=rouge2|(scene_actuelle|) depart(3,2)=vert2|(scene_actuelle|) depart(3,3)=bleu2|(scene_actuelle|) depart(4,1)=7 depart(4,2)=7 depart(4,3)=7 ' pas=15 FOR i%=1 TO 4 FOR j%=1 TO 3 increment(i%,j%)=depart(i%,j%)/pas NEXT j% NEXT i% ' FOR p%=1 TO pas VSYNC FOR i%=1 TO 4 SETCOLOR i%-1,depart(i%,1),depart(i%,2),depart(i%,3) NEXT i% FOR i%=1 TO 4 FOR j%=1 TO 3 SUB depart(i%,j%),increment(i%,j%) NEXT j% NEXT i% NEXT p% noircit_ecran ERASE depart(),arrivee%(),increment() ' RETURN PROCEDURE palette_texte SETCOLOR 0,0,0,0 !CONTOUR DE L'ECRAN EN NOIR SETCOLOR 3,7,7,7 !SOURIS ET TEXTE EN BLANC ' !FOND DU TEXTE D'UNE COULEUR SPECIFIEE SETCOLOR 1,rouge1|(scene_actuelle|),vert1|(scene_actuelle|),bleu1|(scene_actue lle|) SETCOLOR 2,rouge2|(scene_actuelle|),vert2|(scene_actuelle|),bleu2|(scene_actue lle|) RETURN PROCEDURE noircit_ecran LOCAL i|,noir$ noir$=STRING$(32,0) !ON REMPLIT LA PALETTE VSYNC !DE COULEURS NOIRES ~XBIOS(6,L:VARPTR(noir$)) RETURN PROCEDURE palette(palette$) ~XBIOS(6,L:VARPTR(palette$)) !ON VALIDE LA PALETTE RETURN ' PROCEDURE help LOCAL clavier$,clavier|,chaine$,a$,i%,j%,texte2$,mot$ ~FRE(1) HIDEM GRAPHMODE 1 !ON SE REPLACE EN MODE NORMAL BMOVE XBIOS(2),ecran_texte%,taille_image% !ON MEMORISE L'ECRAN DE TEXTE PRECE DENT DEFFILL 1,2,8 !ON DEFINIT LE MOTIF PLEIN PRBOX 125,5,515,195 !ON TRACE UNE BOITE BLANCHE AU MILIEU DE L'ECRAN COLOR 0 !AINSI QUE DES CONTOURS NOIRS DEFLINE 1,4 RBOX 125,5,515,195 ' SELECT aventure| CASE 1 cprint("1. "+CHR$(34)+" Heurts d'ouverture "+CHR$(34),3,4) cprint("- Fran‡ois Coulon et Sylvie Sarrat -",5,4) CASE 2 cprint("2. "+CHR$(34)+" Cheek to cheek & ashes to ashes "+CHR$(34),3,4) cprint("- Fran‡ois Coulon et Faustino Ribeiro -",5,4) CASE 3 cprint("3. "+CHR$(34)+" Un appel … la m‚moire "+CHR$(34),3,4) cprint("- Fran‡ois Coulon et Laurent Cotton -",5,4) ENDSELECT cprint("Shift + F1 … F3 : sauver la situation",8,4) cprint("F1 … F3 : recharger une situation",10,4) cprint("Undo : retour au d‚but de l'aventure",12,4) cprint("Esc: retour au menu",14,4) cprint("Toute autre touche : retour … l'aventure",16,4) ' REPEAT !ON ATTEND UNE TOUCHE clavier$=INKEY$ UNTIL clavier$<>"" clavier|=ASC(RIGHT$(clavier$,1)) !ON EN REGARDE LE CODE ASCII ' SELECT clavier| CASE 97 !ON A TAPE SUR UNDO? undo!=TRUE !ON MARQUE L'INDICATEUR POUR SORTIR DE LA BOUCLE debut_aventure !ET ON REVIENT AU DEBUT DE LA MEME AVENTURE ' CASE 84,85,86 !SHIFT F1 F2 F3? CLR chaine$ !ON VIDE LA CHAINE FOR i%=1 TO nombre_scenes| !ON REGARDE TOUTES LES SCENES... IF scene_visitee!(i%)=TRUE !ET ON AJOUTE 1 OU 0 A LA FIN DE LA CHAINE chaine$=chaine$+"1" !SI LA SCENE EST VISITEE OU PAS ELSE chaine$=chaine$+"0" ENDIF NEXT i% ' ' !ON CREE UN FICHIER 11.SAV 12.SAV OU 13.SAV fichier$=STR$(aventure|)+STR$(clavier|-83)+".sav" OPEN "o",#1,fichier$ !ON SAUVE LE NUMERO DE LE SCENE ACTUELLE PRINT #1;scene_actuelle| PRINT #1;chaine$ !ET LES INDICATEURS CLOSE !ON FERME TOUT BMOVE ecran_texte%,XBIOS(2),taille_image% !ON RETABLIT L'ECRAN D'AVANT ' CASE 59,60,61 !TOUCHES F1 F2 F3?? fichier$=STR$(aventure|)+STR$(clavier|-58)+".sav" IF EXIST(fichier$) fadeout_mid OPEN "I",#1,fichier$ INPUT #1;scene_actuelle| INPUT #1;chaine$ CLOSE FOR i%=1 TO nombre_scenes| a$=MID$(chaine$,i%,1) IF a$="1" scene_visitee!(i%)=TRUE ELSE scene_visitee!(i%)=FALSE ENDIF NEXT i% deplacement!=TRUE undo!=TRUE suite_forcee!=TRUE ENDIF BMOVE ecran_texte%,XBIOS(2),taille_image% ' CASE 27 !ON A TAPE SUR ESCAPE? undo!=TRUE !ON INDIQUE QU'IL FAUT REVENIR AU MENU deplacement!=TRUE escape!=TRUE fadeout_mid ' DEFAULT BMOVE ecran_texte%,XBIOS(2),taille_image% !ON REAFFICHE L'ECRAN ORIGINAL ENDSELECT ' SHOWM !ET ON RETABLIT LA SOURIS ~FRE(1) RETURN PROCEDURE mots_clicables(texte$) LOCAL pointeur_mot%,i%,texte2$,mot$,condition&,affichage! CLR mot$,pointeur_mot%,affichage!,texte2$ ' texte2$=UPPER$(texte$) !ON RECHERCHE SUR LE TEXTE EN MAJUSCULES FOR i%=1 TO pointeur_mots|(scene_actuelle|) !ON SCANNE TOUTES LES COMMANDES mot$=fonction_mot$(scene_actuelle|,i%) mot2$=UPPER$(mot$) !ON CONVERTI EN MAJUSCULE REPEAT ' !ON REPERE L'ENDROIT OU SE TROUVE LE MOT DANS LE TEXTE: pointeur_mot%=INSTR(texte2$,mot2$,pointeur_mot%) ' !ON VERIFIE SI C'EST BIEN UN MOT ISOL: IF INSTR(alphabet$,UPPER$(MID$(texte$,pointeur_mot%-1,1)),1)=0 AND INSTR(a lphabet$,UPPER$(MID$(texte$,pointeur_mot%+LEN(mot$),1)))=0 affichage!=TRUE !SI OUI ON SORTIRA DE LA BOUCLE ' !LE MOT EXISTE, MAIS EST-IL CLICABLE POUR LE MOMENT?: condition&=condition&(scene_actuelle|,i%) IF (condition&>0 AND scene_visitee!(ABS(condition&))=TRUE) OR (condition &<0 AND scene_visitee!(ABS(-condition&))=FALSE) ' !OUI? ALORS ON SURLIGNE EFFECTIVEMENT LE MOT: surligner_mot(texte$,MID$(texte$,pointeur_mot%,LEN(mot$)),pointeur_mot %,1) ENDIF ' ENDIF INC pointeur_mot% !SI LE MOT N'EST PAS ISOLE (EX="CLIC" et "CLICABLE") ON CONTINUE LA RECHERCHE UNTIL affichage!=TRUE !SI LE MOT A ETE SURLIGNE (OU DU MOINS QU'IL EXISTE) CLR pointeur_mot%,affichage! !ON SORT... NEXT i% RETURN FUNCTION cache(numero_image%) ' LOCAL i% CLR cache_affiche% ' FOR i%=1 TO nombre_cache% !ON RECHECHE SI L'IMAGE EST DEJA IF numero_image%=numero_cache%(i%) !STOCKE DANS LA MMOIRE CACHE cache_affiche%=i% !SI OUI ON RETOURNE LE NUMERO (SINON 0) ENDIF NEXT i% ' RETURN cache_affiche% ' ENDFUNC ' PROCEDURE musique(module$) ' IF ste! musique!=TRUE ' fichier$="dma.bin" dma%=MALLOC(21144) !TAILLE DECOMPACTEE DE LA ROUTINE BLOAD fichier$,dma% ' module%=MALLOC(76000) !TAILLE MAXI D'UNE MUSIQUE BLOAD module$,module% ' ' ParamŠtrage du DMA STE ' VOID C:dma%(W:0,W:1) ! sauve l'etat du DMA VOID C:dma%(W:1,W:0,W:40) ! Master Volume VOID C:dma%(W:1,W:1,W:20) ! Volume droite VOID C:dma%(W:1,W:2,W:20) ! Volume gauche VOID C:dma%(W:1,W:3,W:6) ! Tonalit‚ Graves VOID C:dma%(W:1,W:4,W:6) ! Tonalit‚ Aigus VOID C:dma%(W:3,W:1,L:module%) ! Lance le module ' ELSE !SI C'EST UN STF ' fichier$="users.bin" tracker%=MALLOC(42000) !TAILLE DE LA ROUTINE DECOMPACTEE BLOAD fichier$,tracker% ' module%=MALLOC(76000) BLOAD module$,module% ' volume%=GEMDOS(72,L:18000) ! On reserve pour la table de volume output%=&H1 ! sortie STF ETENDU ' VOID C:tracker%(L:module%,W:output%,L:volume%) ! Appel du Player ' VOID GEMDOS(73,L:module%) ! Libere la m‚moire VOID GEMDOS(73,L:tracker%) VOID GEMDOS(73,L:volume%) ENDIF ' RETURN PROCEDURE fin_musique ' IF ste! AND musique!=TRUE !SI ON EST SUR STE ET SI UNE MUSIQUE EST JOUEE VOID C:dma%(W:3,W:0) ! stoppe le module VOID C:dma%(W:0,W:2) ! Restaure l'etat du DMA ~MFREE(module%) ~MFREE(dma%) musique!=FALSE ENDIF ' RETURN ' ' Ajouter un ‚cran cach‚ (si on reste plus de dix minutes sur la musique) ' NE PAS COMPACTER LE PROGRAMME ' COMPACTER LES IMAGES AVEC ATOMIK 3.5 ' DOC:- NOM DE L'ACHETEUR PLUSIEURS FOIS DANS LE JEU ' - POSSIBILIT D'ACHAT D'AUTRES EXEMPLAIRES A PRIX REDUIT ' altair et esat software ds la doc