/********************************************************************************
					-------------------------
				 	 Ultra 64 MARIO Brothers
					-------------------------

					File		: pathpakun.s
					Description	: 
					Date		: 1995.10.30
					Author		: H.yajima

 ********************************************************************************/

#define	PAKUN_NEARDIST	400


/***************************************************************/
/*  ANIMATION HEADER DEFINE pakun */
/***************************************************************/

#define ANM_pakun_angry         	0
#define ANM_pakun_damage        	1
#define ANM_pakun_down          	2
#define ANM_pakun_eat_base      	3
#define ANM_pakun_eating        	4
#define ANM_pakun_miss_eating   	5
#define ANM_pakun_sleep_start   	6
#define ANM_pakun_sleep_tmp     	7
#define ANM_pakun_sleeping      	8
#define ANM_pakun_wait          	9

#define ANM_pakun_end          		10

/*=============================================================*/
/*  END END */
/*=============================================================*/

/*################*/
#ifdef ASSEMBLER
/*################*/

e_pakun:
	p_initialize(enemyA)
	p_setbit(flag,stf_moveON | stf_YangleSAME | stf_playerdistON | stf_playerangleON )
	p_set_pointer(skelanime,pakun_anime)
	p_set_skelanime_number(0)
	p_setobjname(DAMAGE)
	p_sethitbox(100,200)
	p_setdamagebox(50,200)
	p_hitON
	p_setd(ap,3)
	p_setd(havecoin,5)
	p_makeshape(S_bubble,e_hanapoo)
	p_setf(shapeLOD,2000)
	p_save_nowpos
	p_while
		p_program(s_pakun)
	p_loop

/*################*/
#else
/*################*/
/********************************************************************************
		C Program
 ********************************************************************************/


#define	 pakun_scale	(execstp->s[stw_work1].f)
#define	 pakun_sound	(execstp->s[stw_work0].d)


/*-------------------------------------------------------------------------------
		pakun init
-------------------------------------------------------------------------------*/
static void pakun_init(void)
{

	s_hitOFF();
	s_set_skelanimeNo(ANM_pakun_sleeping);	
	s_set_scale(1.0);
	if ( obj_playerdist < 1200 )	obj_mode = mode_pakun_sleep;

}

/*-------------------------------------------------------------------------------
		pakun sleep
-------------------------------------------------------------------------------*/


static int pakun_attackcheck(void)
{

	int	i;
	int flag = 1;

	if ( (obj_mail & EMAIL_PLAYERHIT) != 0 ){
		Na_PukkunBgmEnd();
		if ( obj_mail & EMAIL_PLAYERATTACK ){
			objsound(NA_SE3_FLOWERDOWN);
			for(i=0;i<20;i++){
				s_makeobj_nowpos(execstp,S_syabon,e_balloon_gomi);
			}
			obj_mode = mode_pakun_down;
		} else {
			obj_mode = mode_pakun_sleepOFF;
		}
		Mbitclr(obj_mail,EMAIL_PLAYERHITALL);

	} else {
	 	flag = 0;
	}

	return(flag);

}

static void pakun_sleep(void)
{


	s_hitON();
	s_set_objname(PUNCHATTACK);
	s_set_skelanimeNo(ANM_pakun_sleeping);	
	s_sethitbox(250,200);
	s_setdamagebox(150,100);
	obj_ap = 0;

	if ( obj_playerdist < PAKUN_NEARDIST ){
		if 	( s_player_speedcheck() )	obj_mode = mode_pakun_sleepOFF;
	} else if ( obj_playerdist < 1000 ){
		Na_PukkunBgmStart();
		pakun_sound = 0;
	} else if ( pakun_sound == 0){
		pakun_sound++;
		Na_PukkunBgmEnd();
	}

	pakun_attackcheck();

}

static void pakun_sleepOFF(void)
{

	obj_ap = 3;

	if ( obj_timer == 0 ) Na_PukkunBgmEnd();
	if ( pakun_attackcheck() == 0 ){
		if ( obj_timer > 10 ) obj_mode = mode_pakun_angry;
	}


}

/*--------------------------------
		pakun down start
---------------------------------*/


static void check_pakun_erase(void)
{
	if ( execstp->status & OBJECT_ERASE ) obj_mode = mode_pakun_init;
}

