/********************************************************************************
*			
*		----------------------------	
*		    Ultra64 MARIO KART	
*		----------------------------	
*			File		: external.h
*			Description	:	
*			Date		: 1996.9.4
*			Author		: MASATO KIMURA
*								
*********************************************************************************/

/********************************************************************************
		function prototypes
*********************************************************************************/
#define NORTH   0
#define EAST	1
#define SOUTH	2
#define WEST	3

typedef struct {
		uint address;
		uchar   status; 
		uchar   area;
		ushort flag;
}SEARCHLIST;		      

typedef struct {
		Controller *cont;
		CAMERA     *camera;
		CAR        *kart;
		AffineMtx  *matrix;
		Vp	   viewport;
		float 	   screen_aspect;
		float      screen_angle;
		short      horizon;
		short      pad;
		short      widthx;
		short      widthy;
		short	   posx;
		short      posy;
		short      flag;
		short      camera_direction; /*
					     0=NOTRH
					     1=EAST	
					     2=SOUTH	
					     3=WESt	
					     */
		short      camera_point;
}SCREEN;		      
extern SCREEN screen_data[];
extern SCREEN *screen1;
extern SCREEN *screen2;
extern SCREEN *screen3;
extern SCREEN *screen4;
/********************************************************************************
		external memory
*********************************************************************************/

extern Lights0 	light[];
extern Pixmap	*depth_buffer;
extern unsigned short 	cfb_16_a[];
extern unsigned short 	cfb_16_b[];
extern unsigned short 	cfb_16_c[];
extern unsigned short 	depthbuffer[];
extern unsigned short 	startex[];

extern SegmentRecord segment_memory[];
extern uint segmentTable[NUM_SEGMENTS];			/* segment address table		*/

extern float sin_table[];
extern float cos_table[];
extern short atn_table[];

extern unsigned char  ken_data[2][2][0x1000*8];
extern unsigned char  mk[2][2][0x920*8];       
extern unsigned short col[2][4][0x100*8];      


//
extern Controller controller[];
extern Controller *cont1P;
extern Controller *cont2P;
extern Controller *cont3P;
extern Controller *cont4P;
extern Controller *contOR;
extern Controller *contGhost;
//
extern FACE    *face_buffer;	
extern ushort  *collision_table;
extern COLLI   collision_grid[32*32];	  //collisiion GRID is 16x16

extern Dynamic	dynamic[];

extern Gfx 	rspinit_dl[];
extern Gfx 	rdpinit_dl[];
extern Gfx 	clear_screen_dl[];

extern Gfx 	shape_flat[];
extern Gfx 	shape_star[];
extern Gfx 	shape_cube[];
extern Gfx 	shape_marioface_3[];

extern Gfx 	gfx_course1[];
extern Gfx 	gfx_course2[];
extern Gfx 	gfx_course3[];
extern Gfx 	gfx_course4[];
extern Gfx 	gfx_course5[];
extern Gfx 	gfx_course6[];
extern Gfx 	gfx_course7[];
extern Gfx 	gfx_course8[];
extern Gfx 	gfx_town[];



extern unsigned short test_area[] ;
extern unsigned short course1_txt[] ;
extern unsigned short course2_txt[] ;
extern unsigned short course3_txt[] ;
extern unsigned short course4_txt[] ;
extern unsigned short course5_txt[] ;
extern unsigned short course6_txt[] ;
extern unsigned short course7_txt[] ;
extern unsigned short course8_txt[] ;

/* Symbol genererated by "makerom" to indicate the end of the code segment		*/
/* in virtual (and physical) memory 											*/

extern char _codeSegmentStart[];
extern char _codeSegmentEnd[];

extern char _mkcodeSegmentRomEnd[];
extern char _mkcodeSegmentRomStart[];

extern char _excodeSegmentRomEnd[];
extern char _excodeSegmentRomStart[];

extern char _RESULTSegmentRomStart[], _RESULTSegmentRomEnd[];
extern char _LOGOSegmentRomStart[], _LOGOSegmentRomEnd[];

/* Symbols generated by "makerom" to tell us where the static segment is in ROM. */

