home *** CD-ROM | disk | FTP | other *** search
/ Fun CD 26 / OTACD26.ISO / archive / game / tlsmcd / tlsmcd.lzh / TLSMCD.C next >
C/C++ Source or Header  |  1996-12-26  |  10KB  |  351 lines

  1. /******************************
  2.  * トゥルーラブストーリー下校会話CG変換 *
  3.  * Programmed by Melody-Yoshi *
  4.  ******************************/
  5. #include<stdio.h>
  6. #include<string.h>
  7. #include<stdlib.h>
  8. unsigned char *bf,*bz,*tb[2];
  9. unsigned    char txt[512];
  10. int outflag,acnt,mcnt,chr,selno,xwide,ywide,cbit,bitl,bitcode;
  11. int ex[5],en[5];
  12. struct ans{
  13.     int dx,dy;
  14.     unsigned char *b;
  15. };
  16. typedef struct ans* an;
  17. an anp;
  18. FILE *fp,*fo;
  19. long getlong(void);
  20. short getshort(void);
  21. void slidec(int),outcg(int),outcg2(int,int);
  22. void copyn88(int,int,int,int,int,int),copyn89(int,int,int,int,int,int,int,int);
  23. void outbmp(void),outpic(void),writeshort(short),writelong(long);
  24. void wrtlen(int),bitwrite(int,int);
  25. void conv16(unsigned char *,int,int,int);
  26. static long chrtbl[27]={
  27. 0x093000L,0x0D4800L,0x116000L,
  28. 0x16D800L,0x1AF000L,0x1F0800L,
  29. 0x24B000L,0x28C800L,0x2CE000L,
  30. 0x328800L,0x36A000L,0x3AB800L,
  31. 0x401800L,0x443000L,0x484800L,
  32. 0x4E4800L,0x526000L,0x567800L,
  33. 0x5BF800L,0x601000L,0x642800L,
  34. 0x69D800L,0x6DF000L,0x720800L,
  35. 0x776800L,0x7B8000L,0x7F9800L};
  36. static long anitbl[9]={
  37. 0x157800L,0x232000L,0x30F800L,0x3ED000L,0x4C6000L,
  38. 0x5A9000L,0x684000L,0x762000L,0x83B000L};
  39. static char *nametbl[9]={
  40. "KATSURAGI AYANE","HIROSE NOZOMI","GOTOU IKUMI","HONDA TOMOKO","MINAMI YAYOI",
  41. "KASUGA CHIHARU","AMANO MIDORI","KUSANAGI SHINOBU","MIZUTANI YURIKA"};
  42. static char *season[3]={"Spring/Autumn","Summer","Winter"};
  43. static char *eyetbl[3]={"Open","Mid","Close"};
  44. void main(int argc,char *argv[])
  45. {
  46.     int i,j,k,m,x,dx,dy,vh,vl,vw,vm;
  47.     long l;
  48.     if(argc<3){
  49.         printf("tlsmcd <CD-drive> <xxxxxx> [flag]\n  CHR/SEASON/HAIR/EYE/WINK/MOUTH flag:b|p\n");exit(1);
  50.     }
  51.     outflag=0;chr=argv[2][0]-'0';selno=argv[2][1]-'0';
  52.     vh=argv[2][2]-'0';vl=argv[2][3]-'0';
  53.     vw=argv[2][4]-'0';vm=argv[2][5]-'0';
  54.     if(argc>3){
  55.         if(argv[3][0]=='p' || argv[3][1]=='P')outflag=1;
  56.     }
  57.     if(chr<0 || chr>8)chr=0;
  58.     if(selno<0 || selno>2)selno=0;
  59.     if(vh<0 || vh>2)vh=0;
  60.     if(vl<0 || vl>4)vl=0;
  61.     if(vw<0 || vw>2)vw=0;
  62.     if(vm<0 || vm>2)vm=0;
  63.     bz=(unsigned char *)malloc(512*272*2);
  64.     bf=(unsigned char *)malloc(512*256*2);
  65.     txt[0]=argv[1][0];strcpy(&txt[1],":\\tls\\mcd.img");
  66.     if((fp=fopen(txt,"rb"))==0){
  67.         printf("file open error.[pic.pak]\n");exit(1);
  68.     }
  69.     printf("CHARACTER=%s(%s)\n",nametbl[chr],season[selno]);
  70.     printf("HAIR=%d EYE=%d(%s) MOUTH=%s\n",vh,vl,eyetbl[vw],eyetbl[2-vm]);
  71.     fseek(fp,chrtbl[chr*3+selno],0);
  72.     for(i=0;i<1;i++){
  73.         /* GET MAIN IMAGE-1 */
  74.         fseek(fp,16L,1);dx=getshort();dy=getshort();
  75.         for(j=0;j<dy;j++)fread(&bf[j*1024],1,dx*2,fp);
  76.         fseek(fp,(ftell(fp)+0x7FFL)&0xFFFFF800L,0);
  77.     /* GET MAIN IMAGE-2 */
  78.         fseek(fp,16L,1);dx=getshort();dy=getshort();
  79.         for(j=0;j<dy;j++)fread(&bf[(j*512+256)*2],1,dx*2,fp);
  80.         fseek(fp,(ftell(fp)+0x7FFL)&0xFFFFF800L,0);
  81.         while((j=fgetc(fp))==0);fseek(fp,-1L,1);
  82.     /* GET MAIN IMAGE TABLE */
  83.         mcnt=(int)getlong();tb[0]=(unsigned char *)malloc(mcnt*16);
  84.         fread(tb[0],1,mcnt*16,fp);
  85.         fseek(fp,(ftell(fp)+0x7FFL)&0xFFFFF800L,0);
  86.     /* GET ANIMATION IMAGE */
  87.         fseek(fp,anitbl[chr],0);l=ftell(fp);fseek(fp,4L,1);
  88.         for(j=0;j<5;j++)ex[j]=(int)getlong();
  89.         j=(int)getlong()-24;
  90.         fseek(fp,-4L,1);fread(txt,1,j,fp);k=j/4;en[0]=0;
  91.         anp=(an)malloc(sizeof(struct ans)*k);
  92.         for(j=x=0;j<k;j++){
  93.             fseek(fp,l+txt[j*4]+(txt[j*4+1]<<8)+(txt[j*4+2]<<16),0);
  94.             anp[j].dx=(int)getlong();anp[j].dy=(int)getlong();
  95.             if(anp[j].dx!=ex[x])en[++x]=j;
  96.             anp[j].b=(unsigned char *)malloc(anp[j].dx*anp[j].dy*2);
  97.             fread(anp[j].b,1,anp[j].dx*anp[j].dy*2,fp);
  98.         }
  99.         fseek(fp,(ftell(fp)+0x7FFL)&0xFFFFF800L,0);
  100.     /* GET ANIMATION TABLE */
  101.         acnt=(int)getlong();tb[1]=(unsigned char *)malloc(acnt*16);
  102.         fread(tb[1],1,acnt*16,fp);
  103.         xwide=256;ywide=256;
  104.         for(j=0;j<xwide*ywide*2;j++)bz[j]=0;
  105.         outcg(vh+1);
  106.         outcg2(1,vl*3+vw);outcg2(2,vl*3+vw);outcg2(3,vm);
  107.         strcpy((char *)txt,"mcd0000.");
  108.         txt[3]=chr+'0';txt[4]=selno*3+vh+'0';
  109.         txt[5]=vl+'0';txt[6]=vw*3+vm+'0';
  110.         if(outflag)outpic();
  111.         else outbmp();
  112.     }
  113.     free(bz);
  114.     fclose(fp);free(bf);exit(0);
  115. }
  116. void outcg(int h)
  117. {
  118.     int i,p,x,y,dx,dy,tx,ty;
  119.     for(p=(mcnt-1)<<4,i=mcnt-1;i>=0;i--,p-=16){
  120.         if(tb[0][p]==0 || tb[0][p+1]==h){
  121.             x=tb[0][p+2]+tb[0][p+3]*256;
  122.             y=tb[0][p+4]+tb[0][p+5]*256;
  123.             tx=tb[0][p+6]+tb[0][p+7]*256;
  124.             ty=tb[0][p+8]+tb[0][p+9]*256;
  125.             dx=tb[0][p+10];dy=tb[0][p+12];
  126.             copyn88(x,y,tx,ty,dx,dy);
  127.         }
  128.     }
  129. }
  130. void copyn88(int x,int y,int tx,int ty,int dx,int dy)
  131. {
  132.     int i,j,adr;
  133.     for(i=0;i<dy;i++){
  134.         adr=((ty+i)*512+tx)*2;
  135.         for(j=0;j<dx;j++){
  136.             if(bf[adr+j*2] || bf[adr+j*2+1]){
  137.                 bz[((y+i)*xwide+(x+j))*2]=bf[adr+j*2];
  138.                 bz[((y+i)*xwide+(x+j))*2+1]=bf[adr+j*2+1];
  139.             }
  140.         }
  141.     }
  142. }
  143. void outcg2(int s,int h)
  144. {
  145.     int i,p,x,y,dx,dy,tx,ty;
  146.     for(p=(acnt-1)<<4,i=acnt-1;i>=0;i--,p-=16){
  147.         if(tb[1][p]==s && tb[1][p+1]==h){
  148.             x=tb[1][p+2]+tb[1][p+3]*256;
  149.             y=tb[1][p+4]+tb[1][p+5]*256;
  150.             tx=tb[1][p+6]+tb[1][p+7]*256;
  151.             ty=tb[1][p+8]+tb[1][p+9]*256;
  152.             dx=tb[1][p+10];dy=tb[1][p+12];
  153. //printf("%X %X %X %X %X %X %X %X\n",x,y,tx,ty,dx,dy,tb[1][p],tb[1][p+1]);fflush(stdout);
  154.             copyn89(x,y,tx,ty,dx,dy,tb[1][p],tb[1][p+1]);
  155.         }
  156.     }
  157. }
  158. void copyn89(int x,int y,int tx,int ty,int dx,int dy,int n1,int n2)
  159. {
  160.     int i,j,n,adr;
  161.     n=en[n1-1]+n2/3;
  162.     ty&=127;tx=0;
  163.     for(i=0;i<dy;i++){
  164.         adr=((ty+i)*anp[n].dx+tx)*2;
  165.         for(j=0;j<dx;j++){
  166.             if(anp[n].b[adr+j*2] || anp[n].b[adr+j*2+1]){
  167.                 bz[((y+i)*xwide+(x+j))*2]=anp[n].b[adr+j*2];
  168.                 bz[((y+i)*xwide+(x+j))*2+1]=anp[n].b[adr+j*2+1];
  169.             }
  170.         }
  171.     }
  172. }
  173. void outpic(void)
  174. {
  175.     int a,ad,c,d,i,p,x,y,xx,yy,r1,g1,b1,r2,g2,b2;
  176.     struct{
  177.         int c,n,p;
  178.     }table[128];
  179.     for(p=0;p<xwide*ywide*2;p+=2){
  180.         i=bz[p]+bz[p+1]*256;
  181.         r1=(i&0x1f)<<6;g1=(i&0x3E0)<<6;b1=(i&0x7C00)>>9;
  182.         i=g1|r1|b1;bz[p]=i/256;bz[p+1]=i&255;
  183.     }
  184.     strcat((char *)txt,"pic");
  185.     if((fo=fopen((char *)txt,"wb"))==0){
  186.         printf("file create errror.[%s]\n",txt);exit(1);
  187.     }
  188.     bitl=bitcode=0;
  189.         for(i=0;i<128;i++){
  190.         table[i].c=0;table[i].p=i+1;table[i].n=i-1;
  191.     }
  192.     table[127].p=0;table[0].n=127;
  193.     fputc('P',fo);fputc('I',fo);fputc('C',fo);    /* HEADER */
  194.     fputc(26,fo);fputc(0,fo);                    /* TEXT EOF */
  195.     fputc(0,fo);fputc(0,fo);                    /* MODE */
  196.     fputc(0,fo);fputc(15,fo);                    /* COLOR LENGTH */
  197.     fputc(xwide/256,fo);fputc(xwide&255,fo);    /* SIZE X */
  198.     fputc(ywide/256,fo);fputc(ywide&255,fo);    /* SIZE Y */
  199.     for(p=y=c=0;y<xwide*ywide*2;y+=2){
  200.         if((i=((bz[y]<<8)|(bz[y+1]))&0xFFFE)!=c){
  201.             c=i;bz[y]=c>>8;bz[y+1]=(c&255)|1;
  202.         }
  203.     }
  204.     for(i=y=0;y<ywide;y++){
  205.         for(ad=y*xwide*2,x=0;x<xwide;x++,ad+=2){
  206.             i++;
  207.             if((c=(bz[ad]<<8)|(bz[ad+1]))&1){
  208.                 wrtlen(i);
  209.                 for(a=0;a<128;a++)if(table[a].c==(c&0xFFFE))break;
  210.                 if(a==128){
  211.                     p=table[p].p;table[p].c=c&0xFFFE;
  212.                 }
  213.                 else{
  214.                     if(p!=a){
  215.                         table[table[a].p].n=table[a].n;
  216.                         table[table[a].n].p=table[a].p;
  217.                         table[table[p].p].n=a;table[a].p=table[p].p;
  218.                         table[p].p=a;table[a].n=p;p=a;
  219.                     }
  220.                 }
  221.                 if(a!=128)bitwrite(8,a+128);
  222.                 else bitwrite(16,(unsigned)c/2);
  223.                 for(a=0,xx=x,yy=y+1,r1=((y+1)*xwide+x)*2;yy<ywide;yy++,r1+=xwide*2){
  224.                     if(c==((bz[r1]<<8)|(bz[r1+1])))d=2;
  225.                     else{
  226.                         xx--;r1-=2;
  227.                         if(xx>=0 && c==((bz[r1]<<8)|(bz[r1+1])))d=1;
  228.                         else{
  229.                             xx+=2;r1+=4;
  230.                             if(xx<xwide && c==((bz[r1]<<8)|(bz[r1+1])))d=3;
  231.                             else{
  232.                                 xx-=3;r1-=6;
  233.                                 if(xx>=0 && c==((bz[r1]<<8)|(bz[r1+1])))d=4;
  234.                                 else{
  235.                                     xx+=4;r1+=8;
  236.                                     if(xx<xwide && c==((bz[r1]<<8)|(bz[r1+1])))d=5;
  237.                                     else break;
  238.                                 }
  239.                             }
  240.                         }
  241.                     }
  242.                     bz[r1]=c>>8;bz[r1+1]=c&0xFE;
  243.                     if(a==0)bitwrite(1,1);
  244.                     if(d==4)bitwrite(4,2);
  245.                     if(d==5)bitwrite(4,3);
  246.                     if(d<=3)bitwrite(2,d);
  247.                     a=1;
  248.                 }
  249.                 if(a==0)bitwrite(1,0);
  250.                 else bitwrite(3,0);
  251.                 bz[ad]=c>>8;bz[ad+1]=c&0xFE;i=0;
  252.             }
  253.         }
  254.     }
  255.     wrtlen(i+1);bitwrite(8,0);bitwrite(31,0);
  256.     fclose(fo);
  257. }
  258. void outbmp(void)
  259. {
  260.     int i,k,x,y,r1,g1,b1,r2,g2,b2;
  261.     strcat((char *)txt,"bmp");
  262.     if((fo=fopen((char *)txt,"wb"))==0){
  263.         printf("file create errror.[%s]\n",txt);exit(1);
  264.     }
  265.     fputc('B',fo);fputc('M',fo);    /* ID */
  266.     writelong(54L+(long)(xwide*ywide*3));
  267.     writelong(0L);                    /* RESERVED */
  268.     writelong(54L);                    /* IMAGE OFFSET */
  269.     writelong(40L);                    /* INFO SIZE */
  270.     writelong((long)xwide);                /* dx */
  271.     writelong((long)ywide);                /* dy */
  272.     writeshort(1);                    /* PLAIN */
  273.     writeshort(24);                    /* DEPTH */
  274.     writelong(0L);                    /* COMPRESS TYPE */
  275.     writelong(0L);
  276.     writelong(0L);                    /* x per meter */
  277.     writelong(0L);                    /* y per meter */
  278.     writelong(0L);
  279.     writelong(0L);
  280.     for(y=ywide-1;y>=0;y--){
  281.         for(x=0,k=y*xwide*2;x<xwide;x++,k+=2){
  282.             i=bz[k]+bz[k+1]*256;
  283.             fputc((i&0x7C00)>>7,fo);
  284.             fputc((i&0x3E0)>>2,fo);
  285.             fputc((i&0x1f)<<3,fo);
  286.         }
  287.     }
  288.     fclose(fp);
  289. }
  290. /* READ SHORT VALUE */
  291. short getshort(void)
  292. {
  293.     short i;
  294.     i=fgetc(fp);i+=fgetc(fp)*256;
  295.     return(i);
  296. }
  297. /* READ LONG VALUE */
  298. long getlong(void)
  299. {
  300.     long i;
  301.     i=(long)fgetc(fp);i+=(long)fgetc(fp)*0x100L;
  302.     i+=(long)fgetc(fp)*0x10000L;i+=(long)fgetc(fp)*0x1000000L;
  303.     return(i);
  304. }
  305. /* WRITE SHORT VALUE */
  306. void writeshort(short n)
  307. {
  308.     fputc(n&255,fo);fputc((n>>8)&255,fo);
  309. }
  310. /* WRITE LONG VALUE */
  311. void writelong(long n)
  312. {
  313.     fputc((int)(n&255),fo);n/=256L;
  314.     fputc((int)(n&255),fo);n/=256L;
  315.     fputc((int)(n&255),fo);n/=256L;
  316.     fputc((int)(n&255),fo);
  317. }
  318. void wrtlen(int n)
  319. {
  320.     int a,b;
  321.     a=1;b=4;
  322.     while(n>b-2){
  323.         a++;b<<=1;
  324.     }
  325.     bitwrite(a,0xfffffffe);bitwrite(a,(n+1-b/2));
  326. }
  327. void bitwrite(int sz,int n)
  328. {
  329.     int i;
  330.     if(bitl+sz>32){
  331.         i=32-bitl;bitl+=sz-32;
  332.         bitcode=(bitcode<<i)|((n>>bitl)&((1<<i)-1));
  333.         fputc(bitcode>>24,fo);
  334.         fputc((bitcode>>16)&255,fo);
  335.         fputc((bitcode>>8)&255,fo);
  336.         fputc(bitcode&255,fo);
  337.         bitcode=n&((1<<bitl)-1);
  338.     }
  339.     else if(bitl+sz==32){
  340.         bitcode=(bitcode<<sz)|(n&((1<<sz)-1));bitl=0;
  341.         fputc(bitcode>>24,fo);
  342.         fputc((bitcode>>16)&255,fo);
  343.         fputc((bitcode>>8)&255,fo);
  344.         fputc(bitcode&255,fo);
  345.     }
  346.     else{
  347.         bitcode=(bitcode<<sz)|(n&((1<<sz)-1));bitl+=sz;
  348.     }
  349. }
  350.  
  351.