void piggy_dump_all() { int i, xlat_offset; PHYSFS_file * fp; #ifndef RELEASE PHYSFS_file * fp1; PHYSFS_file * fp2; #endif char * filename; int data_offset; int org_offset; DiskBitmapHeader bmh; DiskSoundHeader sndh; int header_offset; char subst_name[32]; #ifdef NO_DUMP_SOUNDS Num_sound_files = 0; Num_sound_files_new = 0; #endif // { // bitmap_index bi; // bi.index = 614; // PIGGY_PAGE_IN( bi ); // count_colors( bi.index, &GameBitmaps[bi.index] ); // key_getch(); // } // { // bitmap_index bi; // bi.index = 478; // PIGGY_PAGE_IN( bi ); // Int3(); // count_colors( bi.index, &GameBitmaps[bi.index] ); // key_getch(); // } // { // bitmap_index bi; // bi.index = 1398; // PIGGY_PAGE_IN( bi ); // count_colors( bi.index, &GameBitmaps[bi.index] ); // key_getch(); // } // { // bitmap_index bi; // bi.index = 642; // PIGGY_PAGE_IN( bi ); // count_colors( bi.index, &GameBitmaps[bi.index] ); // key_getch(); // } // { // bitmap_index bi; // bi.index = 529; // PIGGY_PAGE_IN( bi ); // count_colors( bi.index, &GameBitmaps[bi.index] ); // key_getch(); // } // exit(0); // if ((Num_bitmap_files_new == 0) && (Num_sound_files_new == 0) ) return; for (i=0; i < Num_bitmap_files; i++ ) { bitmap_index bi; bi.index = i; PIGGY_PAGE_IN( bi ); } piggy_close_file(); filename = SHAREPATH "descent.pig"; fp = PHYSFSX_openWriteBuffered( filename ); Assert( fp!=NULL ); #ifndef RELEASE fp1 = PHYSFSX_openWriteBuffered( "piggy.lst" ); fp2 = PHYSFSX_openWriteBuffered( "piggy.all" ); #endif i = 0; PHYSFS_write( fp, &i, sizeof(int), 1 ); bm_write_all(fp); xlat_offset = PHYSFS_tell(fp); PHYSFS_write( fp, GameBitmapXlat, sizeof(ushort)*MAX_BITMAP_FILES, 1 ); i = PHYSFS_tell(fp); PHYSFSX_fseek( fp, 0, SEEK_SET ); PHYSFS_write( fp, &i, sizeof(int), 1 ); PHYSFSX_fseek( fp, i, SEEK_SET ); Num_bitmap_files--; PHYSFS_write( fp, &Num_bitmap_files, sizeof(int), 1 ); Num_bitmap_files++; PHYSFS_write( fp, &Num_sound_files, sizeof(int), 1 ); header_offset = PHYSFS_tell(fp); header_offset += ((Num_bitmap_files-1)*sizeof(DiskBitmapHeader)) + (Num_sound_files*sizeof(DiskSoundHeader)); data_offset = header_offset; for (i=1; i < Num_bitmap_files; i++ ) { int *size; grs_bitmap *bmp; { char * p, *p1; p = strchr(AllBitmaps[i].name,'#'); if (p) { int n; p1 = p; p1++; n = atoi(p1); *p = 0; #ifndef RELEASE if (n==0) { PHYSFSX_printf( fp2, "%s.abm\n", AllBitmaps[i].name ); } #endif memcpy( bmh.name, AllBitmaps[i].name, 8 ); Assert( n <= 63 ); bmh.dflags = DBM_FLAG_ABM + n; *p = '#'; }else { #ifndef RELEASE PHYSFSX_printf( fp2, "%s.bbm\n", AllBitmaps[i].name ); #endif memcpy( bmh.name, AllBitmaps[i].name, 8 ); bmh.dflags = 0; } } bmp = &GameBitmaps[i]; Assert( !(bmp->bm_flags&BM_FLAG_PAGED_OUT) ); #ifndef RELEASE PHYSFSX_printf( fp1, "BMP: %s, size %d bytes", AllBitmaps[i].name, bmp->bm_rowsize * bmp->bm_h ); #endif org_offset = PHYSFS_tell(fp); bmh.offset = data_offset - header_offset; PHYSFSX_fseek( fp, data_offset, SEEK_SET ); if ( bmp->bm_flags & BM_FLAG_RLE ) { size = (int *)bmp->bm_data; PHYSFS_write( fp, bmp->bm_data, sizeof(ubyte), *size ); data_offset += *size; //bmh.data_length = *size; #ifndef RELEASE PHYSFSX_printf( fp1, ", and is already compressed to %d bytes.\n", *size ); #endif } else { PHYSFS_write( fp, bmp->bm_data, sizeof(ubyte), bmp->bm_rowsize * bmp->bm_h ); data_offset += bmp->bm_rowsize * bmp->bm_h; //bmh.data_length = bmp->bm_rowsize * bmp->bm_h; #ifndef RELEASE PHYSFSX_printf( fp1, ".\n" ); #endif } PHYSFSX_fseek( fp, org_offset, SEEK_SET ); if ( GameBitmaps[i].bm_w > 255 ) { Assert( GameBitmaps[i].bm_w < 512 ); bmh.width = GameBitmaps[i].bm_w - 256; bmh.dflags |= DBM_FLAG_LARGE; } else { bmh.width = GameBitmaps[i].bm_w; } Assert( GameBitmaps[i].bm_h < 256 ); bmh.height = GameBitmaps[i].bm_h; bmh.flags = GameBitmaps[i].bm_flags; if (piggy_is_substitutable_bitmap( AllBitmaps[i].name, subst_name )) { bitmap_index other_bitmap; other_bitmap = piggy_find_bitmap( subst_name ); GameBitmapXlat[i] = other_bitmap.index; bmh.flags |= BM_FLAG_PAGED_OUT; } else { #ifdef BUILD_PSX_DATA count_colors( i, &GameBitmaps[i] ); #endif bmh.flags &= ~BM_FLAG_PAGED_OUT; } bmh.avg_color=GameBitmaps[i].avg_color; PHYSFS_write( fp, &bmh, sizeof(DiskBitmapHeader), 1 ); // Mark as a bitmap } for (i=0; i < Num_sound_files; i++ ) { digi_sound *snd; snd = &GameSounds[i]; strcpy( sndh.name, AllSounds[i].name ); #ifdef ALLEGRO sndh.length = GameSounds[i].len; #else sndh.length = GameSounds[i].length; #endif sndh.offset = data_offset - header_offset; org_offset = PHYSFS_tell(fp); PHYSFSX_fseek( fp, data_offset, SEEK_SET ); sndh.data_length = sndh.length; PHYSFS_write( fp, snd->data, sizeof(ubyte), sndh.length ); data_offset += sndh.length; PHYSFSX_fseek( fp, org_offset, SEEK_SET ); PHYSFS_write( fp, &sndh, sizeof(DiskSoundHeader), 1 ); // Mark as a bitmap #ifndef RELEASE PHYSFSX_printf( fp1, "SND: %s, size %d bytes\n", AllSounds[i].name, sndh.length ); PHYSFSX_printf( fp2, "%s.raw\n", AllSounds[i].name ); #endif } PHYSFSX_fseek( fp, xlat_offset, SEEK_SET ); PHYSFS_write( fp, GameBitmapXlat, sizeof(ushort)*MAX_BITMAP_FILES, 1 ); PHYSFS_close(fp); #ifndef RELEASE PHYSFSX_printf( fp1, " Dumped %d assorted bitmaps.\n", Num_bitmap_files ); PHYSFSX_printf( fp1, " Dumped %d assorted sounds.\n", Num_sound_files ); PHYSFS_close(fp1); PHYSFS_close(fp2); #endif #ifdef BUILD_PSX_DATA fp = PHYSFSX_openWriteBuffered( "psx/descent.dat" ); PHYSFS_write( fp, &i, sizeof(int), 1 ); bm_write_all(fp); PHYSFS_write( fp, GameBitmapXlat, sizeof(ushort)*MAX_BITMAP_FILES, 1 ); PHYSFS_close(fp); #endif // Never allow the game to run after building pig. exit(0); }
void piggy_dump_all() { int i, xlat_offset; FILE * fp; #ifndef RELEASE FILE * fp1; FILE * fp2; #endif char * filename; int data_offset; int org_offset; DiskBitmapHeader bmh; DiskSoundHeader sndh; int header_offset; char subst_name[32]; #ifdef NO_DUMP_SOUNDS Num_sound_files = 0; Num_sound_files_new = 0; #endif // { // bitmap_index bi; // bi.index = 614; // PIGGY_PAGE_IN( bi ); // count_colors( bi.index, &GameBitmaps[bi.index] ); // key_getch(); // } // { // bitmap_index bi; // bi.index = 478; // PIGGY_PAGE_IN( bi ); // Int3(); // count_colors( bi.index, &GameBitmaps[bi.index] ); // key_getch(); // } // { // bitmap_index bi; // bi.index = 1398; // PIGGY_PAGE_IN( bi ); // count_colors( bi.index, &GameBitmaps[bi.index] ); // key_getch(); // } // { // bitmap_index bi; // bi.index = 642; // PIGGY_PAGE_IN( bi ); // count_colors( bi.index, &GameBitmaps[bi.index] ); // key_getch(); // } // { // bitmap_index bi; // bi.index = 529; // PIGGY_PAGE_IN( bi ); // count_colors( bi.index, &GameBitmaps[bi.index] ); // key_getch(); // } // exit(0); // if ((Num_bitmap_files_new == 0) && (Num_sound_files_new == 0) ) return; mprintf( (0, "Paging in all piggy bitmaps..." )); for (i=0; i < Num_bitmap_files; i++ ) { bitmap_index bi; bi.index = i; PIGGY_PAGE_IN( bi ); } mprintf( (0, "\n" )); piggy_close_file(); mprintf( (0, "Creating DESCENT.PIG..." )); filename = "DESCENT.PIG"; if ( (i=FindArg( "-piggy" )) ) { filename = Args[i+1]; mprintf( (0, "Dumping alternate pigfile, '%s'\n", filename )); } mprintf( (0, "\nDumping bitmaps..." )); fp = fopen( filename, "wb" ); Assert( fp!=NULL ); #ifndef RELEASE fp1 = fopen( "piggy.lst", "wt" ); fp2 = fopen( "piggy.all", "wt" ); #endif i = 0; fwrite( &i, sizeof(int), 1, fp ); bm_write_all(fp); xlat_offset = ftell(fp); fwrite( GameBitmapXlat, sizeof(ushort)*MAX_BITMAP_FILES, 1, fp ); i = ftell(fp); fseek( fp, 0, SEEK_SET ); fwrite( &i, sizeof(int), 1, fp ); fseek( fp, i, SEEK_SET ); Num_bitmap_files--; fwrite( &Num_bitmap_files, sizeof(int), 1, fp ); Num_bitmap_files++; fwrite( &Num_sound_files, sizeof(int), 1, fp ); header_offset = ftell(fp); header_offset += ((Num_bitmap_files-1)*sizeof(DiskBitmapHeader)) + (Num_sound_files*sizeof(DiskSoundHeader)); data_offset = header_offset; for (i=1; i < Num_bitmap_files; i++ ) { int *size; grs_bitmap *bmp; { char * p, *p1; p = strchr(AllBitmaps[i].name,'#'); if (p) { int n; p1 = p; p1++; n = atoi(p1); *p = 0; #ifndef RELEASE if (n==0) { fprintf( fp2, "%s.abm\n", AllBitmaps[i].name ); } #endif memcpy( bmh.name, AllBitmaps[i].name, 8 ); Assert( n <= 63 ); bmh.dflags = DBM_FLAG_ABM + n; *p = '#'; }else { #ifndef RELEASE fprintf( fp2, "%s.bbm\n", AllBitmaps[i].name ); #endif memcpy( bmh.name, AllBitmaps[i].name, 8 ); bmh.dflags = 0; } } bmp = &GameBitmaps[i]; Assert( !(bmp->bm_flags&BM_FLAG_PAGED_OUT) ); #ifndef RELEASE fprintf( fp1, "BMP: %s, size %d bytes", AllBitmaps[i].name, bmp->bm_rowsize * bmp->bm_h ); #endif org_offset = ftell(fp); bmh.offset = data_offset - header_offset; fseek( fp, data_offset, SEEK_SET ); if ( bmp->bm_flags & BM_FLAG_RLE ) { size = (int *)bmp->bm_data; fwrite( bmp->bm_data, sizeof(ubyte), *size, fp ); data_offset += *size; //bmh.data_length = *size; #ifndef RELEASE fprintf( fp1, ", and is already compressed to %d bytes.\n", *size ); #endif } else { fwrite( bmp->bm_data, sizeof(ubyte), bmp->bm_rowsize * bmp->bm_h, fp ); data_offset += bmp->bm_rowsize * bmp->bm_h; //bmh.data_length = bmp->bm_rowsize * bmp->bm_h; #ifndef RELEASE fprintf( fp1, ".\n" ); #endif } fseek( fp, org_offset, SEEK_SET ); if ( GameBitmaps[i].bm_w > 255 ) { Assert( GameBitmaps[i].bm_w < 512 ); bmh.width = GameBitmaps[i].bm_w - 256; bmh.dflags |= DBM_FLAG_LARGE; } else { bmh.width = GameBitmaps[i].bm_w; } Assert( GameBitmaps[i].bm_h < 256 ); bmh.height = GameBitmaps[i].bm_h; bmh.flags = GameBitmaps[i].bm_flags; if (piggy_is_substitutable_bitmap( AllBitmaps[i].name, subst_name )) { bitmap_index other_bitmap; other_bitmap = piggy_find_bitmap( subst_name ); GameBitmapXlat[i] = other_bitmap.index; bmh.flags |= BM_FLAG_PAGED_OUT; //mprintf(( 0, "Skipping bitmap %d\n", i )); //mprintf(( 0, "Marking '%s' as substitutible\n", AllBitmaps[i].name )); } else { #ifdef BUILD_PSX_DATA count_colors( i, &GameBitmaps[i] ); #endif bmh.flags &= ~BM_FLAG_PAGED_OUT; } bmh.avg_color=GameBitmaps[i].avg_color; fwrite( &bmh, sizeof(DiskBitmapHeader), 1, fp ); // Mark as a bitmap } mprintf( (0, "\nDumping sounds..." )); for (i=0; i < Num_sound_files; i++ ) { digi_sound *snd; snd = &GameSounds[i]; strcpy( sndh.name, AllSounds[i].name ); sndh.length = GameSounds[i].length; sndh.offset = data_offset - header_offset; org_offset = ftell(fp); fseek( fp, data_offset, SEEK_SET ); sndh.data_length = GameSounds[i].length; fwrite( snd->data, sizeof(ubyte), snd->length, fp ); data_offset += snd->length; fseek( fp, org_offset, SEEK_SET ); fwrite( &sndh, sizeof(DiskSoundHeader), 1, fp ); // Mark as a bitmap #ifndef RELEASE fprintf( fp1, "SND: %s, size %d bytes\n", AllSounds[i].name, snd->length ); fprintf( fp2, "%s.raw\n", AllSounds[i].name ); #endif } fseek( fp, xlat_offset, SEEK_SET ); fwrite( GameBitmapXlat, sizeof(ushort)*MAX_BITMAP_FILES, 1, fp ); fclose(fp); mprintf( (0, "\n" )); mprintf( (0, " Dumped %d assorted bitmaps.\n", Num_bitmap_files )); mprintf( (0, " Dumped %d assorted sounds.\n", Num_sound_files )); #ifndef RELEASE fprintf( fp1, " Dumped %d assorted bitmaps.\n", Num_bitmap_files ); fprintf( fp1, " Dumped %d assorted sounds.\n", Num_sound_files ); fclose(fp1); fclose(fp2); #endif #ifdef BUILD_PSX_DATA fp = fopen( "psx/descent.dat", "wb" ); fwrite( &i, sizeof(int), 1, fp ); bm_write_all(fp); fwrite( GameBitmapXlat, sizeof(ushort)*MAX_BITMAP_FILES, 1, fp ); fclose(fp); #endif // Never allow the game to run after building pig. exit(0); }