extern char _staticSegmentRomStart[], _staticSegmentRomEnd[];
extern char _logoSegmentRomStart[],   _logoSegmentRomEnd[];
extern char _zbufferSegmentEnd[];
//   main.c
extern int		framerate;
extern int total_cpu_time ;
extern int total_rcp_time ;
extern short	    frameCounter ;		/* game frame counter						*/
extern short        videoframe   ;
extern short        videoframecopy  ;
extern float        timer;

extern int          race_control_mode ;
extern float	    countdowncounter;

extern ushort  	    replay_flag;		//0=stop 1=move
extern ushort  	    retry_flag;			//0=nomal 1=retry
extern ushort  	    time_flag;			//0=stop 1=move
extern ushort  	    display_flag;		//0=near 1=far
extern ushort  	    demo_flag;	
extern ushort  	    debug_flag;	
extern float        racetimer;
extern int	    frame_counter;				/* game frame counter						*/
extern float	    screen_view_angle[4];				/* game frame counter						*/
extern float	    screen_width;				/* game frame counter						*/
extern float	    screen_height;				/* game frame counter						*/
extern float	    screen_aspect;				/* game frame counter						*/
extern float	    screen_far_point;				/* game frame counter						*/
extern float	    screen_near_point;				/* game frame counter						*/
extern short        horizon_line;
extern float        waterlevel;
extern float        watervelocity;

extern OSContStatus sdata[MAXCONTROLLERS];
extern OSContPad    rdata[MAXCONTROLLERS];

/********************************************************************************
 *
 *	Function prototypes
 *
 ********************************************************************************/

///////////////////////////////////main.c//////////////////////////////////////////
extern float screen_angle;
extern float screen_aspet;
extern float gravity;

extern int win_kart;
extern ushort disp_frame;
extern ushort draw_frame;
extern int sequence_mode;
extern int race_clear_flag;
extern int new_sequence_mode;
extern int next_sequence_mode;
extern int screen_mode;
extern int race_screen_mode;
extern int race_mode;
extern int controller_mode;
extern int player_number;
extern int             game_mode;
extern int             cup_level;
extern int             cup_number;
extern int             race_level;


extern void  read_controller(void);

extern void initial_race_sequence(void);

extern void InitRDP(void);
extern void InitRSP(void);
extern void clear_framebuffer(void);
extern void clear_zbuffer(void);
extern void clear_zbuffer2(SCREEN *screen);

extern float democamerax;
extern float democameray;
extern float democameraz;

extern ushort camera_point; 
extern ushort camera_point1;
extern ushort camera_point2;
extern ushort camera_point3;
extern ushort camera_point4;
/////////////////////////////////math.c////////////////////////////////////////
extern void copy_affine(AffineMtx source,AffineMtx object);
extern void set_up_vector(CAR *car);
extern float atanf(float);
extern float atan2f(float,float);
extern float asinf(float);
extern float acosf(float);

extern CAR *mykart1;
extern CAR *mykart2;
extern CAR *mykart3;
extern CAR *mykart4;

extern CAR *kart1; 
extern CAR *kart2; 
extern CAR *kart3; 
extern CAR *kart4; 
extern CAR *kart5; 
extern CAR *kart6; 
extern CAR *kart7; 
extern CAR *kart8; 

extern float distance_buffer[28];
extern short rank_buffer[8];
extern int distance_pointer;
/////////////////////////////////drive.c////////////////////////////////////////
/*unsigned char *wincount2P
unsigned char *wincount3P
unsigned char *wincount4P
  */
/*extern unsigned char wincount2p[2];  
extern unsigned char wincount3p[3][3];
extern unsigned char wincount4p[4][3];
extern unsigned char battlewincount2p[2];
extern unsigned char battlewincount3p[3];
extern unsigned char battlewincount4p[4];
*/
extern unsigned char *wincount2p;  
extern unsigned char *wincount3p;  
extern unsigned char *wincount4p;  
  
extern unsigned char *battlewincount2p;
extern unsigned char *battlewincount3p;
extern unsigned char *battlewincount4p;




extern void goto_title(void);
extern void goto_gameselect(void);
extern void goto_kartselect(void);
extern void goto_mapselect(void);
extern void goto_racing(void);

extern float   goalintime[8];
extern void  list_vertex(uint offset,int counter);

