
#define	CANNON_ANGLEY	( (short)((obj_programselect)*256) )

/********************************************************************************
					-------------------------
				 	 Ultra 64 MARIO Brothers
					-------------------------

					File		: pathcannon.s
					Description	: 
					Date		: 1995.
					Author		: H.yajima

 ********************************************************************************/


/*################*/
#ifdef ASSEMBLER
/*################*/

/********************************************************************************
				Cannon Base Program Main
 ********************************************************************************/
e_cannon:
e_cannon_base:
	p_initialize(item)
	p_setbit( flag,stf_moveON | stf_YangleSAME | stf_playerdistON | stf_alldispON )
	p_makeshape(S_cannon_body,e_cannon_body)
	p_setd(objname,OBJNAME_CANNON)
	p_addf(worldY,-340)
	p_save_nowpos
	p_sethitbox(150,150)
	p_hitON
 	p_while
		p_program(s_cannon_base)
	p_loop

/********************************************************************************
				Cannon Body Program Main
 ********************************************************************************/
e_cannon_body:
	p_initialize(option)
	p_setbit( flag,stf_moveON | stf_YangleSAME | stf_playerdistON | stf_alldispON )
	p_BGcheckYset
 	p_while
		p_program(s_cannon_body)
	p_loop


/********************************************************************************
				Cannon gas Program Main
 ********************************************************************************/

e_gas_b:
	p_initialize(option)
	p_setbit(flag,stf_moveON | stf_YangleSAME | stf_FspeedON )
	p_softspritemodeON
	p_animereset
	p_do(8)
		p_program(s_gas_b)
		p_animeinc
	p_next
	p_killshape

/*################*/
#else
/*################*/

extern void s_gas_b(void)
{
 	obj_worldY += obj_speedY;
}

/********************************************************************************
				Cannon Program Main
 ********************************************************************************/

#define		cannon_sinwork	(execstp->s[stw_work0].d)
#define		cannon_totaltime	(execstp->s[stw_work1].d)

#define		cannon_flag			s[stw_work6].d

/*-----------------------------------------------------------------------------*/
static void cannon_wait(void)
{

	if ( obj_timer == 0 ){
		obj_mail 				= 0;
		obj_worldX 				= obj_attX;
		obj_worldY 				= obj_attY;
		obj_worldZ 				= obj_attZ;
		obj_angleX			 	= 0;
		obj_angleY				= CANNON_ANGLEY;
		cannon_sinwork			= 0;
		execstp->cannon_flag	= 0;
		s_shapeON();
		s_hitON();
	}

	if ( obj_playerdist < 500 ){
		s_hitON();
		s_shapeON();
		if ( ((obj_mail & EMAIL_PLAYERHIT) != 0 ) && ((obj_mail & EMAIL_BOMB ) == 0 ) ){
			obj_mode = mode_cannon_up;
			execstp->cannon_flag = 1;
			cannon_totaltime  	= 1;
		} else {
		 	obj_mail = 0;
		}
	} else {
		s_hitOFF();
	 	s_shapeOFF();
		execstp->cannon_flag = 0;
	}


}

/*-----------------------------------------------------------------------------*/
static void cannon_up(void)
{

	if ( obj_timer == 0 )	objsound(NA_SE3_TAIHOUSET0);

	obj_worldY +=5;
	obj_worldX += (float)(((obj_timer/2) & 1)-0.5)*2;
	obj_worldZ += (float)(((obj_timer/2) & 1)-0.5)*2;

	if ( obj_timer > 67 ){ 
		obj_worldX += (float)(((obj_timer/2) & 1)-0.5)*4;
		obj_worldZ += (float)(((obj_timer/2) & 1)-0.5)*4;
		obj_mode 	= mode_cannon_Yanime;
	}

}

/*-----------------------------------------------------------------------------*/
static void cannon_Yanime(void)
{

	if ( obj_timer == 0 )	objsound(NA_SE3_TAIHOUSET1);

	if ( obj_timer < 4 ){
		obj_worldX += (float)(((obj_timer/2) & 1)-0.5)*4;
		obj_worldZ += (float)(((obj_timer/2) & 1)-0.5)*4;
	} else if ( obj_timer < 6       ){
	} else if ( obj_timer < 6+16    ){
		obj_angleY 		= sin(cannon_sinwork)*0x4000+CANNON_ANGLEY;
		cannon_sinwork += 0x400;
	} else if ( obj_timer < 6+16+4 ){
	} else {
		cannon_sinwork = 0;
		obj_mode = mode_cannon_Xanime;
//		obj_mode = mode_cannon_stanby;
	}

}

/*-----------------------------------------------------------------------------*/
static void cannon_Xanime(void)
{

	if ( obj_timer == 0 )	objsound(NA_SE3_TAIHOUSET2);

	if ( obj_timer < 4 ){
	} else if ( obj_timer < 4+16 ){
		cannon_sinwork += 0x400;
		obj_angleX 		= sin(cannon_sinwork)*0x2000;
	} else if ( obj_timer < 4+16+5 ){
	} else {
		obj_mode = mode_cannon_stanby;
	}

}

/*-----------------------------------------------------------------------------*/
static void cannon_stanby(void)
{

	StrategyRecord *stratp;
	float scale;

	s_hitOFF();
	s_shapeOFF();
	execstp->cannon_flag = 0;
	cannon_useflag = 1;		/* cannon flag ON */
		
}

/*-----------------------------------------------------------------------------*/
static void cannon_fire(void)
{
	obj_mode = mode_cannon_fireentry;
}

/*-----------------------------------------------------------------------------*/
static void cannon_fireentry(void)
{

	StrategyRecord *stratp;
	float scale;

/*--------------------------------------
	if ( obj_timer < 30 ){
		stratp = s_makeobj_nowpos(execstp,S_gas_b,e_gas_b);
		stratp->s[stw_angleY].d = Randomd();
		stratp->s[stw_speedF].f = Randomf()*20+20;
		stratp->s[stw_speedY].f = cos(player1stp->s[stw_angleX].d)*40;
		scale					= Randomf()*3.0+3.0;
		stratp->map.scale[0] 	= scale;
		stratp->map.scale[1] 	= scale;
	}
--------------------------------------*/

	if ( obj_timer > 3 ) obj_mode = mode_cannon_wait;

}


/*-----------------------------------------------------------------------------*/

static void *cannon_modejmp[] = {
	
	 cannon_wait,
	 cannon_stanby,
	 cannon_fire,
	 cannon_fireentry,
	 cannon_up,
	 cannon_Xanime,
	 cannon_Yanime
	
};


extern void s_cannon_base(void)
{

	s_modejmp(cannon_modejmp);
	if ( cannon_totaltime != 0 ) cannon_totaltime++;
	obj_mail = 0;

}

/********************************************************************************
				Cannon Program Main
 ********************************************************************************/


extern void s_cannon_body(void)
{

	StrategyRecord *base_stp = execstp->motherobj;

	if ( ( ((MapNode *)(&base_stp->map))->flags ) & MAP_FLAG_ENABLE  ){
		s_shapeON();
		s_copy_worldXYZ(execstp,execstp->motherobj);
		execstp->s[stw_angleY].d 		= execstp->motherobj->s[stw_angleY].d;
		execstp->s[stw_animeangleX].d	= execstp->motherobj->s[stw_angleX].d;
	} else {
		s_shapeOFF();
	}

}

/*################*/
#endif
/*################*/
/*===============================================================================
		end end end end end end end end 
===============================================================================*/

