/********************************************************************************
					-------------------------
				 	 Ultra 64 MARIO Brothers
					-------------------------

					File		: pathqbox.s
					Description	: 
					Date		: 1995.
					Author		: H.yajima

 ********************************************************************************/


#define	ITEM_BOX_SCALE		2.0f

/*################*/
#ifdef ASSEMBLER
/*################*/

/*----------------------------------------------*/
/*												*/
/*	itembox										*/
/*												*/
/*----------------------------------------------*/

e_qbox:
e_itembox:
	p_initialize(moveBG)
	p_setbit(flag,stf_moveON | stf_YangleSAME )
	p_setshapeinfo(q_block_info)
	p_setbit(flag,stf_moveON )
	p_setf(movebg_checkdist,300)
	p_save_nowpos
	p_while
		p_program(s_itembox)
	p_loop


/*----------------------------------------------*/
/*												*/
/*	qbox mark									*/		
/*												*/
/*----------------------------------------------*/

e_qbox_mark:
	p_initialize(option)
	p_setbit(flag,stf_moveON | stf_YangleSAME )
	p_set_scale(200)
	p_while
		p_program(s_qbox_mark)
		p_addd(angleY,0x800)
	p_loop

/*################*/
#else
/*################*/

#define			qbox_scaleX	(execstp->s[stw_work0].f)
#define			qbox_scaleY	(execstp->s[stw_work1].f)
#define			qbox_work	(execstp->s[stw_work2].d)




/********************************************************************************

		item box data's

 ********************************************************************************/

static HitCheckRecord itembox_hit = {
	OBJNAME_PUNCHITEM,
	5,0,1,0,		/* flag,ap,hp,coin 		 */
	40,30,			/* player attack hitarea */
	40,30,			/* player attack hitarea */
};



	extern Path e_itemhat_metal[];
	extern Path e_itemhat_wing[];
	extern Path e_itemhat_erase[];

MakeIDJMP	itembox_table[] = {
 	{ ITEMCODE_HAT_WING 	,0,0,S_itemhat_wing		,e_itemhat_wing  	 },
 	{ ITEMCODE_HAT_METAL 	,0,0,S_itemhat_metal	,e_itemhat_metal 	 },
 	{ ITEMCODE_HAT_ERASE 	,0,0,S_itemhat_hat		,e_itemhat_erase 	 },
 	{ ITEMCODE_NOKO		 	,0,0,S_koura			,e_nokoboard 	 	 },
 	{ ITEMCODE_COIN_1		,0,0,S_coin				,e_player_coin 	 	 },
 	{ ITEMCODE_COIN_3		,0,0,S_NULL				,e_player_coin_3 	 },
 	{ ITEMCODE_COIN_10		,0,0,S_NULL				,e_player_coin_10 	 },
 	{ ITEMCODE_1UP			,0,0,S_oneup_kinoko		,e_1up_kinoko		 },
 	{ ITEMCODE_GOALSTAR		,0,0,S_polystar			,e_enemystar2		 },
 	{ ITEMCODE_1UP_ESCAPE	,0,0,S_oneup_kinoko		,e_1up_kinoko_escape },
 	{ ITEMCODE_GOALSTAR_1	,0,1,S_polystar			,e_enemystar2		 },
 	{ ITEMCODE_GOALSTAR_2	,0,2,S_polystar			,e_enemystar2		 },
 	{ ITEMCODE_GOALSTAR_3	,0,3,S_polystar			,e_enemystar2		 },
 	{ ITEMCODE_GOALSTAR_4	,0,4,S_polystar			,e_enemystar2		 },
 	{ ITEMCODE_GOALSTAR_5	,0,5,S_polystar			,e_enemystar2		 },
 	{ ITEMCODE_END			,0,0,0					,NULL 			 	 },
};


/********************************************************************************

		item box program's

 ********************************************************************************/

extern void s_qbox_mark(void)
{

 	if ( execstp->motherobj->s[stw_mode].d != mode_itembox_disable )	s_remove_obj(execstp);

}

/*------------------------------------------*/
/*		itembox initalize					*/
/*------------------------------------------*/
static void itembox_init(void)
{
 	/*==== backup read ====*/


	if ( obj_programselect < 3 ){
		obj_animecounter = obj_programselect;
		if ( ( BuGetItemFlag() & backup_switchtable[obj_programselect] ) || obj_actor_high ) obj_mode = mode_itembox_enable;
		else																				 obj_mode = mode_itembox_disable;
	} else { 
		obj_animecounter = 3;																		
		obj_mode = mode_itembox_enable;
	}
}

