// ************************************************************** // * P L A Y F L A . C * // * (c) Adeline 1994 * // ************************************************************** #include "c_extern.h" typedef struct { ULONG SizeFile ; ULONG CompressedSizeFile ; WORD CompressMethod ; /* 0 stored */ /* 1 LZS */ } T_HEADER ; /*══════════════════════════════════════════════════════════════════════════* █▀▀▀█ █ █▀▀▀█ █ ▄▀ █▀▀▀▀ █ █▀▀▀█ ██▀▀▀ ██ ██▀▀█ ██▀ ██▀▀ ██ ██▀▀█ ▀▀ ▀▀▀▀▀ ▀▀ ▀ ▀▀ ▀▀ ▀▀▀▀▀ ▀▀ ▀ *══════════════════════════════════════════════════════════════════════════*/ /*──────────────────────────────────────────────────────────────────────────*/ /*──────────────────────────────────────────────────────────────────────────*/ #define FLI 2 #define FLA 3 #define X_POS_MENU_PRINCIPAL 480 #define Y_POS_MENU_PRINCIPAL 10 #define X_POS_MENU_STORYBOARD 0 #define Y_POS_MENU_STORYBOARD 335 // Define pour les fichiers format FLI #define FLI_COLOR 11 #define FLI_LC 12 #define FLI_BLACK 13 #define FLI_BRUN 15 #define FLI_COPY 16 // Structures utilisées pour les fichiers format FLI typedef struct { LONG size ; UWORD type ;/* = FLIH_MAGIC */ UWORD frame_count ; UWORD width ; UWORD height ; UWORD bits_a_pixel ; WORD flags ; WORD speed ; LONG next_head ; LONG frames_in_table ; WORD file ; LONG frame1_off ; LONG strokes ; LONG session ; BYTE reserved[88] ; } T_HEADER_FLI ; typedef struct { ULONG size ; UWORD typedata ; UBYTE image[] ; } T_HEADER_IMAGE ; typedef struct { ULONG offset ; UWORD signature ; UWORD nbpasse ; UBYTE reserved[6+2] ; } T_HEADER_SUB ; // Define pour les fichiers format FLA #define VERSION "V1.3" #define FLA_PALETTE 1 #define FLA_INFO 2 #define FLA_SAMPLE 3 #define FLA_SAMPLE_BALANCE 4 #define FLA_SAMPLE_STOP 5 #define FLA_LC 6 #define FLA_BLACK 7 #define FLA_BRUN 8 #define FLA_COPY 9 // Structures utilisées pour les fichiers format FLA typedef struct // entete de fichier FLA { char Version[5] ; ULONG NbFrame ; UBYTE CadenceAnimation; UWORD ResolutionX ; UWORD ResolutionY ; } T_HEADER_FLA; typedef struct // header de passe { UBYTE NbPasse ; ULONG OffsetFrameSuivante ; } T_HEADER_FLA_PASSE; typedef struct // structure d'un type de passe { UBYTE Type; UWORD OffsetPasseSuivante; } T_FLA_TYPE; typedef struct // structure d'un element d'une liste de son { WORD NbSample; WORD OffsetFrameOne; } T_FLA_SAMPLE_LIST; typedef struct // structure d'une info { WORD Info ; } T_FLA_INFO; typedef struct // structure d'un son { WORD Numero ; WORD Decalage; WORD Repetition; UBYTE Balance; UBYTE VolumeG; UBYTE VolumeD; } T_FLA_SAMPLE; typedef struct // structure d'un son { WORD Numero ; UBYTE Offset ; WORD Balance ; UBYTE VolumeG ; UBYTE VolumeD ; } T_FLA_BALANCE; typedef struct // structure d'arret de son { UWORD Numero ; } T_FLA_SAMPLE_STOP; typedef struct // structure d'une palette { UWORD NbCouleur; UWORD CouleurDepart; } T_FLA_PALETTE; /*──────────────────────────────────────────────────────────────────────────*/ UBYTE *BufferFrame ; //UBYTE TypeAnimCharge = FALSE ; UBYTE PaletteOrg[768] ; T_HEADER_FLA HeaderFla ; T_FLA_SAMPLE_LIST HeaderSampleListFla; T_HEADER_FLA_PASSE HeaderPasseFla ; T_FLA_SAMPLE HeaderSampleFlaNew; T_FLA_BALANCE HeaderBalanceFlaNew; T_FLA_SAMPLE_STOP HeaderSampleStopFlaNew; T_FLA_INFO HeaderInfo ; LONG HandleFla ; LONG DeltaX, DeltaY ; LONG MaxPass ; LONG MaxFrame ; ULONG NbTip ; WORD CouleurDepart ; WORD NombreDeCouleur ; ULONG ImageCadence = 12 ; //WORD Frame =0 ; //WORD ImageCourante = 0 ; //WORD ImageDebut = 0 ; //WORD ImageFin = 0 ; WORD FlagFirst = TRUE ; // ************************************************************************* // ************************************************************************** void ChangeBalance( WORD numsample, UBYTE offset, UBYTE volg, UBYTE vold ) { WORD i; BYTE flagtrouve = FALSE; #ifndef SAMPLE_FLA_HQR i = NbSampleJoue; while ( (i > 0) AND ( flagtrouve == FALSE) ) { if ( (PtrSampleJoue[i] & 0x0000ffff) == numsample ) { // Message( Itoa(PtrSampleJoue[i]), FALSE ); // Message( Itoa((LONG)volg), TRUE ); // Message( Itoa((LONG)vold), TRUE ); WaveChangeVolume( PtrSampleJoue[i], (ULONG)volg, (ULONG)vold ); flagtrouve = TRUE; } i--; } #endif } /*-------------------------------------------------------------------------*/ void LoadNextFrameFla() { Read( HandleFla, &HeaderPasseFla, sizeof( T_HEADER_FLA_PASSE)) ; MaxPass = HeaderPasseFla.NbPasse ;/* pti->nbpasse*/ // Texte pour le debug /* Box(10,420,500,450,0); AffString (10,420,"Structure entete de passe:"); Text (10,430,"header_passe.NbPasse=%L", HeaderPasseFla.NbPasse); Text (10,440,"header_passe.OffsetFrameSuivante=%L", HeaderPasseFla.OffsetFrameSuivante); CopyBlockPhys(10,420,500,450); */ Read( HandleFla, BufferFrame, HeaderPasseFla.OffsetFrameSuivante); } /*-------------------------------------------------------------------------*/ void DrawNextFrameFla() { T_FLA_TYPE header_type; T_FLA_PALETTE header_palette; UBYTE *ptr_buffer, *ptr_donnee; LONG i ; LONG compteur ; LoadNextFrameFla() ; ptr_buffer = BufferFrame; for ( i = 0 ; i < MaxPass ; i++ ) { header_type = *(T_FLA_TYPE *)ptr_buffer; ptr_buffer += sizeof(T_FLA_TYPE) ;/* Jump header type */ ptr_donnee = ptr_buffer ; switch( header_type.Type ) { case FLA_PALETTE: header_palette = *(T_FLA_PALETTE *)ptr_donnee; ptr_donnee += sizeof(T_FLA_PALETTE) ;/* Jump header type */ MovMem( ptr_donnee, PaletteOrg + header_palette.CouleurDepart * 3, header_palette.NbCouleur * 3 ); CouleurDepart = header_palette.CouleurDepart; NombreDeCouleur = header_palette.NbCouleur; break; case FLA_SAMPLE: HeaderSampleFlaNew = *(T_FLA_SAMPLE *)ptr_donnee; ptr_donnee += sizeof(T_FLA_SAMPLE) ;/* Jump header type */ if( SamplesEnable ) { HQ_MixSample( HeaderSampleFlaNew.Numero, HeaderSampleFlaNew.Decalage, HeaderSampleFlaNew.Repetition, HeaderSampleFlaNew.VolumeG, HeaderSampleFlaNew.VolumeD ); } break; case FLA_SAMPLE_BALANCE: HeaderBalanceFlaNew = *(T_FLA_BALANCE *)ptr_donnee; ptr_donnee += sizeof(T_FLA_BALANCE) ;/* Jump header type */ if( SamplesEnable ) { ChangeBalance( HeaderBalanceFlaNew.Numero, HeaderBalanceFlaNew.Offset, HeaderBalanceFlaNew.VolumeG, HeaderBalanceFlaNew.VolumeD ); } break; case FLA_SAMPLE_STOP: HeaderSampleStopFlaNew = *(T_FLA_SAMPLE_STOP *)ptr_donnee; ptr_donnee += sizeof(T_FLA_SAMPLE_STOP) ;/* Jump header type */ if ( SamplesEnable == TRUE ) { if ( HeaderSampleStopFlaNew.Numero == -1 ) { HQ_StopSample(); } else { HQ_StopOneSample ( HeaderSampleStopFlaNew.Numero ); } } break; case FLA_INFO: HeaderInfo = *(T_FLA_INFO *)ptr_donnee; ptr_donnee += sizeof(T_FLA_INFO) ;/* Jump header type */ switch( HeaderInfo.Info ) { case 1: // fla flute if( Midi_Driver_Enable ) { if( (26 != NumXmi) OR (!IsMidiPlaying()) ) { StopMusicMidi() ; PtrXmi = HQR_Get( HQR_Midi, 26 ) ; NumXmi = 26 ; PlayMidi( PtrXmi ) ; VolumeMidi( 100 ) ; } } break ; case 2: FadeToBlack( PaletteOrg ) ; break ; case 3: FlagFirst = TRUE ; break ; case 4: FadeMusicMidi( 1 ) ; break ; } break; case FLA_BLACK: BlackFrame() ; break ; case FLA_COPY: CopyFrame( ptr_donnee); break ; case FLA_BRUN: DrawFrame( ptr_donnee, 320, DeltaY ) ; break ; case FLA_LC: UpdateFrame( ptr_donnee, 320 ) ; break ; case FLI_COPY: CopyFrame( ptr_donnee ); break ; default: break ; } ptr_buffer += header_type.OffsetPasseSuivante ; } // fin boucle de passe } /*-------------------------------------------------------------------------*/ /* void SeekFla() { T_FLA_SAMPLE_LIST header_sample_list; Seek( HandleFla, sizeof(T_HEADER_FLA), SEEK_START ) ; Read( HandleFla, &HeaderSampleListFla, sizeof(T_FLA_SAMPLE_LIST)); Seek( HandleFla, HeaderSampleListFla.OffsetFrameOne, SEEK_CURRENT ); } */ /*-------------------------------------------------------------------------*/ WORD InitFla( char *name ) { char chaine[128] ; UBYTE *ptr_list_sample ; WORD i ; WORD numero_sample ; WORD nb_fois_joue ; LONG size ; BufferFrame = Screen ; // Malloc( 80000L ) For One Frame(image, couleur...) HandleFla = OpenRead( name ) ; #ifdef DEBUG_TOOLS if ( !HandleFla ) return(FALSE) ; // protect CD ? #endif #ifdef DEMO if ( !HandleFla ) return(FALSE) ; // protect CD ? #endif if( SamplesEnable ) { UBYTE string[256] ; strcpy( string, PathFla ) ; strcat( string, "FLASAMP.HQR" ) ; HQR_Change_Ressource( HQR_Samples, string ) ; } // lecture de l'entête principale Read( HandleFla, &HeaderFla, sizeof(T_HEADER_FLA)) ; MaxFrame = HeaderFla.NbFrame; DeltaX = HeaderFla.ResolutionX ; DeltaY = HeaderFla.ResolutionY ; ImageCadence = HeaderFla.CadenceAnimation; // lecture de la liste des samples Read( HandleFla, &HeaderSampleListFla, sizeof(T_FLA_SAMPLE_LIST)); for ( i = 0; i < HeaderSampleListFla.NbSample; i++ ) { Read( HandleFla, &numero_sample, sizeof(WORD)); Read( HandleFla, &nb_fois_joue, sizeof(WORD)); // preload samples (if enough space) // (but if not, stupid method. need to write the // list reversed) if( SamplesEnable ) { HQR_GetSample( HQR_Samples, numero_sample ) ; } } // texte de debug /* AffString (10,330,"Structure entete de fichier FLA:"); Text( 10,340,"HeaderFla.Version=%S", HeaderFla.Version ); Text( 10,350,"HeaderFla.NbFrame=%L", HeaderFla.NbFrame ); Text( 10,360,"HeaderFla.CadenceAnimation=%L", HeaderFla.CadenceAnimation ); Text( 10,370,"HeaderFla.ResolutionX=%L", HeaderFla.ResolutionX ); Text( 10,380,"HeaderFla.ResolutionY=%L", HeaderFla.ResolutionY ); Flip(); */ return TRUE ; } /*-------------------------------------------------------------------------*/ void ClearFla() { if( SamplesEnable ) { HQR_Change_Ressource( HQR_Samples, PATH_RESSOURCE"samples.hqr" ) ; } Close( HandleFla ) ; } /*--------------------- GESTION PALETTE PENDANT ANIM ----------------------*/ void GestionPalette() { WORD compteur; if( FlagFirst ) { FadeToPal( PaletteOrg ) ; NombreDeCouleur = 0 ; FlagFirst = FALSE ; } if ( NombreDeCouleur != 0 ) { if ( NombreDeCouleur == 256 ) { Palette( PaletteOrg ) ; } else { /* for ( compteur=0; compteur 32 ) n++ ; ptrd[-1] = 0 ; n++ ; if( !stricmp( name_anim, string ) ) { do { *ptrlist++ = atoi( ptrtxt ) ; nb++ ; while( *ptrtxt++ > 32 ) n++ ; n++ ; } while( *ptrtxt > 32 ) ; return nb ; } while( *ptrtxt++ >= 32 ) n++ ; n++ ; while( *ptrtxt++ < 32 ) n++ ; n++ ; ptrtxt-- ; } while( n < maxsize ) ; return 0 ; } /*──────────────────────────────────────────────────────────────────────────*/ void PlayDiskFla( UBYTE *name_anim ) { UBYTE *ptrtxt ; UBYTE string[256] ; LONG size,n, nb, timer ; UBYTE listindex[20] ; size = HQRM_Load( PATH_RESSOURCE"ress.hqr", RESS_FLA_PCX, &ptrtxt ) ; CHECK_MEMORY if( !ptrtxt ) { Message( "Not Enough Memory for fla_gif list", TRUE ) ; return ; } strcpy( string, name_anim ) ; CutPoint( string ) ; nb = SearchFla( string, ptrtxt, size, listindex ) ; if( !nb ) return ; // FadeToBlack( PtrPal ) ; for( n=0; n= nbbloc ) { Close( handle ) ; break ; } Seek( handle, listindex[n] * 4L, SEEK_START ) ; Read( handle, &seekindex, 4L ) ; Seek( handle, seekindex, SEEK_START ) ; Read( handle, &header, sizeof( header ) ) ; // methode de compression: stored // lit un gif normal Read_Gif( handle, Log, PalettePcx, BufSpeak ) ; Close( handle ) ; } break; } Flip() ; FadeToPal( PalettePcx ) ; timer = TimerRef + 4 * 50 ; while( TimerRef < timer ) if( Key == K_ESC ) break ; if( Key == K_ESC ) break ; FadeToBlack( PalettePcx ) ; } SetBlackPal() ; Cls() ; Flip() ; HQM_Free( ptrtxt ) ; } /*──────────────────────────────────────────────────────────────────────────*/