home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Fun CD 26
/
OTACD26.ISO
/
archive
/
game
/
gradcw
/
gradcw.lzh
/
GRADCW.C
next >
Wrap
C/C++ Source or Header
|
1996-12-17
|
9KB
|
376 lines
/******************************
* 卒業~クロスワールド変換 *<<PlayStation版>>
* Programmed By Melody-Yoshi *
******************************/
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
unsigned char *bz,pal[512];
char fn[32],fz[32];
FILE *fp,*fo;
long *tbl;
int xwide,ywide,tblcnt,bitl,bitcode,outflag;
void conv8to16(void),conv16(void),conv08(long),conv04(long);
void writelong(long),writeshort(short);
void outpic(int),outbmp16(void),outbmp08(int),outmag(int);
void wrtlen(int),bitwrite(int,int);
long getlong(void);
void main(int argc,char *argv[])
{
int i,j;
long l,ofs;
if(argc<2){
printf("tim file <flag>\n flag:b0|b1|p0|p1\n");exit(1);
}
strcpy(fn,argv[1]);
for(i=0;fn[i];i++)if(fn[i]=='.')break;
fn[i]=0;strcpy(fz,fn);strcat(fz,".tim");
if((fp=fopen(fz,"rb"))==0){
printf("file open error![%s]\n",fz);exit(1);
}
if(argc>2){
if(argv[2][0]=='p')outflag=2;
if(argv[2][1]=='1')outflag|=1;
}
for(fz[i]=0;i>=0;i--)if(fz[i]==':' || fz[i]=='\\')break;
strcpy(fn,&fz[i+1]);
for(j=0;;j++){
if(fread(pal,1,4,fp)!=4)break;
pal[4]=0;
i=fgetc(fp);i+=fgetc(fp)*256;
fseek(fp,2L,1);l=getlong();fseek(fp,4L,1);
if(i==2 || i==8 || i==9){
switch(i){
case 2:conv16();break;
case 8:conv04(l);break;
case 9:conv08(l);break;
}
fclose(fo);
}
else{
printf("This file cannot convert!\n");break;
}
}
fclose(fp);
}
void conv16(void)
{
int x,y;
bz=(unsigned char *)malloc(xwide*ywide*2);
fread(bz,1,xwide*ywide*2,fp);
if(outflag&2)outpic(15);
else outbmp16();
free(bz);
}
void conv08(long l)
{
int i;
long n;
n=ftell(fp);
i=fgetc(fp);i+=fgetc(fp)*256;i<<=1;fseek(fp,2L,1);
fread(pal,1,i,fp);fseek(fp,n+l,0);
xwide=fgetc(fp);xwide+=fgetc(fp)*256;xwide<<=1;
ywide=fgetc(fp);ywide+=fgetc(fp)*256;
bz=(unsigned char *)malloc(xwide*ywide*2);
fread(bz,1,xwide*ywide,fp);
if(outflag&1){
conv8to16();
if(outflag&2)outpic(15);
else outbmp16();
}
else{
if(outflag&2)outpic(8);
else outbmp08(256);
}
free(bz);
}
void conv04(long l)
{
int i,k;
long n;
n=ftell(fp);
i=fgetc(fp);i+=fgetc(fp)*256;i<<=1;fseek(fp,2L,1);
fread(pal,1,512,fp);fseek(fp,n+l,0);
xwide=fgetc(fp);xwide+=fgetc(fp)*256;xwide<<=2;
ywide=fgetc(fp);ywide+=fgetc(fp)*256;
bz=(unsigned char *)malloc(xwide*ywide*2);
fread(bz,1,xwide*ywide/2,fp);
outbmp08(16);
free(bz);
}
void conv8to16(void)
{
int i,j;
for(i=xwide*ywide-1;i>=0;i--){
j=bz[i]<<1;bz[i*2]=pal[j];bz[i*2+1]=pal[j+1];
}
}
void outpic(int cbit)
{
int a,ad,c,d,i,p,x,y,xx,yy,r1,g1,b1,r2,g2,b2;
struct{
int c,n,p;
}table[128];
if(cbit==8){
r1=xwide*ywide;
for(i=r1-1,p=r1+r1-2;i>=0;i--,p-=2){
c=bz[i]<<1;bz[p]=(c&256)>>8;bz[p+1]=c&255;
}
}
else{
if(outflag&1){
for(p=a=0;p<xwide*ywide*2;p+=4,a+=2){
i=bz[p]+bz[p+1]*256;
r1=(i&0x1f)<<3;g1=(i&0x3E0)>>2;b1=(i&0x7C00)>>7;
i=bz[p+2]+bz[p+3]*256;
r2=(i&0x1f)<<3;g2=(i&0x3E0)>>2;b2=(i&0x7C00)>>7;
r1=((r1+r2)/2)&0xF8;g1=((g1+g2)/2)&0xF8;b1=((b1+b2)/2)&0xF8;
i=(g1<<8)|(r1<<3)|(b1>>2);bz[a]=i/256;bz[a+1]=i&255;
}
xwide/=2;
}
else{
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;
}
}
}
strcpy(fz,fn);strcat(fz,".pic");
if((fo=fopen(fz,"wb"))==0){
printf("file create errror.[%s]\n",fz);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;
fprintf(fo,"PIC/MM/XSS:"); /* HEADER */
fputc(26,fo);fputc(0,fo); /* TEXT EOF */
fputc(0,fo);fputc(0,fo); /* MODE */
fputc(0,fo);fputc(cbit,fo); /* COLOR LENGTH */
fputc(xwide/256,fo);fputc(xwide&255,fo); /* SIZE X */
fputc(ywide/256,fo);fputc(ywide&255,fo); /* SIZE Y */
if(cbit==8){
for(i=0;i<256;i++){
r1=pal[i<<1]|(pal[(i<<1)+1]<<8);
b1=(r1&0x7C00)>>7;g1=(r1&0x3E0)>>2;r1=(r1&0x1F)<<3;
r1=(g1<<8)|(r1<<3)|(b1>>2);
fputc(r1/256,fo);fputc(r1&255,fo);
}
}
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);
if(cbit==8)bitwrite(8,c>>1);
else{
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 outbmp16(void)
{
int i,k,x,y,r1,g1,b1,r2,g2,b2;
strcpy(fz,fn);strcat(fz,".bmp");
if((fo=fopen(fz,"wb"))==0){
printf("file create errror.[%s]\n",fz);exit(1);
}
fputc('B',fo);fputc('M',fo); /* ID */
if(outflag&1)writelong(54L+(long)((xwide/2)*ywide*3));
else writelong(54L+(long)(xwide*ywide*3));
writelong(0L); /* RESERVED */
writelong(54L); /* IMAGE OFFSET */
writelong(40L); /* INFO SIZE */
if(outflag&1)writelong((long)(xwide/2)); /* dx */
else writelong((long)xwide);
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);
if(outflag&1){
for(y=ywide-1;y>=0;y--){
for(x=0,k=y*xwide*2;x<xwide;x+=2,k+=4){
i=bz[k]+bz[k+1]*256;
r1=(i&0x1f)<<3;g1=(i&0x3E0)>>2;b1=(i&0x7C00)>>7;
i=bz[k+2]+bz[k+3]*256;
r2=(i&0x1f)<<3;g2=(i&0x3E0)>>2;b2=(i&0x7C00)>>7;
fputc((b1+b2)/2,fo);
fputc((g1+g2)/2,fo);
fputc((r1+r2)/2,fo);
}
}
}
else{
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(fo);
}
void outbmp08(int c)
{
int i;
unsigned short k;
strcpy(fz,fn);strcat(fz,".bmp");
if((fo=fopen(fz,"wb"))==0){
printf("file create errror.[%s]\n",fz);exit(1);
}
fputc('B',fo);fputc('M',fo); /* ID */
writelong((long)c*4L+54L+(long)xwide*(long)ywide); /* FILE SIZE */
writelong(0L); /* RESERVED */
writelong((long)c*4L+54L); /* IMAGE OFFSET */
writelong(40L); /* INFO SIZE */
writelong((long)xwide); /* dx */
writelong((long)ywide); /* dy */
writeshort(1); /* PLAIN */
if(c==256)writeshort(8); /* DEPTH */
else writeshort(4);
writelong(0L); /* COMPRESS TYPE */
writelong(0L);
writelong(0L); /* x per meter */
writelong(0L); /* y per meter */
writelong((long)c); /* COLOR */
writelong(0L);
for(i=0;i<c;i++){
k=pal[i*2]+(pal[i*2+1]<<8);
fputc((k&0x7c00)>>7,fo); /* BLUE */
fputc((k&0x3e0)>>2,fo); /* GREEN */
fputc((k&0x1f)<<3,fo); /* RED */
fputc(0,fo);
}
if(c==256){
for(i=ywide-1;i>=0;i--){
if(fwrite(&bz[i*xwide],1,xwide,fo)!=xwide){
printf("file write error!\n");exit(1);
}
}
}
else{
for(i=0;i<xwide*ywide/2;i++)bz[i]=((bz[i]&0xF0)>>4)|((bz[i]&0x0F)<<4);
for(i=ywide-1;i>=0;i--){
if(fwrite(&bz[i*xwide/2],1,xwide/2,fo)!=xwide/2){
printf("file write error!\n");exit(1);
}
}
}
fclose(fo);
}
/* 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;
}
}