Paper Mario DX
Paper Mario (N64) modding
 
Loading...
Searching...
No Matches
States_PatrolAI.inc.c File Reference

Go to the source code of this file.

Macros

#define _AI_PATROL_INC_   0
 

Functions

void N PatrolAI_MoveInit (Evt *script, MobileAISettings *aiSettings, EnemyDetectVolume *territory)
 
void N PatrolAI_Move (Evt *script, MobileAISettings *aiSettings, EnemyDetectVolume *territory)
 
void N PatrolAI_LoiterInit (Evt *script, MobileAISettings *aiSettings, EnemyDetectVolume *territory)
 
void N PatrolAI_Loiter (Evt *script, MobileAISettings *aiSettings, EnemyDetectVolume *territory)
 
void N PatrolAI_PostLoiter (Evt *script, MobileAISettings *aiSettings, EnemyDetectVolume *territory)
 
void N PatrolAI_JumpInit (Evt *script, MobileAISettings *aiSettings, EnemyDetectVolume *territory)
 
void N PatrolAI_Jump (Evt *script, MobileAISettings *aiSettings, EnemyDetectVolume *territory)
 
void N PatrolAI_ChaseInit (Evt *script, MobileAISettings *aiSettings, EnemyDetectVolume *territory)
 
void N PatrolAI_Chase (Evt *script, MobileAISettings *aiSettings, EnemyDetectVolume *territory)
 
void N PatrolAI_LosePlayer (Evt *script, MobileAISettings *aiSettings, EnemyDetectVolume *territory)
 
void N PatrolNoAttackAI_15 (Evt *script, MobileAISettings *aiSettings, EnemyDetectVolume *territory)
 

Macro Definition Documentation

◆ _AI_PATROL_INC_

#define _AI_PATROL_INC_   0

Definition at line 2 of file States_PatrolAI.inc.c.

Function Documentation

◆ PatrolAI_MoveInit()

void N PatrolAI_MoveInit ( Evt * script,
MobileAISettings * aiSettings,
EnemyDetectVolume * territory )

Definition at line 9 of file States_PatrolAI.inc.c.

9 {
10 Enemy* enemy = script->owner1.enemy;
11 Npc* npc = get_npc_unsafe(enemy->npcID);
12 f32 ret;
13 f32 max;
14 f32 posX;
15 f32 posZ;
16 s32 i;
17 s32 j;
18 s32 x, z;
19
20 script->functionTemp[1] = 0;
21 max = 32767.0f;
22 posX = npc->pos.x;
23 posZ = npc->pos.z;
24 script->AI_PATROL_GOAL_INDEX = 0;
25
26 for (i = 0, j = 0; i < enemy->territory->patrol.numPoints; i++, j++) {
27 //TODO strange match -- index and array are backwards!
28 x = i[enemy->territory->patrol.points].x;
29 z = i[enemy->territory->patrol.points].z;
30 ret = dist2D(posX, posZ, x, z);
31 if (ret < max) {
32 max = ret;
33 script->AI_PATROL_GOAL_INDEX = j;
34 }
35 }
36
38 if (enemy->territory->patrol.moveSpeedOverride < 0) {
39 npc->moveSpeed = aiSettings->moveSpeed;
40 } else {
41 npc->moveSpeed = enemy->territory->patrol.moveSpeedOverride / 32767.0;
42 }
43
44 script->AI_TEMP_STATE = AI_STATE_PATROL;
45}
union Evt::@10 owner1
Initially -1.
@ ENEMY_ANIM_INDEX_WALK
Definition enums.h:3427
@ AI_STATE_PATROL
Definition enums.h:4583
f32 dist2D(f32 ax, f32 ay, f32 bx, f32 by)
Definition 43F0.c:669
s16 npcID
Definition npc.h:300
s32 * animList
Definition npc.h:341
f32 moveSpeed
Definition npc.h:93
Vec3i points[10]
Definition npc.h:223
Npc * get_npc_unsafe(s32 npcID)
Definition npc.c:994
EnemyTerritoryPatrol patrol
Definition npc.h:233
s32 moveSpeedOverride
Definition npc.h:224
EnemyTerritory * territory
Definition npc.h:342
Definition npc.h:294
AnimID curAnim
Vec3f pos
f32 moveSpeed

◆ PatrolAI_Move()

void N PatrolAI_Move ( Evt * script,
MobileAISettings * aiSettings,
EnemyDetectVolume * territory )

Definition at line 47 of file States_PatrolAI.inc.c.

