00001 #include "Buzz_inc.h"
00002
00003 struct FHead {
00004 char Text[28];
00005 long oMObj;
00006 long oTab;
00007 long oPal;
00008 long oPort;
00009 long oMse;
00010 long oOut;
00011 long oAnim;
00012 } PHead;
00013
00014 typedef struct cBoxx {
00015 i16 x1,y1,x2,y2;
00016 } BOUND;
00017
00018 typedef struct Img {
00019 long Size;
00020 char Comp;
00021 i16 Width;
00022 i16 Height;
00023 i16 PlaceX;
00024 i16 PlaceY;
00025 } IMG;
00026
00027 typedef struct region {
00028 char qty;
00029 BOUND CD[4];
00030 char iNum;
00031 char sNum;
00032 char PreDraw;
00033 } REGION;
00034
00035
00036 typedef struct mobj
00037 {
00038 char Name[30];
00039 char qty;
00040 char Help[3];
00041 REGION Reg[4];
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
00146 long fix_width[] = {
00147
00148 80615,
00149 101712,
00150 115262,
00151 113283,
00152 112708,
00153 112154,
00154 86035,
00155 118301,
00156 82541,
00157 88992,
00158 92114,
00159
00160
00161 79703,
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);
00241 fread((char *)screen,Img.Size,1,fin);
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)
00248 do_item (fm, idx, 1, table[MObj[fm].Reg[idx].PreDraw]);
00249
00250 if (MObj[fm].Reg[idx].iNum>0)
00251 do_item(fm, idx, 0, table[MObj[fm].Reg[idx].iNum]);
00252
00253 }
00254 }
00255
00256 return (0);
00257 }
00258