/* スプライトプロセッサ */
#include	<stdio.h>
#include	<stdlib.h>
#include	<string.h>
#include	<msdos.cf>

#include	<egb.h>
#include	<mos.h>
#include	<sidework.h>

//	#define		S_DEBUG

#include	"s_debug.h"
#include	"inc\ysuty2.h"
#include	"inc\s_button.h"
#include	"optimize.h"



/* マクロ、ラベルの定義 */
#define		sprWin_x		(24)
#define		sprWin_y		(28)
#define		sprWinStep_x	(80)
#define		sprWinStep_y	(110)

#define		view_x0			(88)
#define		view_y0			(62)
#define		view_lx			(337)
#define		view_ly			(357)

#define		print_x			(280)
#define		print_y			(2)

#define		US				unsigned

#define		C_BACK2			_C(4,14,2)
#define		C_BACK			_C(4,8,16)


/* グローバル変数の宣言 */
char	gwork[1536];
char	mwork[4096];
char	mpwork[258];
ITEM	*itm[30];
char	pat_ext[4]="";		/* PATファイルの拡張子 */
char	*Pbuf;				/* PATファイル用バッファ */
char	*TMPbuf;			/* テンポラリーな使い回せるバッファ */
char	*Ybuf;				/* YSPファイル用バッファ */
int		OP_LEVEL=80;		/* 最適化レベル(の平方根) */
int		WINTOP;				/* 一番左上に表示されているパターンの番号の1/6 */

FILE	*fp,*fp2;
char	*title_PD[]={"サイドワーク　　　","画面の再描画",NULL};
char	*fileMenu_PD[]={"ARTemisのパターン新規読み込み","ARTemisのパターン追加読み込み","ARTemisのパターンとして保存","SPP新規読み込み","SPP保存",NULL};
char	*optimize_PD[]={"全部１６色化","全部３２Ｋ色化","パレット番号の整理","範囲指定の１６色化","範囲指定の３２Ｋ色化","退避中のパレットによる１６色化",NULL};
char	*zoomStr[]={" ×１ "," ×２ "," ×４ "," ×８ ","×１６",NULL};
char	*meyastr[]={"細かく","中庸","幅広く"};		/* 目安(^^;) */


/* ソースファイルが長いのはやだ、しかし・・・(^^;) */
#include	"sppm.c"



/* 各種初期化 */

void	init()
{
	YGB_init(gwork,17,10);
	YGB_writePage(gwork,0);
	YGB_writeMode(gwork,PSET);
	YGB_use12dotFont();
	
	MOS_start(mwork,4096);
	MOS_resolution(0,17);
	MOS_writePage(0);
	MOS_color(0,_C(31,31,31));
	MOS_typeRom(81,0,0,mpwork);
	MOS_setpos(256,240);
	MOS_horizon(0,505);
	MOS_vertical(0,473);
	
	YGB_color(gwork,0);
	YGB_boxFul(gwork,0,0,511,479);
	YGB_fontSize(gwork,6,12);
	
	return;
}


/* 終了の前処理 */
void	term()
{
	MOS_disp(0);
	MOS_end();
	return;
}


