
/* ＳＥＬＥＣＴ  Ｖｅｒ１．２ */
/*  Programmed by Yasu.Hara.  */

/* ヘッダ取り込み */
#include	<stdio.h>
#include	<stdlib.h>
#include	<egb.h>
#include	<mos.h>
#include	<snd.h>
#include	<fmc.h>
#include	<ctype.h>
#include	<string.h>

/* 各値の定義 */
#define		ARGMAX	20		/* メニューの最大数 */
#define		LENMAX	79		/* メニューの文字列の最大長さ */
#define		DOT		24		/* ボックスの縦方向ドット数 */
#define		CHR		'_'		/* スペースに置き換える文字 */
#define		COLOR1	1		/* カーソルが指してないボックスの色 */
#define		COLOR2	2		/* カーソルが指しているボックスの色 */
#define		iskanji(c)	(0x81<=c && c<=0x9f || 0xe0<=c && c<=0xfc)
							/* 漢字の１バイト目かどうかのチェック */

/* 各種シンボル */
int		x=20, y[ARGMAX], l[ARGMAX];
char	menu[ARGMAX][LENMAX+1];
char	work[1536], mwork[4096], para[128];

/* ボックスを描く */
void	box_write(num, col)
int		num, col;
{
	EGB_writePage(work, 1);
	EGB_color(work, 2, col);
	WORD(para+4)=(WORD(para+0)=320-x*4)+x*8-1;
	WORD(para+6)=(WORD(para+2)=y[num])+DOT-1;
	EGB_rectangle(work, para);
	EGB_writePage(work, 0);
}

/* メインルーチン */
int		main(argc, argv)
int		argc;
char	*argv[];
{
	char	*p;
	int		i, j, n, mx, my;
	FILE	*fp;

	switch (--argc) {
		case 0:		/* パラメータがないよ〜 */
			return 0;
		case 1:		/* パラメータが１つだけ */
			if ((fp=fopen(argv[1], "rt"))==NULL) return 0;
			for (i=0; i<ARGMAX; i++) {
				if (fgets(p=&menu[i][0], LENMAX+1, fp)==NULL) break;
				if ((p=strchr(p, '\n'))!=NULL)
					*p='\0';
				else
					while ((j=fgetc(fp))!='\n' && j!=EOF) ;
			}
			argc=i;
			fclose(fp);
			break;
		default:	/* パラメータが２つ以上 */
			argc=_min(argc, ARGMAX);
			for (i=0; i<argc; i++) {
				strncpy(p=&menu[i][0], *++argv, LENMAX);
				p[LENMAX]='\0';
				while (*p!='\0') {
					if (*p==CHR) *p=' ';
					j=*p++;
					if (iskanji(j) && *p++=='\0') break;
				}
			}
	}
	y[0]=(j=(480-argc*DOT)/(argc+3))*2;
	for (i=1; i<argc; i++)
		y[i]=y[i-1]+j+DOT;
	for (i=0; i<argc; i++)
		x=_max(x, l[i]=strlen(&menu[i][0]));
	x=_min(x+8, 80);

	EGB_init(work, sizeof(work));
	EGB_resolution(work, 0, 3);
	EGB_resolution(work, 1, 3);
	EGB_displayPage(work, 0, 0);
	EGB_paintMode(work, 0x22);

	for (i=0; i<argc; i++) {
		box_write(i, COLOR1);
		WORD(para+2)+=DOT/2+7;
		WORD(para+0)=320-(WORD(para+4)=j=l[i])*4;
		_move(&menu[i][0], &para[6], j);
		EGB_sjisString(work, para);
	}

	EGB_displayPage(work, 0, 3);

	_fill_char(mwork, sizeof(mwork), 0);
	MOS_start(mwork, sizeof(mwork));
	SND_elevol_init();
	SND_elevol_set(1, 127, 127);
	MOS_resolution(0, 3);
	MOS_horizon(0, 639);
	MOS_vertical(0, 479);
	MOS_setpos(319,239);
	MOS_disp(1);

	n=argc;
	do {
		MOS_rdpos(&j, &mx, &my);
		i=argc;
		if ((mx=mx-320+x*4)>=0 && mx<x*8)
			for (i=0; i<argc; i++)
				if ((mx=my-y[i])>=0 && mx<DOT) break;
		if (i!=n) {
			MOS_disp(0);
			if (n<argc) box_write(n, COLOR1);
			n=i;
			if (n<argc) box_write(n, COLOR2);
			MOS_disp(1);
		}
	} while (j==0 || n>=argc);
	MOS_end();
	EGB_init(work, sizeof(work));
	return n+1;
}
