#ifndef ML_H_INCLUDED
#define ML_H_INCLUDED


#include "animres/animenum.h"

extern int	PracticeMode;

extern int	PadFlash[4];
extern int	DC_Play;

#define		BlastMessage(m)	_BlastMessage(m,__FILE__,__LINE__)
extern void	_BlastMessage(const char *,const char *,const s32);

extern int	inTimeOut;

/* initgame */
extern void InitBones(playert *plyr);
extern void init_players(int *);
extern bool defense_flag;
extern bool switch_ends_flag;
extern PlyrRomData_T PlyrRomArray[];
extern bool sw_end[10];
extern int away_inbound[];
extern int home_inbound[];
extern int home_halfcourt[];
extern int away_halfcourt[];

extern SB pressures[10];
extern SB doubles[10];
extern SB fronts[10];
extern SB markee[10];

extern SB set1[2];
extern SB set2[2];
extern SB press[2];
extern SB auto_sub[2];

extern int quarter_length;
extern int max_mins;

/* lfpmaths */
extern  SW LFPAsin(int);
extern  SW LFPAcos(int);
extern  SW LFPAtn (int, int );
extern	int pythag (int, int);
extern	int manhattan(int, int);
extern	SW  sin_tbl[];
extern  UI  ReadRnd250(void);
extern  void InitRnd250 (void);
extern  SI  LFPSqrt(UI sqr);
//extern  void MakeMatrixPRHBig2(int *m,int p,int r,int h);
//extern  void VecMulMat2(int *v, int *m, int *v2);
//extern  void MatInvert2(int *m);
extern  void Vec16MulMat(vector16 *, matrix *, vector16 *);
//extern  void MatInvert(matrix *l);


extern void IntToHexStr(int a,char *s);
extern void IntToDecStr(int a,char *s);

extern int ErrorCheckTeamStadium(int team);

/* pass */
extern void down_first_pass(playert *plyr);
extern void start_pass(playert *plyr);
extern void start_post_pass(playert *plyr);

extern void return_pass(playert *plyr);

void get_post_recvr(void);
extern void get_recvr();
extern void release_chest_pass(playert *plyr);
extern void chest_pass(playert *plyr);
extern void end_chest_pass(playert *plyr);
extern void end_turn_chest_pass(playert *plyr);
extern void overhead_pass(playert *plyr);
extern bool	start_jump_pass(playert *plyr);
extern void cut_to_basket(playert *plyr);
extern void	cut_to_basket2(playert *plyr);

extern void base_pass(playert *plyr);
extern void base_pass2(playert *plyr);
extern void turn_chest_pass(playert *plyr);
extern void turn_bounce_pass(playert *plyr);
extern void bounce_pass(playert *plyr);
extern void release_bounce_pass(playert *plyr);

extern void alley_pass(playert *plyr);
extern void alley_pass0(playert *plyr);

extern void hp_catch_wait(playert *plyr);
extern void project(playert *plyr, int time, bool pass_flag);

extern void playback_pass_vals(playert *plyr);

extern void jump_pass(playert *plyr);
extern void jump_pass2(playert *plyr);
extern void jump_pass3(playert *plyr);

extern void receive_pass(playert *plyr);
extern void hands_up(playert *plyr, int t_left);
extern void release_pass(playert *plyr, int top_speed, bool bounce_flag);
extern void release_tipoff(playert *plyr, int top_speed, bool asdf);

extern void get_pass_ball_vels(playert *recvr, int time, bool bounce_flag);


extern bool alley_flag;
extern bool	stealable_flag;
extern int  pass_flag;
extern SB   icon_flag;
extern SB   release_flag;
extern bool project_flag;
extern int	pass_mask[5];

//passing icons
#define ICON_OFF	  0
#define ICON_RECEIVER 1
#define ICON_ALL	  2

//controls
extern void change_controls(playert *old_plyr, playert *new_plyr);
extern void get_new_controls(teamt *tm, playert *plyr);
extern void	init_controls(void);
extern void init_controls2();
extern void	get_dpad(SI *v);
extern void	switch_plyr(playert *plyr, teamt *tm, int scoring(playert *));
extern void rebound_switch_plyr(teamt *tm);

