/********************
	kn_main.h
 ********************/

#ifndef _KN_MAIN_H_
#define _KN_MAIN_H_

/***************************************************************************
	DEFINE
****************************************************************************/

/*******************************************************
	PAUSE
*******************************************************/
/* MODE */
#define PAUSE_MODE_OFF		-1
#define PAUSE_MODE_CONTINUE	0
#define PAUSE_MODE_EXIT		1
#define PAUSE_MODE_RETIRE	2
#define PAUSE_MODE_RESTART	3
#define PAUSE_MODE_MACHINE	4
#define PAUSE_MODE_COURSE	5
#define PAUSE_MODE_TOUR		6
#define PAUSE_MODE_CTITLE	7

#define PAUSE_MODE_MAX_TOUR		4
#define PAUSE_MODE_MAX_PARK		3
#define PAUSE_MODE_MAX_ATTACK	5
#define PAUSE_MODE_MAX_DEFAULT	2

/* FLAG */
#define PAUSE_FLAG_OFF		0
#define PAUSE_FLAG_RETIRE1	1
#define PAUSE_FLAG_RETIRE2	2
#define PAUSE_FLAG_RESTART	3
#define PAUSE_FLAG_EXIT		4
#define PAUSE_FLAG_MACHINE	5
#define PAUSE_FLAG_COURSE	6
#define PAUSE_FLAG_TOUR		7
#define PAUSE_FLAG_CTITLE	8

/*******************************************************
	VRAM MODE
*******************************************************/
#define	VM_NORMAL	0
#define	VM_SCREEN	1
#define	VM_SMOKE	2
#define	VM_HI		3

#define	VM_MAX		4

/*******************************************************
	GAME KIND
*******************************************************/
#define	GAME_KIND_NULL		-1
#define	GAME_KIND_ATTACK	0
#define	GAME_KIND_VS		1
#define	GAME_KIND_TOUR		4		/* TOUR MODE */	
#define	GAME_KIND_CONFIG	5
#define	GAME_KIND_DEMO		10		/* COURSE TITLE */
#define	GAME_KIND_SCORE		11		/* SCORE ATTACK */

//#define	GAME_KIND_MAX		7

/*******************************************************
	GAME MODE
*******************************************************/
#define GM_NULL				(-1)

#define	GM_BOOT				0
#define	GM_EDIT				1
#define	GM_OPEN				2
#define	GM_TITLE			3
#define	GM_TITLE2NEXT		4
#define	GM_CPACK			5
#define	GM_CPACK2NEXT		6
#define	GM_GAMEDEMO			7
#define	GM_GAMEDEMO2NEXT	8

#define	GM_MACHINE			10
#define	GM_MACHINE2NEXT		11

#define	GM_COURSE			20
#define	GM_COURSE2NEXT		21

#define	GM_CTITLE			30
#define	GM_CTITLE2RACE		31

#define	GM_RACE				40
#define	GM_RACE2MISS		41
#define	GM_RACE2FINISH		42
#define	GM_RACE2NEXT		43
#define	GM_RACE2DRAW		44
#define	GM_RACE2END			45

#define	GM_RECORD			50
#define	GM_RECORD2NEXT		51
#define	GM_RESULT			52
#define	GM_RESULT2NEXT		53
#define	GM_VSRESULT			54
#define	GM_VSRESULT2NEXT	55
#define	GM_CALC				56
#define	GM_SCREC			57

#define	GM_CONFIG			60
#define	GM_CONFIG2NEXT		61
#define	GM_CFGNAME			62
#define	GM_CFGNAME2NEXT		63
#define	GM_CFGSAVE			64
#define	GM_CFGSAVE2NEXT		65
#define	GM_CFGREC			66
#define	GM_CFGREC2NEXT		67
#define	GM_CFGCOND			68
#define	GM_CFGCOND2NEXT		69
#define	GM_CFGERASE			70
#define	GM_CFGERASE2NEXT	71
#define	GM_CFGSOUND			72
#define	GM_CFGSOUND2NEXT	73

#define	GM_RESTART			80
#define	GM_RESTART2NEXT		81

#define	GM_GAMEOVER			90
#define	GM_GAMEOVER2NEXT	91

