/********************************************************************************
					-------------------------
					 Ultra 64 MARIO Brothers
					-------------------------

					File		: pathdoor.s
					Description	: door program 
					Date		: 1995.9.20
					Author		: H.yajima

 ********************************************************************************/
  

/********************************************************************************
					-------------------------
					 Ultra 64 MARIO Brothers
					-------------------------

					File		: pathdoor.s
					Description	: door program 
					Date		: 1995.9.20
					Author		: H.yajima

 ********************************************************************************/
  

/********************************************************************************/
/*  ANIMATION HEADER DEFINE door 												*/
/********************************************************************************/
#define ANM_door_basedata       	0
#define ANM_door_open1          	1
#define ANM_door_open2          	2
#define ANM_door_close1          	3
#define ANM_door_close2          	4
/*==============================================================================*/
/*  END END 					   												*/
/*==============================================================================*/



/********************************************************************************
		--------------
		 Door Program
		--------------
 ********************************************************************************/


/*################*/
#ifdef ASSEMBLER
/*################*/


/********************************************************************************/
/* ---------------																*/
/*	skeleton door 																*/
/* ---------------																*/
/********************************************************************************/

/*------------------------------------------------------------------------------*/
e_tripdoor:
	p_initialize(moveBG)
	p_setd(objname,OBJNAME_TRIPDOOR)
	p_jmp(path_door_common)


/*------------------------------------------------------------------------------*/
e_door:
	p_initialize(moveBG)
	p_setd(objname,OBJNAME_DOOR)
path_door_common:
	p_setbit( flag,stf_moveON | stf_YangleSAME | stf_alldispON | stf_playerdistON )
	p_set_pointer(skelanime,door_anime)
	p_set_skelanime_number(0)
	p_setshapeinfo(hitdoor_info)
	p_sethitbox(80,100)
	p_hitON
	p_setf(movebg_checkdist,1000)
	p_save_nowpos
	p_program(s_doorsystem_init)
	p_while
		p_program(s_normal_door)
	p_loop

/*------------------------------------------------------------------------------*/



/*################*/
#else
/*################*/



/********************************************************************************/
/* ---------------																*/
/*	skeleton door 																*/
/* ---------------																*/
/********************************************************************************/
/********************************************************************************/
/*		skeleton door															*/
/********************************************************************************/

#define	DOOR_NORMAL		0
#define	DOOR_OPEN1		1
#define	DOOR_OPEN2		2
#define	DOOR_CLOSE1		3
#define	DOOR_CLOSE2		4


#define		door_areatotal	(execstp->s[stw_work0].d)
#define		door_areanumber0	(execstp->s[stw_work1].d)
#define		door_areanumber1	(execstp->s[stw_work2].d)
#define		door_areanumber2	(execstp->s[stw_work3].d)
#define		door_areanumber3	(execstp->s[stw_work4].d)


/********************************************************************************/
/*		skeleton door															*/
/********************************************************************************/
static void door_openanime(int animeNo)
{
	s_set_skelanimeNo(animeNo);
	if ( s_check_animeend() )	obj_mode = DOOR_NORMAL;

}

/*------------------------------------------------------------------------------*/
/*																				*/
/*------------------------------------------------------------------------------*/
static void s_set_democamera(void)
{

	if ( execstp->pathname == (Path *)SegmentToVirtual(e_door) ){
		camPlayerInfo[0].demostatus = DEMO_NORMALDOOR;
	} else {
		camPlayerInfo[0].demostatus = DEMO_TRIPDOOR; 
	}
		camPlayerInfo[0].Stp		= execstp;

}


/*------------------------------------------------------------------------------*/
/*		normal door program														*/
/*------------------------------------------------------------------------------*/

typedef struct {
 	unsigned long door_bit;
 	unsigned long door_mode;
} DoorRecord;

DoorRecord doordata[] = {
		{ EMAIL_DOORCLOSE_1,DOOR_CLOSE1	},
		{ EMAIL_DOORCLOSE_2,DOOR_CLOSE2	}, 
		{ EMAIL_DOOROPEN_1 ,DOOR_OPEN1 	}, 
		{ EMAIL_DOOROPEN_2 ,DOOR_OPEN2 	}, 
		{ -1,0							},
};


static unsigned long dooropen_sound[] = {
	NA_SE2_OPENDOOR +NA_DOOR_WOOD,
	NA_SE2_METALOPEN
};

