/***************************************

		パズル「石狩」

				グラフィック共通

 ***************************************/

#include	"common.h"
#include	"graph.h"
#include	"pad.h"


#define		LCD_COL(c0, c1, c2, c3, c4, c5, c6, c7)	\
					((c0) | ((c1) << 4) | ((c2) << 8) | ((c3) << 12)),\
					((c4) | ((c5) << 4) | ((c6) << 8) | ((c7) << 12))
														/* LCD階調 */
#define		PALET_COL(c0, c1, c2, c3)	\
					((c0) | ((c1) << 4) | ((c2) << 8) | ((c3) << 12))
														/* パレット */
#define		FONT_COL(c0, c1)	((c1) | ((c0) << 2))	/* フォント */


/*** キャラクタコード *******/
#define		CHR_NUMBER		0x0900						/* 数字 */
#define		CHR_ALPHABET	(CHR_NUMBER + 10)			/* アルファベット */


static
u_int	lcd_color[8] = {0, 3, 5, 7, 9, 11, 13, 15};		/* 画面階調 */

static
u_int	palet_data[] = {				/* パレット */
			PALET_COL(0, 1, 2, 3),
			PALET_COL(0, 0, 0, 0),
			PALET_COL(0, 0, 0, 0),
			PALET_COL(0, 0, 0, 0),

			PALET_COL(0, 6, 0, 7),
			PALET_COL(0, 7, 7, 7),
			PALET_COL(0, 4, 0, 5),
			PALET_COL(0, 0, 0, 0),

			PALET_COL(0, 0, 0, 0),
			PALET_COL(0, 0, 0, 0),
			PALET_COL(0, 0, 0, 0),
			PALET_COL(0, 0, 0, 0),

			PALET_COL(0, 3, 5, 7),
			PALET_COL(0, 1, 6, 7)
		};

u_int		spr_no;						/* スプライト枚数 */
int			fade_flag;					/* 画面フェード状態 */
static int	fade_cnt;					/* 画面の明るさ */


/**************************
    フェードイン・アウト
 **************************/
static
void	set_fade(void)
{
	u_int far*	p;
	u_int	col[2];
	int		i, j;

	if ( fade_flag == 1 ) {				/* フェードイン */
		if ( ++fade_cnt >= FADE_COUNT ) {
			fade_flag = 0;
			fade_cnt = FADE_COUNT;
		}
	}
	else {								/* フェードアウト */
		if ( --fade_cnt <= 0 ) {
			fade_flag = 0;
			fade_cnt =0;
		}
	}
	p = lcd_color;						/* 画面階調 */
	for (i = 0; i < 2; i++) {
		col[i] = 0x0000;
		for (j = 0; j < 16; j += 4) {
			col[i] |= ((*p++)*fade_cnt/FADE_COUNT) << j;
		}
	}
	lcd_set_color(col[0], col[1]);		/* 画面階調設定 */
}

/******************
    システム同期
 ******************/
void	v_synch(void)
{
	rand();							/* 乱数 */
	spr_no = 0;						/* スプライト枚数 */
	sys_wait(1);					/* 同期待ち */
	pad_synch();					/* パッド同期処理 */
	if ( fade_flag ) {
		set_fade();					/* フェードイン･アウト */
	}
}

/*********************************
    文字列描画
		引数	x, y = 描画位置
				 str = 文字列
 *********************************/
void	draw_str(int x, int y, char far* str)
{
	char	c;

	while ( (c = *str++) ) {
		screen_fill_char(SCREEN2, x++, y, 1, 1,
					(c == ' ') ? CHR_SPACE : (CHR_ALPHABET - 'A' + (int)c));
	}
}

/**********************************
    数字描画
		引数	x, y = 描画位置
				 num = 数字
			    keta = 桁数
 **********************************/
void	draw_num(int x, int y, int num, int keta)
{
	int		i;

	x += keta - 1;
	for (i = 0; i < keta; i++) {
		screen_fill_char(SCREEN2, x--, y, 1, 1,
					(num || (i == 0)) ?  CHR_NUMBER + (num % 10) : CHR_SPACE);
		num /= 10;
	}
}

/***********************************
    複数キャラクタ設定
		引数	code = 先頭コード
				x, y = 位置
				w, h = 大きさ
 ***********************************/
void	set_chr(u_short code, int x, int y, int w, int h)
{
	static u_short	buf[16];
	u_short*	p;
	int			i, j;

	p = buf;								/* キャラクタコードバッファ */
	for (j = 0; j < h; j++) {
		for (i = 0; i < w; i++) {
			*p++ = code++;
		}
		code += 8 - w;
	}
	screen_set_char(SCREEN2, x, y, w, h, buf);		/* キャラクタ設定 */
}

/*************************************
    フォントをキャラクタに設定
			引数	   c = フォント
					code = コード
					 num = 数
 *************************************/
static
void	set_font_chr(int c, int code, int num)
{
	static u_char	buf[8], buf2[8*2];
	u_char far	*p0, *p1;
	int		i;

	code &= CFM_FONT;
	for (; num > 0; num--) {
		text_get_fontdata(c++, buf);			/* フォントデータ */
		p0 = buf;
		p1 = buf2;
		for (i = 0; i < 8; i++) {
			*p1++ = *p0;
			*p1++ = *p0 | (*p0 >> 1);
			p0++;
		}
		font_set_colordata(code++, 1, buf2);	/* キャラクタ設定 */
	}
}

/********************************
    画面初期化
		引数	res = リソース
		戻り値	次のリソース
 ********************************/
res_t far*	init_screen(res_t far* res)
{
	int		i, j;

	lcd_off();										/* ディスプレイＯＦＦ */

	display_control(DCM_SCR1 | DCM_SCR2 | DCM_SPR);	/* ディスプレイ設定 */
	screen_set_scroll(SCREEN1, 0, 0);				/* スクロール値初期化 */
	screen_set_scroll(SCREEN2, 0, 0);

	lcd_set_color(0x0000, 0x0000);					/* 画面階調初期化 */
	fade_flag = 0;
	fade_cnt = 0;

	font_set_colordata(0x0000,
			 ((res_image_t far*)res)->width*((res_image_t far*)res)->height,
									(char far*)res + sizeof(res_image_t));
													/* キャラクタ定義 */
	res = (res_t far*)((char far*)res + (res->size << 4));

	set_font_chr((int)'0', CHR_NUMBER, 10);			/* 数字キャラクタ */
	set_font_chr((int)'A', CHR_ALPHABET, 26);		/* 英字キャラクタ */

	for (i = 0; i < sizeof(palet_data)/sizeof(u_int); i++) {
		palette_set_color(i, palet_data[i]);		/* パレット設定 */
	}

	for (i = 0; i < SCREEN_CHAR_HEIGHT; i++) {		/* 背景描画 */
		for (j = 0; j < SCREEN_CHAR_WIDTH; j++) {
			screen_fill_char(SCREEN1, j, i, 1, 1,
								CHR_BACK + ((j + (i + 1)/2) % 2)
														+ ((i + 1) % 2)*8);
		}
	}

	lcd_on();										/* ディスプレイＯＮ */

	return	res;
}

/*************** End of File ********************************************/