


#include "generic.h"
#include "lfptypes.h"

#include "audio.h"
#include "crowd.h"

#include "ctrl.h"



#define  MEM_DEBUG 0

#include "define.h"
#include "ml.h"
#include "playgfx.h"



playert *postup_marked(playert *plyr)
{
playert *plyr2;

	CallChainP(postup_marked);

	for (plyr2 = player+(plyr->base^5); plyr2<player+((plyr->base^5)+5); plyr2++)
	{
		if (covered2(plyr, plyr2))
		{
			if (MANHATTAN(plyr2->xco-plyr->xco, plyr2->yco-plyr->yco) < 0x100000)
			{
				return plyr2;
			}
		}
	}
	return NULL;
}



bool postup_test(playert *plyr)
{
SW a_diff;
int a_diff32;

	if (plyr->basket_dist > 0x400000)			return FALSE;

	a_diff = plyr->angle - plyr->basket_angle;
	if (abs(a_diff) < 0x5000)					return FALSE;

	if (!(current_ctrlr->ctrlr&CTRL_SHUFFLE))	return FALSE;

	if (blocked_basket_test(plyr) == 0xe)		return FALSE;

	if (current_ctrlr->force==0)
	{
		SetMain(postup_test,plyr,baby_hook1);
		plyr->leg_routine  = NULL;
		plyr->top_routine  = NULL;
		
		a_diff = (plyr->no>4) ?	0x4000: -0x4000;
		a_diff = a_diff-plyr->basket_angle;

		plyr->angle2 = (a_diff<0) ? 0x4000:-0x4000;

		start_blend_anim(plyr, (a_diff<0) ? TOP_BHOOK1: -TOP_BHOOK1);
		scored_flag=0;

		return TRUE;
	}
	else
	{
		//turn to baseline
		a_diff = -0x4000-plyr->basket_angle;

		if (abs(plyr->yco) > BASKET_Y)
		{
			a_diff = -a_diff;
		}
		
		if ((a_diff < 0) ^ (plyr->yco < 0))
		{
			start_blend_anim2(plyr, TOP_UPUNDER1, 16*TIME_FACTOR);

			a_diff32 =
			a_diff   = plyr->basket_angle - plyr->angle;

			//make sure turn clockwise
			if (a_diff > 0)		a_diff32 -= 0x10000;
			plyr->angle_vel = a_diff32/16;
		}
		else
		{
			start_blend_anim2(plyr, -TOP_UPUNDER1, 16*TIME_FACTOR);

			a_diff32 =
			a_diff   = plyr->basket_angle - plyr->angle;
			//make sure turn aclockwise
			if (a_diff < 0)		a_diff32 += 0x10000;
			plyr->angle_vel = a_diff32/16;
		}

		START_VELS(plyr, 19.5, 14.7);
		printf("%x, %x\n", plyr->xvel, plyr->yvel);

		SetMain(postup_test,plyr,up_under1);
		plyr->leg_routine  = NULL;
		plyr->top_routine  = NULL;

		up_under1(plyr);

		return TRUE;
	}

	return FALSE;
}


void up_under1(playert *plyr)
{
int time;
SW  a_diff;

	CallChainP(up_under1);

	time = ((frames_to_go(plyr)-1)<<8)/plyr->top_rate;

	run_collision(plyr, plyr->xvel, plyr->yvel);

	if (time>0)
	{
		plyr->angle += plyr->angle_vel;
	}
	else
	{
		int tr;

		if (plyr->control)
		{
			if (!(current_ctrlr->ctrlr & CTRL_SHOOT))	// Pump fake?
			{

//				start_blend_anim(plyr, TOP_OVER_BALL);
//				SetMain(up_under1,plyr,stand_with_ball2);
//				plyr->leg_routine  = leg_deflt;
				standing_j(plyr);
				return;
			}
		}
		else
		{
			if ((postup_move & 0xf) == UP_FADE)
			{
				current_ctrlr->d_angle = plyr->basket_angle+0x8000;
				current_ctrlr->force   = 0xf0;
				standing_j(plyr);
				return;
			}
		}


		SetMain(up_under1,plyr,up_under2);

		tr = plyr->top_rate;
		start_next_anim(plyr);
		plyr->top_rate = tr;

		a_diff = (plyr->top_anim>0) ? -0x2400:0x2400;
		plyr->angle2 = plyr->angle+a_diff;

		START_VELS(plyr, 22.8, 32.9);
	}
}



void up_under2(playert *plyr)
{
int time;
SW  a_diff;

	CallChainP(up_under2);

	run_collision(plyr, plyr->xvel, plyr->yvel);

	time = ((frames_to_go(plyr)-1)<<8)/plyr->top_rate;

	if (time>0)
	{
		a_diff		=  plyr->angle2 - plyr->angle;
		plyr->angle += a_diff/time;
	}
	else
	{
		plyr->top_rate = 0x100;
		shoot(plyr,TOP_HOOK1);
	}
}



