/********************************************************************************
					-------------------------
				 	 Ultra 64 MARIO Brothers
					-------------------------

					File		: pathdownbar.s
					Description	: 
					Date		: 1995.
					Author		: H.yajima

 ********************************************************************************/


/*################*/
#ifdef ASSEMBLER
/*################*/

/********************************************************************************
	   ---------------------
		castle down bar
	   ---------------------
 ********************************************************************************/

e_downbar_object:
	p_initialize(moveBG)
	p_setbit( flag,stf_moveON | stf_YangleSAME)
	p_setf(movebg_checkdist,300)
	p_while
		p_program(s_castle_downbar_1)
		p_program(stMainMoveBG)
	p_loop

/*====================================================*/
e_downbridge:
e_castle_downbar:
	p_initialize(control)
	p_setbit( flag,stf_moveON | stf_playerdistON | stf_alldispON )
	p_save_nowpos
	p_while
		p_program(s_downbar)
	p_loop

/*====================================================*/
e_d_teretrap:
	p_initialize(control)
	p_setbit(flag,stf_moveON | stf_playerdistON | stf_alldispON )
	p_save_nowpos
/*	p_program(s_areastage_init)		*/
	p_setd(programselect,1)
	p_while
		p_program(s_downbar)
	p_loop

/*====================================================*/
e_mapobj_motos_07:
	p_initialize(control)
	p_setbit( flag,stf_moveON | stf_playerdistON | stf_alldispON )
	p_save_nowpos
	/* p_changeshape(imm,S_motos_obj07_far)	*/
	p_setd(programselect,2)
	p_while
		p_program(s_downbar)
	p_loop

/*################*/
#else
/*################*/

/********************************************************************************
	   ---------------------
		castle down bar
	   ---------------------
 ********************************************************************************/
#define		castle_bar_accel	(execstp->s[stw_work0].d)

	extern short down_b_info[];
	extern short d_trap_check_info[];
	extern short motos_obj07_info[];
	extern short e2_kuzure01_check_info[];

/*------------------------------------------------------------------------------*/
extern void s_castle_downbar_1(void)
{

	switch (obj_mode){
		case	0:
			if ( player1stp->ride_strat == execstp ){
				obj_mode++;
				castle_bar_accel =  0x80 * RandomSign();
			}
			break;
#if 1
		case	1:
			s_groundcheck();
			if ( obj_timer > 5 ){
				obj_mode++;
				objsound(NA_SE2_BRIDGEFALL);
			}
			break;
		case	2:
			 if ( obj_anglespeedX < 0x400 ){
			 	obj_anglespeedX += 0x80;
			 }
			 if ( -0x400 < obj_anglespeedZ && obj_anglespeedZ < 0x400 ){
			 	obj_anglespeedZ += castle_bar_accel;
			 }
			obj_gravity = -3;
			s_move_animeangle();
			s_optionmove_F();
			if ( obj_worldY < ( obj_groundY - 300 ) ) obj_mode++;
			break;
		case	3:
			break;
#endif


	}

	if ( execstp->motherobj->s[stw_mode].d == mode_castle_downbar_exit ) s_remove_obj(execstp);
			
}



/*------------------------------------------------------------------------------*/

/* 
	0 .... castle downbar 
	1 .... obake downbar
	2 .... motos downbar

*/
typedef struct {
	short			count;
	short			Zoffset;
	short			Zadd;
	short			shape;
	short			*funlike;
} DownbarRecord;


static DownbarRecord downbar_data[] = {
 	{ 9,-512,128,	S_down_bridge		,down_b_info			},
 	{ 9,-412,103,	S_movebg03			,d_trap_check_info		},
 	{ 9,-512,128,	S_motos_obj07_near 	,motos_obj07_info		},
 	{ 9,-512,128,	S_movebg11			,e2_kuzure01_check_info },
};

static void castle_downbar_init(void)
{

	StrategyRecord *stp;
	int	i;
	int n = obj_programselect;
	int	x,z;
	int y = 0;
	int yoffset = 0;

	for(i=0;i<downbar_data[n].count;i++){

		x = 0;
		z = 0;
		if ( n == 3 )	x = downbar_data[n].Zoffset + i * downbar_data[n].Zadd;
		else		 	z = downbar_data[n].Zoffset + i * downbar_data[n].Zadd;

		if ( s_check_pathname( e_mapobj_motos_07 ) ){
			if ( ( i % 3 ) == 0 ) y -= 150; 
			yoffset = 150*3; 
		}

		stp = s_makeobj_chain(0,x,y+yoffset,z,
						execstp,
						downbar_data[n].shape,
						e_downbar_object
						);

		s_set_shapeinfo(stp,downbar_data[n].funlike);
	}

	obj_mode = mode_castle_downbar_main;

}

/*------------------------------------------------------------------------------*/
static void castle_downbar_main(void)
{

	s_shape_hide();

	if ( s_check_pathname( e_mapobj_motos_07 ) ) s_shape_disp();
	else {
		if ( obj_playerdist > 1200 ){
			obj_mode = mode_castle_downbar_exit;
			s_shape_disp();
		}
	}

}

/*------------------------------------------------------------------------------*/
static void castle_downbar_exit(void)
{

	s_shape_disp();
	obj_mode = mode_castle_downbar_wait;

}

/*------------------------------------------------------------------------------*/
static void castle_downbar_wait(void)
{

	if ( s_check_pathname( e_mapobj_motos_07 ) || obj_playerdist < 1000 ){
		obj_mode = mode_castle_downbar_init;
	}

}

/*------------------------------------------------------------------------------*/

static void *castle_downbar_modejmp[] = {
	
	 castle_downbar_wait,	
	 castle_downbar_init,	
	 castle_downbar_main,	
	 castle_downbar_exit
	
};	

extern void s_downbar(void)
{
	s_modejmp(castle_downbar_modejmp);
}


/*################*/
#endif
/*################*/
/*===============================================================================
		end end end end end end end end 
===============================================================================*/