extern int  ball_score(playert *plyr);
extern int  basket_score(playert *plyr);
extern int  joy_score(playert *plyr);

extern void auto_switch_plyr(playert *plyr, teamt *cur_team, int scoring(playert *));

extern int  test_and_mask(ctrlrT *ctrlr_ptr, int mask);
extern void mask_shoot(void);



extern SI controls[];
extern UD controller0;
extern UD m_controller;

extern bool switch_flag;

extern bool string_flag;
extern int qflag;


/* ball */
extern void shot_ball_move(playert *bl);
extern void project_ball(int time);
extern void loose_ball_move(playert *bl);
extern void ball_ik_blend(playert *bl);
extern void ball_rolling(playert *bl);
extern int	catch_ball(playert *plyr);
extern void follow_player(playert *bl);
extern void ball_place(playert *plyr);
extern void missed_pass_move(playert *bl);
extern void	pass_ball_move(playert *bl);
extern void	project_dunk_ball(playert *plyr, int time, bool flag);
extern int	project_shot_ball(playert *plyr);

extern void stolen_ball(playert *bl);

extern void get_future_ball_cos(int time, int *x, int *y, int *z);

extern void drop_ball(playert *plyr);

extern char	bounce_flag;
extern int bounce_ball (playert *bl, int zvel);
extern int last_bx;
extern int last_by;
extern int last_bz;

extern int ball_rotx;
extern int ball_roty;
extern int ball_rotz;

extern int ball_spinx;
extern int ball_spiny;
extern int ball_spinz;

extern int netanimno[2];
extern int netanimrate[2];
extern int netframe[2];
extern int nethdg[2];

extern int end_proj_time;
extern int proj_time;
#define	BALL_COS_LEN	160
extern int ball_cos[BALL_COS_LEN*3];
extern int rebound_time;
extern int last_bounce;

extern int	ball_glass_time;

extern int	loose_flag;
extern int  possession_flag;

extern int glassScroll;

extern int crossX, crossY;
extern int scored_flag;
extern int jingle_time;
extern int defense_time;
extern int defense_on;


/*replay */
extern void save_replay(void);
extern void advance_frame(void);
extern void process_replay(void);
extern void start_replay(int pad);
extern void end_replay(int pad);

extern int  replay_pad;
extern bool replay_flag;
extern SW   replay_player;
extern SW   last_saved_frame;

extern int  get_replay_frame(void);

extern void free_replay_buf(void);
extern void init_replay_buf(void);


/* nba */
#define		CallChainP(r)	CallChain(r,plyr)

#if defined(DEBUG)
	extern	void	_SetBallHandler(char *r, char *file, int line, int p);
	extern	void	_SetLastHandler(char *r, char *file, int line,int p);
	extern	void	_SetPossession(char *r, char * file,int l, int p);
	extern	void	_CallChain(char *r, char *file, int l, playert *p);
	extern	void	_CallChainInit();
	extern	void	_LogPointStats(char *r, char *m, char *file, int l, playert *p);
	extern	void	_SetMain(char *c, char *f, int l, playert *p, void (*rou)(playert *),char *r);
	extern	void	_SetIkBlendSpeed(char *r, char *f, int l, playert *plyr, int speed);
	extern	void	_SetHalfFlag(char *r, char *f, int l, bool state);
	extern	void	_SetDunkFlag(char *r, char *f, int l, bool state);
	extern	void	_SetPickedUpFlag(char *r, char *f, int l, bool state);
	extern	void	_SetDribbleFlag(char *r, char *f, int l, int state);
	extern	void	_SetShootStage(char *r, char *f, int l, int state);
	extern	void	_db_out(char *r, char *f, int l, char *msg);

	#define	SetBallHandler(r,p)		_SetBallHandler(#r,__FILE__,__LINE__,(p))
	#define	SetLastHandler(r,p)		_SetLastHandler(#r,__FILE__,__LINE__,p)
	#define	SetPossession(r,p)		_SetPossession(#r,__FILE__,__LINE__,p)
	#define	CallChainInit()			_CallChainInit()
	#define LogPointStats(r,m,p)	_LogPointStats(#r,m,__FILE__,__LINE__,p)
	#define	SetMain(c,p,r)			_SetMain(#c,__FILE__,__LINE__,p,r,#r)
	#define	SetIkBlendSpeed(r,p,s)	_SetIkBlendSpeed(#r,__FILE__,__LINE__,p,s)
	#define	SetHalfFlag(r,s)		_SetHalfFlag(#r,__FILE__,__LINE__,s)
	#define	SetDunkFlag(r,s)		_SetDunkFlag(#r,__FILE__,__LINE__,s)
	#define	SetPickedUpFlag(r,s)	_SetPickedUpFlag(#r,__FILE__,__LINE__,s)
	#define	SetDribbleFlag(r,s)		_SetDribbleFlag(#r,__FILE__,__LINE__,s)
	#define	SetShootStage(r,s)		_SetShootStage(#r,__FILE__,__LINE__,s)
	#define	db_out(r,m)				_db_out(#r,__FILE__,__LINE__,m)

  #if defined(CHAIN)
	#define	CallChain(r,p)			_CallChain(#r,__FILE__,__LINE__,p);
	#define	CallChainExit()			_CallChainExit()
  #else
	#define	CallChain(r,p)
	#define	CallChainExit()
  #endif