void baby_hook1(playert *plyr)
{
bool fake_flag;

	CallChainP(baby_hook1);

	SetShootStage(baby_hook1,1);

	pivot_turn_to(plyr, (SW)(plyr->basket_angle - plyr->angle2));

	if (!possession_flag)	BRK;

	if (end_animation_test(plyr))
	{
		fake_flag = FALSE;

		if (plyr->control == 0)
		{
								/* computer fakes here */
			if (shot_clock < 2*ONE_SEC)	/* don't fake in last two seconds of shot clock */
			{
//				marker = &player[plyr->marker];
//				{
//				}
			}
		}
		else
		{
			fake_flag = FALSE;			//((current_ctrlr->ctrlr & CTRL_SHOOT) == 0);
		}

		if (fake_flag)
		{
			SetMain(baby_hook1,plyr,stand_with_ball2);
			plyr->top_routine  = NULL;
			plyr->leg_routine  = leg_deflt;
			start_blend_anim(plyr, TOP_OVER_BALL);
			SetShootStage(baby_hook1,0);
		}
		else
		{
			// start jump 

			if (!project_flag)
			{
				if (!possession_flag)	BRK;
				SetMain(baby_hook1,&ball,follow_player);
			}

			plyr->xvel >>= 2;
			plyr->yvel >>= 2;

			SetMain(baby_hook1,plyr,baby_hook2);

			pt3_flag = FALSE;


			plyr->zvel	= BHK_ZVEL;
			plyr->col_flags	= -1;
			plyr->flags		&=~(FALLING);

			start_next_anim2(plyr,BHK_ZVEL/LITTLE_G);

			SetShootStage(baby_hook1,2);

			if (!project_flag)
			{
				project_dunk_ball(plyr, (J_ZVEL/LITTLE_G), FALSE);
				if ((!possession_flag) || (!in_play_flag))	BRK;
				ball.target_x = plyr->xco;		//ball_cos[((J_ZVEL/LITTLE_G)*3)];
				ball.target_y = plyr->yco;		//ball_cos[((J_ZVEL/LITTLE_G)*3)+1];
			}
		}
	}
}



void baby_hook2(playert *plyr)
{
int zco;

	CallChainP(baby_hook2);

	/* record result of this for % and/or foul */
	plyr->col_flags &= collision (plyr, plyr->xvel, plyr->yvel, 0);

	plyr->zco  += plyr->zvel;
    plyr->zvel -= LITTLE_G;
	if (plyr->zco < 0)
	{
		plyr->zco = 0;
	}

	if (end_animation_test(plyr))
	{
		int pc;

		SetShootStage(baby_hook2,0);
		start_next_anim2(plyr, time_till_land(plyr));
		SetMain(baby_hook2,plyr,baby_hook3);

		pc = MIN_MAX2(bhp->basket_dist, 0, 0x400000, 0x100, 0);
		if (pc < 25)	pc = 25;	


		if (possession_flag)
			shoot_ball(plyr, pc, (UB *)made_list);
	}
}



void baby_hook3(playert *plyr)
{
	CallChainP(baby_hook3);

	plyr->zco  += plyr->zvel;
    plyr->zvel -= LITTLE_G;
	if (plyr->zco <= 0)
	{
		plyr->zco = 0;
		start_next_anim(plyr);
		SetMain(baby_hook3,plyr,jump_shot_rou4);
	}
}



void standing_j(playert *plyr)
{
	CallChainP(standing_j);

	jmask(CTRL_SHOOT);

	//start jump shot right away
	plyr->zvel	= J_ZVEL;
	plyr->col_flags	= -1;
	plyr->flags		&=~(FALLING);

	pt3_flag	= pt3_detect(plyr);

	pass_it_flag=FALSE;
	SetMain(standing_j,plyr,jump_shot_rou);
	plyr->top_routine  = NULL;
	plyr->leg_routine  = NULL;

	//save for shot % calculations
	shot_angle = plyr->angle;
	shot_speed = plyr->last_speed;

	//assume no fadeaway
	plyr->xvel = 0;
	plyr->yvel = 0;
	start_blend_anim(plyr, TOP_JSHOT2);
	plyr->flags|=SHOOT_PIVOT;
	plyr->target_angle=0;

	if (!project_flag)
	{
		project_dunk_ball(plyr, (J_ZVEL/LITTLE_G)+1, FALSE);
		if ((!possession_flag) || (!in_play_flag))	BRK;
		ball.target_x = ball_cos[((J_ZVEL/LITTLE_G)*3)];
		ball.target_y = ball_cos[((J_ZVEL/LITTLE_G)*3)+1];
	}

	fadeaway_test(plyr);
}











