hitchk.c 5.91 KB
/*============================================================================
  NuSYSTEM サンプルプログラム「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[];

/*--------------------------------------*/
/*  ヘッドと壁との当り判定		*/
/*  IN:	PadNum プレイヤーナンバー	*/
/*  RET:なし				*/
/*--------------------------------------*/
void
Snake2Wall(int PadNum)
{
    float SnakeX,SnakeY;

    /* 自機のポジション取得 */
    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){
	/* マップの内側だったら */
	Snake.wallhit[PadNum] = 0;
    }else{
	/* マップの外側だったら */
	Snake.wallhit[PadNum] = 1;
    }
}


/*----------------------------------------------*/
/*  ヘッドとマップオブジェクトとの当り判定	*/
/*  IN:	PadNum プレイヤーナンバー		*/
/*  RET:なし					*/
/*----------------------------------------------*/
void
Snake2Obj(int PadNum)
{
    int idx;
    float SnakeX,SnakeY;
    float ObjX,ObjY;

    /* 自機のポジション取得 */
    SnakeX = Snake.pos_x[PadNum][0];
    SnakeY = Snake.pos_y[PadNum][0];

    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){
	    /* オブジェクトに当ったら、オブジェクト番号を返す */
	    Snake.objhit[PadNum] = idx;
	    break;
	}else{
	    /* オブジェクトに当たらなかったら */
	    Snake.objhit[PadNum] = -1;
	}
    }
}

/*-----------------------------------------------------------------------------
  ヘッドと敵との当り判定
  -----------------------------------------------------------------------------*/
void
Snake2Enemy(int PadNum)
{
    int idx;
    float SnakeX,SnakeY;
    float EnemyX,EnemyY;

    /* 自機のポジション取得 */
    SnakeX = Snake.pos_x[PadNum][0];
    SnakeY = Snake.pos_y[PadNum][0];

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

	/* 敵のポジション取得 */
	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){
	    /* 敵と当ったら、敵の番号を返す */
	    Snake.enemyhit[PadNum] = idx;
	    break;
	}else{
	    /* 敵に当ってなかったら */
	    Snake.enemyhit[PadNum] = -1;
	}
    }
}


/*-----------------------------------------------------------------------------
  打ち出したテイルと壁との当り判定
  -----------------------------------------------------------------------------*/
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){
	/* マップの内側だったら */
	return(0);
    }else{
	/* マップの外側だったら */
	return(1);
    }
}


/*-----------------------------------------------------------------------------
  打ち出したテイルと障害物との当り判定
  -----------------------------------------------------------------------------*/
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){
	    /* オブジェクトに当ったら、オブジェクト番号を返す */
	    return(idx);
	}
    }
    /* オブジェクトに当たらなかったら */
    return(-1);
}


/*-----------------------------------------------------------------------------
  自機と打ち出されたテイルとの当り判定
  -----------------------------------------------------------------------------*/
void
Snake2ShotTail(int PadNum)
{
    int idx;
    float SnakeX,SnakeY;
    float TailX,TailY;

    /* 自機のポジション取得 */
    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;
}

/*-----------------------------------------------------------------------------
  自機と敵のテイルとの当り判定
  -----------------------------------------------------------------------------*/
void
Snake2EnemyTail(int PadNum)
{
    int idx, idx2;
    float SnakeX,SnakeY;
    float TailX,TailY;

    /* 自機のポジション取得 */
    SnakeX = Snake.pos_x[PadNum][0];
    SnakeY = Snake.pos_y[PadNum][0];

    for(idx = 0; idx < 4; idx++){
	if(idx == PadNum)
	  continue;
	/*つながってるテイルの分だけチェックする*/
	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;
}