ability to load exit model bitmaps (or any bitmap, really) from d1 pig file
authorBradley Bell <btb@icculus.org>
Tue, 25 Mar 2003 08:19:12 +0000 (08:19 +0000)
committerBradley Bell <btb@icculus.org>
Tue, 25 Mar 2003 08:19:12 +0000 (08:19 +0000)
ChangeLog
main/bm.c
main/bm.h
main/endlevel.c
main/piggy.c
main/piggy.h

index a2a8baa..1c1961f 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2003-03-25  Bradley Bell  <btb@icculus.org>
+
+       * 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  <btb@icculus.org>
 
        * main/bm.c: stop extra robots from overwriting exit models
index 555068c..c3a0d21 100644 (file)
--- 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 <stdio.h>
 #include <stdlib.h>
+#include <string.h>
 
 #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;
 }
 
index 72fa936..920ce7b 100644 (file)
--- 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 */
index 0f9f29a..82ec24f 100644 (file)
@@ -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()
index bd4f7b0..4e5d75c 100644 (file)
@@ -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
index 4d4f2de..f5ca733 100644 (file)
@@ -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