/********************************************************************************
					-------------------------
				 	 Ultra 64 MARIO Brothers
					-------------------------

					File		: pathpazzule.s
					Description	: 
					Date		: 1995.11.18
					Author		: H.yajima

 ********************************************************************************/


/*################*/
#ifdef ASSEMBLER
/*################*/

e_pazzule:
	p_initialize(moveBG)
	p_setbit(flag,stf_moveON | stf_playerdistON )
	p_setshapeinfo(motos_obj12_info)
	p_save_nowpos
	p_setf(movebg_checkdist,3000)
	p_while
		p_program(s_pazzule)
		p_program(stMainMoveBG)
	p_loop

e_mapobj_motos12:
	p_initialize(control)
	p_shapeDISABLE
	p_setbit(flag,stf_moveON | stf_playerdistON )
	p_addf(worldZ,-50)
	p_while
		p_program(s_make_pazzule)
	p_loop




/*################*/
#else
/*################*/



/*	mother ---> work0 = coinflag */

#define		pazz_offsetX	(execstp->s[stw_work2].f)
#define		pazz_offsetY	(execstp->s[stw_work3].f)
#define		pazz_offsetZ	(execstp->s[stw_work4].f)
#define		pazz_flag	(execstp->s[stw_work5].d)

	/* work6 used */
	/* work7 used */


#define	XXL	mode_pazz_left
#define	XXR	mode_pazz_right
#define	XXU	mode_pazz_up
#define	XXD	mode_pazz_down
#define	XX_	mode_pazz_wait

static char	datapazz00[] = { XX_,XXL,XX_,XX_,XX_,XX_,XX_,XX_,XX_,XX_,XX_,XX_,XX_,
						     XX_,XX_,XX_,XX_,XX_,XX_,XX_,XX_,XX_,XX_,XX_,XXR,XX_,-1}; 
static char	datapazz01[] = { XX_,XX_,XXL,XX_,XX_,XX_,XX_,XX_,XX_,XX_,XX_,XX_,XX_,
						     XX_,XX_,XX_,XX_,XX_,XX_,XX_,XX_,XX_,XX_,XXR,XX_,XX_,-1}; 
static char	datapazz04[] = { XX_,XX_,XX_,XXU,XX_,XX_,XX_,XX_,XX_,XX_,XX_,XX_,XX_,
						     XX_,XX_,XX_,XX_,XX_,XX_,XX_,XX_,XX_,XXD,XX_,XX_,XX_,-1}; 
static char	datapazz05[] = { XX_,XX_,XX_,XX_,XXL,XX_,XX_,XX_,XX_,XX_,XX_,XX_,XX_,
						     XX_,XX_,XX_,XX_,XX_,XX_,XX_,XX_,XXR,XX_,XX_,XX_,XX_,-1}; 
static char	datapazz09[] = { XX_,XX_,XX_,XX_,XX_,XXU,XX_,XX_,XX_,XX_,XX_,XX_,XX_,
						     XX_,XX_,XX_,XX_,XX_,XX_,XX_,XXD,XX_,XX_,XX_,XX_,XX_,-1}; 
static char	datapazz08[] = { XX_,XX_,XX_,XX_,XX_,XX_,XXR,XX_,XX_,XX_,XX_,XX_,XX_,
						     XX_,XX_,XX_,XX_,XX_,XX_,XXL,XX_,XX_,XX_,XX_,XX_,XX_,-1}; 
static char	datapazz12[] = { XX_,XX_,XX_,XX_,XX_,XX_,XX_,XXU,XX_,XX_,XX_,XX_,XX_,
						     XX_,XX_,XX_,XX_,XX_,XXD,XX_,XX_,XX_,XX_,XX_,XX_,XX_,-1}; 
static char	datapazz11[] = { XX_,XX_,XX_,XX_,XX_,XX_,XX_,XX_,XXR,XX_,XX_,XX_,XX_,
						     XX_,XX_,XX_,XX_,XXL,XX_,XX_,XX_,XX_,XX_,XX_,XX_,XX_,-1}; 
