/********************************************************************************
					-------------------------
				 	 Ultra 64 MARIO Brothers
					-------------------------
					    Block Strategy

					March 31 1996       programed by Iwamoto Daiki
 ********************************************************************************/

/*################*/
#ifdef ASSEMBLER
/*################*/

/*==============================================================================
						Path Data
 ===============================================================================*/

/*******************************************************************************
						Take Block
********************************************************************************/
e_takeblock:
	p_initialize(plfire)
	p_setbit(flag,stf_moveON  | stf_catchON |stf_YangleSAME | stf_playerdistON )
	p_BGcheckYset
	p_save_nowpos
	p_program(s_takeblock_init)

	p_while
		p_hitON
		p_program(s_takeblock_main)
	p_loop

/*################*/
#else
/*################*/


/*==================================================================================================
		C Program
 ===================================================================================================*/
#define block_returnflag	(execstp->s[stw_work0].d)
#define block_counter		(execstp->s[stw_work2].d)


static HitCheckRecord takeblock_hit = {
	OBJNAME_TAKE,
	20,0,1,0,		/* flag,ap,hp,coin 		 */
	130+20,210+40,	/* player attack hitarea */
	130+20,210+40,	/* player attack hitarea */
};



/*==================================================================================================
		Take Block
 ===================================================================================================*/
/***************************************************************************************************
						    Init
***************************************************************************************************/
extern void s_takeblock_init(void)
{

	execstp->s[stw_gravity].f   = 2.5;
	execstp->s[stw_friction].f  = 0.99;
	execstp->s[stw_specificG].f = 1.4;

	s_set_scale(0.4);
	s_set_hitparam(execstp,&takeblock_hit);	
	obj_animecounter = 1;

	Mbitset(execstp->status,OBJECT_PLFIRE_OFF);

}
/***************************************************************************************************
						    Kemuri
***************************************************************************************************/
static void takeblock_Kemuri(void)
{
	StrategyRecord* stp = s_makeobj_nowpos(execstp,S_dust,e_iwa_smoke);

	stp->s[stw_worldX].f += (int) (Randomf()*80)-40;
	stp->s[stw_worldZ].f += (int) (Randomf()*80)-40;


}
/***************************************************************************************************
						Take Block Event
***************************************************************************************************/
static void takeblock_Move(void)
{
	short move_flag;

	move_flag = ObjMoveEvent();
	s_fire_hitcheck(execstp);

	if (move_flag == 0x01) { objsound(NA_SE2_WOODBOX_BOUND); }

	if (move_flag & OM_TOUCH && obj_speedF>20 ) {
		objsound(NA_LSE2_BOXSLIDE_S); 
		takeblock_Kemuri();
	}

	if (move_flag & OM_WALL) {
		s_kemuri();
		s_boxeffect(20,S_sankaku,0.7f,3);
		iwa_MakeCoin(execstp,3);
		obj_remove_sound(NA_SE2_BLOCK_BURST); 
		execstp->status = 0;
	}

	ObjDangerCheck(move_flag,moveobj_bgcp);
	
}
/***************************************************************************************************
						Take Block Event
***************************************************************************************************/
static void takeblock_Return(void)
{
	block_counter++;

	if (block_counter > FRAME*27) {
		if (block_counter & 0x01) MapHideShape(&execstp->map);
		else				  	  MapDispShape(&execstp->map);
	}

	if (block_counter > FRAME*30) {
    	Obj_reset(S_hibiblock_noshadow,e_takeblock,3000);
		execstp->status = 0;

	}


}
/***************************************************************************************************
						Take Block Event
***************************************************************************************************/
static void takeblock_Event(void)
{
	short move_flag;

	switch (obj_mode) {
		case 0: takeblock_Move();
				break;

		case OBJ_MELT : ObjMeltEvent();
						break;
		case OBJ_AIRDEAD : execstp->status = 0;  
						   Obj_reset(S_hibiblock_noshadow,e_takeblock,3000);
						   break;
	}

	if (block_returnflag == 1) {
		takeblock_Return();
	}

	
}
/***************************************************************************************************
						Block Drop
***************************************************************************************************/
static void takeblock_Drop(void)
{

	s_hitON();
	s_shapeON();
	s_mode_drop();	
	MapDispShape(&execstp->map);

	execstp->s[stw_actionmode].d = CHILEDMODE_NO_CATCH;
	block_returnflag = 1;
	block_counter = 0;
}
/***************************************************************************************************
						Take Block Throw
***************************************************************************************************/
static void takeblock_Throw(void)
{
	s_hitON();
	s_throw_object();	
	s_shapeON();
	MapDispShape(&execstp->map);
	execstp->s[stw_actionmode].d = CHILEDMODE_NO_CATCH;
	execstp->s[stw_flag].d &= (stf_YangleSAME^0xffffffff); 

	execstp->s[stw_speedF].f = 40.;
	execstp->s[stw_speedY].f = 20.;

	block_returnflag = 1;
	block_counter = 0;

	Mbitclr(execstp->status,OBJECT_PLFIRE_OFF);
}
/***************************************************************************************************
						Take Block Main
***************************************************************************************************/
extern void s_takeblock_main(void)
{


	switch(execstp->s[stw_actionmode].d) {
		case CHILEDMODE_NO_CATCH:	takeblock_Event();					break;
		case CHILEDMODE_CATCH:		s_shapeOFF();
									s_hitOFF();
									break;
		case CHILEDMODE_THROW:		takeblock_Throw();					break;
		case CHILEDMODE_DROP:		takeblock_Drop();					break;
	}

	obj_mail = 0;
}




/*################*/
#endif
/*################*/


