#include	<stdio.h>
#include	<stdlib.h>
#include	<string.h>

#include	"s_disk.h"


/* キャラクタデータ用構造体Lite */
typedef	struct
{
	short	x,y,pl;
} CHAR_DATA;




/* 使用法説明 */
void	usage()
{
	puts("使用法: run386 spp2ysp \"入力ファイル名\" [出力ファイル]");
	puts("");
	puts("入力ファイル名の拡張子は省略可。デフォルトは .SPP");
	puts("出力ファイル名は省略可。デフォルトは入力ファイル名の拡張子を.YSPに変えたもの");
	return;
}




int		convert(char *sppname,char *yspname)
{
	FILE	*spp,*ysp;
	short	ch,pl,pt,cy=0,py=0;
	short	top,i,j;
	char	*buf;
	CHAR_DATA	*cd;
	long	p1;
	
	spp=fopen(sppname,"rb");
	ysp=fopen(yspname,"wb");
	
	fread(&ch,2,1,spp);			/* キャラクタ個数 */
	fread(&pl,2,1,spp);			/* パレット個数 */
	fread(&pt,2,1,spp);			/* パターン個数 */
	
	printf("%s...\n",sppname);
	printf("キャラクタ個数=%d\n",ch);
	printf("パレット個数  =%d\n",pl);
	printf("パターン個数  =%d\n\n",pt);
	
	
	/* キャラクタデータの読出と書き込み */
	fwrite(&ch,2,1,ysp);		/* キャラクタ個数を書き込む(ダミー) */
	
	
	top=0;
	if ((cd=malloc(sizeof(CHAR_DATA)*ch))==NULL)
	{	puts("メモリ不足です");	exit(1);	}
	for (i=0;i<ch;i++)
	{
		fseek(spp,2,SEEK_CUR);	/* 先頭パターン番号は無視 */
		fread(&cd[i],sizeof(CHAR_DATA),1,spp);
		printf("Character No.%d...x=%3d,y=%3d",i,cd[i].x,cd[i].y);
		if (cd[i].pl!=0)
		{
			cy++;
			py+=cd[i].x*cd[i].y;
			fwrite(&top,2,1,ysp);
			fwrite(&cd[i].x,2,1,ysp);
			fwrite(&cd[i].y,2,1,ysp);
			cd[i].pl-=256+32768;
			fwrite(&cd[i].pl,2,1,ysp);
			top+= cd[i].x*cd[i].y;
			printf("  :palette No.%d\n",cd[i].pl);
			cd[i].pl+=256;
		}
		else
			printf("  :32Kcolors\n");
	}
	printf("\n\nNumber of character of YSPfile...%d",cy);
	printf("\nNumber of pattern of YSPfile.....%d",py);
	
	
	/* キャラクタ個数を本物に書換える */
	p1=ftell(ysp);
	fseek(ysp,0,SEEK_SET);
	fwrite(&cy,2,1,ysp);
	fseek(ysp,p1,SEEK_SET);
	
	
	/* パレットデータの読出と書き込み */
	fwrite(&pl,2,1,ysp);	/* パレット個数を書き込む */
	buf=malloc(32);			/* まさか32バイトが確保出来ないわけが... */
	for (i=0;i<pl;i++)
	{
		fread(buf,32,1,spp);
		fwrite(buf,32,1,ysp);
	}
	
	/* パターンデータの読出と書き込み */
	fwrite(&py,2,1,ysp);	/* パターン個数の書き込み */
	free(buf);	buf=malloc(128);	/* 芸が無い... */
	for (i=0;i<ch;i++)
	{
		if (cd[i].pl==0)		/* 32K data */
			fseek(spp,512*cd[i].x*cd[i].y,SEEK_CUR);
		else
		{
			for (j=0;j<cd[i].x*cd[i].y;j++)
			{
				fread(buf,128,1,spp);
				fwrite(buf,128,1,ysp);
			}
		}
	}
	
	free(buf);
	return(0);
}





int		main(int argc,char **argv)
{
	char	sppname[80];
	char	yspname[80];
	char	ext[4];
	
	
	if (argc==1)
	{	usage();	exit(1);	}
	
	strcpy(sppname,argv[1]);
	DSK_tolowerFileName(sppname);
	DSK_getExtName(sppname,ext);
	if (ext[0]==0)
		DSK_changeExtName(sppname,"spp");
	else if ( strcmp(ext,"spp")!=0)
	{	puts("入力できるファイルはsppファイルだけですよ!");	exit(1);	}
	
	if (argc==2)
	{
		strcpy(yspname,sppname);
		DSK_changeExtName(yspname,"ysp");
	}
	else if (argc==3)
	{
		strcpy(yspname,argv[2]);
		DSK_tolowerFileName(yspname);
		DSK_getExtName(sppname,ext);
		if (ext[0]==0)
			DSK_changeExtName(sppname,"ysp");
		else if (strcmp(ext,"ysp")!=0)
		{	puts("入力できるファイルはyspファイルだけですよ!");	exit(1);	}
	}
	
	
	convert(sppname,yspname);
	return(0);
}

