home *** CD-ROM | disk | FTP | other *** search
/ Fun CD 26 / OTACD26.ISO / archive / game / gradcw / gradcw.lzh / GRADCW.C next >
C/C++ Source or Header  |  1996-12-17  |  9KB  |  376 lines

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