/********************************************************************************
					-------------------------
				 	 Ultra 64 MARIO Brothers
					-------------------------

					File		: 
					Description	: 
					Date		: 1995.
					Author		: H.yajima

 ********************************************************************************/


/*################*/
#ifdef ASSEMBLER
/*################*/



/********************************************************************************
	   ---------------------
		stage24 Rotation BG
	   ---------------------
 ********************************************************************************/

e_rotland:
	p_initialize(moveBG)
	p_setbit(flag,stf_moveON )
	p_save_nowpos
	p_while
		p_program(s_castle_rotland)
		p_program(stMainMoveBG)
	p_loop

/********************************************************************************
	   ----------------------
		stage24 Tower Check
	   ----------------------
 ********************************************************************************/

e_stage24_tower_check:
	p_initialize(moveBG)
	p_setbit(flag,stf_moveON )
	p_setshapeinfo(ca_n_bg06_check_info)
	p_setf(movebg_checkdist,3000)
	p_setf(shapeLOD,20000)
	p_while
		p_program(stMainMoveBG)
	p_loop

/********************************************************************************
	   ----------------------
	    stage24 Killer Check
	   ----------------------
 ********************************************************************************/

e_stage24_killer_check:
	p_initialize(moveBG)
	p_setbit(flag,stf_moveON )
	p_setshapeinfo(ca_n_bg07_check_info)
	p_setf(movebg_checkdist,300)
	p_while
		p_program(stMainMoveBG)
	p_loop

/********************************************************************************
	   --------------------
		castle attack wall
	   --------------------
 ********************************************************************************/

e_castle_attackwall_1:
	p_initialize(moveBG)
	p_setshapeinfo(ca_moveobj01_info)
	p_jmp(castle_attackwall_common)

e_castle_attackwall_2:
	p_initialize(moveBG)
	p_setshapeinfo(ca_moveobj02_info)
castle_attackwall_common:
	p_setbit( flag,stf_moveON | stf_YangleSAME | stf_playerdistON | stf_alldispON )
	p_sethitbox(300,400)
	p_hitON
	p_while
		p_program(s_castle_attackwall)
		p_program(stMainMoveBG)	
	p_loop		

/********************************************************************************
	   ----------------------
		castle attack bridge 
	   ----------------------
 ********************************************************************************/
e_castle_attackbridge:
	p_initialize(moveBG)
	p_setbit( flag,stf_moveON | stf_YangleSAME | stf_playerdistON | stf_alldispON | stf_playerangleON )
	p_setshapeinfo(ca_moveobj03_info)
	p_sethitbox(100,1200)
	p_setdamagebox(1,1)
	p_setf(movebg_checkdist,1500)
	p_hitON
	p_while
		p_program(s_castle_attackbridge)
	p_loop		

/********************************************************************************
	   -------------
		castle futa
	   -------------
 ********************************************************************************/
e_castle_futa:
	p_initialize(moveBG)
	p_setbit( flag,stf_moveON | stf_playerdistON | stf_alldispON )
	p_setshapeinfo(ca_moveobj04_info)
	p_sethitbox(100,100)
	p_hitON
	p_while
		p_program(s_castle_futa)
		p_program(stMainMoveBG)
	p_loop		

/********************************************************************************
	   ----------------
		castle sidebar
	   ----------------
 ********************************************************************************/
e_castle_sidebar:
	p_initialize(option)
	p_end

/********************************************************************************
	   ----------------
		castle rotbar
	   ----------------
 ********************************************************************************/
e_castle_rotbar:
	p_initialize(moveBG)
	p_setbit( flag,stf_moveON )
	p_setshapeinfo(rote_bar_info)
	p_while
		p_program(s_castle_rotbar)
		p_program(stMainMoveBG)
	p_loop	  

/*------------------------------------------------------------------------------*/
/*------------------------------------------------------------------------------*/
/*------------------------------------------------------------------------------*/
/*------------------------------------------------------------------------------*/
/*------------------------------------------------------------------------------*/
/*------------------------------------------------------------------------------*/
/*------------------------------------------------------------------------------*/
/*------------------------------------------------------------------------------*/
/*------------------------------------------------------------------------------*/
/*------------------------------------------------------------------------------*/
/*------------------------------------------------------------------------------*/
/*------------------------------------------------------------------------------*/
/*------------------------------------------------------------------------------*/
/*------------------------------------------------------------------------------*/
/*------------------------------------------------------------------------------*/
/*------------------------------------------------------------------------------*/
/*------------------------------------------------------------------------------*/




/*################*/
#else
/*################*/


/********************************************************************************
	   ---------------------
		castle attack wall
	   ---------------------
 ********************************************************************************/

extern void s_castle_attackwall(void)
{
	if ( playerWorks[0].status == PS_CANNJUMP ){
		s_hitON();
		if ( s_hitcheck(execstp,player1stp) ){
			if ( s_check_pathname(e_castle_attackwall_1) ) Na_NazoClearBgm();
			obj_remove_sound(NA_SE2_WALLCRASH);
			obj_objname = OBJNAME_DAMAGE;
			obj_ap		= 1;
			s_burn_remove(80,BURNSET_NOTHING);
		}
	} else {
	 	s_hitOFF();
	}
}