/* アイテム登録、初期画面の描画 */
ITEM	*addItems()
{
	int		x,y,i,j;
	char	*buf;
	ITEM	*top;
	
	YGB_writeMode(gwork,PSET);
	/* 背景色 */
	YGB_color(gwork,C_BACK);
	YGB_boxFul(gwork,0,0,511,479);
	
	/* 画面上方の溝(?) */
	YGB_color(gwork,C_BACK);
	YGB_boxFul(gwork,259,-2,494,18);
	
	/* ＥＸＩＴボタン (itm[0])*/
	SGB_gradProButton(gwork,493,0,511,18,_C(24,24,24),_C(8,8,8),0);
	top=YGU_addButton(NULL,493,0,18,18);
	
	
	/* タイトル (itm[1])*/
	SGB_gradProButton(gwork,0,0,112,18,_C(12,12,12),_C(0,0,0),0);
	YGB_color(gwork,_C(25,25,25));
	YGB_fontSize(gwork,6,12);
	YGB_print(gwork,15,14,"ＳＰＰ Ver1.00");
	YGB_color(gwork,_C(27,27,27));
	YGB_print(gwork,16,14,"ＳＰＰ Ver1.00");
	YGU_addPullDownMenu(top,0,0,112,18,title_PD,0,19,6,12);
	
	/* ファイルメニュー (itm[2])*/
	SGB_proButton(gwork,113,0,192,18, _C(0,0,0));
	YGB_color(gwork,_C(27,27,27));
	YGB_print(gwork,128,14,"ファイル");
	YGB_color(gwork,_C(12,12,12));
	YGB_fontSize(gwork,3,6);
	YGB_print(gwork,179,13,"▼");
	YGU_addPullDownMenu(top,113,0,80,18,fileMenu_PD,113,19,6,12);
	
	/* 最適化メニュー (itm[3])*/
	SGB_proButton(gwork,193,0,260,18, _C(0,0,0));
	YGB_color(gwork,_C(27,27,27));
	YGB_fontSize(gwork,6,12);
	YGB_print(gwork,208,14,"最適化");
	YGB_color(gwork,_C(12,12,12));
	YGB_fontSize(gwork,3,6);
	YGB_print(gwork,247,13,"▼");
	YGU_addPullDownMenu(top,193,0,68,18,optimize_PD,193,19,6,12);
	
	
	/* 現在のパターン番号等表示 */
	YGB_fontSize(gwork,6,12);
	SGB_holButton(gwork,print_x,print_y,print_x+191,print_y+15,_C(0,0,0));
	YGB_color(gwork,_C(27,27,27));
	YGB_print(gwork,print_x+2,print_y+13,"now:");
	SPM_printNumber(0);
	
	
	/* 各キャラデータの表示ウィンドウ(itm[4]-itm[27]) */
	x = sprWin_x;
	y = sprWin_y;
	/* パターン表示 */
	SGB_proButton(gwork,x  ,y,  x+75,y+75, _C(22,22,22));
	SGB_holButton(gwork,x+6,y+6,x+69,y+69, _C(0,0,0));
	/* パレットの表示 */
	SGB_holButton(gwork,x   ,y+78,x+74,y+98, _C(0,0,0));
	
	if ((buf=_malloc(76*99*2))==NULL)
	{	SPM_errMes("メモリが少な過ぎます");	term(); exit(1); }
	YGB_getPattern(gwork,buf,x,y,x+75,y+98);
	
	/* コピーする(一回余分があるけどまあいいね(^^;)) */
	for (j=0;j<4;j++)
	{
		for (i=0;i<6;i++)
		{
			/* ボタンとして登録 */
			x = i * sprWinStep_x + sprWin_x;
			y = j * sprWinStep_y + sprWin_y;
			YGB_putPattern(gwork,buf,x,y,x+75,y+98);
			YGU_addButton(top,x+6,y+6,64,64);
			
		}
	}
	_free(buf);
	
	/* スクロールバー (itm[28])*/
	YGU_addLongitudinalbar(gwork,top,0,20,12,458,1,1);
	YGB_writeMode(gwork,PSET);
	
	
	
	return(top);
}


/* タイトルメニューだ */
void	titleMenu(ITEM *tit)
{
	switch(YGU_getPullDown(tit))
	{
		default: break;
		case 1:	sdk_invoke(); break;
		case 2: SPM_redraw(); break;
	}
	return;
}


/* ファイルメニュー */
void	fileMenu(ITEM *fil)
{
	switch(YGU_getPullDown(fil))
	{
		case 1:
			if (PATNUM!=0)
			{
				if (SPM_sure(" @@ @@ 本当にロードしていいですか？ ",0)==1)
					SPM_readNewPAT();
				break;
			}
			else
			{
				SPM_readNewPAT();
				break;
			}
		case 2:		SPM_addPAT();	break;
		case 3:		SPM_savePAT();	break;
		case 4:
			if (PATNUM!=0)
			{
				if (SPM_sure(" @@ @@ 本当にロードしていいですか？ ",0)==1)
					SPM_readNewSPP();
				break;
			}
			else
			{
				SPM_readNewSPP();
				break;
			}
		/* case 5.5:		SPM_addSPP();	break; */
		case 5:		SPM_saveSPP();	break;
		default:	break;
	}
	return;
}


