/*
 * $Id: m_msg_draw_window.c,v 1.1 2003/06/06 00:15:12 tong Exp $
 *
 *	メッセージ表示のライブラリーのインクルードソースファイル
 *
 * $Log: m_msg_draw_window.c,v $
 * Revision 1.1  2003/06/06 00:15:12  tong
 * source files for localization from Nintendo.
 *
 * Revision 1.20  2000-06-16 11:51:37+09  sakakibara
 * 余分な同期関数を外した。
 *
 */

/*************ウインドウ枠の描画******************/

/* ウインドウ用 拡大・縮小マトリックスのセット */
static void mMsg_SetMatrix(M_MSG_WIN *win_p, GAME *game_p, int entry_disp_type)
{
    GRAPH *graph_p = game_p->graph;
    const float scale = win_p->now_window_scale;
    const float centerX = (win_p->center_rectX - (float)SCREEN_WD*0.5F)*M_FONT_SCALE_COORDINATE;
    const float centerY = (-win_p->center_rectY + (float)SCREEN_HT*0.5F)*M_FONT_SCALE_COORDINATE;
    
    /* ゼルダ独自のモデリングマトリックスのクリア */
    Matrix_push();
    Matrix_translate(centerX, centerY, 0.0F, MULT_MTX);
//    Matrix_translate(0.0F, 0.0F, 0.0F, MULT_MTX);
    Matrix_scale(scale, scale, scale, MULT_MTX);
    
    OPEN_DISP(graph_p);
    if(entry_disp_type == M_FONT_ENTRY_FONT_DISP) {
	/* gDPPipeSync(NEXT_FONT_DISP); */
	gSPMatrix(NEXT_FONT_DISP,
		  Matrix_to_Mtx_new(graph_p),
		  G_MTX_MODELVIEW | G_MTX_LOAD | G_MTX_NOPUSH);
    }
    else {
	/* gDPPipeSync(NEXT_DISP); */
	gSPMatrix(NEXT_DISP,
		  Matrix_to_Mtx_new(graph_p),
		  G_MTX_MODELVIEW | G_MTX_LOAD | G_MTX_NOPUSH);
    }
    CLOSE_DISP(graph_p);
}

/* ウインドウ用 拡大・縮小マトリックスのアンセット */
static void mMsg_UnSetMatrix(void)
{
    Matrix_pull();
}

/* 名前ウインドウ枠の描画 */
static void mMsg_DrawNameWindow(M_MSG_WIN *win_p,
				GAME *game_p,
				int entry_disp_type)
{
    GRAPH *graph_p = game_p->graph;
    
    OPEN_DISP(graph_p);
    if(entry_disp_type == M_FONT_ENTRY_FONT_DISP) {
	gDPSetPrimColor(NEXT_FONT_DISP, 0, 255,
			win_p->name_window_color.r,
			win_p->name_window_color.g,
			win_p->name_window_color.b,
			255);
	gSPDisplayList(NEXT_FONT_DISP, con_kaiwaname_modelT);
    }
    else {
	gDPSetPrimColor(NEXT_DISP, 0, 255,
			win_p->name_window_color.r,
			win_p->name_window_color.g,
			win_p->name_window_color.b,
			255);
	gSPDisplayList(NEXT_DISP, con_kaiwaname_modelT);
    }
    CLOSE_DISP(graph_p);
}

/* 呼び出し側の名前描画 */
static void mMsg_DrawWindowClientName(M_MSG_WIN *win_p,
				GAME *game_p,
				int entry_disp_type)
{
    unchar	name[PERSON_NAME_NUM];
    /** 2000. 2. 8. gen */
    mNpc_GetNpcWorldName(name, win_p->client_actor_p),
    mFont_SetLineStrings_AndSpace(game_p,
				  name,
				  win_p->client_name_total,
				  win_p->client_name_rectX,
				  win_p->client_name_rectY,
				  (int)(win_p->name_color.r),
				  (int)(win_p->name_color.g),
				  (int)(win_p->name_color.b),
				  (int)(win_p->name_color.a),
				  FALSE,
				  FALSE,
				  TRUE,
				  1.0F,
				  1.0F,
				  entry_disp_type);
}

static void mMsg_DrawWindowTurnButton(M_MSG_WIN *win_p,
				      GAME *game_p,
				      int entry_disp_type)
{
    if((win_p->display_button_turn != False) && (win_p->lock_continue == False)) {
	mFont_SetMarkChar(game_p,
			  MARK_NEXT,	/* 記号コード */
			  257.0F,	/* 画面座標系の表示位置Ｘ */
			  136.0F,	/* 画面座標系の表示位置Ｙ */
			  (int)(win_p->button_turn_color.r),		/* 文字の色 */
			  (int)(win_p->button_turn_color.g),		/* 文字の色 */
			  (int)(win_p->button_turn_color.b),		/* 文字の色 */
			  (int)(win_p->button_turn_color.a),		/* 文字の色 */
			  FALSE,	/* 反転文字にするか */
			  1.0F,	/* 表示倍率（基本は１２×１６ドット） */
			  1.0F,	/* 表示倍率（基本は１２×１６ドット） */
			  entry_disp_type);
    }
}

/* ウインドウ枠の描画 */
static void mMsg_DrawWindowBody(M_MSG_WIN *win_p,
				GAME *game_p,
				int entry_disp_type)
{
    GRAPH *graph_p = game_p->graph;
    rgba_t *window_color_p = &(win_p->window_color);
    
    OPEN_DISP(graph_p);
    /* "Rectangle"風に描画 */
    if(entry_disp_type == M_FONT_ENTRY_FONT_DISP) {
	gSPDisplayList(NEXT_FONT_DISP, mMsg_init_disp);
	gDPSetPrimColor(NEXT_FONT_DISP, 0, 255,
			window_color_p->r,
			window_color_p->g,
			window_color_p->b,
			window_color_p->a);
	gSPDisplayList(NEXT_FONT_DISP, con_kaiwa2_modelT);
	if(win_p->display_name) {
	    /* 名前ウインドウ枠の描画 */
	    mMsg_DrawNameWindow(win_p,
				game_p,
				entry_disp_type);
	    /* 呼び出し側の名前描画 */
	    mMsg_DrawWindowClientName(win_p,
				      game_p,
				      entry_disp_type);
	}
	mMsg_DrawWindowTurnButton(win_p,
				  game_p,
				  entry_disp_type);
    }
    else {
	gSPDisplayList(NEXT_DISP, mMsg_init_disp);
	gDPSetPrimColor(NEXT_DISP, 0, 255,
			window_color_p->r,
			window_color_p->g,
			window_color_p->b,
			window_color_p->a);
	gSPDisplayList(NEXT_DISP, con_kaiwa2_modelT);
	if(win_p->display_name) {
	    /* 名前ウインドウ枠の描画 */
	    mMsg_DrawNameWindow(win_p,
				game_p,
				entry_disp_type);
	    /* 呼び出し側の名前描画 */
	    mMsg_DrawWindowClientName(win_p,
				      game_p,
				      entry_disp_type);
	}
	mMsg_DrawWindowTurnButton(win_p,
				  game_p,
				  entry_disp_type);
    }
    CLOSE_DISP(graph_p);
}

