/******************************************************************************
	enchkcrs.h
******************************************************************************/

#ifndef ENCHKCRS_H
#define ENCHKCRS_H

#include "kn_machine.h"
#include "kn_backup.h"
#include "enbuoy.h"

/******************************************************************************
	define constants
******************************************************************************/

#define COURSE_MAX	12
#define TOUR_COURSE_MAX	8
#define SCA_COURSE_MAX	9
#define NCOURSE_0	0
#define NCOURSE_1	1
#define NCOURSE_2	2
#define NCOURSE_3	3
#define NCOURSE_4	4
#define NCOURSE_5	5
#define NCOURSE_6	6
#define NCOURSE_7	7
#define NCOURSE_8	8
#define NCOURSE_PARK	NCOURSE_0
#define NCOURSE_SELECT	(NCOURSE_8 + 1)
#define NCOURSE_EDIT	(NCOURSE_8 + 2)

#define LAP_MAX		9

#define CHKPNT_MAX	8

#define PASSPNT_MAX	5

#define	FRAME_SEC	20
#define	CTIME_FRAME	50
#define CTIME_MAX	(((9 * 60 + 59) * FRAME_SEC + FRAME_SEC - 1) * CTIME_FRAME + CTIME_FRAME - 1)
#define SCA_SCORE_MAX	99999

#define	SIGNAL_SEC	15
#define	SIGNAL_TIMING_A		0
#define	SIGNAL_TIMING_B		1
#define	SIGNAL_TIMING_C		2
#define	SIGNAL_TIMING_D		3
#define	SIGNAL_TIMING_E		4

#define RANKING_MAX	3

#define CHK_TIME_REC_MAX	2

#define FRETIRE_MISS	1
#define FRETIRE_TIME	2

/******************************************************************************
 	structures
******************************************************************************/

typedef struct {
	int	lap;				/* lap nuber */
	int	rank;				/* rank number (0:1st, 1:2nd, ...) */
	int	irank;				/* rank check work */

	int	ibnext;				/* index of aiming buoy */
	int	ienbnext;			/* index of aiming buoy for enemy */
	int	ibnext_spr0;
	int	ibnext_spr1;
	int	fbside, fbback, cdepth;		/* buoy check work */
	int	tbpass;				/* buoy pass flag (1:pass, 2:miss) */
	int	fbpass[BUOY_MAX];		/* buoy pass flag */
	int	passpnt;			/* buoy pass point (max PASSPNT_MAX) */
	int	miss_lap;			/* buoy miss number in a lap */
	int	miss_sum;			/* buoy miss number in a course */
	int	pow;				/* engine power following passpnt */
	int	fmiss_over;			/* on at miss_sum >= miss_limit */
	int	recmiss[LAP_MAX];		/* miss_lap record */

	int	ichkpnt;			/* time check work */
	int	ctime;				/* lap time */
	int	ctime_msec;			/* total time display work */
	int	ctime_best;			/* best lap time */
	int	lap_best;			/* best time lap number */
	int	rectime[LAP_MAX];		/* lap time record */
	int	ctime_total;			/* total time */
	int	ctime_total_best;		/* ----- not used ----- */
	int	ctime_chk[LAP_MAX][CHKPNT_MAX];	/* check point time */
	int	lefttime;			/* left time in stunt mode */

	int	rpm_cur, rpm_dst;		/* tachometer's angle */
	int	idc_cur, idc_dst;		/* indicators's angle */
	int	idc_cnt, idc_cnt2, idc_cnt3;	/* indicators's counter */

	int	fcrsout, ccrsout;		/* course out */
	int	fretire;			/* retire flag */
	int	ftryagain;			/* gate tryagain flag */
	int	ffinish;			/* finish flag */

	int	ctime_dif;			/* differece time */
	int	ftime_dif;			/* differece time display flag */
	int	ttime_dif;			/* differece time display time counter */

	int	fgoaladj;			/* goal adjust flag */
	
	int	flapmsg;			/* lap number display flag */

	int	finfork;			/* fork mode flag */

	int	ibrail;				/* index of current buoy */

	int	fpowmsg;			/* power up message flag */
	
	int	fmizukusa;			/* mizukusa flag */

	int	fincave;			/* cave mode flag */

	int	rlap;				/* rank check work */
	int	lpassgoal;			/* rank check work */

	int	creverse;			/* reverse counter */
	
	float	rankval;			/* rank check work */
	float	dist_match;			/* distance to match */
	
	int	ctime_out;			/* SCA time out counter */

	int	point_rank;			/* point rank number (0:1st, 1:2nd, ...) */

	int	ntime_dif;			/* differece time boat number */

	float	fsp3;
	float	fsp4;
	float	fsp5;
	float	fsp6;
	
	Buoy	*pbuoy;				/* enemy's pointer to buoy */
	
	int	spare[LAP_MAX];
} Chkcrs;

