hitchk.c
5.91 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
/*============================================================================
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;
}