    /*============================================================================
      NuSYSTEM sample program SNAKE TAIL HACK

      graphic.h

      Copyright (C) 1997, NINTENDO Co,Ltd.
      ============================================================================*/

    #ifndef _GRAPHIC_H_
    #define _GRAPHIC_H_
    #include "para.h"

    /* The screen size */
    #define SCREEN_HT        240
    #define SCREEN_WD        320

    /* The maximum length of the display list of one task */
    #define GFX_GLIST_LEN     2048*10

    /* The maximum value of the graphic task in 1 retrace period */
    #define GFX_GTASK_NUM        2

    /*-------------------------- define structure ------------------------------ */
    /* The projection-matrix structure */
    typedef struct {
      Mtx     projection;
      Mtx     modeling;
      Mtx     viewing;

      Mtx     base_trans;
      Mtx     base_rotate;
      Mtx     base_scale;

      Mtx     saku_trans;
      Mtx     saku_rotate;
      Mtx     saku_scale;

      Mtx     obj_trans[OBJ_MAX];
      Mtx     obj_rotate[OBJ_MAX];
      Mtx     obj_scale[OBJ_MAX];

      Mtx     snake_trans[SNAKE_MAX][SNAKE_MAX_LEN+1];
      Mtx     snake_rotate[SNAKE_MAX][SNAKE_MAX_LEN+1];
      Mtx     snake_scale[SNAKE_MAX][SNAKE_MAX_LEN+1];

      Mtx     shot_trans[20];
      Mtx     shot_rotate[20];
      Mtx     shot_scale[20];

      /* The buffer for movie drawing */
      unsigned short MovieBuf[8200];
    } Dynamic;

    /* Various parameters of the self-machine */
    typedef struct {
        int tailcnt[SNAKE_MAX];	/*The number of tails connected to the self-machine*/
        int wallhit[SNAKE_MAX];	/*Whether or not the self-machine is within the range of the map*/
        int objhit[SNAKE_MAX];	/*Whether or not the self-machine is within the range of the map*/
        int shottailhit[SNAKE_MAX];	/*Whether or not the tail shot by the enemy has hit self*/
        int enemyhit[SNAKE_MAX];	/*Whether or not the self-machine has hit the enemy*/
        int bufidx[SNAKE_MAX];	/*The index of the buffer which is for that the tail chases the locus of the self-machine*/
        int bufidx_wk[SNAKE_MAX];	/*Work for the calculation of ^ */
        int stickon[SNAKE_MAX];	/*Whether or not the control stick is pulled down*/
        float head_dir[SNAKE_MAX];	/*The head direction of the self-machine*/
        int sleepcnt[SNAKE_MAX];	/*The fainting time (the V-unit)*/

        int enemytailhit[SNAKE_MAX];	/*Whether or not it has hit the opponent's tail*/
        int enemytailhitnum[SNAKE_MAX];	/*The opponent's tail number when it has hit the opponent's tail*/

        int tail_attr[SNAKE_MAX][SNAKE_MAX_LEN+1];	/*The type of the displaying tail*/

        float pos_x[SNAKE_MAX][SNAKE_MAX_LEN+1];	/*The displaying X-coordinate*/
        float pos_y[SNAKE_MAX][SNAKE_MAX_LEN+1];	/*The displaying Y-coordinate*/
        float pos_z[SNAKE_MAX][SNAKE_MAX_LEN+1];	/*The displaying Z-coordinate*/

        float rot_x[SNAKE_MAX][SNAKE_MAX_LEN+1];	/*The rotational angle of the displaying X-axis direction*/
        float rot_y[SNAKE_MAX][SNAKE_MAX_LEN+1];	/*The rotational angle of the displaying Y-axis direction*/
        float rot_z[SNAKE_MAX][SNAKE_MAX_LEN+1];	/*The rotational angle of the displaying Z-axis direction*/

        float size_x[SNAKE_MAX][SNAKE_MAX_LEN+1];	/*The scale of the displaying X-axis direction*/
        float size_y[SNAKE_MAX][SNAKE_MAX_LEN+1];	/*The scale of the displaying Y-axis direction*/
        float size_z[SNAKE_MAX][SNAKE_MAX_LEN+1];	/*The scale of the displaying Z-axis direction*/
    } SnakePara;

    /* The parameter of the tail for shooting */
    typedef struct{
        float pos_x;	/*The X-coordinate*/
        float pos_y;	/*The Y-coordinate*/
        float pos_z;	/*The Z-coordinate*/
        float rot_x;	/*The rotational angle of the X-axis direction*/
        float rot_y;	/*The rotational angle of the Y-axis direction*/
        float rot_z;	/*The rotational angle of the Z-axis direction*/
        float size_x;
        float size_y;
        float size_z;
        int tail_pattern;
        int user;
        float tail_dir;
        int status;
    }ShotTail;

    /* The head locus of the self-machine */
    typedef struct{
        float SnakeX[TAIL_MOVE_BUF];
        float SnakeY[TAIL_MOVE_BUF];
        float SnakeRotZ[TAIL_MOVE_BUF];
    }SnakeMove;

    /*-------------------------------- parameter---------------------------------*/
    extern Dynamic gfx_dynamic[];
    extern Gfx* glistp;
    extern Gfx gfx_glist[GFX_GTASK_NUM][GFX_GLIST_LEN];
    extern u32 gfx_gtask_no;
    /*-------------------------------- function ---------------------------------*/
    extern void gfxRCPInit(void);
    extern void gfxClearCfb(void);
    /*------------------------------- other extern define -----------------------*/
    extern Gfx setup_rdpstate[];
    extern Gfx setup_rspstate[];

    #endif /* _GRAPHIC_H_ */