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

      hitchk.c

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

    #include <assert.h>
    #include <nusys.h>

    #include "graphic.h"
    /*--------------------------
      extern
      --------------------------*/
    extern SnakePara Snake;
    extern float ObjPosTbl[OBJ_MAX][3];
    extern ShotTail mtx_shot[];

    /*--------------------------------------*/
    /*  Collision detection between the head and wall		*/
    /*  IN:	PadNum The player number	*/
    /*  RET:None				*/
    /*--------------------------------------*/
    void
    Snake2Wall(int PadNum)
    {
        float SnakeX,SnakeY;

        /* Get the position of the self-machine */
        SnakeX = Snake.pos_x[PadNum][0];
        SnakeY = Snake.pos_y[PadNum][0];

        if(-BASE_MAX_SIZE+50 <= SnakeX && BASE_MAX_SIZE-50 >= SnakeX &&
           -BASE_MAX_SIZE+50 <= SnakeY && BASE_MAX_SIZE-50 >= SnakeY){
    	/* If it is inside of the map */
    	Snake.wallhit[PadNum] = 0;
        }else{
    	/* If it is outside of the map */
    	Snake.wallhit[PadNum] = 1;
        }
    }

    /*----------------------------------------------*/
    /*  Collision detection between the head and map object	*/
    /*  IN:	PadNum The player number		*/
    /*  RET:None					*/
    /*----------------------------------------------*/
    void
    Snake2Obj(int PadNum)
    {
        int idx;
        float SnakeX,SnakeY;
        float ObjX,ObjY;

        /* Get the position of the self-machine */
        SnakeX = Snake.pos_x[PadNum][0];
        SnakeY = Snake.pos_y[PadNum][0];

        for(idx = 0; idx < OBJ_MAX-1; idx++){
    	/* Get the position of the map object */
    	ObjX = ObjPosTbl[idx][0];
    	ObjY = ObjPosTbl[idx][1];

    	if( ObjX - OBJ_SIZE*OBJ_SCALE <= SnakeX && ObjX + OBJ_SIZE*OBJ_SCALE >= SnakeX &&
    	   ObjY - OBJ_SIZE*OBJ_SCALE <= SnakeY && ObjY + OBJ_SIZE*OBJ_SCALE >= SnakeY){
    	    /* If it hits the object, retern the object number */
    	    Snake.objhit[PadNum] = idx;
    	    break;
    	}else{
    	    /* If it doesn't hit the object */
    	    Snake.objhit[PadNum] = -1;
    	}
        }
    }

    /*-----------------------------------------------------------------------------
      Collision detection between the head and enemy
      -----------------------------------------------------------------------------*/
    void
    Snake2Enemy(int PadNum)
    {
        int idx;
        float SnakeX,SnakeY;
        float EnemyX,EnemyY;

        /* Get the position of the self-machine */
        SnakeX = Snake.pos_x[PadNum][0];
        SnakeY = Snake.pos_y[PadNum][0];

        for(idx = 0; idx < 4; idx++){
    	if(idx == PadNum){
    	    continue;
    	}

    	/* Get the position of enemy */
    	EnemyX = Snake.pos_x[idx][0];
    	EnemyY = Snake.pos_y[idx][0];

    	if( EnemyX - OBJ_SIZE*OBJ_SCALE <= SnakeX && EnemyX + OBJ_SIZE*OBJ_SCALE >= SnakeX &&
    	   EnemyY - OBJ_SIZE*OBJ_SCALE <= SnakeY && EnemyY + OBJ_SIZE*OBJ_SCALE >= SnakeY){
    	    /* If it hits enemy, return the enemy's number */
    	    Snake.enemyhit[PadNum] = idx;
    	    break;
    	}else{
    	    /* If it hasn't hit the enemy */
    	    Snake.enemyhit[PadNum] = -1;
    	}
        }
    }

    /*-----------------------------------------------------------------------------
      Collision detection between the shot tail and the wall
      -----------------------------------------------------------------------------*/
    int
    ShotTail2Wall( float SnakeX, float SnakeY )
    {
        if(-BASE_MAX_SIZE+50 <= SnakeX && BASE_MAX_SIZE-50 >= SnakeX &&
           -BASE_MAX_SIZE+50 <= SnakeY && BASE_MAX_SIZE-50 >= SnakeY){
    	/* If it is inside of the map */
    	return(0);
        }else{
    	/* If it is outside of the map */
    	return(1);
        }
    }

    /*-----------------------------------------------------------------------------
      Collision detection between the shot tail and the obstacle
      -----------------------------------------------------------------------------*/
    int
    ShotTail2Obj( float SnakeX, float SnakeY)
    {
        int idx;
        float ObjX,ObjY;

        for(idx = 0; idx < OBJ_MAX-1; idx++){
    	ObjX = ObjPosTbl[idx][0];
    	ObjY = ObjPosTbl[idx][1];
    	if( ObjX - OBJ_SIZE*OBJ_SCALE <= SnakeX && ObjX + OBJ_SIZE*OBJ_SCALE >= SnakeX &&
    	   ObjY - OBJ_SIZE*OBJ_SCALE <= SnakeY && ObjY + OBJ_SIZE*OBJ_SCALE >= SnakeY){
    	    /* If it hits the object, return the object's number */
    	    return(idx);
    	}
        }
        /* If it doesn't hit the object */
        return(-1);
    }

    /*-----------------------------------------------------------------------------
      Collision detection between the self-machine and the shot tail
      -----------------------------------------------------------------------------*/
    void
    Snake2ShotTail(int PadNum)
    {
        int idx;
        float SnakeX,SnakeY;
        float TailX,TailY;

        /* Get the position of the self-machine */
        SnakeX = Snake.pos_x[PadNum][0];
        SnakeY = Snake.pos_y[PadNum][0];

        for(idx = 0; idx < 20; idx++){
    	if(mtx_shot[idx].tail_pattern == -1){
    	    continue;
    	}
    	TailX = mtx_shot[idx].pos_x;
    	TailY = mtx_shot[idx].pos_y;

    	if( TailX - TAIL_SIZE <= SnakeX && TailX + TAIL_SIZE >= SnakeX &&
    	   TailY - TAIL_SIZE <= SnakeY && TailY + TAIL_SIZE >= SnakeY){
    	    if(mtx_shot[idx].status == TAIL_WAITING){
    		Snake.shottailhit[PadNum] = idx;
    		return;
    	    }
    	    if(mtx_shot[idx].status == TAIL_MOVING && mtx_shot[idx].user != PadNum){
    		Snake.sleepcnt[PadNum] = MAX_SLEEP;
    	    }

    	}
        }
        Snake.shottailhit[PadNum] = -1;
    }

    /*-----------------------------------------------------------------------------
      Collision detection between the self-machine and the enemy's tail
      -----------------------------------------------------------------------------*/
    void
    Snake2EnemyTail(int PadNum)
    {
        int idx, idx2;
        float SnakeX,SnakeY;
        float TailX,TailY;

        /* Get the position of the self-machine */
        SnakeX = Snake.pos_x[PadNum][0];
        SnakeY = Snake.pos_y[PadNum][0];

        for(idx = 0; idx < 4; idx++){
    	if(idx == PadNum)
    	  continue;
    	/*Check for connecting tails*/
    	for(idx2 = 1; idx2 < Snake.tailcnt[idx]+1; idx2++){
    	    if(Snake.tail_attr[idx][idx2] == -1){
    		break;
    	    }
    	    TailX = Snake.pos_x[idx][idx2];
    	    TailY = Snake.pos_y[idx][idx2];

    	    if( TailX - TAIL_SIZE <= SnakeX && TailX + TAIL_SIZE >= SnakeX &&
    	       TailY - TAIL_SIZE <= SnakeY && TailY + TAIL_SIZE >= SnakeY){
    		Snake.enemytailhit[PadNum] = idx;
    		Snake.enemytailhitnum[PadNum] = idx2;
    		return;
    	    }
    	}
        }
        Snake.enemytailhit[PadNum] = -1;
        Snake.enemytailhitnum[PadNum] = -1;
    }