
#include "generic.h"
#include "lfptypes.h"

#include "define.h"
#include "ml.h"

#include "audio.h"

 #include "ctrl.h"

#ifdef PC
 #include "fontcode.h"
 #include "dbugtxt.h"
#endif


/* this is for the player jogging backwards */

bool backward_test(playert *plyr)
{
	if (plyr->control)
	{
		if (current_ctrlr->force > 0xd0)
		{
			if (current_ctrlr->ctrlr & CTRL_SHUFFLE)
			{
				if ((plyr->no != ball_handler) || (!possession_flag))
				{
					if ((plyr->shuffle_angle>5) && (plyr->shuffle_angle<11))
					{
						return TRUE;
					}
				}
			}
		}
	}
	else
	{
		if (current_ctrlr->ctrlr & CTRL_BACK)
		{
			return TRUE;
		}
	}
	return FALSE;
}




void backward_init(playert * plyr)
{
	plyr->leg_routine = backward;
	plyr->angle = current_ctrlr->d_angle+0x8000;
	start_blend_leg_anim(plyr, LEG_BACK);
	backward(plyr);
}


void backward(playert * plyr)
{
	SW diff;
	SL speed,xv,yv;

	/* the player wants to go into shuffle mode? */

// if Im pressing the controller too hard/soft
	if (current_ctrlr->force <= 0xd0)
	{
		goto exit_back;
	}

	if (!backward_test(plyr))
	{
		if (plyr->control)
		{
			if (!(current_ctrlr->ctrlr & CTRL_SHUFFLE))
			{
				if (current_ctrlr->force > 0xc0)
				{
					SW a_diff;

					plyr->angle2 = current_ctrlr->d_angle;
					a_diff = plyr->angle2-plyr->angle;
					start_blend_anim2(plyr, (a_diff>0) ? TOP_BACKTURN: -TOP_BACKTURN, 5);
					plyr->last_speed  = JOG_THRESHOLD;
					SetMain(backwards,plyr,back_turn);
					back_turn(plyr);
					return;
				}
			}

		}
		goto exit_back;
	}


/* if the player's direction is more or less backwards from the current (backwards) direction
 then allow turn, otherwise flip to a run */

	diff = current_ctrlr->d_angle - plyr->angle - 0x8000;

// OR im turning it too much
// OR (im the ball handler AND i actually have the ball)
	if ((abs(diff) > 0x2000)
		|| ((plyr->no == ball_handler) && (possession_flag)))
	{
exit_back:
		plyr->leg_routine = leg_deflt;
		start_blend_leg_anim(plyr, LEG_RDY);
		return;
	}

	if		(diff > 0x400)		diff = 0x400;
	else if (diff < -0x400)		diff = -0x400;
	plyr->angle += diff;

	if (end_leg_animation_test(plyr))
		start_leg_anim(plyr, LEG_BACK);

	speed = plyr->last_speed;

	speed += 0x200;
	if (speed > current_ctrlr->force*16)	speed = current_ctrlr->force*16;
	plyr->last_speed = speed;

	speed          *= plyr->speed;
	plyr->leg_rate = (speed * 0x100)/((SI)(40.2*4)*plyr->scale);

	if (speed)
	{
		plyr->xvel =
		xv         = -(LFPCos(plyr->angle) * (speed>>6)) >> 8;      /* x */
		plyr->yvel =
		yv         = -(LFPSin(plyr->angle) * (speed>>6)) >> 8;      /* y */

		plyr->col_flags = run_collision(plyr, xv, yv);

		if (plyr->col_flags != -1)
		{
			plyr->flags |= COLLIDE;
			collision_react(plyr, plyr->col_flags);
		}
	}
}



void back_turn(playert *plyr)
{
SW  a_diff;
int time;

	run_collision(plyr, plyr->xvel, plyr->yvel);

	a_diff = plyr->angle2-plyr->angle;
	time   = ((frames_to_go(plyr)-1) << 8)/0x100;

	if (time>0)
	{
		plyr->angle += a_diff/time;
	}
	else
	{
		start_anim(plyr, TOP_JOG);
		start_leg_anim(plyr, LEG_JOG);

		plyr->top_frame = 
		plyr->leg_frame = (plyr->last_top_anim>0) ? (7<<8): (27<<8);

		SetMain(back_turn,plyr,deflt);
		plyr->top_routine  = top_deflt;
		plyr->leg_routine  = running;

		plyr->last_speed  = (WALK_THRESHOLD+JOG_THRESHOLD)/2;
	}
}



