home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Fun CD 26
/
OTACD26.ISO
/
archive
/
game
/
yunaiw
/
yunaiw.lzh
/
YUNAIW.C
next >
Wrap
C/C++ Source or Header
|
1996-12-21
|
3KB
|
133 lines
/******************************
* 銀河お嬢様伝説ユナ *
* Mika Akitaka・イラストワークス 変換 *
* Programmed By Melody-Yoshi *
******************************/
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
unsigned char *bz,*bf,*tb;
char fn[32],fz[32];
int xwide,ywide;
FILE *fp,*fo;
long getlong(void);
void outbmp(void),writeshort(short),writelong(long);
void slidec(void),outcg(void),cgxtofrm(void);
void main(int argc,char *argv[])
{
int i,j,k;
if(argc<2){
printf("yunaiw <cd-drive>\n");exit(1);
}
fn[0]=argv[1][0];strcpy(&fn[1],":\\yuna.fat");
if((fp=fopen(fn,"rb"))==0){
printf("file open error![%s]\n",fn);exit(1);
}
fseek(fp,0L,2);i=(int)ftell(fp);fseek(fp,0L,0);
tb=(unsigned char *)malloc(i);fread(tb,1,i,fp);fclose(fp);
if((bz=(unsigned char *)malloc(640*480*2))==NULL){
printf("insufficient memory!\n");exit(1);
}
if((bf=(unsigned char *)malloc(640*480*2))==NULL){
printf("insufficient memory!\n");exit(1);
}
for(j=0;j<i;j+=32){
for(k=0;tb[j+k];k++)fn[k+3]=tb[j+k];
fn[k+3]=0;xwide=tb[j+19]<<3;ywide=tb[j+21]<<3;
if(xwide<1 || ywide<1 || tb[j+7])continue;
if((fp=fopen(fn,"rb"))==0){
printf("file open error.[%s]\n",fn);exit(1);
}
if(tb[j+5]==tb[j+9] && tb[j+6]==tb[j+10])fread(bf,1,xwide*ywide*2,fp);
else slidec();
fclose(fp);cgxtofrm();for(k=0;tb[j+k];k++)fz[k]=tb[j+k];
fz[k]=0;outbmp();
}
free(bf);free(bz);free(tb);exit(0);
}
void slidec(void)
{
int i,k,m,p,cnt,dist;
i=(xwide*ywide)<<1;
for(p=k=0;p<i;k>>=1){
if((k&0xFF00)==0){
k=fgetc(fp);if(k==EOF)break;
k|=0xFF00;
}
if(k&1)bf[p++]=fgetc(fp);
else{
m=fgetc(fp);m+=fgetc(fp)*256;
cnt=((m&0xF800)>>11)+1;dist=(m&0x7FF)-0x800+p;
for(m=0;m<cnt;m++)bf[p++]=bf[dist++];
}
}
}
void cgxtofrm(void)
{
int i,j,x,y,z;
for(y=z=0;y<ywide;y+=8){
for(x=0;x<xwide;x+=8){
for(j=0;j<8;j++){
for(i=0;i<8;i++){
bz[((y+j)*xwide+x+i)*2]=bf[z++];
bz[((y+j)*xwide+x+i)*2+1]=bf[z++];
}
}
}
}
}
void outbmp(void)
{
int i,k,x,y,r1,g1,b1,r2,g2,b2;
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(54L+(long)(xwide*ywide*3));
writelong(0L); /* RESERVED */
writelong(54L); /* IMAGE OFFSET */
writelong(40L); /* INFO SIZE */
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);
for(y=ywide-1;y>=0;y--){
for(x=0,k=y*xwide*2;x<xwide;x++,k+=2){
i=bz[k]*256+bz[k+1];
fputc((i&0x7C00)>>7,fo);
fputc((i&0x3E0)>>2,fo);
fputc((i&0x1f)<<3,fo);
}
}
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);
}