#else
	#define	SetBallHandler(r,p)		ball_handler=(p);
	#define	SetLastHandler(r,p)		last_handler=p;
	#define	SetPossession(r,p)		possession_flag=p;
	#define	CallChain(r,p)
	#define	CallChainInit()
	#define	CallChainExit()
	#define	SetMain(c,p,r)			(p)->main_routine=r
	#define	SetIkBlendSpeed(r,p,s)	(p)->ikBlendSpeed=(s)
	#define	SetHalfFlag(r,s)		half_flag=(s)
	#define	SetDunkFlag(r,s)		dunk_flag=(s)
	#define	SetPickedUpFlag(r,s)	picked_up_flag=(s)
	#define	SetDribbleFlag(r,s)		dribble_flag=(s)
	#define	SetShootStage(r,s)		shoot_stage=(s)
	#define	db_out(r,s)
#endif

#if defined(DEBUG)
extern char	*last_pos_rou;
#endif

extern s8 AttractMode;
extern bool ArcadeMode;
extern bool	ice;
extern int foul_cheat_flag;
extern bool	slo_mo;

extern bool piece_of_shit_fastbreak_points_flag;

extern int	BigPoints;

extern int	mom_team;
extern int	momentum;

extern int	SR_Team;
extern int	SR_Points;

extern int	AR_Time;
extern int	AR_Parm;

extern int status_var1;
extern int status_var2;
extern int status_var3;
extern int status_var4;
extern int status_var5;
extern int status_var6;
extern int status_var7;
extern int status_var8;

extern int sv[3];

extern int tempo;
extern int mtempo;
extern int time_rate;
extern int time_frame;

extern int timeout_called;
extern int current_basket_y;
extern int still_ctr;
extern int lp_ctr;
extern int possession_ticks;
extern int steal_ticks;
extern int freeze;

extern int last_blocker;
extern int last_handler;
extern int last_dunker;
extern int last_shooter;
extern int ball_handler;
extern playert *bhp;
extern int int_recvr;
extern int assister;
extern bool pass_it_flag;
extern char dribble_flag;
extern bool in_play_flag;
extern bool got_pos_flag;
extern bool steal_flag;
extern bool ai_flag;
extern bool half_flag;
extern bool	ai_off_flag;
extern bool not_there_yet;
extern int  cam3_flag;

extern int	inbounds_flag;

extern playert	player[];
extern teamt	ai_team[];
extern teamt	*cur_team;

extern ctrlrT ctrlrs[];
extern ctrlrT *current_ctrlr;

extern void nothing (playert *b_hndlr);
extern void fake_shot_return(playert *plyr);

