/********************************************************************************
					-------------------------
				 	 Ultra 64 MARIO Brothers
					-------------------------

					File		: pathonimasu.s
					Description	: 
					Date		: 1995.
					Author		: H.yajima

 ********************************************************************************/


 
/*################*/
#ifdef ASSEMBLER
/*################*/
e_onimasu:
	p_initialize(moveBG)
	p_setbit(flag,stf_moveON | stf_playerdistON | stf_YangleSAME )
	p_setshapeinfo(onimasu_info)
	p_addf(worldY,256)
	p_setf(shapeLOD,8000)
	p_save_nowpos
	p_while
		p_program(s_onimasu)
	p_loop


/*################*/
#else
/*################*/
/********************************************************************************
		C Program (onimasu)
 ********************************************************************************/

#define		ONI_ROLL	0x800				/* roll object		*/
#define		ONI_SPEED	( 0x4000/0x800 )	/* onimasu speed 	*/
#define		ONI_WAIT	20



/********************************************************************************
		viewshake
 ********************************************************************************/
static void s_viewshake(void)
{
	if ( obj_playerdist < 3000 )	s_call_Viewshake(VS_SMALL);
}

/********************************************************************************
		onimasu - move program
 ********************************************************************************/

static void onimasu_move(float speedF,float speedU,short ax,short az)
{

	obj_worldY 		 = ( 240 * 0.4142135 ) * sin( (obj_timer+1)/(float)ONI_SPEED * 0x8000) + obj_attY+3;
	obj_speedF = speedF;
	obj_speedU = speedU;
	obj_animeangleX += ax;
	if ( ((short)obj_animeangleX) < 0 ) az = -az;
	obj_animeangleZ += az;
	s_3Dmove();
	if ( obj_timer == ONI_SPEED - 1 ){
		obj_mode = s_datamove_next();
		objsound(NA_SE2_METALBOX_ROLL);
	}
}

static void onimasu_for(void)
{
	onimasu_move(512/ONI_SPEED,0,ONI_ROLL,0);
}

static void onimasu_back(void)
{
	onimasu_move(-512/ONI_SPEED,0,-ONI_ROLL,0);
}

static void onimasu_left(void)
{
	onimasu_move(0,-512/ONI_SPEED,0,ONI_ROLL);
}

static void onimasu_right(void)
{
	onimasu_move(0,512/ONI_SPEED,0,-ONI_ROLL);
}


/********************************************************************************
		onimasu - wait
 ********************************************************************************/
static void onimasu_wait(void)
{
	obj_speedF = 0;
	if ( obj_timer == 0 ) s_viewshake();
	obj_worldY = obj_attY+3;
	if ( obj_timer == 20 ) obj_mode = s_datamove_next();
}

/********************************************************************************
		onimasu - wait
 ********************************************************************************/
static void onimasu_wait2(void)
{
	if ( obj_timer == 20 ) obj_mode = s_datamove_next();
}

static void onimasu_wait3(void)
{
	if ( obj_timer == 20 ) obj_mode = s_datamove_next();
}

/********************************************************************************
	 ===========================
		onimasu moving data
	 ===========================
 ********************************************************************************/

#define	_on_w	mode_onimasu_wait
#define	_on_w2	mode_onimasu_wait2
#define	_on_w3	mode_onimasu_wait3
#define	_on_f 	mode_onimasu_for
#define	_on_b 	mode_onimasu_back
#define	_on_l 	mode_onimasu_left
#define	_on_r 	mode_onimasu_right

static char oni_data0[] = {
	_on_f,_on_w,_on_f,_on_w,
	_on_l,_on_w,_on_l,_on_w,
	_on_b,_on_w,_on_b,_on_w,
	_on_l,_on_w,_on_l,_on_w,
	_on_b,_on_w,_on_w2,
	_on_f,_on_w,_on_f,_on_w,_on_f,_on_w,_on_w2,
	_on_b,_on_w,_on_b,_on_w,
	_on_r,_on_w,_on_r,_on_w,
	_on_f,_on_w,_on_f,_on_w,
	_on_r,_on_w,_on_r,_on_w,
	_on_b,_on_w,_on_b,_on_w,_on_b,_on_w,_on_w2,
	_on_f,_on_w,
	-1
};

static char oni_data1[] = {
	_on_f,_on_w,_on_f,_on_w,
	_on_r,_on_w,_on_r,_on_w,_on_r,_on_w,_on_w2,
	_on_l,_on_w,_on_l,_on_w,_on_l,_on_w,
	_on_b,_on_w,_on_b,_on_w,
	_on_l,_on_w,
	_on_b,_on_w,_on_b,_on_w,_on_w2,
	_on_f,_on_w,_on_f,_on_w,
	_on_r,_on_w,
	-1
};

static char oni_data2[] = {
	_on_f,_on_w,_on_f,_on_w,_on_f,_on_w,_on_f,_on_w,_on_f,_on_w,_on_w2,
	_on_b,_on_w,_on_b,_on_w,_on_b,_on_w,_on_b,_on_w,_on_b,_on_w,
	_on_r,_on_w,_on_w2,
	_on_l,_on_w,_on_l,_on_w,
	_on_b,_on_w,_on_w2,
	_on_f,_on_w,
	_on_r,_on_w,
	-1
};

static char *oni_data_table[] = {
 	oni_data0,
 	oni_data1,
	oni_data2
};

/********************************************************************************
	 ======================
		onimasu initialize
	 ======================
 ********************************************************************************/
static void onimasu_init(void)
{
	void *data = (void *)(oni_data_table[obj_programselect]);
	obj_mode = s_datamove_init(data);
}


static void  *onimasu_modejmp[] = {
	
	 onimasu_init,
	 onimasu_wait,
	 onimasu_wait2,
	 onimasu_wait3,
	 onimasu_for,
	 onimasu_back,
	 onimasu_left,
	 onimasu_right
	
};

extern void s_onimasu(void)
{

	s_modejmp(onimasu_modejmp);

	stMainMoveBG();

}

/*################*/
#endif
/*################*/
/*===============================================================================
		end end end end end end end end 
===============================================================================*/