#define	GM_NAME				100
#define	GM_NAME2NEXT		101
#define	GM_TOUREND			102
#define	GM_TOUREND2NEXT		103

/*******************************************************
	GAME STAT
*******************************************************/
#define	GAME_STAT_TITLE			0
#define	GAME_STAT_RACE			1
#define	GAME_STAT_EDIT			2
#define	GAME_STAT_RECORD		3
#define	GAME_STAT_MACHINE		4
#define	GAME_STAT_COURSE		5
#define	GAME_STAT_NAME			6
#define	GAME_STAT_CONFIG		7
#define	GAME_STAT_CTITLE		8
#define	GAME_STAT_RESULT		9
#define	GAME_STAT_CFGNAME		10
#define	GAME_STAT_CFGSAVE		11
#define	GAME_STAT_CFGREC		12
#define	GAME_STAT_RESTART		13
#define	GAME_STAT_CFGCOND		14
#define	GAME_STAT_GAMEOVER		15
#define	GAME_STAT_CFGERASE		16
#define	GAME_STAT_BOOT			17
#define	GAME_STAT_VSRESULT		18
#define	GAME_STAT_CPACK			19
#define	GAME_STAT_CFGSOUND		20
#define	GAME_STAT_TOUREND		21
#define	GAME_STAT_CALC			22
#define	GAME_STAT_SCREC			23
#define	GAME_STAT_GAMEDEMO		24

/*******************************************************
	HOVER MODE
*******************************************************/
#define	HOVER_MODE_TIME_STOP	0
#define	HOVER_MODE_STOP			1
#define	HOVER_MODE_AUTO			2
#define	HOVER_MODE_MANUAL		3

/*******************************************************
	SEA MODE
*******************************************************/
#define	SEA_MODE_NORMAL			0
#define	SEA_MODE_UP				1
#define	SEA_MODE_SELECT		2

/*******************************************************
	SIGNAL MODE
*******************************************************/
#define	SIGNAL_MODE_OFF		0
#define	SIGNAL_MODE_ON		1
#define	SIGNAL_MODE_ZERO	2
#define	SIGNAL_MODE_RACE	3

/*******************************************************
	GRAPH TIMING
*******************************************************/
#define	GRAPH_TIMING_TITLE			3
#define	GRAPH_TIMING_EDIT			1
#define	GRAPH_TIMING_RACE			3
#define	GRAPH_TIMING_RECORD			2
#define	GRAPH_TIMING_MACHINE		3
#define	GRAPH_TIMING_COURSE			2
#define	GRAPH_TIMING_CONFIG			2
#define	GRAPH_TIMING_CTITLE			3
#define	GRAPH_TIMING_RESULT			2
#define	GRAPH_TIMING_CFGNAME		3
#define	GRAPH_TIMING_CFGREC			2
#define	GRAPH_TIMING_CFGSAVE		2
#define	GRAPH_TIMING_RESTART		2
#define	GRAPH_TIMING_CFGCOND		2
#define	GRAPH_TIMING_GAMEOVER		GRAPH_TIMING_RESULT
#define	GRAPH_TIMING_CFGERASE		2
#define	GRAPH_TIMING_BOOT			1
#define	GRAPH_TIMING_NAME			2
#define	GRAPH_TIMING_CPACK			2
#define	GRAPH_TIMING_CFGSOUND		2
#define	GRAPH_TIMING_TOUREND		3
#define	GRAPH_TIMING_VSRESULT		2
#define	GRAPH_TIMING_CALC			2
#define	GRAPH_TIMING_SCREC			2
#define	GRAPH_TIMING_GAMEDEMO			3
/*******************************************************
	WAVE AMP LEVEL
*******************************************************/
#define WA_LEVEL_ORIGINAL		0
#define WA_LEVEL_CALM			1
#define WA_LEVEL_ROUGH			2
#define WA_LEVEL_RANDOM			3

/*******************************************************
	STRUCT
*******************************************************/
/* Game Infomation */
typedef struct {
	int		gameKind;		/* ゲームの種類 */
    short	players;		/* 何人で遊ぶか？ */
    short	boatMax;		/* ボートの数 */
	int		amp;			/* 波の大きさ */
	int		missLimit;		/* MISS */
	int		finishLap;		/* LAP */
	int		handiFlag;		/* HANDICAP */
} sSelGameInfo;