extern void dribble (playert *b_hndlr);
extern void stand_with_ball (playert *b_hndlr);
extern void stand_with_ball2 (playert *b_hndlr);
extern void move_team(teamt *team);
extern void first_step(playert *plyr);
extern int	which_side(playert *plyr, playert *target);

extern void deflt (playert *plyr);
extern int	player_inbounds_check (playert *plyr);
extern void shove_back_inbound(playert *plyr);
extern void message(char *fname, int line);
extern bool is_pick_on(playert *plyr);

extern void move_by_anim(playert *plyr);
extern void face_by_anim(playert *plyr);
extern SW   anim_angle(playert *plyr);

/*extern void	dribble_check(playert *plyr); */

extern void move(void);
extern void StartGame (void);
extern void main_loop (SI *v);



/*loose */
extern void free_move (playert *plyr);
extern void jump_start(playert *plyr);
extern void chase_loose_ball(playert *plyr);

extern bool turbo_test(playert *plyr, int turbo);


/*ballAI */
extern void ball_handling_ai(void);
extern int blocked_basket_test(playert *plyr);
extern int clear_pass(playert *plyr);
extern int check_pass(playert *plyr);
extern void	dribble_to_place(playert *plyr);
extern void find_threat(playert *bhp);
extern void auto_crossover(void);

extern int get_free_pass_scores2(playert *plyr, int *hs, int *ps);

extern int get_postup_score(playert *bhp);
extern int get_shoot_score(playert *bhp);
extern void back_down(playert *plyr);
extern void choose_postup_move(playert *plyr);

extern int threat_plyr;
extern SW threat_angle;
extern int postup_move;
extern int back_down_ticks;
extern int	pass_scores[];
extern int	in_set_flag;
extern bool first_step_flag;

/*shoot */
extern int	select_shot(playert *plyr);
extern void	shoot(playert *plyr, int an);

extern void wait_a_sec(playert *bl);
extern void drop_bounce(playert *bl);
extern void made_ball_move(playert *bl);
extern void start_drop_bounce(playert *bl);

extern bool fadeaway_test(playert *plyr);
extern void fake_shot_rou(playert *plyr);
extern void jump_shot_rou(playert *plyr);
extern void jump_shot_rou2(playert *plyr);
extern void jump_shot_rou3(playert *plyr);
extern void jump_shot_rou4(playert *plyr);
extern void running_j_rou1(playert *plyr);
extern bool	finger_roll_test(playert *plyr);

extern void shooting_foul_rou(playert *plyr);
extern void shooting_foul_rou2(playert *plyr);
extern void shooting_foul_rou3(playert *plyr);
extern void shooting_foul_rou4(playert *plyr);

extern void finger_roll1(playert *plyr);
extern void finger_roll2(playert *plyr);
extern void finger_roll3(playert *plyr);
extern void finger_roll4(playert *plyr);

extern void layup_release(playert *plyr);
extern void tip_release(playert *plyr);

extern bool hook_test(playert *plyr);

extern void shoot_ball(playert *plyr,int percent, UB *path_list);

extern void set_ball (playert *bl, char *path_list, int t);

extern int get_shot_percent(playert *plyr, float dist);

extern int	shoot_zone;
extern bool pt3_detect(playert *plyr);
extern int  clear_shot_test(playert *plyr);
extern void edit_shot_data(void);
extern char data_string[15][30];

extern bool	off_glass;

extern bool	ft_flag;
extern bool pt3_flag;
extern int projected_release_time;
extern int projected_release_x;
extern int projected_release_y;


extern int  shot_dist;
extern int	shot_at_time;
extern int  shot_speed;
extern int  shot_angle;

extern int  shoot_stage;

extern int	fake_count;

//dunk
extern bool blocked_dunk_test(playert *plyr);
extern bool	sdunk_test	(playert *plyr);
extern bool	dunk_start	(playert *plyr, int time);
extern int	dunk_test	(playert *plyr);
extern bool dunk_called(playert *plyr, int type);
extern void	dunk_up_rou	(playert *plyr);
extern void dunk_down_rou(playert *plyr);
extern void landed		(playert *plyr);
extern void dunk_take_off(playert *plyr);
extern void rim_hang1(playert *plyr);
extern void rim_hang2(playert *plyr);
extern void rim_hang3(playert *plyr);

