//---------------------------------------
// ogawa.h
//---------------------------------------
#ifndef OGAWA_H
#define OGAWA_H

#include "enemy_static.h"
#include "map.h"
#define BOM_MAX	7
#define SPEED_KM(a)	(a*18.0)/216.0 ///18=1METER ,1frame=60->60*60*60=216000/1000=216

//---------------------- 表彰台４位の人の待機時間 -----
#define OGA_HYPUSYOU_4TH_WAIT_TIME	0

//---------------------- BOM COLOR ---
#define BOM_COLOR_BLACK		0
#define BOM_COLOR_BLUE		1
#define BOM_COLOR_GREEN		2
#define BOM_COLOR_RED		3
#define BOM_COLOR_YELLOW	4

//---------------------- 表彰台目標地点 -----
#define OGA_RES_R1_MX	-3202.475
#define OGA_RES_R1_MY	19.167
#define OGA_RES_R1_MZ	-477.624

#define OGA_RES_R2_MX	-3205.080
#define OGA_RES_R2_MY	19.167
#define OGA_RES_R2_MZ	-462.852

#define OGA_RES_R3_MX	-3199.870
#define OGA_RES_R3_MY	19.167
#define OGA_RES_R3_MZ	-492.396

#define OGA_RES_R4_MX	-2409.197
#define OGA_RES_R4_MY	0.000
#define OGA_RES_R4_MZ	-355.254

//----------------------- KAME HIBASIRA NUMBER -----
#define OGA_KAME_FIRE_RED	0
#define OGA_KAME_FIRE_BLUE	1
#define OGA_KAME_FIRE_TOGE	2

//----------------------- MAZE AREA -----
#define MAZE_AREA_WELCOME	109
#define MAZE_AREA_EXIT_0	526
#define MAZE_AREA_EXIT_1	517
#define MAZE_AREA_EXIT_2	528
#define MAZE_AREA_EXIT_3	642

//----------------------- CAMERA ANGLE ------
#define ANGLE_40			0
#define ANGLE_60			1
#define ANGLE_KOUKAKU		2
#define ANGLE_NOPOINT_GOAL	3

//----------------------- BOM MODE -----
#define BOM_MODE_NULL		0
#define BOM_MODE_ROTATE_L	1
#define BOM_MODE_ROTATE_R	2
#define BOM_MODE_STOP		3
#define BOM_MODE_BOOM		4
#define BOM_MODE_RESULT		5


//----------------------- CAMERA MODE ------
#define OGA_VIDEO_VIEW		0
#define OGA_FACE_VIEW		1
#define OGA_WAIT_L_VIEW		2
#define OGA_WAIT_R_VIEW		3
#define OGA_SIDE_L_VIEW		4
#define OGA_SIDE_R_VIEW		5
#define OGA_OIKAKE_L_VIEW	6
#define OGA_OIKAKE_R_VIEW	7
#define OGA_KAITEN_VIEW		8
#define OGA_QUICK_VIEW		9

#define OGA_BIRD_VIEW		10
#define OGA_BIRD_VIEW2		11
#define OGA_GOAL_L_VIEW		12
#define OGA_GOAL_R_VIEW		13
#define OGA_BACK_VIEW		14
#define OGA_NOPOINT_L_VIEW	15
#define OGA_NOPOINT_R_VIEW	16
#define OGA_SLEEP_VIEW		-1


#define OGA_CAMERA_MODE_MAX	10

//----------------------- ACTION DATA -----
#define OGA_ACT_NULL			0
#define OGA_ACT_DRIFT			1
#define OGA_ACT_N_JUMP			2
#define OGA_ACT_CENTER			3
#define OGA_ACT_LEFT			4
#define OGA_ACT_RIGHT			5
#define OGA_ACT_SPEED_FREE		6
#define OGA_ACT_SPEED_MAX		7
#define OGA_ACT_SPEED_MIN		8
#define OGA_ACT_TENUKI_KINSI	9
#define OGA_ACT_TENUKI_KYOKA	10
#define OGA_ACT_TURBO			11


//----------------------- ACCEL MODE -----
#define OGA_ACCEL_FREE	0
#define OGA_ACCEL_MAX	1
#define OGA_ACCEL_MIN	2
#define OGA_ACCEL_TURBO	3