static char	datapazz07[] = { XX_,XX_,XX_,XX_,XX_,XX_,XX_,XX_,XX_,XXD,XX_,XX_,XX_,
						     XX_,XX_,XX_,XXU,XX_,XX_,XX_,XX_,XX_,XX_,XX_,XX_,XX_,-1}; 
static char	datapazz06[] = { XX_,XX_,XX_,XX_,XX_,XX_,XX_,XX_,XX_,XX_,XXR,XX_,XX_,
						     XX_,XX_,XXL,XX_,XX_,XX_,XX_,XX_,XX_,XX_,XX_,XX_,XX_,-1}; 
static char	datapazz02[] = { XX_,XX_,XX_,XX_,XX_,XX_,XX_,XX_,XX_,XX_,XX_,XXD,XX_,
						     XX_,XXU,XX_,XX_,XX_,XX_,XX_,XX_,XX_,XX_,XX_,XX_,XX_,-1}; 
static char	datapazz03[] = { XX_,XX_,XX_,XX_,XX_,XX_,XX_,XX_,XX_,XX_,XX_,XX_,XXL,
						     XXR,XX_,XX_,XX_,XX_,XX_,XX_,XX_,XX_,XX_,XX_,XX_,XX_,-1}; 
static char	datapazz10[] = { XX_,XX_,XX_,XX_,XX_,XX_,XX_,XX_,XX_,XX_,XX_,XX_,XX_,
						     XX_,XX_,XX_,XX_,XX_,XX_,XX_,XX_,XX_,XX_,XX_,XX_,XX_,-1}; 
static char	datapazz13[] = { XX_,XX_,XX_,XX_,XX_,XX_,XX_,XX_,XX_,XX_,XX_,XX_,XX_,
						     XX_,XX_,XX_,XX_,XX_,XX_,XX_,XX_,XX_,XX_,XX_,XX_,XX_,-1}; 


/********************************************************************************
		pazzule program		
 ********************************************************************************/

static void make_pazz(short shape,Path *path,float sx,float sz,char mode,char *data)
{

	StrategyRecord *p = s_makeobj_nowpos(execstp,shape,path);
	p->s[stw_worldX].f += sx;
	p->s[stw_worldY].f += 50;
	p->s[stw_worldZ].f += sz;
	p->s[stw_mode].d	= mode;
	p->s[stw_work6].pointer	= (void *)data;
	p->s[stw_work7].pointer	= (void *)data;

}


/********************************************************************************
		pazzule program		
 ********************************************************************************/

#define		PAZZ_TOTAL	14

typedef struct {
	unsigned char	shape;
	char			sx;
	char			sz;
	char			mode;
	char			*data;	
} PAZZRecord;

PAZZRecord pazz_makedata[] = {
    {S_pazz00, -5,-15,1,datapazz00},
	{S_pazz01,  5,-15,0,datapazz01},
	{S_pazz02,-15, -5,0,datapazz02},
	{S_pazz03, -5, -5,0,datapazz03},
	{S_pazz04,  5, -5,0,datapazz04},
	{S_pazz05, 15, -5,0,datapazz05},
	{S_pazz06,-15,  5,0,datapazz06},
	{S_pazz07, -5,  5,0,datapazz07},
	{S_pazz08,  5,  5,0,datapazz08},
	{S_pazz09, 15,  5,0,datapazz09},
	{S_pazz10,-15, 15,0,datapazz10},
	{S_pazz11, -5, 15,0,datapazz11},
	{S_pazz12,  5, 15,0,datapazz12},
	{S_pazz13, 15, 15,0,datapazz13}
};

static void makepazzle_init(float pazzsize)
{

	int	i;
	for(i=0;i<PAZZ_TOTAL;i++){
	  make_pazz( pazz_makedata[i].shape,
	             e_pazzule, 
				 pazzsize * pazz_makedata[i].sx / 10.0f,
				 pazzsize * pazz_makedata[i].sz / 10.0f,
				 pazz_makedata[i].mode,
				 pazz_makedata[i].data);
	}
	obj_mode++;
}