/********************************************************************************
	   ----------------------
		castle attack bridge
	   ----------------------
 ********************************************************************************/


/*

static unsigned long pl_attackdata[] = {
  	PS_ATTACK,
	PS_RUNATTACK,
	PS_SLIDEATTACK.
	0
}

static unsigned long pl_jp_attackdata[] = {
  	PS_ATTACK,
	PS_RUNATTACK,
	PS_SLIDEATTACK.
	0
}

*/


extern int s_attackcheck(int flag)
{
	if ( s_hitcheck(execstp,player1stp) ){
		if ( s_calc_dangle(obj_angleY,player1stp->s[stw_angleY].d) > 0x6000 ){
			if ( playerWorks[0].status == PS_JUMPKICK  ) return(1);
			if ( playerWorks[0].status == PS_ATTACK    ) return(1);
			if ( playerWorks[0].status == PS_RUNATTACK ) return(1);
			if ( playerWorks[0].status == PS_SLIDEKICK ) return(1);
			if ( playerWorks[0].status == PS_JPPOWKICK ) return(2); 
			if ( playerWorks[0].status == PS_JUMPWALL )  return(2);
		} 
	}

	return(0);

}

static void attackbridge_reset(void)
{
	obj_work1 = 1600;
	obj_work0 = 0;
}

extern void s_castle_attackbridge(void)
{

	int	code;

 	switch(obj_mode){

		case	0:
			obj_animeangleX = 0;
			if( s_attackcheck(0) ){
				attackbridge_reset();
				obj_mode++;
			}
			stMainMoveBG();
			break;

		case	1:

			obj_animeangleX = 0;		/* angleX ... 0 */
			stMainMoveBG();
			obj_animeangleX = - sin(obj_work0) * obj_work1;		/* ( attack bridge move ) */

			if( ( obj_timer > 30 ) && ( code = s_attackcheck(0) ) ){
				if ( (player_worldY > obj_worldY+160) && ( code == 2 )){
					obj_mode++;
					objsound(NA_SE2_WOODPOLE_SWING);
				} else	obj_timer = 0;
			}
			
			if ( obj_timer != 0 ){
				obj_work1 -= 8;
				if ( obj_work1 < 0 ) obj_mode = 0;
			} else {
				attackbridge_reset();
			}

			if ( ( obj_work0 & 0x7fff ) == 0 ) objsound(NA_SE2_WOODPOLE_SWING);

			obj_work0 		+= 0x400;

			break;

		case	2:
			s_hitOFF();
			s_change_shape(S_movebg05);
			obj_anglespeedX -= 0x80;
			obj_animeangleX += obj_anglespeedX;
			if ( obj_animeangleX < -0x4000 ){
				obj_animeangleX = -0x4000;
				obj_anglespeedX = 0;
				obj_mode++;
				s_call_Viewshake(VS_SMALL);
				objsound(NA_SE2_WOODPOLE_BOUND);
			}
			stMainMoveBG();
			break;

		case	3:
			stMainMoveBG();
			break;
	}

	execstp->map.matrix = NULL;

}

/********************************************************************************
	   -------------
		castle futa
	   -------------
 ********************************************************************************/


extern void s_castle_futa(void)
{
	if ( obj_timer == 0 ) obj_angleY -= 0x4000;
	if ( s_attackcheck(0) ){
		s_burn_remove(80,BURNSET_NOTHING);
	 	obj_remove_sound(NA_SE2_WALLCRUMBLE);
	}
}


/********************************************************************************
		C Program
 ********************************************************************************/

#define rotbar_speed	0x100
#define	rotbar_angle	0x8000

extern void s_castle_rotbar(void)
{

	if ( obj_mode == 0 ){
		obj_anglespeedY = 0;
		if ( obj_timer > 60	)	obj_mode++;
	} else {
		obj_anglespeedY = rotbar_speed;
		if ( obj_timer >= ( rotbar_angle/rotbar_speed-1 ) )	obj_mode=0;
		objsound_level(NA_LSE2_RAFT_MOVE);
	}
	
	s_move_animeangle();

}

/********************************************************************************

		C Program

 ********************************************************************************/


	extern	short ca_mobj14_check_info[];
	extern	short po_mobj07_check_info[];


static RotateMoveBGRecord	rotbg_data[] = {
	{ 0,100,ca_mobj14_check_info,2000 },		/* actorcode = 0 */
	{ 0,150,po_mobj07_check_info,1000 },		/* actorcode = 1 */
};

extern void s_castle_rotland(void)
{

	char  speed = ( execstp->s[stw_actorcode].d >> 24 );

	if ( obj_timer == 0 ){
		s_set_shapeinfo(execstp,rotbg_data[obj_programselect].funlike	);
		obj_movebg_checkdist  = rotbg_data[obj_programselect].checkdist;
		s_set_scale(rotbg_data[obj_programselect].scale * 0.01f );
	}

	obj_anglespeedY = speed * 0x10;
	obj_animeangleY += obj_anglespeedY;

}



/*################*/
#endif
/*################*/
/*===============================================================================
		end end end end end end end end 
===============================================================================*/





