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

		パズル「石狩」

					ゲーム画面

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

#include	"common.h"
#include	"ishikari.h"
#include	"graph.h"
#include	"screen.h"


#define		FIELD_X		 1				/* フィールドの位置 */
#define		FIELD_Y		 1
#define		AREA_X		22				/* エリア番号描画位置 */
#define		AREA_Y		 3
#define		STAGE_X		AREA_X			/* ステージ番号描画位置 */
#define		STAGE_Y		 6
#define		EXIT_X		22				/* "START:EXIT"描画位置 */
#define		EXIT_Y		12
#define		MES_X		96				/* メッセージ中心位置 */
#define		MES_Y		72


/********************
    フィールド描画
 ********************/
void	draw_field(void)
{
	STONE far*	p;
	int		i, j, sx, x, y;

	p = &field->stone[0][0];						/* フィールド */
	sx = FIELD_X;
	 y = FIELD_Y;
	for (i = 0; i < FIELD_H; i++) {
		x = sx;
		for (j = 0; j < FIELD_W; j++) {
			if ( *p > 0 ) {
				switch ( stone_cnt[i][j] ) {
				  case 0 :							/* 石 */
					set_chr(CHR_STONE + (*p - 1)*2, x, y, 2, 2);
					break;
				  case 1 :							/* フラッシュ */
					set_chr(CHR_FLASH, x, y, 2, 2);
					break;
				  case FLASH_TIME - 1 :				/* 消去 */
					screen_fill_char(SCREEN2, x, y, 2, 2, CHR_SPACE);
					break;
				}
			}
			p++;
			x += 2;
		}
		sx--;
		y += 2;
	}
}

/******************
    カーソル描画
 ******************/
static
void	draw_cursor(void)
{
	int		x, y;

	x = FIELD_X*8 + (cursor_x*2 - cursor_y)*(16/2);		/* 画面上の座標 */
	y = FIELD_Y*8 + cursor_y*16;
	set_sprite(SPR_CURSOR,                           x - 3,  y - 3);
	set_sprite(SPR_CURSOR | CFM_FLIP_H,              x + 11, y - 3);
	set_sprite(SPR_CURSOR | CFM_FLIP_V,              x - 3,  y + 11);
	set_sprite(SPR_CURSOR | CFM_FLIP_H | CFM_FLIP_V, x + 11, y + 11);
}

/**************
    光線描画
 **************/
static
void	draw_ray(void)
{
	RAY far*	p;
	int		i, x, y;

	for (i = 0, p = ray; i < RAY_MAX; i++, p++) {
		x = FIELD_X*8 + (p->x*2 - p->y)/2 + 4;
		y = FIELD_Y*8 + p->y + 4;
		if ( (x > -8) && (x < LCD_PIXEL_WIDTH)
								&& (y > -8) && (y < LCD_PIXEL_HEIGHT) ) {
			set_sprite(SPR_RAY + p->dir, x, y);		/* スプライト描画 */
		}
	}
}

/********************
    メッセージ表示
 ********************/
static
void	draw_message(void)
{
static int	clear_dx[3] = {-32, -8, 16},		/* 文字表示位置 */
			miss_dx[4] = {-34, -16, 2, 22};
	int far*	p;
	int		code, i, k, t, x;

	if ( clear_flag > 64 ) {					/* クリア */
		code = SPR_CLEAR;
		   k = (clear_flag >= 64 + 4*3) ? 3 : ((clear_flag - 64)/4 + 1);
		   p = clear_dx;
		   t = (clear_flag - 64)*4;
	}
	else if ( clear_flag < -96 ) {				/* 失敗 */
		code = SPR_MISS;
		   k = (clear_flag <= -96 - 5*4) ? 4 : ((-clear_flag - 96)/5 + 1);
		   p = miss_dx;
		   t = (-clear_flag - 96)*3;
	}
	else {
		return;
	}

	if ( t > 64 ) {
		t = 64;
	}
	for (i = 0; i < k; i++) {					/* 文字表示 */
		x = MES_X + (*p++)*t/64;
		set_sprite(code,     x,     MES_Y - 8);
		set_sprite(code + 1, x + 8, MES_Y - 8);
		set_sprite(code + 8, x,     MES_Y);
		set_sprite(code + 9, x + 8, MES_Y);
		code += 2;
	}
}

/**********************
    クリアマーク描画
 **********************/
static
void	draw_mark(void)
{
	static int	mark[3] = {SPR_MARK + 8, SPR_MARK, SPR_MARK + 9};
	int		k;

	k = 1;
	if ( check_area(area_num) ) {				/* エリアクリア */
		if ( clear_flag > 0 ) {
			k = clear_flag/12 % 4;
			if ( k == 3 ) {
				k = 1;
			}
		}
		set_sprite(mark[k], AREA_X*8 - k + 33, AREA_Y*8 - 4);
	}
	if ( check_stage(area_num, stage_num) ) {	/* ステージクリア */
		if ( clear_flag > 0 ) {
			k = (clear_flag + 16)/12 % 4;
			if ( k == 3 ) {
				k = 1;
			}
		}
		set_sprite(mark[k], STAGE_X*8 - k + 39, STAGE_Y*8 - 6);
	}
}

/**************
    画面描画
 **************/
void	draw_screen(void)
{
	v_synch();							/* 同期待ち */
	draw_field();						/* フィールド描画 */
	if ( cursor_disp ) {
		draw_cursor();					/* カーソル描画 */
	}
	else {
		draw_message();					/* クリア、失敗メッセージ表示 */
	}
	draw_ray();							/* 光線描画 */
	draw_mark();						/* クリアマーク描画 */
	sprite_set_range(0, spr_no);		/* スプライト表示数設定 */
}


/******************
    ステージ描画
 ******************/
void	draw_stage(void)
{
	screen_fill_char(SCREEN2, 0, 0,						/* 画面クリア */
						SCREEN_CHAR_WIDTH, SCREEN_CHAR_HEIGHT, CHR_SPACE);
	draw_str(AREA_X, AREA_Y, "AREA");					/* エリア番号描画 */
	draw_num(AREA_X + 2, AREA_Y + 1, area_num + 1, 2);
	draw_str(STAGE_X, STAGE_Y, "STAGE");				/* ステージ番号描画 */
	draw_num(STAGE_X + 2, STAGE_Y + 1, stage_num + 1, 2);
	set_chr(CHR_Y4, STAGE_X,     STAGE_Y + 2, 2, 1);	/* ← Y4 */
	set_chr(CHR_Y2, STAGE_X + 4, STAGE_Y + 2, 2, 1);	/* Y2 → */
	set_chr(CHR_EXIT, EXIT_X, EXIT_Y, 6, 1);			/* "START:EXIT" */
}

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