/* 外部データを基にして画面を描く */
/* Ｖｅｒ　１．１０ */

#include	<stdio.h>
#include	<stdlib.h>
#include	<string.h>
#include	<EGB.h>
#include	<SND.h>

#include	<ysuty2.h>
#include	<s_button.h>

#define Bytes	1024
/* 変数型名の宣言 */

typedef unsigned int	UINT;
typedef unsigned char	UCHAR;


/* グローバル変数の初期化 */
char	gwork[1536];
FILE	*fp;
char	*tok[128];			/* 区切られた文字列中の一要素 */
int		flag=0;				/* ｆｏｌｌｏｗ中？ */
int		pflag=0;			/* ｐａｓｔｅ中？ */
int		pre_x0,pre_y0;		/* follow用、一つ前の図形の座標 */
int		arn,pre_arn;	/* 描画関数に渡す引数の数(ほぼ唯一のエラーチェック) */


/* 関数のプロトタイプ宣言 */
int		screen_init();
int		set_data();
int		draw_data();
int		term();

int hol();int pro();int gradHol();int gradPro();
int strHol();int strPro();int gsHol();int gsPro();
int line();int box();int boxF();int string();


/* メイン関数 */
int		main(int argc,char *argv[])
{
	int		count;
	char	mes[100];
	screen_init();

	if (argc!=2)
		strcpy(argv[1],"resourse.dat");

	if ((fp=fopen(argv[1],"r"))==NULL )		/* ファイルオープン */
	{
		YGB_color(gwork,_C(31,24,24));
		YGB_print(gwork,100,100,"ファイルエラー");
		return (1);
	}

	if ( (count=set_data())!=0 )
	{
		YGB_color(gwork,_C(31,22,22));
		YGB_fontSize(gwork,6,12);
		sprintf(mes,"%d行でデータエラーです\n",count/63356);
		YGB_print(gwork,12,42,mes);
		sprintf(mes,"データが%d個書いてあります(ＩＤ含む)\n",count%65536);
		YGB_print(gwork,12,54,mes);
		term();
		return(0);
	}

	term();
	return(0);
}


/* スクリーンの初期化 */
int		screen_init()
{
	YGB_init(gwork,17,10);
	YGB_writeMode(gwork,PSET);
	YGB_use12dotFont();
	return (0);
}



/* データをディスクからメモリへ １ */
int		set_data()
{
	int		count;				/* ファイルの何行目を読んでいるか */

	char	buf[Bytes];			/* ｆｇｅｔｓ用バッファ */
	char	*b;					/* 　　　　　〃　　　　のポインタ */
	b=&buf[0];

	char	*endptr;

	count=0;
	

	for (;;)
	{
		count++;
		fgets(b,Bytes,fp);
		if ( (tok[0]=strtok(b,","))==NULL)
		{
			if (feof(fp)!=0)
				break;
			else
				continue;					/* 空行はスキップ */
		}
		arn=0;
		while(arn<Bytes)
		{
			arn++;
			if ((tok[arn]=strtok(NULL,","))==NULL)
				break;
		}

		if (arn==1)
		{
			if (feof(fp)!=0)
				break;
			else
				continue;					/* 意味のない行もスキップ */
		}
		
		
		if (strcmp(tok[0],"follow")==0)
		{
			if (feof(fp)!=0)
				break;
			else if (arn!=2)
				return(count*63336+arn);
			else
			{
				flag=strtol(tok[1],&endptr,10);		/* follow on ! */
				continue;
			}
		}

		if (draw_data(arn)!=0)
			return(count*65536+arn);

		if (feof(fp)!=0)
			break;
	}

	return(0);

}

/* 画面に書く */
int		draw_data()
{
	int		num,ret;
	char	*endptr;

	num=strtol(tok[0],&endptr,10);
	
	switch(num)
	{
		case 0:
			ret=hol();break;
		case 1:
			ret=pro();break;
		case 2:
			ret=gradHol();break;
		case 3:
			ret=gradPro();break;
		case 4:
			ret=strHol();break;
		case 5:
			ret=strPro();break;
		case 6:
			ret=gsHol();break;
		case 7:
			ret=gsPro();break;
		case 8:
			ret=line();break;
		case 9:
			ret=box();break;
		case 10:
			ret=boxF();break;
		case 11:
			ret=string();break;
		default:
			ret=0;break;					/* スキップ */
	}
	return(ret);
}