extern void receive_alley1(playert *plyr);
extern void receive_alley2(playert *plyr);
extern void receive_alley3(playert *plyr);
extern void dunk_monitor(void);

extern void	layup_start	(playert *plyr);
extern void	layup_routine(playert *plyr);

extern int	dunk_flag;
extern bool hang_flag;
extern int  swingHeight;
extern int  last_replay;

extern dunkT	*current_dunk;
extern dunkT	*allowed_dunks[];

/*rebound */
extern void rebound_positions(void);
extern void	pick_a_chaser(void);

extern bool rebound_test(playert *plyr);

extern void rebound_rou1(playert *plyr);
extern void rebound_rou2(playert *plyr);
extern void rebound_rou3(playert *plyr);
extern void rebound_landed(playert *plyr);

extern void tip_rou2(playert *plyr);
extern void tip_shoot(playert *plyr);

extern bool ball_pickup_check(playert *plyr);
extern void run_pickup_rou1(playert *plyr);
extern void run_pickup_rou2(playert *plyr);
extern void run_pickup_rou3(playert *plyr);
extern void dribble_pickup_rou1(playert *plyr);
extern void set_default(playert *plyr);
extern void check_rebound(playert *plyr);

extern void	rebound_start(playert *plyr, int lt, int t, int to_time, bool low_flag);

extern bool human_reb_flag;
extern int	rebound_flag;
extern bool picked_up_flag;
extern int  picker_up;



//block
extern playert *look_for_blocker(void);
extern bool block_dunk_test(playert *plyr);
extern void block_rou1(playert *plyr);
extern void block_rou2(playert *plyr);
extern void jump_block_rou2(playert *plyr);
extern void jump_block_rou3(playert *plyr);

extern void run_block1(playert *plyr);
extern void run_block2(playert *plyr);
extern void run_block3(playert *plyr);

extern void jump_block_rou1(playert *plyr);
extern void jump_block_rou2(playert *plyr);

extern void blocked_rou2(playert *plyr);
extern void blocked_rou3(playert *plyr);

//fouls
//extern void foul_reset(void);
#if defined(DEBUG)
	extern void	_FoulSet(char *, playert *, int);
	#define		FoulSet(r,p,f)		if (!PracticeMode) _FoulSet(#r,p,f)
#else
	#define		FoulSet(r,p,f)		if (!PracticeMode) foul_set(p,f)
#endif

extern void foul_set(playert *plyr, int foul_type);
extern void foul_check(void);
extern int  foul_flag;
extern int  foul_flag2;
extern int  fouler;
extern int  free_throws;
extern int  free_thrower;
extern int  last_free_throw;
extern bool foul_trouble(playert *plyr);


//fall
extern void reset_fall_flag(playert *plyr);
extern void start_fall(playert *plyr, SW angle);
extern void	fall_routine(playert *plyr);
extern void	fall_slide	(playert *plyr);
extern void sat_down(playert *plyr);
extern void get_up(playert *plyr);

//collide
extern void	frozen(playert *plyr);
extern void	knocked_back(playert *plyr);
extern bool post_check(SI new_x, SI new_y);
extern SI	collision(playert *plyr, SI xvel, SI yvel, SI col_radius);
extern SI	run_collision(playert *plyr, SI xvel, SI yvel);
extern void collision_react(playert *plyr, int col_flags);
extern void new_main(playert *plyr, void *rou);
extern void new_top(playert *plyr, void *rou);
extern void dunk_collision (playert *plyr);
extern void	push_back(playert *plyr,playert *plyr2);
extern bool	collide_sphere_cylinder(float xo, float yo, float zo, float xt, float yt, float zt,
									float xs, float ys, float zs, float rc, float rs);

