Paper Mario DX
Paper Mario (N64) modding
 
Loading...
Searching...
No Matches
CleftAI.inc.c
Go to the documentation of this file.
1#include "common.h"
2#include "npc.h"
3#include "effects.h"
4
24
25s32 N(CleftAI_CanSeePlayer)(Evt* script, MobileAISettings* aiSettings, EnemyDetectVolume* volume) {
26 Enemy* enemy = script->owner1.enemy;
27 Npc* npc = get_npc_unsafe(enemy->npcID);
28 Camera* camera = &gCameras[gCurrentCamID];
29 f32 playerX, playerZ;
30 f32 angle;
31 s32 seesPlayer = FALSE;
32
33 if (ai_check_player_dist(enemy, 0, aiSettings->alertRadius, aiSettings->alertOffsetDist)) {
34 seesPlayer = TRUE;
35 }
36 if (clamp_angle(get_clamped_angle_diff(camera->curYaw, npc->yaw)) < 180.0) {
37 angle = 90.0f;
38 } else {
39 angle = 270.0f;
40 }
41
42 playerX = gPlayerStatusPtr->pos.x;
43 playerZ = gPlayerStatusPtr->pos.z;
44 if (fabsf(get_clamped_angle_diff(angle, atan2(npc->pos.x, npc->pos.z, playerX, playerZ))) > 75.0) {
45 seesPlayer = FALSE;
46 }
47 if (fabsf(npc->pos.y - gPlayerStatusPtr->pos.y) >= 40.0f) {
48 seesPlayer = FALSE;
49 }
51 seesPlayer = FALSE;
52 }
53 return seesPlayer;
54}
55
56void N(CleftAI_HidingInit)(Evt* script, MobileAISettings* aiSettings, EnemyDetectVolume* volume) {
57 Enemy* enemy = script->owner1.enemy;
58 Npc* npc = get_npc_unsafe(enemy->npcID);
59
61 npc->collisionHeight = 22;
62 npc->collisionDiameter = 24;
63 script->functionTemp[1] = 0;
64 npc->duration = 0;
65 npc->curAnim = enemy->animList[8];
66 script->AI_TEMP_STATE = AI_STATE_CLEFT_HIDING;
67}
68
69void N(CleftAI_Hiding)(Evt* script, MobileAISettings* aiSettings, EnemyDetectVolume* volume) {
70 Enemy* enemy = script->owner1.enemy;
71 Npc* npc = get_npc_unsafe(enemy->npcID);
72 EffectInstance* emoteTemp;
73
74 if (script->functionTemp[1] <= 0) {
75 script->functionTemp[1] = aiSettings->playerSearchInterval;
76 if (basic_ai_check_player_dist(volume, enemy, aiSettings->alertRadius * 0.85, aiSettings->alertOffsetDist, FALSE)) {
77 npc->curAnim = enemy->animList[9];
78 fx_emote(EMOTE_EXCLAMATION, npc, 0.0f, npc->collisionHeight, 1.0f, 2.0f, -20.0f, 15, &emoteTemp);
80 npc->duration = 12;
81 script->AI_TEMP_STATE = AI_STATE_CLEFT_PRE_AMBUSH;
82 }
83 }
84
85 script->functionTemp[1]--;
86}
87
88void N(CleftAI_PreAmbush)(Evt* script, MobileAISettings* aiSettings, EnemyDetectVolume* volume) {
89 Enemy* enemy = script->owner1.enemy;
90 Npc* npc = get_npc_unsafe(enemy->npcID);
91
92 npc->duration--;
93 if (npc->duration <= 0) {
94 npc->yaw = atan2(npc->pos.x, npc->pos.z, gPlayerStatusPtr->pos.x, gPlayerStatusPtr->pos.z);
96 npc->curAnim = enemy->animList[10];
97 npc->duration = 8;
98 script->AI_TEMP_STATE = AI_STATE_CLEFT_AMBUSH;
99 }
100}
101
102void N(CleftAI_Ambush)(Evt* script, MobileAISettings* aiSettings, EnemyDetectVolume* volume) {
103 Npc* npc = get_npc_unsafe(script->owner1.enemy->npcID);
104
105 npc->duration--;
106 if (npc->duration <= 0) {
107 npc->yaw = atan2(npc->pos.x, npc->pos.z, gPlayerStatusPtr->pos.x, gPlayerStatusPtr->pos.z);
108 npc->collisionHeight = 26;
109 npc->collisionDiameter = 24;
110 script->AI_TEMP_STATE = AI_STATE_CLEFT_FIND_PLAYER_INIT;
111 }
112}
113
114void N(CleftAI_FindPlayerInit)(Evt* script, MobileAISettings* aiSettings, EnemyDetectVolume* volume) {
115 Enemy* enemy = script->owner1.enemy;
116 Npc* npc = get_npc_unsafe(enemy->npcID);
117
118 npc->yaw = clamp_angle(npc->yaw + rand_int(180) - 90.0f);
120 script->functionTemp[1] = rand_int(1000) % 2 + 2;
121 script->AI_TEMP_STATE = AI_STATE_CLEFT_FIND_PLAYER;
122}
123
124void N(CleftAI_FindPlayer)(Evt* script, MobileAISettings* aiSettings, EnemyDetectVolume* volume) {
125 Enemy* enemy = script->owner1.enemy;
126 Npc* npc = get_npc_unsafe(enemy->npcID);
127 EffectInstance* var;
128
129 if (basic_ai_check_player_dist(volume, enemy, aiSettings->chaseRadius, aiSettings->chaseOffsetDist, 0)) {
130 npc->yaw = atan2(npc->pos.x, npc->pos.z, gPlayerStatusPtr->pos.x, gPlayerStatusPtr->pos.z);
131 script->AI_TEMP_STATE = AI_STATE_CLEFT_CHASE_INIT;
132 } else {
133 npc->duration--;
134 if (npc->duration <= 0) {
135 script->functionTemp[1]--;
136 if (script->functionTemp[1] > 0) {
137 npc->yaw = clamp_angle(npc->yaw + 180.0f);
138 npc->duration = aiSettings->waitTime / 2 + rand_int(aiSettings->waitTime / 2 + 1);
139 } else {
140 fx_emote(EMOTE_QUESTION, npc, 0.0f, npc->collisionHeight, 1.0f, 2.0f, -20.0f, 12, &var);
141 npc->duration = 15;
142 script->AI_TEMP_STATE = AI_STATE_CLEFT_LOSE_PLAYER;
143 }
144 }
145 }
146}
147
148void N(CleftAI_RevUpInit)(Evt* script, MobileAISettings* aiSettings, EnemyDetectVolume* volume) {
149 Enemy* enemy = script->owner1.enemy;
150 Npc* npc = get_npc_unsafe(enemy->npcID);
151
152 npc->duration = enemy->varTable[10];
153 npc->curAnim = enemy->animList[13];
154 script->AI_TEMP_STATE = AI_STATE_CLEFT_REV_UP;
155}
156
157void N(CleftAI_RevUp)(Evt* script, MobileAISettings* aiSettings, EnemyDetectVolume* volume) {
158 Enemy* enemy = script->owner1.enemy;
159 Npc* npc = get_npc_unsafe(enemy->npcID);
160
161 npc->yaw = atan2(npc->pos.x, npc->pos.z, gPlayerStatusPtr->pos.x, gPlayerStatusPtr->pos.z);
162 if (npc->duration % 3 == 0) {
163 fx_walking_dust(2, npc->pos.x, npc->pos.y, npc->pos.z + 2.0f, 0, 0);
164 }
165
166 npc->duration--;
167 if (npc->duration <= 0) {
168 enemy->unk_10.x = npc->pos.x;
169 enemy->unk_10.y = npc->pos.y;
170 enemy->unk_10.z = npc->pos.z;
171 enemy->hitboxIsActive = TRUE;
172 npc->moveSpeed = aiSettings->chaseSpeed;
173 npc->duration = dist2D(npc->pos.x, npc->pos.z, gPlayerStatusPtr->pos.x,
174 gPlayerStatusPtr->pos.z) / npc->moveSpeed + 0.9;
175 if (npc->duration < 15) {
176 npc->duration = 15;
177 }
178 script->AI_TEMP_STATE = AI_STATE_CLEFT_TACKLE;
179 }
180}
181
182void N(CleftAI_Tackle)(Evt* script, MobileAISettings* aiSettings, EnemyDetectVolume* volume) {
183 Enemy* enemy = script->owner1.enemy;
184 Npc* npc = get_npc_unsafe(enemy->npcID);
185 f32 posX, posY, posZ;
186 s32 phi_s1 = FALSE;
187
189 npc_move_heading(npc, npc->moveSpeed, npc->yaw);
190
193 npc->pos.x, npc->pos.z,
195 phi_s1 = TRUE;
196 }
197
198 posX = npc->pos.x;
199 posY = npc->pos.y;
200 posZ = npc->pos.z;
202 &posX, &posY, &posZ,
203 1.0f, npc->yaw, npc->collisionHeight, npc->collisionDiameter)) {
204 phi_s1 = TRUE;
205 }
206
207 npc->duration--;
208 if (npc->duration <= 0) {
209 phi_s1 = TRUE;
210 }
211 if (phi_s1) {
212 script->AI_TEMP_STATE = AI_STATE_CLEFT_FIND_PLAYER_INIT;
213 enemy->hitboxIsActive = FALSE;
214 }
215}
216
217void N(CleftAI_LosePlayer)(Evt* script, MobileAISettings* aiSettings, EnemyDetectVolume* volume) {
218 Enemy* enemy = script->owner1.enemy;
219 Npc* npc = get_npc_unsafe(enemy->npcID);
220
221 npc->duration--;
222 if (npc->duration <= 0) {
224 if (enemy->territory->wander.moveSpeedOverride < 0) {
225 npc->moveSpeed = aiSettings->moveSpeed;
226 } else {
227 npc->moveSpeed = enemy->territory->wander.moveSpeedOverride / 32767.0;
228 }
229 script->AI_TEMP_STATE = AI_STATE_RETURN_HOME;
230 }
231}
232
233void N(CleftAI_ReturnHome)(Evt* script, MobileAISettings* aiSettings, EnemyDetectVolume* volume) {
234 Enemy* enemy = script->owner1.enemy;
235 Npc* npc = get_npc_unsafe(enemy->npcID);
236
237 if (basic_ai_check_player_dist(volume, enemy, aiSettings->chaseRadius, aiSettings->chaseOffsetDist, 0)) {
238 npc->yaw = atan2(npc->pos.x, npc->pos.z, gPlayerStatusPtr->pos.x, gPlayerStatusPtr->pos.z);
239 script->AI_TEMP_STATE = AI_STATE_CLEFT_CHASE_INIT;
240 } else if (dist2D(npc->pos.x, npc->pos.z, enemy->territory->wander.centerPos.x, enemy->territory->wander.centerPos.z) <= npc->moveSpeed) {
241 npc->duration = 10;
242 script->AI_TEMP_STATE = AI_STATE_CLEFT_DISGUISE_INIT;
243 } else if (npc->turnAroundYawAdjustment == 0) {
244 npc->yaw = atan2(npc->pos.x, npc->pos.z, enemy->territory->wander.centerPos.x, enemy->territory->wander.centerPos.z);
245 npc_move_heading(npc, npc->moveSpeed, npc->yaw);
246 }
247}
248
249void N(CleftAI_DisguiseInit)(Evt* script, MobileAISettings* aiSettings, EnemyDetectVolume* volume) {
250 Enemy* enemy = script->owner1.enemy;
251 Npc* npc = get_npc_unsafe(enemy->npcID);
252
253 if (npc->duration > 0) {
254 npc->duration--;
255 }
256
257 if (npc->turnAroundYawAdjustment == 0 && npc->duration <= 0) {
258 npc->duration = 8;
259 npc->curAnim = enemy->animList[11];
260 script->AI_TEMP_STATE = AI_STATE_CLEFT_DISGUISE;
261 }
262}
263
264void N(CleftAI_Disguise)(Evt* script, MobileAISettings* aiSettings, EnemyDetectVolume* volume) {
265 Enemy* enemy = script->owner1.enemy;
266 Npc* npc = get_npc_unsafe(enemy->npcID);
267
268 npc->duration--;
269 if (npc->duration <= 0) {
270 npc->duration = 8;
271 npc->curAnim = enemy->animList[14];
272 script->AI_TEMP_STATE = AI_STATE_CLEFT_POST_DISGUISE;
273 }
274}
275
276void N(CleftAI_PostDisguise)(Evt* script, MobileAISettings* aiSettings, EnemyDetectVolume* volume) {
277 Enemy* enemy = script->owner1.enemy;
278 Npc* npc = get_npc_unsafe(enemy->npcID);
279
280 npc->duration--;
281 if (npc->duration <= 0) {
282 script->AI_TEMP_STATE = AI_STATE_CLEFT_HIDING_INIT;
283 }
284}
285
286API_CALLABLE(N(CleftAI_Main)) {
287 Enemy* enemy = script->owner1.enemy;
288 Npc* npc = get_npc_unsafe(enemy->npcID);
289 Bytecode* args = script->ptrReadPos;
290 MobileAISettings* npcAISettings = (MobileAISettings*)evt_get_variable(script, *args++);
291 EnemyDetectVolume curVolume;
292 EnemyDetectVolume* volume = &curVolume;
293
294 enemy->varTable[10] = evt_get_variable(script, *args++);
295
296 curVolume.skipPlayerDetectChance = 0;
297 curVolume.shape = enemy->territory->wander.detectShape;
298 curVolume.pointX = enemy->territory->wander.detectPos.x;
299 curVolume.pointZ = enemy->territory->wander.detectPos.z;
300 curVolume.sizeX = enemy->territory->wander.detectSize.x;
301 curVolume.sizeZ = enemy->territory->wander.detectSize.z;
302 curVolume.halfHeight = 40.0f;
303 curVolume.detectFlags = 0;
304
305 if (isInitialCall) {
306 script->AI_TEMP_STATE = AI_STATE_WANDER_INIT;
307 npc->duration = 0;
308
309 npc->flags &= ~NPC_FLAG_JUMPING;
310 if (!enemy->territory->wander.isFlying) {
311 npc->flags |= NPC_FLAG_GRAVITY;
312 npc->flags &= ~NPC_FLAG_FLYING;
313 } else {
314 npc->flags &= ~NPC_FLAG_GRAVITY;
315 npc->flags |= NPC_FLAG_FLYING;
316 }
317 }
318
319 if (enemy->aiFlags & AI_FLAG_SUSPEND) {
320 if (enemy->aiSuspendTime != 0) {
321 return ApiStatus_BLOCK;
322 }
323 enemy->aiFlags &= ~AI_FLAG_SUSPEND;
324 }
325
326 if (((script->AI_TEMP_STATE == AI_STATE_CLEFT_CHASE_INIT)
327 || (script->AI_TEMP_STATE == AI_STATE_CLEFT_CHASE)
328 || (script->AI_TEMP_STATE == AI_STATE_CLEFT_CHASE_COOLDOWN))
329 && N(CleftAI_CanSeePlayer)(script, npcAISettings, volume)) {
330 script->AI_TEMP_STATE = 20;
331 }
332
333 switch (script->AI_TEMP_STATE) {
335 N(CleftAI_HidingInit)(script, npcAISettings, volume);
337 N(CleftAI_Hiding)(script, npcAISettings, volume);
338 if (script->AI_TEMP_STATE != AI_STATE_CLEFT_PRE_AMBUSH) {
339 return ApiStatus_BLOCK;
340 }
342 N(CleftAI_PreAmbush)(script, npcAISettings, volume);
343 if (script->AI_TEMP_STATE != AI_STATE_CLEFT_AMBUSH) {
344 return ApiStatus_BLOCK;
345 }
347 N(CleftAI_Ambush)(script, npcAISettings, volume);
348 if (script->AI_TEMP_STATE != AI_STATE_CLEFT_FIND_PLAYER_INIT) {
349 return ApiStatus_BLOCK;
350 }
352 N(CleftAI_FindPlayerInit)(script, npcAISettings, volume);
354 N(CleftAI_FindPlayer)(script, npcAISettings, volume);
355 return ApiStatus_BLOCK;
356
358 basic_ai_chase_init(script, npcAISettings, volume);
359 if (script->AI_TEMP_STATE != AI_STATE_CLEFT_CHASE) {
360 return ApiStatus_BLOCK;
361 }
363 basic_ai_chase(script, npcAISettings, volume);
364 if (script->AI_TEMP_STATE != AI_STATE_CLEFT_CHASE_COOLDOWN) {
365 return ApiStatus_BLOCK;
366 }
368 npc->duration--;
369 if (npc->duration == 0) {
370 script->AI_TEMP_STATE = AI_STATE_CLEFT_LOSE_PLAYER;
371 }
372 return ApiStatus_BLOCK;
373
375 N(CleftAI_RevUpInit)(script, npcAISettings, volume);
377 N(CleftAI_RevUp)(script, npcAISettings, volume);
378 return ApiStatus_BLOCK;
379
381 N(CleftAI_Tackle)(script, npcAISettings, volume);
382 return ApiStatus_BLOCK;
383
385 N(CleftAI_LosePlayer)(script, npcAISettings, volume);
386 if (script->AI_TEMP_STATE != AI_STATE_RETURN_HOME) {
387 return ApiStatus_BLOCK;
388 }
390 N(CleftAI_ReturnHome)(script, npcAISettings, volume);
391 return ApiStatus_BLOCK;
392
394 N(CleftAI_DisguiseInit)(script, npcAISettings, volume);
396 N(CleftAI_Disguise)(script, npcAISettings, volume);
397 if (script->AI_TEMP_STATE != AI_STATE_CLEFT_POST_DISGUISE) {
398 return ApiStatus_BLOCK;
399 }
401 N(CleftAI_PostDisguise)(script, npcAISettings, volume);
402 return ApiStatus_BLOCK;
403 }
404
405 return ApiStatus_BLOCK;
406}
void N CleftAI_DisguiseInit(Evt *script, MobileAISettings *aiSettings, EnemyDetectVolume *volume)
void N CleftAI_Ambush(Evt *script, MobileAISettings *aiSettings, EnemyDetectVolume *volume)
void N CleftAI_FindPlayerInit(Evt *script, MobileAISettings *aiSettings, EnemyDetectVolume *volume)
void N CleftAI_LosePlayer(Evt *script, MobileAISettings *aiSettings, EnemyDetectVolume *volume)
void N CleftAI_Tackle(Evt *script, MobileAISettings *aiSettings, EnemyDetectVolume *volume)
void N CleftAI_FindPlayer(Evt *script, MobileAISettings *aiSettings, EnemyDetectVolume *volume)
void N CleftAI_PreAmbush(Evt *script, MobileAISettings *aiSettings, EnemyDetectVolume *volume)
Definition CleftAI.inc.c:88
void N CleftAI_RevUpInit(Evt *script, MobileAISettings *aiSettings, EnemyDetectVolume *volume)
s32 N CleftAI_CanSeePlayer(Evt *script, MobileAISettings *aiSettings, EnemyDetectVolume *volume)
Definition CleftAI.inc.c:25
void N CleftAI_RevUp(Evt *script, MobileAISettings *aiSettings, EnemyDetectVolume *volume)
AiStateCleft
Definition CleftAI.inc.c:5
@ AI_STATE_RETURN_HOME
Definition CleftAI.inc.c:19
@ AI_STATE_CLEFT_TACKLE
Definition CleftAI.inc.c:17
@ AI_STATE_CLEFT_FIND_PLAYER_INIT
Definition CleftAI.inc.c:10
@ AI_STATE_CLEFT_DISGUISE_INIT
Definition CleftAI.inc.c:20
@ AI_STATE_CLEFT_AMBUSH
Definition CleftAI.inc.c:9
@ AI_STATE_CLEFT_HIDING_INIT
Definition CleftAI.inc.c:6
@ AI_STATE_CLEFT_REV_UP_INIT
Definition CleftAI.inc.c:15
@ AI_STATE_CLEFT_CHASE
Definition CleftAI.inc.c:13
@ AI_STATE_CLEFT_DISGUISE
Definition CleftAI.inc.c:21
@ AI_STATE_CLEFT_CHASE_COOLDOWN
Definition CleftAI.inc.c:14
@ AI_STATE_CLEFT_HIDING
Definition CleftAI.inc.c:7
@ AI_STATE_CLEFT_PRE_AMBUSH
Definition CleftAI.inc.c:8
@ AI_STATE_CLEFT_CHASE_INIT
Definition CleftAI.inc.c:12
@ AI_STATE_CLEFT_REV_UP
Definition CleftAI.inc.c:16
@ AI_STATE_CLEFT_FIND_PLAYER
Definition CleftAI.inc.c:11
@ AI_STATE_CLEFT_POST_DISGUISE
Definition CleftAI.inc.c:22
@ AI_STATE_CLEFT_LOSE_PLAYER
Definition CleftAI.inc.c:18
void N CleftAI_PostDisguise(Evt *script, MobileAISettings *aiSettings, EnemyDetectVolume *volume)
void N CleftAI_Hiding(Evt *script, MobileAISettings *aiSettings, EnemyDetectVolume *volume)
Definition CleftAI.inc.c:69
void N CleftAI_Disguise(Evt *script, MobileAISettings *aiSettings, EnemyDetectVolume *volume)
void N CleftAI_ReturnHome(Evt *script, MobileAISettings *aiSettings, EnemyDetectVolume *volume)
void N CleftAI_HidingInit(Evt *script, MobileAISettings *aiSettings, EnemyDetectVolume *volume)
Definition CleftAI.inc.c:56
#define rand_int
#define clamp_angle
#define atan2
@ EMOTE_EXCLAMATION
Definition enums.h:495
@ EMOTE_QUESTION
Definition enums.h:497
@ ENEMY_ANIM_INDEX_IDLE
Definition enums.h:3426
@ ENEMY_ANIM_INDEX_WALK
Definition enums.h:3427
@ AI_FLAG_SUSPEND
Definition enums.h:4571
@ AI_STATE_WANDER_INIT
Definition enums.h:4581
@ SOUND_AI_ALERT_A
Definition enums.h:1078
@ PARTNER_BOW
Definition enums.h:2894
@ SURFACE_INTERACT_RUN
Definition enums.h:4685
@ SOUND_PARAM_MORE_QUIET
Definition enums.h:1746
@ NPC_FLAG_FLYING
Definition enums.h:3001
@ NPC_FLAG_GRAVITY
Definition enums.h:3007
s32 Bytecode
Definition evt.h:7
#define ApiStatus_BLOCK
Definition evt.h:116
s32 evt_get_variable(Evt *script, Bytecode var)
Definition evt.c:1690
f32 fabsf(f32 f)
b32 is_point_outside_territory(s32 shape, f32 centerX, f32 centerZ, f32 pointX, f32 pointZ, f32 sizeX, f32 sizeZ)
Definition 23680.c:412
void basic_ai_chase_init(Evt *script, MobileAISettings *npcAISettings, EnemyDetectVolume *territory)
Definition 23680.c:769
void ai_enemy_play_sound(Npc *npc, s32 arg1, s32 arg2)
Definition 23680.c:543
f32 dist2D(f32 ax, f32 ay, f32 bx, f32 by)
Definition 43F0.c:670
b32 npc_test_move_simple_with_slipping(s32, f32 *, f32 *, f32 *, f32, f32, f32, f32)
void basic_ai_chase(Evt *script, MobileAISettings *npcAISettings, EnemyDetectVolume *territory)
Definition 23680.c:804
s32 ai_check_player_dist(Enemy *enemy, s32 arg1, f32 arg2, f32 arg3)
Definition 23680.c:515
f32 get_clamped_angle_diff(f32, f32)
Definition 43F0.c:606
enum TerritoryShape shape
Definition npc.h:201
VecXZi detectSize
Definition npc.h:216
enum TerritoryShape detectShape
Definition npc.h:217
s32 basic_ai_check_player_dist(EnemyDetectVolume *arg0, Enemy *arg1, f32 arg2, f32 arg3, b8 arg4)
Definition 23680.c:429
s16 npcID
Definition npc.h:300
void npc_surface_spawn_fx(Npc *npc, SurfaceInteractMode mode)
Definition surfaces.c:394
void enable_npc_shadow(Npc *npc)
Definition npc.c:1027
s32 * animList
Definition npc.h:341
void disable_npc_shadow(Npc *npc)
Definition npc.c:1037
s8 aiSuspendTime
Definition npc.h:333
Npc * get_npc_unsafe(s32 npcID)
Definition npc.c:995
Vec3s unk_10
Definition npc.h:302
s8 hitboxIsActive
Definition npc.h:299
s16 detectFlags
Definition npc.h:207
s32 moveSpeedOverride
Definition npc.h:213
u32 aiFlags
Definition npc.h:332
void npc_move_heading(Npc *npc, f32 speed, f32 yaw)
Definition npc.c:986
s32 skipPlayerDetectChance
Definition npc.h:200
EnemyTerritoryWander wander
Definition npc.h:232
EnemyTerritory * territory
Definition npc.h:342
Definition npc.h:294
s16 collisionDiameter
s32 flags
AnimID curAnim
s32 collisionChannel
s16 collisionHeight
s16 turnAroundYawAdjustment
Vec3f pos
f32 moveSpeed
s16 duration
PlayerStatus * gPlayerStatusPtr
PartnerStatus gPartnerStatus
Definition partners.c:42
Camera gCameras[4]
Definition cam_main.c:17
s16 gCurrentCamID
Definition cam_main.c:13