/* 終了 */
int		term()
{
	int		status;
	status=0xff;
	YGB_fontSize(gwork,6,12);
	YGB_color(gwork,_C(24,24,31));
	YGB_print(gwork,0,30,"パッドのボタンで終了します。");
	while (status==0xff)
		SND_joy_in_2(0,&status);
	fclose(fp);
	return(0);
}


/* 描画関数群 */
int		hol()
{
	int		num[8],i;		/* 勿体ないけどnum[0]は使わない */
	int		ret;
	char	*endptr;
	char	mes[60];

	if (arn!=8)
		return(1);

	for(i=1;i<8;i++)
		num[i]=strtol(tok[i],&endptr,10);

	if (flag>0)
	{
		num[1]+=pre_x0;num[2]+=pre_y0;num[3]+=num[1];num[4]+=num[2];
		flag--;
	}
		
	ret=SGB_holButton(gwork,num[1],num[2],num[3],num[4],
					_C(num[5],num[6],num[7]));

	pre_x0=num[1];pre_y0=num[2];
	pre_arn=arn;
	return(ret);
}

int pro()
{
	int		num[8],i,ret;
	char	*endptr;

	if (arn!=8)
		return(1);

	for(i=1;i<8;i++)
		num[i]=strtol(tok[i],&endptr,10);

	if (flag>0)
	{
		num[1]+=pre_x0;num[2]+=pre_y0;num[3]+=num[1];num[4]+=num[2];
		flag--;
	}

	ret=SGB_proButton(gwork,num[1],num[2],num[3],num[4],
					_C(num[5],num[6],num[7]));

	pre_arn=arn;
	pre_x0=num[1];pre_y0=num[2];
	return(ret);
}

int gradHol()
{
	int		num[12],i,ret;
	char	*endptr;

	if (arn!=12)
		return(1);

	for(i=1;i<12;i++)
		num[i]=strtol(tok[i],&endptr,10);

	if (flag>0)
	{
		num[1]+=pre_x0;num[2]+=pre_y0;num[3]+=num[1];num[4]+=num[2];
		flag--;
	}

	ret=SGB_gradHolButton(gwork,num[1],num[2],num[3],num[4],
						_C(num[5],num[6],num[7]),_C(num[8],num[9],num[10]),
						num[11]);

	pre_arn=arn;
	pre_x0=num[1];pre_y0=num[2];
	return(ret);
}

int gradPro()
{
	int		num[12],i,ret;
	char	*endptr;

	if (arn!=12)
		return(1);

	for(i=1;i<12;i++)
		num[i]=strtol(tok[i],&endptr,10);

	if (flag>0)
	{
		num[1]+=pre_x0;num[2]+=pre_y0;num[3]+=num[1];num[4]+=num[2];
		flag--;
	}

	ret=SGB_gradProButton(gwork,num[1],num[2],num[3],num[4],
						_C(num[5],num[6],num[7]),_C(num[8],num[9],num[10]),
						num[11]);

	pre_arn=arn;
	pre_x0=num[1];pre_y0=num[2];
	return(ret);
}

int strHol()
{
	int		n[13],i,ret;
	char	*endptr;
	char	*str;

	if (arn!=13)
		return(1);

	for(i=1;i<6;i++)
		n[i]=strtol(tok[i],&endptr,10);
	for(i=7;i<13;i++)
		n[i]=strtol(tok[i],&endptr,10);
	
	if (flag>0)
	{
		n[1]+=pre_x0;n[2]+=pre_y0;
		flag--;
	}

	str=tok[6];
	
	ret=SGB_strHolButton(gwork,n[1],n[2],
					_C(n[3],n[4],n[5]),str,n[7],n[8],
					n[9],_C(n[10],n[11],n[12]));

	pre_arn=arn;
	pre_x0=n[1];pre_y0=n[2];
	return(ret);
}

int strPro()
{
	int		n[13],i,ret;
	char	*endptr;
	char	*str;

	if (arn!=13)
		return(1);
	
	for(i=1;i<6;i++)
		n[i]=strtol(tok[i],&endptr,10);
	for(i=7;i<13;i++)
		n[i]=strtol(tok[i],&endptr,10);

	if (flag>0)
	{
		n[1]+=pre_x0;n[2]+=pre_y0;
		flag--;
	}
	
	str=tok[6];
	
	ret=SGB_strProButton(gwork,n[1],n[2],
					_C(n[3],n[4],n[5]),str,n[7],n[8],
					n[9],_C(n[10],n[11],n[12]));

	pre_arn=arn;
	pre_x0=n[1];pre_y0=n[2];
	return(ret);
}