/*positAI */
extern bool turn_to(playert *plyr, SW angle);
extern void get_positions (void);
extern bool move_to_place2(playert *plyr);
extern void in_place(playert *plyr, SW a_diff, SW target_direction);
extern bool covered(playert *mark, playert *plyr);
extern bool loose_covered(playert *mark, playert *plyr);
extern int covered2(playert *mark, playert *plyr);
extern bool covered3(playert *mark, playert *plyr);

extern void	get_angles_dist(void);

extern void move_to_ball(playert *plyr);
extern void start_pick_up_ball(playert *plyr);
extern void pick_up_ball(playert *plyr);

extern int inbound[][5][2];
extern int sectors[];
extern int last_sector;
extern int oobs_sector;
extern int last_bh;
extern int last_sec_change;
extern int set_switch;

extern int HotSpotPlyr;

extern playert *find_closest_plyr(playert *plyr1, int x, int y, int p);

/* defensiveAI */
extern bool	can_helper_d;
extern void	defend(playert *plyr);
extern void reset_markers(void);
extern void interception_check(playert *plyr);
extern void rotate(teamt *t);
extern void switch_markers(playert *p1, playert *p2);
extern void help(playert *plyr);
extern void call_double_team(teamt *t);
extern void double_team(playert *plyr);

/*camera */
extern void init_camera(void);
extern void move_camera(void);

extern SB sb___gCamMode;
extern SI si___gCamTheta;
extern SI si___gCamThi;
extern SI si___gCamX;
extern SI si___gCamY;
extern SI si___gCamZ;

extern int manualReplayFlag;

#ifdef PC
 extern void CamStartActionReplay(int f);
 extern void CamSwitchActionReplay(void);
 extern void CamStopActionReplay(void);
#endif

/*players */
//extern PlyrROMData_T PlyrROMArray[];

/*animctrl */
extern void animate(playert *plyr);
extern void start_anim(playert *plyr, int an);
extern void start_next_anim(playert *plyr);

extern void start_blend_anim(playert *plyr, int an);
extern void start_anim2(playert *plyr, int an, int time);
extern void start_next_anim2(playert *plyr, int time);

extern void start_next_leg_anim(playert *plyr);
extern void start_next_leg_anim2(playert *plyr, int time);

extern void start_blend_anim2(playert *plyr, int an, int time);
extern bool end_animation_test(playert *plyr);
extern bool end_leg_animation_test(playert *plyr);
extern int  time_till_land(playert *plyr);
extern int  frames_to_go(playert *plyr);
extern int  frames_to_go2(playert *plyr);
extern int  leg_frames_to_go(playert *plyr);
extern int  anim_time(playert *plyr);
extern bool blend_to_end(playert *plyr, int top, int legs, int time);
extern bool blend_to_end2(playert *plyr, int top, int legs, int time);

extern void start_leg_anim(playert *plyr, int an);
extern void start_blend_leg_anim(playert *plyr, int an);
extern void start_blend_leg_anim2(playert *plyr, int an, int time);
extern void start_leg_anim2(playert *plyr, int an, int time);
extern void start_blend_leg_anim_shuffle(playert *plyr, int an);
extern void start_vels(playert *plyr, int vel, SW angle);
extern void start_vels2(playert *plyr, int vel, SW angle);

/*leg*/

extern int last_squeek_ctr;
extern int last_grunt_ctr;
extern signed char pivot_flag;
extern signed char pivot_flag2;

extern void leg_deflt(playert *);
extern void running(playert *);
extern void turn180(playert *);
extern int  pivot(playert *plyr, SW diff);
extern void turn_and_burn(playert *plyr);

extern void running_animate(playert *plyr, int speed);

#define NO_PIVOT    0
#define LEFT_PIVOT  1
#define RIGHT_PIVOT -1


/* shuffle */
extern void	shuffle_from_run_init(playert *plyr);
extern void start_shuffle(playert *plyr);
extern void shuffling(playert *plyr);
extern void	set_shuffle_target_angle(playert *plyr);
extern void	shuffle_stand(playert *plyr);
extern void	shuffle_from_run(playert *plyr);
extern void	shuffle_from_run2(playert *plyr);
extern void bumped_back1(playert *plyr);
extern bool shuffle_stand_test(playert *plyr);

