/*============================================================================ 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; }