#include <sys/bios.h>
#include <stdlib.h>
#include "man2.h"
#include "title.h"
#include "ikari.h"
#include "sup.h"
#include "score.h"
#include "okane.h"
#include "tuki.h"
#include "haikei.h"
#include "bil.h"
#include <il_sound.h>
    
SoundIL soundIL;
extern BYTE *_heap;

unsigned short bmp_clear[]={
	0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000
};

unsigned short p[title_width*title_height];

int random( int max ){
    return rand() % ( max + 1 );
}

int scr=0,owari=0,botan=1;
int x=90,y=144-man2_height*8;
int mydx=2;
int yt=0,dy=1;
int xt2=50,yt2=0,dy2=1;
int xi=30,yi=0,dy3=1;
int score_x=184-8*3;

void title(void){

	int i;

	for(i=0;i<title_width*title_height;i++){
		p[i] = i + 1;
	}

	display_control(DCM_SCR2);

	font_set_colordata(0,1,bmp_clear);
	screen_fill_char(SCREEN2,0,0,23,18,0);

	text_window_init(7,13,13,5,400);
	text_put_string(4,0,"作った人");
	text_put_string(4,2,"大久保　雄介");

	font_set_colordata(1,title_width*title_height,bmp_title);
	screen_set_char(SCREEN2,7,1,title_width,title_height,p);

	if ( open_sound_il(&soundIL) != E_FS_SUCCESS ) {
            /* ドライバが存在しない */
            return;
        }
        sounddrv_init();
        sound_open();
        
        parse_mml( _heap, "T140 O2 L6DG8.A8..D2R8.A-12GR<AFG", 0 );
        bgm_play( _heap, PLAY_LOOP );
	key_wait();
        
        sound_close();
        sounddrv_release();

	display_control(0);
}


void settei(void){

	int x=0,y=144-man2_height*8;
	int i,j,no;

	display_control(DCM_SCR1 | DCM_SCR2 | DCM_SPR | DCM_SCR2_WIN_INSIDE);
	screen2_set_window(23*8,0,5*8,18*8);
	text_window_init(23,0,5,18,400);
	text_put_string(0,1,"score");
	text_put_string(0,14,"作者");
	text_put_string(0,16,"大久保雄介");
	text_put_numeric(0,3,5,NUM_ALIGN_RIGHT,scr);

	lcd_set_color(0x6420,0xfca8);
	palette_set_color(1,0x7544);
	palette_set_color(2,0x7752);
	palette_set_color(8,0x7770);
	palette_set_color(12,0x7500);
	palette_set_color(13,0x7700);
	palette_set_color(14,0x7770);

	font_set_colordata(0,1,bmp_clear);
	font_set_colordata(1,man2_width*man2_height,bmp_man2);
	font_set_colordata(17,1,bmp_okane);
	font_set_colordata(18,1,bmp_tuki);
	font_set_colordata(19,1,bmp_sup);
	font_set_colordata(20,1,bmp_score);
	font_set_colordata(21,1,bmp_haikei);
	font_set_colordata(22,1,bmp_bil);

	screen_fill_char(SCREEN1,0,0,23,18,0);
	screen_fill_char(SCREEN1,0,13,28-5,5,(1<<9) | 21);
	screen_fill_char(SCREEN1,5,5,2,13-5,(2<<9) | 22);
	screen_fill_char(SCREEN1,7,2,3,13-2,(2<<9) | 22);
	screen_fill_char(SCREEN1,13,3,4,13-3,(2<<9) | 22);
	screen_fill_char(SCREEN1,19,8,4,13-8,(2<<9) | 22);

	for(i=0;i<man2_width*man2_height;i++){
		sprite_set_char(i,CFM_SPR_UPPER | (4<<9) | (i+1));
	}

	sprite_set_char(16,CFM_SPR_UPPER | (5<<9) | 17);
	sprite_set_char(17,CFM_SPR_UPPER | (6<<9) | 18);
	sprite_set_char(18,CFM_SPR_UPPER | (6<<9) | 18);
	sprite_set_char(19,CFM_SPR_UPPER | (6<<9) | 18);
	sprite_set_char(22,CFM_SPR_UPPER | (6<<9) | 18);
	sprite_set_char(20,CFM_SPR_UPPER | (5<<9) | 19);
	sprite_set_char(21,CFM_SPR_UPPER | (6<<9) | 20);
	sprite_set_range(0,23);

	for(i=0,no=0;i<man2_height;i++){
		for(j=0;j<man2_width;j++,no++){
			sprite_set_location(no,j*8+x,i*8+y);
		}
	}

}


