From d52d99b674918314536a568a32e5bd8a95a194a0 Mon Sep 17 00:00:00 2001 From: Bradley Bell Date: Tue, 25 Mar 2003 08:19:12 +0000 Subject: [PATCH] ability to load exit model bitmaps (or any bitmap, really) from d1 pig file --- ChangeLog | 6 +++ main/bm.c | 67 +++++++++++++++++++--------- main/bm.h | 3 +- main/endlevel.c | 4 +- main/piggy.c | 115 +++++++++++++++++++++++++++++++++++++++++++++++- main/piggy.h | 7 ++- 6 files changed, 173 insertions(+), 29 deletions(-) diff --git a/ChangeLog b/ChangeLog index a2a8baad..1c1961f0 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2003-03-25 Bradley Bell + + * main/bm.c, main/bm.h, main/endlevel.c, main/piggy.c, + main/piggy.h: ability to load exit model bitmaps (or any bitmap, + really) from d1 pig file + 2003-03-23 Bradley Bell * main/bm.c: stop extra robots from overwriting exit models diff --git a/main/bm.c b/main/bm.c index 555068ca..c3a0d210 100644 --- a/main/bm.c +++ b/main/bm.c @@ -1,4 +1,4 @@ -/* $Id: bm.c,v 1.26 2003-03-24 00:14:07 btb Exp $ */ +/* $Id: bm.c,v 1.27 2003-03-25 08:19:12 btb Exp $ */ /* THE COMPUTER CODE CONTAINED HEREIN IS THE SOLE PROPERTY OF PARALLAX SOFTWARE CORPORATION ("PARALLAX"). PARALLAX, IN DISTRIBUTING THE CODE TO @@ -16,6 +16,22 @@ COPYRIGHT 1993-1999 PARALLAX SOFTWARE CORPORATION. ALL RIGHTS RESERVED. * * Bitmap and palette loading functions. * + * Old Log: + * Revision 1.1 1995/05/16 15:23:08 allender + * Initial revision + * + * Revision 2.3 1995/03/14 16:22:04 john + * Added cdrom alternate directory stuff. + * + * Revision 2.2 1995/03/07 16:51:48 john + * Fixed robots not moving without edtiro bug. + * + * Revision 2.1 1995/03/06 15:23:06 john + * New screen techniques. + * + * Revision 2.0 1995/02/27 11:27:05 john + * New version 2.0, which has no anonymous unions, builds with + * Watcom 10.0, and doesn't require parsing BITMAPS.TBL. * */ @@ -25,6 +41,7 @@ COPYRIGHT 1993-1999 PARALLAX SOFTWARE CORPORATION. ALL RIGHTS RESERVED. #include #include +#include #include "pstypes.h" #include "inferno.h" @@ -151,7 +168,8 @@ bitmap_index exitmodel_bm_load_sub( char * filename ) iff_error = iff_read_bitmap(filename,new,BM_LINEAR,newpal); new->bm_handle=0; if (iff_error != IFF_NO_ERROR) { - Error("Error loading exit model bitmap <%s> - IFF error: %s",filename,iff_errormsg(iff_error)); + con_printf(CON_DEBUG, "Error loading exit model bitmap <%s> - IFF error: %s\n", filename, iff_errormsg(iff_error)); + return bitmap_num; } if ( iff_has_transparency ) @@ -175,6 +193,17 @@ grs_bitmap *load_exit_model_bitmap(char *name) { ObjBitmaps[N_ObjBitmaps] = exitmodel_bm_load_sub(name); + + if (ObjBitmaps[N_ObjBitmaps].index == 0) + { + char *name2 = d_strdup(name); + *strrchr(name2, '.') = '\0'; + ObjBitmaps[N_ObjBitmaps] = read_extra_d1_bitmap(name2); + d_free(name2); + } + if (ObjBitmaps[N_ObjBitmaps].index == 0) + return NULL; + if (GameBitmaps[ObjBitmaps[N_ObjBitmaps].index].bm_w!=64 || GameBitmaps[ObjBitmaps[N_ObjBitmaps].index].bm_h!=64) Error("Bitmap <%s> is not 64x64",name); ObjBitmapPtrs[N_ObjBitmaps] = N_ObjBitmaps; @@ -185,7 +214,7 @@ grs_bitmap *load_exit_model_bitmap(char *name) } void -free_exit_model_data() +bm_free_extra_bitmaps() { int i; @@ -204,31 +233,25 @@ int load_exit_models() CFILE *exit_hamfile; int start_num; - if (!cfexist("steel1.bbm") || - !cfexist("rbot061.bbm") || - !cfexist("rbot062.bbm") || - !cfexist("rbot063.bbm")) { + start_num = N_ObjBitmaps; + extra_bitmap_num = Num_bitmap_files; + if (!load_exit_model_bitmap("steel1.bbm") || + !load_exit_model_bitmap("rbot061.bbm") || + !load_exit_model_bitmap("rbot062.bbm") || + !load_exit_model_bitmap("steel1.bbm") || + !load_exit_model_bitmap("rbot061.bbm") || + !load_exit_model_bitmap("rbot063.bbm")) + { Warning("Can't load exit models!\n"); return 0; } - start_num = N_ObjBitmaps; - extra_bitmap_num = Num_bitmap_files; - load_exit_model_bitmap("steel1.bbm"); - load_exit_model_bitmap("rbot061.bbm"); - load_exit_model_bitmap("rbot062.bbm"); - - load_exit_model_bitmap("steel1.bbm"); - load_exit_model_bitmap("rbot061.bbm"); - load_exit_model_bitmap("rbot063.bbm"); - - if (cfexist("exit.ham")) { #ifndef MACINTOSH - exit_hamfile = cfopen("exit.ham","rb"); + exit_hamfile = cfopen("exit.ham","rb"); #else - exit_hamfile = cfopen(":Data:exit.ham","rb"); + exit_hamfile = cfopen(":Data:exit.ham","rb"); #endif - + if (exit_hamfile) { polymodel_read(&Polygon_models[exit_modelnum], exit_hamfile); polymodel_read(&Polygon_models[destroyed_exit_modelnum], exit_hamfile); Polygon_models[exit_modelnum].first_texture = start_num; @@ -255,6 +278,8 @@ int load_exit_models() return 0; } + atexit(bm_free_extra_bitmaps); + return 1; } diff --git a/main/bm.h b/main/bm.h index 72fa9365..920ce7be 100644 --- a/main/bm.h +++ b/main/bm.h @@ -1,4 +1,4 @@ -/* $Id: bm.h,v 1.8 2003-03-19 22:44:15 btb Exp $ */ +/* $Id: bm.h,v 1.9 2003-03-25 08:19:12 btb Exp $ */ /* THE COMPUTER CODE CONTAINED HEREIN IS THE SOLE PROPERTY OF PARALLAX SOFTWARE CORPORATION ("PARALLAX"). PARALLAX, IN DISTRIBUTING THE CODE TO @@ -100,6 +100,5 @@ extern void bm_read_all_d1(CFILE * fp); extern void undo_bm_read_all_d1(void); int load_exit_models(); -void free_exit_model_data(); #endif /* _BM_H */ diff --git a/main/endlevel.c b/main/endlevel.c index 0f9f29a3..82ec24fa 100644 --- a/main/endlevel.c +++ b/main/endlevel.c @@ -17,7 +17,7 @@ COPYRIGHT 1993-1999 PARALLAX SOFTWARE CORPORATION. ALL RIGHTS RESERVED. #endif #ifdef RCS -static char rcsid[] = "$Id: endlevel.c,v 1.11 2003-02-21 07:14:32 btb Exp $"; +static char rcsid[] = "$Id: endlevel.c,v 1.12 2003-03-25 08:19:12 btb Exp $"; #endif //#define SLEW_ON 1 @@ -257,8 +257,6 @@ free_endlevel_data() if (satellite_bm_instance.bm_data) d_free(satellite_bm_instance.bm_data); - - free_exit_model_data(); } void init_endlevel() diff --git a/main/piggy.c b/main/piggy.c index bd4f7b09..4e5d75c9 100644 --- a/main/piggy.c +++ b/main/piggy.c @@ -1,4 +1,4 @@ -/* $Id: piggy.c,v 1.26 2003-03-22 03:19:50 btb Exp $ */ +/* $Id: piggy.c,v 1.27 2003-03-25 08:19:12 btb Exp $ */ /* THE COMPUTER CODE CONTAINED HEREIN IS THE SOLE PROPERTY OF PARALLAX SOFTWARE CORPORATION ("PARALLAX"). PARALLAX, IN DISTRIBUTING THE CODE TO @@ -386,7 +386,7 @@ COPYRIGHT 1993-1999 PARALLAX SOFTWARE CORPORATION. ALL RIGHTS RESERVED. #endif #ifdef RCS -static char rcsid[] = "$Id: piggy.c,v 1.26 2003-03-22 03:19:50 btb Exp $"; +static char rcsid[] = "$Id: piggy.c,v 1.27 2003-03-25 08:19:12 btb Exp $"; #endif @@ -2366,6 +2366,117 @@ void load_d1_bitmap_replacements() } +extern int extra_bitmap_num; + +/* + * Find and load the named bitmap from descent.pig + * similar to exitmodel_bm_load_sub + */ +bitmap_index read_extra_d1_bitmap(char *name) +{ + bitmap_index bitmap_num; + grs_bitmap * new = &GameBitmaps[extra_bitmap_num]; + + bitmap_num.index = 0; + + { + CFILE *d1_Piggy_fp; + int i; + DiskBitmapHeader bmh; + int pig_data_start, bitmap_header_start, bitmap_data_start; + int N_bitmaps, zsize; + ubyte colormap[256]; + + d1_Piggy_fp = cfopen("descent.pig", "rb"); + if (!d1_Piggy_fp) + { + con_printf(CON_DEBUG, "could not open descent.pig\n", name); + return bitmap_num; + } + + // read d1 palette, build colormap + { + int freq[256]; + ubyte d1_palette[256*3]; + CFILE * palette_file = cfopen( "palette.256", "rb" ); + Assert( palette_file ); + Assert( cfilelength( palette_file ) == 9472 ); + cfread( d1_palette, 256, 3, palette_file); + cfclose( palette_file ); + build_colormap_good( d1_palette, colormap, freq ); + // don't change transparencies: + colormap[254] = 254; + colormap[255] = 255; + } + + pig_data_start = cfile_read_int(d1_Piggy_fp); + cfseek(d1_Piggy_fp, pig_data_start, SEEK_SET); + N_bitmaps = cfile_read_int(d1_Piggy_fp); + { + int N_sounds = cfile_read_int(d1_Piggy_fp); + int header_size = N_bitmaps * DISKBITMAPHEADER_D1_SIZE + + N_sounds * DISKSOUNDHEADER_SIZE; + bitmap_header_start = pig_data_start + 2 * sizeof(int); + bitmap_data_start = bitmap_header_start + header_size; + } + + for (i = 0; i < N_bitmaps; i++) + { + DiskBitmapHeader_d1_read(&bmh, d1_Piggy_fp); + if (!strnicmp(bmh.name, name, 8)) + break; + } + + Assert(!strnicmp(bmh.name, name, 8)); + + memset( new, 0, sizeof(grs_bitmap) ); + + new->bm_w = new->bm_rowsize = bmh.width + ((short) (bmh.wh_extra&0x0f)<<8); + new->bm_h = bmh.height + ((short) (bmh.wh_extra&0xf0)<<4); + new->avg_color = bmh.avg_color; + + if ( bmh.flags & BM_FLAG_TRANSPARENT ) + new->bm_flags |= BM_FLAG_TRANSPARENT; + if ( bmh.flags & BM_FLAG_SUPER_TRANSPARENT ) + new->bm_flags |= BM_FLAG_SUPER_TRANSPARENT; + if ( bmh.flags & BM_FLAG_NO_LIGHTING ) + new->bm_flags |= BM_FLAG_NO_LIGHTING; + if ( bmh.flags & BM_FLAG_RLE ) + new->bm_flags |= BM_FLAG_RLE; + if ( bmh.flags & BM_FLAG_RLE_BIG ) + new->bm_flags |= BM_FLAG_RLE_BIG; + + if ( bmh.flags & BM_FLAG_RLE ) + { + cfseek(d1_Piggy_fp, bitmap_data_start + bmh.offset, SEEK_SET); + zsize = cfile_read_int(d1_Piggy_fp); + } + else + zsize = new->bm_w * new->bm_h; + new->bm_data = d_malloc(zsize); + cfseek(d1_Piggy_fp, bitmap_data_start + bmh.offset, SEEK_SET); + cfread(new->bm_data, 1, zsize, d1_Piggy_fp); + + switch(cfilelength(d1_Piggy_fp)) { + case D1_MAC_PIGSIZE: + case D1_MAC_SHARE_PIGSIZE: + rle_swap_0_255(new); + } + rle_remap(new, colormap); + + cfclose(d1_Piggy_fp); + } + + new->avg_color = 0; //compute_average_pixel(new); + + bitmap_num.index = extra_bitmap_num; + + GameBitmaps[extra_bitmap_num++] = *new; + + return bitmap_num; +} + + #ifndef FAST_FILE_IO /* * reads a bitmap_index structure from a CFILE diff --git a/main/piggy.h b/main/piggy.h index 4d4f2de8..f5ca7332 100644 --- a/main/piggy.h +++ b/main/piggy.h @@ -1,4 +1,4 @@ -/* $Id: piggy.h,v 1.12 2003-03-22 03:14:31 btb Exp $ */ +/* $Id: piggy.h,v 1.13 2003-03-25 08:19:12 btb Exp $ */ /* THE COMPUTER CODE CONTAINED HEREIN IS THE SOLE PROPERTY OF PARALLAX SOFTWARE CORPORATION ("PARALLAX"). PARALLAX, IN DISTRIBUTING THE CODE TO @@ -153,4 +153,9 @@ void DiskSoundHeader_read(DiskSoundHeader *dsh, CFILE *fp); */ void DiskBitmapHeader_d1_read(DiskBitmapHeader *dbh, CFILE *fp); +/* + * Find and load the named bitmap from descent.pig + */ +bitmap_index read_extra_d1_bitmap(char *name); + #endif //_PIGGY_H -- 2.39.2