extern void s_make_pazzule(void)
{

	int		i;
	StrategyRecord *stp;

	switch(obj_mode){
		case	0:	makepazzle_init(480.0f);		break;
		case	1:
		 if ( execstp->s[stw_work0].d == 3 && obj_playerdist < 1000 ){
			for(i=0;i<5;i++)	stp = s_makeobj_nowpos(execstp,S_coin,e_player_coin);
			execstp->s[stw_work0].d = 0;
			obj_mode++;
		 }
		break;
		case	2:
			break;
	}

}


/********************************************************************************
		pazzule
 ********************************************************************************/


#define	PAZZ_EFFECT_TIME	4*5

/********************************************************************************
		------
		 Stop 
		------
 ********************************************************************************/
static void pazz_stop(void)
{

}

/********************************************************************************
		------------
		 Initialize
		------------
 ********************************************************************************/
static void pazz_init(void)
{
	obj_worldY += 50;
	obj_mode = mode_pazz_left;
}


/********************************************************************************
		-------------------
		 data read program
		-------------------
 ********************************************************************************/
static void pazz_dataread(void)
{
	char *datap = (char *)(execstp->s[stw_work7].pointer);


	if ( player1stp->ride_strat == execstp ){
		 	execstp->motherobj->s[stw_work0].d = 1;
	}	


	if ( pazz_flag == 0 ){

		s_set_newmode(*datap);

		datap++;
		execstp->s[stw_work7].pointer = datap;
		if ((*datap) == -1 ){
		 	execstp->motherobj->s[stw_work0].d |= 2;
			execstp->s[stw_work7].pointer = execstp->s[stw_work6].pointer;
		}
		/*-----------------------*/
	  	pazz_flag = 1;
	}

}


/********************************************************************************
		------
		 move
		------
 ********************************************************************************/
static void pazz_move(float ax,float az,int time,int nextmode)
{

	if ( obj_timer < PAZZ_EFFECT_TIME ){
		if ( obj_timer % 2 )	pazz_offsetY = 0;
		else					pazz_offsetY = -6;
	} else {

		if ( obj_timer == PAZZ_EFFECT_TIME )	objsound(NA_SE3_PUZZLE);

		if ( obj_timer < ( PAZZ_EFFECT_TIME+time )	){
			pazz_offsetX += ax;
			pazz_offsetZ += az;
		} else {
		 	obj_mode = mode_pazz_wait;
		 	pazz_flag = 0;
		}
	}

}


/********************************************************************************
		------
		 wait
		------
 ********************************************************************************/
static void pazz_wait(void)
{
	int i;

	if ( obj_timer < PAZZ_EFFECT_TIME + 4 )	i = 0;
	else 									pazz_flag = 0;

}

/********************************************************************************
		------
		 Left
		------
 ********************************************************************************/
static void pazz_left(void)
{
	pazz_move(-120,0,4,mode_pazz_right);
}

/********************************************************************************
		-------
		 Right
		-------
 ********************************************************************************/
static void pazz_right(void)
{
	pazz_move(120,0,4,mode_pazz_up);
}

/********************************************************************************
		----
		 Up
		----
 ********************************************************************************/
static void pazz_up(void)
{
	pazz_move(0,-120,4,mode_pazz_down);
}

/********************************************************************************
		------
		 Down
		------
 ********************************************************************************/
static void pazz_down(void)
{
	pazz_move(0,120,4,mode_pazz_left);
}



/********************************************************************************
		----------------------
		 pazzule main program
		----------------------
 ********************************************************************************/

static void *pazz_modejmp[] = {
	
	 pazz_stop,
	 pazz_init,
	 pazz_wait,
	 pazz_left,
	 pazz_right,
	 pazz_up,
	 pazz_down
	
};

extern void s_pazzule(void)
{

	pazz_dataread();				/* data reading !! */

	s_modejmp(pazz_modejmp);

	obj_worldX = pazz_offsetX + obj_attX;
	obj_worldY = pazz_offsetY + obj_attY;
	obj_worldZ = pazz_offsetZ + obj_attZ;

}

/*################*/
#endif
/*################*/
/*===============================================================================
		end end end end end end end end 
===============================================================================*/