//----------------------- ENEMY STATUS -----
#define OGA_CAR_STAT_NORMAL		0
#define OGA_CAR_STAT_RIVAL		1
#define OGA_CAR_STAT_BIRI		2
#define OGA_CAR_STAT_PLAYER		3



//----------------------- ITEM NUMBER -----
#define EI_NULL					0

#define EI_BANANA_SET			1
#define EI_BANANA_HOLD			2
#define EI_BANANA_SHOOT			3

#define EI_G_SHELL_SET			4
#define EI_G_SHELL_HOLD			5
#define EI_G_SHELL_SHOOT		6

#define EI_R_SHELL_SET			7
#define EI_R_SHELL_HOLD			8
#define EI_R_SHELL_SHOOT		9

#define EI_SUPER_BANANA_SET		10
#define EI_SUPER_BANANA_HOLD	11
#define EI_SUPER_BANANA_SHOOT	12

#define EI_FAKE_IBOX_SET		13
#define EI_FAKE_IBOX_HOLD		14
#define EI_FAKE_IBOX_SHOOT		15

#define EI_SUPER_G_SHELL_SET	16
#define EI_SUPER_G_SHELL_HOLD	17
#define EI_SUPER_G_SHELL_SHOOT	18

#define EI_SUPER_R_SHELL_SET	19
#define EI_SUPER_R_SHELL_HOLD	20
#define EI_SUPER_R_SHELL_SHOOT	21

#define EI_THUNDER_SET			22
#define EI_THUNDER_END			23
#define EI_HANE_SET				24
#define EI_STAR_SET				25
#define EI_STAR_END				26
#define EI_TERESA_SET			27
#define EI_TERESA_END			28

#define EI_KINOKO1_SET			29
#define EI_KINOKO2_SET			30
#define EI_KINOKO3_SET			31
#define EI_KINOKOC_SET			32
#define EI_KINOKOC_USE			33

#define EI_BANANA_NAGE_SET		34
#define EI_BANANA_NAGE_MOVE		35
#define EI_BANANA_NAGE_END		36



//-------------------------------------

extern void ogawa_draw(int);
extern void ogawa_debug_draw(void);
extern void init_center_line(void);
extern void init_enemy_kart(void);
extern void ogawa_camera_init(int);
extern void oga_game_camera(ushort *, CAMERA *, CAR *, char, int);
extern void oga_game_camera_all(ushort *, CAMERA *, CAR *, char, int);
extern void kame_hibasira_init(void);
extern int kame_hibasira_set(int);
extern int kame_blue_hibasira_set(int);
extern int kame_toge_hibasira_set(int);
extern void kame_hibasira_clear(int);
extern void oga_game_camera(ushort *, CAMERA *, CAR *, char, int);
extern void oga_drivers_point_camera_init(void);
extern void oga_vs_winner_camera_init(void);
extern void oga_timeattack_camera_init(void);
extern void oga_battle_camera_init(void);

extern void ogawa_hanyou_object_init(void);

extern void ogawa_sound_camera_set(short, short, short);
extern void init_enemy_game_mode(void);
extern void set_rival_car_name(void);	
extern void etc_enemy_drive(void);

extern short hanyou_gyaku_soukou_sub_BP(FVector, ushort*, float, float, short);

extern void oga_hyousyou_init(void);
extern void oga_hyousyou_move(void);

extern void oga_gp_rose_ErhnamDjinn(void);
extern void oga_enemy_voice(int, CAR *);

extern void sort_goal_rank(void);			/* ゴール直後に強制ソート（誤差修正） */
extern void sort_goal_rank_2PGP(void);		/* 2PGPゴール直後に強制ソート（誤差修正） */


extern short rank_to_num[10];
extern short real_rank_to_num[10];		/*  real_rank -> num 変換テーブル	*/
extern int ogawa_rap[10];
extern int ogawa_rank[10];
extern int real_rank[10];
extern ushort center_line_max;
extern ushort old_oga_area[10];
extern int pylon_count[10];
extern short name_to_num[10];
extern POINT *center_line;
extern short gakaku_mode[];
extern float cam_offset[];
extern int oga_demo_skip_ok_flag;	//  デモ先送り許可フラグ  0:NG 1:OK

