/********************************

		今日の運勢

					メイン

 ********************************/

#include	<stdio.h>
#include	<stdlib.h>
#include	<sys/bios.h>

#include	"common.h"
#include	"fortune.h"


/*
#define	LOOP
*/


/*** 所有者情報 *******/
typedef struct {
	char	name[16];			/* 名前 */
	int		birth_year;			/* 西暦 */
	char	birth_month;		/* 1〜12 */
	char	birth_day;			/* 1〜31 */
	char	sex;				/* 0=?, 1=male, 2=female */
	char	bloodtype;			/* 0=?, 1=A, 2=B, 3=O, 4=AB */
} OWNER;


/****************************
    禁則処理
		引数	c = 文字
		戻り値	禁則文字か
 ****************************/
static
Bool	check_kinsoku(u_short c)
{
static u_short	kinsoku[] = {
					'、', '。', '，', '．', '　',
					'】', '』', '」', '》', '〉', '｝', '］', '〕',
					'）', '”', '：', '；', '？', '！',
					'ぁ', 'ぃ', 'ぅ', 'ぇ', 'ぉ',
					'っ', 'ゃ', 'ゅ', 'ょ', 'ゎ',
					'ァ', 'ィ', 'ゥ', 'ェ', 'ォ',
					'ッ', 'ャ', 'ュ', 'ョ', 'ヮ',
					'ヵ', 'ー',
					'−', '…', 'ヽ', 'ヾ', 'ゝ', 'ゞ',
					0
				};
	u_short*	p;

	for (p = kinsoku; *p; p++) {			/* 禁則文字チェック */
		if ( c == *p ) {
			return	TRUE;
		}
	}
	return	FALSE;
}

/***********************************
    メッセージ表示
		引数	name = 名前
				   p = メッセージ
 ***********************************/
static
void	print_message(char far* name, u_char far* p)
{
	u_short	code;
	int		x, y;

	text_screen_init();						/* テキストスクリーン初期化 */
	x = 2;
	x += text_put_string(x, 1, name);
	text_put_string(x, 1, "さんの今日の運勢");

	x = 1;
	y = 4;
	while ( 1 ) {
		if ( *p == '\0' ) {					/* 終端 */
			return;
		}
		if ( (code = (u_short)*p++) >= 0x80 ) {		/* 全角 */
			code <<= 8;
			code += (u_short)*p++;
		}
		if ( (x >= 27) || ((x >= 24) && !check_kinsoku(code)) ) {
			x = 1;							/* 改行 */
			y += 2;
			if ( y >= 18 ) {
				return;
			}
		}
		text_put_char(x, y, code);			/* 表示 */
		x++;
	}
}

/******************
    語句の初期化
 ******************/
static
void	clear_word(void)
{
	F_WORD*	p;
	int		i;

	p = word_data;							/* 語句リスト */
	while ( p->num ) {
		for (i = 0; i < p->num; i++) {
			p->flag[i] = FALSE;				/* 未使用 */
		}
		p++;
	}
}

/**********************************
    メッセージ追加
		引数	mes = メッセージ
				  p = バッファ
		戻り値	バッファポインタ
 **********************************/
static
char far*	add_message(char far* mes, char far* p)
{
	F_WORD*	wp;
	char	c;
	int		n;

	while ( (c = *mes++) ) {
		if ( (u_char)c >= 0x80 ) {					/* 全角 */
			*p++ = c;
			*p++ = *mes++;
		}
		else if ( c == '%' ) {
			c = *mes++;								/* コマンド */
			wp = word_data;							/* 語句リスト */
			while ( wp->num ) {
				if ( c == wp->command ) {
					do {							/* 使っていない語句 */
						n = rnd(wp->num);
					} while ( wp->flag[n] );
					wp->flag[n] = TRUE;
					p = add_message(wp->word[n], p);
													/* 語句追加 */
					break;
				}
				wp++;
			}
		}
		else {
			*p++ = c;
		}
	}
	return	p;
}

/******************************************
    メッセージ作成
		引数	buf = メッセージバッファ
 ******************************************/
static
void	make_message(char far* buf)
{
	char far*	p;
	int			i;

	clear_word();						/* 語句の初期化 */
	p = buf;							/* 運勢メッセージ */
	p = add_message("%0", p);			/* 出だし */
	for (i = 0; i < 3; i++) {
		p = add_message("%1", p);		/* 主文 */
	}
	p = add_message("%2", p);			/* 締め */
	*p = '\0';
}

/************************************
    乱数シード
		引数	owner = 所有者情報
		戻り値	シード
 ************************************/
static
u_int	rnd_seed(OWNER far* owner)
{
	u_int		seed, i;
	u_int far*	p;

	seed = rtc_get_datetime(RTC_YEAR)*512;		/* 年 */
	seed += rtc_get_datetime(RTC_MONTH)*32;		/* 月 */
	seed += rtc_get_datetime(RTC_DATE);			/* 日 */
	for (i = 0, p = (u_int far*)owner; i < sizeof(OWNER)/sizeof(u_int); i++) {
		seed += *p++;							/* 所有者 */
	}
	return	(seed & 0x7fff);
}

/************
    メイン
 ************/
int		main(int argc, char* argv[])
{
	static char		buf[0x800];
	OWNER	owner;

	sys_get_ownerinfo(sizeof(OWNER), (char far*)&owner);
											/* 所有者情報取得 */
#ifdef	LOOP
	srand((u_int)(sys_get_tick_count() & 0x7fff));		/* 乱数初期化 */
#else
	srand(rnd_seed(&owner));				/* 乱数初期化 */
#endif

	owner.name[16] = '\0';
#ifdef	LOOP
	do {
		make_message(buf);					/* メッセージ作成 */
		print_message(owner.name, buf);		/* 表示 */
	} while ( !(key_wait() & KEY_START) );
#else
	make_message(buf);						/* メッセージ作成 */
	print_message(owner.name, buf);			/* 表示 */
	key_wait();
#endif

	return	0;
}

/************** End of File ***********************************************/