/* スペランカラー test          by 松原 */
/*を、元に作成させていただきました by tu-son*/
#include <sys/bios.h>
#include <sys/libwwc.h>
#include <stdlib.h>

#include "lwc.h"

/*-------絶対値を求める関数----*/
int fnc_abs(int d1,int d2)
{
	if(d1 > d2)
		return(d1-d2);
	else
		return(d2-d1);
}

void SpSetLoc(int Spn,int Xno,int Yno,int Xpos,int Ypos){
	int i,j,k;
	k = 0;
	for(i = 0;i < Yno;i++){
		for(j = 0;j < Xno;j++){
			sprite_set_location(Spn +k, Xpos +(j*8), Ypos +(i*8));
			k++;
		}
	}
}

/*--------メインプログラム*/
void main(int argc, char *argv[]) {
    int iKey;            /*キー入力データ*/
    int iJmp=JMP_ED,bJmp=JMP_ED;    /*ジャンプ用ベクトル*/
    int iX=100,iY=100;    /*主人公座標*/
    int bX=100,bY=80;
    int yX=0,yY=-16;
    int iC;        /*カラーコード*/
    int iTmp;    /*テンポラリ*/
	int Yfl =0,Mno = 1;
	BOOL Yfl2 = 0,bF = 0;

    /* ディスプレイ設定（ スプライトとスクリーン１と２ 表示 ） */
    display_control(DCM_SCR1 | DCM_SPR);

    /* カラースワンの確認 */
    if ( wwc_get_hardarch() == HARDARCH_WS ) {
    	/* 旧スワンならお知らせを出して終了 */
    	text_screen_init();
    	text_put_string( 1,1, "これはWonderSwanColor専用ソフトです" );
    	text_put_string( 1,3, "旧WonderSwanでは実行できません" );
    	key_wait();
    	return;
    }
    /*カラーモード設定*/
    wwc_set_color_mode(COLOR_MODE_16PACKED); /*16色カラーパックトモード*/
    wwc_clear_font();

    /*パレット設定*/
    for(iC=0 ;iC < COL_MAX ;iC++){
       wwc_palette_set_color(CPN_MY, iC, lPal[iC]);
       wwc_palette_set_color(CPN_2200, iC, lPal[iC]);
       wwc_palette_set_color(CPN_Y1, iC, lPal[iC]);
       wwc_palette_set_color(CPN_Y2, iC, lPal[iC]);
       wwc_palette_set_color(CPN_Y3, iC, lPal[iC]);
       wwc_palette_set_color(CPN_Y4, iC, lPal[iC]);
       wwc_palette_set_color(CPN_8000, iC, lPal[iC]);
       wwc_palette_set_color(CPN_620, iC, lPal[iC]);
	}

    /* LCD階調データ初期化 */
    /*（LCDカラー番号000-011のLCD階調，LCDカラー番号100-111のLCD階調 ）*/
    lcd_set_color(0x6420, 0xfca8);

    sprite_set_range(SPN_ST ,SP_MAX );   /*表示するスプライト番号の範囲を設定*/

    /*キャラクタ設定 */
    wwc_font_set_colordata(CHN_MY ,CHX_MY ,cChrMy);   /* 主人公 */
    wwc_font_set_colordata(CHN_620 ,CHX_620 ,cChr620);
    wwc_font_set_colordata(CHN_2200 ,CHX_2200 ,cChr2200);
    wwc_font_set_colordata(CHN_8000 ,CHX_8000 ,cChr8000);
    wwc_font_set_colordata(CHN_Y1 ,CHX_Y1 ,cChrY1);
    wwc_font_set_colordata(CHN_Y2 ,CHX_Y2 ,cChrY2);
    wwc_font_set_colordata(CHN_Y3 ,CHX_Y3 ,cChrY3);
    wwc_font_set_colordata(CHN_Y4 ,CHX_Y4 ,cChrY4);

    /*スプライト初期化：主人公*/
    for(iTmp=0 ;iTmp<CHX_MY ;iTmp++){
        sprite_set_char(SPN_MY+iTmp ,(CPN_MY-CPN_SP)<< CFSFT_PALETTE | CHN_MY+iTmp);
	}
    for(iTmp=0 ;iTmp<CHX_2200 ;iTmp++){
        sprite_set_char(SPN_2200+iTmp ,(CPN_2200-CPN_SP)<< CFSFT_PALETTE | CHN_2200+iTmp);
	}
    for(iTmp=0 ;iTmp<CHX_Y1 ;iTmp++){
        sprite_set_char(SPN_Y1+iTmp ,(CPN_Y1-CPN_SP)<< CFSFT_PALETTE | CHN_Y1+iTmp);
	}
    for(iTmp=0 ;iTmp<CHX_Y2 ;iTmp++){
        sprite_set_char(SPN_Y2+iTmp ,(CPN_Y2-CPN_SP)<< CFSFT_PALETTE | CHN_Y2+iTmp);
	}
    for(iTmp=0 ;iTmp<CHX_Y3 ;iTmp++){
        sprite_set_char(SPN_Y3+iTmp ,(CPN_Y3-CPN_SP)<< CFSFT_PALETTE | CHN_Y3+iTmp);
	}
    for(iTmp=0 ;iTmp<CHX_Y4 ;iTmp++){
        sprite_set_char(SPN_Y4+iTmp ,(CPN_Y4-CPN_SP)<< CFSFT_PALETTE | CHN_Y4+iTmp);
	}
    for(iTmp=0 ;iTmp<CHX_8000 ;iTmp++){
        sprite_set_char(SPN_8000+iTmp ,(CPN_8000-CPN_SP)<< CFSFT_PALETTE | CHN_8000+iTmp);
	}
    for(iTmp=0 ;iTmp<CHX_620 ;iTmp++){
        sprite_set_char(SPN_620+iTmp ,(CPN_620-CPN_SP)<< CFSFT_PALETTE | CHN_620+iTmp);
	}

	SpSetLoc(SPN_Y1,3,3,yX,yY-20);
	SpSetLoc(SPN_Y2,3,3,yX,yY-20);
	SpSetLoc(SPN_Y3,3,3,yX,yY-20);
	SpSetLoc(SPN_Y4,3,3,yX,yY-20);
	SpSetLoc(SPN_620,3,2,-32,bY);
	SpSetLoc(SPN_2200,3,3,-32,bY);
	SpSetLoc(SPN_8000,3,4,-32,bY);

    /*-------------メインループ*/
    for(;;)
    {
        sys_wait(3);    /*ループ内でウエイト*/

        /*-----------主人公のキー処理*/
        iKey = key_press_check();
        if (iKey & KEY_START)
            break; /*プログラム終了*/

		if(iJmp==JMP_ED)
		{    /*未ジャンプ状態ならジャンプボタンチェック*/
			if (iKey & KEY_A)
				iJmp=JMP_ST;    /*ジャンプスタート*/
		}else{
			/*現在ジャンプ中*/
			iJmp++;          /*ベクトルを増分*/
			iY = iY + iJmp;  /*ベクトルをY座標に加える*/
		}

		if(Yfl == 1){
			if(iKey & KEY_UP2){
			    yY=-16;
			    bF = 1;
				Yfl2 = 0;
			}
			yX++;
		}
		else if(Yfl == 2){
			if(iKey & KEY_RIGHT2){
			    yY=-16;
			    bF = 1;
				Yfl2 = 0;
			}
			yX++;
		}
		else if(Yfl == 3){
			if(iKey & KEY_DOWN2){
			    yY=-16;
			    bF = 1;
				Yfl2 = 0;
			}
			yX++;
		}
		else if(Yfl == 4){
			if(iKey & KEY_LEFT2){
			    yY=-16;
			    bF = 1;
				Yfl2 = 0;
			}
			yX++;
		}

        /*キャラ左右移動 */
        if (iKey & KEY_LEFT1) iX=iX -5;
        if (iKey & KEY_RIGHT1) iX=iX +5;
/*        if (iKey & KEY_DOWN1) iY=iY+5;
        if (iKey & KEY_UP1) iY=iY-5;
*/
		if(iX >= 224-16 ) iX=224-16;
		if(iX <= 0   ) iX=0;
/*		if(iY >= 144-16) iY=144-16;
		if(iY <= 0   ) iY=0;
*/
	if(bF){
		bX += 5;
	}
	else{
		bX++;
	}

        /*--------スプライト位置指定 主人公*/
		SpSetLoc(SPN_MY,2,3,iX,iY);
	if(Mno == 1)
		SpSetLoc(SPN_620,3,2,bX,bY);
	else if(Mno == 2)
		SpSetLoc(SPN_2200,3,3,bX,bY);
	else if(Mno == 3)
		SpSetLoc(SPN_8000,3,4,bX,bY);

	if(Yfl == 1){
		SpSetLoc(SPN_Y1,3,3,yX,yY-20);
	}
	else if(Yfl == 2){
		SpSetLoc(SPN_Y2,3,3,yX,yY-20);
	}
	else if(Yfl == 3){
		SpSetLoc(SPN_Y3,3,3,yX,yY-20);
	}
	else if(Yfl == 4){
		SpSetLoc(SPN_Y4,3,3,yX,yY-20);
	}
		/*--当たり判定--*/
		if((fnc_abs(iX ,bX)<16)&&(fnc_abs(iY ,bY)<16))
		{
					bJmp=JMP_ST;    /*ジャンプスタート*/
					if(Yfl2 == 0){
						Yfl = rand()%4 +1;
						yX=bX,yY=bY;
						Yfl2 = 1;
					}
		}
			if(bJmp==JMP_ED)
			{    /*未ジャンプ状態ならジャンプボタンチェック*/
			}else{
				/*現在ジャンプ中*/
				bJmp++;          /*ベクトルを増分*/
				bY = bY + bJmp;  /*ベクトルをY座標に加える*/
		}
		if(bX > 224){
			bX = -16;
			bF = 0;
			Yfl = 0;
			Yfl2 = 0;
			Mno = rand()%3 +1;
		}
		if(yX >224){
			Yfl = 0;
			Yfl2 = 0;
			yY= -16;
		}
    }
}