/* オプティマイズメニュー */
void	optimizeMenu(ITEM *opt)
{
	switch(YGU_getPullDown(opt))
	{
		default: break;
		case 1:SPM_all16();	break;
		case 2:SPM_all32K(); break;
		case 3:SPM_arrangePALnumber(); break;
		/* 範囲・条件付き最適化 */
		case 4:SPM_limit16();	break;
		case 5:SPM_limit32K();	break;
		case 6:SPM_pushed();	break;
	}
	return;
}




/* ズーム */
void	zoomView(int x,int y,int mag,int num,short *tmpbuf)
{
	char	para[20];
	int		px,py,i,j,loop_x,loop_y;
	px=pter[num].patx*16;	py=pter[num].paty*16;
	
	_fill_char(magBuf,256*256*2,0);
	
	loop_x=(px<256/mag) ? px : 256/mag;
	loop_y=(py<256/mag) ? py : 256/mag;
	
	YGB_writeMode(gwork,PSET);
	
	MOS_disp(0);
	
	for	(j=0;j<loop_y;j++)
	{
		for (i=0;i<loop_x;i++)
			magBuf[j*256/mag + i]=tmpbuf[(j+y)*px+i+x];
	}
	/*
	for (j=loop_y;j<256/mag;j++)
	{
		for (i=0;i<256/mag;i++)
			magBuf[j*256/mag + i]=0;
	}
	*/
	
	if (mag!=1)
	{
		DWORD (para)   =(US int)magBuf;
		WORD  (para+4) =getds();
		WORD  (para+6) =view_x0+6;
		WORD  (para+8) =view_y0+22;
		WORD  (para+10)=view_x0+261;
		WORD  (para+12)=view_y0+277;
		WORD  (para+14)=(US short)256/mag;
		WORD  (para+16)=(US short)256/mag;
		
		EGB_putBlockZoom(gwork,0,para);
	}
	else
		YGB_putPattern(gwork,(char*)magBuf,view_x0+6,view_y0+22,
						view_x0+261,view_y0+277);
	
	MOS_disp(1);
	
	return;
}

/* スクロールバーでキャラクタ表示 */
void	scr_bar(ITEM *bar_x,ITEM *bar_y,int mag,int num,short *tmpbuf)
{
	static int	pre_x=-1;
	static int	pre_y=-1;
	int		x,y;
	
	x=YGU_getScrollBarPointer(bar_x);
	y=YGU_getScrollBarPointer(bar_y);
	
	if ( (pre_x!=x)||(pre_y!=y) )
		zoomView(x,y,mag,num,tmpbuf);
	pre_x=x;	pre_y=y;
	return;
}

/* 伝染メニュー */
void	infection()
{
	SPM_sure(" @@ @@まだできてないんです(;-;)",2);
	return;
}




