Paper Mario DX
Paper Mario (N64) modding
 
Loading...
Searching...
No Matches
encounter_api.c
Go to the documentation of this file.
1#include "common.h"
2#include "npc.h"
3#include "effects.h"
4#include "battle/battle.h"
5
6API_CALLABLE(SetEncounterStatusFlags) {
7 Bytecode* args = script->ptrReadPos;
8 EncounterStatus* currentEncounter = &gCurrentEncounter;
9 s32 flagBits = *args++;
10
11 if (evt_get_variable(script, *args++)) {
12 currentEncounter->flags |= flagBits;
13 } else {
14 currentEncounter->flags &= ~flagBits;
15 }
16
17 return ApiStatus_DONE2;
18}
19
20API_CALLABLE(IsStartingConversation) {
21 Bytecode* args = script->ptrReadPos;
22 s32 outVar = *args++;
23
25 return ApiStatus_DONE2;
26}
27
28API_CALLABLE(LoadDemoBattle) {
29 Bytecode* args = script->ptrReadPos;
30
31 load_demo_battle(evt_get_variable(script, *args++));
32 return ApiStatus_DONE2;
33}
34
35API_CALLABLE(func_80044290) {
36 return ApiStatus_DONE2;
37}
38
39API_CALLABLE(MakeNpcs) {
40 Bytecode* args = script->ptrReadPos;
41
42 if (isInitialCall) {
43 script->functionTemp[0] = 0;
44 }
45
46 switch (script->functionTemp[0]) {
47 case 0:
48 make_npcs(evt_get_variable(script, *args++), gGameStatusPtr->mapID, (s32*) evt_get_variable(script, *args++));
49 script->functionTemp[0] = 1;
50 break;
51 case 1:
53 return ApiStatus_DONE2;
54 }
55 }
56
57 return ApiStatus_BLOCK;
58}
59
60API_CALLABLE(RemoveNpc) {
61 Bytecode* args = script->ptrReadPos;
62 Enemy* enemy = script->owner1.enemy;
64 s32 id = evt_get_variable(script, *args++);
65 EncounterStatus* currentEncounter = &gCurrentEncounter;
66 s32 i, j;
67
68 if ((s32)enemy != NPC_SELF) {
69 if (id == NPC_SELF) {
70 id = enemy->npcID;
71 ret = ApiStatus_FINISH;
72 } else {
73 if (enemy->npcID == id) {
74 Evt* scriptTemp = script;
75
76 while (TRUE) {
77 if (scriptTemp->blockingParent != NULL) {
78 scriptTemp = scriptTemp->blockingParent;
79 } else {
80 break;
81 }
82 }
83
84 if (scriptTemp == enemy->aiScript) {
85 ret = ApiStatus_FINISH;
86 }
87 } else {
88 get_enemy(id);
89 }
90 }
91 } else {
92 get_enemy(id);
93 }
94
95 for (i = 0; i < currentEncounter->numEncounters; i++) {
96 Encounter* encounter = currentEncounter->encounterList[i];
97
98 if (encounter != NULL) {
99 for (j = 0; j < encounter->count; j++) {
100 enemy = encounter->enemy[j];
101 if (enemy != NULL && enemy->npcID == id) {
102 kill_enemy(enemy);
103 return ret;
104 }
105 }
106 }
107 }
108
109 return ret;
110}
111
112API_CALLABLE(RemoveEncounter) {
113 Bytecode* args = script->ptrReadPos;
114 Enemy* enemy = script->owner1.enemy;
115 s32 id = evt_get_variable(script, *args++);
116 EncounterStatus* currentEncounter = &gCurrentEncounter;
118 s32 i, j;
119
120 if ((s32)enemy != NPC_SELF && (id == NPC_SELF || enemy->npcID == id)) {
121 id = enemy->npcID;
122 ret = ApiStatus_FINISH;
123 } else {
124 get_enemy(id);
125 }
126
127 for (i = 0; i < currentEncounter->numEncounters; i++) {
128 Encounter* encounter = currentEncounter->encounterList[i];
129
130 if (encounter != NULL) {
131 for (j = 0; j < encounter->count; j++) {
132 enemy = encounter->enemy[j];
133 if (enemy != NULL && enemy->npcID == id) {
134 kill_encounter(enemy);
135 return ret;
136 }
137 }
138 }
139 }
140
141 return ret;
142}
143
144API_CALLABLE(GetBattleOutcome) {
145 Bytecode* args = script->ptrReadPos;
146
148 return ApiStatus_DONE2;
149}
150
151API_CALLABLE(func_800445A8) {
152 Bytecode* args = script->ptrReadPos;
153
154 evt_set_variable(script, *args++, script->owner1.enemy->unk_C4);
155 return ApiStatus_DONE2;
156}
157
158API_CALLABLE(func_800445D4) {
159 Bytecode* args = script->ptrReadPos;
160
161 evt_set_variable(script, *args++, script->owner1.enemy->unk_C8);
162 return ApiStatus_DONE2;
163}
164
165API_CALLABLE(GetOwnerEncounterTrigger) {
166 Bytecode* args = script->ptrReadPos;
167
168 evt_set_variable(script, *args++, script->owner1.enemy->encountered);
169 return ApiStatus_DONE2;
170}
171
172API_CALLABLE(DoNpcDefeat) {
173 Enemy* owner = script->owner1.enemy;
174 Npc* npc = get_npc_unsafe(owner->npcID);
175 Evt* newScript;
176
177 kill_script(script);
178 npc->curAnim = owner->animList[6];
179 newScript = start_script(&EVS_NpcDefeat, EVT_PRIORITY_A, 0);
180 owner->defeatScript = newScript;
181 owner->defeatScriptID = newScript->id;
182 newScript->owner1.enemy = owner;
183 newScript->owner2.npcID = owner->npcID;
184 newScript->groupFlags = owner->scriptGroup;
185
186 return ApiStatus_FINISH;
187}
188
189void start_battle(Evt* script, s32 songID) {
190 EncounterStatus* currentEncounter = &gCurrentEncounter;
191 Enemy* enemy = script->owner1.enemy;
192 Encounter* encounter;
193 s32 i;
194
196
197 currentEncounter->hitType = ENCOUNTER_TRIGGER_NONE;
198 enemy->encountered = TRUE;
199 currentEncounter->curEnemy = enemy;
200 currentEncounter->curEncounter = currentEncounter->encounterList[enemy->encounterIndex];
201 currentEncounter->firstStrikeType = FIRST_STRIKE_NONE;
202 currentEncounter->forbidFleeing = FALSE;
203 currentEncounter->songID = songID;
204 currentEncounter->unk_18 = -1;
205
206 if (enemy->aiScript != NULL) {
208 }
209
210 if (enemy->auxScript != NULL) {
212 }
213
216
217 encounter = currentEncounter->curEncounter;
218 for (i = 0; i < encounter->count; i++) {
219 enemy = encounter->enemy[i];
220 if (enemy != NULL && (!(enemy->flags & ENEMY_FLAG_ENABLE_HIT_SCRIPT) || enemy == currentEncounter->curEnemy)) {
221 if (enemy->hitBytecode != NULL) {
222 Evt* hitEvtInstance;
223 enemy->encountered = TRUE;
224
225 hitEvtInstance = start_script(enemy->hitBytecode, EVT_PRIORITY_A, 0);
226
227 enemy->hitScript = hitEvtInstance;
228 enemy->hitScriptID = hitEvtInstance->id;
229
230 hitEvtInstance = enemy->hitScript;
231 hitEvtInstance->owner1.enemy = enemy;
232 hitEvtInstance->owner2.npcID = enemy->npcID;
233 hitEvtInstance->groupFlags = enemy->scriptGroup;
234 }
235 }
236 }
237
238 currentEncounter->fadeOutAmount = 0;
239 currentEncounter->substateDelay = 0;
240 currentEncounter->scriptedBattle = TRUE;
244}
245
246API_CALLABLE(StartBattle) {
247 start_battle(script, -1);
248 return ApiStatus_DONE1;
249}
250
251API_CALLABLE(StartBattleWith) {
252 Bytecode* args = script->ptrReadPos;
253
254 start_battle(script, evt_get_variable(script, *args++));
255 return ApiStatus_DONE1;
256}
257
258API_CALLABLE(StartBossBattle) {
259 Bytecode* args = script->ptrReadPos;
260 EncounterStatus* currentEncounter = &gCurrentEncounter;
261 Enemy* enemy = script->owner1.enemy;
262 s32 songID = evt_get_variable(script, *args++);
263 Encounter* encounter;
264 s32 i;
265
267
268 currentEncounter->hitType = ENCOUNTER_TRIGGER_NONE;
269 enemy->encountered = TRUE;
270 currentEncounter->curEnemy = enemy;
271 currentEncounter->curEncounter = currentEncounter->encounterList[enemy->encounterIndex];
272 currentEncounter->firstStrikeType = FIRST_STRIKE_NONE;
273 currentEncounter->forbidFleeing = TRUE;
274 currentEncounter->songID = songID;
275 currentEncounter->unk_18 = -1;
276
277 if (enemy->aiScript != NULL) {
279 }
280
281 if (enemy->auxScript != NULL) {
283 }
284
287
288 encounter = currentEncounter->curEncounter;
289 for (i = 0; i < encounter->count; i++) {
290 enemy = encounter->enemy[i];
291 if ((enemy != NULL && (
292 !(enemy->flags & ENEMY_FLAG_ENABLE_HIT_SCRIPT) || enemy == currentEncounter->curEnemy)
293 ) && enemy->hitBytecode != NULL) {
294 enemy->encountered = TRUE;
295
296 script = start_script(enemy->hitBytecode, EVT_PRIORITY_A, 0);
297 enemy->hitScript = script;
298 enemy->hitScriptID = script->id;
299
300 script = enemy->hitScript;
301 script->owner1.enemy = enemy;
302 script->owner2.npcID = enemy->npcID;
303 script->groupFlags = enemy->scriptGroup;
304 }
305 }
306
307 currentEncounter->fadeOutAmount = 0;
308 currentEncounter->substateDelay = 0;
309 currentEncounter->scriptedBattle = TRUE;
313
314 return ApiStatus_DONE1;
315}
316
317API_CALLABLE(SetBattleMusic) {
318 Bytecode* args = script->ptrReadPos;
319 Bytecode songID = evt_get_variable(script, *args++);
320 EncounterStatus* currentEncounter = &gCurrentEncounter;
321
322 currentEncounter->forbidFleeing = TRUE;
323 currentEncounter->songID = songID;
324 currentEncounter->unk_18 = -1;
325 return ApiStatus_DONE2;
326}
327
328API_CALLABLE(BindNpcAI) {
329 Bytecode* args = script->ptrReadPos;
330 Enemy* enemy = script->owner1.enemy;
331 s32 id = evt_get_variable(script, *args++);
332 EvtScript* newScriptSource = (EvtScript*)evt_get_variable(script, *args++);
333 Evt* scriptTemp = script;
335 Evt* aiScript;
336 s32 groupFlags;
337
338 if ((s32)enemy != NPC_SELF && (id == NPC_SELF || enemy->npcID == id)) {
339 id = enemy->npcID;
340
341 while (TRUE) {
342 if (scriptTemp->blockingParent != NULL) {
343 scriptTemp = scriptTemp->blockingParent;
344 } else {
345 break;
346 }
347 }
348
349 aiScript = enemy->aiScript;
350 if (scriptTemp == aiScript) {
351 ret = ApiStatus_FINISH;
352 }
353 } else {
354 enemy = get_enemy(id);
355 }
356
357 if (enemy->flags & ENEMY_FLAG_PASSIVE) {
358 groupFlags = EVT_GROUP_PASSIVE_NPC;
359 } else {
360 groupFlags = EVT_GROUP_HOSTILE_NPC;
361 }
362
363 if (enemy->aiScript != NULL) {
364#if VERSION_JP
365 groupFlags = enemy->aiScript->groupFlags;
366#endif
368 }
369
370 enemy->unk_C8 = 100;
371 enemy->aiBytecode = newScriptSource;
372 scriptTemp = start_script(newScriptSource, EVT_PRIORITY_A, 0);
373 enemy->aiScript = scriptTemp;
374 enemy->aiScriptID = scriptTemp->id;
375 scriptTemp->owner1.enemy = enemy;
376 scriptTemp->owner2.npcID = id;
377 scriptTemp->groupFlags = groupFlags;
378 return ret;
379}
380
381API_CALLABLE(BindNpcIdle) {
382 Bytecode* args = script->ptrReadPos;
383 Enemy* owner = script->owner1.enemy;
384 s32 npcID = evt_get_variable(script, *args++);
385 EvtScript* aiBytecode = (EvtScript*)evt_get_variable(script, *args++);
386
387 if (npcID == NPC_SELF) {
388 npcID = owner->npcID;
389 }
390
391 owner = get_enemy(npcID);
392 owner->aiBytecode = aiBytecode;
393
394 return ApiStatus_DONE2;
395}
396
397API_CALLABLE(RestartNpcAI) {
398 Bytecode* args = script->ptrReadPos;
399 Enemy* enemy = script->owner1.enemy;
400 s32 npcID = evt_get_variable(script, *args++);
401 Evt* newScript;
402 s32 groupFlags;
403
404 if (npcID == NPC_SELF) {
405 npcID = enemy->npcID;
406 }
407
408 enemy = get_enemy(npcID);
409
410 if (enemy->flags & ENEMY_FLAG_PASSIVE) {
411 groupFlags = EVT_GROUP_PASSIVE_NPC;
412 } else {
413 groupFlags = EVT_GROUP_HOSTILE_NPC;
414 }
415
416 if (enemy->aiScript != NULL) {
417#if VERSION_JP
418 groupFlags = enemy->aiScript->groupFlags;
419#endif
421 }
422
423 enemy->unk_C8 = 100;
424 newScript = start_script(enemy->aiBytecode, EVT_PRIORITY_A, 0);
425 enemy->aiScript = newScript;
426 enemy->aiScriptID = newScript->id;
427 newScript->owner1.enemy = enemy;
428 newScript->owner2.npc = script->owner2.npc;
429 newScript->groupFlags = groupFlags;
430
431 return ApiStatus_DONE2;
432}
433
434API_CALLABLE(EnableNpcAI) {
435 Bytecode* args = script->ptrReadPos;
436 Enemy* npc = script->owner1.enemy;
437 s32 npcID = evt_get_variable(script, *args++);
438 s32 var2 = evt_get_variable(script, *args++);
439
440 if (npcID == NPC_SELF) {
441 npcID = npc->npcID;
442 }
443
444 npc = get_enemy(npcID);
445
446 if (var2 != 0) {
447 if (npc->aiScript != NULL) {
449 }
450 } else if (npc->aiScript != NULL) {
452 }
453
454 return ApiStatus_DONE2;
455}
456
457API_CALLABLE(SetNpcAux) {
458 Bytecode* args = script->ptrReadPos;
459 Enemy* enemy = script->owner1.enemy;
460 s32 id = evt_get_variable(script, *args++);
461 EvtScript* newScriptSource = (EvtScript*)evt_get_variable(script, *args++);
462 Evt* scriptTemp = script;
464 Evt* auxScript;
465
466 if ((s32)enemy != NPC_SELF && (id == NPC_SELF || enemy->npcID == id)) {
467 id = enemy->npcID;
468
469 while (TRUE) {
470 if (scriptTemp->blockingParent != NULL) {
471 scriptTemp = scriptTemp->blockingParent;
472 } else {
473 break;
474 }
475 }
476
477 auxScript = enemy->auxScript;
478 if (scriptTemp == auxScript) {
479 ret = ApiStatus_FINISH;
480 }
481 } else {
482 enemy = get_enemy(id);
483 auxScript = enemy->auxScript;
484 }
485
486 if (auxScript != NULL) {
488 }
489
490 if (newScriptSource != NULL) {
491 enemy->auxBytecode = newScriptSource;
492 scriptTemp = start_script(newScriptSource, EVT_PRIORITY_A, 0);
493 enemy->auxScript = scriptTemp;
494 enemy->auxScriptID = scriptTemp->id;
495 scriptTemp->owner1.enemy = enemy;
496 scriptTemp->owner2.npcID = id;
497 scriptTemp->groupFlags = script->groupFlags;
498 }
499 return ret;
500}
501
502API_CALLABLE(BindNpcAux) {
503 Bytecode* args = script->ptrReadPos;
504 Enemy* npc = script->owner1.enemy;
505 s32 npcID = evt_get_variable(script, *args++);
506 EvtScript* auxBytecode = (EvtScript*)evt_get_variable(script, *args++);
507
508 if (npcID == NPC_SELF) {
509 npcID = npc->npcID;
510 }
511
512 npc = get_enemy(npcID);
513 npc->auxBytecode = auxBytecode;
514
515 return ApiStatus_DONE2;
516}
517
518API_CALLABLE(RestartNpcAux) {
519 Bytecode* args = script->ptrReadPos;
520 Enemy* enemy = script->owner1.enemy;
521 s32 npcID = evt_get_variable(script, *args++);
522 Evt* newScript;
523 s32 groupFlags;
524
525 if (npcID == NPC_SELF) {
526 npcID = enemy->npcID;
527 }
528
529 enemy = get_enemy(npcID);
530
531 if (enemy->flags & ENEMY_FLAG_PASSIVE) {
532 groupFlags = EVT_GROUP_PASSIVE_NPC;
533 } else {
534 groupFlags = EVT_GROUP_HOSTILE_NPC;
535 }
536
537 if (enemy->auxScript != NULL) {
538#if VERSION_JP
539 groupFlags = enemy->auxScript->groupFlags;
540#endif
542 }
543
544 newScript = start_script(enemy->auxBytecode, EVT_PRIORITY_A, 0);
545 enemy->auxScript = newScript;
546 enemy->auxScriptID = newScript->id;
547 newScript->owner1.enemy = enemy;
548 newScript->owner2.npcID = npcID;
549 newScript->groupFlags = groupFlags;
550
551 return ApiStatus_DONE2;
552}
553
554API_CALLABLE(EnableNpcAux) {
555 Bytecode* args = script->ptrReadPos;
556 Enemy* npc = script->owner1.enemy;
557 s32 npcID = evt_get_variable(script, *args++);
558 s32 var2 = evt_get_variable(script, *args++);
559
560 if (npcID == NPC_SELF) {
561 npcID = npc->npcID;
562 }
563
564 npc = get_enemy(npcID);
565
566 if (var2 != 0) {
567 if (npc->auxScript != NULL) {
569 }
570 } else if (npc->auxScript != NULL) {
572 }
573
574 return ApiStatus_DONE2;
575}
576
577API_CALLABLE(BindNpcInteract) {
578 Bytecode* args = script->ptrReadPos;
579 Enemy* npc = script->owner1.enemy;
580 s32 npcID = evt_get_variable(script, *args++);
581 EvtScript* interactBytecode = (EvtScript*)evt_get_variable(script, *args++);
582
583 if (npcID == NPC_SELF) {
584 npcID = npc->npcID;
585 }
586
587 npc = get_enemy(npcID);
588
589 if (npc->interactScript != NULL) {
591 }
592 npc->interactBytecode = interactBytecode;
593
594 return ApiStatus_DONE2;
595}
596
597API_CALLABLE(BindNpcHit) {
598 Bytecode* args = script->ptrReadPos;
599 Enemy* npc = script->owner1.enemy;
600 s32 npcID = evt_get_variable(script, *args++);
601 EvtScript* hitBytecode = (EvtScript*)evt_get_variable(script, *args++);
602
603 if (npcID == NPC_SELF) {
604 npcID = npc->npcID;
605 }
606
607 npc = get_enemy(npcID);
608
609 if (npc->hitScript != NULL) {
611 }
612 npc->hitBytecode = hitBytecode;
613
614 return ApiStatus_DONE2;
615}
616
617API_CALLABLE(BindNpcDefeat) {
618 Bytecode* args = script->ptrReadPos;
619 Enemy* npc = script->owner1.enemy;
620 s32 npcID = evt_get_variable(script, *args++);
621 EvtScript* defeatBytecode = (EvtScript*)evt_get_variable(script, *args++);
622
623 if (npcID == -1) {
624 npcID = npc->npcID;
625 }
626
627 npc = get_enemy(npcID);
628 npc->defeatBytecode = defeatBytecode;
629
630 return ApiStatus_DONE2;
631}
632
633API_CALLABLE(SetSelfVar) {
634 Bytecode* args = script->ptrReadPos;
635 Enemy* owner = script->owner1.enemy;
636 s32 index = evt_get_variable(script, *args++);
637 s32 value = evt_get_variable(script, *args++);
638
639 owner->varTable[index] = value;
640 return ApiStatus_DONE2;
641}
642
643API_CALLABLE(GetSelfVar) {
644 Bytecode* args = script->ptrReadPos;
645 Enemy* owner = script->owner1.enemy;
646 s32 var1 = evt_get_variable(script, *args++);
647 s32 var0 = *args++;
648
649 evt_set_variable(script, var0, owner->varTable[var1]);
650 return ApiStatus_DONE2;
651}
652
653API_CALLABLE(SetNpcVar) {
654 Bytecode* args = script->ptrReadPos;
655 Enemy* npc = script->owner1.enemy;
656 s32 npcID = evt_get_variable(script, *args++);
657 s32 varIdx = evt_get_variable(script, *args++);
658 s32 val = evt_get_variable(script, *args++);
659
660 if (npcID == NPC_SELF) {
661 npcID = npc->npcID;
662 }
663
664 npc = get_enemy(npcID);
665 npc->varTable[varIdx] = val;
666
667 return ApiStatus_DONE2;
668}
669
670API_CALLABLE(GetNpcVar) {
671 Bytecode* args = script->ptrReadPos;
672 Enemy* npc = script->owner1.enemy;
673 s32 npcID = evt_get_variable(script, *args++);
674 s32 varIdx = evt_get_variable(script, *args++);
675 s32 var3 = *args++;
676
677 if (npcID == NPC_SELF) {
678 npcID = npc->npcID;
679 }
680
681 npc = get_enemy(npcID);
682 evt_set_variable(script, var3, npc->varTable[varIdx]);
683
684 return ApiStatus_DONE2;
685}
686
687API_CALLABLE(SetSelfRotation) {
688 Bytecode* args = script->ptrReadPos;
689 Npc* self = get_npc_unsafe(script->owner2.npcID);
690 s32 rotX = evt_get_variable(script, *args++);
691 s32 rotY = evt_get_variable(script, *args++);
692 s32 rotZ = evt_get_variable(script, *args++);
693
694 self->rot.x = rotX;
695 self->rot.y = rotY;
696 self->rot.z = rotZ;
697
698 return ApiStatus_DONE2;
699}
700
701API_CALLABLE(SetSelfEnemyFlags) {
702 Bytecode* args = script->ptrReadPos;
703 script->owner1.enemy->flags = *args++;
704 return ApiStatus_DONE2;
705}
706
707API_CALLABLE(SetSelfEnemyFlagBits) {
708 Bytecode* args = script->ptrReadPos;
709 Enemy* owner = script->owner1.enemy;
710 s32 bits = *args++;
711 s32 mode = evt_get_variable(script, *args++);
712
713 if (mode) {
714 owner->flags |= bits;
715 } else {
716 owner->flags &= ~bits;
717 }
718 return ApiStatus_DONE2;
719}
720
721API_CALLABLE(SelfEnemyOverrideSyncPos) {
722 Bytecode* args = script->ptrReadPos;
723 Enemy* owner = script->owner1.enemy;
724 Npc* npc = get_npc_unsafe(script->owner2.npcID);
725
726 owner->hitboxIsActive = evt_get_variable(script, *args++);
727 owner->unk_10.x = npc->pos.x;
728 owner->unk_10.y = npc->pos.y;
729 owner->unk_10.z = npc->pos.z;
730
731 return ApiStatus_DONE2;
732}
733
734API_CALLABLE(GetSelfNpcID) {
735 Bytecode* args = script->ptrReadPos;
736
737 evt_set_variable(script, *args++, script->owner1.enemy->npcID);
738 return ApiStatus_DONE2;
739}
740
741API_CALLABLE(ClearDefeatedEnemies) {
742 EncounterStatus* currentEncounter = &gCurrentEncounter;
743 s32 i;
744 s32 j;
745
746 for (i = 0; i < ARRAY_COUNT(currentEncounter->defeatFlags); i++) {
747 for (j = 0; j < ARRAY_COUNT(currentEncounter->defeatFlags[0]); j++) {
748 currentEncounter->defeatFlags[i][j] = 0;
749 }
750 }
751 return ApiStatus_DONE2;
752}
753
754API_CALLABLE(SetEnemyFlagBits) {
755 Bytecode* args = script->ptrReadPos;
756 Enemy* npc = script->owner1.enemy;
757 s32 npcID = evt_get_variable(script, *args++);
758 s32 bits = *args++;
759 s32 mode = evt_get_variable(script, *args++);
760
761 if (npcID == NPC_SELF) {
762 npcID = npc->npcID;
763 }
764
765 npc = get_enemy(npcID);
766
767 if (mode) {
768 npc->flags |= bits;
769 } else {
770 npc->flags &= ~bits;
771 }
772
773 return ApiStatus_DONE2;
774}
775
776API_CALLABLE(func_8004572C) {
777 return ApiStatus_DONE2;
778}
779
780API_CALLABLE(GetSelfAnimationFromTable) {
781 Bytecode* args = script->ptrReadPos;
782 Enemy* owner = script->owner1.enemy;
783 s32 animIdx = evt_get_variable(script, *args++);
784
785 evt_set_variable(script, *args++, owner->animList[animIdx]);
786 return ApiStatus_DONE2;
787}
788
789API_CALLABLE(func_80045798) {
790 Bytecode* args = script->ptrReadPos;
791
792 gPartnerStatus.unk_358 = evt_get_variable(script, *args++);
793 return ApiStatus_DONE2;
794}
795
796API_CALLABLE(SetOwnerInstigatorValue) {
797 Bytecode* args = script->ptrReadPos;
798 Enemy* enemy = script->owner1.enemy;
799
800 enemy->instigatorValue = evt_get_variable(script, *args++);
801 return ApiStatus_DONE2;
802}
803
804API_CALLABLE(SetBattleAsScripted) {
806 return ApiStatus_DONE2;
807}
808
809API_CALLABLE(GetEncounterTriggerHitTier) {
810 Bytecode* args = script->ptrReadPos;
811
813 return ApiStatus_DONE2;
814}
815
816API_CALLABLE(func_80045838) {
817 Bytecode* args = script->ptrReadPos;
818 s32 npcID = evt_get_variable(script, *args++);
819 s32 soundID = evt_get_variable(script, *args++);
820 s32 upperSoundFLags = evt_get_variable(script, *args++);
821 Npc* npc = resolve_npc(script, npcID);
822
823 if (npc == NULL) {
824 return ApiStatus_DONE2;
825 }
826
827 ai_enemy_play_sound(npc, soundID, upperSoundFLags);
828 return ApiStatus_DONE2;
829}
830
831API_CALLABLE(func_800458CC) {
832 Bytecode* args = script->ptrReadPos;
833
834 evt_set_variable(script, *args++, script->owner1.enemy->npcSettings->actionFlags & AI_ACTION_08);
835 return ApiStatus_DONE2;
836}
837
838API_CALLABLE(OnPlayerFled) {
839 Enemy* enemy = script->owner1.enemy;
840 Npc* npc = get_npc_unsafe(enemy->npcID);
841 Bytecode* args = script->ptrReadPos;
842 s32 skipReaction = evt_get_variable(script, *args++);
843
844 enemy->aiFlags |= AI_FLAG_SUSPEND;
845
846 if (!skipReaction) {
847 EffectInstance* emoteEffect;
848
851 }
852
853 if (!(enemy->aiFlags & AI_FLAG_SKIP_EMOTE_AFTER_FLEE)) {
854 fx_emote(EMOTE_QUESTION, npc, 0.0f, npc->collisionHeight, 1.0f, 0.0f, -20.0f, 40, &emoteEffect);
855 }
856
858 f32 x = npc->pos.x;
859 f32 y = npc->pos.y + npc->collisionHeight;
860 f32 z = npc->pos.z;
861 f32 a = 100.0f;
862
863 if (npc_raycast_down_sides(npc->collisionChannel, &x, &y, &z, &a) != 0) {
864 npc->pos.y = y;
865 }
866 npc->flags &= ~NPC_FLAG_JUMPING;
867 }
868 }
869
870 return ApiStatus_DONE2;
871}
872
873API_CALLABLE(SetTattleMessage) {
874 Bytecode* args = script->ptrReadPos;
875 s32 enemyId = evt_get_variable(script, *args++);
876 u32 tattleMsg = evt_get_variable(script, *args++);
877 Enemy* npc = get_enemy(enemyId);
878
879 npc->tattleMsg = tattleMsg;
880 return ApiStatus_DONE2;
881}
void load_demo_battle(u32 index)
Definition battle.c:191
u8 groupFlags
struct Evt * blockingParent
union Evt::@11 owner2
Initially -1.
Bytecode EvtScript[]
union Evt::@10 owner1
Initially -1.
#define npc_raycast_down_sides
void start_battle(Evt *script, s32 songID)
@ EMOTE_QUESTION
Definition enums.h:497
@ ENEMY_ANIM_INDEX_IDLE
Definition enums.h:3426
@ AI_FLAG_SUSPEND
Definition enums.h:4570
@ AI_FLAG_SKIP_EMOTE_AFTER_FLEE
Definition enums.h:4571
@ AI_FLAG_SKIP_IDLE_ANIM_AFTER_FLEE
Definition enums.h:4572
@ ENCOUNTER_TRIGGER_NONE
Definition enums.h:268
@ ENEMY_FLAG_PASSIVE
Definition enums.h:4520
@ ENEMY_FLAG_ENABLE_HIT_SCRIPT
Definition enums.h:4523
@ NPC_SELF
Definition enums.h:2526
@ ENCOUNTER_SUBSTATE_PRE_BATTLE_INIT
Definition enums.h:6312
@ ENCOUNTER_STATE_PRE_BATTLE
Definition enums.h:6296
@ ENCOUNTER_STATE_CREATE
Definition enums.h:6294
@ FIRST_STRIKE_NONE
Definition enums.h:3458
@ AI_ACTION_08
Definition enums.h:4614
@ NPC_FLAG_FLYING
Definition enums.h:3001
@ NPC_FLAG_JUMPING
Definition enums.h:3009
@ NPC_FLAG_GRAVITY
Definition enums.h:3007
@ EVT_PRIORITY_A
Definition evt.h:153
s32 ApiStatus
Definition evt.h:115
#define ApiStatus_DONE2
Definition evt.h:118
s32 Bytecode
Definition evt.h:7
#define ApiStatus_FINISH
Definition evt.h:120
@ EVT_GROUP_HOSTILE_NPC
Definition evt.h:144
@ EVT_GROUP_FLAG_INTERACT
Definition evt.h:134
@ EVT_GROUP_PASSIVE_NPC
Definition evt.h:143
#define ApiStatus_DONE1
Definition evt.h:117
#define ApiStatus_BLOCK
Definition evt.h:116
s32 evt_get_variable(Evt *script, Bytecode var)
Definition evt.c:1689
void kill_script(Evt *instanceToKill)
void partner_disable_input(void)
Definition partners.c:2489
void ai_enemy_play_sound(Npc *npc, s32 arg1, s32 arg2)
Definition 23680.c:543
s32 disable_player_input(void)
Definition 77480.c:990
s32 resume_all_group(s32 groupFlags)
s32 suspend_all_script(s32 id)
s32 evt_set_variable(Evt *script, Bytecode var, s32 value)
Definition evt.c:1846
s32 is_starting_conversation(void)
Definition encounter.c:2817
Evt * start_script(EvtScript *source, s32 priority, s32 initialState)
void kill_script_by_ID(s32 id)
Npc * resolve_npc(Evt *script, s32 npcIdOrPtr)
Definition npc_api.c:8
s32 resume_all_script(s32 id)
struct Evt * interactScript
Definition npc.h:312
s8 scriptedBattle
battle started by StartBattle but not by encounter
Definition npc.h:380
s32 flags
Definition npc.h:295
s16 npcID
Definition npc.h:300
s32 interactScriptID
Definition npc.h:318
struct Evt * hitScript
Definition npc.h:314
void kill_enemy(Enemy *enemy)
Definition npc.c:2373
EvtScript * hitBytecode
Definition npc.h:308
Enemy * get_enemy(s32 npcID)
Looks for an enemy matching the specified npcID.
Definition npc.c:2539
s8 encounterIndex
Definition npc.h:296
s8 instigatorValue
Definition npc.h:334
u8 scriptGroup
Definition npc.h:298
s32 auxScriptID
Definition npc.h:321
Encounter * encounterList[24]
Definition npc.h:392
s32 * animList
Definition npc.h:341
Enemy * curEnemy
Definition npc.h:394
struct Evt * defeatScript
Definition npc.h:316
void make_npcs(s32 flags, s32 mapID, s32 *npcGroupList)
Definition npc.c:2330
s8 numEncounters
Definition npc.h:384
Enemy * enemy[16]
Definition npc.h:352
Npc * get_npc_unsafe(s32 npcID)
Definition npc.c:994
Vec3s unk_10
Definition npc.h:302
s32 count
Definition npc.h:351
s8 forbidFleeing
Definition npc.h:379
s8 hitboxIsActive
Definition npc.h:299
EvtScript * interactBytecode
Definition npc.h:306
s32 kill_encounter(Enemy *enemy)
Definition npc.c:2360
s32 aiScriptID
Definition npc.h:319
s32 fadeOutAmount
Definition npc.h:395
s32 defeatScriptID
Definition npc.h:322
EncounterStatus gCurrentEncounter
Definition encounter.c:176
s8 battleOutcome
Definition npc.h:372
u32 aiFlags
Definition npc.h:332
struct Evt * auxScript
Definition npc.h:315
s32 defeatFlags[60][12]
Definition npc.h:403
s32 unk_C8
Definition npc.h:340
u32 tattleMsg
Definition npc.h:344
s8 encountered
Definition npc.h:297
s8 firstStrikeType
Definition npc.h:367
EvtScript * defeatBytecode
Definition npc.h:310
EvtScript * aiBytecode
Definition npc.h:307
s32 substateDelay
Definition npc.h:396
Encounter * curEncounter
Definition npc.h:393
struct Evt * aiScript
Definition npc.h:313
EvtScript * auxBytecode
Definition npc.h:309
s32 hitScriptID
Definition npc.h:320
Definition npc.h:294
ApiStatus GetNpcVar(Evt *script, b32 isInitialCall)
ApiStatus BindNpcAux(Evt *script, b32 isInitialCall)
ApiStatus SetSelfRotation(Evt *script, b32 isInitialCall)
ApiStatus func_80044290(Evt *script, b32 isInitialCall)
ApiStatus StartBattle(Evt *script, b32 isInitialCall)
ApiStatus BindNpcInteract(Evt *script, b32 isInitialCall)
ApiStatus SelfEnemyOverrideSyncPos(Evt *script, b32 isInitialCall)
ApiStatus SetBattleMusic(Evt *script, b32 isInitialCall)
ApiStatus func_80045798(Evt *script, b32 isInitialCall)
ApiStatus StartBattleWith(Evt *script, b32 isInitialCall)
ApiStatus IsStartingConversation(Evt *script, b32 isInitialCall)
ApiStatus ClearDefeatedEnemies(Evt *script, b32 isInitialCall)
ApiStatus SetTattleMessage(Evt *script, b32 isInitialCall)
ApiStatus SetOwnerInstigatorValue(Evt *script, b32 isInitialCall)
ApiStatus SetEnemyFlagBits(Evt *script, b32 isInitialCall)
ApiStatus BindNpcAI(Evt *script, b32 isInitialCall)
ApiStatus GetEncounterTriggerHitTier(Evt *script, b32 isInitialCall)
ApiStatus BindNpcIdle(Evt *script, b32 isInitialCall)
ApiStatus func_8004572C(Evt *script, b32 isInitialCall)
ApiStatus SetSelfEnemyFlagBits(Evt *script, b32 isInitialCall)
ApiStatus MakeNpcs(Evt *script, b32 isInitialCall)
ApiStatus EnableNpcAux(Evt *script, b32 isInitialCall)
ApiStatus RemoveNpc(Evt *script, b32 isInitialCall)
ApiStatus GetSelfAnimationFromTable(Evt *script, b32 isInitialCall)
ApiStatus SetNpcAux(Evt *script, b32 isInitialCall)
ApiStatus func_800445A8(Evt *script, b32 isInitialCall)
ApiStatus DoNpcDefeat(Evt *script, b32 isInitialCall)
ApiStatus StartBossBattle(Evt *script, b32 isInitialCall)
ApiStatus SetEncounterStatusFlags(Evt *script, b32 isInitialCall)
ApiStatus GetOwnerEncounterTrigger(Evt *script, b32 isInitialCall)
ApiStatus SetSelfEnemyFlags(Evt *script, b32 isInitialCall)
ApiStatus RestartNpcAux(Evt *script, b32 isInitialCall)
ApiStatus func_80045838(Evt *script, b32 isInitialCall)
ApiStatus BindNpcDefeat(Evt *script, b32 isInitialCall)
ApiStatus SetNpcVar(Evt *script, b32 isInitialCall)
ApiStatus RestartNpcAI(Evt *script, b32 isInitialCall)
ApiStatus func_800458CC(Evt *script, b32 isInitialCall)
ApiStatus OnPlayerFled(Evt *script, b32 isInitialCall)
ApiStatus SetBattleAsScripted(Evt *script, b32 isInitialCall)
ApiStatus LoadDemoBattle(Evt *script, b32 isInitialCall)
ApiStatus GetSelfNpcID(Evt *script, b32 isInitialCall)
ApiStatus SetSelfVar(Evt *script, b32 isInitialCall)
ApiStatus func_800445D4(Evt *script, b32 isInitialCall)
ApiStatus RemoveEncounter(Evt *script, b32 isInitialCall)
ApiStatus EnableNpcAI(Evt *script, b32 isInitialCall)
ApiStatus GetBattleOutcome(Evt *script, b32 isInitialCall)
ApiStatus GetSelfVar(Evt *script, b32 isInitialCall)
ApiStatus BindNpcHit(Evt *script, b32 isInitialCall)
#define ARRAY_COUNT(arr)
Definition macros.h:40
s32 flags
AnimID curAnim
s32 collisionChannel
s16 collisionHeight
Vec3f rot
Vec3f pos
PartnerStatus gPartnerStatus
Definition partners.c:42
GameStatus * gGameStatusPtr
Definition main_loop.c:32
EvtScript EVS_NpcDefeat
Definition encounter.c:65
s32 gEncounterState
Definition encounter.c:174
b32 EncounterStateChanged
Definition encounter.c:24
s32 gEncounterSubState
Definition encounter.c:175