void saigo(void){

	display_control(DCM_SCR1 | DCM_SCR2);
	screen_fill_char(SCREEN1,0,0,28,14,0);
	text_screen_init();
	text_put_string(9,7,"GAME OVER");
	text_put_string(7,9,"Your Score");
	text_put_numeric(17,9,4,NUM_ALIGN_RIGHT,scr);

	if ( open_sound_il(&soundIL) != E_FS_SUCCESS ) {
            /* ドライバが存在しない */
            return;
        }
        sounddrv_init();
        sound_open();

        parse_mml( _heap, "t138l16>cr<br>.arara+rg+r8.er.", 0 );
        bgm_play( _heap, PLAY_LOOP );
	key_wait();
        
        sound_close();
        sounddrv_release();
}


int teki_ugoki(int sp,int xt){

	unsigned attr;
	sprite_set_location(sp,xt,yt);
	yt += dy;

	if( 0 == yt % 32 ){
		botan *= -1;
	}

	if(botan < 0){
		attr = CFM_FLIP_H | CFM_SPR_UPPER | (6<<9) |  18;
	}
	else if(botan > 0){
		attr = CFM_SPR_UPPER | (6<<9) | 18;
	}

	sprite_set_char(sp,attr);

	if( yt > 144 ){
		xt=random(176),yt=0;
	}

	if(xt+8>=x+8 && xt<=x+32-8){
		if(yt+8>=y && yt<=y+32) owari=1;
	}

	sys_wait(1);
	return xt;
}


int teki_ugoki2(void){

	sprite_set_location(20,xt2,yt2);
	yt2+=dy2;

	if( yt2 > 144 ){
		xt2=random(176),yt2=0;
	}

	if(xt2+8>=x && xt2<=x+32){
		if(yt2+8>=y && yt2<=y+32){
			mydx += 1;
			if(mydx == 5) mydx = 5;
			sprite_set_location(20,0,200);
			sys_wait(1);
			xt2=random(176),yt2=0;
		}
	}
}

int item(void){

	sprite_set_location(16,xi,yi);
	yi+=dy3;

	if( yi > 144 ){
		xi=random(176),yi=0;
	}

	if(xi+8>=x && xi<=x+32){
		if(yi+8>=y && yi<=y+32){
			scr++;
			sprite_set_location(16,0,200);
			sys_wait(1);
			xi=random(176),yi=0;
		}
	}
}


void score(void){

	sprite_set_location(21,score_x,144-8);

	if(x+32 >= score_x && x <= score_x+8){
		if(score_x==184-8*3){
			score_x=16;
			scr++;
		}
		else if(score_x==16){
			score_x=184-8*3;
			scr++;
		}
	}
}


void my_ugoki(void){

	int i,j,no,k,attr;
	int sp1_x=50,sp2_x=100,sp3_x=150,sp4_x=0;

	if ( open_sound_il(&soundIL) != E_FS_SUCCESS ) {
            /* ドライバが存在しない */
            return;
        }
        sounddrv_init();
        sound_open();
        
        parse_mml( _heap, "t126<b>d.4b4 6d ga>d4<f+4>re <baf+4f+.", 0 );
        bgm_play( _heap, PLAY_LOOP );

	while((key_hit_check() & KEY_START)==0){

		sp1_x = teki_ugoki(17,sp1_x);
		sp2_x = teki_ugoki(18,sp2_x);
		sp3_x = teki_ugoki(19,sp3_x);
		sp4_x = teki_ugoki(22,sp4_x);

		if(owari==1){
			sound_close();
                	sounddrv_release();
			break;
		}

		teki_ugoki2();

		score();
		item();
		text_put_numeric(0,3,5,NUM_ALIGN_RIGHT,scr);

		k=key_press_check();

		if(k & KEY_LEFT1){
			for ( i=0,no=0; i<4; i++ ) {
        			for ( j=0; j<4; j++,no++ ) {
            				attr = CFM_FLIP_H | CFM_SPR_UPPER | (4<<9) | ((i+1)*4-j);
          				sprite_set_char( no, attr );
        			}
			}
    
		/*for(i=0;i<man2_width*man2_height;i++){
			sprite_set_char(i,CFM_FLIP_H | CFM_SPR_UPPER | (4<<9) | (i+1));
		}*/
		x-=mydx;
		if(x<=0) x+=mydx;
		}	

		if(k & KEY_RIGHT1){
		for(i=0;i<man2_width*man2_height;i++){
			sprite_set_char(i,CFM_SPR_UPPER | (4<<9) | (i+1));
		}
		x+=mydx;
		if(x>=224-5*8-32) x-=mydx;
		}

		for(i=0,no=0;i<man2_height;i++){
			for(j=0;j<man2_width;j++,no++){
				sprite_set_location(no,j*8+x,i*8+y);
			}
		}
		sys_wait(1);
	}
}


void main(){

	title();
	settei();
	my_ugoki();
	saigo();
}