/* １パターン加工 */
void	patWindow(int num)
{
	if (num>=PATNUM)
		return;
	
	short 	*tmpbuf;
	ITEM	*pwin,*itms[30],*act=NULL;
	char	str[20];
	char	str1[4];
	int		i;
	int		mag;	/* 拡大率 */
	int		inum;
	int		patx=pter[num].patx*16;
	int		paty=pter[num].paty*16;
	int		px,py,mx,my,dmy;
	
	px=pter[num].patx*16;	py=pter[num].paty*16;
	
	mag=(patx>paty) ? patx : paty;
	mag=256/mag;
	
	if (mag==16)
		mag=16;
	else if (mag>=8)
		mag=8;
	else if (mag>=4)
		mag=4;
	else if (mag>=2)
		mag=2;
	else
		mag=1;
	
	
	pwin_st:;
	
	MOS_disp(0);
	
	if ((tmpbuf=_malloc(px*py*2))==NULL)
	{ SPM_errMes("メモリが足りません");	return; }
	
	SPM_expand(num,px,py,PAL[pter[num].palnum],tmpbuf);
	
	
	
	YGB_getPattern(gwork,zoomDlgBuf,view_x0,view_y0,view_x0+view_lx-1,
						view_y0+view_ly-1);
	
	/* ルーペ、ダイアログベース */
	SGB_proButton(gwork,view_x0,view_y0,view_x0+336,view_y0+356, _C(6,6,6));
	
		/* 終了ボタン...1 */
	SGB_gradProButton(gwork,view_x0+2,view_y0+2,view_x0+19,view_y0+19,
						_C(24,24,24),_C(6,6,6),0);
	pwin=YGU_addButton(NULL,view_x0+2,view_y0+2,18,18);
	
		/* スプライト表示ウィンドウ */
	YGB_color(gwork,_C(0,0,0));
	YGB_boxFul(gwork,view_x0+6,view_y0+22,view_x0+277,view_y0+277);
		/* スクロールバー 横...2,縦...3*/
	YGU_addLateralbar(gwork,pwin,view_x0+6,view_y0+278,256,16,
						patx,256/mag);
	YGU_addLongitudinalbar(gwork,pwin,view_x0+262,view_y0+22,16,256,
						paty,256/mag);
	
	YGB_writeMode(gwork,PSET);
		/* COPY(4) PASTE(5)ボタン */
	SGB_proButton(gwork,view_x0+289,view_y0+308,view_x0+334,view_y0+323,
					 _C(6,6,12));
	YGU_addButton(pwin,view_x0+289,view_y0+308,46,16);
	YGB_color(gwork,_C(27,27,27));
	YGB_fontSize(gwork,6,12);
	YGB_print(gwork,view_x0+294,view_y0+321," COPY ");
	SGB_proButton(gwork,view_x0+289,view_y0+331,view_x0+334,view_y0+346,
					 _C(6,6,12));
	YGU_addButton(pwin,view_x0+289,view_y0+331,46,16);
	YGB_color(gwork,_C(27,27,27));
	YGB_print(gwork,view_x0+294,view_y0+344," PASTE ");
		/* パレット表示 */
	SGB_holButton(gwork,view_x0+9,view_y0+306,view_x0+252,view_y0+325,
					 _C(0,0,0));
	if (pter[num].palnum!=-1)
	{
		for (i=0;i<16;i++)
		{
			YGB_color(gwork,PAL[pter[num].palnum][i]);
			YGB_boxFul(gwork,view_x0+11+i*15,view_y0+308,view_x0+24+i*15,
				view_y0+323);
		}
	}
	else
	{
		YGB_color(gwork,_C(20,20,20));
		YGB_print(gwork,view_x0+15,view_y0+322,"No palette data");
	}
		/* 結線 */
	YGB_color(gwork,_C(14,14,22));
	YGB_boxFul(gwork,view_x0+254,view_y0+315,view_x0+287,view_y0+316);
	YGB_color(gwork,_C(14,14,22));
	YGB_boxFul(gwork,view_x0+270,view_y0+338,view_x0+287,view_y0+339);
	YGB_color(gwork,_C(14,14,22));
	YGB_boxFul(gwork,view_x0+270,view_y0+317,view_x0+271,view_y0+337);
	
		/* 文字 */
	YGB_color(gwork,_C(25,25,25));
	sprintf(str,"Pattern No.%04d",num);
	YGB_print(gwork,view_x0+16,view_y0+342,str);
	
	if (pter[num].palnum!=-1)
		sprintf(str,"Palette No.%04d",pter[num].palnum);
	else
		sprintf(str,"32K data...");
	YGB_print(gwork,view_x0+163,view_y0+342,str);
	YGB_color(gwork,_C(12,12,24));
	YGB_line(gwork,view_x0+229,view_y0+344,view_x0+252,view_y0+344);
	YGB_color(gwork,_C(24,4,4));
	YGB_line(gwork,view_x0+82,view_y0+344,view_x0+105,view_y0+344);
		/* 倍率変更ボタン(6-10) */
	for (i=0;i<5;i++)
	{
		if (mag==(1<<i))
			SGB_strHolButton(gwork,view_x0+288,view_y0+34+i*17,
			_C(0,0,0),zoomStr[i],6,12,0,_C(13,31,24));
		else
			SGB_strProButton(gwork,view_x0+288,view_y0+34+i*17,
			_C(0,0,0),zoomStr[i],6,12,0,_C(18,18,18));
	}
	for (i=0;i<5;i++)
		YGU_addButton(pwin,view_x0+288,view_y0+34+17*i,40,18);
	
	zoomView(0,0,mag,num,tmpbuf);
	
	
	MOS_rdpos(&dmy,&mx,&my);
	MOS_setpos(0,0);
	MOS_disp(1);
	MOS_disp(0);
	
		/* 最適化ボタン (11)*/
	if (pter[num].palnum==-1 && pter[num].p32buf!=NULL)
		SGB_strProButton(gwork,view_x0+282,view_y0+128,_C(18,6,6),
							" 最適化 ",6,12,0,_C(27,27,27));
	else if (pter[num].p32buf!=NULL)
		SGB_strProButton(gwork,view_x0+282,view_y0+128,_C(6,6,18),
							" 32K に ",6,12,0,_C(27,27,27));
	else
		SGB_strHolButton(gwork,view_x0+282,view_y0+128,_C(2,2,8),
							"必要なし",6,12,0,_C(13,13,13));
	
	YGU_addButton(pwin,view_x0+282,view_y0+128,52,16);
	
	MOS_setpos(mx,my);
	
		/* 最適化レベル用スクロールバー(12) */
	YGU_addLongitudinalbar(gwork,pwin,view_x0+288,view_y0+148,
							12,128,320,16);
		/* 最適化レベル目安表示 */
	YGB_writeMode(gwork,PSET);
	YGB_color(gwork,_C(24,24,24));
	for (i=0;i<3;i++)
		YGB_print(gwork,view_x0+303,view_y0+176+i*42,meyastr[i]);
		/* レベルの数値を表示 */
	sprintf(str1,"%03d",OP_LEVEL);
	SGB_strHolButton(gwork,view_x0+282,view_y0+280,_C(0,0,0),
						str1,6,12,0,_C(24,24,24));
	
		/* 伝染(^^;)ボタン(13) */
	#if 0
	SGB_strProButton(gwork,view_x0+288,view_y0+8,
						_C(11,11,11)," 伝染 ",6,12,0,_C(31,31,31));
	YGU_addButton(pwin,view_x0+288,view_y0+6,40,16);
	#endif
	
	
	itms[0]=pwin;
	for (i=1;i<12;i++)
		itms[i]=YGU_nextItem(itms[i-1]);
	
	YGU_setScrollBarPointer(gwork,itms[11],OP_LEVEL);
	
	
	
	
	MOS_disp(1);
	
	while (act!=pwin)
	{
		act=YGU_allItemsAction(gwork,pwin);
		inum=YGU_itemSerialNumber(pwin,act);
		switch(inum)
		{
			case 1:	break;
			case 2..3:	scr_bar(itms[1],itms[2],mag,num,tmpbuf);break;
			case 4:	/* COPY */
				if (pter[num].palnum==-1)
				{	SPM_errMes("１６色パターンにしか出来ません"); break; }
				if (SPM_sure(" @@ @@このパターンのパレットを退避します",0)==1)
				{
					if (stkpal!=-1)
					{
						PAL_USE[stkpal]--;
						if (PAL_USE[stkpal]==0)
							PALNUM--;
					}
					stkpal=pter[num].palnum;
					PAL_USE[stkpal]++;
				}
				
				break;
			case 5:	/* PASTE */
				if (pter[num].palnum==-1)
				{	SPM_errMes("一旦１６色に最適化してください"); break; }
				if (stkpal==-1)
				{	SPM_errMes("バッファにパレットが有りません"); break; }
				if (SPM_sure(" @@パレットをこれと差し替えます",9999)==1)
				{
					if (pter[num].p32buf==NULL)
					{
						if (SPM_plus32K(num)!=0)
							break;
					}
					PAL_USE[pter[num].palnum]--;
					if (PAL_USE[pter[num].palnum]==0)
						PALNUM--;
					pter[num].palnum=stkpal;
					PAL_USE[stkpal]++;
					if (SOP_optimize2(pter[num].patbuf,PAL[pter[num].palnum],
						pter[num].p32buf,pter[num].patx*pter[num].paty*256,
						PAL[pter[num].palnum][0])!=0)
					{ SPM_errMes("最適化中にエラーが生じました");break;}
					YGU_deleteAll(pwin);
					YGB_putPattern(gwork,zoomDlgBuf,
						view_x0,view_y0,view_x0+view_lx-1,view_y0+view_ly-1);
					_free(tmpbuf);
					SPM_showOne(num);
					SPM_printNumber(WINTOP*6);
					MOS_disp(1);
					goto	pwin_st;
				}
				break;
			case 6..10: 
			{
				mag=(1<<inum-6);
				MOS_disp(0);
				for (i=0;i<5;i++)
				{
					if (mag==(1<<i))
						SGB_strHolButton(gwork,view_x0+288,view_y0+34+i*17,
						_C(0,0,0),zoomStr[i],6,12,0,_C(13,31,24));
					else
						SGB_strProButton(gwork,view_x0+288,view_y0+34+i*17,
						_C(0,0,0),zoomStr[i],6,12,0,_C(18,18,18));
				}
				YGU_resetScrollBar(gwork,itms[1],patx,256/mag);
				YGU_resetScrollBar(gwork,itms[2],paty,256/mag);
				YGB_writeMode(gwork,PSET);
				MOS_disp(1);
				zoomView(0,0,mag,num,tmpbuf);break;
			}
			case 11:
			{
				int		dotnum=pter[num].patx*pter[num].paty*256;
				short	*patbuf=pter[num].p32buf;
				int		flag=0,ret;
				short	thru;
				
				if (pter[num].palnum==-1)
				{
					switch(SPM_getThru())
					{
						case -1:
							goto toLoop;
						case 0:
							thru=patbuf[0];	break;
						case 1:
							thru=patbuf[pter[num].patx-1];	break;
						case 2:
							thru=patbuf[dotnum-pter[num].patx];	break;
						case 3:
							thru=patbuf[dotnum-1];	break;
						case 4:
							thru=-1;
					}
					for (i=0;i<1024;i++)
					{
						if (PAL_USE[i]==0)
						{
							PAL_USE[i]++; flag=1;
							pter[num].palnum=i;	PALNUM++;
							break;
						}
					}
					if (flag==0)
					{
						SPM_errMes("パレットの定義数が多すぎます");
						toLoop:;
						break;
					}
					
					ret=SOP_selPal2(PAL[pter[num].palnum],patbuf,dotnum,
									OP_LEVEL*OP_LEVEL,thru);
					if (ret!=0)
					{ SPM_errMes("最適化中にメモリ不足が生じました。");break;}
					ret=SOP_optimize2(pter[num].patbuf,
								PAL[pter[num].palnum],patbuf,dotnum,thru);
					if (ret!=0)
					{ SPM_errMes("最適化中にメモリ不足が生じました。");break;}
					YGU_deleteAll(pwin);
					MOS_disp(0);
					YGB_putPattern(gwork,zoomDlgBuf,
						view_x0,view_y0,view_x0+view_lx-1,view_y0+view_ly-1);
					_free(tmpbuf);
					SPM_showOne(num);
					SPM_printNumber(WINTOP*6);
					MOS_disp(1);
					goto	pwin_st;
				}
				else
				{
					if ((--PAL_USE[pter[num].palnum]) == 0)
						PALNUM--;
					pter[num].palnum=-1;
					YGU_deleteAll(pwin);
					MOS_disp(0);
					YGB_putPattern(gwork,zoomDlgBuf,
						view_x0,view_y0,view_x0+view_lx-1,view_y0+view_ly-1);
					_free(tmpbuf);
					SPM_showOne(num);
					SPM_printNumber(WINTOP*6);
					MOS_disp(1);
					goto	pwin_st;
				}
			}
			case 12:
			{
				OP_LEVEL=YGU_getScrollBarPointer(itms[11]);
				YGB_writeMode(gwork,PSET);
				sprintf(str1,"%03d",OP_LEVEL);
				MOS_disp(0);
				SGB_strHolButton(gwork,view_x0+282,view_y0+280,_C(0,0,0),
									str1,6,12,0,_C(24,24,24));
				MOS_disp(1);
				break;
			}
			case 13:
			{
				infection();
				break;
			}
			
			default:;
		}
	}
	YGU_deleteAll(pwin);
	MOS_disp(0);
	YGB_putPattern(gwork,zoomDlgBuf,
		view_x0,view_y0,view_x0+view_lx-1,view_y0+view_ly-1);
	MOS_disp(1);
	_free(tmpbuf);
	
	
	
	
	return;
}


