/* ＳＰＰ２Ｓ１６ */
#include	<stdio.h>
#include	<string.h>
#include	<stdlib.h>
#include	"s_disk.h"


/* キャラクタデータ用構造体 */
typedef	struct
{
	short	top,x,y,pl;
} CHAR_DATA;




/* 使用法説明 */
void	usage()
{
	puts("使用法: run386 spp2s16 \"入力ファイル名\" [出力ファイル]");
	puts("");
	puts("入力ファイル名の拡張子は省略可。デフォルトは .SPP");
	puts("出力ファイル名は省略可。デフォルトは入力ファイル名の拡張子を.s16に変えたもの");
	return;
}




int		convert(char *sppname,char *s16name)
{
	FILE	*spp,*s16;
	short	ch,pl,pt,i,x,y;
	char	*buf;
	long	p_ptsz;
	int		ptsz=0,plsz;	/* パターン/パレットサイズ,カラーテーブル番号 */
	CHAR_DATA	*cd;
	static	char	*s16_ID="SPRITE16";		/* 頭悪い? */
	
	spp=fopen(sppname,"rb");
	s16=fopen(s16name,"wb");
	
	fread(&ch,2,1,spp);			/* キャラクタ個数 */
	fread(&pl,2,1,spp);			/* パレット個数 */
	fread(&pt,2,1,spp);			/* パターン個数 */
	
	/* Ｓ１６ヘッダへの書き込み　*/
	fwrite(s16_ID,8,1,s16);		/* ＩＤ */
	p_ptsz=ftell(s16);
	fwrite(&ptsz,4,1,s16);		/* パターンサイズのダミー */
	plsz=pl*32;
	fwrite(&plsz,4,1,s16);
	
	/* キャラクタデータの読みだし */
	if ((cd=malloc(sizeof(CHAR_DATA)*ch))==NULL)
	{	puts("メモリが足りん");	exit(1);	}
	for (i=0;i<ch;i++)
		fread(&cd[i],sizeof(CHAR_DATA),1,spp);
	
	/* パレットデータの読み書き */
	if ((buf=malloc(plsz))==NULL)
	{	puts("メモリが足りん");	exit(1);	}
	fread(buf,plsz,1,spp);
	fwrite(buf,plsz,1,s16);
	
	/* パターンデータの書き込み */
	buf=malloc(128);
	for (i=0;i<ch;i++)
	{
		if (cd[i].pl!=0)	/* 16色データだったら */
		{
			for (y=0; y<cd[i].y; y++)
			{
				for (x=0; x<cd[i].x; x++)
				{
					fread(buf,128,1,spp);
					fwrite(&cd[i].pl,2,1,s16);
					fwrite(buf,128,1,s16);
					ptsz+=128;
				}
			}
		}
		else
			fseek(spp,cd[i].x*cd[i].y*512,SEEK_CUR);
	}
	
	fseek(s16,p_ptsz,SEEK_SET);
	fwrite(&ptsz,2,1,s16);
	return(0);
}





int		main(int argc,char **argv)
{
	char	sppname[80];
	char	s16name[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(s16name,sppname);
		DSK_changeExtName(s16name,"s16");
	}
	else if (argc==3)
	{
		strcpy(s16name,argv[2]);
		DSK_tolowerFileName(s16name);
		DSK_getExtName(sppname,ext);
		if (ext[0]==0)
			DSK_changeExtName(sppname,"s16");
		else if (strcmp(ext,"s16")!=0)
		{	puts("入力できるファイルはs16ファイルだけですよ!");	exit(1);	}
	}
	
	
	convert(sppname,s16name);
	return(0);
}


