/************************************************************************
 *									*
 *	スター フォックス 文字表示					*
 *				1996年 3月28日(木曜日) 14時11分42秒 JST	*
 ************************************************************************/
#include "sys_main.h"
#include "fox_texture.h"
#include "fox_moji.h"

#include "fox_msg_data.c"
#include "fox_msg_tbl.c"

/*======================================================================*
 *									*
 *	メッセージデータのアドレス取得					*
 *									*
 *======================================================================*/
unsigned short *get_msg_add( unsigned short data )
{
    MSG_T *p;

    p = msg_tbl;
    while( p->msg_num != -1 ) {
	if( p->msg_num == data ) {
	    return( p->msg_add );
	}
	p++;
    }

    return( NULL );
}

/*======================================================================*
 *									*
 *	メッセージデータの番号取得					*
 *									*
 *======================================================================*/
unsigned short get_msg_num( unsigned short *data )
{
    MSG_T *p;

    p = msg_tbl;
    while( p->msg_add != NULL ) {
	if( p->msg_add == data ) {
	    return( p->msg_num );
	}
	p++;
    }

    return( -1 );
}

/*======================================================================*
 *									*
 *	文字数の取得							*
 *									*
 *======================================================================*/
int msglen( unsigned short *a )
{
    int cnt;
    unsigned short *p;

    cnt = 0;
    p = a;

    while( *p != 0x00 ) {
	/** コントロールコードはカウントしない **/
	if( (*p > 0x0f) || (*p == 0x0c) ) cnt ++;
	p ++;
    }

    return( cnt );
}

/*======================================================================*
 *									*
 *	文字数の取得							*
 *									*
 *======================================================================*/
int msglen2( unsigned short *a )
{
    int cnt;
    unsigned short *p;

    cnt = 0;
    p = a;

    while( *p != 0x00 ) {
	cnt ++;
	p ++;
    }

    return( cnt );
}

/*======================================================================*
 *									*
 *	１文字表示							*
 *									*
 *======================================================================*/
static void putc(
    Gfx		**d,
    unsigned short a,
    int		xp,
    int		yp
)
{
#if 4 < FOX_DEBUG
    if((int)font_00 & 0xf) {
	PRINTF("font_00 --> %X\n", font_00);
    }
#endif

    gDPLoadTextureBlock_4b((*d)++, font_00 + (16 / 2 * 14) * (a >> 2),
			   G_IM_FMT_CI, 16, 14,
			   a & 0x3, G_TX_NOMIRROR, G_TX_NOMIRROR,
			   G_TX_NOMASK, G_TX_NOMASK,
			   G_TX_NOLOD, G_TX_NOLOD);
    gSPTextureRectangle((*d)++, xp << 2, yp << 2,
			(xp + 14) << 2, yp + 14 << 2,
			G_TX_RENDERTILE, 2 << 5, 0 << 5, 1 << 10, 1 << 10);
}

/*======================================================================*
 *									*
 *	文字列表示							*
 *									*
 *======================================================================*/
int puts(
    Gfx		**d,
    unsigned short *a,
    int		xp,
    int		yp,
    int		n
)
{
    int		i, x = xp, y = yp, r;

#if 4 < FOX_DEBUG
    if((int)moji_tlut & 0xf) {
	PRINTF("moji_tlut --> %X\n", moji_tlut);
    }
#endif
    gDPSetPrimColor( (*d)++, 0, 0, 0xff, 0xff, 0xff, 0xff);

    gDPSetTextureLUT((*d)++, G_TT_RGBA16);
    gDPLoadTLUT((*d)++, 0x40, 0x100, moji_tlut);
    for(i = 0; *(a + i) != NULL && i < n; i += 1) {
	r = 0;
	switch(*(a + i)) {
	case 0x01:
	    x = xp;
	    y += 16;
	    break;
	case 0x02:
	    break;
	case 0x03:
	    break;
	case 0x04:
	    break;
	case 0x05:
	    break;
	case 0x06:
	    break;
	case 0x07:
	    break;
	case 0x08:
	case 0x09:
	case 0x0a:
	case 0x0b:
	    break;
	case 0x0d:
	    break;
	case 0x0e:
	    break;
	case 0x0f:
	    break;
	case 177:
	case 178:
	case 179:
	case 180:
	    gDPSetPrimColor( (*d)++, 0, 0, 0xff, 0xff, 0x00, 0xff);
	case 0x0c:
	default:
	    putc(d, *(a + i), x, y);
	    x += 14;
	    r = 1;
	    break;
	}
    }
    return r;
}

/*======================================================================*
 *									*
 *	文字列表示 改							*
 *									*
 *======================================================================*/
void puts_evo(
    Gfx		**d,
    unsigned short *a,
    int		xp,
    int		yp,
    int		ymax,
    int		ymin,
    int		n
)
{
    int		i, x = xp, y = yp;

    gDPSetTextureLUT((*d)++, G_TT_RGBA16);
    gDPLoadTLUT((*d)++, 0x40, 0x100, moji_tlut);
    for(i = 0; *(a + i) != NULL && i < n; i += 1) {
	switch(*(a + i)) {
	case 0x01:
	    x = xp;
	    y += 21;
	    break;
	case 0x02:
	    break;
	case 0x03:
	    break;
	case 0x04:
	    break;
	case 0x05:
	    break;
	case 0x06:
	    break;
	case 0x07:
	    break;
	case 0x08:
	    break;
	case 0x09:
	    break;
	case 0x0a:
	    break;
	case 0x0b:
	    break;
	case 0x0c:
	    break;
	case 0x0d:
	    break;
	case 0x0e:
	    break;
	case 0x0f:
	    break;
	default:
	    if( y > ymin && y < ymax )
		putc(d, *(a + i), x, y);
	    x += 14;
	    break;
	}
    }
}

/*======================================================================*
 *									*
 *	文字列表示 (実際には文字表示しないダミー版)			*
 *									*
 *======================================================================*/
int puts_Dummy(
    unsigned short *a,
    int		n
)
{
    int		i,r;

    for(i = 0; *(a + i) != NULL && i < n; i += 1) {
	r = 0;
	switch(*(a + i)) {
	case 0x01:
	    break;
	case 0x02:
	    break;
	case 0x03:
	    break;
	case 0x04:
	    break;
	case 0x05:
	    break;
	case 0x06:
	    break;
	case 0x07:
	    break;
	case 0x08:
	    break;
	case 0x09:
	    break;
	case 0x0a:
	    break;
	case 0x0b:
	    break;
	case 0x0c:
	    break;
	case 0x0d:
	    break;
	case 0x0e:
	    break;
	case 0x0f:
	    break;
	default:
	    r = 1;
	    break;
	}
    }
    return r;
}