static unsigned long doorclose_sound[] = {
	NA_SE2_CLOSEDOOR+NA_DOOR_WOOD,
	NA_SE2_METALCLOSE
};

static void door_opensound(void)
{
	int i = s_check_shapename(S_door3);

	if (obj_timer == 0){
		objsound( dooropen_sound[i]		);
		Mbitset(strategy_mainflag,STRATMAIN_DOOROPEN);
	}

	if (obj_timer == 70){
	 	objsound( doorclose_sound[i]	);
	}
}

static void door_closesound(void)
{

	int i = s_check_shapename(S_door3);
	if (obj_timer == 30) 	objsound( doorclose_sound[i]  );
		
}

extern void s_normal_door(void)
{

	int i=0;
	while(doordata[i].door_bit != -1){
		if ( s_mail_check(doordata[i].door_bit) ){
		 	s_set_democamera();
			s_set_newmode(doordata[i].door_mode);
		}
		i++;
	}

 	switch (obj_mode){
	 	case	DOOR_NORMAL:	s_set_skelanimeNo(ANM_door_basedata);
								break;
		case	DOOR_OPEN1:		door_openanime(ANM_door_open1);
								door_opensound();
								break;
		case	DOOR_OPEN2:		door_openanime(ANM_door_open2);	
								door_opensound();
								break;
		case	DOOR_CLOSE1:	door_openanime(ANM_door_close1);
								door_closesound();
								break;
		case	DOOR_CLOSE2:	door_openanime(ANM_door_close2);
								door_closesound();
								break;
	}

	if ( obj_mode == DOOR_NORMAL ) stMainMoveBG();	

	s_doorsystem_main();

}


/*------------------------------------------------------------------------------*/

/********************************************************************************/
/*																				*/
/*		door system initialize													*/
/*																				*/
/********************************************************************************/



extern void s_doorsystem_init(void)
{
	float	nextX 	= obj_worldX;
	float	nextZ	= obj_worldZ;
	BGCheckData *bgcheck_data;

	mcBGGroundCheck(nextX,obj_worldY,nextZ,&bgcheck_data);
	if ( bgcheck_data != NULL )	door_areanumber0 = bgcheck_data->BGarea;
	nextX = obj_worldX + sin(obj_angleY)*( 200);
	nextZ = obj_worldZ + cos(obj_angleY)*( 200);
	mcBGGroundCheck(nextX,obj_worldY,nextZ,&bgcheck_data);
	if ( bgcheck_data != NULL )	door_areanumber1 = bgcheck_data->BGarea;
	nextX = obj_worldX + sin(obj_angleY)*(-200);
	nextZ = obj_worldZ + cos(obj_angleY)*(-200);
	mcBGGroundCheck(nextX,obj_worldY,nextZ,&bgcheck_data);
	if ( bgcheck_data != NULL )	door_areanumber2 = bgcheck_data->BGarea;
	if ( ( 0 < door_areanumber0 ) && ( door_areanumber0 < AREA_COUNT_MAX ) ){
		map_areaenemy[door_areanumber0][0] = door_areanumber1;
		map_areaenemy[door_areanumber0][1] = door_areanumber2;
	}

}

/********************************************************************************/
/*																				*/
/*		door system main														*/
/*																				*/
/********************************************************************************/

extern void s_doorsystem_main(void)
{

	int	flag = 0;
	if ( map_areacode != 0 ){
		if 		( map_areacode == door_areanumber0 				  		) 	flag = 1;
		else if ( map_areacode == door_areanumber1 				  		) 	flag = 1;
		else if ( map_areacode == door_areanumber2 				  		) 	flag = 1;
		else if ( map_areaenemy[map_areacode][0] == door_areanumber1 	)	flag = 1;
		else if ( map_areaenemy[map_areacode][0] == door_areanumber2 	)	flag = 1;
		else if ( map_areaenemy[map_areacode][1] == door_areanumber1 	)	flag = 1;
		else if ( map_areaenemy[map_areacode][1] == door_areanumber2 	)	flag = 1;

	} else {
		flag = 1;
	}

	if ( flag == 1 ){	MapEnable(&execstp->map);	area_door++;	}	/* shape ON  */
	if ( flag == 0 )	MapDisable(&execstp->map);						/* shape OFF */

	execstp->s[stw_imm].d = flag;	/* message */

}


/*################*/
#endif
/*################*/

/*===============================================================================
		end end end end end end end end 
===============================================================================*/




