/******************************************************************************
	encrsedit.h
******************************************************************************/

#ifndef ENCRSEDIT_H
#define ENCRSEDIT_H

/******************************************************************************
	define constants
******************************************************************************/

#define EDSCR_MAX	4096

#define GRID_STEP	1000

#define HOST_BUF_SIZE	256

#define NOF_SCR_MAG	5
#define SCR_MAG_NORM	(.075F)

/*---------------------------------------------------------------------------*/
#define EDIT_CRS_MAX	9

/*---------------------------------------------------------------------------*/
#define CURSOR_SPEED		2
#define CURSOR_SPEED_3D		3

/*---------------------------------------------------------------------------*/
#define NO_OBJ		-1

/*---------------------------------------------------------------------------*/
#define EDIT_MSG_TIME	60

/*---------------------------------------------------------------------------*/
#define EDSCR_LEFT	(-SCREEN_CH + 48)
#define EDSCR_RIGHT	( SCREEN_CH - 48 - 1)
#define EDSCR_TOP	(-SCREEN_CV + 48)
#define EDSCR_BOTTOM	( SCREEN_CV - 48 - 1)

/*---------------------------------------------------------------------------*/
#define ED_MODE_PUT	0
#define ED_MODE_DRAG	1
#define ED_MODE_CON	2
#define ED_MODE_ROT	3

/*---------------------------------------------------------------------------*/
#define ED_SUB_MENU	8

#define SUB_MENU_GAME	0
#define SUB_MENU_SCALE	1
#define SUB_MENU_SHIFT	2
#define SUB_MENU_MODIFY	3
#define SUB_MENU_SAVE	4
#define SUB_MENU_LOAD	5
#define SUB_MENU_TEST	6
#define SUB_MENU_CLEAR	7

/*---------------------------------------------------------------------------*/
#define OBJ_MENU_BUOY_NUM	32
#define OBJ_MENU_SX		8
#define OBJ_MENU_SY		5

/*---------------------------------------------------------------------------*/
/* buoy */

enum {
	ED_BUOY_KD_RIGHT = 0,
	ED_BUOY_KD_LEFT	,
	ED_BUOY_KD_CHECK,
	ED_BUOY_KD_GOAL	,
	
	ED_BUOY_KD_TURN_R,
	ED_BUOY_KD_TURN_L,

	ED_BUOY_KD_PL_R	,
	ED_BUOY_KD_PL_L	,
	ED_BUOY_KD_PL_C	,

	ED_BUOY_KD_EN_R	,
	ED_BUOY_KD_EN_L	,
	ED_BUOY_KD_EN_C	,
	ED_BUOY_KD_EN_R1,
	ED_BUOY_KD_EN_L1,
	ED_BUOY_KD_EN_C1,
	ED_BUOY_KD_EN_R2,
	ED_BUOY_KD_EN_L2,
	ED_BUOY_KD_EN_C2,
	ED_BUOY_KD_EN_R3,
	ED_BUOY_KD_EN_L3,
	ED_BUOY_KD_EN_C3,
	ED_BUOY_KD_EN_R4,
	ED_BUOY_KD_EN_L4,
	ED_BUOY_KD_EN_C4,

	ED_BUOY_KD_FORK_S,
	ED_BUOY_KD_JOIN,

	ED_BUOY_KD_THR	,
	ED_BUOY_KD_THR_C,

	ED_BUOY_KD_WARP	,

	ED_BUOY_KD_ST1	,
	ED_BUOY_KD_ST2	,
	ED_BUOY_KD_ST3	,
	ED_BUOY_KD_ST4	,

	ED_BUOY_KD_GUI	,
	ED_BUOY_KD_FORK
};

/*---------------------------------------------------------------------------*/
/* crsobj */

enum {
	ED_CRSOBJ_KD_JUMP,
	ED_CRSOBJ_KD_JUMP2,
	ED_CRSOBJ_KD_WGEN,
	ED_CRSOBJ_KD_WGEN2,
	ED_CRSOBJ_KD_START,
	ED_CRSOBJ_KD_OBSTACLE,
	ED_CRSOBJ_KD_OBSTACLE2,
	ED_CRSOBJ_KD_XPA,
	ED_CRSOBJ_KD_CRSBUOY,
	ED_CRSOBJ_KD_RING,
	ED_CRSOBJ_KD_PNTBUOY
};

/******************************************************************************
 	structures
******************************************************************************/
typedef struct {
	float	px, pz;		/* pos */
	short	type;		/* kind */
	short	c1,c2;		/* child index */
	float	ag;
} Edbuoy;

typedef struct {
	float	px, py, pz;	/* pos */
	float	ag;		/* angle */
	int	kd;		/* kind */
	int	tp;		/* type */
	int	no;		/* number */
} Edcrsobj;

typedef struct {
	Gfx	glist[4096];

	Mtx	mtx_ortho;
	Mtx	mtx_ortho2;
	Mtx	mtx_persp;
	Mtx	mtx_lookat;
	Mtx	mtx_model[96];					/* 6144 */

	Vtx	vtx_edbuoy[BUOY_MAX * 4];			/* 4096 */
	Vtx	vtx_edcrsline[BUOY_MAX * 3];			/* 3072 */
	Vtx	vtx_edcrsobj[CRSOBJ_MAX * 4];			/* 4096 */
	Vtx	vtx_edworldedge[16];				/*  256 */
} Editdynamic;

/******************************************************************************
	external variables
******************************************************************************/
extern int	fedit_game;
extern int	fedit_exit;		/* exit flag */
extern int	fedit_demo;
extern int	fedit_sca;
extern int	fedit_rev;
extern int	fedit_copy;
extern int	fedit_dif;
extern int	edit_ncourse;

extern Editdynamic	*peditdynamic;

/******************************************************************************
	external functions
******************************************************************************/
extern void InitCrsEdit(void);
extern void CrsEditMain(void);
extern void DrawCrsEdit(Gfx **ppgfx);

#endif