extern ushort oga_BP_line[10];
extern POINT *center_line_BP[4];
extern ushort center_line_max_BP[4];
extern float rap_count_F[10];
extern float rate_count_F[10];
extern ushort fumikiri_mode[2];	// 0:停止  1:作動
extern short enemy_enter_maze[10];	// 0:MAZE OUT   1:MAZE IN

extern float enemy_tenuki_y[10];
extern short enemy_tenuki_kinsi_flg[10];

extern short oga_hyousyou_demo_trg;
extern short oga_nopoint_demo_trg;

extern short oga_goal_kakutei_flg;		// ゴール確定判定フラグ


typedef struct {		// 640 bit  (80)byte
	FVector body;		// 32*3 bit (12)
	FVector tire1;		// 32*3 bit (12)
	FVector tire2;		// 32*3 bit (12)
	FVector tire3;		// 32*3 bit (12)
	FVector tire4;		// 32*3 bit (12)
	float speed;		// 32 bit   (4)
	ushort	angle;		// 16 bit   (2)
	ushort	area;		// 16 bit   (2)
	ushort	mv_pat;		// 16 bit   (2)
	ushort	mv_count;	// 16 bit   (2)
	ushort	mv_count2;	// 16 bit   (2)
	ushort	tenuki_flg;	// 16 bit   (2)
	ushort	color;		// 16 bit   (2)
	float	org_y;		// 32 bit   (4)
}BOM_TYPE;

typedef struct {		// 256 bit  (32)byte
	short exist;		// 16 bit	(2)
	FVector pos;		// 32*3 bit	(12)
	FVector speed;		// 32*3 bit	(12)
	ushort area;		// 16 bit	(2)
	short object_num;	// 16 bit	(2)
	ushort dummy;		// 16 bit	(2)
}SL_BODY;

typedef struct {		// 2944 bit  (368)byte
	SL_BODY head;		// 32*8 bit	(32)
	SL_BODY sekitan;	// 32*8 bit	(32)
	SL_BODY kyaku[5];	// 32*8*5 bit(32*5)
	float speed;		// 32 bit	(4)
	int player_near_flg;	// 32 bit	(4)
	int hensei_num;		// 32 bit	(4)
	float dummy;		// 32 bit	(4)
}SL_TYPE;

typedef struct {		// 320 bit  (40)byte
	short exist;		// 16 bit	(2)
	FVector pos;		// 32*3 bit	(12)
	FVector vspeed;		// 32*3 bit	(12)
	ushort area;		// 16 bit	(2)
	short object_num;	// 16 bit	(2)
	float speed;		// 32 bit	(4)
	short angle;		// 16 bit	(2)
	int player_near_flg;	// 32 bit	(4)
}SHIP_TYPE;


typedef struct {		// 384 bit  (48)byte
	short exist;		// 16 bit	(2)
	FVector pos;		// 32*3 bit	(12)
	FVector vspeed;		// 32*3 bit	(12)
	ushort area;		// 16 bit	(2)
	short object_num;	// 16 bit	(2)
	float speed;		// 32 bit	(4)
	float zure;			// 32 bit	(4)
	SVector vangle;		// 16*3 bit	(6)
	short line_num;		// 16 bit	(2)
	char SE_active;		// 8 bit	(1)
	char SE_HORN_active; // 8 bit	(1)
}HIGHWAY_CAR_TYPE;

typedef  struct{
	short pointx;
	short pointy;
	short pointz;
	ushort group;
}POINT_OGA;

typedef  struct{
	short pointx;
	short pointz;
}POINT_FLAT;

typedef struct {		// 128bit   (16)byte
	short	item_num;	// 16 bit   (2)
	short	obj_num;	// 16 bit   (2)
	short	time;		// 16 bit   (2)
	short	kosuu;		// 16 bit	(2)
	short	count1;		// 16 bit	(2)
	short	count2;		// 16 bit	(2)
	short	count3;		// 16 bit	(2)
	short	hold_time;	// 16 bit	(2)
}ITEM_TYPE;

extern BOM_TYPE bom[BOM_MAX];
extern BUMP bom_bump[BOM_MAX];
extern void enemy_item_number_set(int, ITEM_TYPE*, int);
extern ITEM_TYPE enemy_item[8];
extern SL_TYPE SL[2];
extern SHIP_TYPE ship[2];

#endif
