/********************************************************************************
					-------------------------
				 	 Ultra 64 MARIO Brothers
					-------------------------

					File		: pathwallman.s
					Description	: 
					Date		: 1995.11.14
					Author		: H.yajima

 ********************************************************************************/

#define	WALLMAN_STAR_X		  180
#define	WALLMAN_STAR_Y		 3880
#define	WALLMAN_STAR_Z		  340

/***************************************************************/
/*  ANIMATION HEADER DEFINE wall */
/***************************************************************/

#define ANM_wall_walk           	0
#define ANM_wall_falldown       	1

/*################*/
#ifdef ASSEMBLER
/*################*/

/*------------------------------------------------------------------*/
/*	wallman main pathdata											*/
/*------------------------------------------------------------------*/

e_wallman_boss:
	p_initialize(moveBG)
	p_setd(programselect,1)
	p_setd(hp,3)
	p_jmp(wallman_common)

e_wallman:
	p_initialize(moveBG)
	p_setd(havecoin,5)
wallman_common:
	p_setbit(flag,stf_moveON | stf_YangleSAME | stf_playerdistON | stf_playerangleON )
	p_set_pointer(skelanime,wallman_anime)	
	p_setshapeinfo(wallman_info)
	p_set_skelanime_number(0)				
	p_setmovedata(0,-400,-50,0,0,200,0,0)
	p_save_nowpos
	p_while
		p_program(s_wallman)
	p_loop


/*################*/
#else
/*################*/


#define		wallman_timer	(execstp->s[stw_work1].d)

/********************************************************************************
		wallman library
 ********************************************************************************/
static void wallman_sound(void)
{

	int	anime_frame = execstp->map.skelanim.frame;
	int flag		= 0;

	if ( obj_speedF < 5 ){
		flag  = s_check_animenumber(0); 
		flag |= s_check_animenumber(23);
	} else {
		flag  = s_check_animenumber_speed(0,3);
		flag |= s_check_animenumber_speed(23,3);
	}

	if (flag) objsound(NA_SE3_NURIWALK);

}

/********************************************************************************
		wallman init program
 ********************************************************************************/
static void wallman_init(void)
{

	
	s_set_skelanime_speed(ANM_wall_walk,1.0);
	s_copy_initpos();

	if ( obj_programselect ){
		camBOSSstp = execstp;
		s_set_scale(2.0);
		if ( obj_process == 0 ){
			if ( obj_playerdist < 600 ){
				obj_process++;
				Na_MusicMuteOn();
			} else {
			 	s_copy_initpos();
				obj_hp = 3;
			}
		} else {
			if ( s_call_talkdemo(DLOG_LOOKUP,ENEMYDEMO_LOOKPLAYER,CAM_DEMO_TALK,114) ){
				obj_mode = mode_wallman_search;
				// Na_MusicStart(NA_MUS_HANDLE,NA_BOSS_BGM,0);
			}
		}
	} else {
		if ( obj_playerdist < 500 )	obj_mode = mode_wallman_walk;
	}

	wallman_sound();

}

/********************************************************************************
		wall start
 ********************************************************************************/

static void wallman_walkstart(void)
{

	if ( obj_process == 0 ){
		obj_speedF = 0;
		s_set_skelanime_speed(ANM_wall_walk,1.0);
		if ( obj_timer >= 0x20 ) obj_process++;
		else				   	 obj_angleY += 0x400;
	} else {
		obj_speedF = 3;
		if ( obj_timer > 10+0x20 )	obj_mode = mode_wallman_walk;
	}

	wallman_sound();

}


/********************************************************************************
		wallman walk program
 ********************************************************************************/
static void wallman_walk(void)
{

	short	ang = s_calc_dangle(obj_targetangle,obj_angleY);
	float 	scope = s_calc_enemyscope();
	float	scopelimit;


	if ( activeStageNo == 21 )	scopelimit  = 200;
	else						scopelimit = 700;


	s_set_skelanime_speed(ANM_wall_walk,1.0);
	obj_speedF = 3;

	if (  scope > scopelimit  )  obj_mode = mode_wallman_walkstart;
	else {
		if ( ang < 0x2000 ){
			if ( obj_playerdist < 1500 ){ obj_speedF = 9; s_set_skelanime_speed(ANM_wall_walk,3.0);	}
			if ( obj_playerdist < 300  )  obj_mode = mode_wallman_attack;
		} 
	}

	wallman_sound();


}

/********************************************************************************
		wallman search program
 ********************************************************************************/

static void wallman_search(void)
{

	short ang;
	s_set_skelanime_speed(ANM_wall_walk,1.0);
	obj_speedF = 3;

	s_chase_angleY(obj_targetangle,0x200);

	if ( obj_timer > 30 ){
		if ( ( ang = s_calc_dangle(obj_targetangle,obj_angleY)) < 0x2000 ){
			if ( obj_playerdist < 1500 ){ obj_speedF = 9; s_set_skelanime_speed(ANM_wall_walk,3.0);		}
			if ( obj_playerdist < 300  ){				   obj_mode = mode_wallman_attack;				}
		}
	} 

	wallman_sound();

	if ( s_player_bossarea_out(1000) ){
		obj_mode = mode_wallman_init;
		Na_EntryMusicFree(NA_BOSS_BGM);
	}

}




/********************************************************************************
		wallman attack program
 ********************************************************************************/
static void wallman_attack(void)
{

	obj_speedF = 0;
	s_set_skelanime_speed(ANM_wall_falldown,1.0);
	if ( s_check_animeend() )	obj_mode = mode_wallman_down;
}

/********************************************************************************
		wallman down program
 ********************************************************************************/
