/*
    （サンプル）2x2スプライトを4方向移動 for WonderWitch
   　 by matu 

・このソフトウェアの著作権・所有権はWonderWitch.Comに帰属します。
・このソフトウェアを使用することによって生じたあらゆる損害に対しては責任を負いかねます。
・このソフトウェアを営利目的に利用することを禁止します。

*/
#include <stdio.h>
#include <sys/bios.h>
#include <sys/fcntl.h>
#include <stdlib.h>


#define CHR_PIX  8   /* １キャラの1辺の長さ[ピクセル]*/
#define CHR_BYTE 8   /* １キャラあたりデータ数[バイト](mono) */

#define MAS_PIX    16 /* 登場キャラの一辺の長さ[ピクセル数] */


#define CHN_UP    0   /*キャラクタ番号:*/
#define CHN_DOWN  1   /*キャラクタ番号:*/
#define CHN_LEFT  2   /*キャラクタ番号:*/
#define CHN_RIGHT 3   /*キャラクタ番号:*/
#define CHN_MAX   4   /*キャラクタ数  :*/

#define SPN_ST  0 /*スプライト番号:最初*/
#define SPN_MY  0 /*スプライト番号:登場キャラ*/
#define SPN_MAX 4 /*スプライト番号:最大使用数*/

#define CPN_MY   8   /*キャラクタパレット番号*/
#define CFM_CPN ((CPN_MY-8)<< CFSFT_PALETTE)  /*パレット番号割り振り*/


/*--------スプライトx個をまとめて表示*/
/*（スプライト番号 ,x座標 ,y座標, 一辺の長さ ,キャラクタ番号 )*/
void sprite_set_dx(int iSpn ,int iLx ,int iLy ,int iWidth ,int iChn )
{
    int iSx,iSy;

    for(iSy=0 ;iSy<iWidth ;iSy+=CHR_PIX) {

        for(iSx=0 ;iSx<iWidth ;iSx+=CHR_PIX) {

            /*スプライト設定*/
            sprite_set_char(iSpn ,CFM_SPR_UPPER | CFM_CPN | iChn);

            /*スプライト位置指定*/
            sprite_set_location(iSpn ,iLx+iSx ,iLy+iSy);
            iSpn++;    /*スプライト番号+1*/
        }
    }
}

/* ------------ 値0〜X-1を循環させる関数 */
/*  引数 (補正したい値 ,循環させたい範囲X) */
int fncLoop(int iArg ,int iPitch)
{
    if(iArg < 0)
        iArg = iArg + iPitch;

    if(iArg >= iPitch)
        iArg = iArg - iPitch;

    return(iArg);
}


/*--------メインプログラム*/
void main(int argc, char *argv[]) {
    int iKey;      /*キー入力データ*/
    int iMx,iMy;   /*座標*/
	int iChn;

	BYTE bData[CHR_BYTE];
	char sTest[]="↑↓←→";
	char *pMoji;
	short wTmp;

    /*スプライト定義*/
	iChn=CHN_UP;
	pMoji = (char *)sTest;
	while( *pMoji != 0) {
		wTmp = (short)*pMoji << 8;
		pMoji++;
		wTmp += (short)*pMoji;
		pMoji++;
	    text_get_fontdata(wTmp, bData);

	    /*キャラクタ設定 */
    	font_set_monodata(iChn ,1 ,bData);
        iChn++;
	}

    /* LCD階調データ初期化 */
    /*（LCDカラー番号000-011のLCD階調，LCDカラー番号100-111のLCD階調 ）*/
    lcd_set_color(0x6420, 0xfca8);

    /* ディスプレイ設定（ スプライト 表示 ） */
    display_control(DCM_SPR);

    /*表示するスプライト番号の範囲を設定*/
    sprite_set_range(SPN_ST ,SPN_MAX );

    iMx=224 / 2;    /*登場キャラのx座標セット*/
    iMy=144 / 2;    /*登場キャラのy座標セット*/
	iChn=CHN_UP;

    /*-------------メインループ*/
    for(;;)
    {
        sys_wait(1);    /*ループ内でウエイト*/

        /*-----------登場キャラのキー処理*/
        iKey = key_press_check();
        if (iKey & KEY_START)
            break; /*プログラム終了*/

        /*キャラ移動 */
        switch(iKey){
        case KEY_LEFT1:
            iMx = fncLoop(iMx - 1 ,LCD_PIXEL_WIDTH);
            iChn=CHN_LEFT;
            break;

        case KEY_RIGHT1:
            iMx = fncLoop(iMx + 1 ,LCD_PIXEL_WIDTH);
            iChn=CHN_RIGHT;
            break;

        case KEY_UP1:
            iMy = fncLoop(iMy - 1 ,LCD_PIXEL_HEIGHT);
            iChn=CHN_UP;
            break;

        case KEY_DOWN1:
            iMy = fncLoop(iMy + 1 ,LCD_PIXEL_HEIGHT);
            iChn=CHN_DOWN;
            break;
        }
        /*----スプライト表示*/
        sprite_set_dx(SPN_MY ,iMx ,iMy ,MAS_PIX , iChn);
    }
}