typedef struct {
	float	px, py, pz;
	float	vx, vy, vz;
} Machine;

typedef struct {
	int	ctime;
	int	nmachine;
	int	fcustom;
	int	dif;
	char	name[PLAYER_NAME_MAX_SIZE + 1];
} Timerec;

typedef struct {
	int	score;
	int	nmachine;
	int	fcustom;
	char	name[PLAYER_NAME_MAX_SIZE + 1];
} Scorerec;

typedef struct {
	int	saka1, saka2;
	int	ushiro1, ushiro2;
	int	yoko_roll;
	int	ushiro_roll;
	int	spin1, spin2;
	int	spin_back;
	int	marine1, marine2;
} Sca_score;

/******************************************************************************
	external variables
******************************************************************************/
extern Chkcrs	chkcrs[MACHINE_MAX];

extern int	ncourse;

extern int	fcrsturn;	/* 0: counter-clockwise, not 0: clockwise */

extern float	crsscale, crsscale_c; 
extern float	crs_xmin, crs_xmax, crs_zmin, crs_zmax;
extern float	crs_xsize, crs_zsize;
extern float	crs_out_radius;
extern float	crs_shift_x, crs_shift_z;

extern int	miss_limit;

extern int	nofchkpnt;

extern int	fstunt_mode;

extern int	fgate_open;
extern int	fsea_ofs;
extern int	ffog_clr;

extern int	flapstop;
extern int	ftime_stop;
extern int	fgoal_process;
extern int	frank_process;
extern int	cafter_goal;

extern int	best_lap_time;
extern int	best_total_time_prev, best_lap_time_prev;
extern Timerec	total_time_rec[COURSE_MAX][RANKING_MAX];
extern Timerec	lap_time_rec[COURSE_MAX];
extern Timerec	rev_time_rec[COURSE_MAX];
extern int	chk_time_rec[COURSE_MAX][LAP_MAX];
extern int	frank_total;	/* 1-3: ranked, 0: not ranked */
extern int	frank_lap;	/* if not 0 ranked */
extern int	fbreak_lap;	/* if not 0 break lap time (trigger) */
extern int	frank_total_rec[COURSE_MAX];
extern int	frank_lap_rec[COURSE_MAX];
extern int	last_rank[BOAT_MAX];

extern int	sca_score, sca_score_time, sca_score_ring, sca_score_act;
extern int	facrobat_score, cacrobat_score;
extern Scorerec	sca_score_rec[COURSE_MAX][RANKING_MAX];
extern int	frank_sca;	/* 1-3: ranked, 0: not ranked */
extern int	nring_through;
extern int	fdolphin_condition;

extern int	nofmachine;
extern int	nplmachine; 
extern Machine	machine[MACHINE_MAX];

/******************************************************************************
	external functions
******************************************************************************/
extern void InitChkCourse(void);
extern void ChkCourse(void);
extern void SetRetire(Chkcrs *pchkcrs);
extern void CalcEnemyTime(void);

#endif