47 {
48 Enemy* enemy = script->owner1.enemy;
49 Npc* npc = get_npc_unsafe(enemy->npcID);
50 f32 x, z;
51 EffectInstance* emoteTemp;
52
53 if (aiSettings->playerSearchInterval >= 0) {
54 if (script->functionTemp[1] <= 0) {
55 script->functionTemp[1] = aiSettings->playerSearchInterval;
56 if (basic_ai_check_player_dist(territory, enemy, aiSettings->alertRadius, aiSettings->alertOffsetDist, 0)) {
57 fx_emote(EMOTE_EXCLAMATION, npc, 0.0f, npc->collisionHeight, 1.0f, 2.0f, -20.0f, 0xF, &emoteTemp);
60 script->AI_TEMP_STATE = AI_STATE_ALERT_INIT;
61 } else {
62 script->AI_TEMP_STATE = AI_STATE_CHASE_INIT;
63 }
64 return;
65 }
66 }
67 script->functionTemp[1]--;
68 }
69
70 if (npc->turnAroundYawAdjustment == 0) {
71 if (npc->moveSpeed < 4.0) {
73 } else {
75 }
76 //TODO strange match -- index and array are backwards!
77 x = script->AI_PATROL_GOAL_INDEX[enemy->territory->patrol.points].x;
78 z = script->AI_PATROL_GOAL_INDEX[enemy->territory->patrol.points].z;
79 npc->yaw = atan2(npc->pos.x, npc->pos.z, x, z);
80 npc_move_heading(npc, npc->moveSpeed, npc->yaw);
81 if (dist2D(npc->pos.x, npc->pos.z, x, z) <= npc->moveSpeed) {
82 script->AI_TEMP_STATE = AI_STATE_LOITER_INIT;
83 script->functionTemp[1] = (rand_int(1000) % 3) + 2;
84 if ((aiSettings->unk_AI_2C <= 0) || (aiSettings->moveTime <= 0) ||
85 (aiSettings->waitTime <= 0) || (script->functionTemp[1] == 0)) {
86 script->AI_TEMP_STATE = AI_STATE_LOITER_POST;
87 }
88 if (rand_int(10000) % 100 < aiSettings->moveTime) {
89 script->AI_TEMP_STATE = AI_STATE_LOITER_POST;
90 }
91 }
92 }
93}
#define rand_int
#define atan2
@ EMOTE_EXCLAMATION
Definition enums.h:495
@ AI_STATE_LOITER_INIT
Definition enums.h:4586
@ AI_STATE_CHASE_INIT
Definition enums.h:4591
@ AI_STATE_LOITER_POST
Definition enums.h:4588
@ AI_STATE_ALERT_INIT
Definition enums.h:4589
@ SOUND_AI_ALERT_A
Definition enums.h:1078
@ SURFACE_INTERACT_RUN
Definition enums.h:4684
@ SURFACE_INTERACT_WALK
Definition enums.h:4683
@ AI_ACTION_JUMP_WHEN_SEE_PLAYER
Definition enums.h:4611
@ SOUND_PARAM_MORE_QUIET
Definition enums.h:1746
void ai_enemy_play_sound(Npc *npc, s32 arg1, s32 arg2)
Definition 23680.c:543
s32 waitTime
Definition npc.h:95
s32 moveTime
Definition npc.h:94
b32 basic_ai_check_player_dist(EnemyDetectVolume *arg0, Enemy *arg1, f32 arg2, f32 arg3, s8 arg4)
Definition 23680.c:429
void npc_surface_spawn_fx(Npc *npc, SurfaceInteractMode mode)
Definition surfaces.c:394
s16 actionFlags
Definition npc.h:156
f32 alertOffsetDist
Definition npc.h:97
s32 playerSearchInterval
Definition npc.h:98
NpcSettings * npcSettings
Definition npc.h:304
f32 alertRadius
Definition npc.h:96
void npc_move_heading(Npc *npc, f32 speed, f32 yaw)
Definition npc.c:985
s32 unk_AI_2C
Definition npc.h:104
s16 collisionHeight
s16 turnAroundYawAdjustment

◆ PatrolAI_LoiterInit()

void N PatrolAI_LoiterInit ( Evt * script,
MobileAISettings * aiSettings,
EnemyDetectVolume * territory )

Definition at line 96 of file States_PatrolAI.inc.c.

96 {
97 Enemy* enemy = script->owner1.enemy;
98 Npc* npc = get_npc_unsafe(enemy->npcID);
99
100 npc->duration = (aiSettings->waitTime / 2) + rand_int((aiSettings->waitTime / 2) + 1);
101 npc->yaw = clamp_angle(npc->yaw + rand_int(180) - 90.0f);
103 script->AI_TEMP_STATE = AI_STATE_LOITER;
104}
#define clamp_angle
@ ENEMY_ANIM_INDEX_IDLE
Definition enums.h:3426
@ AI_STATE_LOITER
Definition enums.h:4587
s16 duration

◆ PatrolAI_Loiter()

