home *** CD-ROM | disk | FTP | other *** search
/ Fun CD 26 / OTACD26.ISO / archive / game / meltyss / meltyss.lzh / MELTYSS.C next >
C/C++ Source or Header  |  1997-07-07  |  10KB  |  393 lines

  1. /******************************
  2.  * メルティランサーBMP変換 *<<Saturn版>>
  3.  * Programmed By Melody-Yoshi *
  4.  ******************************/
  5. #include<stdio.h>
  6. #include<stdlib.h>
  7. #include<string.h>
  8. unsigned char *mem,*bz,tbl[2048],pal[512];
  9. FILE *fp,*fo;
  10. int xwide,ywide,xseek,xpad,bitcode,bitl;
  11. void conv08(char *,int,int,int),conv04(char *,int,int,int);
  12. void writelong(long),writeshort(short);
  13. void outpic(unsigned char *,int),outbmp(unsigned char *,int);
  14. void outbmp16(unsigned char *),reduce(unsigned char *,int);
  15. void wrtlen(int),bitwrite(int,int);
  16. short getshort(unsigned char *,int);
  17. int analyze(char *,int,int);
  18. int decode(void),getlong(unsigned char*,int);
  19. short getshort(unsigned char*,int);
  20. void main(int argc,char *argv[])
  21. {
  22.     char fn[48],fz[48];
  23.     int i,j,k,m,cnt;
  24.     if(argc<2){
  25.         printf("meltyss [file] [flag]\n   flag:b0|b1|p0|p1\n");exit(1);
  26.     }
  27.     m=0;strcpy(fn,argv[1]);
  28.     mem=(unsigned char *)malloc(0x30000);
  29.     bz=(unsigned char *)malloc(0x72000);
  30.     if(mem==NULL || bz==NULL){
  31.         printf("ナナ:「メモリが足りないわよっ!」\n");exit(1);
  32.     }
  33.     if(argc>2){
  34.         if(argv[2][0]=='p' || argv[2][0]=='P')m=2;
  35.         if(argv[2][1]=='1')m|=1;
  36.     }
  37.     for(i=0;fn[i];i++)if(fn[i]=='.')break;
  38.     fn[i]=0;strcpy(fz,fn);strcat(fz,".FAR");
  39.     if((fp=fopen(fz,"rb"))==0){
  40.         printf("file open error![%s]\n",fz);exit(1);
  41.     }
  42.     for(fz[i]=0;i>=0;i--)if(fz[i]=='\\' || fz[i]==':')break;
  43.     strcpy(fn,&fz[i+1]);fread(tbl,1,0x800,fp);
  44.     for(cnt=i=0;;i+=8,cnt++)if(tbl[i]==0 && tbl[i+1]==0 && tbl[i+2]==0 && tbl[i+3]==0)break;
  45.     for(i=k=0;i<cnt;i++){
  46.         j=getlong(tbl,i<<3)<<11;fseek(fp,(long)j,0);
  47.         j=getlong(tbl,(i<<3)+4);fread(mem,1,j,fp);
  48.         k=analyze(fn,k,m);
  49.     }
  50.     fclose(fp);exit(0);
  51. }
  52. int analyze(char *fn,int no,int flag)
  53. {
  54.     int adr,cnt,i,j,m,p;
  55.     char fz[48],fs[4];
  56.     m=decode();p=getshort(bz,6);
  57.     if(p!=256 && p!=16){
  58.         printf("アンジェラ、エラー見つけちゃったよぉ。\n");exit(1);
  59.     }
  60.     for(i=0;i<p*2;i++)pal[i]=bz[i+12];
  61.     if(strncmp((char *)bz,"SBMP",4)==0){
  62.         fs[0]=no/16+'0';if(fs[0]>'9')fs[0]+=7;
  63.         fs[1]=(no&15)+'0';if(fs[1]>'9')fs[1]+=7;
  64.         strcpy(fz,fn);strcat(fz,fs);
  65.         if(flag&2)strcat(fz,".PIC");
  66.         else strcat(fz,".BMP");
  67.         if((fo=fopen(fz,"wb"))==0){
  68.             printf("file create error![%s]\n",fz);exit(1);
  69.         }
  70.         xwide=getshort(bz,8);ywide=getshort(bz,10);
  71.         if(p==256)conv08(fn,no,flag,0x20C);
  72.         else if(p==16)conv04(fn,no,flag,0x2C);
  73.         fclose(fo);no++;
  74.     }
  75.     else if(strncmp((char *)bz,"SSP0",4)==0){
  76.         cnt=getshort(bz,8);
  77.         for(i=0,j=0x20C;i<cnt;i++,j+=8,no++){
  78.             fs[0]=no/16+'0';if(fs[0]>'9')fs[0]+=7;
  79.             fs[1]=(no&15)+'0';if(fs[1]>'9')fs[1]+=7;
  80.             strcpy(fz,fn);strcat(fz,fs);
  81.             if(flag&2)strcat(fz,".PIC");
  82.             else strcat(fz,".BMP");
  83.             if((fo=fopen(fz,"wb"))==0){
  84.                 printf("file create error![%s]\n",fz);exit(1);
  85.             }
  86.             xwide=getshort(bz,j);ywide=getshort(bz,j+2);
  87.             adr=getlong(bz,j+4);
  88.             if(p==256)conv08(fn,no,flag,adr);
  89.             else if(p==16)conv04(fn,no,flag,adr);
  90.             fclose(fo);
  91.         }
  92.     }
  93.     return(no);
  94. }
  95. int decode(void)
  96. {
  97.     int cnt,i,j,k,p,q,dl;
  98.     dl=(mem[0]<<16)|(mem[1]<<8)|mem[2];
  99.     for(p=6,q=k=0;q<dl;k>>=1){
  100.         if((k&0xFF00)==0)k=mem[p++]|0xFF00;
  101.         if((k&1)==0)bz[q++]=mem[p++];
  102.         else{
  103.             j=(mem[p]<<8)|mem[p+1];p+=2;
  104.             cnt=(j>>12)&15;if(cnt==15)cnt=mem[p++]+15;
  105.             cnt+=3;j=(j&0xFFF)+1;
  106.             for(i=0;i<cnt;i++,q++)bz[q]=bz[q-j];
  107.         }
  108.     }
  109.     return(q);
  110. }
  111. void reduce(unsigned char *b,int f)
  112. {
  113.     int i,j,m,r1,r2,b1,b2,g1,g2;
  114.     unsigned k;
  115.     m=xwide*ywide;i=m-2;
  116.     if(f==24){
  117.         for(j=(m+m+m)/2-3;i>=0;i-=2,j-=3){
  118.             m=b[i]<<1;k=pal[m+1]|(pal[m]<<8);
  119.             r1=(k&0x1F)<<3;g1=(k&0x3E0)>>2;b1=(k&0x7C00)>>7;
  120.             m=b[i+1]<<1;k=pal[m+1]|(pal[m]<<8);
  121.             r2=(k&0x1F)<<3;g2=(k&0x3E0)>>2;b2=(k&0x7C00)>>7;
  122.             b[j]=(b1+b2)/2;b[j+1]=(g1+g2)/2;b[j+2]=(r1+r2)/2;
  123.         }
  124.     }
  125.     else{
  126.         for(;i>=0;i-=2){
  127.             m=b[i]<<1;k=pal[m+1]|(pal[m]<<8);
  128.             r1=(k&0x1F)<<3;g1=(k&0x3E0)>>2;b1=(k&0x7C00)>>7;
  129.             m=b[i+1]<<1;k=pal[m+1]|(pal[m]<<8);
  130.             r2=(k&0x1F)<<3;g2=(k&0x3E0)>>2;b2=(k&0x7C00)>>7;
  131.             m=(((b1+b2)&0x1F0)<<6)|(((g1+g2)&0x1F0)<<1)|(((r1+r2)&0x1F0)>>4);
  132.             b[i]=m&255;b[i+1]=(m>>8);
  133.         }
  134.     }
  135.     xwide/=2;
  136. }
  137. void conv08(char *fn,int no,int flag,int adr)
  138. {
  139.     if(flag&2){    /* PIC */
  140.         if(flag&1){
  141.             reduce(&bz[adr],15);outpic(&bz[adr],15);
  142.         }
  143.         else outpic(&bz[adr],8);
  144.     }
  145.     else{        /* BMP */
  146.         if(flag&1){
  147.             reduce(&bz[adr],24);outbmp16(&bz[adr]);
  148.         }
  149.         else outbmp(&bz[adr],256);
  150.     }
  151. }
  152. void conv04(char *fn,int no,int flag,int adr)
  153. {
  154.     int i,j,k;
  155.     if(flag){
  156.         j=xwide*ywide;
  157.         for(j--,i=j*2;i>=0;i-=2,j--){
  158.             k=bz[j+adr];bz[i+adr]=k>>4;bz[i+adr+1]=k&15;
  159.         }
  160.         xwide<<=1;
  161.     }
  162.     if(flag&2){    /* PIC */
  163.         if(flag&1){
  164.             reduce(&bz[adr],15);outpic(&bz[adr],15);
  165.         }
  166.         else outpic(&bz[adr],8);
  167.     }
  168.     else{        /* BMP */
  169.         if(flag&1){
  170.             reduce(&bz[adr],24);outbmp16(&bz[adr]);
  171.         }
  172.         else outbmp(&bz[adr],16);
  173.     }
  174. }
  175. /* BMP-FILE OUTPUT */
  176. void outbmp(unsigned char *b,int c)
  177. {
  178.     int i;
  179.     unsigned short k;
  180.     xseek=xwide;xpad=(4-(xseek&3))&3;xseek+=xpad;
  181.     fputc('B',fo);fputc('M',fo);    /* ID */
  182.     writelong((long)c*4L+54L+(long)(xwide+xpad)*(long)ywide);    /* FILE SIZE */
  183.     writelong(0L);                    /* RESERVED */
  184.     writelong((long)c*4L+54L);        /* IMAGE OFFSET */
  185.     writelong(40L);                    /* INFO SIZE */
  186.     if(c==256)writelong((long)xwide);    /* dx */
  187.     else writelong((long)xwide*2L);    /* dx */
  188.     writelong((long)ywide);            /* dy */
  189.     writeshort(1);                    /* PLAIN */
  190.     if(c==256)writeshort(8);        /* DEPTH */
  191.     else writeshort(4);    
  192.     writelong(0L);                    /* COMPRESS TYPE */
  193.     writelong(0L);
  194.     writelong(0L);                    /* x per meter */
  195.     writelong(0L);                    /* y per meter */
  196.     writelong((long)c);                /* COLOR */
  197.     writelong(0L);
  198.     for(i=0;i<c;i++){
  199.         k=pal[i*2+1]+(pal[i*2]<<8);
  200.         fputc((k&0x7c00)>>7,fo);        /* BLUE */
  201.         fputc((k&0x3e0)>>2,fo);            /* GREEN */
  202.         fputc((k&0x1f)<<3,fo);            /* RED */
  203.         fputc(0,fo);
  204.     }
  205.     for(i=ywide-1;i>=0;i--){
  206.         fwrite(&b[i*xwide],1,xwide,fo);
  207.         for(k=0;k<xpad;k++)fputc(0,fo);
  208.     }
  209. }
  210. /* WRITE BMP 16*/
  211. void outbmp16(unsigned char *b)
  212. {
  213.     int ad,x,y;
  214.     unsigned short k;
  215.     xseek=xwide*3;xpad=(4-(xseek&3))&3;xseek+=xpad;
  216.     fputc('B',fo);fputc('M',fo);    /* ID */
  217.     writelong(54L+(long)xwide*(long)ywide*3L+(long)xpad*(long)ywide);    /* FILE SIZE */
  218.     writelong(0L);                    /* RESERVED */
  219.     writelong(54L);                    /* IMAGE OFFSET */
  220.     writelong(40L);                    /* INFO SIZE */
  221.     writelong((long)xwide);            /* dx */
  222.     writelong((long)ywide);            /* dy */
  223.     writeshort(1);                    /* PLAIN */
  224.     writeshort(24);                    /* DEPTH */
  225.     writelong(0L);                    /* COMPRESS TYPE */
  226.     writelong(0L);
  227.     writelong(0L);                    /* x per meter */
  228.     writelong(0L);                    /* y per meter */
  229.     writelong(0L);
  230.     writelong(0L);
  231.     for(y=ywide-1;y>=0;y--){
  232.         fwrite(&b[y*xwide*3],1,xwide*3,fo);
  233.         for(x=0;x<xpad;x++)fputc(0,fo);
  234.     }
  235. }
  236. /* PIC-FILE OUTPUT */
  237. void outpic(unsigned char *b,int cbit)
  238. {
  239.     int a,ad,c,d,i,p,x,y,xx,yy,r1,g1,b1;
  240.     struct{
  241.         int c,n,p;
  242.     }table[128];
  243.     if(cbit==8){
  244.         r1=xwide*ywide;
  245.         for(i=r1-1,p=r1+r1-2;i>=0;i--,p-=2){
  246.             c=b[i]<<1;b[p]=(c&256)>>8;b[p+1]=c&255;
  247.         }
  248.     }
  249.     else{
  250.         for(p=0;p<xwide*ywide*2;p+=2){
  251.             i=b[p]+(b[p+1]<<8);
  252.             r1=(i&0x1f)<<6;g1=(i&0x3E0)<<6;b1=(i&0x7C00)>>9;
  253.             i=g1|r1|b1;b[p]=i/256;b[p+1]=i&255;
  254.         }
  255.     }
  256.     bitl=bitcode=0;
  257.     for(i=0;i<128;i++){
  258.         table[i].c=0;table[i].p=i+1;table[i].n=i-1;
  259.     }
  260.     table[127].p=0;table[0].n=127;
  261.     fprintf(fo,"PIC/MM/XSS:");                    /* HEADER */
  262.     fputc(26,fo);fputc(0,fo);                    /* TEXT EOF */
  263.     fputc(0,fo);fputc(0,fo);                    /* MODE */
  264.     fputc(0,fo);fputc(cbit,fo);                    /* COLOR LENGTH */
  265.     fputc(xwide/256,fo);fputc(xwide&255,fo);    /* SIZE X */
  266.     fputc(ywide/256,fo);fputc(ywide&255,fo);    /* SIZE Y */
  267.     if(cbit==8){
  268.         for(i=0;i<256;i++){
  269.             r1=pal[(i<<1)+1]|(pal[i<<1]<<8);
  270.             b1=(r1&0x7C00)>>7;g1=(r1&0x3E0)>>2;r1=(r1&0x1F)<<3;
  271.             r1=(g1<<8)|(r1<<3)|(b1>>2);
  272.             fputc(r1/256,fo);fputc(r1&255,fo);
  273.         }
  274.     }
  275.     for(p=y=c=0;y<xwide*ywide*2;y+=2){
  276.         if((i=((b[y]<<8)|(b[y+1]))&0xFFFE)!=c){
  277.             c=i;b[y]=c>>8;b[y+1]=(c&255)|1;
  278.         }
  279.     }
  280.     for(i=y=0;y<ywide;y++){
  281.         for(ad=y*xwide*2,x=0;x<xwide;x++,ad+=2){
  282.             i++;
  283.             if((c=(b[ad]<<8)|(b[ad+1]))&1){
  284.                 wrtlen(i);
  285.                 if(cbit==8)bitwrite(8,c>>1);
  286.                 else{
  287.                     for(a=0;a<128;a++)if(table[a].c==(c&0xFFFE))break;
  288.                     if(a==128){
  289.                         p=table[p].p;table[p].c=c&0xFFFE;
  290.                     }
  291.                     else{
  292.                         if(p!=a){
  293.                             table[table[a].p].n=table[a].n;
  294.                             table[table[a].n].p=table[a].p;
  295.                             table[table[p].p].n=a;table[a].p=table[p].p;
  296.                             table[p].p=a;table[a].n=p;p=a;
  297.                         }
  298.                     }
  299.                     if(a!=128)bitwrite(8,a+128);
  300.                     else bitwrite(16,(unsigned)c/2);
  301.                 }
  302.                 for(a=0,xx=x,yy=y+1,r1=((y+1)*xwide+x)*2;yy<ywide;yy++,r1+=xwide*2){
  303.                     if(c==((b[r1]<<8)|(b[r1+1])))d=2;
  304.                     else{
  305.                         xx--;r1-=2;
  306.                         if(xx>=0 && c==((b[r1]<<8)|(b[r1+1])))d=1;
  307.                         else{
  308.                             xx+=2;r1+=4;
  309.                             if(xx<xwide && c==((b[r1]<<8)|(b[r1+1])))d=3;
  310.                             else{
  311.                                 xx-=3;r1-=6;
  312.                                 if(xx>=0 && c==((b[r1]<<8)|(b[r1+1])))d=4;
  313.                                 else{
  314.                                     xx+=4;r1+=8;
  315.                                     if(xx<xwide && c==((b[r1]<<8)|(b[r1+1])))d=5;
  316.                                     else break;
  317.                                 }
  318.                             }
  319.                         }
  320.                     }
  321.                     b[r1]=c>>8;b[r1+1]=c&0xFE;
  322.                     if(a==0)bitwrite(1,1);
  323.                     if(d==4)bitwrite(4,2);
  324.                     if(d==5)bitwrite(4,3);
  325.                     if(d<=3)bitwrite(2,d);
  326.                     a=1;
  327.                 }
  328.                 if(a==0)bitwrite(1,0);
  329.                 else bitwrite(3,0);
  330.                 b[ad]=c>>8;b[ad+1]=c&0xFE;i=0;
  331.             }
  332.         }
  333.     }
  334.     wrtlen(i+1);bitwrite(8,0);bitwrite(31,0);
  335. }
  336. /* WRITE SHORT VALUE */
  337. void writeshort(short n)
  338. {
  339.     fputc(n&255,fo);fputc((n>>8)&255,fo);
  340. }
  341. /* WRITE LONG VALUE */
  342. void writelong(long n)
  343. {
  344.     fputc((int)(n&255),fo);n/=256L;
  345.     fputc((int)(n&255),fo);n/=256L;
  346.     fputc((int)(n&255),fo);n/=256L;
  347.     fputc((int)(n&255),fo);
  348. }
  349. void wrtlen(int n)
  350. {
  351.     int a,b;
  352.     a=1;b=4;
  353.     while(n>b-2){
  354.         a++;b<<=1;
  355.     }
  356.     bitwrite(a,0xfffffffe);bitwrite(a,(n+1-b/2));
  357. }
  358. void bitwrite(int sz,int n)
  359. {
  360.     int i;
  361.     if(bitl+sz>32){
  362.         i=32-bitl;bitl+=sz-32;
  363.         bitcode=(bitcode<<i)|((n>>bitl)&((1<<i)-1));
  364.         fputc(bitcode>>24,fo);
  365.         fputc((bitcode>>16)&255,fo);
  366.         fputc((bitcode>>8)&255,fo);
  367.         fputc(bitcode&255,fo);
  368.         bitcode=n&((1<<bitl)-1);
  369.     }
  370.     else if(bitl+sz==32){
  371.         bitcode=(bitcode<<sz)|(n&((1<<sz)-1));bitl=0;
  372.         fputc(bitcode>>24,fo);
  373.         fputc((bitcode>>16)&255,fo);
  374.         fputc((bitcode>>8)&255,fo);
  375.         fputc(bitcode&255,fo);
  376.     }
  377.     else{
  378.         bitcode=(bitcode<<sz)|(n&((1<<sz)-1));bitl+=sz;
  379.     }
  380. }
  381. /* READ LONG VALUE */
  382. int getlong(unsigned char *b,int p)
  383. {
  384.     int i;
  385.     i=b[p]<<24;i|=b[p+1]<<16;i|=b[p+2]<<8;i|=b[p+3];return(i);
  386. }
  387. /* READ SHORT VALUE */
  388. short getshort(unsigned char *b,int p)
  389. {
  390.     short i;
  391.     i=b[p]<<8;i|=b[p+1];return(i);
  392. }
  393.