extern ushort finish_zoom_flag;
extern ushort keystock_status;
extern ushort keystock_pointer;
extern uint keystock_buffer[];
extern void key_data_control(void);
extern void start_racing(void);
extern int finish_count;
extern ushort pause_flag;
extern void check_point(CAR *car,uint address);
extern ushort initial_point(uint address);
extern void race_control(void);
extern void enemy_control(void);
extern void collision_kart_to_kart(void);
extern void initial_rank(void);
extern void pause_sequence(void);
extern void drive_enemy_kart(int num);
extern void call_next_sequence(int next);
/////////////////////////////////memory.c////////////////////////////////////////
extern unsigned int segmentTable[];			/* segment address table		*/
//////////////////////////////////course.c//////////////////////////////////////////////
extern void display_map(SCREEN *screen);
extern void display_map2(SCREEN *screen,int mode);
extern short disp_point;
extern ushort  face_pointer;
extern ushort  collision_pointer;
extern int screen_flip;
extern float screen_stretch;

//////////////////////////////////draw.c//////////////////////////////////////////////
/* drawing oparations */
extern void set_viewport(SCREEN *screen);

extern void     *cfb_ptrs[3];
extern void get_framebuffer(int,int,int,int,ushort *,ushort *);
extern void bitmap_control(void);
extern void initial_screen_data(void);
extern void fadeout_sequence(void);
extern float check_waterlevel(CAR *kart);


extern Vp vp;
extern void make_border(void);

extern ushort   volume_culling_flag;
extern ushort   lighting_flag;
extern ushort   fadeout_flag;
extern ushort   fadeout_count;
extern ushort fog_flag;
extern int  fog_red;
extern int  fog_green;
extern int  fog_blue;
extern int  back_red;
extern int  back_green;
extern int  back_blue;
extern int     framex;
extern int     framey;	
extern int     screen_counter;	

extern ushort two_d_flag;
extern ushort clear_cfb_flag;
extern ushort background_flag;
extern void begin_drawing(void);
extern int  end_drawing(void);
extern void draw_full_screen(void);
extern void draw_right_left_common(void);
extern void draw_right_screen(void);
extern void draw_left_screen(void);
extern void draw_up_down_common(void);
extern void draw_up_screen(void);
extern void draw_down_screen(void);
extern void draw_four_parts_common(void);
extern void draw_up_right_screen(void);
extern void draw_up_left_screen(void);
extern void draw_down_right_screen(void);
extern void draw_down_left_screen(void);
extern void setup_perspective(void);
extern void initial_perspective(void);
extern void initial_draw_common(void);
///////////////////player.c/////////////////////////////////////////////
extern void initial_game(void);
///////////////////title.c/////////////////////////////////////////////
extern void title_sequence(void);
extern void mapselect_sequence(void);
extern void kartselect_sequence(void);
extern void gameselect_sequence(void);
///////////////////print.c/////////////////////////////////////////////
extern unsigned short	fade_switch ;
extern void test_tire(CAR *);
//////////////////object.c//////////////////////////////////////////
extern void  initial_special_itembox(float px,float py,float pz);
extern float flagpos[3];
extern ITEMBOX itembox_buffer[];
extern void initial_itembox(void);
extern short put_banana(CAR *car);
extern void  kill_object(OBJECT *obj);
//////////////////item.c//////////////////////////////////////////
extern void bump_object(OBJECT *obj);

//////////////////time.c///////////////////////////////////////////
extern void  SetGraphCPUTime(int num);
extern void  SetAudioCPUTime(void);
extern void  SetGraphRCPTime(int num);
extern void  SetAudioRCPTime(void);

extern void  DisplayProcTime(void);
extern int disptime_flag;
/////////////////////////////////initial.c////////////////////////////////////////
extern void initialize_first_once(void);
extern void initialize_sequence(void);
extern uint   report;
extern float  report2;
extern short    item_set_flag;		//0=NO SET 1=SET


/////////////////////////////////democamera.c////////////////////////////////////////
extern void finish_camera(void);
/////////////////////////////////ghost.c////////////////////////////////////////

extern short ghostcounter;
extern GHOSTDATA ghostbuffer1[];
extern GHOSTDATA ghostbuffer2[];
extern GHOSTSAVEDATA ghostsavebuffer[];
extern void read_ghost_data(void);
extern void write_ghost_data(void);
extern void initial_ghost(void);