void	execItems(ITEM *ext)
{
	int		next;
	int		i,num;
	int		flag=0;
	ITEM	*act=NULL;
	
	itm[1]=ext;
	for (i=2;i<30;i++)
		itm[i]=YGU_nextItem(itm[i-1]);
	
	while (!flag)
	{
		act=YGU_allItemsAction(gwork,ext);
		num=YGU_itemSerialNumber(ext,act);
		switch(num)
		{
			default: break;
			case 1:
			{
				if (SPM_sure(" @@ @@終了してもいいかい？",0)==1)
					flag=1;
				break;
			}
			case 2:	titleMenu(itm[2]);		break;
			case 3: fileMenu(itm[3]);		break;
			case 4:	
			{
				if (PATNUM!=0)
					optimizeMenu(itm[4]);
				else
					SPM_errMes("意味無いよ〜");
				break;
			}
			case 5..28: patWindow(num-5+WINTOP*6);	break;
			case 29:
			{
				next=YGU_getScrollBarPointer(itm[29]);
				if (_abs(next-WINTOP)>=3)
				{
					WINTOP=next;
					SPM_showWindow(WINTOP*6);
					SPM_printNumber(WINTOP*6);
				}
				else if (next!=WINTOP)
					SPM_scrollShowWindow(next-WINTOP);
					SPM_printNumber(WINTOP*6);
				
				YGB_writeMode(gwork,PSET);
			}
		}
	}
	
	YGU_deleteAll(ext);
	return;
}