/*******************************************************************************
	VARIABLE
*******************************************************************************/
extern unsigned int	segBaseAddress[16];
extern int			mainGlistCounter;
extern ushort		time_fg;
extern short		pause_mode, pause_flag;
extern int			vram_mode;
extern int			game_mode, gameModeNext, gameModeOld;
extern int			game_stat, gameModeChangeFlag, gameModeSeq;
extern int			gameModeCount;
extern int			game_kind;
extern int			players, player_index;
extern int			hover_mode;
extern int			sea_mode;
extern int			signal_mode;
extern int			finishLap;
extern int			rivalAIFlag;
extern unsigned int bankFreeStart;
extern sSelGameInfo	mSelGameInfo;
extern short		pausePermission;
extern short		defeatPlayer;
extern short		machine_2Pcolor_flag[2];
extern unsigned short	retire_sw;
extern unsigned short	knPerspNorm;
extern int			vsWinPoint[2];
extern short		initCurFlag;
extern int			indexHi;
extern int			courseNameTable12[], courseNameTable18[];
extern int			tourFirstFlag;
extern short		dolphinParkGameFlag;
extern int			notRankingFlag;
extern short		reverseRunFlag;
extern int  		totalResultJetNum[];
extern short		displayBigTitleFlag;
extern short		next_round_flag[BOAT_MAX];
extern short		dolphinParkInNum;
extern short		dolphin_ride_ok, dolphin_select;
extern int 		courseNumConvTable[];
extern int		selectHandiNum;
extern short		wave_amp_level;
extern int		endingViewFlag;
extern int		tourAll1Flag;
extern char		*pStrPlayerDefaultName[];
extern int		euLanguageMenuOn;
extern int		idGhost;
extern int		fMotorMes;
extern int		ctimeGhost, ctimeRamGhost;
extern int		fGhostWrote;
extern int		fNoSaveGhost;

/* Special */
extern int		specialCrsSelNum;
extern short	specialTourEndingFlag;
extern short	specialTourEndingRank;
/*******************************************************************************
	DISPLAY LIST
*******************************************************************************/
extern Gfx		dlInitWaku[];
extern Gfx		dlInitCommonBG[];
/*******************************************************************************
	FUNCTION
*******************************************************************************/
extern void		init_main_process( void );
extern void		move_main_process( void );
extern Gfx		*make_main_process_glist( Gfx *gp );
extern Gfx 		*clearAllFBuffer( Gfx *gp );
extern Gfx 		*clearAllFBufferColor( Gfx *gp, ushort r, ushort g, ushort b );
extern Gfx 		*clearFBuffer( Gfx *gp );
extern void		*calcK0Address( void *data );
extern void		setCourseShape( int course_num, int player_num );
extern int		getStrLength( char *str );

extern void 	initMainGlistRace( void );
extern void		initMainGlistRace2Machine( void );
extern void 	make_PARTSmatrix( Mtx *m,
					float Zx, float Zy, float Zz,
					float Yx, float Yy, float Yz,
					float tx, float ty, float tz, float scale );
extern Gfx 		*makeKnJetGlist(Gfx *glistp,int man_num,int anim_num,int flag, Mtx *mtx_p );
extern Gfx		*makeWakuGlist( Gfx *gp, int kind, int sx, int sy, int wd, int ht );
extern Gfx 		*makeMainGlistRaceSub( Gfx *gp );
extern Gfx 		*makeMainGlistRace2PSub( Gfx *gp );
extern int 	setWaveAmp( int condition_mode, int course_num );
extern Gfx		*makeKnSeaBottomGlist( Gfx *gp, int course_num );
extern Gfx		*makeKnBlindBoardGlist( Gfx *gp, int course_num );
extern Gfx 	*makePoint5Glist( Gfx *gp, uint font_type, int point, int sx, int sy );
extern void 	transAudioTable( void );
extern void	knViBlack( unsigned char active );
extern void	initOriginalViMode( void );
extern void	setOriginalViMode( int resolution );
extern void	changeViMode( void );
extern Gfx	*makePfsWarningGlist( Gfx *pGfx, int idPfsWarning, int xPos, int yPos, uint texOffset );
#endif
