Paper Mario DX
Paper Mario (N64) modding
 
Loading...
Searching...
No Matches
actor_api.c
Go to the documentation of this file.
1#include "common.h"
2#include "effects.h"
3#include "battle/battle.h"
4
5extern s32 IsGroupHeal;
6extern s8 ApplyingBuff;
7
8s32 count_targets(Actor* actor, s32 targetHomeIndex, s32 targetSelectionFlags) {
9 BattleStatus* battleStatus = &gBattleStatus;
10
11 battleStatus->sampleTargetHomeIndex = targetHomeIndex;
12 battleStatus->curTargetListFlags = targetSelectionFlags;
14 return actor->targetListLength;
15}
16
17s32 get_nearest_home_index(f32 x, f32 y, f32 z) {
18 s32 row;
19 s32 col;
20
21 if (y < 40.0f) {
22 row = 0;
23 } else if (y < 85.0f) {
24 row = 1;
25 } else if (y < 100.0f) {
26 row = 2;
27 } else {
28 row = 3;
29 }
30
31 if (x < 25.0f) {
32 col = 0;
33 } else if (x < 65.0f) {
34 col = 1;
35 } else if (x < 105.0f) {
36 col = 2;
37 } else {
38 col = 3;
39 }
40
41 return col | (row << 2);
42}
43
44void set_goal_pos_to_part(ActorState* state, s32 actorID, s32 partID) {
45 s32 actorClass = actorID & ACTOR_CLASS_MASK;
46 Actor* actor = get_actor(actorID);
47 ActorPart* part;
48
49 switch (actorClass) {
51 part = get_actor_part(actor, 0);
52 state->goalPos.x = actor->curPos.x + part->partOffset.x * actor->scalingFactor;
53 state->goalPos.y = actor->curPos.y + part->partOffset.y * actor->scalingFactor;
54 state->goalPos.z = actor->curPos.z + 10.0f;
55 if (actor->stoneStatus == STATUS_KEY_STONE) {
56 state->goalPos.y -= actor->scalingFactor * 5.0f;
57 }
58 break;
61 part = get_actor_part(actor, partID);
63 state->goalPos.x = actor->curPos.x + (part->partOffset.x + part->targetOffset.x) * actor->scalingFactor;
64 if (!(actor->flags & ACTOR_FLAG_UPSIDE_DOWN)) {
65 state->goalPos.y = actor->curPos.y + (part->partOffset.y + part->targetOffset.y) * actor->scalingFactor;
66 } else {
67 state->goalPos.y = actor->curPos.y + (-part->partOffset.y - part->targetOffset.y) * actor->scalingFactor;
68 }
69 state->goalPos.z = actor->curPos.z + part->partOffset.z + 10.0f;
70 } else {
71 state->goalPos.x = part->absolutePos.x + part->targetOffset.x;
72 if (!(actor->flags & ACTOR_FLAG_UPSIDE_DOWN)) {
73 state->goalPos.y = part->absolutePos.y + part->targetOffset.y * actor->scalingFactor;
74 } else {
75 state->goalPos.y = part->absolutePos.y - part->targetOffset.y * actor->scalingFactor;
76 }
77 state->goalPos.z = part->absolutePos.z + 10.0f;
78 }
79 break;
80 }
81}
82
83void set_part_goal_to_actor_part(ActorPartMovement* movement, s32 actorID, s32 partID) {
84 s32 actorClass = actorID & ACTOR_CLASS_MASK;
85 Actor* actor = get_actor(actorID);
86 ActorPart* part;
87
88 switch (actorClass) {
90 part = get_actor_part(actor, 0);
91 part->movement->goalPos.x = actor->curPos.x + part->partOffset.x * actor->scalingFactor;
92 part->movement->goalPos.y = actor->curPos.y + part->partOffset.y * actor->scalingFactor;
93 part->movement->goalPos.z = actor->curPos.z;
94 break;
97 part = get_actor_part(actor, partID);
99 part->movement->goalPos.x = actor->curPos.x + (part->partOffset.x + part->targetOffset.x) * actor->scalingFactor;
100 if (!(actor->flags & ACTOR_FLAG_UPSIDE_DOWN)) {
101 part->movement->goalPos.y = actor->curPos.y + (part->partOffset.y + part->targetOffset.y) * actor->scalingFactor;
102 } else {
103 part->movement->goalPos.y = actor->curPos.y + (-part->partOffset.y - part->targetOffset.y) * actor->scalingFactor;
104 }
105 part->movement->goalPos.z = actor->curPos.z + part->partOffset.z;
106 } else {
107 part->movement->goalPos.x = part->absolutePos.x + part->targetOffset.x;
108 if (!(actor->flags & ACTOR_FLAG_UPSIDE_DOWN)) {
109 part->movement->goalPos.y = part->absolutePos.y + part->targetOffset.y * actor->scalingFactor;
110 } else {
111 part->movement->goalPos.y = part->absolutePos.y - part->targetOffset.y * actor->scalingFactor;
112 }
113 part->movement->goalPos.z = part->absolutePos.z;
114 }
115 break;
116 }
117}
118
119void set_actor_current_position(s32 actorID, f32 x, f32 y, f32 z) {
120 Actor* actor = get_actor(actorID);
121
122 actor->curPos.x = x;
123 actor->curPos.y = y;
124 actor->curPos.z = z;
125}
126
127void set_part_absolute_position(s32 actorID, s32 partID, f32 x, f32 y, f32 z) {
128 Actor* actor = get_actor(actorID);
129 ActorPart* actorPart;
130
131 switch (actorID & ACTOR_CLASS_MASK) {
133 actor->curPos.x = x;
134 actor->curPos.y = y;
135 actor->curPos.z = z;
136 break;
139 actorPart = get_actor_part(actor, partID);
140 actorPart->absolutePos.x = x;
141 actorPart->absolutePos.y = y;
142 actorPart->absolutePos.z = z;
143 break;
144 }
145}
146
147void set_actor_home_position(s32 actorID, f32 x, f32 y, f32 z) {
148 Actor* actor = get_actor(actorID);
149
150 actor->homePos.x = x;
151 actor->homePos.y = y;
152 actor->homePos.z = z;
153}
154
155Actor* get_actor(s32 actorID) {
156 Actor* ret = NULL;
157 BattleStatus* battleStatus = &gBattleStatus;
158 s32 actorClass = actorID & ACTOR_CLASS_MASK;
159 u32 idIdx = (u8)actorID;
160
161 switch (actorClass) {
163 ret = battleStatus->playerActor;
164 break;
166 ret = battleStatus->partnerActor;
167 break;
169 ret = battleStatus->enemyActors[idIdx];
170 break;
171 }
172 return ret;
173}
174
175API_CALLABLE(LoadBattleSection) {
176 BattleArea* battleArea = &gBattleAreas[evt_get_variable(script, *script->ptrReadPos)];
177
178 dma_copy(battleArea->dmaStart, battleArea->dmaEnd, battleArea->dmaDest);
179 return ApiStatus_DONE1;
180}
181
182API_CALLABLE(GetBattlePhase) {
183 evt_set_variable(script, *script->ptrReadPos, gBattleStatus.battlePhase);
184 return ApiStatus_DONE2;
185}
186
187API_CALLABLE(GetLastElement) {
188 evt_set_variable(script, *script->ptrReadPos, gBattleStatus.curAttackElement);
189 return ApiStatus_DONE2;
190}
191
192API_CALLABLE(GetDamageSource) {
193 evt_set_variable(script, *script->ptrReadPos, gBattleStatus.curDamageSource);
194 return ApiStatus_DONE2;
195}
196
197API_CALLABLE(SetDamageSource) {
198 s32 damageSource = *script->ptrReadPos;
199
200 gBattleStatus.curDamageSource = damageSource;
201 return ApiStatus_DONE2;
202}
203
204API_CALLABLE(SetGoalToHome) {
205 s32 actorID = evt_get_variable(script, *script->ptrReadPos);
206 Actor* actor;
207
208 if (actorID == ACTOR_SELF) {
209 actorID = script->owner1.actorID;
210 }
211
212 actor = get_actor(actorID);
213 actor->state.goalPos.x = actor->homePos.x;
214 actor->state.goalPos.y = actor->homePos.y;
215 actor->state.goalPos.z = actor->homePos.z;
216
217 return ApiStatus_DONE2;
218}
219
220API_CALLABLE(SetIdleGoalToHome) {
221 s32 actorID = evt_get_variable(script, *script->ptrReadPos);
222 Actor* actor;
223
224 if (actorID == ACTOR_SELF) {
225 actorID = script->owner1.actorID;
226 }
227
228 actor = get_actor(actorID);
229 actor->fly.goalPos.x = actor->homePos.x;
230 actor->fly.goalPos.y = actor->homePos.y;
231 actor->fly.goalPos.z = actor->homePos.z;
232
233 return ApiStatus_DONE2;
234}
235
236API_CALLABLE(SetGoalToIndex) {
237 Bytecode* args = script->ptrReadPos;
238 s32 actorID = evt_get_variable(script, *args++);
239 s32 index = evt_get_variable(script, *args++);
240 Actor* actor;
241
242 if (actorID == ACTOR_SELF) {
243 actorID = script->owner1.actorID;
244 }
245
246 actor = get_actor(actorID);
250
251 return ApiStatus_DONE2;
252}
253
254API_CALLABLE(GetIndexFromPos) {
255 Bytecode* args = script->ptrReadPos;
256 s32 actorID = evt_get_variable(script, *args++);
257 s32 outVar = *args++;
258 Actor* actor;
259 s32 homeIdx;
260
261 if (actorID == ACTOR_SELF) {
262 actorID = script->owner1.actorID;
263 }
264
265 actor = get_actor(actorID);
266 homeIdx = get_nearest_home_index(actor->curPos.x, actor->curPos.y, actor->curPos.z);
267 evt_set_variable(script, outVar, homeIdx);
268
269 return ApiStatus_DONE2;
270}
271
272API_CALLABLE(GetIndexFromHome) {
273 Bytecode* args = script->ptrReadPos;
274 s32 actorID = evt_get_variable(script, *args++);
275 s32 outVar = *args++;
276 Actor* actor;
277 s32 homeIdx;
278
279 if (actorID == ACTOR_SELF) {
280 actorID = script->owner1.actorID;
281 }
282
283 actor = get_actor(actorID);
284 homeIdx = get_nearest_home_index(actor->homePos.x, actor->homePos.y, actor->homePos.z);
285 evt_set_variable(script, outVar, homeIdx);
286
287 return ApiStatus_DONE2;
288}
289
290API_CALLABLE(CountTargets) {
291 Bytecode* args = script->ptrReadPos;
292 s32 actorID = evt_get_variable(script, *args++);
293 s32 targetSelectionFlags = *args++;
294 s32 outVar = *args++;
295 Actor* actor;
296 s32 homeIdx;
297 s32 numTargets;
298
299 if (actorID == ACTOR_SELF) {
300 actorID = script->owner1.actorID;
301 }
302
303 actor = get_actor(actorID);
304 homeIdx = get_nearest_home_index(actor->curPos.x, actor->curPos.y, actor->curPos.z);
305 numTargets = count_targets(actor, homeIdx, targetSelectionFlags);
306 evt_set_variable(script, outVar, numTargets);
307
308 return ApiStatus_DONE2;
309}
310
311API_CALLABLE(ForceHomePos) {
312 Bytecode* args = script->ptrReadPos;
313 s32 actorID = evt_get_variable(script, *args++);
314 f32 x, y, z;
315 Actor* actor;
316
317 if (actorID == ACTOR_SELF) {
318 actorID = script->owner1.actorID;
319 }
320
321 x = evt_get_variable(script, *args++);
322 y = evt_get_variable(script, *args++);
323 z = evt_get_variable(script, *args++);
324
325 actor = get_actor(actorID);
326 actor->curPos.x = actor->homePos.x = x;
327 actor->curPos.y = actor->homePos.y = y;
328 actor->curPos.z = actor->homePos.z = z;
329
330 return ApiStatus_DONE2;
331}
332
333API_CALLABLE(SetHomePos) {
334 Bytecode* args = script->ptrReadPos;
335 s32 actorID = evt_get_variable(script, *args++);
336 f32 x, y, z;
337 Actor* actor;
338
339 if (actorID == ACTOR_SELF) {
340 actorID = script->owner1.actorID;
341 }
342
343 x = evt_get_variable(script, *args++);
344 y = evt_get_variable(script, *args++);
345 z = evt_get_variable(script, *args++);
346
347 actor = get_actor(actorID);
348 actor->homePos.x = x;
349 actor->homePos.y = y;
350 actor->homePos.z = z;
351
352 return ApiStatus_DONE2;
353}
354
355API_CALLABLE(SetGoalToTarget) {
356 Bytecode* args = script->ptrReadPos;
357 s32 actorID = evt_get_variable(script, *args++);
358 Actor* actor;
359
360 if (actorID == ACTOR_SELF) {
361 actorID = script->owner1.actorID;
362 }
363 actor = get_actor(actorID);
364
365 set_goal_pos_to_part(&actor->state, actor->targetActorID, actor->targetPartID);
366
367 return ApiStatus_DONE2;
368}
369
370API_CALLABLE(SetPartGoalToTarget) {
371 Bytecode* args = script->ptrReadPos;
372 s32 actorID = evt_get_variable(script, *args++);
373 s32 partID = evt_get_variable(script, *args++);
374 Actor* actor;
375
376 if (actorID == ACTOR_SELF) {
377 actorID = script->owner1.actorID;
378 }
379 actor = get_actor(actorID);
380
381 set_part_goal_to_actor_part(get_actor_part(actor, partID)->movement, actor->targetActorID, actor->targetPartID);
382
383 return ApiStatus_DONE2;
384}
385
386API_CALLABLE(SetGoalToFirstTarget) {
387 Bytecode* args = script->ptrReadPos;
388 s32 actorID = evt_get_variable(script, *args++);
389 Actor* actor;
390 SelectableTarget* target;
391
392 if (actorID == ACTOR_SELF) {
393 actorID = script->owner1.actorID;
394 }
395 actor = get_actor(actorID);
396
397 target = &actor->targetData[actor->targetIndexList[0]];
398 set_goal_pos_to_part(&actor->state, target->actorID, target->partID);
399
400 return ApiStatus_DONE2;
401}
402
403API_CALLABLE(SetGoalPos) {
404 Bytecode* args = script->ptrReadPos;
405 s32 actorID = evt_get_variable(script, *args++);
406 Actor* actor;
407 ActorState* walk;
408 f32 x, y, z;
409
410 if (actorID == ACTOR_SELF) {
411 actorID = script->owner1.actorID;
412 }
413 actor = get_actor(actorID);
414 walk = &actor->state;
415
416 if (*args == ACTOR_API_SKIP_ARG) {
417 x = walk->goalPos.x;
418 } else {
419 x = evt_get_variable(script, *args);
420 }
421
422 *args++;
423 if (*args == ACTOR_API_SKIP_ARG) {
424 y = walk->goalPos.y;
425 } else {
426 y = evt_get_variable(script, *args);
427 }
428
429 *args++;
430 if (*args == ACTOR_API_SKIP_ARG) {
431 z = walk->goalPos.z;
432 } else {
433 z = evt_get_variable(script, *args);
434 }
435
436 walk->goalPos.x = x;
437 walk->goalPos.y = y;
438 walk->goalPos.z = z;
439
440 return ApiStatus_DONE2;
441}
442
443API_CALLABLE(SetIdleGoal) {
444 Bytecode* args = script->ptrReadPos;
445 s32 actorID = evt_get_variable(script, *args++);
446 Actor* actor;
447 ActorMovement* fly;
448 f32 x, y, z;
449
450 if (actorID == ACTOR_SELF) {
451 actorID = script->owner1.actorID;
452 }
453 actor = get_actor(actorID);
454 fly = &actor->fly;
455
456 if (*args == ACTOR_API_SKIP_ARG) {
457 x = actor->fly.goalPos.x;
458 } else {
459 x = evt_get_variable(script, *args);
460 }
461
462 *args++;
463 if (*args == ACTOR_API_SKIP_ARG) {
464 y = fly->goalPos.y;
465 } else {
466 y = evt_get_variable(script, *args);
467 }
468
469 *args++;
470 if (*args == ACTOR_API_SKIP_ARG) {
471 z = fly->goalPos.z;
472 } else {
473 z = evt_get_variable(script, *args);
474 }
475
476 fly->goalPos.x = x;
477 fly->goalPos.y = y;
478 fly->goalPos.z = z;
479 return ApiStatus_DONE2;
480}
481
482API_CALLABLE(AddGoalPos) {
483 Bytecode* args = script->ptrReadPos;
484 s32 actorID = evt_get_variable(script, *args++);
485 Actor* actor;
486 f32 x, y, z;
487
488 if (actorID == ACTOR_SELF) {
489 actorID = script->owner1.actorID;
490 }
491
492 x = evt_get_float_variable(script, *args++);
493 y = evt_get_float_variable(script, *args++);
494 z = evt_get_float_variable(script, *args++);
495
496 actor = get_actor(actorID);
497 actor->state.goalPos.x += x;
498 actor->state.goalPos.y += y;
499 actor->state.goalPos.z += z;
500
501 return ApiStatus_DONE2;
502}
503
504API_CALLABLE(GetGoalPos) {
505 Bytecode* args = script->ptrReadPos;
506 s32 actorID = evt_get_variable(script, *args++);
507 Actor* actor;
508 s32 outX, outY, outZ;
509 s32 x, y, z;
510
511 if (actorID == ACTOR_SELF) {
512 actorID = script->owner1.actorID;
513 }
514
515 actor = get_actor(actorID);
516
517 outX = *args++;
518 outY = *args++;
519 outZ = *args++;
520
521 x = actor->state.goalPos.x;
522 y = actor->state.goalPos.y;
523 z = actor->state.goalPos.z;
524
525 evt_set_variable(script, outX, x);
526 evt_set_variable(script, outY, y);
527 evt_set_variable(script, outZ, z);
528
529 return ApiStatus_DONE2;
530}
531
532// should this be renamed to GetFlyGoal ?
533API_CALLABLE(GetIdleGoal) {
534 Bytecode* args = script->ptrReadPos;
535 s32 actorID = evt_get_variable(script, *args++);
536 Actor* actor;
537 s32 outX, outY, outZ;
538 s32 x, y, z;
539
540 if (actorID == ACTOR_SELF) {
541 actorID = script->owner1.actorID;
542 }
543
544 actor = get_actor(actorID);
545
546 outX = *args++;
547 outY = *args++;
548 outZ = *args++;
549
550 x = actor->fly.goalPos.x;
551 y = actor->fly.goalPos.y;
552 z = actor->fly.goalPos.z;
553
554 evt_set_variable(script, outX, x);
555 evt_set_variable(script, outY, y);
556 evt_set_variable(script, outZ, z);
557
558 return ApiStatus_DONE2;
559}
560
561API_CALLABLE(GetPartTarget) {
562 Bytecode* args = script->ptrReadPos;
563 s32 actorID = evt_get_variable(script, *args++);
564 s32 partID = evt_get_variable(script, *args++);
565 Actor* actor;
566 ActorPart* actorPart;
567 s32 outX, outY, outZ;
568 s32 x, y, z;
569
570 if (actorID == ACTOR_SELF) {
571 actorID = script->owner1.actorID;
572 }
573
574 actor = get_actor(actorID);
575 actorPart = get_actor_part(actor, partID);
576
577 outX = *args++;
578 outY = *args++;
579 outZ = *args++;
580
581 x = actorPart->movement->goalPos.x;
582 y = actorPart->movement->goalPos.y;
583 z = actorPart->movement->goalPos.z;
584
585 evt_set_variable(script, outX, x);
586 evt_set_variable(script, outY, y);
587 evt_set_variable(script, outZ, z);
588
589 return ApiStatus_DONE2;
590}
591
592API_CALLABLE(GetActorPos) {
593 Bytecode* args = script->ptrReadPos;
594 s32 actorID = evt_get_variable(script, *args++);
595 Actor* actor;
596 s32 outX, outY, outZ;
597 s32 x, y, z;
598
599 if (actorID == ACTOR_SELF) {
600 actorID = script->owner1.actorID;
601 }
602
603 actor = get_actor(actorID);
604
605 outX = *args++;
606 outY = *args++;
607 outZ = *args++;
608
609 x = actor->curPos.x;
610 y = actor->curPos.y;
611 z = actor->curPos.z;
612
613 evt_set_variable(script, outX, x);
614 evt_set_variable(script, outY, y);
615 evt_set_variable(script, outZ, z);
616
617 return ApiStatus_DONE2;
618}
619
620API_CALLABLE(GetPartOffset) {
621 Bytecode* args = script->ptrReadPos;
622 s32 actorID = evt_get_variable(script, *args++);
623 s32 partID;
624 ActorPart* actorPart;
625 s32 outX, outY, outZ;
626 s32 x, y, z;
627
628 if (actorID == ACTOR_SELF) {
629 actorID = script->owner1.actorID;
630 }
631
632 partID = evt_get_variable(script, *args++);
633 actorPart = get_actor_part(get_actor(actorID), partID);
634
635 outX = *args++;
636 outY = *args++;
637 outZ = *args++;
638
639 if (!(actorPart->flags & ACTOR_PART_FLAG_USE_ABSOLUTE_POSITION)) {
640 x = actorPart->partOffset.x;
641 y = actorPart->partOffset.y;
642 z = actorPart->partOffset.z;
643 } else {
644 x = actorPart->absolutePos.x;
645 y = actorPart->absolutePos.y;
646 z = actorPart->absolutePos.z;
647 }
648
649 evt_set_variable(script, outX, x);
650 evt_set_variable(script, outY, y);
651 evt_set_variable(script, outZ, z);
652
653 return ApiStatus_DONE2;
654}
655
656API_CALLABLE(GetPartPos) {
657 Bytecode* args = script->ptrReadPos;
658 s32 actorID = evt_get_variable(script, *args++);
659 s32 partID;
660 ActorPart* actorPart;
661 s32 outX, outY, outZ;
662 s32 x, y, z;
663
664 if (actorID == ACTOR_SELF) {
665 actorID = script->owner1.actorID;
666 }
667
668 partID = evt_get_variable(script, *args++);
669 actorPart = get_actor_part(get_actor(actorID), partID);
670
671 outX = *args++;
672 outY = *args++;
673 outZ = *args++;
674
675 x = actorPart->curPos.x;
676 y = actorPart->curPos.y;
677 z = actorPart->curPos.z;
678
679 evt_set_variable(script, outX, x);
680 evt_set_variable(script, outY, y);
681 evt_set_variable(script, outZ, z);
682
683 return ApiStatus_DONE2;
684}
685
686API_CALLABLE(GetHomePos) {
687 Bytecode* args = script->ptrReadPos;
688 s32 actorID = evt_get_variable(script, *args++);
689 Actor* actor;
690 s32 outX, outY, outZ;
691 s32 x, y, z;
692
693 if (actorID == ACTOR_SELF) {
694 actorID = script->owner1.actorID;
695 }
696
697 actor = get_actor(actorID);
698
699 outX = *args++;
700 outY = *args++;
701 outZ = *args++;
702
703 x = actor->homePos.x;
704 y = actor->homePos.y;
705 z = actor->homePos.z;
706
707 evt_set_variable(script, outX, x);
708 evt_set_variable(script, outY, y);
709 evt_set_variable(script, outZ, z);
710
711 return ApiStatus_DONE2;
712}
713
714API_CALLABLE(SetActorPos) {
715 Bytecode* args = script->ptrReadPos;
716 s32 actorID = evt_get_variable(script, *args++);
717 Actor* actor;
718 f32 x, y, z;
719
720 if (actorID == ACTOR_SELF) {
721 actorID = script->owner1.actorID;
722 }
723
724 x = evt_get_variable(script, *args++);
725 y = evt_get_variable(script, *args++);
726 z = evt_get_variable(script, *args++);
727
728 actor = get_actor(actorID);
729 actor->curPos.x = x;
730 actor->curPos.y = y;
731 actor->curPos.z = z;
732
733 return ApiStatus_DONE2;
734}
735
736API_CALLABLE(SetPartPos) {
737 Bytecode* args = script->ptrReadPos;
738 s32 actorID = evt_get_variable(script, *args++);
739 Actor* actor;
740 s32 partID;
741 f32 x, y, z;
742 ActorPart* actorPart;
743
744 if (actorID == ACTOR_SELF) {
745 actorID = script->owner1.actorID;
746 }
747
748 partID = evt_get_variable(script, *args++);
749 x = evt_get_variable(script, *args++);
750 y = evt_get_variable(script, *args++);
751 z = evt_get_variable(script, *args++);
752
753 actor = get_actor(actorID);
754
755 switch (actorID & ACTOR_CLASS_MASK) {
757 actor->curPos.x = x;
758 actor->curPos.y = y;
759 actor->curPos.z = z;
760 break;
763 actorPart = get_actor_part(actor, partID);
764
765 if (!(actorPart->flags & ACTOR_PART_FLAG_USE_ABSOLUTE_POSITION)) {
766 actorPart->partOffset.x = x;
767 actorPart->partOffset.y = y;
768 actorPart->partOffset.z = z;
769 } else {
770 actorPart->absolutePos.x = x;
771 actorPart->absolutePos.y = y;
772 actorPart->absolutePos.z = z;
773 }
774 break;
775 }
776
777 return ApiStatus_DONE2;
778}
779
780API_CALLABLE(SetEnemyTargetOffset) {
781 Bytecode* args = script->ptrReadPos;
782 s32 actorID = evt_get_variable(script, *args++);
783 Actor* actor;
784 s32 partID;
785 f32 x, y;
786 ActorPart* actorPart;
787
788 if (actorID == ACTOR_SELF) {
789 actorID = script->owner1.actorID;
790 }
791
792 partID = evt_get_variable(script, *args++);
793 x = evt_get_variable(script, *args++);
794 y = evt_get_variable(script, *args++);
795
796 actor = get_actor(actorID);
797
798 switch (actorID & ACTOR_CLASS_MASK) {
800 break;
803 actorPart = get_actor_part(actor, partID);
804 actorPart->targetOffset.x = x;
805 actorPart->targetOffset.y = y;
806 break;
807 }
808
809 return ApiStatus_DONE2;
810}
811
812API_CALLABLE(SetAnimation) {
813 Bytecode* args = script->ptrReadPos;
814 s32 actorID = evt_get_variable(script, *args++);
815 Actor* actor;
816 s32 partID;
817 AnimID animID;
818
819 if (actorID == ACTOR_SELF) {
820 actorID = script->owner1.actorID;
821 }
822
823 partID = evt_get_variable(script, *args++);
824 animID = evt_get_variable(script, *args++);
825
826 set_actor_anim(actorID, partID, animID);
827
828 return ApiStatus_DONE2;
829}
830
831API_CALLABLE(GetAnimation) {
832 Bytecode* args = script->ptrReadPos;
833 s32 actorID = evt_get_variable(script, *args++);
834 s32 partID;
835 ActorPart* actorPart;
836 s32 outVar;
837
838 if (actorID == ACTOR_SELF) {
839 actorID = script->owner1.actorID;
840 }
841 partID = evt_get_variable(script, *args++);
842 outVar = *args++;
843
844 actorPart = get_actor_part(get_actor(actorID), partID);
845
846 if (actorPart != NULL) {
847 evt_set_variable(script, outVar, actorPart->curAnimation);
848 }
849 return ApiStatus_DONE2;
850}
851
852API_CALLABLE(SetAnimationRate) {
853 Bytecode* args = script->ptrReadPos;
854 s32 actorID = evt_get_variable(script, *args++);
855 Actor* actor;
856 s32 partID;
857 f32 rate;
858
859 if (actorID == ACTOR_SELF) {
860 actorID = script->owner1.actorID;
861 }
862
863 partID = evt_get_variable(script, *args++);
864 rate = evt_get_float_variable(script, *args++);
865
866 set_actor_anim_rate(actorID, partID, rate);
867
868 return ApiStatus_DONE2;
869}
870
871API_CALLABLE(SetActorYaw) {
872 Bytecode* args = script->ptrReadPos;
873 s32 actorID = evt_get_variable(script, *args++);
874
875 if (actorID == ACTOR_SELF) {
876 actorID = script->owner1.actorID;
877 }
878
879 set_actor_yaw(actorID, evt_get_variable(script, *args++));
880 return ApiStatus_DONE2;
881}
882
883API_CALLABLE(GetActorYaw) {
884 Bytecode* args = script->ptrReadPos;
885 s32 actorID = evt_get_variable(script, *args++);
886 s32 a1;
887
888 if (actorID == ACTOR_SELF) {
889 actorID = script->owner1.actorID;
890 }
891
892 a1 = *args++;
893
894 evt_set_variable(script, a1, get_actor(actorID)->yaw);
895 return ApiStatus_DONE2;
896}
897
898API_CALLABLE(SetPartYaw) {
899 Bytecode* args = script->ptrReadPos;
900 s32 actorID = evt_get_variable(script, *args++);
901 s32 partID;
902 s32 yaw;
903
904 if (actorID == ACTOR_SELF) {
905 actorID = script->owner1.actorID;
906 }
907
908 partID = evt_get_variable(script, *args++);
909 yaw = evt_get_variable(script, *args++);
910
911 set_part_yaw(actorID, partID, yaw);
912 return ApiStatus_DONE2;
913}
914
915API_CALLABLE(GetPartYaw) {
916 Bytecode* args = script->ptrReadPos;
917 s32 actorID = evt_get_variable(script, *args++);
918 s32 partID;
919 s32 a1;
920
921 if (actorID == ACTOR_SELF) {
922 actorID = script->owner1.actorID;
923 }
924
925 partID = evt_get_variable(script, *args++);
926 a1 = *args++;
927
928 evt_set_variable(script, a1, get_actor_part(get_actor(actorID), partID)->yaw);
929 return ApiStatus_DONE2;
930}
931
932API_CALLABLE(SetActorJumpGravity) {
933 Bytecode* args = script->ptrReadPos;
934 s32 actorID = evt_get_variable(script, *args++);
935 f32 jumpAccel;
936
937 if (actorID == ACTOR_SELF) {
938 actorID = script->owner1.actorID;
939 }
940
941 jumpAccel = evt_get_float_variable(script, *args++);
942 get_actor(actorID)->state.acceleration = jumpAccel;
943 return ApiStatus_DONE2;
944}
945
946API_CALLABLE(SetActorIdleJumpGravity) {
947 Bytecode* args = script->ptrReadPos;
948 s32 actorID = evt_get_variable(script, *args++);
949 f32 flyJumpAccel;
950
951 if (actorID == ACTOR_SELF) {
952 actorID = script->owner1.actorID;
953 }
954
955 flyJumpAccel = evt_get_float_variable(script, *args++);
956 get_actor(actorID)->fly.acceleration = flyJumpAccel;
957 return ApiStatus_DONE2;
958}
959
960API_CALLABLE(SetActorSpeed) {
961 Bytecode* args = script->ptrReadPos;
962 s32 actorID = evt_get_variable(script, *args++);
963 f32 moveSpeed;
964
965 if (actorID == ACTOR_SELF) {
966 actorID = script->owner1.actorID;
967 }
968
969 moveSpeed = evt_get_float_variable(script, *args++);
970 get_actor(actorID)->state.speed = moveSpeed;
971 return ApiStatus_DONE2;
972}
973
974// SetActorFlySpeed?
975API_CALLABLE(SetActorIdleSpeed) {
976 Bytecode* args = script->ptrReadPos;
977 s32 actorID = evt_get_variable(script, *args++);
978 f32 flySpeed;
979
980 if (actorID == ACTOR_SELF) {
981 actorID = script->owner1.actorID;
982 }
983
984 flySpeed = evt_get_float_variable(script, *args++);
985 get_actor(actorID)->fly.speed = flySpeed;
986 return ApiStatus_DONE2;
987}
988
989API_CALLABLE(SetPartJumpGravity) {
990 Bytecode* args = script->ptrReadPos;
991 s32 actorID = evt_get_variable(script, *args++);
992 s32 partID;
993 f32 jumpScale;
994
995 if (actorID == ACTOR_SELF) {
996 actorID = script->owner1.actorID;
997 }
998
999 partID = evt_get_variable(script, *args++);
1000 jumpScale = evt_get_float_variable(script, *args++);
1001
1002 get_actor_part(get_actor(actorID), partID)->movement->jumpScale = jumpScale;
1003 return ApiStatus_DONE2;
1004}
1005
1006API_CALLABLE(SetPartMoveSpeed) {
1007 Bytecode* args = script->ptrReadPos;
1008 s32 actorID = evt_get_variable(script, *args++);
1009 s32 partID;
1010 f32 moveSpeed;
1011
1012 if (actorID == ACTOR_SELF) {
1013 actorID = script->owner1.actorID;
1014 }
1015
1016 partID = evt_get_variable(script, *args++);
1017 moveSpeed = evt_get_float_variable(script, *args++);
1018
1019 get_actor_part(get_actor(actorID), partID)->movement->moveSpeed = moveSpeed;
1020 return ApiStatus_DONE2;
1021}
1022
1023API_CALLABLE(SetJumpAnimations) {
1024 Bytecode* args = script->ptrReadPos;
1025 s32 actorID = evt_get_variable(script, *args++);
1026 Actor* actor;
1027 s32 jumpPartIndex;
1028 s32 animJumpRise;
1029 s32 animJumpFall;
1030 s32 animJumpLand;
1031
1032 if (actorID == ACTOR_SELF) {
1033 actorID = script->owner1.actorID;
1034 }
1035
1036 jumpPartIndex = evt_get_variable(script, *args++);
1037 animJumpRise = *args++;
1038 animJumpFall = *args++;
1039 animJumpLand = *args++;
1040
1041 actor = get_actor(actorID);
1042 actor->state.jumpPartIndex = jumpPartIndex;
1043 actor->state.animJumpRise = animJumpRise;
1044 actor->state.animJumpFall = animJumpFall;
1045 actor->state.animJumpLand = animJumpLand;
1046
1047 return ApiStatus_DONE2;
1048}
1049
1050API_CALLABLE(AddActorPos) {
1051 Bytecode* args = script->ptrReadPos;
1052 s32 actorID = evt_get_variable(script, *args++);
1053 Actor* actor;
1054 f32 x, y, z;
1055
1056 if (actorID == ACTOR_SELF) {
1057 actorID = script->owner1.actorID;
1058 }
1059
1060 x = evt_get_float_variable(script, *args++);
1061 y = evt_get_float_variable(script, *args++);
1062 z = evt_get_float_variable(script, *args++);
1063
1064 actor = get_actor(actorID);
1065 actor->curPos.x += x;
1066 actor->curPos.y += y;
1067 actor->curPos.z += z;
1068
1069 return ApiStatus_DONE2;
1070}
1071
1072API_CALLABLE(SetActorDispOffset) {
1073 Bytecode* args = script->ptrReadPos;
1074 s32 actorID = evt_get_variable(script, *args++);
1075 Actor* actor;
1076 f32 x, y, z;
1077
1078 if (actorID == ACTOR_SELF) {
1079 actorID = script->owner1.actorID;
1080 }
1081
1082 x = evt_get_float_variable(script, *args++);
1083 y = evt_get_float_variable(script, *args++);
1084 z = evt_get_float_variable(script, *args++);
1085
1086 actor = get_actor(actorID);
1087 actor->headOffset.x = x;
1088 actor->headOffset.y = y;
1089 actor->headOffset.z = z;
1090
1091 return ApiStatus_DONE2;
1092}
1093
1094API_CALLABLE(GetPartDispOffset) {
1095 Bytecode* args = script->ptrReadPos;
1096 s32 actorID = evt_get_variable(script, *args++);
1097 ActorPart* actorPart;
1098 s32 partID;
1099 s32 outX, outY, outZ;
1100 f32 x, y, z;
1101
1102 if (actorID == ACTOR_SELF) {
1103 actorID = script->owner1.actorID;
1104 }
1105
1106 partID = evt_get_variable(script, *args++);
1107 outX = *args++;
1108 outY = *args++;
1109 outZ = *args++;
1110
1111 actorPart = get_actor_part(get_actor(actorID), partID);
1112
1113 if (!(actorPart->flags & ACTOR_PART_FLAG_USE_ABSOLUTE_POSITION)) {
1114 x = actorPart->partOffset.x;
1115 y = actorPart->partOffset.y;
1116 z = actorPart->partOffset.z;
1117 } else {
1118 x = actorPart->visualOffset.x;
1119 y = actorPart->visualOffset.y;
1120 z = actorPart->visualOffset.z;
1121 }
1122
1123 evt_set_variable(script, outX, x);
1124 evt_set_variable(script, outY, y);
1125 evt_set_variable(script, outZ, z);
1126
1127 return ApiStatus_DONE2;
1128}
1129
1130API_CALLABLE(SetPartDispOffset) {
1131 Bytecode* args = script->ptrReadPos;
1132 s32 actorID = evt_get_variable(script, *args++);
1133 ActorPart* actorPart;
1134 s32 partID;
1135 f32 x, y, z;
1136
1137 if (actorID == ACTOR_SELF) {
1138 actorID = script->owner1.actorID;
1139 }
1140
1141 partID = evt_get_variable(script, *args++);
1142
1143 x = evt_get_float_variable(script, *args++);
1144 y = evt_get_float_variable(script, *args++);
1145 z = evt_get_float_variable(script, *args++);
1146 actorPart = get_actor_part(get_actor(actorID), partID);
1147
1148 if (!(actorPart->flags & ACTOR_PART_FLAG_USE_ABSOLUTE_POSITION)) {
1149 actorPart->partOffset.x = x;
1150 actorPart->partOffset.y = y;
1151 actorPart->partOffset.z = z;
1152 } else {
1153 actorPart->visualOffset.x = x;
1154 actorPart->visualOffset.y = y;
1155 actorPart->visualOffset.z = z;
1156 }
1157
1158 return ApiStatus_DONE2;
1159}
1160
1161API_CALLABLE(AddPartDispOffset) {
1162 Bytecode* args = script->ptrReadPos;
1163 s32 actorID = evt_get_variable(script, *args++);
1164 ActorPart* actorPart;
1165 s32 partID;
1166 f32 x, y, z;
1167
1168 if (actorID == ACTOR_SELF) {
1169 actorID = script->owner1.actorID;
1170 }
1171
1172 partID = evt_get_variable(script, *args++);
1173
1174 x = evt_get_float_variable(script, *args++);
1175 y = evt_get_float_variable(script, *args++);
1176 z = evt_get_float_variable(script, *args++);
1177 actorPart = get_actor_part(get_actor(actorID), partID);
1178
1179 if (!(actorPart->flags & ACTOR_PART_FLAG_USE_ABSOLUTE_POSITION)) {
1180 actorPart->partOffset.x += x;
1181 actorPart->partOffset.y += y;
1182 actorPart->partOffset.z += z;
1183 } else {
1184 actorPart->visualOffset.x += x;
1185 actorPart->visualOffset.y += y;
1186 actorPart->visualOffset.z += z;
1187 }
1188
1189 return ApiStatus_DONE2;
1190}
1191
1192API_CALLABLE(FreezeBattleState) {
1193 BattleStatus* battleStatus = &gBattleStatus;
1194 BattleStatus* battleStatus2 = &gBattleStatus;
1195 Bytecode* args = script->ptrReadPos;
1196 b32 increaseFreeze = evt_get_variable(script, *args++);
1197
1198 if (increaseFreeze) {
1199 battleStatus->stateFreezeCount++;
1200 } else if (battleStatus->stateFreezeCount > 0) {
1201 battleStatus2->stateFreezeCount--;
1202 }
1203
1204 return ApiStatus_DONE2;
1205}
1206
1207API_CALLABLE(GetActorVar) {
1208 Bytecode* args = script->ptrReadPos;
1209 s32 actorID = evt_get_variable(script, *args++);
1210 s32 var1;
1211 s32 a2;
1212
1213 if (actorID == ACTOR_SELF) {
1214 actorID = script->owner1.actorID;
1215 }
1216
1217 var1 = evt_get_variable(script, *args++);
1218 a2 = *args++;
1219
1220 evt_set_variable(script, a2, get_actor(actorID)->state.varTable[var1]);
1221
1222 return ApiStatus_DONE2;
1223}
1224
1225API_CALLABLE(SetActorVar) {
1226 Bytecode* args = script->ptrReadPos;
1227 s32 actorID = evt_get_variable(script, *args++);
1228 s32 index;
1229 s32 val;
1230
1231 if (actorID == ACTOR_SELF) {
1232 actorID = script->owner1.actorID;
1233 }
1234
1235 index = evt_get_variable(script, *args++);
1236 val = evt_get_variable(script, *args++);
1237
1238 get_actor(actorID)->state.varTable[index] = val;
1239
1240 return ApiStatus_DONE2;
1241}
1242
1243API_CALLABLE(AddActorVar) {
1244 Bytecode* args = script->ptrReadPos;
1245 s32 actorID = evt_get_variable(script, *args++);
1246 s32 index;
1247 s32 val;
1248 ActorState* state;
1249
1250 if (actorID == ACTOR_SELF) {
1251 actorID = script->owner1.actorID;
1252 }
1253
1254 index = evt_get_variable(script, *args++);
1255 val = evt_get_variable(script, *args++);
1256
1257 state = &get_actor(actorID)->state;
1258 state->varTable[index] += val;
1259
1260 return ApiStatus_DONE2;
1261}
1262
1263API_CALLABLE(GetPartMovementVar) {
1264 Bytecode* args = script->ptrReadPos;
1265 s32 actorID = evt_get_variable(script, *args++);
1266 s32 partID;
1267 s32 tableIndex;
1268 s32 outVar;
1269
1270 if (actorID == ACTOR_SELF) {
1271 actorID = script->owner1.actorID;
1272 }
1273
1274 partID = evt_get_variable(script, *args++);
1275 tableIndex = evt_get_variable(script, *args++);
1276 outVar = *args++;
1277
1278 evt_set_variable(script, outVar, get_actor_part(get_actor(actorID), partID)->movement->varTable[tableIndex]);
1279
1280 return ApiStatus_DONE2;
1281}
1282
1283API_CALLABLE(SetPartMovementVar) {
1284 Bytecode* args = script->ptrReadPos;
1285 s32 actorID = evt_get_variable(script, *args++);
1286 s32 partID;
1287 s32 tableIndex;
1288 s32 val;
1289
1290 if (actorID == ACTOR_SELF) {
1291 actorID = script->owner1.actorID;
1292 }
1293
1294 partID = evt_get_variable(script, *args++);
1295 tableIndex = evt_get_variable(script, *args++);
1296 val = evt_get_variable(script, *args++);
1297
1298 get_actor_part(get_actor(actorID), partID)->movement->varTable[tableIndex] = val;
1299
1300 return ApiStatus_DONE2;
1301}
1302
1303API_CALLABLE(AddPartMovementVar) {
1304 Bytecode* args = script->ptrReadPos;
1305 s32 actorID = evt_get_variable(script, *args++);
1306 s32 partID;
1307 s32 tableIndex;
1308 s32 val;
1309
1310 if (actorID == ACTOR_SELF) {
1311 actorID = script->owner1.actorID;
1312 }
1313
1314 partID = evt_get_variable(script, *args++);
1315 tableIndex = evt_get_variable(script, *args++);
1316 val = evt_get_variable(script, *args++);
1317
1318 get_actor_part(get_actor(actorID), partID)->movement->varTable[tableIndex] += val;
1319
1320 return ApiStatus_DONE2;
1321}
1322
1323API_CALLABLE(SetActorRotation) {
1324 Bytecode* args = script->ptrReadPos;
1325 s32 actorID = evt_get_variable(script, *args++);
1326 Actor* actor;
1327 s32 x, y, z;
1328
1329 if (actorID == ACTOR_SELF) {
1330 actorID = script->owner1.actorID;
1331 }
1332
1333 x = evt_get_float_variable(script, *args++);
1334 y = evt_get_float_variable(script, *args++);
1335 z = evt_get_float_variable(script, *args++);
1336
1337 actor = get_actor(actorID);
1338
1339 if (x != EVT_IGNORE_ARG) {
1340 actor->rot.x = x;
1341 }
1342
1343 if (y != EVT_IGNORE_ARG) {
1344 actor->rot.y = y;
1345 }
1346
1347 if (z != EVT_IGNORE_ARG) {
1348 actor->rot.z = z;
1349 }
1350
1351 return ApiStatus_DONE2;
1352}
1353
1354API_CALLABLE(SetActorRotationOffset) {
1355 Bytecode* args = script->ptrReadPos;
1356 s32 actorID = evt_get_variable(script, *args++);
1357 Actor* actor;
1358 s32 x, y, z;
1359
1360 if (actorID == ACTOR_SELF) {
1361 actorID = script->owner1.actorID;
1362 }
1363
1364 x = evt_get_float_variable(script, *args++);
1365 y = evt_get_float_variable(script, *args++);
1366 z = evt_get_float_variable(script, *args++);
1367
1368 actor = get_actor(actorID);
1369
1370 actor->rotPivotOffset.x = x;
1371 actor->rotPivotOffset.y = y;
1372 actor->rotPivotOffset.z = z;
1373
1374 return ApiStatus_DONE2;
1375}
1376
1377API_CALLABLE(GetActorRotation) {
1378 Bytecode* args = script->ptrReadPos;
1379 s32 actorID = evt_get_variable(script, *args++);
1380 Actor* actor;
1381 s32 x, y, z;
1382
1383 if (actorID == ACTOR_SELF) {
1384 actorID = script->owner1.actorID;
1385 }
1386
1387 x = *args++;
1388 y = *args++;
1389 z = *args++;
1390
1391 actor = get_actor(actorID);
1392
1393 evt_set_variable(script, x, actor->rot.x);
1394 evt_set_variable(script, y, actor->rot.y);
1395 evt_set_variable(script, z, actor->rot.z);
1396
1397 return ApiStatus_DONE2;
1398}
1399
1400API_CALLABLE(SetPartRotation) {
1401 Bytecode* args = script->ptrReadPos;
1402 s32 actorID = evt_get_variable(script, *args++);
1403 s32 partID = evt_get_variable(script, *args++);
1404 ActorPart* actorPart;
1405 s32 x, y, z;
1406
1407 if (actorID == ACTOR_SELF) {
1408 actorID = script->owner1.actorID;
1409 }
1410
1411 x = evt_get_float_variable(script, *args++);
1412 y = evt_get_float_variable(script, *args++);
1413 z = evt_get_float_variable(script, *args++);
1414
1415 actorPart = get_actor_part(get_actor(actorID), partID);
1416
1417 actorPart->rot.x = x;
1418 actorPart->rot.y = y;
1419 actorPart->rot.z = z;
1420
1421 return ApiStatus_DONE2;
1422}
1423
1424API_CALLABLE(SetPartRotationOffset) {
1425 Bytecode* args = script->ptrReadPos;
1426 s32 actorID = evt_get_variable(script, *args++);
1427 s32 partID = evt_get_variable(script, *args++);
1428 ActorPart* actorPart;
1429 s32 x, y, z;
1430
1431 if (actorID == ACTOR_SELF) {
1432 actorID = script->owner1.actorID;
1433 }
1434
1435 x = evt_get_float_variable(script, *args++);
1436 y = evt_get_float_variable(script, *args++);
1437 z = evt_get_float_variable(script, *args++);
1438
1439 actorPart = get_actor_part(get_actor(actorID), partID);
1440
1441 actorPart->rotPivotOffset.x = x;
1442 actorPart->rotPivotOffset.y = y;
1443 actorPart->rotPivotOffset.z = z;
1444
1445 return ApiStatus_DONE2;
1446}
1447
1448API_CALLABLE(GetPartRotation) {
1449 Bytecode* args = script->ptrReadPos;
1450 s32 actorID = evt_get_variable(script, *args++);
1451 s32 partID = evt_get_variable(script, *args++);
1452 ActorPart* actorPart;
1453 s32 x, y, z;
1454
1455 if (actorID == ACTOR_SELF) {
1456 actorID = script->owner1.actorID;
1457 }
1458
1459 x = *args++;
1460 y = *args++;
1461 z = *args++;
1462
1463 actorPart = get_actor_part(get_actor(actorID), partID);
1464
1465 evt_set_float_variable(script, x, actorPart->rot.x);
1466 evt_set_float_variable(script, y, actorPart->rot.y);
1467 evt_set_float_variable(script, z, actorPart->rot.z);
1468
1469 return ApiStatus_DONE2;
1470}
1471
1472API_CALLABLE(SetActorScale) {
1473 Bytecode* args = script->ptrReadPos;
1474 s32 actorID = evt_get_variable(script, *args++);
1475 Actor* actor;
1476 f32 x, y, z;
1477
1478 if (actorID == ACTOR_SELF) {
1479 actorID = script->owner1.actorID;
1480 }
1481
1482 x = evt_get_float_variable(script, *args++);
1483 y = evt_get_float_variable(script, *args++);
1484 z = evt_get_float_variable(script, *args++);
1485
1486 actor = get_actor(actorID);
1487
1488 actor->scale.x = x;
1489 actor->scale.y = y;
1490 actor->scale.z = z;
1491
1492 return ApiStatus_DONE2;
1493}
1494
1495API_CALLABLE(SetActorScaleModifier) {
1496 Bytecode* args = script->ptrReadPos;
1497 s32 actorID = evt_get_variable(script, *args++);
1498 Actor* actor;
1499 f32 x, y, z;
1500
1501 if (actorID == ACTOR_SELF) {
1502 actorID = script->owner1.actorID;
1503 }
1504
1505 x = evt_get_float_variable(script, *args++);
1506 y = evt_get_float_variable(script, *args++);
1507 z = evt_get_float_variable(script, *args++);
1508
1509 actor = get_actor(actorID);
1510
1511 actor->scaleModifier.x = x;
1512 actor->scaleModifier.y = y;
1513 actor->scaleModifier.z = z;
1514
1515 return ApiStatus_DONE2;
1516}
1517
1518API_CALLABLE(GetActorScale) {
1519 Bytecode* args = script->ptrReadPos;
1520 s32 actorID = evt_get_variable(script, *args++);
1521 Actor* actor;
1522 f32 x, y, z;
1523
1524 if (actorID == ACTOR_SELF) {
1525 actorID = script->owner1.actorID;
1526 }
1527
1528 x = *args++;
1529 y = *args++;
1530 z = *args++;
1531
1532 actor = get_actor(actorID);
1533
1534 evt_set_float_variable(script, x, actor->scale.x);
1535 evt_set_float_variable(script, y, actor->scale.y);
1536 evt_set_float_variable(script, z, actor->scale.z);
1537
1538 return ApiStatus_DONE2;
1539}
1540
1541API_CALLABLE(SetPartScale) {
1542 Bytecode* args = script->ptrReadPos;
1543 s32 actorID = evt_get_variable(script, *args++);
1544 s32 partID = evt_get_variable(script, *args++);
1545 ActorPart* actorPart;
1546 f32 x, y, z;
1547
1548 if (actorID == ACTOR_SELF) {
1549 actorID = script->owner1.actorID;
1550 }
1551
1552 x = evt_get_float_variable(script, *args++);
1553 y = evt_get_float_variable(script, *args++);
1554 z = evt_get_float_variable(script, *args++);
1555
1556 actorPart = get_actor_part(get_actor(actorID), partID);
1557
1558 actorPart->scale.x = x;
1559 actorPart->scale.y = y;
1560 actorPart->scale.z = z;
1561
1562 return ApiStatus_DONE2;
1563}
1564
1565API_CALLABLE(GetPartScale) {
1566 Bytecode* args = script->ptrReadPos;
1567 s32 actorID = evt_get_variable(script, *args++);
1568 s32 partID = evt_get_variable(script, *args++);
1569 ActorPart* actorPart;
1570 s32 x, y, z;
1571
1572 if (actorID == ACTOR_SELF) {
1573 actorID = script->owner1.actorID;
1574 }
1575
1576 x = *args++;
1577 y = *args++;
1578 z = *args++;
1579
1580 actorPart = get_actor_part(get_actor(actorID), partID);
1581
1582 evt_set_float_variable(script, x, actorPart->scale.x);
1583 evt_set_float_variable(script, y, actorPart->scale.y);
1584 evt_set_float_variable(script, z, actorPart->scale.z);
1585
1586 return ApiStatus_DONE2;
1587}
1588
1589API_CALLABLE(GetBattleFlags) {
1590 evt_set_variable(script, *script->ptrReadPos, gBattleStatus.flags1);
1591 return ApiStatus_DONE2;
1592}
1593
1594API_CALLABLE(SetBattleFlagBits) {
1595 Bytecode* args = script->ptrReadPos;
1596 s32 bits = *args++;
1597 s32 mode = evt_get_variable(script, *args++);
1598
1599 if (mode) {
1600 gBattleStatus.flags1 |= bits;
1601 } else {
1602 gBattleStatus.flags1 &= ~bits;
1603 }
1604
1605 return ApiStatus_DONE2;
1606}
1607
1608API_CALLABLE(GetBattleFlags2) {
1609 evt_set_variable(script, *script->ptrReadPos, gBattleStatus.flags2);
1610 return ApiStatus_DONE2;
1611}
1612
1613API_CALLABLE(SetBattleFlagBits2) {
1614 Bytecode* args = script->ptrReadPos;
1615 s32 bits = *args++;
1616 s32 mode = evt_get_variable(script, *args++);
1617
1618 if (mode) {
1619 gBattleStatus.flags2 |= bits;
1620 } else {
1621 gBattleStatus.flags2 &= ~bits;
1622 }
1623
1624 return ApiStatus_DONE2;
1625}
1626
1627API_CALLABLE(SetActorFlags) {
1628 Bytecode* args = script->ptrReadPos;
1629 s32 actorID = evt_get_variable(script, *args++);
1630 s32 flagBits;
1631
1632 if (actorID == ACTOR_SELF) {
1633 actorID = script->owner1.actorID;
1634 }
1635
1636 flagBits = *args++;
1637 get_actor(actorID)->flags = flagBits;
1638
1639 return ApiStatus_DONE2;
1640}
1641
1642API_CALLABLE(SetActorFlagBits) {
1643 Bytecode* args = script->ptrReadPos;
1644 s32 actorID = evt_get_variable(script, *args++);
1645 s32 bits;
1646 s32 mode;
1647 Actor* actor;
1648
1649 if (actorID == ACTOR_SELF) {
1650 actorID = script->owner1.actorID;
1651 }
1652
1653 bits = *args++;
1654 mode = evt_get_variable(script, *args++);
1655 actor = get_actor(actorID);
1656
1657 if (mode) {
1658 actor->flags |= bits;
1659 } else {
1660 actor->flags &= ~bits;
1661 }
1662
1663 return ApiStatus_DONE2;
1664}
1665
1666API_CALLABLE(GetActorFlags) {
1667 Bytecode* args = script->ptrReadPos;
1668 s32 actorID = evt_get_variable(script, *args++);
1669 s32 outVar;
1670
1671 if (actorID == ACTOR_SELF) {
1672 actorID = script->owner1.actorID;
1673 }
1674
1675 outVar = *args++;
1676
1677 evt_set_variable(script, outVar, get_actor(actorID)->flags);
1678
1679 return ApiStatus_DONE2;
1680}
1681
1682API_CALLABLE(SetPartFlags) {
1683 Bytecode* args = script->ptrReadPos;
1684 s32 actorID = evt_get_variable(script, *args++);
1685 s32 flagBits;
1686 s32 partID;
1687
1688 if (actorID == ACTOR_SELF) {
1689 actorID = script->owner1.actorID;
1690 }
1691
1692 partID = evt_get_variable(script, *args++);
1693 flagBits = *args++;
1694
1695 get_actor_part(get_actor(actorID), partID)->flags = flagBits;
1696
1697 return ApiStatus_DONE2;
1698}
1699
1700API_CALLABLE(SetPartFlagBits) {
1701 Bytecode* args = script->ptrReadPos;
1702 s32 actorID = evt_get_variable(script, *args++);
1703 ActorPart* actorPart;
1704 s32 bits;
1705 s32 partID;
1706 s32 mode;
1707
1708 if (actorID == ACTOR_SELF) {
1709 actorID = script->owner1.actorID;
1710 }
1711
1712 partID = evt_get_variable(script, *args++);
1713 bits = *args++;
1714 mode = evt_get_variable(script, *args++);
1715
1716 actorPart = get_actor_part(get_actor(actorID), partID);
1717
1718 if (mode) {
1719 actorPart->flags |= bits;
1720 } else {
1721 actorPart->flags &= ~bits;
1722 }
1723
1724 return ApiStatus_DONE2;
1725}
1726
1727API_CALLABLE(SetPartTargetFlags) {
1728 Bytecode* args = script->ptrReadPos;
1729 s32 actorID = evt_get_variable(script, *args++);
1730 ActorPart* actorPart;
1731 s32 flagBits;
1732 s32 partID;
1733
1734 if (actorID == ACTOR_SELF) {
1735 actorID = script->owner1.actorID;
1736 }
1737
1738 partID = evt_get_variable(script, *args++);
1739 flagBits = *args++;
1740
1741 get_actor_part(get_actor(actorID), partID)->targetFlags = flagBits;
1742
1743 return ApiStatus_DONE2;
1744}
1745
1746API_CALLABLE(SetPartTargetFlagBits) {
1747 Bytecode* args = script->ptrReadPos;
1748 s32 actorID = evt_get_variable(script, *args++);
1749 ActorPart* actorPart;
1750 s32 partID;
1751 s32 bits;
1752 s32 mode;
1753
1754 if (actorID == ACTOR_SELF) {
1755 actorID = script->owner1.actorID;
1756 }
1757
1758 partID = evt_get_variable(script, *args++);
1759 bits = *args++;
1760 mode = evt_get_variable(script, *args++);
1761
1762 actorPart = get_actor_part(get_actor(actorID), partID);
1763
1764 if (mode) {
1765 actorPart->targetFlags |= bits;
1766 } else {
1767 actorPart->targetFlags &= ~bits;
1768 }
1769
1770 return ApiStatus_DONE2;
1771}
1772
1773API_CALLABLE(GetPartFlags) {
1774 Bytecode* args = script->ptrReadPos;
1775 s32 actorID = evt_get_variable(script, *args++);
1776 s32 partID;
1777 ActorPart* actorPart;
1778 s32 outVar;
1779
1780 if (actorID == ACTOR_SELF) {
1781 actorID = script->owner1.actorID;
1782 }
1783
1784 partID = evt_get_variable(script, *args++);
1785 outVar = *args++;
1786
1787 evt_set_variable(script, outVar, get_actor_part(get_actor(actorID), partID)->flags);
1788
1789 return ApiStatus_DONE2;
1790}
1791
1792API_CALLABLE(GetPartTargetFlags) {
1793 Bytecode* args = script->ptrReadPos;
1794 s32 actorID = evt_get_variable(script, *args++);
1795 s32 partID;
1796 ActorPart* actorPart;
1797 s32 outVar;
1798
1799 if (actorID == ACTOR_SELF) {
1800 actorID = script->owner1.actorID;
1801 }
1802
1803 partID = evt_get_variable(script, *args++);
1804 outVar = *args++;
1805
1806 evt_set_variable(script, outVar, get_actor_part(get_actor(actorID), partID)->targetFlags);
1807
1808 return ApiStatus_DONE2;
1809}
1810
1811API_CALLABLE(SetPartEventFlags) {
1812 Bytecode* args = script->ptrReadPos;
1813 s32 actorID = evt_get_variable(script, *args++);
1814 ActorPart* actorPart;
1815 s32 flagBits;
1816 s32 partID;
1817
1818 if (actorID == ACTOR_SELF) {
1819 actorID = script->owner1.actorID;
1820 }
1821
1822 partID = evt_get_variable(script, *args++);
1823 flagBits = *args++;
1824
1825 get_actor_part(get_actor(actorID), partID)->eventFlags = flagBits;
1826
1827 return ApiStatus_DONE2;
1828}
1829
1830API_CALLABLE(SetPartEventBits) {
1831 Bytecode* args = script->ptrReadPos;
1832 s32 actorID = evt_get_variable(script, *args++);
1833 Actor* actor;
1834 ActorPart* part;
1835 s32 partID;
1836 s32 bits;
1837 s32 mode;
1838
1839 if (actorID == ACTOR_SELF) {
1840 actorID = script->owner1.actorID;
1841 }
1842
1843 partID = evt_get_variable(script, *args++);
1844 bits = *args++;
1845 mode = evt_get_variable(script, *args++);
1846
1847 actor = get_actor(actorID);
1848 part = get_actor_part(actor, partID);
1849
1850 if (mode) {
1851 part->eventFlags |= bits;
1852 } else {
1853 part->eventFlags &= ~bits;
1854 }
1855
1856 return ApiStatus_DONE2;
1857}
1858
1859API_CALLABLE(GetPartEventFlags) {
1860 Bytecode* args = script->ptrReadPos;
1861 s32 actorID = evt_get_variable(script, *args++);
1862 s32 partID;
1863 Actor* actor;
1864 ActorPart* part;
1865 s32 outVar;
1866
1867 if (actorID == ACTOR_SELF) {
1868 actorID = script->owner1.actorID;
1869 }
1870
1871 partID = evt_get_variable(script, *args++);
1872 outVar = *args++;
1873
1874 actor = get_actor(actorID);
1875 part = get_actor_part(actor, partID);
1876 evt_set_variable(script, outVar, part->eventFlags);
1877
1878 return ApiStatus_DONE2;
1879}
1880
1881API_CALLABLE(SetPartImmunityFlags) {
1882 Bytecode* args = script->ptrReadPos;
1883 s32 actorID = evt_get_variable(script, *args++);
1884 ActorPart* actorPart;
1885 s32 flagBits;
1886 s32 partID;
1887
1888 if (actorID == ACTOR_SELF) {
1889 actorID = script->owner1.actorID;
1890 }
1891
1892 partID = evt_get_variable(script, *args++);
1893 flagBits = *args++;
1894
1895 get_actor_part(get_actor(actorID), partID)->elementalImmunities = flagBits;
1896
1897 return ApiStatus_DONE2;
1898}
1899
1900API_CALLABLE(SetPartImmunityBits) {
1901 Bytecode* args = script->ptrReadPos;
1902 s32 actorID = evt_get_variable(script, *args++);
1903 Actor* actor;
1904 ActorPart* part;
1905 s32 partID;
1906 s32 bits;
1907 s32 mode;
1908
1909 if (actorID == ACTOR_SELF) {
1910 actorID = script->owner1.actorID;
1911 }
1912
1913 partID = evt_get_variable(script, *args++);
1914 bits = *args++;
1915 mode = evt_get_variable(script, *args++);
1916
1917 actor = get_actor(actorID);
1918 part = get_actor_part(actor, partID);
1919
1920 if (mode) {
1921 part->elementalImmunities |= bits;
1922 } else {
1923 part->elementalImmunities &= ~bits;
1924 }
1925
1926 return ApiStatus_DONE2;
1927}
1928
1929API_CALLABLE(HPBarToHome) {
1930 Bytecode* args = script->ptrReadPos;
1931 s32 actorID = evt_get_variable(script, *args++);
1932 Actor* actor;
1933
1934 if (actorID == ACTOR_SELF) {
1935 actorID = script->owner1.actorID;
1936 }
1937
1938 actor = get_actor(actorID);
1939 actor->healthBarPos.x = actor->homePos.x + actor->actorBlueprint->healthBarOffset.x;
1940 actor->healthBarPos.y = actor->homePos.y + actor->actorBlueprint->healthBarOffset.y;
1941 actor->healthBarPos.z = actor->homePos.z;
1942
1943 if (actor->flags & ACTOR_FLAG_UPSIDE_DOWN) {
1944 actor->healthBarPos.y = actor->homePos.y - actor->size.y - actor->actorBlueprint->healthBarOffset.y;
1945 }
1946
1947 actor->healthFraction = (actor->curHP * 25) / actor->maxHP;
1948
1949 return ApiStatus_DONE2;
1950}
1951
1952API_CALLABLE(HPBarToCurrent) {
1953 Bytecode* args = script->ptrReadPos;
1954 s32 actorID = evt_get_variable(script, *args++);
1955 Actor* actor;
1956
1957 if (actorID == ACTOR_SELF) {
1958 actorID = script->owner1.actorID;
1959 }
1960
1961 actor = get_actor(actorID);
1962 actor->healthBarPos.x = actor->curPos.x + actor->actorBlueprint->healthBarOffset.x;
1963 actor->healthBarPos.y = actor->curPos.y + actor->actorBlueprint->healthBarOffset.y;
1964 actor->healthBarPos.z = actor->curPos.z;
1965
1966 if (actor->flags & ACTOR_FLAG_UPSIDE_DOWN) {
1967 actor->healthBarPos.y = actor->curPos.y - actor->size.y - actor->actorBlueprint->healthBarOffset.y;
1968 }
1969
1970 actor->healthFraction = (actor->curHP * 25) / actor->maxHP;
1971
1972 return ApiStatus_DONE2;
1973}
1974
1975API_CALLABLE(HideHPBar) {
1976 Bytecode* args = script->ptrReadPos;
1977 s32 actorID = evt_get_variable(script, *args++);
1978
1979 if (actorID == ACTOR_SELF) {
1980 actorID = script->owner1.actorID;
1981 }
1982
1984
1985 return ApiStatus_DONE2;
1986}
1987
1988API_CALLABLE(SetHPBarOffset) {
1989 Bytecode* args = script->ptrReadPos;
1990 s32 actorID = evt_get_variable(script, *args++);
1991 Actor* actor;
1992 s32 x, y;
1993
1994 if (actorID == ACTOR_SELF) {
1995 actorID = script->owner1.actorID;
1996 }
1997
1998 x = evt_get_variable(script, *args++);
1999 y = evt_get_variable(script, *args++);
2000
2001 actor = get_actor(actorID);
2002
2003 actor->healthBarOffset.x = x;
2004 actor->healthBarOffset.y = y;
2005 actor->healthBarPos.x = actor->homePos.x + actor->actorBlueprint->healthBarOffset.x + actor->healthBarOffset.x;
2006 actor->healthBarPos.y = actor->homePos.y + actor->actorBlueprint->healthBarOffset.y + actor->healthBarOffset.y;
2007 actor->healthBarPos.z = actor->homePos.z;
2008
2009 if (actor->flags & ACTOR_FLAG_UPSIDE_DOWN) {
2010 actor->healthBarPos.y = actor->homePos.y - actor->size.y;
2011 }
2012
2013 return ApiStatus_DONE2;
2014}
2015
2016API_CALLABLE(SetActorStatusOffsets) {
2017 Bytecode* args = script->ptrReadPos;
2018 s32 actorID = evt_get_variable(script, *args++);
2019 Actor* actor;
2020 s32 iconX, iconY, textX, textY;
2021
2022 if (actorID == ACTOR_SELF) {
2023 actorID = script->owner1.actorID;
2024 }
2025
2026 iconX = evt_get_variable(script, *args++);
2027 iconY = evt_get_variable(script, *args++);
2028 textX = evt_get_variable(script, *args++);
2029 textY = evt_get_variable(script, *args++);
2030
2031 actor = get_actor(actorID);
2032 actor->statusIconOffset.x = iconX;
2033 actor->statusIconOffset.y = iconY;
2034 actor->statusTextOffset.x = textX;
2035 actor->statusTextOffset.y = textY;
2036
2037 return ApiStatus_DONE2;
2038}
2039
2040API_CALLABLE(SummonEnemy) {
2041 BattleStatus* battleStatus = &gBattleStatus;
2042 Bytecode* args = script->ptrReadPos;
2043 Actor* actor1;
2044 Actor* actor2;
2045 s16* enemyIDs;
2046 s32 numEnemies;
2047 s32 i, j;
2048 u16 enemyID1, enemyID2;
2049 s32 priority1, priority2;
2050 s32 basePriority;
2051
2052 if (isInitialCall) {
2053 script->functionTemp[0] = 0;
2054 }
2055
2056 switch (script->functionTemp[0]) {
2057 case 0:
2058 script->functionTempPtr[1] = create_actor((FormationRow*)evt_get_variable(script, *args++));
2059 script->functionTemp[2] = evt_get_variable(script, *args++); // isLowPriority
2060 script->functionTemp[0] = 1;
2061 break;
2062 case 1:
2063 actor2 = script->functionTempPtr[1];
2064 if (does_script_exist(actor2->takeTurnScriptID)) {
2065 break;
2066 }
2067
2068 enemyIDs = battleStatus->enemyIDs;
2069 if (battleStatus->nextEnemyIndex == 0) {
2070 numEnemies = 0;
2071 for (i = 0; i < ARRAY_COUNT(battleStatus->enemyActors); i++) {
2072 if (battleStatus->enemyActors[i]) {
2073 battleStatus->enemyIDs[numEnemies++] = i | ACTOR_CLASS_ENEMY;
2074 }
2075 }
2076 battleStatus->numEnemyActors = numEnemies;
2077 if (script->functionTemp[2]) {
2078 basePriority = -1000;
2079 } else {
2080 basePriority = 1000;
2081 }
2082 enemyIDs = battleStatus->enemyIDs;
2083 for (i = 0; i < numEnemies - 1; i++) {
2084 for (j = i + 1; j < numEnemies; j++) {
2085 enemyID1 = enemyIDs[i];
2086 actor1 = battleStatus->enemyActors[enemyID1 & 0xFF];
2087 priority1 = actor1->turnPriority;
2088 if (actor1 == actor2) {
2089 priority1 += basePriority;
2090 }
2091 enemyID2 = enemyIDs[j];
2092 actor1 = battleStatus->enemyActors[enemyID2 & 0xFF];
2093 priority2 = actor1->turnPriority;
2094 if (actor1 == actor2) {
2095 priority2 += basePriority;
2096 }
2097 if (priority1 < priority2) {
2098 enemyIDs[i] = enemyID2;
2099 enemyIDs[j] = enemyID1;
2100 }
2101 }
2102 }
2103 } else {
2104 numEnemies = battleStatus->numEnemyActors;
2105 for (i = 0; i < numEnemies; i++){
2106 if (battleStatus->enemyActors[enemyIDs[i] & 0xFF] == actor2) {
2107 enemyIDs[i] = -1;
2108 }
2109 }
2110 if (script->functionTemp[2] == 0) {
2111 for (i = numEnemies; i >= battleStatus->nextEnemyIndex; i--) {
2112 battleStatus->enemyIDs[i] = battleStatus->enemyIDs[i - 1];
2113 }
2114 battleStatus->enemyIDs[battleStatus->nextEnemyIndex - 1] = actor2->actorID;
2115 battleStatus->numEnemyActors++;
2116 battleStatus->nextEnemyIndex++;
2117 } else {
2118 battleStatus->enemyIDs[battleStatus->numEnemyActors] = actor2->actorID;
2119 battleStatus->numEnemyActors++;
2120 }
2121 }
2122 script->varTable[0] = actor2->actorID;
2123 return ApiStatus_DONE2;
2124 }
2125 return ApiStatus_BLOCK;
2126}
2127
2128API_CALLABLE(GetOwnerID) {
2129 Bytecode* args = script->ptrReadPos;
2130 s32 outVar = *args++;
2131
2132 evt_set_variable(script, outVar, script->owner1.actorID);
2133 return ApiStatus_DONE2;
2134}
2135
2136API_CALLABLE(SetOwnerID) {
2137 Bytecode* args = script->ptrReadPos;
2138 s32 actorID = evt_get_variable(script, *args++);
2139
2140 script->owner1.actorID = actorID;
2141 return ApiStatus_DONE2;
2142}
2143
2144API_CALLABLE(ActorExists) {
2145 Actor* partner = gBattleStatus.partnerActor;
2146 Bytecode* args = script->ptrReadPos;
2147 s32 actorID = evt_get_variable(script, *args++);
2148 b32 exists;
2149
2150 if (actorID == ACTOR_SELF) {
2151 actorID = script->owner1.actorID;
2152 }
2153
2154 exists = get_actor(actorID) != NULL;
2155 if ((actorID == ACTOR_PARTNER) && (partner == NULL)) {
2156 exists = FALSE;
2157 }
2158
2159 evt_set_variable(script, *args++, exists);
2160 return ApiStatus_DONE2;
2161}
2162
2163API_CALLABLE(GetPartAnimInstanceID) {
2164 Bytecode* args = script->ptrReadPos;
2165 s32 actorID = evt_get_variable(script, *args++);
2166 s32 partID = evt_get_variable(script, *args++);
2167 s32 outVar = *args++;
2168 Actor* actor;
2169 ActorPart* part;
2170
2171 if (actorID == ACTOR_SELF) {
2172 actorID = script->owner1.actorID;
2173 }
2174
2175 actor = get_actor(actorID);
2176 part = get_actor_part(actor, partID);
2177 evt_set_variable(script, outVar, part->spriteInstanceID);
2178
2179 return ApiStatus_DONE2;
2180}
2181
2182API_CALLABLE(GetPartAnimNotify) {
2183 Bytecode* args = script->ptrReadPos;
2184 s32 actorID = evt_get_variable(script, *args++);
2185 s32 partID = evt_get_variable(script, *args++);
2186 s32 outVar = *args++;
2187 Actor* actor;
2188 ActorPart* part;
2189
2190 if (actorID == ACTOR_SELF) {
2191 actorID = script->owner1.actorID;
2192 }
2193
2194 actor = get_actor(actorID);
2195 part = get_actor_part(actor, partID);
2196 evt_set_variable(script, outVar, part->animNotifyValue);
2197
2198 return ApiStatus_DONE2;
2199}
2200
2201API_CALLABLE(SetBattleMenuEnabledFlags) {
2202 Bytecode* args = script->ptrReadPos;
2203 s32 flagsValue = *args++;
2204
2205 gBattleStatus.enabledMenusFlags = flagsValue;
2206 return ApiStatus_DONE2;
2207}
2208
2209API_CALLABLE(SetEnabledStarPowers) {
2210 Bytecode* args = script->ptrReadPos;
2211 s32 enabled = *args++;
2212
2214 return ApiStatus_DONE2;
2215}
2216
2217API_CALLABLE(SetBattleInputMask) {
2218 Bytecode* args = script->ptrReadPos;
2219 s32 mask = *args++;
2220
2222 return ApiStatus_DONE2;
2223}
2224
2225API_CALLABLE(SetBattleInputButtons) {
2226 Bytecode* args = script->ptrReadPos;
2227 BattleStatus* battleStatus = &gBattleStatus;
2228 s32 currentButtonsDown = *args++;
2229 s32 currentButtonsPressed = *args++;
2230 s32 currentButtonsHeld = *args++;
2231
2232 battleStatus->curButtonsDown = currentButtonsDown;
2233 battleStatus->curButtonsPressed = currentButtonsPressed;
2234 battleStatus->curButtonsHeld = currentButtonsHeld;
2235
2236 return ApiStatus_DONE2;
2237}
2238
2239API_CALLABLE(CheckButtonPress) {
2240 Bytecode* args = script->ptrReadPos;
2241 Bytecode buttons = *args++;
2242 Bytecode outVar = *args++;
2243 s32 buttonsPressed = gBattleStatus.curButtonsPressed;
2244
2245 evt_set_variable(script, outVar, (buttonsPressed & buttons) != 0);
2246 return ApiStatus_DONE2;
2247}
2248
2249API_CALLABLE(CheckButtonHeld) {
2250 Bytecode* args = script->ptrReadPos;
2251 Bytecode buttons = *args++;
2252 Bytecode outVar = *args++;
2253 s32 buttonsHeld = gBattleStatus.curButtonsHeld;
2254
2255 evt_set_variable(script, outVar, (buttonsHeld & buttons) != 0);
2256 return ApiStatus_DONE2;
2257}
2258
2259API_CALLABLE(CheckButtonDown) {
2260 Bytecode* args = script->ptrReadPos;
2261 Bytecode buttons = *args++;
2262 Bytecode outVar = *args++;
2263 s32 buttonsDown = gBattleStatus.curButtonsDown;
2264
2265 evt_set_variable(script, outVar, (buttonsDown & buttons) != 0);
2266 return ApiStatus_DONE2;
2267}
2268
2269API_CALLABLE(GetBattleState) {
2270 Bytecode* args = script->ptrReadPos;
2271 s32 outVar = *args++;
2272
2273 evt_set_variable(script, outVar, gBattleState);
2274 return ApiStatus_DONE2;
2275}
2276
2277API_CALLABLE(SetBattleState) {
2278 Bytecode* args = script->ptrReadPos;
2279 s32 state = evt_get_variable(script, *args++);
2280
2281 btl_set_state(state);
2282 return ApiStatus_DONE2;
2283}
2284
2285API_CALLABLE(WaitForState) {
2286 Bytecode* args = script->ptrReadPos;
2287 BattleStatus* battleStatus = &gBattleStatus;
2288 s32 waitForState;
2289
2290 if (isInitialCall) {
2291 waitForState = evt_get_variable(script, *args++);
2292 if (waitForState == BATTLE_STATE_0) {
2293 battleStatus->waitForState = BATTLE_STATE_0;
2294 return ApiStatus_DONE2;
2295 }
2296 battleStatus->waitForState = waitForState;
2297 }
2298
2299 waitForState = battleStatus->waitForState;
2300 if (waitForState == BATTLE_STATE_0) {
2301 return ApiStatus_DONE2;
2302 }
2303
2304 if (gBattleState == waitForState) {
2305 return ApiStatus_DONE2;
2306 } else {
2307 return ApiStatus_BLOCK;
2308 }
2309}
2310
2311API_CALLABLE(CancelEnemyTurn) {
2312 Bytecode* args = script->ptrReadPos;
2313 BattleStatus* battleStatus = &gBattleStatus;
2314 s32 cancelMode = evt_get_variable(script, *args++);
2315
2316 switch (cancelMode) {
2317 case 0:
2318 battleStatus->unk_94 = 1;
2319 break;
2320 case 1:
2321 battleStatus->unk_94 = -1;
2322 break;
2323 }
2324
2325 return ApiStatus_DONE2;
2326}
2327
2328API_CALLABLE(func_8026E260) {
2329 Bytecode* args = script->ptrReadPos;
2330 s32 actorID = evt_get_variable(script, *args++);
2331
2332 evt_get_variable(script, *args++);
2333 if (actorID == ACTOR_SELF) {
2334 actorID = script->owner1.actorID;
2335 }
2336 get_actor(actorID);
2337
2338 return ApiStatus_DONE2;
2339}
2340
2341API_CALLABLE(CreateCurrentPosTargetList) {
2342 Bytecode* args = script->ptrReadPos;
2343 Actor* actor = get_actor(script->owner1.actorID);
2344
2347
2348 return ApiStatus_DONE2;
2349}
2350
2351API_CALLABLE(CreateHomeTargetList) {
2352 Bytecode* args = script->ptrReadPos;
2353 Actor* actor = get_actor(script->owner1.actorID);
2354
2357
2358 return ApiStatus_DONE2;
2359}
2360
2361API_CALLABLE(InitTargetIterator) {
2362 Bytecode* args = script->ptrReadPos;
2363 Actor* actor = get_actor(script->owner1.actorID);
2364 SelectableTarget* selectableTarget = &actor->targetData[actor->targetIndexList[actor->selectedTargetIndex]];
2365
2366 actor->targetActorID = selectableTarget->actorID;
2367 actor->targetPartID = selectableTarget->partID;
2368
2369 return ApiStatus_DONE2;
2370}
2371
2372API_CALLABLE(SetOwnerTarget) {
2373 Bytecode* args = script->ptrReadPos;
2374 Actor* actor = get_actor(script->owner1.enemyID);
2375 s16 actorID = evt_get_variable(script, *args++);
2376
2377 actor->targetPartID = evt_get_variable(script, *args++);
2378 actor->targetActorID = actorID;
2379
2380 return ApiStatus_DONE2;
2381}
2382
2383API_CALLABLE(ChooseNextTarget) {
2384 Bytecode* args = script->ptrReadPos;
2385 Actor* actor = get_actor(script->owner1.actorID);
2386 s32 mode = evt_get_variable(script, *args++);
2387 s32 temp = *args++;
2388 SelectableTarget* target;
2389 s32 length;
2390 s32 curIdx;
2391 s32 retVal;
2392
2393 if (mode == ITER_FIRST) {
2394 actor->selectedTargetIndex = 0;
2395 target = &actor->targetData[actor->targetIndexList[0]];
2396 actor->targetActorID = target->actorID;
2397 actor->targetPartID = target->partID;
2398 return ApiStatus_DONE2;
2399 }
2400
2401 if (mode == ITER_LAST) {
2402 actor->selectedTargetIndex = actor->targetListLength - 1;
2403 target = &actor->targetData[actor->targetIndexList[actor->selectedTargetIndex]];
2404 actor->targetActorID = target->actorID;
2405 actor->targetPartID = target->partID;
2406 return ApiStatus_DONE2;
2407 }
2408
2409 curIdx = actor->selectedTargetIndex;
2410 length = actor->targetListLength;
2411 retVal = ITER_HAS_MORE;
2412
2413 if (mode == ITER_NEXT) {
2414 curIdx++;
2415 } else {
2416 curIdx--;
2417 }
2418
2419 if (curIdx < 0) {
2420 curIdx = length - 1;
2421 retVal = ITER_NO_MORE;
2422 }
2423
2424 if (curIdx >= length) {
2425 curIdx = 0;
2426 retVal = ITER_NO_MORE;
2427 }
2428
2429 actor->selectedTargetIndex = curIdx;
2430 target = &actor->targetData[actor->targetIndexList[actor->selectedTargetIndex]];
2431 actor->targetActorID = target->actorID;
2432 actor->targetPartID = target->partID;
2433 evt_set_variable(script, temp, retVal);
2434
2435 return ApiStatus_DONE2;
2436}
2437
2438API_CALLABLE(func_8026E558) {
2439 Bytecode* args = script->ptrReadPos;
2440 SelectableTarget* target;
2441 s32 mode;
2442 s32 outVar;
2443 Actor* actor;
2444 f32 x, y, z;
2445 s32 outVal;
2446 s32 row;
2447 s32 column;
2448 s32 layer;
2449 s32 i;
2450
2451 i = evt_get_variable(script, *args++);
2452 mode = evt_get_variable(script, *args++);
2453 outVar = *args++;
2454
2455 if (i == ACTOR_SELF) {
2456 i = script->owner1.actorID;
2457 }
2458
2459 actor = get_actor(i);
2460 x = actor->curPos.x;
2461 y = actor->curPos.y;
2462 z = actor->curPos.z;
2463
2464 outVal = -1;
2465
2466 if (y < 40.0f) {
2467 row = 0;
2468 } else if (y < 85.0f) {
2469 row = 1;
2470 } else if (y < 100.0f) {
2471 row = 2;
2472 } else {
2473 row = 3;
2474 }
2475
2476 if (x < 25.0f) {
2477 column = 0;
2478 } else if (x < 65.0f) {
2479 column = 1;
2480 } else if (x < 105.0f) {
2481 column = 2;
2482 } else {
2483 column = 3;
2484 }
2485
2486 if (z < -30.0f) {
2487 layer = 0;
2488 } else {
2489 layer = 1;
2490 }
2491
2492 switch (mode) {
2493 case 0:
2494 for (i = 0; i < actor->targetListLength; i++) {
2495 target = &actor->targetData[actor->targetIndexList[i]];
2496
2497 if (target->column == column && target->layer == layer && target->row < row) {
2498 actor->targetActorID = target->actorID;
2499 actor->targetPartID = target->partID;
2500 outVal = 0;
2501 }
2502 }
2503 break;
2504 case 1:
2505 for (i = 0; i < actor->targetListLength; i++) {
2506 target = &actor->targetData[actor->targetIndexList[i]];
2507
2508 if (target->column == column && target->layer == layer && target->row < row) {
2509 actor->targetActorID = target->actorID;
2510 actor->targetPartID = target->partID;
2511 outVal = 0;
2512 }
2513 }
2514 break;
2515 case -1:
2516 for (i = 0; i < actor->targetListLength; i++) {
2517 target = &actor->targetData[actor->targetIndexList[i]];
2518
2519 if (target->column == column && target->layer == layer && target->row < row) {
2520 actor->targetActorID = target->actorID;
2521 actor->targetPartID = target->partID;
2522 outVal = 0;
2523 }
2524 }
2525 break;
2526 }
2527 evt_set_variable(script, outVar, outVal);
2528 return ApiStatus_DONE2;
2529}
2530
2531API_CALLABLE(GetTargetListLength) {
2532 Bytecode* args = script->ptrReadPos;
2533
2534 evt_set_variable(script, *args++, get_actor(script->owner1.actorID)->targetListLength);
2535 return ApiStatus_DONE2;
2536}
2537
2538API_CALLABLE(GetOwnerTarget) {
2539 Bytecode* args = script->ptrReadPos;
2540 Actor* actor = get_actor(script->owner1.enemyID);
2541 s32 actorID = *args++;
2542 s32 partID = *args++;
2543
2544 evt_set_variable(script, actorID, actor->targetActorID);
2545 evt_set_variable(script, partID, actor->targetPartID);
2546
2547 return ApiStatus_DONE2;
2548}
2549
2550API_CALLABLE(func_8026E914) {
2551 Bytecode* args = script->ptrReadPos;
2552 s32 temp_v0 = *args++;
2553 s32 temp_s1 = *args++;
2554
2557
2558 return ApiStatus_DONE2;
2559}
2560
2561API_CALLABLE(GetPlayerActorID) {
2562 evt_set_variable(script, *script->ptrReadPos, gBattleStatus.attackerActorID);
2563 return ApiStatus_DONE2;
2564}
2565
2566API_CALLABLE(func_8026E9A0) {
2567 Bytecode* args = script->ptrReadPos;
2568 s32 actorID;
2569 s32 partID;
2570
2571 actorID = evt_get_variable(script, *args++);
2572 partID = evt_get_variable(script, *args++);
2573
2575 gBattleStatus.curTargetID2 = actorID;
2576
2577 return ApiStatus_DONE2;
2578}
2579
2580API_CALLABLE(GetDistanceToGoal) {
2581 Bytecode* args = script->ptrReadPos;
2582 s32 actorID = evt_get_variable(script, *args++);
2583 s32 outVar = *args++;
2584 Actor* actor;
2585 f32 dist;
2586
2587 if (actorID == ACTOR_SELF) {
2588 actorID = script->owner1.actorID;
2589 }
2590 actor = get_actor(actorID);
2591
2592 dist = dist2D(actor->curPos.x, actor->curPos.z, actor->state.goalPos.x, actor->state.goalPos.z);
2593 evt_set_variable(script, outVar, dist);
2594 return ApiStatus_DONE2;
2595}
2596
2597API_CALLABLE(SetActorPaletteEffect) {
2598 Bytecode* args = script->ptrReadPos;
2599 s32 actorID = evt_get_variable(script, *args++);
2600 s32 partID = evt_get_variable(script, *args++);
2601 s32 palAdjustment = evt_get_variable(script, *args++);
2602 Actor* actor;
2603 ActorPart* actorPart;
2604
2605 if (actorID == ACTOR_SELF) {
2606 actorID = script->owner1.actorID;
2607 }
2608 actor = get_actor(actorID);
2609 actorPart = get_actor_part(actor, partID);
2610
2611 set_part_pal_adjustment(actorPart, palAdjustment);
2612 return ApiStatus_DONE2;
2613}
2614
2615API_CALLABLE(SetActorPaletteSwapTimes) {
2616 Bytecode* args = script->ptrReadPos;
2617 s32 actorID = evt_get_variable(script, *args++);
2618 s32 partID = evt_get_variable(script, *args++);
2619 Actor* actor;
2620 ActorPart* actorPart;
2621 DecorationTable* decorations;
2622
2623 if (actorID == ACTOR_SELF) {
2624 actorID = script->owner1.actorID;
2625 }
2626 actor = get_actor(actorID);
2627 actorPart = get_actor_part(actor, partID);
2628 decorations = actorPart->decorationTable;
2629
2630 decorations->blendPalA = evt_get_variable(script, *args++);
2631 decorations->blendPalB = evt_get_variable(script, *args++);
2632 decorations->palswapTimeHoldA = evt_get_variable(script, *args++);
2633 decorations->palswapTimeAtoB = evt_get_variable(script, *args++);
2634
2635 return ApiStatus_DONE2;
2636}
2637
2638API_CALLABLE(SetActorPaletteSwapParams) {
2639 Bytecode* args = script->ptrReadPos;
2640 s32 actorID = evt_get_variable(script, *args++);
2641 s32 partID = evt_get_variable(script, *args++);
2642 Actor* actor;
2643 ActorPart* actorPart;
2644 DecorationTable* table;
2645
2646 if (actorID == ACTOR_SELF) {
2647 actorID = script->owner1.actorID;
2648 }
2649 actor = get_actor(actorID);
2650 actorPart = get_actor_part(actor, partID);
2651 table = actorPart->decorationTable;
2652
2653 table->blendPalA = evt_get_variable(script, *args++);
2654 table->blendPalB = evt_get_variable(script, *args++);
2655 table->palswapTimeHoldA = evt_get_variable(script, *args++);
2656 table->palswapTimeAtoB = evt_get_variable(script, *args++);
2657 table->palswapTimeHoldB = evt_get_variable(script, *args++);
2658 table->palswapTimeBtoA = evt_get_variable(script, *args++);
2659 table->palswapUnused1 = evt_get_variable(script, *args++);
2660 table->palswapUnused2 = evt_get_variable(script, *args++);
2661
2662 return ApiStatus_DONE2;
2663}
2664
2665API_CALLABLE(EnableActorPaletteEffects) {
2666 Bytecode* args = script->ptrReadPos;
2667 s32 actorID = evt_get_variable(script, *args++);
2668 s32 partID = evt_get_variable(script, *args++);
2669 s32 enable = evt_get_variable(script, *args++);
2670 Actor* actor;
2671 ActorPart* actorPart;
2672
2673 if (actorID == ACTOR_SELF) {
2674 actorID = script->owner1.actorID;
2675 }
2676 actor = get_actor(actorID);
2677 actorPart = get_actor_part(actor, partID);
2678
2679 if (enable) {
2681 } else {
2682 actorPart->flags &= ~ACTOR_PART_FLAG_HAS_PAL_EFFECT;
2683 }
2684
2685 return ApiStatus_DONE2;
2686}
2687
2688API_CALLABLE(func_8026EDE4) {
2689 Bytecode* args = script->ptrReadPos;
2690 s32 actorID = evt_get_variable(script, *args++);
2691 s32 partID = evt_get_variable(script, *args++);
2692 s32 temp_s3 = evt_get_variable(script, *args++);
2693 Actor* actor;
2694 ActorPart* actorPart;
2695
2696 if (actorID == ACTOR_SELF) {
2697 actorID = script->owner1.actorID;
2698 }
2699 actor = get_actor(actorID);
2700 actorPart = get_actor_part(actor, partID);
2701
2702 set_part_glow_pal(actorPart, temp_s3);
2703
2704 return ApiStatus_DONE2;
2705}
2706
2707API_CALLABLE(AddActorDecoration) {
2708 Bytecode* args = script->ptrReadPos;
2709 s32 actorID = evt_get_variable(script, *args++);
2710 s32 partID = evt_get_variable(script, *args++);
2711 s32 decorationIndex = evt_get_variable(script, *args++);
2712 s32 decorationType = evt_get_variable(script, *args++);
2713 Actor* actor;
2714 ActorPart* actorPart;
2715
2716 if (actorID == ACTOR_SELF) {
2717 actorID = script->owner1.actorID;
2718 }
2719 actor = get_actor(actorID);
2720 actorPart = get_actor_part(actor, partID);
2721
2722 add_part_decoration(actorPart, decorationIndex, decorationType);
2723 return ApiStatus_DONE2;
2724}
2725
2726API_CALLABLE(RemoveActorDecoration) {
2727 Bytecode* args = script->ptrReadPos;
2728 s32 actorID = evt_get_variable(script, *args++);
2729 s32 partID = evt_get_variable(script, *args++);
2730 s32 decorationIndex = evt_get_variable(script, *args++);
2731 Actor* actor;
2732 ActorPart* actorPart;
2733
2734 if (actorID == ACTOR_SELF) {
2735 actorID = script->owner1.enemyID;
2736 }
2737 actor = get_actor(actorID);
2738 actorPart = get_actor_part(actor, partID);
2739
2740 remove_part_decoration(actorPart, decorationIndex);
2741 return ApiStatus_DONE2;
2742}
2743
2744API_CALLABLE(ModifyActorDecoration) {
2745 Bytecode* args = script->ptrReadPos;
2746 s32 actorID = evt_get_variable(script, *args++);
2747 s32 partID = evt_get_variable(script, *args++);
2748 s32 idx = evt_get_variable(script, *args++);
2749 ActorPart* actorPart;
2750 DecorationTable* decorationtable;
2751 Actor* actor;
2752
2753 if (actorID == ACTOR_SELF) {
2754 actorID = script->owner1.actorID;
2755 }
2756 actor = get_actor(actorID);
2757 actorPart = get_actor_part(actor, partID);
2758 decorationtable = actorPart->decorationTable;
2759
2760 decorationtable->decorData[idx].raw[0] = evt_get_variable(script, *args++);
2761 decorationtable->decorData[idx].raw[1] = evt_get_variable(script, *args++);
2762 decorationtable->decorData[idx].raw[2] = evt_get_variable(script, *args++);
2763 decorationtable->decorData[idx].raw[3] = evt_get_variable(script, *args++);
2764 return ApiStatus_DONE2;
2765}
2766
2767API_CALLABLE(UseIdleAnimation) {
2768 Actor* actor;
2769 Bytecode* args = script->ptrReadPos;
2770 s32 actorID = evt_get_variable(script, *args++);
2771 s32 useIdle = evt_get_variable(script, *args++);
2772
2773 if (actorID == ACTOR_SELF) {
2774 actorID = script->owner1.actorID;
2775 }
2776
2777 actor = get_actor(actorID);
2778 if (!useIdle) {
2779 actor->flags &= ~ACTOR_FLAG_USING_IDLE_ANIM;
2780 actor->flags &= ~ACTOR_FLAG_SHOW_STATUS_ICONS;
2782 } else {
2784 }
2785
2786 return ApiStatus_DONE2;
2787}
2788
2789API_CALLABLE(func_8026F1A0) {
2790 Bytecode* args = script->ptrReadPos;
2791 s32 actorID = evt_get_variable(script, *args++);
2792 s32 temp_s0_3 = evt_get_variable(script, *args++);
2793 Actor* actor;
2794
2795 if (actorID == ACTOR_SELF) {
2796 actorID = script->owner1.actorID;
2797 }
2798
2799 actor = get_actor(actorID);
2800
2801 if (temp_s0_3 == 0) {
2802 actor->flags &= ~ACTOR_FLAG_SHOW_STATUS_ICONS;
2804 }
2805
2806 return ApiStatus_DONE2;
2807}
2808
2809API_CALLABLE(GetStatusFlags) {
2810 Bytecode* args = script->ptrReadPos;
2811 BattleStatus* battleStatus = &gBattleStatus;
2812 s32 actorID = evt_get_variable(script, *args++);
2813 s32 outVar = *args++;
2814 Actor* actor;
2815 s32 actorClass;
2816 s8 debuff;
2817 s8 staticStatus;
2818 s8 stoneStatus;
2819 s8 koStatus;
2820 s8 transStatus;
2821 ActorPart* partsTable;
2822 s32 flags;
2823
2824 if (actorID == ACTOR_SELF) {
2825 actorID = script->owner1.actorID;
2826 }
2827 actor = get_actor(actorID);
2828 debuff = actor->debuff;
2829 actorClass = actor->actorID & ACTOR_CLASS_MASK;
2830 flags = 0;
2831
2832 if (debuff != 0) {
2833 if (debuff == STATUS_KEY_STOP) {
2835 }
2836 if (debuff == STATUS_KEY_FROZEN) {
2838 }
2839 if (debuff == STATUS_KEY_SLEEP) {
2841 }
2842 if (debuff == STATUS_KEY_PARALYZE) {
2844 }
2845 if (debuff == STATUS_KEY_DIZZY) {
2847 }
2848 if (debuff == STATUS_KEY_FEAR) {
2850 }
2851 if (debuff == STATUS_KEY_POISON) {
2853 }
2854 if (debuff == STATUS_KEY_SHRINK) {
2856 }
2857 }
2858
2859 switch (actor->staticStatus) {
2860 case 0:
2861 break;
2862 case STATUS_KEY_STATIC:
2864 break;
2865 }
2866
2867 switch (actor->stoneStatus) {
2868 case 0:
2869 break;
2870 case STATUS_KEY_STONE:
2872 break;
2873 }
2874
2875 switch (actor->koStatus) {
2876 case 0:
2877 break;
2878 case STATUS_KEY_DAZE:
2880 break;
2881 }
2882
2883 switch (actor->transparentStatus) {
2884 case 0:
2885 break;
2888 break;
2889 }
2890
2891 for (partsTable = actor->partsTable; partsTable != NULL; partsTable = partsTable->nextPart) {
2892 if (partsTable->flags & ACTOR_PART_FLAG_TRANSPARENT) {
2894 }
2895 if (partsTable->eventFlags & ACTOR_EVENT_FLAG_ILLUSORY) {
2897 }
2898 }
2899
2900 switch (actorClass) {
2901 case ACTOR_CLASS_PLAYER:
2903 if (battleStatus->outtaSightActive) {
2905 }
2906 break;
2907 case ACTOR_CLASS_ENEMY:
2908 break;
2909 }
2910
2911 if (actor->isGlowing) {
2913 }
2914
2915 if (actor->attackBoost) {
2917 }
2918
2919 if (actor->defenseBoost) {
2921 }
2922
2923 if (actor->chillOutAmount) {
2925 }
2926
2929 }
2930
2931 evt_set_variable(script, outVar, flags);
2932 return ApiStatus_DONE2;
2933}
2934
2935API_CALLABLE(RemovePlayerBuffs) {
2936 remove_player_buffs(*script->ptrReadPos);
2937 return ApiStatus_DONE2;
2938}
2939
2940API_CALLABLE(SetPartAlpha) {
2941 Actor* actor;
2942 Bytecode* args = script->ptrReadPos;
2943 s32 actorID = evt_get_variable(script, *args++);
2944 s32 partID = evt_get_variable(script, *args++);
2945 s32 opacity = evt_get_variable(script, *args++);
2946
2947 if (actorID == ACTOR_SELF) {
2948 actorID = script->owner1.actorID;
2949 }
2950
2951 actor = get_actor(actorID);
2952 get_actor_part(actor, partID)->opacity = opacity;
2953
2955 return ApiStatus_DONE2;
2956}
2957
2958API_CALLABLE(CreatePartShadow) {
2959 Bytecode* args = script->ptrReadPos;
2960 s32 actorID = evt_get_variable(script, *args++);
2961 s32 partID = evt_get_variable(script, *args++);
2962
2963 if (actorID == ACTOR_SELF) {
2964 actorID = script->owner1.actorID;
2965 }
2966
2967 create_part_shadow(actorID, partID);
2968 return ApiStatus_DONE2;
2969}
2970
2971API_CALLABLE(RemovePartShadow) {
2972 Bytecode* args = script->ptrReadPos;
2973 s32 actorID = evt_get_variable(script, *args++);
2974 s32 partID = evt_get_variable(script, *args++);
2975
2976 if (actorID == ACTOR_SELF) {
2977 actorID = script->owner1.actorID;
2978 }
2979
2980 remove_part_shadow(actorID, partID);
2981 return ApiStatus_DONE2;
2982}
2983
2984API_CALLABLE(SetEndBattleFadeOutRate) {
2985 gBattleStatus.endBattleFadeOutRate = evt_get_variable(script, *script->ptrReadPos);
2986 return ApiStatus_DONE2;
2987}
2988
2989API_CALLABLE(SetBattleVar) {
2990 Bytecode* args = script->ptrReadPos;
2991 s32 varIdx = evt_get_variable(script, *args++);
2992
2993 gBattleStatus.varTable[varIdx] = evt_get_variable(script, *args++);
2994
2995 return ApiStatus_DONE2;
2996}
2997
2998API_CALLABLE(GetBattleVar) {
2999 Bytecode* args = script->ptrReadPos;
3000 s32 varIdx = evt_get_variable(script, *args++);
3001
3002 evt_set_variable(script, *args++, gBattleStatus.varTable[varIdx]);
3003 return ApiStatus_DONE2;
3004}
3005
3006API_CALLABLE(ResetAllActorSounds) {
3007 s32 actorID = evt_get_variable(script, *script->ptrReadPos);
3008
3009 if (actorID == ACTOR_SELF) {
3010 actorID = script->owner1.actorID;
3011 }
3012
3014 return ApiStatus_DONE2;
3015}
3016
3017API_CALLABLE(SetActorSounds) {
3018 Bytecode* args = script->ptrReadPos;
3019 s32 actorID = evt_get_variable(script, *args++);
3020 Actor* actor;
3021 s32 soundType;
3022 s32 sound1;
3023 s32 sound2;
3024
3025 if (actorID == ACTOR_SELF) {
3026 actorID = script->owner1.actorID;
3027 }
3028
3029 soundType = evt_get_variable(script, *args++);
3030 sound1 = evt_get_variable(script, *args++);
3031 sound2 = evt_get_variable(script, *args++);
3032 actor = get_actor(actorID);
3033
3034 switch (soundType) {
3035 case ACTOR_SOUND_WALK:
3036 actor->actorTypeData1[0] = sound1;
3037 actor->actorTypeData1[1] = sound2;
3038 break;
3039 case ACTOR_SOUND_FLY:
3040 actor->actorTypeData1[2] = sound1;
3041 actor->actorTypeData1[3] = sound2;
3042 break;
3043 case ACTOR_SOUND_JUMP:
3044 actor->actorTypeData1[4] = sound1;
3045 break;
3046 case ACTOR_SOUND_HURT:
3047 actor->actorTypeData1[5] = sound1;
3048 break;
3050 actor->actorTypeData1b[0] = sound1;
3051 break;
3053 actor->actorTypeData1b[1] = sound1;
3054 break;
3055 }
3056
3057 return ApiStatus_DONE2;
3058}
3059
3060API_CALLABLE(ResetActorSounds) {
3061 Bytecode* args = script->ptrReadPos;
3062 s32 actorID = evt_get_variable(script, *args++);
3063 Actor* actor;
3064 s32 soundType;
3065 s32 sound1;
3066 s32 sound2;
3067
3068 if (actorID == ACTOR_SELF) {
3069 actorID = script->owner1.actorID;
3070 }
3071
3072 soundType = evt_get_variable(script, *args++);
3073 sound1 = evt_get_variable(script, *args++);
3074 sound2 = evt_get_variable(script, *args++);
3075 actor = get_actor(actorID);
3076
3077 switch (soundType) {
3078 case ACTOR_SOUND_WALK:
3079 actor->actorTypeData1[0] = bActorSoundTable[actor->actorType].walk[0];
3080 actor->actorTypeData1[1] = bActorSoundTable[actor->actorType].walk[1];
3081 break;
3082 case ACTOR_SOUND_FLY:
3083 actor->actorTypeData1[2] = bActorSoundTable[actor->actorType].fly[0];
3084 actor->actorTypeData1[3] = bActorSoundTable[actor->actorType].fly[1];
3085 break;
3086 case ACTOR_SOUND_JUMP:
3087 actor->actorTypeData1[4] = bActorSoundTable[actor->actorType].jump;
3088 break;
3089 case ACTOR_SOUND_HURT:
3090 actor->actorTypeData1[5] = bActorSoundTable[actor->actorType].hurt;
3091 break;
3093 actor->actorTypeData1b[0] = bActorSoundTable[actor->actorType].delay[0];
3094 break;
3096 actor->actorTypeData1b[1] = bActorSoundTable[actor->actorType].delay[1];
3097 break;
3098 }
3099
3100 return ApiStatus_DONE2;
3101}
3102
3103API_CALLABLE(SetPartSounds) {
3104 Bytecode* args = script->ptrReadPos;
3105 s32 actorID = evt_get_variable(script, *args++);
3106 ActorPart* actorPart;
3107 s32 partID;
3108 s32 soundType;
3109 s32 sound1;
3110 s32 sound2;
3111
3112 if (actorID == ACTOR_SELF) {
3113 actorID = script->owner1.actorID;
3114 }
3115
3116 partID = evt_get_variable(script, *args++);
3117 soundType = evt_get_variable(script, *args++);
3118 sound1 = evt_get_variable(script, *args++);
3119 sound2 = evt_get_variable(script, *args++);
3120 actorPart = get_actor_part(get_actor(actorID), partID);
3121
3122 switch (soundType) {
3123 case ACTOR_SOUND_WALK:
3124 actorPart->partTypeData[0] = sound1;
3125 actorPart->partTypeData[1] = sound2;
3126 break;
3127 case ACTOR_SOUND_FLY:
3128 actorPart->partTypeData[2] = sound1;
3129 actorPart->partTypeData[3] = sound2;
3130 break;
3131 case ACTOR_SOUND_JUMP:
3132 actorPart->partTypeData[4] = sound1;
3133 break;
3134 case ACTOR_SOUND_HURT:
3135 actorPart->partTypeData[5] = sound1;
3136 break;
3138 actorPart->actorTypeData2b[0] = sound1;
3139 break;
3141 actorPart->actorTypeData2b[1] = sound1;
3142 break;
3143 }
3144
3145 return ApiStatus_DONE2;
3146}
3147
3148API_CALLABLE(SetActorType) {
3149 Bytecode* args = script->ptrReadPos;
3150 s32 actorID = evt_get_variable(script, *args++);
3151 Actor* enemy;
3152 s32 actorType;
3153
3154 if (actorID == ACTOR_SELF) {
3155 actorID = script->owner1.actorID;
3156 }
3157
3158 actorType = evt_get_variable(script, *args++);
3159 enemy = get_actor(actorID);
3160
3161 if (is_actor_health_bar_visible(enemy)) {
3162 load_tattle_flags(actorType);
3163 }
3164
3165 enemy->actorType = actorType;
3166 return ApiStatus_DONE2;
3167}
3168
3169API_CALLABLE(ShowShockEffect) {
3170 s32 actorID = evt_get_variable(script, *script->ptrReadPos);
3171
3172 if (actorID == ACTOR_SELF) {
3173 actorID = script->owner1.actorID;
3174 }
3175
3176 apply_shock_effect(get_actor(actorID));
3177 return ApiStatus_DONE2;
3178}
3179
3180API_CALLABLE(GetActorAttackBoost) {
3181 Bytecode* args = script->ptrReadPos;
3182 s32 enemyID = evt_get_variable(script, *args++);
3183 Bytecode attackBoost;
3184
3185 if (enemyID == ACTOR_SELF) {
3186 enemyID = script->owner1.enemyID;
3187 }
3188
3189 attackBoost = *args++;
3190 evt_set_variable(script, attackBoost, get_actor(enemyID)->attackBoost);
3191 return ApiStatus_DONE2;
3192}
3193
3194API_CALLABLE(GetActorDefenseBoost) {
3195 Bytecode* args = script->ptrReadPos;
3196 s32 enemyID = evt_get_variable(script, *args++);
3197 Bytecode defenseBoost;
3198
3199 if (enemyID == ACTOR_SELF) {
3200 enemyID = script->owner1.enemyID;
3201 }
3202
3203 defenseBoost = *args++;
3204 evt_set_variable(script, defenseBoost, get_actor(enemyID)->defenseBoost);
3205 return ApiStatus_DONE2;
3206}
3207
3208API_CALLABLE(BoostAttack) {
3209 Bytecode* args = script->ptrReadPos;
3210 s32 actorID;
3211 Actor* actor;
3212 s32 flags;
3213 s32 flags2;
3214 f32 x1, y1, z1;
3215 f32 x2, y2, z2;
3216 s32 attackBoost;
3217
3218 if (isInitialCall) {
3219 script->functionTemp[0] = 0;
3220 }
3221
3222 if (script->functionTemp[0] == 0) {
3223 actorID = evt_get_variable(script, *args++);
3224 if (actorID == ACTOR_SELF) {
3225 actorID = script->owner1.actorID;
3226 }
3227 attackBoost = evt_get_variable(script, *args++);
3228 actor = get_actor(actorID);
3229 script->functionTempPtr[1] = actor;
3230 script->functionTemp[2] = attackBoost;
3231
3235 btl_cam_set_zoom(250);
3236 btl_cam_move(10);
3238 if (actor->flags & ACTOR_FLAG_UPSIDE_DOWN) {
3240 }
3241 ApplyingBuff = TRUE;
3242 script->functionTemp[3] = 5;
3243 script->functionTemp[0] = 1;
3244 }
3245 get_actor(script->owner1.actorID);
3246 actor = script->functionTempPtr[1];
3247 attackBoost = script->functionTemp[2];
3248
3249 flags = actor->flags;
3250 x1 = actor->curPos.x + actor->headOffset.x;
3252 y1 = actor->curPos.y + actor->headOffset.y - actor->size.y / 2;
3253 } else if (!(flags & ACTOR_FLAG_HALF_HEIGHT)) {
3254 y1 = actor->curPos.y + actor->headOffset.y + actor->size.y / 2;
3255 } else {
3256 y1 = actor->curPos.y + actor->headOffset.y + actor->size.y;
3257 }
3258 z1 = actor->curPos.z + actor->headOffset.z + 10.0f;
3259
3260 flags2 = actor->flags;
3261 x2 = actor->curPos.x + actor->headOffset.x + actor->size.x / 2;
3262 if (flags2 & ACTOR_FLAG_UPSIDE_DOWN) {
3263 y2 = actor->curPos.y + actor->headOffset.y - actor->size.y;
3264 } else if (!(flags2 & ACTOR_FLAG_HALF_HEIGHT)) {
3265 y2 = actor->curPos.y + actor->headOffset.y + actor->size.y;
3266 } else {
3267 y2 = actor->curPos.y + actor->headOffset.y + actor->size.y * 2;
3268 }
3269 z2 = actor->curPos.z + actor->headOffset.z + 10.0f;
3270
3271 switch (script->functionTemp[0]) {
3272 case 1:
3273 if (script->functionTemp[3] == 0) {
3274 fx_radial_shimmer(2, x1, y1, z1, 1.0f, 30);
3276 script->functionTemp[3] = 30;
3277 script->functionTemp[0] = 2;
3278 } else {
3279 script->functionTemp[3]--;
3280 break;
3281 }
3282 break;
3283 case 2:
3284 if (script->functionTemp[3] == 0) {
3287 btl_cam_move(15);
3288 actor->isGlowing = TRUE;
3289 actor->attackBoost += attackBoost;
3290 if (actor->attackBoost > 20) {
3291 actor->attackBoost = 20;
3292 }
3293 fx_stat_change(attackBoost - 1, x2, y2, z2, 1.0f, 60);
3294 script->functionTemp[3] = 15;
3295 script->functionTemp[0] = 3;
3296 } else {
3297 script->functionTemp[3]--;
3298 break;
3299 }
3300 break;
3301 case 3:
3302 if (script->functionTemp[3] == 0) {
3304 script->functionTemp[0] = 4;
3305 } else {
3306 script->functionTemp[3]--;
3307 break;
3308 }
3309 break;
3310 case 4:
3311 if (btl_is_popup_displayed() == 0) {
3313 script->functionTemp[3] = 10;
3314 script->functionTemp[0] = 5;
3315 }
3316 break;
3317 case 5:
3318 if (script->functionTemp[3] != 0) {
3319 script->functionTemp[3]--;
3320 break;
3321 }
3322 if ((actor->handleEventScript != NULL) && does_script_exist(actor->handleEventScriptID)) {
3323 break;
3324 }
3325 ApplyingBuff = FALSE;
3326 return ApiStatus_DONE2;
3327 }
3328 return ApiStatus_BLOCK;
3329}
3330
3331API_CALLABLE(BoostDefense) {
3332 Bytecode* args = script->ptrReadPos;
3333 s32 actorID;
3334 Actor* actor;
3335 f32 x1, y1, z1;
3336 f32 x2, y2, z2;
3337 s32 defenseBoost;
3338 s32 flags;
3339 s32 flags2;
3340
3341 if (isInitialCall) {
3342 script->functionTemp[0] = 0;
3343 }
3344
3345 if (script->functionTemp[0] == 0) {
3346 actorID = evt_get_variable(script, *args++);
3347 if (actorID == ACTOR_SELF) {
3348 actorID = script->owner1.actorID;
3349 }
3350 defenseBoost = evt_get_variable(script, *args++);
3351 actor = get_actor(actorID);
3352 script->functionTempPtr[1] = actor;
3353 script->functionTemp[2] = defenseBoost;
3354
3358 btl_cam_set_zoom(250);
3359 btl_cam_move(10);
3361 if (actor->flags & ACTOR_FLAG_UPSIDE_DOWN) {
3363 }
3364
3365 ApplyingBuff = TRUE;
3366 script->functionTemp[3] = 5;
3367 script->functionTemp[0] = 1;
3368 }
3369 get_actor(script->owner1.actorID);
3370 actor = script->functionTempPtr[1];
3371 defenseBoost = script->functionTemp[2];
3372
3373 flags = actor->flags;
3374 x1 = actor->curPos.x + actor->headOffset.x;
3376 y1 = actor->curPos.y + actor->headOffset.y - actor->size.y / 2;
3377 } else if (!(flags & ACTOR_FLAG_HALF_HEIGHT)) {
3378 y1 = actor->curPos.y + actor->headOffset.y + actor->size.y / 2;
3379 } else {
3380 y1 = actor->curPos.y + actor->headOffset.y + actor->size.y;
3381 }
3382 z1 = actor->curPos.z + actor->headOffset.z + 10.0f;
3383
3384 flags2 = actor->flags;
3385 x2 = actor->curPos.x + actor->headOffset.x + actor->size.x / 2;
3386 if (flags2 & ACTOR_FLAG_UPSIDE_DOWN) {
3387 y2 = actor->curPos.y + actor->headOffset.y - actor->size.y;
3388 } else if (!(flags2 & ACTOR_FLAG_HALF_HEIGHT)) {
3389 y2 = actor->curPos.y + actor->headOffset.y + actor->size.y;
3390 } else {
3391 y2 = actor->curPos.y + actor->headOffset.y + actor->size.y * 2;
3392 }
3393 z2 = actor->curPos.z + actor->headOffset.z + 10.0f;
3394
3395 switch (script->functionTemp[0]) {
3396 case 1:
3397 if (script->functionTemp[3] == 0) {
3398 fx_radial_shimmer(2, x1, y1, z1, 1.0f, 30);
3400 script->functionTemp[3] = 30;
3401 script->functionTemp[0] = 2;
3402 } else {
3403 script->functionTemp[3]--;
3404 break;
3405 }
3406 break;
3407 case 2:
3408 if (script->functionTemp[3] == 0) {
3411 btl_cam_move(15);
3412 actor->isGlowing = TRUE;
3413 actor->defenseBoost += defenseBoost;
3414 if (actor->defenseBoost > 20) {
3415 actor->defenseBoost = 20;
3416 }
3417 fx_stat_change(defenseBoost + 5, x2, y2, z2, 1.0f, 60);
3418 script->functionTemp[3] = 15;
3419 script->functionTemp[0] = 3;
3420 } else {
3421 script->functionTemp[3]--;
3422 break;
3423 }
3424 break;
3425 case 3:
3426 if (script->functionTemp[3] == 0) {
3428 script->functionTemp[0] = 4;
3429 } else {
3430 script->functionTemp[3]--;
3431 break;
3432 }
3433 break;
3434 case 4:
3435 if (btl_is_popup_displayed() == 0) {
3437 script->functionTemp[3] = 10;
3438 script->functionTemp[0] = 5;
3439 }
3440 break;
3441 case 5:
3442 if (script->functionTemp[3] != 0) {
3443 script->functionTemp[3]--;
3444 break;
3445 }
3446 if ((actor->handleEventScript != NULL) && does_script_exist(actor->handleEventScriptID)) {
3447 break;
3448 }
3449 ApplyingBuff = FALSE;
3450 return ApiStatus_DONE2;
3451 }
3452 return ApiStatus_BLOCK;
3453}
3454
3455API_CALLABLE(VanishActor) {
3456 Bytecode* args = script->ptrReadPos;
3457 s32 actorID;
3458 Actor* actor;
3459 f32 x, y, z;
3460 s32 vanished;
3461 s32 flags;
3462
3463 if (isInitialCall) {
3464 script->functionTemp[0] = 0;
3465 }
3466
3467 if (script->functionTemp[0] == 0) {
3468 actorID = evt_get_variable(script, *args++);
3469 if (actorID == ACTOR_SELF) {
3470 actorID = script->owner1.actorID;
3471 }
3472 vanished = evt_get_variable(script, *args++);
3473 actor = get_actor(actorID);
3474 script->functionTemp[1] = (s32) actor;
3475 script->functionTemp[2] = vanished;
3476
3480 btl_cam_set_zoom(250);
3481 btl_cam_move(10);
3483 if (actor->flags & ACTOR_FLAG_UPSIDE_DOWN) {
3485 }
3486
3487 ApplyingBuff = TRUE;
3488 script->functionTemp[3] = 5;
3489 script->functionTemp[0] = 1;
3490 }
3491 get_actor(script->owner1.actorID);
3492 actor = script->functionTempPtr[1];
3493 vanished = script->functionTemp[2];
3494
3495 flags = actor->flags;
3496 x = actor->curPos.x + actor->headOffset.x;
3498 y = actor->curPos.y + actor->headOffset.y - actor->size.y / 2;
3499 } else if (!(flags & ACTOR_FLAG_HALF_HEIGHT)) {
3500 y = actor->curPos.y + actor->headOffset.y + actor->size.y / 2;
3501 } else {
3502 y = actor->curPos.y + actor->headOffset.y + actor->size.y;
3503 }
3504 z = actor->curPos.z + actor->headOffset.z + 10.0f;
3505
3506 switch (script->functionTemp[0]) {
3507 case 1:
3508 if (script->functionTemp[3] == 0) {
3509 fx_radial_shimmer(3, x, y, z, 1.0f, 30);
3511 script->functionTemp[3] = 30;
3512 script->functionTemp[0] = 2;
3513 } else {
3514 script->functionTemp[3]--;
3515 break;
3516 }
3517 break;
3518 case 2:
3519 if (script->functionTemp[3] == 0) {
3522 btl_cam_move(15);
3523 inflict_status(actor, STATUS_KEY_TRANSPARENT, vanished);
3524 script->functionTemp[3] = 15;
3525 script->functionTemp[0] = 3;
3526 } else {
3527 script->functionTemp[3]--;
3528 break;
3529 }
3530 break;
3531 case 3:
3532 if (script->functionTemp[3] == 0) {
3534 script->functionTemp[0] = 4;
3535 } else {
3536 script->functionTemp[3]--;
3537 break;
3538 }
3539 break;
3540 case 4:
3541 if (btl_is_popup_displayed() == 0) {
3543 script->functionTemp[3] = 10;
3544 script->functionTemp[0] = 5;
3545 }
3546 break;
3547 case 5:
3548 if (script->functionTemp[3] != 0) {
3549 script->functionTemp[3]--;
3550 break;
3551 }
3552 if ((actor->handleEventScript != NULL) && does_script_exist(actor->handleEventScriptID)) {
3553 break;
3554 }
3555 ApplyingBuff = FALSE;
3556 return ApiStatus_DONE2;
3557 }
3558 return ApiStatus_BLOCK;
3559}
3560
3561API_CALLABLE(ElectrifyActor) {
3562 Bytecode* args = script->ptrReadPos;
3563 s32 actorID;
3564 Actor* actor;
3565 f32 x, y, z;
3566 s32 electrified;
3567 s32 flags;
3568
3569 if (isInitialCall) {
3570 script->functionTemp[0] = 0;
3571 }
3572
3573 if (script->functionTemp[0] == 0) {
3574 actorID = evt_get_variable(script, *args++);
3575 if (actorID == ACTOR_SELF) {
3576 actorID = script->owner1.actorID;
3577 }
3578 electrified = evt_get_variable(script, *args++);
3579 actor = get_actor(actorID);
3580 script->functionTempPtr[1] = actor;
3581 script->functionTemp[2] = electrified;
3582
3586 btl_cam_set_zoom(250);
3587 btl_cam_move(10);
3589 if (actor->flags & ACTOR_FLAG_UPSIDE_DOWN) {
3591 }
3592
3593 ApplyingBuff = TRUE;
3594 script->functionTemp[3] = 5;
3595 script->functionTemp[0] = 1;
3596 }
3597 get_actor(script->owner1.actorID);
3598 actor = script->functionTempPtr[1];
3599 electrified = script->functionTemp[2];
3600
3601 flags = actor->flags;
3602 x = actor->curPos.x + actor->headOffset.x;
3604 y = actor->curPos.y + actor->headOffset.y - actor->size.y / 2;
3605 } else if (!(flags & ACTOR_FLAG_HALF_HEIGHT)) {
3606 y = actor->curPos.y + actor->headOffset.y + actor->size.y / 2;
3607 } else {
3608 y = actor->curPos.y + actor->headOffset.y + actor->size.y;
3609 }
3610 z = actor->curPos.z + actor->headOffset.z + 10.0f;
3611
3612 switch (script->functionTemp[0]) {
3613 case 1:
3614 if (script->functionTemp[3] == 0) {
3615 fx_snaking_static(8, x, y, z, 1.0f, 30);
3617 script->functionTemp[3] = 30;
3618 script->functionTemp[0] = 2;
3619 } else {
3620 script->functionTemp[3]--;
3621 break;
3622 }
3623 break;
3624 case 2:
3625 if (script->functionTemp[3] == 0) {
3628 btl_cam_move(15);
3629 inflict_status(actor, STATUS_KEY_STATIC, electrified);
3630 script->functionTemp[3] = 15;
3631 script->functionTemp[0] = 3;
3632 } else {
3633 script->functionTemp[3]--;
3634 break;
3635 }
3636 break;
3637 case 3:
3638 if (script->functionTemp[3] == 0) {
3640 script->functionTemp[0] = 4;
3641 } else {
3642 script->functionTemp[3]--;
3643 break;
3644 }
3645 break;
3646 case 4:
3647 if (btl_is_popup_displayed() == 0) {
3649 script->functionTemp[3] = 10;
3650 script->functionTemp[0] = 5;
3651 }
3652 break;
3653 case 5:
3654 if (script->functionTemp[3] != 0) {
3655 script->functionTemp[3]--;
3656 break;
3657 }
3658 if ((actor->handleEventScript != NULL) && does_script_exist(actor->handleEventScriptID)) {
3659 break;
3660 }
3661 ApplyingBuff = FALSE;
3662 return ApiStatus_DONE2;
3663 }
3664 return ApiStatus_BLOCK;
3665}
3666
3667API_CALLABLE(HealActor) {
3668 Bytecode* args = script->ptrReadPos;
3669 s32 actorID;
3670 Actor* actor;
3671 f32 x1, y1, z1;
3672 f32 x2, y2, z2;
3673 s32 hpBoost;
3674 s32 flags;
3675 s32 flags2;
3676 s32 message;
3677
3678 if (isInitialCall) {
3679 script->functionTemp[0] = 0;
3680 }
3681
3682 if (script->functionTemp[0] == 0) {
3683 actorID = evt_get_variable(script, *args++);
3684 if (actorID == ACTOR_SELF) {
3685 actorID = script->owner1.enemyID;
3686 }
3687 hpBoost = evt_get_variable(script, *args++);
3688 IsGroupHeal = evt_get_variable(script, *args++);
3689 actor = get_actor(actorID);
3690 script->functionTempPtr[1] = actor;
3691 script->functionTemp[2] = hpBoost;
3692
3696 btl_cam_move(10);
3698
3699 ApplyingBuff = TRUE;
3700 script->functionTemp[3] = 5;
3701 script->functionTemp[0] = 1;
3702 }
3703 get_actor(script->owner1.enemyID);
3704 actor = script->functionTempPtr[1];
3705 hpBoost = script->functionTemp[2];
3706
3707 flags = actor->flags;
3708 x1 = actor->curPos.x + actor->headOffset.x;
3710 y1 = actor->curPos.y + actor->headOffset.y - actor->size.y / 2;
3711 } else if (!(flags & ACTOR_FLAG_HALF_HEIGHT)) {
3712 y1 = actor->curPos.y + actor->headOffset.y + actor->size.y / 2;
3713 } else {
3714 y1 = actor->curPos.y + actor->headOffset.y + actor->size.y;
3715 }
3716 z1 = actor->curPos.z + actor->headOffset.z + 10.0f;
3717
3718 flags2 = actor->flags;
3719 x2 = actor->curPos.x + actor->headOffset.x + actor->size.x / 2;
3720 if (flags2 & ACTOR_FLAG_UPSIDE_DOWN) {
3721 y2 = actor->curPos.y + actor->headOffset.y - actor->size.y;
3722 } else if (!(flags2 & ACTOR_FLAG_HALF_HEIGHT)) {
3723 y2 = actor->curPos.y + actor->headOffset.y + actor->size.y;
3724 } else {
3725 y2 = actor->curPos.y + actor->headOffset.y + actor->size.y * 2;
3726 }
3727 z2 = actor->curPos.z + actor->headOffset.z + 10.0f;
3728
3729 switch (script->functionTemp[0]) {
3730 case 1:
3731 if (script->functionTemp[3] == 0) {
3733 fx_recover(0, x2, y2, z2, hpBoost);
3734 show_start_recovery_shimmer(x1, y1, z1, hpBoost);
3735 script->functionTemp[3] = 30;
3736 script->functionTemp[0] = 2;
3737 } else {
3738 script->functionTemp[3]--;
3739 break;
3740 }
3741 break;
3742 case 2:
3743 if (script->functionTemp[3] == 0) {
3745 btl_cam_move(15);
3746 actor->curHP += hpBoost;
3747 if (actor->maxHP < actor->curHP) {
3748 actor->curHP = actor->maxHP;
3749 }
3750 show_recovery_shimmer(x1, y1, z1, hpBoost);
3751 script->functionTemp[3] = 15;
3752 script->functionTemp[0] = 3;
3753 } else {
3754 script->functionTemp[3]--;
3755 break;
3756 }
3757 break;
3758 case 3:
3759 if (script->functionTemp[3] == 0) {
3760 message = BTL_MSG_HEAL_ALL;
3761 if (!IsGroupHeal) {
3762 message = BTL_MSG_HEAL_ONE;
3763 }
3764 btl_show_variable_battle_message(message, 60, hpBoost);
3765 script->functionTemp[0] = 4;
3766 } else {
3767 script->functionTemp[3]--;
3768 break;
3769 }
3770 break;
3771 case 4:
3772 if (btl_is_popup_displayed() == 0) {
3773 script->functionTemp[3] = 10;
3774 script->functionTemp[0] = 5;
3775 }
3776 break;
3777 case 5:
3778 if (script->functionTemp[3] != 0) {
3779 script->functionTemp[3]--;
3780 break;
3781 }
3782 if ((actor->handleEventScript != NULL) && does_script_exist(actor->handleEventScriptID)) {
3783 break;
3784 }
3785 ApplyingBuff = FALSE;
3786 return ApiStatus_DONE2;
3787 }
3788 return ApiStatus_BLOCK;
3789}
3790
3791API_CALLABLE(WaitForBuffDone) {
3792 if (!ApplyingBuff) {
3793 return ApiStatus_DONE2;
3794 } else {
3795 return ApiStatus_BLOCK;
3796 }
3797}
3798
3799API_CALLABLE(CopyBuffs) {
3800 Bytecode* args = script->ptrReadPos;
3801 s32 actorID = evt_get_variable(script, *args++);
3802 Actor* actorFrom;
3803 Actor* actorTo;
3804
3805 if (actorID == ACTOR_SELF) {
3806 actorID = script->owner1.enemyID;
3807 }
3808 actorFrom = get_actor(actorID);
3809
3810 actorID = evt_get_variable(script, *args++);
3811 if (actorID == ACTOR_SELF) {
3812 actorID = script->owner1.enemyID;
3813 }
3814 actorTo = get_actor(actorID);
3815
3816 actorTo->isGlowing = actorFrom->isGlowing;
3817 actorTo->attackBoost = actorFrom->attackBoost;
3818 actorTo->defenseBoost = actorFrom->defenseBoost;
3819 actorTo->chillOutAmount = actorFrom->chillOutAmount;
3820 actorTo->chillOutTurns = actorFrom->chillOutTurns;
3821
3822 return ApiStatus_DONE2;
3823}
Actor * create_actor(Formation formation)
Definition 190B20.c:1676
void set_actor_home_position(s32 actorID, f32 x, f32 y, f32 z)
Definition actor_api.c:147
s32 count_targets(Actor *actor, s32 targetHomeIndex, s32 targetSelectionFlags)
Definition actor_api.c:8
void set_part_absolute_position(s32 actorID, s32 partID, f32 x, f32 y, f32 z)
Definition actor_api.c:127
void set_part_goal_to_actor_part(ActorPartMovement *movement, s32 actorID, s32 partID)
Definition actor_api.c:83
s32 IsGroupHeal
Definition action_cmd.c:85
void set_actor_current_position(s32 actorID, f32 x, f32 y, f32 z)
Definition actor_api.c:119
Actor * get_actor(s32 actorID)
Definition actor_api.c:155
void set_goal_pos_to_part(ActorState *state, s32 actorID, s32 partID)
Definition actor_api.c:44
s32 get_nearest_home_index(f32 x, f32 y, f32 z)
Definition actor_api.c:17
s8 ApplyingBuff
Definition action_cmd.c:86
BattleArea gBattleAreas[]
Definition battle.c:51
Vec2b statusIconOffset
s8 transparentStatus
struct ActorPartMovement * movement
Vec2b statusTextOffset
Vec2b healthBarOffset
struct ActorBlueprint * actorBlueprint
s32 elementalImmunities
s32 actorTypeData1[6]
s8 healthFraction
s8 selectedTargetIndex
Vec3s headOffset
f32 scalingFactor
ActorState state
s32 partTypeData[6]
struct Evt * handleEventScript
struct ActorPart * partsTable
s32 takeTurnScriptID
s16 actorTypeData1b[2]
struct SelectableTarget targetData[24]
Vec3s rotPivotOffset
s16 targetActorID
Vec3f scaleModifier
Vec3s healthBarPos
s8 chillOutAmount
s32 b32
Vec3f homePos
Vec2bu size
s32 handleEventScriptID
ActorMovement fly
Vec3f curPos
s8 targetIndexList[24]
s16 actorTypeData2b[2]
s8 targetListLength
struct ActorPart * nextPart
struct DecorationTable * decorationTable
Vec3s rotPivotOffset
DecorationData decorData[2]
u32 AnimID
Vec3f scale
s8 flags
Definition demo_api.c:15
@ ACTOR_CLASS_ENEMY
Definition enums.h:2079
@ ACTOR_CLASS_PLAYER
Definition enums.h:2077
@ ACTOR_CLASS_PARTNER
Definition enums.h:2078
@ ACTOR_CLASS_MASK
Definition enums.h:2080
@ ACTOR_SOUND_WALK
Definition enums.h:2034
@ ACTOR_SOUND_WALK_INCREMENT
Definition enums.h:2038
@ ACTOR_SOUND_FLY
Definition enums.h:2035
@ ACTOR_SOUND_HURT
Definition enums.h:2037
@ ACTOR_SOUND_FLY_INCREMENT
Definition enums.h:2039
@ ACTOR_SOUND_JUMP
Definition enums.h:2036
@ BTL_MSG_HEAL_ONE
Definition enums.h:4088
@ BTL_MSG_HEAL_ALL
Definition enums.h:4089
@ BTL_MSG_DEFENCE_UP
Definition enums.h:4087
@ BTL_MSG_ATTACK_UP
Definition enums.h:4086
@ BTL_MSG_ENEMY_TRANSPARENT
Definition enums.h:4090
@ BTL_MSG_ENEMY_CHARGED
Definition enums.h:4091
@ ITER_FIRST
Definition enums.h:2024
@ ITER_HAS_MORE
Definition enums.h:2029
@ ITER_NO_MORE
Definition enums.h:2030
@ ITER_NEXT
Definition enums.h:2025
@ ITER_LAST
Definition enums.h:2027
@ ACTOR_EVENT_FLAG_ILLUSORY
Player attacks pass through and miss.
Definition enums.h:3374
@ STATUS_KEY_PARALYZE
Definition enums.h:2201
@ STATUS_KEY_FROZEN
Definition enums.h:2203
@ STATUS_KEY_TRANSPARENT
Definition enums.h:2210
@ STATUS_KEY_STATIC
Definition enums.h:2207
@ STATUS_KEY_FEAR
Definition enums.h:2199
@ STATUS_KEY_SLEEP
Definition enums.h:2202
@ STATUS_KEY_STONE
Definition enums.h:2208
@ STATUS_KEY_STOP
Definition enums.h:2204
@ STATUS_KEY_SHRINK
Definition enums.h:2206
@ STATUS_KEY_DIZZY
Definition enums.h:2200
@ STATUS_KEY_POISON
Definition enums.h:2205
@ STATUS_KEY_DAZE
Definition enums.h:2209
@ BTL_CAM_DEFAULT
Definition enums.h:4823
@ BTL_CAM_ACTOR_SIMPLE
Definition enums.h:4829
@ BTL_CAM_REPOSITION
Definition enums.h:4840
@ BATTLE_STATE_0
Definition enums.h:3630
@ STATUS_FLAG_FEAR
Definition enums.h:2815
@ STATUS_FLAG_STOP
Definition enums.h:2821
@ STATUS_FLAG_RIGHT_ON
Definition enums.h:2829
@ STATUS_FLAG_FROZEN
Definition enums.h:2814
@ STATUS_FLAG_ATTACK_BOOST
Definition enums.h:2826
@ STATUS_FLAG_DEFENSE_BOOST
Definition enums.h:2827
@ STATUS_FLAG_STATIC
Definition enums.h:2813
@ STATUS_FLAG_SHRINK
Definition enums.h:2819
@ STATUS_FLAG_PARALYZE
Definition enums.h:2816
@ STATUS_FLAG_STONE
Definition enums.h:2820
@ STATUS_FLAG_KO
Definition enums.h:2823
@ STATUS_FLAG_DIZZY
Definition enums.h:2818
@ STATUS_FLAG_CHILL_OUT
Definition enums.h:2828
@ STATUS_FLAG_TRANSPARENT
Definition enums.h:2825
@ STATUS_FLAG_SLEEP
Definition enums.h:2812
@ STATUS_FLAG_POISON
Definition enums.h:2817
@ STATUS_FLAG_GLOWING
Definition enums.h:2824
@ ABILITY_RIGHT_ON
Definition enums.h:458
@ RENDER_MODE_SURFACE_XLU_LAYER3
Definition enums.h:3299
@ RENDER_MODE_ALPHATEST
Definition enums.h:3276
@ ACTOR_PARTNER
Definition enums.h:2086
@ ACTOR_SELF
Definition enums.h:2084
@ ACTOR_FLAG_HALF_HEIGHT
Definition enums.h:3335
@ ACTOR_FLAG_UPSIDE_DOWN
HP bar offset below actor (e.g. Swooper when upside-down).
Definition enums.h:3331
@ ACTOR_FLAG_USING_IDLE_ANIM
Definition enums.h:3342
@ EVENT_RECEIVE_BUFF
Definition enums.h:2178
@ ACTOR_PART_FLAG_HAS_PAL_EFFECT
Definition enums.h:3363
@ ACTOR_PART_FLAG_USE_ABSOLUTE_POSITION
Definition enums.h:3361
@ ACTOR_PART_FLAG_TRANSPARENT
Definition enums.h:3357
#define ApiStatus_DONE2
Definition evt.h:118
s32 Bytecode
Definition evt.h:7
#define ApiStatus_DONE1
Definition evt.h:117
#define ApiStatus_BLOCK
Definition evt.h:116
void btl_show_variable_battle_message(s32, s32, s32)
s32 evt_get_variable(Evt *script, Bytecode var)
Definition evt.c:1689
s32 player_team_is_ability_active(Actor *actor, s32 ability)
Definition 190B20.c:2765
void show_recovery_shimmer(f32 x, f32 y, f32 z, s32 arg3)
Definition fx_api.c:8
void reset_all_actor_sounds(Actor *)
Definition 190B20.c:2938
void remove_player_buffs(s32)
Definition 190B20.c:2806
void btl_cam_use_preset_immediately(s32)
Definition camera.c:1912
void hide_actor_health_bar(Actor *)
Definition 190B20.c:2510
void btl_cam_set_zoom(s16)
Definition camera.c:1984
f32 evt_set_float_variable(Evt *script, Bytecode var, f32 value)
Definition evt.c:1976
void dispatch_event_actor(Actor *, s32)
Definition 1A5830.c:103
void clear_actor_static_pal_adjustments(Actor *)
Definition 190B20.c:2624
void add_part_decoration(ActorPart *part, s32 decorationIndex, s32 decorationType)
Definition 190B20.c:2727
u32 dma_copy(Addr romStart, Addr romEnd, void *vramDest)
Definition 43F0.c:443
s32 evt_set_variable(Evt *script, Bytecode var, s32 value)
Definition evt.c:1846
void load_tattle_flags(s32)
Definition 181810.c:571
void set_part_glow_pal(ActorPart *, s32)
Definition 190B20.c:2642
f32 dist2D(f32 ax, f32 ay, f32 bx, f32 by)
Definition 43F0.c:669
void btl_cam_disable_clamp_x(void)
Definition camera.c:2006
void create_home_target_list(Actor *actor)
Definition 190B20.c:476
void btl_cam_use_preset(s32)
Definition camera.c:1919
void btl_cam_target_actor(s32)
Definition camera.c:1926
s32 inflict_status(Actor *, s32, s32)
Definition 190B20.c:2084
void btl_cam_set_zoffset(s16)
Definition camera.c:1996
ActorPart * get_actor_part(Actor *actor, s32 partID)
Definition 190B20.c:1191
void show_start_recovery_shimmer(f32 x, f32 y, f32 z, s32 arg3)
Definition fx_api.c:4
void set_actor_anim(s32 actorID, s32 partID, AnimID animID)
Definition 190B20.c:1005
void set_actor_anim_rate(s32 actorID, s32 partID, f32 rate)
Definition 190B20.c:1068
void btl_cam_move(s16)
Definition camera.c:1953
void set_part_yaw(s32 actorID, s32 partID, s32 value)
Definition 190B20.c:1095
void set_actor_yaw(s32 actorID, s32 yaw)
Definition 190B20.c:1091
void remove_part_shadow(s32 actorID, s32 partID)
Definition 190B20.c:2793
s32 does_script_exist(s32 id)
f32 evt_get_float_variable(Evt *script, Bytecode var)
Definition evt.c:1929
void set_part_pal_adjustment(ActorPart *, s32)
Definition 190B20.c:2595
void btl_set_state(s32 battleState)
s32 btl_is_popup_displayed(void)
void apply_shock_effect(Actor *)
void create_current_pos_target_list(Actor *actor)
Definition 190B20.c:472
s32 is_actor_health_bar_visible(Actor *)
Definition 181810.c:503
void remove_part_decoration(ActorPart *part, s32 decorationIndex)
Definition 190B20.c:2750
void create_part_shadow(s32 actorID, s32 partID)
Definition 190B20.c:2785
#define ARRAY_COUNT(arr)
Definition macros.h:40
#define EVT_IGNORE_ARG
Definition macros.h:46
#define ACTOR_API_SKIP_ARG
Definition battle.h:264
s32 walk[2]
Definition battle.h:235
ActorSounds bActorSoundTable[]
void * dmaDest
Definition battle.h:217
s16 delay[2]
Number of frames to wait between walk/fly sounds. Negative values are in distance.
Definition battle.h:239
s32 fly[2]
Definition battle.h:236
Vec2b healthBarOffset
Definition battle.h:149
void * dmaEnd
Definition battle.h:216
void * dmaStart
Definition battle.h:215
struct Actor * partnerActor
struct Actor * playerActor
struct Actor * enemyActors[24]
s32 gBattleState
Definition battle.c:10
BattleStatus gBattleStatus
Definition battle.c:11
Vec3s StandardActorHomePositions[]
Definition actors.c:188