extern float ghosttime[];      //SAVE GHOST TIME!!!!
extern short ghostrank[];
extern short ghostcharacter[];
extern GHOSTDATA  *ghost_best_pointer;
extern GHOSTDATA  *ghost_save_pointer;

extern void slidec1(unsigned char *,unsigned char *);


extern Gfx kt4_model[];

extern OSMesgQueue  intMesgQueue;
extern OSMesg       intMesgBuf[NUM_MESSAGE];

extern long long int	gspFast3DQ_fifoTextStart[], gspFast3DQ_fifoTextEnd[];
extern long long int	gspFast3DQ_fifoDataStart[], gspFast3DQ_fifoDataEnd[];

extern long long int	gspF3DEX_fifoTextStart[], gspF3DEX_fifoTextEnd[];
extern long long int	gspF3DEX_fifoDataStart[], gspF3DEX_fifoDataEnd[];

extern long long int	gspF3DLX_fifoTextStart[], gspF3DLX_fifoTextEnd[];
extern long long int	gspF3DLX_fifoDataStart[], gspF3DLX_fifoDataEnd[];

/*    mktatic.c   */
extern Gfx surf_on[];
extern Gfx texedge_on[];
extern Gfx fog_on_surf[];
extern Gfx fog_on_texedge[];
extern Gfx fog_off[];

/* 10/12  object.c */
extern ushort static_object_count;
/* 10/15  course.c */
extern void map_strategy(void);
/* 10/15  math.c */
extern void set_matrix_push(AffineMtx affine);

/* 10/16  main.c */
extern void init_mkcode(void);
extern void InitializeSystemWorks(void);

/*10/17   memory.c */
extern MemPtr load_press_data(char *romstart,char *romend);
extern void make_collision(void);

/*10/21   initial.c &drive.c*/
extern uint   ghost_message_flag;
/*10/24   */
extern	Gfx gfx_suimen[];
/*10/25   */
extern void  kill_displaylist(uint pointer);
extern void  ending_sequence(void);
extern void  initial_ending_sequence(void);
extern short ending_map_number;

/*10/26 */
extern void deley_initial_map(void);
extern void save_key_status(void);
extern void load_key_status(void);

/*10/28 */
extern ushort ending_counter;
extern void  clean_up_banana(OBJECT *obj2);
/*10/29 */
extern unsigned char *savebuffer;
extern ushort   volume_togle;
extern void set_music_volume(void);
/*10/30 */
/*math.c*/
extern ushort check_bump_2(BUMP *bump,float radius,float px,float py,float pz, float lastx,float lasty,float lastz);
/*map.c*/
extern void calc_bump_velocity(BUMP *bump,FVector velocity);
/*10/31  */
extern ushort check_tire_2(CAR *car,Tire *tire,float oldx,float oldy,float oldz);
/*11/01  */
extern void initial_ending_map(void);

/*11/02  */
extern float flip_value;
/*11/05  */
extern void display_object(SCREEN *screen);
extern void display_object2(SCREEN *screen);

extern uint  vertex_buffer2[32];
extern short shadowface;
extern short outsideface;
extern void  initial_map2(void);

/*11/06  */
extern AffineMtx matrix_data[4];
extern int calc_display_position(SCREEN *screen,FVector position,float x,float y);
/*11/07  */
extern void  reset_jungle_tree(void);
extern void  check_jungle_tree_collision(void);
extern int  collision_cylinder(CAR *car,FVector position,float radius,float hight,float param);

/*11/08  */
extern short    dead_control;
/*11/09  */
extern void   percial_DMA(unsigned char *ramaddress,char *romaddress,uint size);
/*11/10  */
extern ushort kame_counter;
/*11/11  */
extern ushort ushi_counter;
extern ushort ushi_pointer;
extern FVector ushi_position;
extern float old_ushi_distance;
/*test*/
extern long  checkmatrix[4][4];
/*11/13  */
extern Gfx load_truck1[];
extern Gfx load_truck2[];
extern Gfx load_truck3[];

extern Gfx load_wheel[];
extern void check_object_se(OBJECT *obj);

extern ushort check_2p_GP;
extern void take_snapshot15(void);
extern void take_snapshot9(void);

extern void  initial_bump_kart(int);

/*==============================================================================*/
/* END END END END END END END END END END END END END END END END END END END  */
/*==============================================================================*/