extern SW shuffle_lookup[3][16];
extern SW shuffle_speed[3][16];


/* offensai */
extern void run_screen(playert *plyr);
extern void set_pick(playert *plyr);
extern void start_set_pick(playert *plyr);
extern void picked(playert *plyr);
extern void fast_break_pos(playert *plyr);
extern void fast_break_test(void);
extern bool attack_home_in(playert *plyr, SW face_angle);
extern bool home_in4(playert *plyr);
extern void move_to_place(playert *plyr);
extern void set_fast_break(void);
extern void reset_play(void);
extern void auto_set(void);
extern void manual_set(void);
extern bool avoid_plyr(playert *plyr, playert *p2, int tx, int ty);
extern void stats_foul(playert *plyr, int type);

enum foultypes {
	FOUL_TYPE_OFFENSIVE,
	FOUL_TYPE_DEFENSIVE
};

extern bool pick_flag;
extern int  fast_break_flag;

extern bool	cut_flag;

extern int pick_ctr;
extern int last_pick;

extern int mid_man;
extern int left_wing;
extern int right_wing;
extern int barge;
extern int trailer;

extern int side;

// playedit
extern void print_plyr_scores(void);
extern void draw_graph(void);
extern void play_editor(int mouse_x, int mouse_y, int buttons);
extern bool player_over_test(void);

extern int max_play_dist;
extern void test_z(void);

extern void draw_collision_shape(playert *plyr);




//extern void read_ik_angles(playert *plyr);


extern void grab_ball_rou(playert *plyr);

/* top */
extern void dribble_animate(playert *plyr);
extern void top_deflt(playert *plyr);
extern void top_in_place(playert *plyr);
extern void start_celebration(playert *plyr);
extern void reset_celebration(void);
extern void process_celebration(void);
extern int play_cel;
extern int cel_ctr;


/* backward */
extern bool backward_test(playert * plyr);
extern void backward_init(playert * plyr);
extern void backward(playert * plyr);
extern void back_turn(playert * plyr);



/* steal */
extern void steal_rou(playert *plyr);
extern bool steal_test(playert *plyr);
extern void steal_start(playert *plyr);
extern void steal_over(playert *plyr);
extern void steal_react(playert *plyr);
extern void steal_move(playert *plyr);

extern void foul_rou(playert *plyr);
extern void foul_start(playert *plyr);
extern void foul_move(playert *plyr);
extern void foul_over(playert *plyr);

extern void limit_acel(playert *plyr, int xvel, int yvel, int limit);

extern void pickup_dribble(playert *plyr);



/* stats */
extern void stats_points(playert *plyr, int points);
extern void stats_miss(playert *plyr);
extern void stats_player_card(int no, int type);

extern void stats_o_reb(playert *plyr);
extern void stats_d_reb(playert *plyr);
extern void stats_update(void);
extern void stats_init(void);
extern void stats_assist(playert *plyr);

extern void CardSetScore(void);
extern void CardSetUpdate(int team, char *type, char *text);
extern void CardSetNone(void);

extern int card_ctr;

#ifdef PC
 extern TeamRamData_T cl___gHomeTeam;
 extern TeamRamData_T cl___gAwayTeam;
#endif

 //from shell
extern ThisMatch_T *pcl__gMatch;


/* clock */
extern void clock_update(void);
extern void new_shot_clock(void);

extern int  quarter;
extern int  time_left;
extern bool time_flag;
extern bool shot_clock_flag;
extern int shot_clock;
extern int five_sec_clock;
extern int ten_sec_clock;



extern char mikeStatusString[];
extern char statusString[];
extern char statusString2[];
extern char mrString[];	// Main routine debug string
extern char idString[]; // Player id debug string
extern char tpString[]; // Top routine debug string
extern char lgString[];	// Leg routine debug string
extern int  aiTicks;

extern int celebration_flag;

/* special */
extern void special_start(playert *plyr, int index);

extern void spin_wait (playert *b_hndlr);
extern void spin_dribble(playert *plyr);
extern void bb_dribble(playert *plyr);
extern void bb_dribble_flip(playert *plyr);
extern bool dribble_inbounds(playert *plyr);

