Paper Mario DX
Paper Mario (N64) modding
 
Loading...
Searching...
No Matches
evt.c
Go to the documentation of this file.
1#include "common.h"
2#include "vars_access.h"
3#include "dx/config.h"
4#include "dx/debug_menu.h"
5#include "dx/backtrace.h"
6
7extern u32* gMapFlags;
8extern s32* gMapVars;
9
10extern char evtDebugPrintBuffer[0x100];
12
19
27
29 // not equivalent to the FLOAT_TO_FIXED() macro due to the s32 cast
30 // occuring *before* the add here and *after* the add in the macro
31 return (s32)(value * 1024.0f) + -EVT_FIXED_OFFSET;
32}
33
38
42
47
49 Bytecode* args = script->ptrReadPos;
50 Bytecode var = *args++;
51 s32 loopDepth = ++script->loopDepth;
52
53 ASSERT(loopDepth < 8);
54
55 script->loopStartTable[loopDepth] = (s32)args;
56 script->loopCounterTable[loopDepth] = var;
57
58 return ApiStatus_DONE2;
59}
60
62 s32 loopDepth = script->loopDepth;
63 s32 loopCounter;
64
65 ASSERT(loopDepth >= 0);
66
67 loopCounter = script->loopCounterTable[loopDepth];
68
69 if (loopCounter == 0) {
70 script->ptrNextLine = (Bytecode*)script->loopStartTable[loopDepth];
71 return ApiStatus_DONE2;
72 }
73
74 if (loopCounter >= -10000000) {
75 script->loopCounterTable[loopDepth] = --loopCounter;
76 } else {
77 s32 var = evt_get_variable(script, loopCounter) - 1;
78 evt_set_variable(script, loopCounter, var);
79 loopCounter = var;
80 }
81
82 if (loopCounter != 0) {
83 script->ptrNextLine = (Bytecode*)script->loopStartTable[loopDepth];
84 return ApiStatus_DONE2;
85 } else {
86 script->loopDepth--;
87 return ApiStatus_DONE2;
88 }
89}
90
92 ASSERT(script->loopDepth >= 0);
93 script->ptrNextLine = evt_goto_end_loop(script);
94 script->loopDepth--;
95 return ApiStatus_DONE2;
96}
97
99 Bytecode* ptrReadPos = script->ptrReadPos;
100
101 if (!script->blocked) {
102 script->functionTemp[0] = evt_get_variable(script, *ptrReadPos);
103 script->blocked = 1;
104 }
105
106 if (script->functionTemp[0] == 0) {
107 return ApiStatus_DONE2;
108 }
109
110 script->functionTemp[0]--;
111 return !script->functionTemp[0];
112}
113
115 Bytecode* ptrReadPos = script->ptrReadPos;
116
117 if (!script->blocked) {
118 script->functionTemp[0] = evt_get_float_variable(script, *ptrReadPos) * 30.0f + 0.5;
119 script->blocked = 1;
120 }
121
122 if (script->functionTemp[0] == 0) {
123 return ApiStatus_DONE2;
124 }
125
126 script->functionTemp[0]--;
127 return !script->functionTemp[0];
128}
129
131 Bytecode* args = script->ptrReadPos;
132 s32 val1 = evt_get_variable(script, *args++);
133 s32 val2 = evt_get_variable(script, *args++);
134
135 if (val1 != val2) {
136 script->ptrNextLine = evt_skip_if(script);
137 return ApiStatus_DONE2;
138 }
139 return ApiStatus_DONE2;
140}
141
143 Bytecode* args = script->ptrReadPos;
144 s32 val1 = evt_get_variable(script, *args++);
145 s32 val2 = evt_get_variable(script, *args++);
146
147 if (val1 == val2) {
148 script->ptrNextLine = evt_skip_if(script);
149 return ApiStatus_DONE2;
150 }
151 return ApiStatus_DONE2;
152}
153
155 Bytecode* args = script->ptrReadPos;
156 s32 val1 = evt_get_variable(script, *args++);
157 s32 val2 = evt_get_variable(script, *args++);
158
159 if (val1 >= val2) {
160 script->ptrNextLine = evt_skip_if(script);
161 return ApiStatus_DONE2;
162 }
163 return ApiStatus_DONE2;
164}
165
167 Bytecode* args = script->ptrReadPos;
168 s32 val1 = evt_get_variable(script, *args++);
169 s32 val2 = evt_get_variable(script, *args++);
170
171 if (val1 <= val2) {
172 script->ptrNextLine = evt_skip_if(script);
173 return ApiStatus_DONE2;
174 }
175 return ApiStatus_DONE2;
176}
177
179 Bytecode* args = script->ptrReadPos;
180 s32 val1 = evt_get_variable(script, *args++);
181 s32 val2 = evt_get_variable(script, *args++);
182
183 if (val1 > val2) {
184 script->ptrNextLine = evt_skip_if(script);
185 return ApiStatus_DONE2;
186 }
187 return ApiStatus_DONE2;
188}
189
191 Bytecode* args = script->ptrReadPos;
192 s32 val1 = evt_get_variable(script, *args++);
193 s32 val2 = evt_get_variable(script, *args++);
194
195 if (val1 < val2) {
196 script->ptrNextLine = evt_skip_if(script);
197 return ApiStatus_DONE2;
198 }
199 return ApiStatus_DONE2;
200}
201
203 Bytecode* args = script->ptrReadPos;
204 Bytecode var = *args++;
205
206 if ((evt_get_variable(script, var) & *args++) == 0) {
207 script->ptrNextLine = evt_skip_if(script);
208 return ApiStatus_DONE2;
209 }
210 return ApiStatus_DONE2;
211}
212
214 Bytecode* args = script->ptrReadPos;
215 Bytecode var = *args++;
216
217 if ((evt_get_variable(script, var) & *args++) != 0) {
218 script->ptrNextLine = evt_skip_if(script);
219 return ApiStatus_DONE2;
220 }
221 return ApiStatus_DONE2;
222}
223
228
232
234 Bytecode* args = script->ptrReadPos;
235 Bytecode value = evt_get_variable(script, *args++);
236 s32 switchDepth = ++script->switchDepth;
237
238 ASSERT(switchDepth < 8);
239
240 script->switchBlockValue[switchDepth] = value;
241 script->switchBlockState[switchDepth] = 1;
242
243 return ApiStatus_DONE2;
244}
245
247 Bytecode* args = script->ptrReadPos;
248 s32 a0 = *args++;
249 s32 switchDepth = ++script->switchDepth;
250
251 ASSERT(switchDepth < 8);
252
253 script->switchBlockValue[switchDepth] = a0;
254 script->switchBlockState[switchDepth] = 1;
255
256 return ApiStatus_DONE2;
257}
258
260 Bytecode* args = script->ptrReadPos;
261 s32 switchDepth = script->switchDepth;
262 s32 var;
263 s32 switchBlockValue;
264
265 ASSERT(switchDepth >= 0);
266
267 var = evt_get_variable(script, *args++);
268 switchBlockValue = script->switchBlockValue[switchDepth];
269
270 if (script->switchBlockState[switchDepth] <= 0) {
271 script->ptrNextLine = evt_goto_end_case(script);
272 return ApiStatus_DONE2;
273 } else if (var != switchBlockValue) {
274 script->ptrNextLine = evt_goto_next_case(script);
275 } else {
276 script->switchBlockState[switchDepth] = 0;
277 }
278
279 return ApiStatus_DONE2;
280}
281
283 Bytecode* args = script->ptrReadPos;
284 s32 switchDepth = script->switchDepth;
285 s32 var;
286 s32 switchBlockValue;
287
288 ASSERT(switchDepth >= 0);
289
290 var = evt_get_variable(script, *args++);
291 switchBlockValue = script->switchBlockValue[switchDepth];
292
293 if (script->switchBlockState[switchDepth] <= 0) {
294 script->ptrNextLine = evt_goto_end_case(script);
295 return ApiStatus_DONE2;
296 } else if (var == switchBlockValue) {
297 script->ptrNextLine = evt_goto_next_case(script);
298 } else {
299 script->switchBlockState[switchDepth] = 0;
300 }
301
302 return ApiStatus_DONE2;
303}
304
306 Bytecode* args = script->ptrReadPos;
307 s32 switchDepth = script->switchDepth;
308 s32 var;
309 s32 switchBlockValue;
310
311 ASSERT(switchDepth >= 0);
312
313 var = evt_get_variable(script, *args++);
314 switchBlockValue = script->switchBlockValue[switchDepth];
315
316 if (script->switchBlockState[switchDepth] <= 0) {
317 script->ptrNextLine = evt_goto_end_case(script);
318 return ApiStatus_DONE2;
319 } else if (var <= switchBlockValue) {
320 script->ptrNextLine = evt_goto_next_case(script);
321 } else {
322 script->switchBlockState[switchDepth] = 0;
323 }
324
325 return ApiStatus_DONE2;
326}
327
329 Bytecode* args = script->ptrReadPos;
330 s32 switchDepth = script->switchDepth;
331 s32 var;
332 s32 switchBlockValue;
333
334 ASSERT(switchDepth >= 0);
335
336 var = evt_get_variable(script, *args++);
337 switchBlockValue = script->switchBlockValue[switchDepth];
338
339 if (script->switchBlockState[switchDepth] <= 0) {
340 script->ptrNextLine = evt_goto_end_case(script);
341 return ApiStatus_DONE2;
342 } else if (var < switchBlockValue) {
343 script->ptrNextLine = evt_goto_next_case(script);
344 } else {
345 script->switchBlockState[switchDepth] = 0;
346 }
347
348 return ApiStatus_DONE2;
349}
350
352 Bytecode* args = script->ptrReadPos;
353 s32 switchDepth = script->switchDepth;
354 s32 var;
355 s32 switchBlockValue;
356
357 ASSERT(switchDepth >= 0);
358
359 var = evt_get_variable(script, *args++);
360 switchBlockValue = script->switchBlockValue[switchDepth];
361
362 if (script->switchBlockState[switchDepth] <= 0) {
363 script->ptrNextLine = evt_goto_end_case(script);
364 return ApiStatus_DONE2;
365 } else if (var >= switchBlockValue) {
366 script->ptrNextLine = evt_goto_next_case(script);
367 } else {
368 script->switchBlockState[switchDepth] = 0;
369 }
370
371 return ApiStatus_DONE2;
372}
373
375 Bytecode* args = script->ptrReadPos;
376 s32 switchDepth = script->switchDepth;
377 s32 var;
378 s32 switchBlockValue;
379
380 ASSERT(switchDepth >= 0);
381
382 var = evt_get_variable(script, *args++);
383 switchBlockValue = script->switchBlockValue[switchDepth];
384
385 if (script->switchBlockState[switchDepth] <= 0) {
386 script->ptrNextLine = evt_goto_end_case(script);
387 return ApiStatus_DONE2;
388 } else if (var > switchBlockValue) {
389 script->ptrNextLine = evt_goto_next_case(script);
390 } else {
391 script->switchBlockState[switchDepth] = 0;
392 }
393
394 return ApiStatus_DONE2;
395}
396
398 Bytecode* args = script->ptrReadPos;
399 s32 switchDepth = script->switchDepth;
400 s32 var;
401 s32 var2;
402 s32 switchBlockValue;
403
404 ASSERT(switchDepth >= 0);
405
406 var = evt_get_variable(script, *args++);
407 var2 = evt_get_variable(script, *args++);
408
409 switchBlockValue = script->switchBlockValue[switchDepth];
410
411 if (script->switchBlockState[switchDepth] <= 0) {
412 script->ptrNextLine = evt_goto_end_case(script);
413 return ApiStatus_DONE2;
414 } else if ((var <= switchBlockValue) && (switchBlockValue <= var2)) {
415 script->switchBlockState[switchDepth] = 0;
416 } else {
417 script->ptrNextLine = evt_goto_next_case(script);
418 }
419
420 return ApiStatus_DONE2;
421}
422
424 s32 switchDepth = script->switchDepth;
425
426 ASSERT(switchDepth >= 0);
427
428 if (script->switchBlockState[switchDepth] <= 0) {
429 script->ptrNextLine = evt_goto_end_case(script);
430 return ApiStatus_DONE2;
431 } else {
432 script->switchBlockState[switchDepth] = 0;
433 }
434
435 return ApiStatus_DONE2;
436}
437
439 Bytecode* args = script->ptrReadPos;
440 s32 switchDepth = script->switchDepth;
441 s32 var;
442 s32 switchBlockValue;
443 s32 switchBlockState;
444
445 ASSERT(switchDepth >= 0);
446
447 var = *args++;
448 switchBlockValue = script->switchBlockValue[switchDepth];
449 switchBlockState = script->switchBlockState[switchDepth];
450
451 if (switchBlockState <= 0) {
452 script->ptrNextLine = evt_goto_end_case(script);
453 return ApiStatus_DONE2;
454 } else if ((var & switchBlockValue) == 0) {
455 script->ptrNextLine = evt_goto_next_case(script);
456 } else {
457 script->switchBlockState[switchDepth] = 0;
458 }
459
460 return ApiStatus_DONE2;
461}
462
464 Bytecode* args = script->ptrReadPos;
465 s32 switchDepth = script->switchDepth;
466 s32 var;
467 s32 switchBlockValue;
468 s32 switchBlockState;
469
470 ASSERT(switchDepth >= 0);
471
472 var = evt_get_variable(script, *args++);
473 switchBlockValue = script->switchBlockValue[switchDepth];
474 switchBlockState = script->switchBlockState[switchDepth];
475
476 if (switchBlockState == 0) {
477 script->ptrNextLine = evt_goto_end_case(script);
478 return ApiStatus_DONE2;
479 } else if (var == switchBlockValue) {
480 script->switchBlockState[switchDepth] = -1;
481 } else if (switchBlockState != -1) {
482 script->ptrNextLine = evt_goto_next_case(script);
483 }
484
485 return ApiStatus_DONE2;
486}
487
489 Bytecode* args = script->ptrReadPos;
490 s32 switchDepth = script->switchDepth;
491 s32 var;
492 s32 switchBlockValue;
493 s32 switchBlockState;
494
495 ASSERT(switchDepth >= 0);
496
497 var = evt_get_variable(script, *args++);
498 switchBlockValue = script->switchBlockValue[switchDepth];
499 switchBlockState = script->switchBlockState[switchDepth];
500
501 if (switchBlockState == 0) {
502 script->ptrNextLine = evt_goto_end_case(script);
503 return ApiStatus_DONE2;
504 } else if (switchBlockState == -2) {
505 script->ptrNextLine = evt_goto_next_case(script);
506 } else if (var == switchBlockValue) {
507 script->switchBlockState[switchDepth] = -1;
508 } else {
509 script->switchBlockState[switchDepth] = -2;
510 script->ptrNextLine = evt_goto_next_case(script);
511 }
512
513 return ApiStatus_DONE2;
514}
515
517 ASSERT(script->switchDepth >= 0);
518
519 if (script->switchBlockState[script->switchDepth] == 0) {
520 script->ptrNextLine = evt_goto_end_case(script);
521 return ApiStatus_DONE2;
522 } else if (script->switchBlockState[script->switchDepth] != -1) {
523 script->switchBlockState[script->switchDepth] = 1;
524 script->ptrNextLine = evt_goto_next_case(script);
525 } else {
526 script->switchBlockState[script->switchDepth] = 0;
527 script->ptrNextLine = evt_goto_end_case(script);
528 }
529
530 return ApiStatus_DONE2;
531}
532
534 ASSERT(script->switchDepth >= 0);
535 script->ptrNextLine = evt_goto_end_case(script);
536 return ApiStatus_DONE2;
537}
538
540 s32 switchDepth = script->switchDepth;
541
542 ASSERT(switchDepth >= 0);
543
544 script->switchBlockState[switchDepth] = 0;
545 script->switchDepth--;
546
547 return ApiStatus_DONE2;
548}
549
551 Bytecode* args = script->ptrReadPos;
552 s32 curPtrReadPos = *args++;
553
555 return ApiStatus_DONE2;
556}
557
559 evt_set_variable(script, *script->ptrReadPos, script->ptrReadPos[1]);
560 return ApiStatus_DONE2;
561}
562
564 Bytecode* args = script->ptrReadPos;
565 Bytecode var = *args++;
566
568 return ApiStatus_DONE2;
569}
570
572 Bytecode* args = script->ptrReadPos;
573 Bytecode var = *args++;
574 s32 result = evt_get_variable(script, *args++);
576
577 result += addend;
578
579 evt_set_variable(script, var, result);
580 return ApiStatus_DONE2;
581}
582
584 Bytecode* args = script->ptrReadPos;
585 Bytecode var = *args++;
586 s32 result = evt_get_variable(script, *args++);
588
589 result = minuend - result;
590
591 evt_set_variable(script, var, result);
592 return ApiStatus_DONE2;
593}
594
596 Bytecode* args = script->ptrReadPos;
597 Bytecode var = *args++;
598 s32 result = evt_get_variable(script, *args++);
600
601 result *= multiplier;
602
603 evt_set_variable(script, var, result);
604 return ApiStatus_DONE2;
605}
606
608 Bytecode* args = script->ptrReadPos;
609 Bytecode var = *args++;
610 s32 result = evt_get_variable(script, *args++);
612
613 result = dividend / result;
614
615 evt_set_variable(script, var, result);
616 return ApiStatus_DONE2;
617}
618
620 Bytecode* args = script->ptrReadPos;
621 Bytecode var = *args++;
622 s32 result = evt_get_variable(script, *args++) + 0.5;
623 s32 num = evt_get_variable(script, var) + 0.5;
624
625 result = num % result;
626
627 evt_set_variable(script, var, result);
628 return ApiStatus_DONE2;
629}
630
632 Bytecode* args = script->ptrReadPos;
633 Bytecode var = *args++;
634 f32 result = evt_get_float_variable(script, *args++);
636
637 result += addend;
638
640 return ApiStatus_DONE2;
641}
642
644 Bytecode* args = script->ptrReadPos;
645 Bytecode var = *args++;
646 f32 result = evt_get_float_variable(script, *args++);
648
649 result = minuend - result;
650
652 return ApiStatus_DONE2;
653}
654
656 Bytecode* args = script->ptrReadPos;
657 Bytecode var = *args++;
658 f32 result = evt_get_float_variable(script, *args++);
660
661 result *= multiplier;
662
664 return ApiStatus_DONE2;
665}
666
668 Bytecode* args = script->ptrReadPos;
669 Bytecode var = *args++;
670 f32 result = evt_get_float_variable(script, *args++);
672
673 result = dividend / result;
674
676 return ApiStatus_DONE2;
677}
678
680 Bytecode* args = script->ptrReadPos;
681
682 script->buffer = (s32*) evt_get_variable(script, *args++);
683 return ApiStatus_DONE2;
684}
685
687 Bytecode* args = script->ptrReadPos;
688
689 script->buffer = (s32*) evt_get_variable(script, *args++);
690 return ApiStatus_DONE2;
691}
692
694 Bytecode* args = script->ptrReadPos;
696
697 var = *args++;
698 evt_set_variable(script, var, *script->buffer++);
699
700 return ApiStatus_DONE2;
701}
702
704 Bytecode* args = script->ptrReadPos;
706
707 var = *args++;
708 evt_set_variable(script, var, *script->buffer++);
709
710 var = *args++;
711 evt_set_variable(script, var, *script->buffer++);
712
713 return ApiStatus_DONE2;
714}
715
717 Bytecode* args = script->ptrReadPos;
719
720 var = *args++;
721 evt_set_variable(script, var, *script->buffer++);
722
723 var = *args++;
724 evt_set_variable(script, var, *script->buffer++);
725
726 var = *args++;
727 evt_set_variable(script, var, *script->buffer++);
728
729 return ApiStatus_DONE2;
730}
731
733 Bytecode* args = script->ptrReadPos;
735
736 var = *args++;
737 evt_set_variable(script, var, *script->buffer++);
738
739 var = *args++;
740 evt_set_variable(script, var, *script->buffer++);
741
742 var = *args++;
743 evt_set_variable(script, var, *script->buffer++);
744
745 var = *args++;
746 evt_set_variable(script, var, *script->buffer++);
747
748 return ApiStatus_DONE2;
749}
750
752 Bytecode* args = script->ptrReadPos;
754
755 var = *args++;
757
758 return ApiStatus_DONE2;
759}
760
762 Bytecode* args = script->ptrReadPos;
764
765 var = *args++;
767
768 return ApiStatus_DONE2;
769}
770
772 Bytecode* args = script->ptrReadPos;
774
775 var = *args++;
777
778 var = *args++;
780
781 return ApiStatus_DONE2;
782}
783
785 Bytecode* args = script->ptrReadPos;
787
788 var = *args++;
790
791 var = *args++;
793
794 var = *args++;
796
797 return ApiStatus_DONE2;
798}
799
801 Bytecode* args = script->ptrReadPos;
803
804 var = *args++;
806
807 var = *args++;
809
810 var = *args++;
812
813 var = *args++;
815
816 return ApiStatus_DONE2;
817}
818
820 Bytecode* args = script->ptrReadPos;
822
823 var = *args++;
825
826 return ApiStatus_DONE2;
827}
828
833
835 script->flagArray = (s32*)evt_get_variable(script, *script->ptrReadPos);
836 return ApiStatus_DONE2;
837}
838
840 Bytecode* args = script->ptrReadPos;
841 s32 size = evt_get_variable(script, *args++);
842 Bytecode var = *args++;
843
844 script->array = (s32*)heap_malloc(size * 4);
846 return ApiStatus_DONE2;
847}
848
850 Bytecode* args = script->ptrReadPos;
851 s32 var = *args++;
852 s32 bits = evt_get_variable(script, *args++);
854
856 return ApiStatus_DONE2;
857}
858
860 Bytecode* args = script->ptrReadPos;
861 s32 var = *args++;
862 s32 bits = *args++;
864
866 return ApiStatus_DONE2;
867}
868
870 Bytecode* args = script->ptrReadPos;
871 s32 var = *args++;
872 s32 bits = evt_get_variable(script, *args++);
874
876 return ApiStatus_DONE2;
877}
878
880 Bytecode* args = script->ptrReadPos;
881 s32 var = *args++;
882 s32 bits = *args++;
884
886 return ApiStatus_DONE2;
887}
888
890 Bytecode* args = script->ptrReadPos;
892 ApiFunc func;
894 EvtCallingLine = script->ptrCurLine;
895
896 if (script->blocked) {
897 isInitialCall = false;
898 func = script->callFunction;
899 ret = func(script, isInitialCall);
900 } else {
901 script->callFunction = (ApiFunc)evt_get_variable(script, *args++);
902 script->ptrReadPos = args;
903 script->curArgc--;
904 script->blocked = true;
905 isInitialCall = true;
906 func = script->callFunction;
907 ret = func(script, isInitialCall);
908 }
909
910 EvtCallingLine = nullptr;
911 return ret;
912}
913
915 Bytecode* args = script->ptrReadPos;
917 Evt* newScript;
918 s32 i;
919
920 newScript = start_script_in_group(newSource, script->priority, 0, script->groupFlags);
921
922 newScript->owner1 = script->owner1;
923 newScript->owner2 = script->owner2;
924
925 for (i = 0; i < ARRAY_COUNT(script->varTable); i++) {
926 newScript->varTable[i] = script->varTable[i];
927 }
928
929 for (i = 0; i < ARRAY_COUNT(script->varFlags); i++) {
930 newScript->varFlags[i] = script->varFlags[i];
931 }
932
933 newScript->array = script->array;
934 newScript->flagArray = script->flagArray;
935
936 return ApiStatus_DONE2;
937}
938
940 Bytecode* args = script->ptrReadPos;
942 Bytecode outVar = *args++;
943 Evt* newScript;
944 s32 i;
945
946 newScript = start_script_in_group(newSource, script->priority, 0, script->groupFlags);
947
948 newScript->owner1 = script->owner1;
949 newScript->owner2 = script->owner2;
950
951 for (i = 0; i < ARRAY_COUNT(script->varTable); i++) {
952 newScript->varTable[i] = script->varTable[i];
953 }
954
955 for (i = 0; i < ARRAY_COUNT(script->varFlags); i++) {
956 newScript->varFlags[i] = script->varFlags[i];
957 }
958
959 newScript->array = script->array;
960 newScript->flagArray = script->flagArray;
961
963
964 return ApiStatus_DONE2;
965}
966
975
977 Bytecode* args = script->ptrReadPos;
978
979 script->ptrFirstLine = (Bytecode*) evt_get_variable(script, *args++);
981 return ApiStatus_DONE2;
982}
983
986 Evt* script;
987
988 if (trigger->runningScript == nullptr) {
989 scriptStart = trigger->onTriggerEvt;
991 return 0;
992 }
993
995 trigger->runningScript = script;
996 trigger->runningScriptID = script->id;
997 script->varTable[0] = trigger->varTable[0];
998 script->varTable[1] = trigger->varTable[1];
999 script->varTable[2] = trigger->varTable[2];
1000 script->owner2.trigger = trigger;
1001 }
1002
1003 if (!does_script_exist(trigger->runningScriptID)) {
1004 trigger->runningScript = nullptr;
1005 return 0; // stop calling this function
1006 }
1007
1008 return 1; // keep calling this function every frame
1009}
1010
1012 Bytecode* args = script->ptrReadPos;
1013 Trigger* trigger;
1015 Bytecode triggerType = *args++;
1016 Bytecode colliderIDVar = *args++;
1017 Bytecode hasInteractPrompt = *args++;
1018 Bytecode triggerOut = *args++;
1020
1022 bp.colliderID = evt_get_variable(script, colliderIDVar);
1024 bp.hasPlayerInteractPrompt = hasInteractPrompt;
1025 bp.tattleMsg = 0;
1026 bp.onActivateFunc = evt_trigger_on_activate_exec_script;
1027
1028 trigger = create_trigger(&bp);
1030 trigger->runningScript = nullptr;
1031 trigger->priority = script->priority;
1032 trigger->varTable[0] = evt_get_variable(script, script->varTable[0]);
1033 trigger->varTable[1] = evt_get_variable(script, script->varTable[1]);
1034 trigger->varTable[2] = evt_get_variable(script, script->varTable[2]);
1035
1036 if (triggerOut != 0) {
1038 }
1039
1040 return ApiStatus_DONE2;
1041}
1042
1043API_CALLABLE(DeleteTrigger) {
1045 return ApiStatus_DONE2;
1046}
1047
1049 delete_trigger(script->owner2.trigger);
1050 return ApiStatus_DONE2;
1051}
1052
1057
1062
1067
1072
1077
1082
1087
1092
1097
1102
1104 Bytecode* args = script->ptrReadPos;
1105 s32 scriptID = evt_get_variable(script, *args++);
1106 Bytecode var2 = *args++;
1107
1109 return ApiStatus_DONE2;
1110}
1111
1113 if (trigger->runningScript == nullptr) {
1115 trigger->runningScript = newScript;
1116 trigger->runningScriptID = newScript->id;
1117 newScript->varTable[0] = trigger->varTable[0];
1118 newScript->varTable[1] = trigger->varTable[1];
1119 newScript->varTable[2] = trigger->varTable[2];
1120 newScript->owner2.trigger = trigger;
1121 }
1122
1123 if (!does_script_exist(trigger->runningScriptID)) {
1124 trigger->runningScript = nullptr;
1125 trigger->flags &= ~TRIGGER_ACTIVATED;
1126 }
1127 return 0;
1128}
1129
1131 Bytecode* args = script->ptrReadPos;
1132 Trigger* trigger;
1134 Bytecode triggerType = *args++;
1135 Bytecode colliderIDVar = *args++;
1136 s32* itemList = (s32*)evt_get_variable(script, *args++);
1137 Bytecode triggerOut = *args++;
1138 s32 hasInteractPrompt = *args++;
1140
1142 bp.colliderID = evt_get_variable(script, colliderIDVar);
1144 bp.itemList = itemList;
1145 bp.onActivateFunc = evt_trigger_on_activate_lock;
1146 bp.tattleMsg = triggerOut;
1147 bp.hasPlayerInteractPrompt = hasInteractPrompt;
1148
1149 trigger = create_trigger(&bp);
1151 trigger->runningScript = nullptr;
1152 trigger->priority = script->priority;
1153 trigger->varTable[0] = evt_get_variable(script, script->varTable[0]);
1154 trigger->varTable[1] = evt_get_variable(script, script->varTable[1]);
1155 trigger->varTable[2] = evt_get_variable(script, script->varTable[2]);
1156
1157 return ApiStatus_DONE2;
1158}
1159
1161 Evt* newScript;
1162 s32 nargs;
1163 s32 opcode;
1164 s32 i;
1165
1166 // seek end thread opcode
1169 do {
1170 opcode = *endLine++;
1171 nargs = *endLine++;
1172 endLine += nargs;
1173 } while (opcode != EVT_OP_END_THREAD);
1174
1175 script->ptrNextLine = endLine;
1177 newScript->owner1.enemyID = script->owner1.enemyID;
1178 newScript->owner2.npcID = script->owner2.npcID;
1179 newScript->array = script->array;
1180 newScript->flagArray = script->flagArray;
1181
1182 for (i = 0; i < ARRAY_COUNT(script->varTable); i++) {
1183 newScript->varTable[i] = script->varTable[i];
1184 }
1185
1186 for (i = 0; i < ARRAY_COUNT(script->varFlags); i++) {
1187 newScript->varFlags[i] = script->varFlags[i];
1188 }
1189
1190 return ApiStatus_DONE2;
1191}
1192
1197
1199 Evt* newScript;
1200 s32 nargs;
1201 s32 opcode;
1202
1205 do {
1206 opcode = *endLine++;
1207 nargs = *endLine++;
1208 endLine += nargs;
1209 } while (opcode != EVT_OP_END_CHILD_THREAD);
1210
1211 script->ptrNextLine = endLine;
1213 newScript->owner1.enemyID = script->owner1.enemyID;
1214 newScript->owner2.npcID = script->owner2.npcID;
1215 newScript->groupFlags = script->groupFlags;
1216 newScript->array = script->array;
1217 newScript->flagArray = script->flagArray;
1218
1219 return ApiStatus_DONE2;
1220}
1221
1226
1230
1232
1233// TODO: Fake match, seems to be UB for some of the print calls.
1235 Bytecode* args = script->ptrReadPos;
1236 s32 var = *args++;
1238
1239 if (var <= EVT_LIMIT) {
1240 sprintf(evtDebugPrintBuffer, "ADDR [%08lX]", var);
1241 } else if (var <= EVT_FIXED_CUTOFF) {
1243 } else if (var <= EVT_ARRAY_FLAG_CUTOFF) {
1245 flagBitPos = var % 32;
1246 sprintf(evtDebugPrintBuffer, "UF(%3ld) [%ld]", var, script->flagArray[var / 32] & (1 << flagBitPos));
1247 } else if (var <= EVT_ARRAY_VAR_CUTOFF) {
1248 s32 arrayVal;
1249
1251 arrayVal = script->array[var];
1252
1253 if (script->array[var] <= EVT_LIMIT) {
1254 sprintf(evtDebugPrintBuffer, "UW(%3ld) [%08lX]", var, arrayVal);
1255 } else if (arrayVal <= EVT_FIXED_CUTOFF) {
1257 } else {
1258 sprintf(evtDebugPrintBuffer, "UW(%3ld) [%ld]", var, arrayVal);
1259 }
1260 } else if (var <= EVT_GAME_BYTE_CUTOFF) {
1262
1265
1266 if (globalByte <= EVT_LIMIT) {
1267 sprintf(evtDebugPrintBuffer, "GSW(%3ld) [%08lX]", var, globalByte);
1268 } else if (globalByte <= EVT_FIXED_CUTOFF) {
1270 } else {
1271 sprintf(evtDebugPrintBuffer, "GSW(%3ld) [%ld]", var, globalByte);
1272 }
1273 } else if (var <= EVT_AREA_BYTE_CUTOFF) {
1274 s32 areaByte;
1275
1278
1279 if (areaByte <= EVT_LIMIT) {
1280 sprintf(evtDebugPrintBuffer, "LSW(%3ld) [%08lX]", var, areaByte);
1281 } else if (areaByte <= EVT_FIXED_CUTOFF) {
1283 } else {
1284 sprintf(evtDebugPrintBuffer, "LSW(%3ld) [%ld]", var, areaByte);
1285 }
1286 } else if (var <= EVT_GAME_FLAG_CUTOFF) {
1288 sprintf(evtDebugPrintBuffer, "GSWF(%3ld)[%ld]", var, get_global_flag(var));
1289 } else if (var <= EVT_AREA_FLAG_CUTOFF) {
1291 sprintf(evtDebugPrintBuffer, "LSWF(%3ld)[%ld]", var, get_area_flag(var));
1292 } else if (var <= EVT_MAP_FLAG_CUTOFF) {
1294 flagBitPos = var % 32;
1295 sprintf(evtDebugPrintBuffer, "GF(%3ld) [%ld]", var, gMapFlags[var / 32] & (1 << flagBitPos));
1296 } else if (var <= EVT_LOCAL_FLAG_CUTOFF) {
1298 flagBitPos = var % 32;
1299 sprintf(evtDebugPrintBuffer, "LF(%3ld) [%ld]", var, script->varFlags[var / 32] & (1 << flagBitPos));
1300 } else if (var <= EVT_MAP_VAR_CUTOFF) {
1301 s32 mapVar;
1302
1304 mapVar = gMapVars[var];
1305
1306 if (mapVar <= EVT_LIMIT) {
1307 sprintf(evtDebugPrintBuffer, "GW(%3ld) [%08lX]", var, mapVar);
1308 } else if (mapVar <= EVT_FIXED_CUTOFF) {
1310 } else {
1311 sprintf(evtDebugPrintBuffer, "GW(%3ld) [%ld]", var, mapVar);
1312 }
1313 } else if (var <= EVT_LOCAL_VAR_CUTOFF) {
1314 s32 tableVar;
1315
1317 tableVar = script->varTable[var];
1318
1319 if (tableVar <= EVT_LIMIT) {
1320 sprintf(evtDebugPrintBuffer, "LW(%3ld) [%08lX]", var, tableVar);
1321 } else if (tableVar <= EVT_FIXED_CUTOFF) {
1323 } else {
1324 sprintf(evtDebugPrintBuffer, "LW(%3ld) [%ld]", var, tableVar);
1325 }
1326 } else {
1327 sprintf(evtDebugPrintBuffer, " [%ld]", var);
1328 }
1329
1330 return ApiStatus_DONE2;
1331}
1332
1334 script->ptrSavedPos = (Bytecode*)*script->ptrReadPos;
1335 return ApiStatus_DONE2;
1336}
1337
1341
1343 s32 i;
1344
1345 for (i = 0; i < MAX_SCRIPTS; i++) {
1346 if (script == get_script_by_index(i)) {
1347 break;
1348 }
1349 }
1350 return ApiStatus_DONE1;
1351}
1352
1354 #if DX_DEBUG_MENU
1355 script->debugPaused = true;
1356 #endif
1357 return ApiStatus_DONE2;
1358}
1359
1362
1363 while (true) {
1364 s32 status = ApiStatus_DONE2;
1365 s32* lines;
1366 s32 nargs;
1367
1368 #if DX_DEBUG_MENU
1369 if (script->debugPaused && script->curOpcode != EVT_OP_INTERNAL_FETCH) {
1370 switch (script->debugStep) {
1372 return EVT_CMD_RESULT_YIELD;
1374 script->debugStep = DEBUG_EVT_STEP_NONE;
1375 break;
1377 // do not pause execution until we get a block
1378 break;
1379 }
1380 }
1381 #endif
1382
1384 if (commandsExecuted >= 10000) {
1385 char scriptName[0x80];
1387 PANIC_MSG("Script %s is blocking for ages (infinite loop?)", scriptName);
1388 }
1389
1390 switch (script->curOpcode) {
1392 script->ptrCurLine = script->ptrNextLine;
1393 lines = script->ptrNextLine;
1394 script->curOpcode = *lines++;
1395 nargs = *lines++;
1396 script->ptrReadPos = lines;
1397 script->blocked = false;
1398 script->curArgc = nargs;
1399 lines = &lines[nargs];
1400 script->ptrNextLine = lines;
1401 status = ApiStatus_REPEAT;
1402 break;
1403 case EVT_OP_RETURN:
1404 status = evt_handle_return(script);
1405 break;
1406 case EVT_OP_LABEL:
1407 status = evt_handle_label(script);
1408 break;
1409 case EVT_OP_GOTO:
1410 status = evt_handle_goto(script);
1411 break;
1412 case EVT_OP_LOOP:
1413 status = evt_handle_loop(script);
1414 break;
1415 case EVT_OP_END_LOOP:
1416 status = evt_handle_end_loop(script);
1417 break;
1418 case EVT_OP_BREAK_LOOP:
1419 status = evt_handle_break_loop(script);
1420 break;
1421 case EVT_OP_WAIT_FRAMES:
1422 status = evt_handle_wait(script);
1423 break;
1424 case EVT_OP_WAIT_SECS:
1426 break;
1427 case EVT_OP_IF_EQ:
1428 status = evt_handle_if_equal(script);
1429 break;
1430 case EVT_OP_IF_NE:
1432 break;
1433 case EVT_OP_IF_LT:
1434 status = evt_handle_if_less(script);
1435 break;
1436 case EVT_OP_IF_GT:
1437 status = evt_handle_if_greater(script);
1438 break;
1439 case EVT_OP_IF_LE:
1441 break;
1442 case EVT_OP_IF_GE:
1444 break;
1445 case EVT_OP_IF_FLAG:
1446 status = evt_handle_if_AND(script);
1447 break;
1448 case EVT_OP_IF_NOT_FLAG:
1449 status = evt_handle_if_not_AND(script);
1450 break;
1451 case EVT_OP_ELSE:
1452 status = evt_handle_else(script);
1453 break;
1454 case EVT_OP_END_IF:
1455 status = evt_handle_end_if(script);
1456 break;
1457 case EVT_OP_SWITCH:
1458 status = evt_handle_switch(script);
1459 break;
1462 break;
1463 case EVT_OP_CASE_EQ:
1464 status = evt_handle_case_equal(script);
1465 break;
1466 case EVT_OP_CASE_NE:
1468 break;
1469 case EVT_OP_CASE_LT:
1470 status = evt_handle_case_less(script);
1471 break;
1472 case EVT_OP_CASE_LE:
1474 break;
1475 case EVT_OP_CASE_GT:
1477 break;
1478 case EVT_OP_CASE_GE:
1480 break;
1483 break;
1485 status = evt_handle_break_case(script);
1486 break;
1487 case EVT_OP_CASE_OR_EQ:
1489 break;
1492 break;
1493 case EVT_OP_CASE_AND_EQ:
1495 break;
1496 case EVT_OP_CASE_FLAG:
1497 status = evt_handle_case_AND(script);
1498 break;
1499 case EVT_OP_CASE_RANGE:
1500 status = evt_handle_case_range(script);
1501 break;
1502 case EVT_OP_END_SWITCH:
1503 status = evt_handle_end_switch(script);
1504 break;
1505 case EVT_OP_SET:
1506 status = evt_handle_set_var(script);
1507 break;
1508 case EVT_OP_SET_CONST:
1509 status = evt_handle_set_const(script);
1510 break;
1511 case EVT_OP_SETF:
1512 status = evt_handle_set_float(script);
1513 break;
1514 case EVT_OP_ADD:
1515 status = evt_handle_add(script);
1516 break;
1517 case EVT_OP_SUB:
1518 status = evt_handle_subtract(script);
1519 break;
1520 case EVT_OP_MUL:
1521 status = evt_handle_multiply(script);
1522 break;
1523 case EVT_OP_DIV:
1524 status = evt_handle_divide(script);
1525 break;
1526 case EVT_OP_MOD:
1527 status = evt_handle_mod(script);
1528 break;
1529 case EVT_OP_ADDF:
1530 status = evt_handle_addF(script);
1531 break;
1532 case EVT_OP_SUBF:
1533 status = evt_handle_subtractF(script);
1534 break;
1535 case EVT_OP_MULF:
1536 status = evt_handle_multiplyF(script);
1537 break;
1538 case EVT_OP_DIVF:
1539 status = evt_handle_divideF(script);
1540 break;
1541 case EVT_OP_USE_BUF:
1543 break;
1544 case EVT_OP_BUF_READ1:
1545 status = evt_handle_get_1_word(script);
1546 break;
1547 case EVT_OP_BUF_READ2:
1548 status = evt_handle_get_2_word(script);
1549 break;
1550 case EVT_OP_BUF_READ3:
1551 status = evt_handle_get_3_word(script);
1552 break;
1553 case EVT_OP_BUF_READ4:
1554 status = evt_handle_get_4_word(script);
1555 break;
1556 case EVT_OP_BUF_PEEK:
1558 break;
1559 case EVT_OP_USE_FBUF:
1561 break;
1562 case EVT_OP_FBUF_READ1:
1564 break;
1565 case EVT_OP_FBUF_READ2:
1567 break;
1568 case EVT_OP_FBUF_READ3:
1570 break;
1571 case EVT_OP_FBUF_READ4:
1573 break;
1574 case EVT_OP_FBUF_PEEK:
1576 break;
1577 case EVT_OP_USE_ARRAY:
1578 status = evt_handle_set_array(script);
1579 break;
1580 case EVT_OP_USE_FLAGS:
1582 break;
1585 break;
1586 case EVT_OP_KILL_THREAD:
1587 status = evt_handle_kill(script);
1588 break;
1589 case EVT_OP_BITWISE_AND:
1590 status = evt_handle_AND(script);
1591 break;
1593 status = evt_handle_AND_const(script);
1594 break;
1595 case EVT_OP_BITWISE_OR:
1596 status = evt_handle_OR(script);
1597 break;
1599 status = evt_handle_OR_const(script);
1600 break;
1601 case EVT_OP_CALL:
1602 status = evt_handle_call(script);
1603 break;
1604 case EVT_OP_EXEC:
1605 status = evt_handle_exec1(script);
1606 break;
1609 break;
1610 case EVT_OP_EXEC_WAIT:
1611 status = evt_handle_exec_wait(script);
1612 break;
1614 status = evt_handle_bind(script);
1615 break;
1616 case EVT_OP_UNBIND:
1617 status = evt_handle_unbind(script);
1618 break;
1621 break;
1624 break;
1625 case EVT_OP_SET_GROUP:
1626 status = evt_handle_set_group(script);
1627 break;
1628 case EVT_OP_JUMP:
1629 status = evt_handle_jump(script);
1630 break;
1632 status = evt_handle_bind_lock(script);
1633 break;
1636 break;
1638 status = evt_handle_resume_all(script);
1639 break;
1642 break;
1645 break;
1647 status = evt_handle_suspend(script);
1648 break;
1650 status = evt_handle_resume(script);
1651 break;
1654 break;
1655 case EVT_OP_THREAD:
1656 status = evt_handle_thread(script);
1657 break;
1658 case EVT_OP_END_THREAD:
1659 status = evt_handle_end_thread(script);
1660 break;
1663 break;
1666 break;
1667 case EVT_OP_DEBUG_LOG:
1668 status = evt_handle_debug_log(script);
1669 break;
1672 break;
1673 case EVT_OP_92:
1674 status = func_802C739C(script);
1675 break;
1676 case EVT_OP_93:
1677 status = func_802C73B0(script);
1678 break;
1679 case EVT_OP_94:
1680 status = func_802C73B8(script);
1681 break;
1684 break;
1685 case EVT_OP_END:
1686 break;
1687 default:
1688 PANIC();
1689 }
1690
1691 if (status == ApiStatus_REPEAT) {
1692 // execute command after a fetch operation
1693 continue;
1694 }
1695
1696 if (status == ApiStatus_FINISH) {
1697 return EVT_CMD_RESULT_YIELD;
1698 }
1699
1700 if (status < 0) {
1701 return EVT_CMD_RESULT_ERROR;
1702 }
1703
1704 if (status == ApiStatus_BLOCK) {
1706 }
1707
1708 #if DX_DEBUG_MENU
1709 // pause again now that the current command is done blocking
1710 if (script->debugStep == DEBUG_EVT_STEP_OVER) {
1711 script->debugStep = DEBUG_EVT_STEP_NONE;
1712 }
1713 #endif
1714
1715 if (status == ApiStatus_DONE1) {
1716 script->curOpcode = EVT_OP_INTERNAL_FETCH;
1718 }
1719
1720 if (status == ApiStatus_DONE2) {
1721 script->curOpcode = EVT_OP_INTERNAL_FETCH;
1723 continue;
1724 }
1726 }
1727 }
1728}
1729
1731 s32 wordIdx;
1732 s32 bitIdx;
1733 s32 temp;
1734
1735 if (var <= EVT_LIMIT) {
1736 return var;
1737 } else if (var <= EVT_IGNORE_ARG) {
1738 return var;
1739 } else if (var <= EVT_FIXED_CUTOFF) {
1741 } else if (var <= EVT_ARRAY_FLAG_CUTOFF) {
1743 wordIdx = var / 32;
1744 bitIdx = var % 32;
1745 var = (script->flagArray[wordIdx] & (1 << bitIdx)) != 0;
1746 return var;
1747 } else if (var <= EVT_ARRAY_VAR_CUTOFF) {
1749 var = script->array[var];
1750 if (var > EVT_LIMIT) {
1751 if (var <= EVT_FIXED_CUTOFF){
1753 }
1754 }
1755 } else if (var <= EVT_GAME_BYTE_CUTOFF) {
1757 return get_global_byte(var);
1758 } else if (var <= EVT_AREA_BYTE_CUTOFF) {
1760 return get_area_byte(var);
1761 } else if (var <= EVT_GAME_FLAG_CUTOFF) {
1763 return get_global_flag(var);
1764 } else if (var <= EVT_AREA_FLAG_CUTOFF) {
1766 return get_area_flag(var);
1767 } else if (var <= EVT_MAP_FLAG_CUTOFF) {
1769 wordIdx = var;
1770 bitIdx = var % 32;
1771 var = (gMapFlags[wordIdx / 32] & (1 << bitIdx)) != 0;
1772 return var;
1773 } else if (var <= EVT_LOCAL_FLAG_CUTOFF) {
1775 wordIdx = var;
1776 bitIdx = var % 32;
1777 var = (script->varFlags[wordIdx / 32] & (1 << bitIdx)) != 0;
1778 return var;
1779 } else if (var <= EVT_MAP_VAR_CUTOFF) {
1781 var = gMapVars[var];
1782 if (var > EVT_LIMIT) {
1784 if (var <= temp){
1786 }
1787 }
1788 } else if (var <= EVT_LOCAL_VAR_CUTOFF) {
1790 var = script->varTable[var];
1791 if (var > EVT_LIMIT) {
1793 if (var <= temp){
1795 }
1796 }
1797 }
1798 return var;
1799}
1800
1802 if (EVT_LIMIT >= var) {
1803 return var;
1804 }
1805 if (EVT_IGNORE_ARG >= var) {
1806 return var;
1807 }
1808 if (EVT_FIXED_CUTOFF >= var) {
1809 return var;
1810 }
1811 if (EVT_ARRAY_FLAG_CUTOFF >= var) {
1813 }
1814 if (EVT_ARRAY_VAR_CUTOFF >= var) {
1816 }
1817 if (EVT_GAME_BYTE_CUTOFF >= var) {
1819 }
1820 if (EVT_AREA_BYTE_CUTOFF >= var) {
1822 }
1823 if (EVT_GAME_FLAG_CUTOFF >= var) {
1825 }
1826 if (EVT_AREA_FLAG_CUTOFF >= var) {
1828 }
1829 if (EVT_MAP_FLAG_CUTOFF >= var) {
1830 return EVT_INDEX_OF_MAP_FLAG(var);
1831 }
1832 if (EVT_LOCAL_FLAG_CUTOFF >= var) {
1834 }
1835 if (EVT_MAP_VAR_CUTOFF >= var) {
1836 return EVT_INDEX_OF_MAP_VAR(var);
1837 }
1838 if (EVT_LOCAL_VAR_CUTOFF >= var) {
1840 }
1841 return var;
1842}
1843
1845 if (EVT_LIMIT >= var) {
1846 return var;
1847 }
1848 if (EVT_IGNORE_ARG >= var) {
1849 return var;
1850 }
1851 if (EVT_FIXED_CUTOFF >= var) {
1852 return var;
1853 }
1854 if (EVT_ARRAY_FLAG_CUTOFF >= var) {
1856 }
1857 if (EVT_ARRAY_VAR_CUTOFF >= var) {
1859 }
1860 if (EVT_GAME_BYTE_CUTOFF >= var) {
1862 }
1863 if (EVT_AREA_BYTE_CUTOFF >= var) {
1865 }
1866 if (EVT_GAME_FLAG_CUTOFF >= var) {
1868 }
1869 if (EVT_AREA_FLAG_CUTOFF >= var) {
1871 }
1872 if (EVT_MAP_FLAG_CUTOFF >= var) {
1873 return EVT_INDEX_OF_MAP_FLAG(var);
1874 }
1875 if (EVT_LOCAL_FLAG_CUTOFF >= var) {
1877 }
1878 if (EVT_MAP_VAR_CUTOFF >= var) {
1879 return EVT_INDEX_OF_MAP_VAR(var);
1880 }
1881 if (EVT_LOCAL_VAR_CUTOFF >= var) {
1883 }
1884 return var;
1885}
1886
1889 s32 oldValue;
1890
1891 if (var <= EVT_LIMIT) {
1892 return value;
1893 } else if (var <= EVT_FIXED_CUTOFF) {
1894 return evt_fixed_var_to_float(value);
1895 } else if (var <= EVT_ARRAY_FLAG_CUTOFF) {
1897 flagBitPos = var % 32;
1898 if (value) {
1899 script->flagArray[var / 32] |= 1 << flagBitPos;
1900 } else {
1901 script->flagArray[var / 32] &= ~(1 << flagBitPos);
1902 }
1903 return value;
1904 } else if (var <= EVT_ARRAY_VAR_CUTOFF) {
1906 oldValue = script->array[var];
1907 script->array[var] = value;
1908 return oldValue;
1909 } else if (var <= EVT_GAME_BYTE_CUTOFF) {
1912 set_global_byte(var, value);
1913 return oldValue;
1914 } else if (var <= EVT_AREA_BYTE_CUTOFF) {
1917 set_area_byte(var, value);
1918 return oldValue;
1919 } else if (var <= EVT_GAME_FLAG_CUTOFF) {
1922 if (value) {
1924 } else {
1926 }
1927 return oldValue;
1928 } else if (var <= EVT_AREA_FLAG_CUTOFF) {
1931 if (value) {
1933 } else {
1935 }
1936 return oldValue;
1937 } else if (var <= EVT_MAP_FLAG_CUTOFF) {
1939 flagBitPos = var % 32;
1940 if (value) {
1941 gMapFlags[var / 32] |= 1 << flagBitPos;
1942 } else {
1943 gMapFlags[var / 32] &= ~(1 << flagBitPos);
1944 }
1945 return value;
1946 } else if (var <= EVT_LOCAL_FLAG_CUTOFF) {
1948 flagBitPos = var % 32;
1949 if (value) {
1950 script->varFlags[var / 32] |= 1 << flagBitPos;
1951 } else {
1952 script->varFlags[var / 32] &= ~(1 << flagBitPos);
1953 }
1954 return value;
1955 } else if (var <= EVT_MAP_VAR_CUTOFF) {
1958 gMapVars[var] = value;
1959 return oldValue;
1960 } else if (var <= EVT_LOCAL_VAR_CUTOFF) {
1962 oldValue = script->varTable[var];
1963 script->varTable[var] = value;
1964 return oldValue;
1965 } else {
1966 return value;
1967 }
1968}
1969
1971 s32 temp;
1972
1973 if (var <= EVT_LIMIT) {
1974 return var;
1975 } else if (var <= EVT_IGNORE_ARG) {
1976 return var;
1977 } else if (var <= EVT_FIXED_CUTOFF) {
1979 } else if (var <= EVT_ARRAY_VAR_CUTOFF) {
1981 return evt_fixed_var_to_float(script->array[var]);
1982 } else if (var <= EVT_GAME_BYTE_CUTOFF) {
1985 } else if (var <= EVT_AREA_BYTE_CUTOFF) {
1988 } else if (var <= EVT_MAP_FLAG_CUTOFF) {
1990 temp = var % 32;
1991 var = gMapFlags[var / 32] & (1 << temp);
1992 if (var) {
1993 return 1.0f;
1994 } else {
1995 return 0.0f;
1996 }
1997 } else if (var <= EVT_LOCAL_FLAG_CUTOFF) {
1999 temp = var % 32;
2000 var = script->varFlags[var / 32] & (1 << temp);
2001 if (var) {
2002 return 1.0f;
2003 } else {
2004 return 0.0f;
2005 }
2006 } else if (var <= EVT_MAP_VAR_CUTOFF) {
2009 } else if (var <= EVT_LOCAL_VAR_CUTOFF) {
2011 return evt_fixed_var_to_float(script->varTable[var]);
2012 } else {
2014 }
2015}
2016
2018 s32 temp;
2019 s32 oldValue;
2020
2021 if (var <= EVT_LIMIT) {
2022 return value;
2023 } else if (var <= EVT_FIXED_CUTOFF) {
2024 return value;
2025 } else if (var <= EVT_ARRAY_VAR_CUTOFF) {
2027 oldValue = script->array[var];
2028 script->array[var] = evt_float_to_fixed_var(value);
2030 } else if (var <= EVT_MAP_FLAG_CUTOFF) {
2032 temp = var % 32;
2033 if (value) {
2034 gMapFlags[var / 32] |= 1 << temp;
2035 } else {
2036 gMapFlags[var / 32] &= ~(1 << temp);
2037 }
2038 return value;
2039 } else if (var <= EVT_LOCAL_FLAG_CUTOFF) {
2041 temp = var % 32;
2042 if (value) {
2043 script->varFlags[var / 32] |= 1 << temp;
2044 } else {
2045 script->varFlags[var / 32] &= ~(1 << temp);
2046 }
2047 return value;
2048 } else if (var <= EVT_MAP_VAR_CUTOFF) {
2053 } else if (var <= EVT_LOCAL_VAR_CUTOFF) {
2055 oldValue = script->varTable[var];
2056 script->varTable[var] = evt_float_to_fixed_var(value);
2058 } else {
2059 return value;
2060 }
2061}
2062
2064 Bytecode* ret = script->ptrReadPos;
2065 s32 i;
2066
2067 if (arg1 < EVT_LIMIT) {
2068 return (Bytecode*) arg1;
2069 }
2070
2071 for (i = 0; i < ARRAY_COUNT(script->labelIndices); i++) {
2072 if (script->labelIndices[i] == arg1) {
2073 ret = script->labelPositions[i];
2074 break;
2075 }
2076 }
2077
2078 ASSERT(i < ARRAY_COUNT(script->labelIndices));
2079 return ret;
2080}
2081
2083 s32 nestedIfDepth = 0;
2084 Bytecode* pos = script->ptrNextLine;
2086 s32 nargs;
2087
2088 do {
2089 opcode = *pos++;
2090 nargs = *pos++;
2091 pos += nargs;
2092
2093 switch (opcode) {
2094 case EVT_OP_END:
2095 PANIC();
2096 case EVT_OP_END_IF:
2097 nestedIfDepth--;
2098 if (nestedIfDepth < 0) {
2099 return pos;
2100 }
2101 break;
2102 case EVT_OP_IF_EQ:
2103 case EVT_OP_IF_NE:
2104 case EVT_OP_IF_LT:
2105 case EVT_OP_IF_GT:
2106 case EVT_OP_IF_LE:
2107 case EVT_OP_IF_GE:
2108 case EVT_OP_IF_FLAG:
2109 case EVT_OP_IF_NOT_FLAG:
2110 nestedIfDepth++;
2111 break;
2112 case EVT_OP_ELSE:
2113 if (nestedIfDepth == 0) {
2114 return pos;
2115 }
2116 break;
2117 }
2118 } while (true);
2119}
2120
2122 s32 nestedIfDepth = 0;
2123 Bytecode* pos = script->ptrNextLine;
2125 s32 nargs;
2126
2127 do {
2128 opcode = *pos++;
2129 nargs = *pos++;
2130 pos += nargs;
2131
2132 switch (opcode) {
2133 case EVT_OP_END:
2134 PANIC();
2135 case EVT_OP_END_IF:
2136 nestedIfDepth--;
2137 if (nestedIfDepth < 0) {
2138 return pos;
2139 }
2140 break;
2141 case EVT_OP_IF_EQ:
2142 nestedIfDepth++;
2143 break;
2144 case EVT_OP_IF_NE:
2145 nestedIfDepth++;
2146 break;
2147 case EVT_OP_IF_LT:
2148 nestedIfDepth++;
2149 break;
2150 case EVT_OP_IF_GT:
2151 nestedIfDepth++;
2152 break;
2153 case EVT_OP_IF_LE:
2154 nestedIfDepth++;
2155 break;
2156 case EVT_OP_IF_GE:
2157 nestedIfDepth++;
2158 break;
2159 case EVT_OP_IF_FLAG:
2160 nestedIfDepth++;
2161 break;
2162 case EVT_OP_IF_NOT_FLAG:
2163 nestedIfDepth++;
2164 break;
2165 }
2166 } while (true);
2167}
2168
2170 s32 switchDepth = 1;
2171 Bytecode* pos = script->ptrNextLine;
2172 s32* opcode;
2173 s32* nargs;
2174
2175 do {
2176 opcode = pos++;
2177 nargs = pos++;
2178 pos += *nargs;
2179
2180 switch (*opcode) {
2181 case EVT_OP_END:
2182 PANIC();
2183 break;
2184 case EVT_OP_SWITCH:
2185 switchDepth++;
2186 break;
2187 case EVT_OP_END_SWITCH:
2188 switchDepth--;
2189 if (switchDepth == 0) {
2190 return opcode;
2191 }
2192 break;
2193 }
2194 } while (true);
2195}
2196
2198 s32 switchDepth = 1;
2199 Bytecode* pos = script->ptrNextLine;
2200 s32* opcode;
2201 s32* nargs;
2202
2203 do {
2204 opcode = pos++;
2205 nargs = pos++;
2206 pos += *nargs;
2207
2208 switch (*opcode) {
2209 case EVT_OP_END:
2210 PANIC();
2211 break;
2212 case EVT_OP_SWITCH:
2213 switchDepth++;
2214 break;
2215 case EVT_OP_END_SWITCH:
2216 switchDepth--;
2217 if (switchDepth == 0) {
2218 return opcode;
2219 }
2220 break;
2221 case EVT_OP_CASE_EQ:
2222 case EVT_OP_CASE_NE:
2223 case EVT_OP_CASE_LT:
2224 case EVT_OP_CASE_GT:
2225 case EVT_OP_CASE_LE:
2226 case EVT_OP_CASE_GE:
2228 case EVT_OP_CASE_OR_EQ:
2229 case EVT_OP_CASE_AND_EQ:
2231 case EVT_OP_CASE_RANGE:
2232 if (switchDepth == 1) {
2233 return opcode;
2234 }
2235 break;
2236 }
2237 } while (true);
2238}
2239
2241 s32 loopDepth = 0;
2242 Bytecode* pos = script->ptrNextLine;
2243 s32 opcode;
2244 s32 nargs;
2245
2246 do {
2247 opcode = *pos++;
2248 nargs = *pos++;
2249 pos += nargs;
2250
2251 switch (opcode) {
2252 case EVT_OP_END:
2253 PANIC();
2254 break;
2255 case EVT_OP_END_LOOP:
2256 loopDepth--;
2257 if (loopDepth < 0) {
2258 return pos;
2259 }
2260 break;
2261 case EVT_OP_LOOP:
2262 loopDepth++;
2263 break;
2264 }
2265 } while (true);
2266}
BSS s32 PopupMenu_SelectedIndex
void backtrace_address_to_string(u32 address, char *dest)
Converts a function address to a string representation using its name, offset, and file.
Definition backtrace.c:389
Bytecode * ptrNextLine
Bytecode * ptrReadPos
ApiStatus(* ApiFunc)(struct Evt *, s32)
Bytecode EvtScript[]
Vec3s pos
Definition demo_api.c:17
#define ASSERT(condition)
@ DEBUG_SCRIPTS_BLOCK_FUNC_DONE
Definition enums.h:3876
@ TRIGGER_SCRIPT_BOUND
Definition enums.h:2677
ApiStatus func_802C739C(Evt *script)
Definition evt.c:1333
ApiStatus evt_handle_OR(Evt *script)
Definition evt.c:869
ApiStatus func_802C73B0(Evt *script)
Definition evt.c:1338
ApiStatus evt_handle_set_int_buffer_ptr(Evt *script)
Definition evt.c:679
ApiStatus evt_handle_break_loop(Evt *script)
Definition evt.c:91
s32 evt_get_variable_index(Evt *script, s32 var)
Definition evt.c:1801
Bytecode * evt_skip_if(Evt *script)
Definition evt.c:2082
ApiStatus evt_handle_AND(Evt *script)
Definition evt.c:849
ApiStatus evt_handle_set_float(Evt *script)
Definition evt.c:563
s32 evt_get_variable(Evt *script, Bytecode var)
Definition evt.c:1730
ApiStatus evt_handle_switch_const(Evt *script)
Definition evt.c:246
ApiStatus evt_handle_call(Evt *script)
Definition evt.c:889
ApiStatus evt_handle_case_greater(Evt *script)
Definition evt.c:351
ApiStatus evt_handle_end_thread(Evt *script)
Definition evt.c:1193
ApiStatus evt_handle_case_equal_OR(Evt *script)
Definition evt.c:463
ApiStatus evt_handle_get_3_word(Evt *script)
Definition evt.c:716
ApiStatus evt_handle_divideF(Evt *script)
Definition evt.c:667
ApiStatus evt_handle_multiply(Evt *script)
Definition evt.c:595
ApiStatus evt_handle_switch(Evt *script)
Definition evt.c:233
char evtDebugPrintBuffer[0x100]
Definition script_list.c:22
ApiStatus evt_handle_AND_const(Evt *script)
Definition evt.c:859
ApiStatus evt_handle_break_case(Evt *script)
Definition evt.c:533
Bytecode * evt_goto_end_case(Evt *script)
Definition evt.c:2169
ApiStatus evt_handle_debug_breakpoint(Evt *script)
Definition evt.c:1353
ApiStatus evt_handle_jump(Evt *script)
Definition evt.c:976
Bytecode * evt_skip_else(Evt *script)
Definition evt.c:2121
ApiStatus evt_handle_suspend_all(Evt *script)
Definition evt.c:1073
ApiStatus evt_handle_case_less(Evt *script)
Definition evt.c:305
ApiStatus evt_handle_set_timescale(Evt *script)
Definition evt.c:1063
ApiStatus evt_handle_set_const(Evt *script)
Definition evt.c:558
ApiStatus evt_handle_subtract(Evt *script)
Definition evt.c:583
ApiStatus evt_handle_if_greater(Evt *script)
Definition evt.c:166
ApiStatus evt_handle_exec_wait(Evt *script)
Definition evt.c:967
f32 evt_set_float_variable(Evt *script, Bytecode var, f32 value)
Definition evt.c:2017
ApiStatus evt_handle_set_array(Evt *script)
Definition evt.c:829
Bytecode * EvtCallingLine
Definition evt.c:11
Bytecode * evt_goto_next_case(Evt *script)
Definition evt.c:2197
ApiStatus evt_handle_if_less(Evt *script)
Definition evt.c:154
ApiStatus evt_handle_case_default(Evt *script)
Definition evt.c:423
ApiStatus evt_handle_exec1(Evt *script)
Definition evt.c:914
u32 * gMapFlags
Definition script_list.c:11
s32 evt_set_variable(Evt *script, Bytecode var, s32 value)
Definition evt.c:1887
ApiStatus evt_handle_add(Evt *script)
Definition evt.c:571
ApiStatus evt_handle_loop(Evt *script)
Definition evt.c:48
ApiStatus evt_handle_return(Evt *script)
Definition evt.c:34
Bytecode * evt_goto_end_loop(Evt *script)
Definition evt.c:2240
ApiStatus evt_handle_mod(Evt *script)
Definition evt.c:619
ApiStatus evt_handle_thread(Evt *script)
Definition evt.c:1160
s32 evt_get_variable_index_alt(s32 var)
Definition evt.c:1844
s32 evt_trigger_on_activate_lock(Trigger *trigger)
Definition evt.c:1112
ApiStatus evt_handle_case_equal_AND(Evt *script)
Definition evt.c:488
ApiStatus evt_handle_case_range(Evt *script)
Definition evt.c:397
Bytecode evt_float_to_fixed_var(f32 value)
Definition evt.c:28
ApiStatus evt_handle_goto(Evt *script)
Definition evt.c:43
s32 evt_trigger_on_activate_exec_script(Trigger *trigger)
Definition evt.c:984
ApiStatus evt_handle_OR_const(Evt *script)
Definition evt.c:879
ApiStatus evt_handle_bind(Evt *script)
Definition evt.c:1011
ApiStatus evt_handle_print_debug_var(Evt *script)
Definition evt.c:1234
ApiStatus evt_handle_set_var(Evt *script)
Definition evt.c:550
ApiStatus evt_handle_get_4_word(Evt *script)
Definition evt.c:732
ApiStatus evt_handle_unbind(Evt *script)
Definition evt.c:1048
ApiStatus evt_handle_bind_lock(Evt *script)
Definition evt.c:1130
ApiStatus evt_handle_if_not_equal(Evt *script)
Definition evt.c:142
ApiStatus evt_handle_get_1_float(Evt *script)
Definition evt.c:761
ApiStatus evt_handle_if_less_equal(Evt *script)
Definition evt.c:178
ApiStatus evt_handle_end_loop(Evt *script)
Definition evt.c:61
ApiStatus evt_handle_debug_log(Evt *script)
Definition evt.c:1227
ApiStatus func_802C73B8(Evt *script)
Definition evt.c:1342
s32 evt_execute_next_command(Evt *script)
Definition evt.c:1360
ApiStatus evt_handle_get_Nth_word(Evt *script)
Definition evt.c:751
ApiStatus evt_handle_exec1_get_id(Evt *script)
Definition evt.c:939
ApiStatus evt_handle_case_AND(Evt *script)
Definition evt.c:438
ApiStatus evt_handle_subtractF(Evt *script)
Definition evt.c:643
ApiStatus evt_handle_set_flag_array(Evt *script)
Definition evt.c:834
ApiStatus evt_handle_set_float_buffer_ptr(Evt *script)
Definition evt.c:686
ApiStatus evt_handle_end_child_thread(Evt *script)
Definition evt.c:1222
ApiStatus evt_handle_end_case_group(Evt *script)
Definition evt.c:516
ApiStatus evt_handle_get_Nth_float(Evt *script)
Definition evt.c:819
ApiStatus evt_handle_addF(Evt *script)
Definition evt.c:631
ApiStatus evt_handle_get_1_word(Evt *script)
Definition evt.c:693
ApiStatus evt_handle_set_priority(Evt *script)
Definition evt.c:1058
ApiStatus evt_handle_suspend(Evt *script)
Definition evt.c:1093
ApiStatus evt_handle_get_2_float(Evt *script)
Definition evt.c:771
ApiStatus evt_handle_case_less_equal(Evt *script)
Definition evt.c:328
ApiStatus evt_handle_get_2_word(Evt *script)
Definition evt.c:703
ApiStatus evt_handle_end_switch(Evt *script)
Definition evt.c:539
ApiStatus evt_handle_if_greater_equal(Evt *script)
Definition evt.c:190
ApiStatus evt_handle_resume_all(Evt *script)
Definition evt.c:1078
ApiStatus evt_handle_if_equal(Evt *script)
Definition evt.c:130
f32 evt_fixed_var_to_float(Bytecode scriptVar)
Definition evt.c:20
ApiStatus evt_handle_child_thread(Evt *script)
Definition evt.c:1198
f32 evt_get_float_variable(Evt *script, Bytecode var)
Definition evt.c:1970
ApiStatus evt_handle_case_equal(Evt *script)
Definition evt.c:259
ApiStatus evt_handle_get_3_float(Evt *script)
Definition evt.c:784
ApiStatus evt_handle_does_script_exist(Evt *script)
Definition evt.c:1103
Bytecode * evt_find_label(Evt *script, s32 arg1)
Definition evt.c:2063
ApiStatus evt_handle_else(Evt *script)
Definition evt.c:224
ApiStatus evt_handle_set_group(Evt *script)
Definition evt.c:1068
ApiStatus evt_handle_multiplyF(Evt *script)
Definition evt.c:655
ApiStatus evt_handle_resume(Evt *script)
Definition evt.c:1098
ApiStatus evt_handle_if_not_AND(Evt *script)
Definition evt.c:213
ApiStatus evt_handle_end_if(Evt *script)
Definition evt.c:229
ApiStatus evt_handle_kill(Evt *script)
Definition evt.c:1053
ApiStatus evt_handle_resume_others(Evt *script)
Definition evt.c:1088
ApiStatus evt_handle_if_AND(Evt *script)
Definition evt.c:202
ApiStatus evt_handle_wait_seconds(Evt *script)
Definition evt.c:114
ApiStatus evt_handle_wait(Evt *script)
Definition evt.c:98
ApiStatus evt_handle_case_not_equal(Evt *script)
Definition evt.c:282
ApiStatus evt_handle_get_4_float(Evt *script)
Definition evt.c:800
ApiStatus evt_handle_label(Evt *script)
Definition evt.c:39
s32 * gMapVars
Definition script_list.c:12
ApiStatus evt_handle_case_greater_equal(Evt *script)
Definition evt.c:374
ApiStatus evt_handle_suspend_others(Evt *script)
Definition evt.c:1083
ApiStatus evt_handle_allocate_array(Evt *script)
Definition evt.c:839
ApiStatus evt_handle_divide(Evt *script)
Definition evt.c:607
s32 ApiStatus
Definition evt.h:116
#define ApiStatus_DONE2
Definition evt.h:119
@ EVT_OP_LOOP
Args: number of repeats (0 = infinite)
Definition evt.h:15
@ EVT_OP_EXEC_GET_TID
Args: EvtScript*, container.
Definition evt.h:79
@ EVT_OP_CASE_DEFAULT
Definition evt.h:38
@ EVT_OP_END_IF
Definition evt.h:29
@ EVT_OP_INTERNAL_FETCH
Definition evt.h:10
@ EVT_OP_MOD
Args: container, expression to divide by.
Definition evt.h:53
@ EVT_OP_DEBUG_BREAKPOINT
Definition evt.h:105
@ EVT_OP_FBUF_READ2
Args: container.
Definition evt.h:66
@ EVT_OP_94
Definition evt.h:104
@ EVT_OP_93
Definition evt.h:103
@ EVT_OP_UNBIND
Unbinds any triggers bound to this script.
Definition evt.h:82
@ EVT_OP_ADDF
Args: container, expression to increment by.
Definition evt.h:54
@ EVT_OP_FBUF_READ3
Args: container, container.
Definition evt.h:67
@ EVT_OP_SET_PRIORITY
Args: priority.
Definition evt.h:85
@ EVT_OP_DIVF
Args: container, expression to divide by.
Definition evt.h:57
@ EVT_OP_CASE_FLAG
Args: expression to test for.
Definition evt.h:41
@ EVT_OP_ELSE
Definition evt.h:28
@ EVT_OP_DEBUG_LOG
Definition evt.h:100
@ EVT_OP_MULF
Args: container, expression to multiply by.
Definition evt.h:56
@ EVT_OP_SUSPEND_OTHERS
Args: group.
Definition evt.h:91
@ EVT_OP_SUSPEND_THREAD
Args: ScriptID.
Definition evt.h:93
@ EVT_OP_GOTO
Args: index.
Definition evt.h:14
@ EVT_OP_EXEC
Args: EvtScript*.
Definition evt.h:78
@ EVT_OP_USE_ARRAY
Args: *s32.
Definition evt.h:70
@ EVT_OP_MUL
Args: container, expression to multiply by.
Definition evt.h:51
@ EVT_OP_END_CASE_GROUP
Ends the case block of EVT_OP_CASE_OR_EQ condition(s).
Definition evt.h:42
@ EVT_OP_92
Definition evt.h:102
@ EVT_OP_IF_LE
Args: a, b.
Definition evt.h:24
@ EVT_OP_IF_FLAG
Args: a, b.
Definition evt.h:26
@ EVT_OP_WAIT_SECS
Definition evt.h:19
@ EVT_OP_END
Definition evt.h:11
@ EVT_OP_RETURN
Definition evt.h:12
@ EVT_OP_SET
Args: container, expression.
Definition evt.h:46
@ EVT_OP_IF_NE
Args: a, b.
Definition evt.h:21
@ EVT_OP_CASE_EQ
Args: expression to test for.
Definition evt.h:32
@ EVT_OP_BITWISE_OR_CONST
Args: container, value to bitwise OR with.
Definition evt.h:76
@ EVT_OP_BUF_READ1
Definition evt.h:59
@ EVT_OP_USE_FBUF
Identical to USE_BUFFER. Args: f32*.
Definition evt.h:64
@ EVT_OP_SETF
Args: container, expression.
Definition evt.h:48
@ EVT_OP_CHILD_THREAD
Parallel threads are killed as soon as the parent script returns.
Definition evt.h:98
@ EVT_OP_CASE_GE
Args: expression to test for.
Definition evt.h:37
@ EVT_OP_IF_GT
Args: a, b.
Definition evt.h:23
@ EVT_OP_CASE_OR_EQ
Args: expression to test for.
Definition evt.h:39
@ EVT_OP_END_CHILD_THREAD
Definition evt.h:99
@ EVT_OP_END_SWITCH
Definition evt.h:45
@ EVT_OP_DEBUG_PRINT_VAR
Args: expression.
Definition evt.h:101
@ EVT_OP_BUF_READ3
Args: container, container.
Definition evt.h:61
@ EVT_OP_DIV
Integer division. Args: container, expression to divide by.
Definition evt.h:52
@ EVT_OP_EXEC_WAIT
Spawns a script and waits for it to return before continuing. Args: EvtScript*.
Definition evt.h:80
@ EVT_OP_END_LOOP
Definition evt.h:16
@ EVT_OP_BUF_READ4
Args: container, container, container.
Definition evt.h:62
@ EVT_OP_ADD
Args: container, expression to increment by.
Definition evt.h:49
@ EVT_OP_FBUF_READ4
Args: container, container, container.
Definition evt.h:68
@ EVT_OP_BREAK_SWITCH
Definition evt.h:44
@ EVT_OP_SET_TIMESCALE
Args: timescale.
Definition evt.h:86
@ EVT_OP_USE_BUF
Args: s32*.
Definition evt.h:58
@ EVT_OP_BREAK_LOOP
Definition evt.h:17
@ EVT_OP_USE_FLAGS
Args: *s32.
Definition evt.h:71
@ EVT_OP_CASE_RANGE
Args: from, to.
Definition evt.h:43
@ EVT_OP_BITWISE_AND_CONST
Args: container, value to bitwise AND with.
Definition evt.h:74
@ EVT_OP_FBUF_READ1
Definition evt.h:65
@ EVT_OP_SUBF
Args: container, expression to decrement by.
Definition evt.h:55
@ EVT_OP_WAIT_FRAMES
Definition evt.h:18
@ EVT_OP_JUMP
Args: EvtScript*.
Definition evt.h:84
@ EVT_OP_THREAD
Definition evt.h:96
@ EVT_OP_CASE_AND_EQ
Args: expression to test for.
Definition evt.h:40
@ EVT_OP_SWITCH
Args: expression to test against.
Definition evt.h:30
@ EVT_OP_CASE_LE
Args: expression to test for.
Definition evt.h:36
@ EVT_OP_SUB
Args: container, expression to decrement by.
Definition evt.h:50
@ EVT_OP_IF_GE
Args: a, b.
Definition evt.h:25
@ EVT_OP_CALL
Args: *function, ...
Definition evt.h:77
@ EVT_OP_IF_NOT_FLAG
Args: a, b.
Definition evt.h:27
@ EVT_OP_IS_THREAD_RUNNING
Args: ScriptID, container.
Definition evt.h:95
@ EVT_OP_IF_LT
Args: a, b.
Definition evt.h:22
@ EVT_OP_SWITCH_CONST
Args: value to test against.
Definition evt.h:31
@ EVT_OP_CASE_NE
Args: expression to test for.
Definition evt.h:33
@ EVT_OP_SET_CONST
Args: container, value.
Definition evt.h:47
@ EVT_OP_KILL_THREAD
Args: ScriptID.
Definition evt.h:83
@ EVT_OP_LABEL
Args: index.
Definition evt.h:13
@ EVT_OP_RESUME_OTHERS
Args: group.
Definition evt.h:92
@ EVT_OP_RESUME_THREAD
Args: ScriptID.
Definition evt.h:94
@ EVT_OP_BUF_READ2
Args: container.
Definition evt.h:60
@ EVT_OP_END_THREAD
Definition evt.h:97
@ EVT_OP_RESUME_GROUP
Args: group.
Definition evt.h:90
@ EVT_OP_BIND_TRIGGER
Args: EvtScript*, trigger flags, s32 target, 1, Trigger*.
Definition evt.h:81
@ EVT_OP_BITWISE_AND
Args: container, expression to bitwise AND with.
Definition evt.h:73
@ EVT_OP_CASE_GT
Args: expression to test for.
Definition evt.h:35
@ EVT_OP_BITWISE_OR
Args: container, expression to bitwise OR with.
Definition evt.h:75
@ EVT_OP_SET_GROUP
Args: group.
Definition evt.h:87
@ EVT_OP_BIND_PADLOCK
Args: EvtScript*, trigger flags, s32 target, ItemList*, 0, 1.
Definition evt.h:88
@ EVT_OP_SUSPEND_GROUP
Args: group.
Definition evt.h:89
@ EVT_OP_CASE_LT
Args: expression to test for.
Definition evt.h:34
@ EVT_OP_MALLOC_ARRAY
Allocates a new array. Args: length, s32*.
Definition evt.h:72
@ EVT_OP_BUF_PEEK
Args: container, container, container, container.
Definition evt.h:63
@ EVT_OP_IF_EQ
Args: a, b.
Definition evt.h:20
@ EVT_OP_FBUF_PEEK
Args: container, container, container, container.
Definition evt.h:69
#define ApiStatus_REPEAT
Definition evt.h:120
s32 Bytecode
Definition evt.h:7
#define ApiStatus_FINISH
Definition evt.h:121
#define ApiStatus_DONE1
Definition evt.h:118
#define ApiStatus_BLOCK
Definition evt.h:117
@ EVT_CMD_RESULT_YIELD
Definition evt.h:124
@ EVT_CMD_RESULT_CONTINUE
Definition evt.h:125
@ EVT_CMD_RESULT_ERROR
Definition evt.h:126
@ EVT_FLAG_RUN_IMMEDIATELY
don't wait for next update_scripts call
Definition evt.h:162
@ EVT_FLAG_THREAD
Definition evt.h:163
void suspend_group_others(Evt *script, s32 groupFlags)
void kill_script(Evt *instanceToKill)
void resume_all_script(s32 id)
void set_script_group(Evt *script, s32 groupFlags)
Evt * start_child_script(Evt *parentScript, EvtScript *source, s32 initialState)
Evt * get_script_by_index(s32 index)
s32 is_another_trigger_bound(Trigger *, EvtScript *script)
Definition trigger.c:254
Evt * start_script(EvtScript *source, s32 priority, s32 initialState)
Evt * start_child_thread(Evt *parentScript, Bytecode *nextLine, s32 newState)
void resume_group_others(Evt *script, s32 groupFlags)
void kill_script_by_ID(s32 id)
Trigger * create_trigger(TriggerBlueprint *def)
Definition trigger.c:55
void set_script_timescale(Evt *script, f32 timescale)
void set_script_priority(Evt *script, s32 priority)
s32 does_script_exist(s32 id)
void delete_trigger(Trigger *toDelete)
Definition trigger.c:239
void suspend_all_script(s32 id)
void resume_all_group(s32 groupFlags)
Evt * start_script_in_group(EvtScript *source, u8 priority, u8 initialState, u8 groupFlags)
void suspend_all_group(s32 groupFlags)
Evt * restart_script(Evt *script)
void * heap_malloc(s32 size)
Definition heap.c:34
ApiStatus DeleteTrigger(Evt *script, b32 isInitialCall)
Removes a trigger previously bound with BindTrigger.
#define EVT_LOCAL_VAR_CUTOFF
Expressions in EVT instructions should be one of the following types:
Definition macros.h:24
#define EVT_INDEX_OF_AREA_BYTE(v)
Definition macros.h:142
#define EVT_ARRAY_VAR_CUTOFF
Definition macros.h:40
#define EVT_FIXED_OFFSET
Definition macros.h:45
#define MAX_SCRIPTS
Definition macros.h:89
#define EVT_MAP_FLAG_CUTOFF
Definition macros.h:30
#define ARRAY_COUNT(arr)
Definition macros.h:39
#define EVT_FIXED_CUTOFF
Definition macros.h:44
#define EVT_LOCAL_FLAG_CUTOFF
Definition macros.h:28
#define EVT_GAME_FLAG_CUTOFF
Definition macros.h:34
#define EVT_AREA_BYTE_CUTOFF
Definition macros.h:36
#define EVT_INDEX_OF_AREA_FLAG(v)
Definition macros.h:141
#define EVT_INDEX_OF_ARRAY_FLAG(v)
Definition macros.h:145
#define PANIC()
Definition macros.h:54
#define EVT_INDEX_OF_LOCAL_VAR(v)
Definition macros.h:137
#define EVT_INDEX_OF_ARRAY_VAR(v)
Definition macros.h:146
#define EVT_INDEX_OF_GAME_BYTE(v)
Definition macros.h:144
#define EVT_GAME_BYTE_CUTOFF
Definition macros.h:38
#define EVT_IGNORE_ARG
Definition macros.h:47
#define EVT_FIXED_TO_FLOAT(x)
Progammatically converts Float --> f32.
Definition macros.h:55
#define PANIC_MSG(msg, args...)
Definition macros.h:55
#define EVT_ARRAY_FLAG_CUTOFF
Definition macros.h:42
#define EVT_INDEX_OF_MAP_FLAG(v)
Definition macros.h:140
#define EVT_INDEX_OF_LOCAL_FLAG(v)
Definition macros.h:138
#define EVT_AREA_FLAG_CUTOFF
Definition macros.h:32
#define EVT_INDEX_OF_MAP_VAR(v)
Definition macros.h:139
#define EVT_MAP_VAR_CUTOFF
Definition macros.h:26
#define EVT_INDEX_OF_GAME_FLAG(v)
Definition macros.h:143
#define EVT_LIMIT
Definition macros.h:48
s32 runningScriptID
EvtScript * onTriggerEvt
struct Evt * runningScript
GameStatus * gGameStatusPtr
Definition main_loop.c:31
s32 set_global_flag(s32 index)
Definition vars_access.c:65
s32 get_global_flag(s32 index)
Definition vars_access.c:89
s32 set_area_flag(s32 index)
s32 get_global_byte(s32 index)
Get value of saved game byte.
s32 clear_area_flag(s32 index)
s32 get_area_flag(s32 index)
s32 get_area_byte(s32 index)
s8 set_area_byte(s32 index, s32 value)
s32 clear_global_flag(s32 index)
Definition vars_access.c:41
s8 set_global_byte(s32 index, s32 value)
Set value of saved game byte.