int		gsHol()
{
	int		n[17],i,ret;
	char	*endptr;
	char	*str;

	if (arn!=17)
		return(1);
	
	for(i=1;i<10;i++)
		n[i]=strtol(tok[i],&endptr,10);
	str=tok[10];
	for(i=11;i<17;i++)
		n[i]=strtol(tok[i],&endptr,10);

	if (flag>0)
	{
		n[1]+=pre_x0;n[2]+=pre_y0;
		flag--;
	}

	ret=SGB_gradStrHolButton(gwork,n[1],n[2],_C(n[3],n[4],n[5]),
					_C(n[6],n[7],n[8]),n[9],str,n[11],n[12],n[13],
					_C(n[14],n[15],n[16]));

	pre_arn=arn;
	pre_x0=n[1];pre_y0=n[2];
	return(ret);
}

int		gsPro()
{
	int		n[17],i,ret;
	char	*endptr;
	char	*str;

	if (arn!=17)
		return(1);
	
	for(i=1;i<10;i++)
		n[i]=strtol(tok[i],&endptr,10);
	str=tok[10];
	for(i=11;i<17;i++)
		n[i]=strtol(tok[i],&endptr,10);

	if (flag>0)
	{
		n[1]+=pre_x0;n[2]+=pre_y0;
		flag--;
	}

	ret=SGB_gradStrProButton(gwork,n[1],n[2],_C(n[3],n[4],n[5]),
					_C(n[6],n[7],n[8]),n[9],str,n[11],n[12],n[13],
					_C(n[14],n[15],n[16]));

	pre_arn=arn;
	pre_x0=n[1];pre_y0=n[2];
	return(ret);
}

int		line()
{
	int		n[8],i;
	char	*endptr;

	if (arn!=8)
		return(1);
	
	for(i=1;i<8;i++)
		n[i]=strtol(tok[i],&endptr,10);

	if (flag>0)
	{
		n[1]+=pre_x0;n[2]+=pre_y0;n[3]+=n[1];n[4]+=n[2];
		flag--;
	}

	YGB_color(gwork,_C(n[5],n[6],n[7]));
	YGB_line(gwork,n[1],n[2],n[3],n[4]);

	pre_arn=arn;
	pre_x0=n[1];pre_y0=n[2];
	return(0);
}

int		box()
{
	int		n[8],i;
	char	*endptr;
	
	if (arn!=8)
		return(1);
	
	for(i=1;i<8;i++)
		n[i]=strtol(tok[i],&endptr,10);

	if (flag>0)
	{
		n[1]+=pre_x0;n[2]+=pre_y0;n[3]+=n[1];n[4]+=n[2];
		flag--;
	}

	YGB_color(gwork,_C(n[5],n[6],n[7]));
	YGB_box(gwork,n[1],n[2],n[3],n[4]);

	pre_arn=arn;
	pre_x0=n[1];pre_y0=n[2];
	return(0);
}

int		boxF()
{
	int		n[8],i;
	char	*endptr;
	
	if(arn!=8)
		return(1);
	
	for(i=1;i<8;i++)
		n[i]=strtol(tok[i],&endptr,10);

	if (flag>0)
	{
		n[1]+=pre_x0;n[2]+=pre_y0;n[3]+=n[1];n[4]+=n[2];
		flag--;
	}


	YGB_color(gwork,_C(n[5],n[6],n[7]));
	YGB_boxFul(gwork,n[1],n[2],n[3],n[4]);

	pre_arn=arn;
	pre_x0=n[1];pre_y0=n[2];
	return(0);
}

int		string()
{
	int		n[8],i;
	char	*endptr;
	char	*str;

	if (arn!=10)
		return(1);
	
	for(i=1;i<8;i++)
		n[i]=strtol(tok[i],&endptr,10);
	YGB_color(gwork,_C(n[3],n[4],n[5]));
	YGB_fontSize(gwork,n[6],n[7]);
	str=tok[8];

	if (flag>0)
	{
		n[1]+=pre_x0;n[2]+=pre_y0;
		flag--;
	}

	YGB_print(gwork,n[1],n[2]+n[7]-1,str);

	pre_arn=arn;
	pre_x0=n[1];pre_y0=n[2];
	return(0);
}