static void pakun_down(void)
{

	s_hitOFF();
	s_set_skelanimeNo(ANM_pakun_down);
	Mbitclr(obj_mail,EMAIL_PLAYERHITALL);
	
	if ( s_check_animeend() )	obj_mode = mode_pakun_down_end;
	check_pakun_erase();

}

/*--------------------------------
		pakun down small down
--------------------------------*/
static void pakun_down_end(void)
{

	if ( obj_timer   == 0 ){
		objsound(NA_SE3_DOWN_TO_SMALL);
	 	pakun_scale =   1.0;
	}
	if ( pakun_scale > 0 ){
	  pakun_scale -= 0.04;
	} else {
		pakun_scale = 0;
	//	s_kemuri();
		s_make_bluecoin();
		obj_mode = mode_pakun_down_wait;
	}
	s_set_scale(pakun_scale);
	check_pakun_erase();
	
}

/*--------------------------------
		pakun down wait
---------------------------------*/
static void pakun_down_wait(void)
{
	if ( obj_playerdist > 1200 )	obj_mode = mode_pakun_down_zoom;

}

/*--------------------------------
		pakun down zoom
---------------------------------*/

static void pakun_down_zoom(void)
{

	s_set_skelanimeNo(ANM_pakun_sleeping);	
	if ( obj_timer   == 0 ) pakun_scale =   0.3;
	if ( pakun_scale < 1.0 )  pakun_scale += 0.02;
	else {
		pakun_scale = 1.0;
		obj_mode = mode_pakun_init;
	}
	s_set_scale(pakun_scale);

}


/*-------------------------------------------------------------------------------
		pakun attack
-------------------------------------------------------------------------------*/

char pakunsound[] = { 12,28,50,64,-1 };

static void pakun_angry(void)
{

	int	anime_frame = execstp->map.skelanim.frame;

	s_hitON();
	s_set_objname(DAMAGE);
	s_set_skelanimeNo(ANM_pakun_angry);	
	s_sethitbox(150,100);
	s_setdamagebox(150,100);
	
	if ( s_check_chartable(anime_frame,pakunsound) ) objsound(NA_SE3_FLOWERVOICE);
	
	obj_angleY 	= s_chase_angle(obj_angleY,obj_targetangle,0x400);
	if ( obj_playerdist > PAKUN_NEARDIST+100 && s_check_animeend() ) obj_mode = mode_pakun_wait;

//	if ( (obj_mail & EMAIL_PLAYERATTACK ) && ( PL_IsMetalMario(marioWorks) != 0) ) obj_mode = mode_pakun_down;	
	if ( (obj_mail & EMAIL_PLAYERHIT ) && (PL_IsMetalMario(marioWorks) != 0) ) obj_mode = mode_pakun_down;	

}

/*-------------------------------------------------------------------------------
		pakun attack
-------------------------------------------------------------------------------*/

extern int s_player_speedcheck(void)
{
	if ( playerWorks[0].speed[1] > 10 ) return(1);
	if ( playerWorks[0].velocity > 10 ) return(1);
	return(0);
}


static void pakun_wait(void)

{

	s_hitOFF();
	s_set_skelanimeNo(ANM_pakun_sleep_start);	
	if ( s_check_animeend() )	obj_mode = mode_pakun_sleep;

	if ( obj_playerdist < PAKUN_NEARDIST && s_player_speedcheck() )	 obj_mode = mode_pakun_angry;


}


/********************************************************************************
		pakun program main
 ********************************************************************************/

static void *pakun_modejmp[] = {
	
	 pakun_init,
	 pakun_sleep,
	 pakun_angry,
	 pakun_sleepOFF,
	 pakun_wait,
	 pakun_down,
	 pakun_down_end,
	 pakun_down_wait,
	 pakun_down_zoom
	
};


extern void s_pakun(void)
{
	s_modejmp(pakun_modejmp);

	if ( activeStageNo == 24 ){
	 	if ( player_worldY > 3400 )	s_shape_hide();
		else						s_shape_disp();
	}

	obj_mail = 0;

}

/*################*/
#endif
/*################*/
/*===============================================================================
		end end end end end end end end 
===============================================================================*/

