/************************************************************************
 *									*
 *	スター フォックス 文字表示					*
 *				1996年 3月28日(木曜日) 14時11分42秒 JST	*
 ************************************************************************/
#include "sys_main.h"
#include "fox_locale.h"
#include "fox_texture.h"
#include "fox_moji.h"

extern MSG_T msg_tbl[];
//#include "fox_msg_data.c"	/* fox_moji_usa.c に 移動 */
//#include "fox_msg_tbl.c"	/* fox_moji_usa.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 int isPunc(unsigned short c) {
    if (c >= 0x20 && c <= 0x26) {
        return 1;
    } else {
        return 0;
    }
}

/*======================================================================*
 *									*
 *	１文字表示							*
 *									*
 *======================================================================*/
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

#if LOCALE==CHINA
    a -= 0x10;
    gDPLoadTextureBlock_4b((*d)++, font_00 + (16 / 2 * 12) * (a>>2),
			   G_IM_FMT_CI, 16, 12,
			   a & 3, 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 + 12) << 2, yp + 12 << 2,
			G_TX_RENDERTILE, 0 << 5, 0 << 5, 1 << 10, 1 << 10);
#else
    gDPLoadTextureBlock_4b((*d)++, font_00 + (16 / 2 * 13) * (a >> 2),
			   G_IM_FMT_CI, 16, 13,
			   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 + 13) << 2, yp + 13 << 2,
			G_TX_RENDERTILE, 2 << 5, 0 << 5, 1 << 10, 1 << 10);
#endif
}

/*======================================================================*
 *									*
 *	文字列表示							*
 *									*
 *======================================================================*/
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 += 1) {
	r = 0;
	switch(*(a + i)) {
	case 0x01:
	    x = xp;
	    y += 13;
	    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 0x10:
	case 0x11:
	case 0x12:
	case 0x13:
	    gDPSetPrimColor( (*d)++, 0, 0, 0xff, 0xff, 0x00, 0xff);
	    putc(d, *(a + i), x, y);
	    x += 15;
#if LOCALE==CHINA
            if (x > (xp+128)) {
                x = xp;
                y += 14;
            }
#endif
	    r = 1;
	    gDPSetPrimColor( (*d)++, 0, 0, 0xff, 0xff, 0xff, 0xff);
	    break;
	case 0x0c:
#if LOCALE==CHINA
	    x += 13;
	    r = 1;
	    break;
#endif
	default:
            if (isPunc(*(a+i+1))) {
                if ((x+13) > (xp+128)) {
                    x = xp;
                    y += 14;
                }
            }
	    gDPSetPrimColor( (*d)++, 0, 0, 0x0, 0x0, 0x0, 0xff);
	    putc(d, *(a + i), x+1, y+1);
	    gDPSetPrimColor( (*d)++, 0, 0, 0xff, 0xff, 0xff, 0xff);
	    putc(d, *(a + i), x, y);
#if LOCALE==CHINA
	    x += 13;
            if (x > (xp+128)) {
                x = xp;
                y += 14;
            }
#else
	    x += 7;
#endif
	    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 += 15;
	    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 0x0d:
	    x += 2;
	    break;
	case 0x0e:
	    x += 3;
	    break;
	case 0x0f:
	    break;
	case 0x0c:
	    x += 7;
	    break;
	default:
	    if( y > ymin && y < ymax )
		putc(d, *(a + i), x, y);
#if LOCALE==CHINA
	    x += 13;
            if (x > (xp+220)) {
                y += 14;
                x = xp;
            }
#else
	    x += 7;
#endif
	    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;
}