void N PatrolAI_Loiter ( Evt * script,
MobileAISettings * aiSettings,
EnemyDetectVolume * territory )

Definition at line 106 of file States_PatrolAI.inc.c.

106 {
107 Enemy* enemy = script->owner1.enemy;
108 Npc* npc = get_npc_unsafe(enemy->npcID);
109 EffectInstance* emoteTemp;
110
111 if ((aiSettings->playerSearchInterval >= 0) && basic_ai_check_player_dist(territory, enemy, aiSettings->chaseRadius, aiSettings->chaseOffsetDist, 0)) {
112 fx_emote(EMOTE_EXCLAMATION, npc, 0.0f, npc->collisionHeight, 1.0f, 2.0f, -20.0f, 0xF, &emoteTemp);
113 npc->yaw = atan2(npc->pos.x, npc->pos.z, gPlayerStatusPtr->pos.x, gPlayerStatusPtr->pos.z);
116 script->AI_TEMP_STATE = AI_STATE_CHASE_INIT;
117 } else {
118 script->AI_TEMP_STATE = AI_STATE_ALERT_INIT;
119 }
120 return;
121 }
122
123 // look around randomly
124 if (npc->turnAroundYawAdjustment == 0) {
125 npc->duration--;
126 if (npc->duration == 0) {
127 script->functionTemp[1]--;
128 if (script->functionTemp[1] != 0) {
130 npc->yaw = clamp_angle(npc->yaw + 180.0f);
131 }
132 npc->duration = aiSettings->waitTime / 2 + rand_int(aiSettings->waitTime / 2 + 1);
133 } else {
134 script->AI_TEMP_STATE = AI_STATE_LOITER_POST;
135 }
136 }
137 }
138}
@ AI_ACTION_LOOK_AROUND_DURING_LOITER
Definition enums.h:4615
f32 chaseRadius
Definition npc.h:102
f32 chaseOffsetDist
Definition npc.h:103
PlayerStatus * gPlayerStatusPtr

◆ PatrolAI_PostLoiter()

void N PatrolAI_PostLoiter ( Evt * script,
MobileAISettings * aiSettings,
EnemyDetectVolume * territory )

Definition at line 140 of file States_PatrolAI.inc.c.

140 {
141 Enemy* enemy = script->owner1.enemy;
142 Npc* npc = get_npc_unsafe(enemy->npcID);
143
144 script->functionTemp[2]++;
145 if (script->functionTemp[2] >= enemy->territory->patrol.numPoints) {
146 script->functionTemp[2] = 0;
147 }
149 if (enemy->territory->patrol.moveSpeedOverride < 0) {
150 npc->moveSpeed = aiSettings->moveSpeed;
151 } else {
152 npc->moveSpeed = enemy->territory->patrol.moveSpeedOverride / 32767.0;
153 }
154 script->AI_TEMP_STATE = AI_STATE_PATROL;
155}

◆ PatrolAI_JumpInit()

void N PatrolAI_JumpInit ( Evt * script,
MobileAISettings * aiSettings,
EnemyDetectVolume * territory )

Definition at line 157 of file States_PatrolAI.inc.c.

157 {
158 Enemy* enemy = script->owner1.enemy;
159 Npc* npc = get_npc_unsafe(enemy->npcID);
160
162 npc->jumpVel = 10.0f;
163 npc->jumpScale = 2.0f;
164 npc->moveToPos.y = npc->pos.y;
165 npc->flags |= NPC_FLAG_JUMPING;
166 script->functionTemp[0] = AI_STATE_ALERT;
167}
@ ENEMY_ANIM_INDEX_JUMP
Definition enums.h:3430
@ AI_STATE_ALERT
Definition enums.h:4590
@ NPC_FLAG_JUMPING
Definition enums.h:3009
f32 jumpScale
f32 jumpVel
s32 flags
Vec3f moveToPos

◆ PatrolAI_Jump()

void N PatrolAI_Jump ( Evt * script,
MobileAISettings * aiSettings,
EnemyDetectVolume * territory )

Definition at line 169 of file States_PatrolAI.inc.c.

169 {
170 Npc* npc = get_npc_unsafe(script->owner1.enemy->npcID);
171
172 npc->pos.y += npc->jumpVel;
173 npc->jumpVel -= npc->jumpScale;
174
175 if (!(npc->pos.y > npc->moveToPos.y)) {
176 npc->pos.y = npc->moveToPos.y;
177 npc->jumpVel = 0.0f;
178 npc->flags &= ~NPC_FLAG_JUMPING;
179 script->AI_TEMP_STATE = AI_STATE_CHASE_INIT;
180 }
181}

◆ PatrolAI_ChaseInit()

