


#include "generic.h"
#include "lfptypes.h"
#include "define.h"
#include "ml.h"

#include "playgfx.h"


extern s8 ShowTrails;




void start_fall(playert *plyr, SW angle)
{
SW a_diff;
	
	if (plyr->flags & FALLING)	return;
	plyr->flags |= FALLING;

	if (picked_up_flag && plyr->no==picker_up)
	{
		SetPickedUpFlag(start_fall,FALSE);
	}

	if (BALL_HANDLER)
	{
		SetMain(start_fall,&ball,loose_ball_move);
		ball.xvel         = plyr->xvel>>1;
		ball.yvel         = plyr->yvel>>1;
		ball.zvel         = plyr->zvel>>1;

		hang_flag       = FALSE;
		SetPickedUpFlag(start_fall,FALSE);
		SetDunkFlag(start_fall,FALSE);
		SetShootStage(start_fall,0);
		SetPossession(start_fall,FALSE);
		time_rate=0x100;

		ShowTrails=FALSE;  // Turn off ole smokey
	}


	do_grunt();

	plyr->flags |= HIT;
	SetMain(start_fall,plyr,fall_routine);
	plyr->top_routine  = NULL;
	plyr->leg_routine  = NULL;

	if (1)
	{
		plyr->angle2 = angle;
		
		a_diff = angle-plyr->angle+0x4000;

		if ((a_diff & 0x8000) == 0)
		{
			start_blend_anim(plyr, TOP_FALLB1);
			start_vels2(plyr, -65, angle);		
		}
		else
		{
			angle += 0x8000;
			plyr->angle2 = angle;
			start_blend_anim(plyr, TOP_FALLF);
			start_vels2(plyr, 51, angle);		
		}

		plyr->zvel = 0;
		
		//plyr->zvel = LITTLE_G * HALF_SEC/2;
	}
	else
	{
		int xvel, yvel;

		if (plyr->zvel < 0)		plyr->zvel = 0;
		start_blend_anim2(plyr, TOP_FALLB1, time_till_land(plyr));

		//set new angle to be halfway between old and blocking player angle

		plyr->xvel =
		xvel       = (plyr->xvel/2) + (LFPCos(angle) * 10);
		plyr->yvel =
		yvel       = (plyr->yvel/2) + (LFPSin(angle) * 10);

		plyr->angle2 = LFPAtn(xvel, yvel) + 0x8000;

//if (plyr->zvel > (LITTLE_G * HALF_SEC))	plyr->zvel = (LITTLE_G * HALF_SEC);
	}
}



void fall_routine(playert *plyr)
{
int zco,zvel;

	CallChainP(fall_routine);

	turn_to(plyr, (SW)plyr->angle2);

	if (plyr->flags&MOVE_ROOT)
		move_by_anim(plyr);
	else
	{
		plyr->xco += plyr->xvel;
		plyr->yco += plyr->yvel;
	}

	zvel =  plyr->zvel;
	zco	 =  plyr->zco;
	zco	 += zvel;
    zvel -= LITTLE_G;

	if (zco < 0)
	{
		zco = zvel = 0;
	}
	plyr->zco = zco;
	plyr->zvel= zvel;

	if (end_animation_test(plyr))
	{
		if (plyr->top_anim == TOP_FALLB1)
		{
			start_next_anim2(plyr, ONE_SEC*3/4+random(HALF_SEC/4));
			SetMain(fall_routine,plyr,fall_slide);
		}
		else
		{
			SetMain(fall_routine,plyr,sat_down);
			plyr->ctr2    = HALF_SEC/2+random(HALF_SEC/2);
		}
	}
}




void fall_slide(playert *plyr)
{
int	angle;
int	vel;

	CallChainP(fall_slide);

	angle	   = plyr->angle;

	vel	       = plyr->xvel;
	plyr->xco  += vel;
    vel        += ( LFPCos(angle) / 4 );
	if ((vel^plyr->xvel) <0)	vel = 0;
	plyr->xvel = vel;

	vel		   = plyr->yvel;
	plyr->yco  += vel;
    vel        += ( LFPSin(angle) / 4 );
	if ((vel^plyr->yvel) <0)	vel = 0;
	plyr->yvel = vel;

//	limit_check2(plyr);

	if (end_animation_test(plyr))
	{
		SetMain(fall_slide,plyr,sat_down);
		plyr->ctr2    = HALF_SEC/2;
	}
}



void sat_down(playert *plyr)
{
	CallChainP(sat_down);

	if ( (plyr->ctr2-=1) == 0)
	{
		if (plyr->flags&MOVE_ROOT)
		{
			plyr->flags&=~MOVE_ROOT;
			face_by_anim(plyr);
		}

		SetMain(sat_down,plyr,get_up);
		if (plyr->top_anim == TOP_FALLF)
		{
			plyr->angle ^= 0x8000;
		}
		start_anim(plyr, TOP_GETUP);
		start_vels2(plyr, 15, (SW)plyr->angle);
	}
}


void get_up(playert *plyr)
{
	CallChainP(get_up);

 	plyr->xco += plyr->xvel;
 	plyr->yco += plyr->yvel;
	
	if (end_animation_test(plyr))
	{
		plyr->flags  &= ~(FALLING+HIT+MOVE_ROOT);

//		if ((plyr->no == 9) || (plyr->no == 4))
		{
			SetMain(get_up,plyr,deflt);
			plyr->leg_routine = leg_deflt;
			plyr->top_routine = top_deflt;
		}

		start_blend_anim(plyr, TOP_RDY);
		start_blend_leg_anim(plyr, LEG_RDY);
	}
}