extern void spin_start   (playert *plyr);
extern void bb_start		   (playert *plyr);
extern void crossover_start   (playert *plyr);
extern void crossover		   (playert *plyr);
extern void crossover_wait    (playert *plyr);
extern void standing_crossover(playert *plyr);
extern void standing_crossover_flip(playert *plyr);
extern void std_x_left		   (playert *plyr);
extern void std_x_left_flip   (playert *plyr);


extern void std_x_left1		   (playert *plyr);
extern void std_x_left2		  (playert *plyr);
extern void std_x_right1	   (playert *plyr);
extern void std_x_right2	   (playert *plyr);
extern void std_x_left_start  (playert *plyr);
extern void std_x_right_start (playert *plyr);
extern void std_x_start		  (playert *plyr);
extern void std_wait		  (playert *plyr);

extern int  special_time;


//tipoff
extern void to_init(void);
extern void to_wait(playert *plyr);
extern void to_waitc(playert *plyr);
extern void to_ball_wait(playert *bl);

extern void to_to(playert *plyr);
extern void to_up(playert *plyr);
extern void to_down(playert *plyr);
extern void to_land(playert *plyr);

extern bool tip_off_won;
extern bool tip_off_flag;


//setplay

extern int lagger;
extern int play_phase;

extern void execute_play(void);
extern bool play_over_test(void);
extern bool play_phase_complete_test(void);
extern void check_shoot(playert *bhp);
extern void run_play(void);

extern void call_play(void);
extern void setup_play(void);

extern int  play_flip_x(int x);
extern int  play_flip_y(int y);
extern int  play_flip_curve(int c);

extern playT plays[1][1][1][1];
extern int  offense;
extern int  play;
extern int  play_base;
extern int  player_xlate[5];
extern int  play_limit(playert *plyr, int f);

extern void check_target_dist(playert *plyr);


//postup
extern bool postup_test(playert *plyr);
extern void baby_hook1(playert *plyr);
extern void baby_hook2(playert *plyr);
extern void baby_hook3(playert *plyr);
extern void baby_hook4(playert *plyr);

extern ball_path_listT made_list[];

extern void baby_hook1(playert *plyr);
extern void baby_hook2(playert *plyr);
extern void baby_hook3(playert *plyr);

extern void up_under1(playert *plyr);
extern void up_under2(playert *plyr);

extern void standing_j(playert *plyr);

//intercep
extern int  closest_approach(playert *plyr1, playert *plyr2, int *x, int *y);
extern int  i_check_pass(int *t, int *z);
extern void intercept_pass(playert *plyr);
extern void missed_intercept2(playert *plyr);
extern void steal_pass(playert *plyr, int endTime);
extern void intercept(playert *plyr);
extern void bringBallDown(playert *plyr);
extern void intercept_recover(playert *plyr);
extern void intercept_catch(playert *plyr);
extern void missed_intercept(playert *plyr);
extern void missed_intercept_recover(playert *plyr);

extern bool intercept_jump_test(playert *plyr);
extern void jump_catch(playert *plyr);
extern void jump_caught(playert *plyr);

extern SB headNodes[];


//Ik
extern void track_ball_test(void);
extern void ik_check(playert *plyr);
extern bool ik_simple(playert *plyr, int tx, int ty, int tz);
extern void MakeSkelMatrices(playert *plyr);
extern void GetSkelNodePos(playert *plyr);

extern int display_node;
extern int step_limit;
extern int nextIkFrame;
extern ikFrameT ikFrames[256];


// 3 Pt Contest
extern void		Contest3PtLoop(SI *v);
extern int		C3PT;
extern ballt	*Balls;
extern int		end_time;

//posedit
extern int  get_bh_sector(int x, int y);
extern void draw_collision_boxes(void);


//free
extern void free_throw_pick_up(playert *plyr);
extern void free_throw_wait(playert *plyr);
extern void free_throw_shoot(playert *plyr);
extern void free_throw_bounce(playert *plyr);
extern void free_throw_recover(playert *plyr);


#endif