void N PatrolAI_ChaseInit ( Evt * script,
MobileAISettings * aiSettings,
EnemyDetectVolume * territory )

Definition at line 183 of file States_PatrolAI.inc.c.

183 {
184 Enemy* enemy = script->owner1.enemy;
185 Npc* npc = get_npc_unsafe(enemy->npcID);
186 f32 angle;
187 f32 angleDiff;
188
189 npc->duration = (aiSettings->chaseUpdateInterval / 2) + rand_int(aiSettings->chaseUpdateInterval / 2 + 1);
191 npc->moveSpeed = aiSettings->chaseSpeed;
192
193 angle = atan2(npc->pos.x, npc->pos.z, gPlayerStatusPtr->pos.x, gPlayerStatusPtr->pos.z);
194 angleDiff = get_clamped_angle_diff(npc->yaw, angle);
195
196 if (aiSettings->chaseTurnRate < fabsf(angleDiff)) {
197 angle = npc->yaw;
198
199 if (angleDiff < 0.0f) {
200 angle += -aiSettings->chaseTurnRate;
201 } else {
202 angle += aiSettings->chaseTurnRate;
203 }
204 }
205
206 npc->yaw = clamp_angle(angle);
207 script->functionTemp[0] = 13;
208}
@ ENEMY_ANIM_INDEX_CHASE
Definition enums.h:3429
f32 fabsf(f32 f)
f32 get_clamped_angle_diff(f32, f32)
Definition 43F0.c:605
f32 chaseSpeed
Definition npc.h:99
s32 chaseTurnRate
Definition npc.h:100
s32 chaseUpdateInterval
Definition npc.h:101

◆ PatrolAI_Chase()

void N PatrolAI_Chase ( Evt * script,
MobileAISettings * aiSettings,
EnemyDetectVolume * territory )

Definition at line 210 of file States_PatrolAI.inc.c.

210 {
211 Enemy* enemy = script->owner1.enemy;
212 Npc* npc = get_npc_unsafe(enemy->npcID);
213 EffectInstance* emoteTemp;
214
215 if (!basic_ai_check_player_dist(territory, enemy, aiSettings->chaseRadius, aiSettings->chaseOffsetDist, 1)) {
216 fx_emote(EMOTE_QUESTION, npc, 0.0f, npc->collisionHeight, 1.0f, 2.0f, -20.0f, 15, &emoteTemp);
218 npc->duration = 25;
219 script->AI_TEMP_STATE = AI_STATE_LOSE_PLAYER;
220 } else {
222 npc_move_heading(npc, npc->moveSpeed, npc->yaw);
223 if (npc->duration > 0) {
224 npc->duration--;
225 } else {
226 script->AI_TEMP_STATE = AI_STATE_CHASE_INIT;
227 }
228 }
229}
@ EMOTE_QUESTION
Definition enums.h:497
@ AI_STATE_LOSE_PLAYER
Definition enums.h:4593

◆ PatrolAI_LosePlayer()

void N PatrolAI_LosePlayer ( Evt * script,
MobileAISettings * aiSettings,
EnemyDetectVolume * territory )

Definition at line 231 of file States_PatrolAI.inc.c.

231 {
232 Enemy* enemy = script->owner1.enemy;
233 Npc* npc = get_npc_unsafe(enemy->npcID);
234
235 npc->duration--;
236 if (npc->duration == 0) {
237 if (enemy->aiFlags & AI_FLAG_80) {
238 script->AI_TEMP_STATE = AI_STATE_PATROL_15;
239 } else {
240 script->AI_TEMP_STATE = AI_STATE_WANDER_INIT;
241 }
242 }
243}
@ AI_FLAG_80
Definition enums.h:4575
@ AI_STATE_WANDER_INIT
Definition enums.h:4580
@ AI_STATE_PATROL_15
Definition enums.h:4594
u32 aiFlags
Definition npc.h:332

◆ PatrolNoAttackAI_15()

void N PatrolNoAttackAI_15 ( Evt * script,
MobileAISettings * aiSettings,
EnemyDetectVolume * territory )

Definition at line 245 of file States_PatrolAI.inc.c.

245 {
246 Enemy* enemy = script->owner1.enemy;
247 Npc* npc = get_npc_unsafe(enemy->npcID);
248 s32 i;
249
250 // get next patrol point
251 for (i = script->AI_PATROL_GOAL_INDEX; i < enemy->territory->patrol.numPoints; i++) {
252 if (i[enemy->territory->patrol.points].y <= npc->pos.y) {
253 script->AI_PATROL_GOAL_INDEX = i;
254 break;
255 }
256 }
257
258 npc->moveSpeed = aiSettings->moveSpeed;
260 script->functionTemp[1] = 0;
261 script->AI_TEMP_STATE = AI_STATE_PATROL;
262}