/* メイン */
int		main(int argc,char *argv[])
{
	
	path[0]=0;
	ITEM	*top;
	
	
	
	init();									/* 各種初期化 */
	/* メモリの確保 */
	if ((sureBuf=_malloc(248*121*2))==NULL)
	{
		YGB_color(gwork,_C(27,27,31));
		YGB_print(gwork,120,200,
					"RAMDISKをはずすか、残念だけどメモリを買うかしてね");
		term();
		return(1);
	}
	if ((fileSelBuf=_malloc(120*248*2))==NULL)
	{	SPM_sure(" @@ @@メモリが足りません(;-;)",2); term(); return(1); }
	if ((zoomDlgBuf=_malloc(view_lx*view_ly*2))==NULL)
	{	SPM_sure(" @@ @@メモリが足りません(;-;)",2); term(); return(1); }
	if ((magBuf=_malloc(256*256*2))==NULL)
	{	SPM_sure(" @@ @@メモリが足りません(;-;)",2); term(); return(1); }
	if ((sureBuf=_malloc(248*121*2))==NULL)
	{	SPM_sure(" @@ @@メモリが足りません(;-;)",2); term(); return(1); }
	if ((errMesBuf=_malloc(485*16*2))==NULL)
	{	SPM_sure(" @@ @@メモリが足りません(;-;)",2); term(); return(1); }
	if ((frameBuf=_malloc(76*99*2))==NULL)
	{	SPM_sure(" @@ @@メモリが足りません(;-;)",2); term(); return(1); }
	
	/* -A オプションのチェック */
	if (argc==3)
	{
		if ((strcmp(argv[1],"-a")==0)||(strcmp(argv[1],"-A")==0))
		{
			if (strlen(argv[2])>3)
			{
				SPM_sure(" @@ @@拡張子にしては長いよ @@＞ -Aオプション",2); 
				term();
				return(1);
			}
			else
				strcpy(pat_ext,argv[2]);
		}
	}
	
		
	
	
	top=addItems();							/* アイテムの登録→実行 */
	MOS_disp(1);
	SPM_about();							/* あばうと */
	execItems(top);
	term();									/* 終了 */
	return(0);
}
