home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Fun CD 26
/
OTACD26.ISO
/
archive
/
game
/
tlsmcd
/
tlsmcd.lzh
/
TLSMCD.C
next >
Wrap
C/C++ Source or Header
|
1996-12-26
|
10KB
|
351 lines
/******************************
* トゥルーラブストーリー下校会話CG変換 *
* Programmed by Melody-Yoshi *
******************************/
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
unsigned char *bf,*bz,*tb[2];
unsigned char txt[512];
int outflag,acnt,mcnt,chr,selno,xwide,ywide,cbit,bitl,bitcode;
int ex[5],en[5];
struct ans{
int dx,dy;
unsigned char *b;
};
typedef struct ans* an;
an anp;
FILE *fp,*fo;
long getlong(void);
short getshort(void);
void slidec(int),outcg(int),outcg2(int,int);
void copyn88(int,int,int,int,int,int),copyn89(int,int,int,int,int,int,int,int);
void outbmp(void),outpic(void),writeshort(short),writelong(long);
void wrtlen(int),bitwrite(int,int);
void conv16(unsigned char *,int,int,int);
static long chrtbl[27]={
0x093000L,0x0D4800L,0x116000L,
0x16D800L,0x1AF000L,0x1F0800L,
0x24B000L,0x28C800L,0x2CE000L,
0x328800L,0x36A000L,0x3AB800L,
0x401800L,0x443000L,0x484800L,
0x4E4800L,0x526000L,0x567800L,
0x5BF800L,0x601000L,0x642800L,
0x69D800L,0x6DF000L,0x720800L,
0x776800L,0x7B8000L,0x7F9800L};
static long anitbl[9]={
0x157800L,0x232000L,0x30F800L,0x3ED000L,0x4C6000L,
0x5A9000L,0x684000L,0x762000L,0x83B000L};
static char *nametbl[9]={
"KATSURAGI AYANE","HIROSE NOZOMI","GOTOU IKUMI","HONDA TOMOKO","MINAMI YAYOI",
"KASUGA CHIHARU","AMANO MIDORI","KUSANAGI SHINOBU","MIZUTANI YURIKA"};
static char *season[3]={"Spring/Autumn","Summer","Winter"};
static char *eyetbl[3]={"Open","Mid","Close"};
void main(int argc,char *argv[])
{
int i,j,k,m,x,dx,dy,vh,vl,vw,vm;
long l;
if(argc<3){
printf("tlsmcd <CD-drive> <xxxxxx> [flag]\n CHR/SEASON/HAIR/EYE/WINK/MOUTH flag:b|p\n");exit(1);
}
outflag=0;chr=argv[2][0]-'0';selno=argv[2][1]-'0';
vh=argv[2][2]-'0';vl=argv[2][3]-'0';
vw=argv[2][4]-'0';vm=argv[2][5]-'0';
if(argc>3){
if(argv[3][0]=='p' || argv[3][1]=='P')outflag=1;
}
if(chr<0 || chr>8)chr=0;
if(selno<0 || selno>2)selno=0;
if(vh<0 || vh>2)vh=0;
if(vl<0 || vl>4)vl=0;
if(vw<0 || vw>2)vw=0;
if(vm<0 || vm>2)vm=0;
bz=(unsigned char *)malloc(512*272*2);
bf=(unsigned char *)malloc(512*256*2);
txt[0]=argv[1][0];strcpy(&txt[1],":\\tls\\mcd.img");
if((fp=fopen(txt,"rb"))==0){
printf("file open error.[pic.pak]\n");exit(1);
}
printf("CHARACTER=%s(%s)\n",nametbl[chr],season[selno]);
printf("HAIR=%d EYE=%d(%s) MOUTH=%s\n",vh,vl,eyetbl[vw],eyetbl[2-vm]);
fseek(fp,chrtbl[chr*3+selno],0);
for(i=0;i<1;i++){
/* GET MAIN IMAGE-1 */
fseek(fp,16L,1);dx=getshort();dy=getshort();
for(j=0;j<dy;j++)fread(&bf[j*1024],1,dx*2,fp);
fseek(fp,(ftell(fp)+0x7FFL)&0xFFFFF800L,0);
/* GET MAIN IMAGE-2 */
fseek(fp,16L,1);dx=getshort();dy=getshort();
for(j=0;j<dy;j++)fread(&bf[(j*512+256)*2],1,dx*2,fp);
fseek(fp,(ftell(fp)+0x7FFL)&0xFFFFF800L,0);
while((j=fgetc(fp))==0);fseek(fp,-1L,1);
/* GET MAIN IMAGE TABLE */
mcnt=(int)getlong();tb[0]=(unsigned char *)malloc(mcnt*16);
fread(tb[0],1,mcnt*16,fp);
fseek(fp,(ftell(fp)+0x7FFL)&0xFFFFF800L,0);
/* GET ANIMATION IMAGE */
fseek(fp,anitbl[chr],0);l=ftell(fp);fseek(fp,4L,1);
for(j=0;j<5;j++)ex[j]=(int)getlong();
j=(int)getlong()-24;
fseek(fp,-4L,1);fread(txt,1,j,fp);k=j/4;en[0]=0;
anp=(an)malloc(sizeof(struct ans)*k);
for(j=x=0;j<k;j++){
fseek(fp,l+txt[j*4]+(txt[j*4+1]<<8)+(txt[j*4+2]<<16),0);
anp[j].dx=(int)getlong();anp[j].dy=(int)getlong();
if(anp[j].dx!=ex[x])en[++x]=j;
anp[j].b=(unsigned char *)malloc(anp[j].dx*anp[j].dy*2);
fread(anp[j].b,1,anp[j].dx*anp[j].dy*2,fp);
}
fseek(fp,(ftell(fp)+0x7FFL)&0xFFFFF800L,0);
/* GET ANIMATION TABLE */
acnt=(int)getlong();tb[1]=(unsigned char *)malloc(acnt*16);
fread(tb[1],1,acnt*16,fp);
xwide=256;ywide=256;
for(j=0;j<xwide*ywide*2;j++)bz[j]=0;
outcg(vh+1);
outcg2(1,vl*3+vw);outcg2(2,vl*3+vw);outcg2(3,vm);
strcpy((char *)txt,"mcd0000.");
txt[3]=chr+'0';txt[4]=selno*3+vh+'0';
txt[5]=vl+'0';txt[6]=vw*3+vm+'0';
if(outflag)outpic();
else outbmp();
}
free(bz);
fclose(fp);free(bf);exit(0);
}
void outcg(int h)
{
int i,p,x,y,dx,dy,tx,ty;
for(p=(mcnt-1)<<4,i=mcnt-1;i>=0;i--,p-=16){
if(tb[0][p]==0 || tb[0][p+1]==h){
x=tb[0][p+2]+tb[0][p+3]*256;
y=tb[0][p+4]+tb[0][p+5]*256;
tx=tb[0][p+6]+tb[0][p+7]*256;
ty=tb[0][p+8]+tb[0][p+9]*256;
dx=tb[0][p+10];dy=tb[0][p+12];
copyn88(x,y,tx,ty,dx,dy);
}
}
}
void copyn88(int x,int y,int tx,int ty,int dx,int dy)
{
int i,j,adr;
for(i=0;i<dy;i++){
adr=((ty+i)*512+tx)*2;
for(j=0;j<dx;j++){
if(bf[adr+j*2] || bf[adr+j*2+1]){
bz[((y+i)*xwide+(x+j))*2]=bf[adr+j*2];
bz[((y+i)*xwide+(x+j))*2+1]=bf[adr+j*2+1];
}
}
}
}
void outcg2(int s,int h)
{
int i,p,x,y,dx,dy,tx,ty;
for(p=(acnt-1)<<4,i=acnt-1;i>=0;i--,p-=16){
if(tb[1][p]==s && tb[1][p+1]==h){
x=tb[1][p+2]+tb[1][p+3]*256;
y=tb[1][p+4]+tb[1][p+5]*256;
tx=tb[1][p+6]+tb[1][p+7]*256;
ty=tb[1][p+8]+tb[1][p+9]*256;
dx=tb[1][p+10];dy=tb[1][p+12];
//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);
copyn89(x,y,tx,ty,dx,dy,tb[1][p],tb[1][p+1]);
}
}
}
void copyn89(int x,int y,int tx,int ty,int dx,int dy,int n1,int n2)
{
int i,j,n,adr;
n=en[n1-1]+n2/3;
ty&=127;tx=0;
for(i=0;i<dy;i++){
adr=((ty+i)*anp[n].dx+tx)*2;
for(j=0;j<dx;j++){
if(anp[n].b[adr+j*2] || anp[n].b[adr+j*2+1]){
bz[((y+i)*xwide+(x+j))*2]=anp[n].b[adr+j*2];
bz[((y+i)*xwide+(x+j))*2+1]=anp[n].b[adr+j*2+1];
}
}
}
}
void outpic(void)
{
int a,ad,c,d,i,p,x,y,xx,yy,r1,g1,b1,r2,g2,b2;
struct{
int c,n,p;
}table[128];
for(p=0;p<xwide*ywide*2;p+=2){
i=bz[p]+bz[p+1]*256;
r1=(i&0x1f)<<6;g1=(i&0x3E0)<<6;b1=(i&0x7C00)>>9;
i=g1|r1|b1;bz[p]=i/256;bz[p+1]=i&255;
}
strcat((char *)txt,"pic");
if((fo=fopen((char *)txt,"wb"))==0){
printf("file create errror.[%s]\n",txt);exit(1);
}
bitl=bitcode=0;
for(i=0;i<128;i++){
table[i].c=0;table[i].p=i+1;table[i].n=i-1;
}
table[127].p=0;table[0].n=127;
fputc('P',fo);fputc('I',fo);fputc('C',fo); /* HEADER */
fputc(26,fo);fputc(0,fo); /* TEXT EOF */
fputc(0,fo);fputc(0,fo); /* MODE */
fputc(0,fo);fputc(15,fo); /* COLOR LENGTH */
fputc(xwide/256,fo);fputc(xwide&255,fo); /* SIZE X */
fputc(ywide/256,fo);fputc(ywide&255,fo); /* SIZE Y */
for(p=y=c=0;y<xwide*ywide*2;y+=2){
if((i=((bz[y]<<8)|(bz[y+1]))&0xFFFE)!=c){
c=i;bz[y]=c>>8;bz[y+1]=(c&255)|1;
}
}
for(i=y=0;y<ywide;y++){
for(ad=y*xwide*2,x=0;x<xwide;x++,ad+=2){
i++;
if((c=(bz[ad]<<8)|(bz[ad+1]))&1){
wrtlen(i);
for(a=0;a<128;a++)if(table[a].c==(c&0xFFFE))break;
if(a==128){
p=table[p].p;table[p].c=c&0xFFFE;
}
else{
if(p!=a){
table[table[a].p].n=table[a].n;
table[table[a].n].p=table[a].p;
table[table[p].p].n=a;table[a].p=table[p].p;
table[p].p=a;table[a].n=p;p=a;
}
}
if(a!=128)bitwrite(8,a+128);
else bitwrite(16,(unsigned)c/2);
for(a=0,xx=x,yy=y+1,r1=((y+1)*xwide+x)*2;yy<ywide;yy++,r1+=xwide*2){
if(c==((bz[r1]<<8)|(bz[r1+1])))d=2;
else{
xx--;r1-=2;
if(xx>=0 && c==((bz[r1]<<8)|(bz[r1+1])))d=1;
else{
xx+=2;r1+=4;
if(xx<xwide && c==((bz[r1]<<8)|(bz[r1+1])))d=3;
else{
xx-=3;r1-=6;
if(xx>=0 && c==((bz[r1]<<8)|(bz[r1+1])))d=4;
else{
xx+=4;r1+=8;
if(xx<xwide && c==((bz[r1]<<8)|(bz[r1+1])))d=5;
else break;
}
}
}
}
bz[r1]=c>>8;bz[r1+1]=c&0xFE;
if(a==0)bitwrite(1,1);
if(d==4)bitwrite(4,2);
if(d==5)bitwrite(4,3);
if(d<=3)bitwrite(2,d);
a=1;
}
if(a==0)bitwrite(1,0);
else bitwrite(3,0);
bz[ad]=c>>8;bz[ad+1]=c&0xFE;i=0;
}
}
}
wrtlen(i+1);bitwrite(8,0);bitwrite(31,0);
fclose(fo);
}
void outbmp(void)
{
int i,k,x,y,r1,g1,b1,r2,g2,b2;
strcat((char *)txt,"bmp");
if((fo=fopen((char *)txt,"wb"))==0){
printf("file create errror.[%s]\n",txt);exit(1);
}
fputc('B',fo);fputc('M',fo); /* ID */
writelong(54L+(long)(xwide*ywide*3));
writelong(0L); /* RESERVED */
writelong(54L); /* IMAGE OFFSET */
writelong(40L); /* INFO SIZE */
writelong((long)xwide); /* dx */
writelong((long)ywide); /* dy */
writeshort(1); /* PLAIN */
writeshort(24); /* DEPTH */
writelong(0L); /* COMPRESS TYPE */
writelong(0L);
writelong(0L); /* x per meter */
writelong(0L); /* y per meter */
writelong(0L);
writelong(0L);
for(y=ywide-1;y>=0;y--){
for(x=0,k=y*xwide*2;x<xwide;x++,k+=2){
i=bz[k]+bz[k+1]*256;
fputc((i&0x7C00)>>7,fo);
fputc((i&0x3E0)>>2,fo);
fputc((i&0x1f)<<3,fo);
}
}
fclose(fp);
}
/* READ SHORT VALUE */
short getshort(void)
{
short i;
i=fgetc(fp);i+=fgetc(fp)*256;
return(i);
}
/* READ LONG VALUE */
long getlong(void)
{
long i;
i=(long)fgetc(fp);i+=(long)fgetc(fp)*0x100L;
i+=(long)fgetc(fp)*0x10000L;i+=(long)fgetc(fp)*0x1000000L;
return(i);
}
/* WRITE SHORT VALUE */
void writeshort(short n)
{
fputc(n&255,fo);fputc((n>>8)&255,fo);
}
/* WRITE LONG VALUE */
void writelong(long n)
{
fputc((int)(n&255),fo);n/=256L;
fputc((int)(n&255),fo);n/=256L;
fputc((int)(n&255),fo);n/=256L;
fputc((int)(n&255),fo);
}
void wrtlen(int n)
{
int a,b;
a=1;b=4;
while(n>b-2){
a++;b<<=1;
}
bitwrite(a,0xfffffffe);bitwrite(a,(n+1-b/2));
}
void bitwrite(int sz,int n)
{
int i;
if(bitl+sz>32){
i=32-bitl;bitl+=sz-32;
bitcode=(bitcode<<i)|((n>>bitl)&((1<<i)-1));
fputc(bitcode>>24,fo);
fputc((bitcode>>16)&255,fo);
fputc((bitcode>>8)&255,fo);
fputc(bitcode&255,fo);
bitcode=n&((1<<bitl)-1);
}
else if(bitl+sz==32){
bitcode=(bitcode<<sz)|(n&((1<<sz)-1));bitl=0;
fputc(bitcode>>24,fo);
fputc((bitcode>>16)&255,fo);
fputc((bitcode>>8)&255,fo);
fputc(bitcode&255,fo);
}
else{
bitcode=(bitcode<<sz)|(n&((1<<sz)-1));bitl+=sz;
}
}