static void wallman_down(void)
{

	if ( obj_timer == 0 )	obj_speedY =  40;

	if ( obj_timer < 8  ){
//		if ( obj_timer % 2 )	obj_animeangleX = 0x200;
//		else					obj_animeangleX = 0;
	} else  {
		obj_anglespeedX += 0x100;
		obj_animeangleX += obj_anglespeedX;
		if ( obj_animeangleX > 0x4000 ){
			obj_anglespeedX = 0;
			obj_animeangleX = 0x4000;
			obj_mode = mode_wallman_down_end;
		}
	}

}

/********************************************************************************
		wallman down program
 ********************************************************************************/
static void wallman_down_end(void)
{

	if ( ( obj_process == 0 ) && ( obj_movestatus & MOVESTAT_BGBOUND ) ){
		objsound(NA_SE3_NURIPRESS);
		s_call_Viewshake(VS_SMALL);
		obj_speedY = 0;
		obj_process++;
	}

	if ( obj_movestatus & MOVESTAT_BGTOUCH ) obj_mode = mode_wallman_sleep;

}

/********************************************************************************
		wallman wakeup program
 ********************************************************************************/

/********************************************************************************/
static int	wallman_boss_sleep(void)
{

	float	backpos[3];
	if ( obj_process == 0 ){
		if ( s_checkplayer_hipaatack()  ){
			obj_hp--;
			objsound(NA_SE3_BATTANKING_DAMAGE);
			objsound(NA_SE3_BOMBKING_DOWN);
			if ( obj_hp == 0 ){
				 obj_mode = mode_wallman_burn;
			} else {

				s_copy_f(backpos,&obj_worldX);
				s_copy_f(&obj_worldX,&player_worldX);
				s_burneffect(0,0,100);
				s_boxeffect(20,S_sankaku,3,4);
				s_call_Viewshake(VS_SMALL);
				s_copy_f(&obj_worldX,backpos);

			}
			obj_process++;
		}
		wallman_timer = 0;
	} else {
		if ( wallman_timer < 10 ){
			if ( wallman_timer % 2 )	obj_worldY += 8;
			else						obj_worldY -= 8;	
		} else {
			obj_process = 10;
		}
		wallman_timer++;
	}


}

/********************************************************************************/
static int	wallman_mini_sleep(void)
{

	if ( obj_process == 0 ){
		if ( (player1stp->ride_strat) == execstp ){
			if ( s_checkplayer_hipaatack() ){
				obj_havecoin = 5;
				s_makecoin(execstp,5,20);
				obj_mode = mode_wallman_burn;
			} else {
				s_makecoin_playerpos();
				obj_process++;
			}
		} 
	} else {
		if ( s_rideon_player() == 0 )	obj_process = 0;
	}


}

/********************************************************************************/
static void wallman_sleep(void)
{


	if ( obj_process != 10 ){
		obj_speedF = 0;
		obj_anglespeedX = 0;
		obj_anglespeedY = 0;
		obj_anglespeedZ = 0;
		
		if ( obj_programselect )	wallman_boss_sleep();
		else						wallman_mini_sleep();

		if ( obj_timer > 100 || ( ( marioWorks->status == PS_VCOMPRESS ) && ( obj_timer > 30 ) ) ){
		 	obj_process = 10; /* wakeup process */
		}

	} else {

		if ( obj_animeangleX > 0){
		  	obj_anglespeedX = -0x200;
			obj_animeangleX += obj_anglespeedX;
		} else {
			obj_anglespeedX = 0;
			obj_animeangleX = 0;
			if ( obj_programselect ) 	obj_mode = mode_wallman_search;
			else						obj_mode = mode_wallman_walk;
		}

	}

}


/********************************************************************************
		wallman wakeup program
 ********************************************************************************/
static void wallman_burn(void)
{

	if ( obj_programselect ){

		if ( s_call_talkdemo(DLOG_LOOKUP,ENEMYDEMO_SETMESSAGE,CAM_DEMO_TALK,115)) {
			s_set_angle(execstp,0,0,0);
			s_shape_hide();				/* shape hide	*/
			s_hitOFF();   				/* hitcheck OFF */
			s_burneffect(0,0,200);
			s_boxeffect(20,S_sankaku,3,4);
			s_call_Viewshake(VS_SMALL);
			obj_worldY += 100;
		/*	Na_BossBgmStop();	*/
			s_enemyset_star(WALLMAN_STAR_X,WALLMAN_STAR_Y,WALLMAN_STAR_Z);
			objsound(NA_SE3_BOMBKING_DOWN);
			obj_mode = mode_wallman_dead_stop;
		}

	} else {

		s_burneffect(0,0,100);
		s_boxeffect(20,S_sankaku,3,4);
		s_call_Viewshake(VS_SMALL);
		obj_remove_sound(NA_SE3_STONE);
		s_remove_obj(execstp);

	}

}

static void wallman_dead_stop(void)
{

	if ( obj_timer == 60 ) Na_EntryMusicFree(NA_BOSS_BGM);

}

/********************************************************************************
		wallman program
 ********************************************************************************/

static void *wallman_modejmp[] = {
   	
	 wallman_init,
	 wallman_walk,
	 wallman_search,
	 wallman_attack,
	 wallman_down,
	 wallman_down_end,
	 wallman_sleep,
	 wallman_walkstart,
	 wallman_burn,
	 wallman_dead_stop
   	
};

extern void s_wallman(void)
{

	s_enemybgcheck();
	s_modejmp(wallman_modejmp);
	s_enemymove(-20);


	if ( obj_mode != mode_wallman_dead_stop ){
		if ( obj_programselect ) s_erase_height(2000);
		else					 s_erase_height(1000);
		stMainMoveBG();
	}

}



/*################*/
#endif
/*################*/
/*===============================================================================
		end end end end end end end end 
===============================================================================*/



