getport.c

Go to the documentation of this file.
00001 #include "Buzz_inc.h"
00002 
00003 struct FHead {
00004    char Text[28];  // File Copyright Notice
00005    long oMObj;   // Offset to MObj data table
00006    long oTab;    // Offset to Table of data
00007    long oPal;    // Offset to Palette
00008    long oPort;   // Offset to start of Port Images
00009    long oMse;    // Offset to Mouse Objects
00010    long oOut;    // Offset to port Outlines
00011    long oAnim;   // Offset to start of Port Anims
00012    } PHead;
00013 
00014 typedef struct cBoxx {
00015    i16 x1,y1,x2,y2;
00016    } BOUND;
00017 
00018 typedef struct Img {
00019    long Size;         // Size of Image (bytes)
00020    char Comp;         // Type of Compression Used
00021    i16 Width;         // Width of Image
00022    i16 Height;        // Height of Image
00023    i16 PlaceX;        // Where to Place Img:X
00024    i16 PlaceY;        // Where to Place Img:Y
00025    } IMG;
00026 
00027 typedef struct region {
00028    char qty;          // number of BOUNDS
00029    BOUND CD[4];       // boundry coords for mouse location
00030    char iNum;         // 
00031    char sNum;         // value for surround box
00032    char PreDraw;      // Code of Special to Draw first
00033    } REGION;
00034 
00035 
00036 typedef struct mobj
00037    {
00038    char Name[30];       // Name of region
00039    char qty;            // Nunber of regions
00040    char Help[3];       // Help Box Stuff
00041    REGION Reg[4];       // At Max 4 regions
00042    } MOBJ;
00043 
00044 #define S_QTY 43
00045 
00046 MOBJ MObj[35];
00047 
00048 long table[S_QTY];
00049 
00050 char pal[256 * 3];
00051 
00052 char inbuf[1000 * 1000];
00053 unsigned char outbuf[1000 * 1000];
00054 
00055 int insize;
00056 int outsize;
00057 
00058 int vflag;
00059 
00060 int
00061 RLED (void *src_raw, void *dest_raw, unsigned int src_size)
00062 {
00063     signed char *src = src_raw;
00064     signed char *dest = dest_raw;
00065     unsigned short used;
00066     short count, val;
00067     short i;
00068 
00069     used = 0;
00070     while (used < src_size) {
00071         count = src[used++];
00072         
00073         if (count < 0) {
00074             count = -(count - 1);
00075             val = src[used++];
00076             
00077             if (vflag)
00078                 printf ("%6d: repeat %02x\n", count, val&0xff);
00079 
00080             for (i = 0; i < count; i++)
00081                 *dest++ = val;
00082         } else {
00083             count++;
00084 
00085             if (vflag)
00086                 printf ("%6d:", count);
00087 
00088             for (i = 0; i < count; i++) {
00089                 if (vflag)
00090                     printf (" %02x", src[used] & 0xff);
00091                 *dest++ = src[used++];
00092             }
00093 
00094             if (vflag)
00095                 printf ("\n");
00096         }
00097     }
00098 
00099     return ((void *)dest - (void *)dest_raw);
00100 }
00101 
00102 
00103 void
00104 usage (void)
00105 {
00106     fprintf (stderr, "usage: getport idx\n");
00107     exit (1);
00108 }
00109 
00110 int width, height;
00111 
00112 IMG Img;
00113 
00114 unsigned char *screen;
00115 
00116 void
00117 write_ppm (char *filename, char unsigned *buf, int w, int h)
00118 {
00119     FILE *outf;
00120     int row, col;
00121     int pixel;
00122     unsigned char *cp;
00123 
00124     if ((outf = fopen (filename, "wb")) == NULL) {
00125         fprintf (stderr, "can't create %s\n", filename);
00126         exit (1);
00127     }
00128 
00129     fprintf (outf, "P6\n%d %d\n255\n", w, h);
00130 
00131     for (row = 0; row < h; row++) {
00132         for (col = 0; col < w; col++) {
00133             pixel = buf[row * w + col] & 0xff;
00134 
00135             cp = (unsigned char *)(&pal[pixel * 3]);
00136             putc (*cp++ * 4, outf);
00137             putc (*cp++ * 4, outf);
00138             putc (*cp++ * 4, outf);
00139         }
00140     }
00141 
00142     fclose (outf);
00143 }
00144 
00145 /* pace */
00146 long fix_width[] = {
00147     // normal
00148     80615, // 4/0 VAB in mode 0
00149     101712, // 8/1 Medical center
00150     115262, // 16/1 L.M. Program
00151     113283, // 18/1 XMS-2 program
00152     112708, // 19/1 Apollo program
00153     112154, // 20/1 Gemini program
00154     86035, // 22/1 Research and development
00155     118301, // 33/1 Tracking station
00156     82541, // 4/2 vab
00157     88992, // 22/2 research and development
00158     92114, // 22/3 research and development
00159 
00160     // predraw 
00161     79703, // 15-1-1 "SATELLITE PROGRAMS" 
00162     0
00163 };
00164 
00165 int
00166 need_to_fix_width (long table)
00167 {
00168     int i;
00169     for (i = 0; fix_width[i]; i++) {
00170         if (fix_width[i] == table)
00171             return (1);
00172     }
00173     return (0);
00174 }
00175 
00176 FILE *fin;
00177 
00178 void
00179 do_item (int fm, int idx, int predraw, long off)
00180 {
00181     char fname[1000];
00182 
00183     printf ("%02d-%d-%d \"%s\" off %ld\n", fm, idx, predraw, MObj[fm].Name, off);
00184 
00185     fseek (fin, off, SEEK_SET);
00186     fread (&Img, sizeof Img, 1, fin);
00187 
00188     if (need_to_fix_width (off))
00189         Img.Width++;
00190 
00191     fread (inbuf, Img.Size, 1, fin);
00192     RLED (inbuf, outbuf, Img.Size);
00193             
00194     sprintf (fname, "f%02d-%d-%d.ppm", fm, idx, predraw);
00195     write_ppm (fname, outbuf, Img.Width, Img.Height);
00196 }
00197 
00198 int
00199 main (int argc, char **argv)
00200 {
00201     int c;
00202     char *filename;
00203     int fm;
00204     int idx;
00205 
00206     filename = "/l/baris/gamedat/usa_port.dat";
00207     screen = (unsigned_char *)xmalloc(64 * 1024);
00208 
00209     while ((c = getopt (argc, argv, "vw:h:")) != EOF) {
00210         switch (c) {
00211         case 'w':
00212             width = atoi (optarg);
00213             break;
00214         case 'h':
00215             height = atoi (optarg);
00216             break;
00217         case 'v':
00218             vflag = 1;
00219             break;
00220         default:
00221             usage ();
00222         }
00223     }
00224 
00225     if (optind != argc)
00226         usage ();
00227 
00228     if ((fin = fopen (filename, "rb")) == NULL) {
00229         fprintf (stderr, "can't open %s\n", filename);
00230         exit (1);
00231     }
00232 
00233     fread(&PHead,sizeof PHead,1,fin);
00234     fread(&MObj[0],sizeof MObj,1,fin);
00235     fread(&table[0],sizeof table,1,fin);
00236     fseek(fin,PHead.oPal,SEEK_SET);
00237     fread(&pal[0],768,1,fin);
00238 
00239     fseek(fin,table[0],SEEK_SET);
00240     fread(&Img,sizeof Img,1,fin);  // Read in main image Header
00241     fread((char *)screen,Img.Size,1,fin);  // Read in main image
00242 
00243     write_ppm ("p.ppm", screen, 320, 200);
00244 
00245     for (fm=0;fm<35;fm++) {
00246         for (idx = 0; idx < 4; idx++) {
00247             if (MObj[fm].Reg[idx].PreDraw>0)   // PreDrawn Shape
00248                 do_item (fm, idx, 1, table[MObj[fm].Reg[idx].PreDraw]);
00249 
00250             if (MObj[fm].Reg[idx].iNum>0)   // Actual Shape
00251                 do_item(fm, idx, 0, table[MObj[fm].Reg[idx].iNum]);
00252             
00253         }
00254     }
00255 
00256     return (0);
00257 }
00258 

Generated on Fri Sep 28 00:35:45 2007 for raceintospace by  doxygen 1.5.3