/*------------------------------------------*/
/*		itembox disable						*/
/*------------------------------------------*/

static void itembox_disable(void)
{
	s_hitOFF();
	if ( obj_timer == 0 ){
		s_makeobj_nowpos(execstp,S_qbox_mark,e_qbox_mark);
		s_change_shape(S_qbox_box);
	} 
	
	if ( ( BuGetItemFlag() & backup_switchtable[obj_programselect] ) || obj_actor_high ){
		obj_mode = mode_itembox_enable;
		s_change_shape(S_itembox);
	}

}


/*------------------------------------------*/
/*		wait program						*/
/*------------------------------------------*/
static void itembox_enable(void)
{

	s_set_hitparam(execstp,&itembox_hit);

	if ( obj_timer == 0 ){
		s_shape_disp();
		s_hitON();
		obj_mail 			= 0;
		obj_worldY  	   	= obj_attY;
		obj_animepositionY 	= 0;
	}


	if ( s_block_hitcheck() ){
		s_hitOFF();
		qbox_work = 0x4000;
		obj_speedY  = 30;
		obj_gravity = -8;
		obj_groundY = obj_worldY;
		obj_mode 	= mode_itembox_burn;

		SendMotorEvent(5,80);		/* MOTOR 1997.5.27 */
	}

	stMainMoveBG();

}

/*------------------------------------------*/
/*		burn program						*/
/*------------------------------------------*/
static void itembox_burn(void)
{

	StrategyRecord *stp;

	s_optionmove_F();
	if ( obj_speedY < 0 ){	obj_speedY = 0; obj_gravity = 0; }

	qbox_scaleY 	  	  = ((sin(qbox_work)+1.0) *0.3)+0,4;
	qbox_scaleX 		  = ((-sin(qbox_work)+1.0)*0.5)+1.0; 			
	obj_animepositionY	  = (ITEM_BOX_SCALE*13)*(-sin(qbox_work)+1.0);
	qbox_work += 0x1000;
	execstp->map.scale[0] = ITEM_BOX_SCALE*qbox_scaleX;
	execstp->map.scale[1] = ITEM_BOX_SCALE*qbox_scaleY;
	execstp->map.scale[2] = ITEM_BOX_SCALE*qbox_scaleX;

	if ( obj_timer == 0x7 )	obj_mode = mode_itembox_makeitem;

}

static void s_itembox_makeobj(MakeIDJMP *table,unsigned char code)
{
																
	StrategyRecord *stp = NULL;                          

	while( table->code != ITEMCODE_END ){
		if ( code == table->code ){
			stp = s_makeobj_nowpos(execstp,table->shape,table->path);
			stp->s[stw_speedY].f    = 20;
			stp->s[stw_speedF].f    = 3;
			stp->s[stw_angleY].d    = player1stp->s[stw_angleY].d;
			execstp->s[stw_actorcode].d  |=  ( ( table->status ) << 24 ); 
			if (table->shape == S_polystar ) Mbitset(obj_mainflag,stf_NOramsave);
			break;
		}
		table++;
	}

}

static void itembox_makeitem(void)
{

	s_itembox_makeobj(itembox_table,obj_programselect);

	s_burneffect(0,0,46);
	s_boxeffect(20,S_polygon_hoshi,0.3,obj_animecounter);
	obj_remove_sound(NA_SE2_BLOCK_BURST);

	if ( obj_programselect < 3 ){
	 	obj_mode = mode_itembox_return;
		s_shape_hide();
	} else {
		s_remove_obj(execstp);
	}


}

static void itembox_return(void)
{
	if ( obj_timer >ITEMHAT_TIME ){
		obj_mode = mode_itembox_enable;
	}

}

/*------------------------------------------*/
/*		itembox main						*/
/*------------------------------------------*/

static void *itembox_modejmp[] = {
	
	 itembox_init,
	 itembox_disable,
	 itembox_enable,
	 itembox_burn,
	 itembox_makeitem,
	 itembox_return
	
};

extern void s_itembox(void)
{

	s_set_scale(ITEM_BOX_SCALE);
	s_modejmp(itembox_modejmp);

}


/*################*/
#endif
/*################*/

