Paper Mario DX
Paper Mario (N64) modding
 
Loading...
Searching...
No Matches
macros.h
Go to the documentation of this file.
1#ifndef _SCRIPT_API_MACROS_H_
2#define _SCRIPT_API_MACROS_H_
3
4#include "evt.h"
5#include <stdarg.h>
6
7#ifdef _LANGUAGE_C_PLUS_PLUS
8extern "C" {
9#endif
11/****** EXPRESSIONS ***************************************************************************************************/
12
23
24#define EVT_LOCAL_VAR_CUTOFF -20000000
25#define EVT_LOCAL_VAR_OFFSET 30000000
26#define EVT_MAP_VAR_CUTOFF -40000000
27#define EVT_MAP_VAR_OFFSET 50000000
28#define EVT_LOCAL_FLAG_CUTOFF -60000000
29#define EVT_LOCAL_FLAG_OFFSET 70000000
30#define EVT_MAP_FLAG_CUTOFF -80000000
31#define EVT_MAP_FLAG_OFFSET 90000000
32#define EVT_AREA_FLAG_CUTOFF -100000000
33#define EVT_AREA_FLAG_OFFSET 110000000
34#define EVT_GAME_FLAG_CUTOFF -120000000
35#define EVT_GAME_FLAG_OFFSET 130000000
36#define EVT_AREA_BYTE_CUTOFF -140000000
37#define EVT_AREA_BYTE_OFFSET 150000000
38#define EVT_GAME_BYTE_CUTOFF -160000000
39#define EVT_GAME_BYTE_OFFSET 170000000
40#define EVT_ARRAY_VAR_CUTOFF -180000000
41#define EVT_ARRAY_VAR_OFFSET 190000000
42#define EVT_ARRAY_FLAG_CUTOFF -200000000
43#define EVT_ARRAY_FLAG_OFFSET 210000000
44#define EVT_FIXED_CUTOFF -220000000
45#define EVT_FIXED_OFFSET 230000000
46#define EVT_FIXED_END -240000000
47#define EVT_IGNORE_ARG -250000000 // used by a couple functions to selectively ignore args
48#define EVT_LIMIT -270000000 // TODO better name
49
50 // This fixes an issue with fixed point numbers not being correct. Potentially a truncation vs round difference.
51#define FLOAT_ROUND(x) ((x) >=0 ? (f64)((x) + 0.9) : (f64)(x))
52#define Float(DOUBLE) ((Bytecode)FLOAT_ROUND(((DOUBLE) * 1024.0f)) - EVT_FIXED_OFFSET)
53
55#define EVT_FIXED_TO_FLOAT(x) ({f32 var = (x) + EVT_FIXED_OFFSET; var /= 1024.0f; var;})
58#define FLOAT_TO_FIXED(x) (((x) * 1024.0f) + -EVT_FIXED_OFFSET)
59
61#define Ref(sym) ((Bytecode) &(sym))
62
68#define LocalVar(INDEX) ((INDEX) - EVT_LOCAL_VAR_OFFSET)
69
74#define MapVar(INDEX) ((INDEX) - EVT_MAP_VAR_OFFSET)
75
81#define LocalFlag(INDEX) ((INDEX) - EVT_LOCAL_FLAG_OFFSET)
87#define MapFlag(INDEX) ((INDEX) - EVT_MAP_FLAG_OFFSET)
95#define AreaFlag(INDEX) ((INDEX) - EVT_AREA_FLAG_OFFSET)
102#define GameFlag(INDEX) ((INDEX) - EVT_GAME_FLAG_OFFSET)
111#define AreaByte(INDEX) ((INDEX) - EVT_AREA_BYTE_OFFSET)
116#define GameByte(INDEX) ((INDEX) - EVT_GAME_BYTE_OFFSET)
123#define ArrayVar(INDEX) ((INDEX) - EVT_ARRAY_VAR_OFFSET)
129#define ArrayFlag(INDEX) ((INDEX) - EVT_ARRAY_FLAG_OFFSET)
133#define EVT_ENTITY_ID_BIT 0x4000
134#define EVT_ENTITY_INDEX(entityIndex) ((entityIndex) + EVT_ENTITY_ID_BIT)
136// inverse macros for obtaining the index of a variable from its encoded form
137#define EVT_INDEX_OF_LOCAL_VAR(v) ((v) + EVT_LOCAL_VAR_OFFSET)
138#define EVT_INDEX_OF_LOCAL_FLAG(v) ((v) + EVT_LOCAL_FLAG_OFFSET)
139#define EVT_INDEX_OF_MAP_VAR(v) ((v) + EVT_MAP_VAR_OFFSET)
140#define EVT_INDEX_OF_MAP_FLAG(v) ((v) + EVT_MAP_FLAG_OFFSET)
141#define EVT_INDEX_OF_AREA_FLAG(v) ((v) + EVT_AREA_FLAG_OFFSET)
142#define EVT_INDEX_OF_AREA_BYTE(v) ((v) + EVT_AREA_BYTE_OFFSET)
143#define EVT_INDEX_OF_GAME_FLAG(v) ((v) + EVT_GAME_FLAG_OFFSET)
144#define EVT_INDEX_OF_GAME_BYTE(v) ((v) + EVT_GAME_BYTE_OFFSET)
145#define EVT_INDEX_OF_ARRAY_FLAG(v) ((v) + EVT_ARRAY_FLAG_OFFSET)
146#define EVT_INDEX_OF_ARRAY_VAR(v) ((v) + EVT_ARRAY_VAR_OFFSET)
147
148// shorthand names for LocalVar
149#define LVar0 LocalVar(0)
150#define LVar1 LocalVar(1)
151#define LVar2 LocalVar(2)
152#define LVar3 LocalVar(3)
153#define LVar4 LocalVar(4)
154#define LVar5 LocalVar(5)
155#define LVar6 LocalVar(6)
156#define LVar7 LocalVar(7)
157#define LVar8 LocalVar(8)
158#define LVar9 LocalVar(9)
159#define LVarA LocalVar(10)
160#define LVarB LocalVar(11)
161#define LVarC LocalVar(12)
162#define LVarD LocalVar(13)
163#define LVarE LocalVar(14)
164#define LVarF LocalVar(15)
165
166// shorthand names for common LocalFlags
167// these actually run all the way up to LocalFlag(96), but nothing past 15 is ever used
168#define LFlag0 LocalFlag(0)
169#define LFlag1 LocalFlag(1)
170#define LFlag2 LocalFlag(2)
171#define LFlag3 LocalFlag(3)
172#define LFlag4 LocalFlag(4)
173#define LFlag5 LocalFlag(5)
174#define LFlag6 LocalFlag(6)
175#define LFlag7 LocalFlag(7)
176#define LFlag8 LocalFlag(8)
177#define LFlag9 LocalFlag(9)
178#define LFlagA LocalFlag(10)
179#define LFlagB LocalFlag(11)
180#define LFlagC LocalFlag(12)
181#define LFlagD LocalFlag(13)
182#define LFlagE LocalFlag(14)
183#define LFlagF LocalFlag(15)
184
185/****** INSTRUCTIONS **************************************************************************************************/
199
208#define EVT_CMD(opcode, argv...) \
209 opcode, \
210 (sizeof((Bytecode[]){argv})/sizeof(Bytecode)), \
211 ##argv
214#define End EVT_CMD(EVT_OP_END),
215
218#define Return EVT_CMD(EVT_OP_RETURN),
223#define Jump(EVT_SOURCE) EVT_CMD(EVT_OP_JUMP, (Bytecode) EVT_SOURCE),
228#define Label(LABEL_ID) EVT_CMD(EVT_OP_LABEL, LABEL_ID),
229
233#define Goto(LABEL_ID) EVT_CMD(EVT_OP_GOTO, LABEL_ID),
246#define Loop(TIMES) EVT_CMD(EVT_OP_LOOP, TIMES),
247
249#define EndLoop EVT_CMD(EVT_OP_END_LOOP),
250
252#define BreakLoop EVT_CMD(EVT_OP_BREAK_LOOP),
253
255#define Wait(NUM_FRAMES) EVT_CMD(EVT_OP_WAIT_FRAMES, NUM_FRAMES),
256
257
259#define WaitSecs(NUM_SECONDS) EVT_CMD(EVT_OP_WAIT_SECS, NUM_SECONDS),
260
270#define IfEq(LVAR, RVAR) EVT_CMD(EVT_OP_IF_EQ, LVAR, RVAR),
271
273#define IfNe(LVAR, RVAR) EVT_CMD(EVT_OP_IF_NE, LVAR, RVAR),
274
276#define IfLt(LVAR, RVAR) EVT_CMD(EVT_OP_IF_LT, LVAR, RVAR),
277
279#define IfGt(LVAR, RVAR) EVT_CMD(EVT_OP_IF_GT, LVAR, RVAR),
282#define IfLe(LVAR, RVAR) EVT_CMD(EVT_OP_IF_LE, LVAR, RVAR),
283
285#define IfGe(LVAR, RVAR) EVT_CMD(EVT_OP_IF_GE, LVAR, RVAR),
289#define IfFlag(LVAR, RVAR) EVT_CMD(EVT_OP_IF_FLAG, LVAR, RVAR),
290
293#define IfNotFlag(LVAR, RVAR) EVT_CMD(EVT_OP_IF_NOT_FLAG, LVAR, RVAR),
296#define Else EVT_CMD(EVT_OP_ELSE),
299#define EndIf EVT_CMD(EVT_OP_END_IF),
312#define Switch(LVAR) EVT_CMD(EVT_OP_SWITCH, LVAR),
313
317#define SwitchConst(LCONST) EVT_CMD(EVT_OP_SWITCH_CONST, LCONST),
320#define CaseEq(RVAR) EVT_CMD(EVT_OP_CASE_EQ, RVAR),
323#define CaseNe(RVAR) EVT_CMD(EVT_OP_CASE_NE, RVAR),
324
326#define CaseLt(RVAR) EVT_CMD(EVT_OP_CASE_LT, RVAR),
327
329#define CaseGt(RVAR) EVT_CMD(EVT_OP_CASE_GT, RVAR),
330
332#define CaseLe(RVAR) EVT_CMD(EVT_OP_CASE_LE, RVAR),
333
335#define CaseGe(RVAR) EVT_CMD(EVT_OP_CASE_GE, RVAR),
336
338#define CaseDefault EVT_CMD(EVT_OP_CASE_DEFAULT),
342#define CaseOrEq(RVAR) EVT_CMD(EVT_OP_CASE_OR_EQ, RVAR),
343
346#define CaseAndEq(RVAR) EVT_CMD(EVT_OP_CASE_AND_EQ, RVAR),
347
350#define CaseFlag(RVAR) EVT_CMD(EVT_OP_CASE_FLAG, RVAR),
351
353#define EndCaseGroup EVT_CMD(EVT_OP_END_CASE_GROUP),
354
357#define CaseRange(MIN, MAX) EVT_CMD(EVT_OP_CASE_RANGE, MIN, MAX),
358
360#define BreakSwitch EVT_CMD(EVT_OP_BREAK_SWITCH),
361
363#define EndSwitch EVT_CMD(EVT_OP_END_SWITCH),
366#define Set(VAR, INT_VALUE) EVT_CMD(EVT_OP_SET, VAR, (Bytecode) INT_VALUE),
367
371#define SetConst(VAR, CONST) EVT_CMD(EVT_OP_SET_CONST, VAR, (Bytecode) CONST),
374#define SetF(VAR, FLOAT_VALUE) EVT_CMD(EVT_OP_SETF, VAR, FLOAT_VALUE),
375
376// Basic arithmetic operations.
377#define Add(VAR, INT_VALUE) EVT_CMD(EVT_OP_ADD, VAR, INT_VALUE),
378#define Sub(VAR, INT_VALUE) EVT_CMD(EVT_OP_SUB, VAR, INT_VALUE),
379#define Mul(VAR, INT_VALUE) EVT_CMD(EVT_OP_MUL, VAR, INT_VALUE),
380#define Div(VAR, INT_VALUE) EVT_CMD(EVT_OP_DIV, VAR, INT_VALUE),
381#define Mod(VAR, INT_VALUE) EVT_CMD(EVT_OP_MOD, VAR, INT_VALUE),
383// Basic floating-point arithmetic operations.
384#define AddF(VAR, FLOAT_VALUE) EVT_CMD(EVT_OP_ADDF, VAR, FLOAT_VALUE),
385#define SubF(VAR, FLOAT_VALUE) EVT_CMD(EVT_OP_SUBF, VAR, FLOAT_VALUE),
386#define MulF(VAR, FLOAT_VALUE) EVT_CMD(EVT_OP_MULF, VAR, FLOAT_VALUE),
387#define DivF(VAR, FLOAT_VALUE) EVT_CMD(EVT_OP_DIVF, VAR, FLOAT_VALUE),
388
390#define UseBuf(INT_PTR) EVT_CMD(EVT_OP_USE_BUF, (Bytecode) INT_PTR),
391
393#define BufRead1(VAR) EVT_CMD(EVT_OP_BUF_READ1, VAR),
396#define BufRead2(VAR1, VAR2) EVT_CMD(EVT_OP_BUF_READ2, VAR1, VAR2),
399#define BufRead3(VAR1, VAR2, VAR3) EVT_CMD(EVT_OP_BUF_READ3, VAR1, VAR2, VAR3),
402#define BufRead4(VAR1, VAR2, VAR3, VAR4) EVT_CMD(EVT_OP_BUF_READ4, VAR1, VAR2, VAR3, VAR4),
405#define BufPeek(OFFSET, VAR) EVT_CMD(EVT_OP_BUF_PEEK, OFFSET, VAR),
408#define UseFBuf(FLOAT_PTR) EVT_CMD(EVT_OP_USE_FBUF, (Bytecode) FLOAT_PTR),
411#define FBufRead1(VAR) EVT_CMD(EVT_OP_FBUF_READ1, VAR),
412
414#define FBufRead2(VAR1, VAR2) EVT_CMD(EVT_OP_FBUF_READ2, VAR1, VAR2),
415
417#define FBufRead3(VAR1, VAR2, VAR3) EVT_CMD(EVT_OP_FBUF_READ3, VAR1, VAR2, VAR3),
418
420#define FBufRead4(VAR1, VAR2, VAR3, VAR4) EVT_CMD(EVT_OP_FBUF_READ4, VAR1, VAR2, VAR3, VAR4),
423#define FBufPeek(OFFSET, VAR) EVT_CMD(EVT_OP_FBUF_PEEK, OFFSET, VAR),
424
426#define UseArray(INT_PTR) EVT_CMD(EVT_OP_USE_ARRAY, (Bytecode) INT_PTR),
427
430#define UseFlagArray(PACKED_FLAGS_PTR) EVT_CMD(EVT_OP_USE_FLAG_ARRAY, (Bytecode) PACKED_FLAGS_PTR),
434#define MallocArray(SIZE, OUT_PTR_VAR) EVT_CMD(EVT_OP_MALLOC_ARRAY, SIZE, OUT_PTR_VAR),
435
437#define BitwiseAnd(VAR, VALUE) EVT_CMD(EVT_OP_BITWISE_AND, VAR, VALUE),
438
440#define BitwiseAndConst(VAR, CONST) EVT_CMD(EVT_OP_BITWISE_AND_CONST, VAR, CONST),
441
443#define BitwiseOr(VAR, VALUE) EVT_CMD(EVT_OP_BITWISE_OR, VAR, VALUE),
446#define BitwiseOrConst(VAR, CONST) EVT_CMD(EVT_OP_BITWISE_OR_CONST, VAR, CONST),
456#define Exec(EVT_SOURCE) EVT_CMD(EVT_OP_EXEC, (Bytecode) EVT_SOURCE),
457
461#define ExecGetTID(EVT_SOURCE, OUTVAR) EVT_CMD(EVT_OP_EXEC_GET_TID, (Bytecode) EVT_SOURCE, OUTVAR),
462
476#define ExecWait(EVT_SOURCE) EVT_CMD(EVT_OP_EXEC_WAIT, (Bytecode) EVT_SOURCE),
500#define BindTrigger(EVT_SOURCE, TRIGGER, COLLIDER_ID, UNK_A3, TRIGGER_PTR_OUTVAR) \
501 EVT_CMD(EVT_OP_BIND_TRIGGER, (Bytecode) EVT_SOURCE, TRIGGER, (Bytecode) COLLIDER_ID, UNK_A3, TRIGGER_PTR_OUTVAR),
504#define BindPadlock(EVT_SOURCE, TRIGGER, COLLIDER_ID, ITEM_LIST, UNK_A3, TRIGGER_PTR_OUTVAR) \
505 EVT_CMD(EVT_OP_BIND_PADLOCK, (Bytecode) EVT_SOURCE, TRIGGER, COLLIDER_ID, (Bytecode) ITEM_LIST, UNK_A3, TRIGGER_PTR_OUTVAR),
508#define Unbind EVT_CMD(EVT_OP_UNBIND),
511#define KillThread(TID) EVT_CMD(EVT_OP_KILL_THREAD, TID),
514#define SetPriority(PRIORITY) EVT_CMD(EVT_OP_SET_PRIORITY, PRIORITY),
517#define SetTimescale(TIMESCALE) EVT_CMD(EVT_OP_SET_TIMESCALE, TIMESCALE),
520#define SetGroup(GROUP) EVT_CMD(EVT_OP_SET_GROUP, GROUP),
521
523#define SuspendGroup(GROUP) EVT_CMD(EVT_OP_SUSPEND_GROUP, GROUP),
526#define ResumeGroup(GROUP) EVT_CMD(EVT_OP_RESUME_GROUP, GROUP),
527
529#define SuspendOthers(GROUP) EVT_CMD(EVT_OP_SUSPEND_OTHERS, GROUP),
530
532#define ResumeOthers(GROUP) EVT_CMD(EVT_OP_RESUME_OTHERS, GROUP),
533
535#define SuspendThread(TID) EVT_CMD(EVT_OP_SUSPEND_THREAD, TID),
536
538#define ResumeThread(TID) EVT_CMD(EVT_OP_RESUME_THREAD, TID),
539
541#define IsThreadRunning(TID, OUTVAR) EVT_CMD(EVT_OP_IS_THREAD_RUNNING, TID, OUTVAR),
542
545#define Thread EVT_CMD(EVT_OP_THREAD),
546
548#define EndThread EVT_CMD(EVT_OP_END_THREAD),
549
561#define ChildThread EVT_CMD(EVT_OP_CHILD_THREAD),
562
564#define EndChildThread EVT_CMD(EVT_OP_END_CHILD_THREAD),
565
577#define Call(FUNC, ARGS...) EVT_CMD(EVT_OP_CALL, (Bytecode) FUNC, ##ARGS),
580#define EVT_DEBUG_LOG(STRING) EVT_CMD(EVT_OP_DEBUG_LOG, STRING),
581
583#define DebugPrintVar(VAR) EVT_CMD(EVT_OP_DEBUG_PRINT_VAR, VAR),
584
586#define BreakPoint(TEXT) EVT_CMD(EVT_OP_DEBUG_BREAKPOINT, Ref(TEXT)),
587
588/****** VECTOR OPERATIONS *********************************************************************************************/
589
590// expand vector components
591#define EVT_AS_VEC2(baseVar) (baseVar), (baseVar + 1)
592#define EVT_AS_VEC3(baseVar) (baseVar), (baseVar + 1), (baseVar + 2)
593
594// extract components from vector
595#define EVT_VEC_X(baseVar) (baseVar)
596#define EVT_VEC_Y(baseVar) (baseVar + 1)
597#define EVT_VEC_Z(baseVar) (baseVar + 2)
598
599#define EVT_VEC2_OP(OPERATION, MUT_BASE, x, y) \
600 OPERATION(MUT_BASE + 0, x) \
601 OPERATION(MUT_BASE + 1, y)
602
603#define EVT_VEC3_OP(OPERATION, MUT_BASE, x, y, z) \
604 OPERATION(MUT_BASE + 0, x) \
605 OPERATION(MUT_BASE + 1, y) \
606 OPERATION(MUT_BASE + 2, z)
607
608#define EVT_VEC2_VOP(OPERATION, MUT_BASE, AMT_BASE) \
609 OPERATION(MUT_BASE + 0, AMT_BASE + 0) \
610 OPERATION(MUT_BASE + 1, AMT_BASE + 1)
611
612#define EVT_VEC3_VOP(OPERATION, MUT_BASE, AMT_BASE) \
613 OPERATION(MUT_BASE + 0, AMT_BASE + 0) \
614 OPERATION(MUT_BASE + 1, AMT_BASE + 1) \
615 OPERATION(MUT_BASE + 2, AMT_BASE + 2)
616
617#define EVT_VEC2I_SET(baseVar, x, y) EVT_VEC2_OP(Set, baseVar, x, y)
618#define EVT_VEC2F_SET(baseVar, x, y) EVT_VEC2_OP(SetF, baseVar, x, y)
619#define EVT_VEC3I_SET(baseVar, x, y, z) EVT_VEC3_OP(Set, baseVar, x, y, z)
620#define EVT_VEC3F_SET(baseVar, x, y, z) EVT_VEC3_OP(SetF, baseVar, x, y, z)
621
622#define EVT_VEC2I_VSET(baseVar, baseSrc) EVT_VEC2_VOP(Set, baseVar, baseSrc)
623#define EVT_VEC2F_VSET(baseVar, baseSrc) EVT_VEC2_VOP(SetF, baseVar, baseSrc)
624#define EVT_VEC3I_VSET(baseVar, baseSrc) EVT_VEC3_VOP(Set, baseVar, baseSrc)
625#define EVT_VEC3F_VSET(baseVar, baseSrc) EVT_VEC3_VOP(SetF, baseVar, baseSrc)
626
627#define EVT_VEC2I_ADD(baseVar, x, y) EVT_VEC2_OP(Add, baseVar, x, y)
628#define EVT_VEC2F_ADD(baseVar, x, y) EVT_VEC2_OP(AddF, baseVar, x, y)
629#define EVT_VEC3I_ADD(baseVar, x, y, z) EVT_VEC3_OP(Add, baseVar, x, y, z)
630#define EVT_VEC3F_ADD(baseVar, x, y, z) EVT_VEC3_OP(AddF, baseVar, x, y, z)
631
632#define EVT_VEC2I_VADD(baseVar, baseAmt) EVT_VEC2_VOP(Add, baseVar, baseAmt)
633#define EVT_VEC2F_VADD(baseVar, baseAmt) EVT_VEC2_VOP(AddF, baseVar, baseAmt)
634#define EVT_VEC3I_VADD(baseVar, baseAmt) EVT_VEC3_VOP(Add, baseVar, baseAmt)
635#define EVT_VEC3F_VADD(baseVar, baseAmt) EVT_VEC3_VOP(AddF, baseVar, baseAmt)
636
637#define EVT_VEC2I_SUB(baseVar, x, y) EVT_VEC2_OP(Sub, baseVar, x, y)
638#define EVT_VEC2F_SUB(baseVar, x, y) EVT_VEC2_OP(SubF, baseVar, x, y)
639#define EVT_VEC3I_SUB(baseVar, x, y, z) EVT_VEC3_OP(Sub, baseVar, x, y, z)
640#define EVT_VEC3F_SUB(baseVar, x, y, z) EVT_VEC3_OP(SubF, baseVar, x, y, z)
641
642#define EVT_VEC2I_VSUB(baseVar, baseAmt) EVT_VEC2_VOP(Sub, baseVar, baseAmt)
643#define EVT_VEC2F_VSUB(baseVar, baseAmt) EVT_VEC2_VOP(SubF, baseVar, baseAmt)
644#define EVT_VEC3I_VSUB(baseVar, baseAmt) EVT_VEC3_VOP(Sub, baseVar, baseAmt)
645#define EVT_VEC3F_VSUB(baseVar, baseAmt) EVT_VEC3_VOP(SubF, baseVar, baseAmt)
646
647/****** COMMON SCRIPTS ************************************************************************************************/
648
649#define IfTrue(b) IfNe(b, 0)
650#define IfFalse(b) IfEq(b, 0)
651
652#define EVT_EXIT_WALK(walkDistance, exitIdx, map, entryIdx) \
653 { \
654 SetGroup(EVT_GROUP_EXIT_MAP) \
655 Call(DisablePlayerInput, TRUE) \
656 Call(UseExitHeading, walkDistance, exitIdx) \
657 Exec(ExitWalk) \
658 Call(GotoMap, Ref(map), entryIdx) \
659 Wait(100) \
660 Return \
661 End \
662 }
663
664// alternate version of EVT_EXIT_WALK used on Pleasant Path which does not join EVT_GROUP_EXIT_MAP
665#define EVT_EXIT_WALK_NOK(walkDistance, exitIdx, map, entryIdx) \
666 { \
667 Call(UseExitHeading, walkDistance, exitIdx) \
668 Exec(ExitWalk) \
669 Call(GotoMap, Ref(map), entryIdx) \
670 Wait(100) \
671 Return \
672 End \
673 }
674
675#define EVT_EXIT_SINGLE_DOOR(exitIdx, map, entryIdx, colliderID, modelID, swingDir) \
676 { \
677 SetGroup(EVT_GROUP_EXIT_MAP) \
678 Call(DisablePlayerInput, TRUE) \
679 Set(LVar0, exitIdx) \
680 Set(LVar1, colliderID) \
681 Set(LVar2, modelID) \
682 Set(LVar3, swingDir) \
683 Exec(ExitSingleDoor) \
684 Wait(17) \
685 Call(GotoMap, Ref(map), entryIdx) \
686 Wait(100) \
687 Return \
688 End \
689 }
690
691#define EVT_EXIT_SINGLE_DOOR_SET_SOUNDS(exitIdx, map, entryIdx, colliderID, modelID, swingDir, sounds) \
692 { \
693 SetGroup(EVT_GROUP_EXIT_MAP) \
694 Call(DisablePlayerInput, TRUE) \
695 Call(UseDoorSounds, sounds) \
696 Set(LVar0, exitIdx) \
697 Set(LVar1, colliderID) \
698 Set(LVar2, modelID) \
699 Set(LVar3, swingDir) \
700 Exec(ExitSingleDoor) \
701 Wait(17) \
702 Call(GotoMap, Ref(map), entryIdx) \
703 Wait(100) \
704 Return \
705 End \
706 }
707
708#define EVT_EXIT_SPLIT_SINGLE_DOOR(exitIdx, map, entryIdx, colliderID, topModelID, bottomModelID, swingDir) \
709 { \
710 SetGroup(EVT_GROUP_EXIT_MAP) \
711 Call(DisablePlayerInput, TRUE) \
712 Set(LVar0, exitIdx) \
713 Set(LVar1, colliderID) \
714 Set(LVar2, topModelID) \
715 Set(LVar4, bottomModelID) \
716 Set(LVar3, swingDir) \
717 Exec(ExitSplitSingleDoor) \
718 Wait(17) \
719 Call(GotoMap, Ref(map), entryIdx) \
720 Wait(100) \
721 Return \
722 End \
723 }
724
725#define EVT_EXIT_DOUBLE_DOOR(exitIdx, map, entryIdx, colliderID, leftDoorModelID, rightDoorModelID) \
726 { \
727 SetGroup(EVT_GROUP_EXIT_MAP) \
728 Call(DisablePlayerInput, TRUE) \
729 Set(LVar0, exitIdx) \
730 Set(LVar1, colliderID) \
731 Set(LVar2, leftDoorModelID) \
732 Set(LVar3, rightDoorModelID) \
733 Exec(ExitDoubleDoor) \
734 Wait(17) \
735 Call(GotoMap, Ref(map), entryIdx) \
736 Wait(100) \
737 Return \
738 End \
739 }
740
741#define EVT_EXIT_DOUBLE_DOOR_SET_SOUNDS(exitIdx, map, entryIdx, colliderID, leftDoorModelID, rightDoorModelID, sounds) \
742 { \
743 SetGroup(EVT_GROUP_EXIT_MAP) \
744 Call(DisablePlayerInput, TRUE) \
745 Call(UseDoorSounds, sounds) \
746 Set(LVar0, exitIdx) \
747 Set(LVar1, colliderID) \
748 Set(LVar2, leftDoorModelID) \
749 Set(LVar3, rightDoorModelID) \
750 Exec(ExitDoubleDoor) \
751 Wait(17) \
752 Call(GotoMap, Ref(map), entryIdx) \
753 Wait(100) \
754 Return \
755 End \
756 }
757
762#define EVT_SETUP_CAMERA_DEFAULT(r, g, b) \
763 Call(SetCamPerspective, CAM_DEFAULT, CAM_UPDATE_FROM_ZONE, 25, 16, 4096) \
764 Call(SetCamBGColor, CAM_DEFAULT, r, g, b) \
765 Call(SetCamEnabled, CAM_DEFAULT, TRUE)
766
771#define EVT_SETUP_CAMERA_NO_LEAD(r, g, b) \
772 Call(SetCamPerspective, CAM_DEFAULT, CAM_UPDATE_FROM_ZONE, 25, 16, 4096) \
773 Call(SetCamBGColor, CAM_DEFAULT, r, g, b) \
774 Call(SetCamLeadPlayer, CAM_DEFAULT, FALSE) \
775 Call(SetCamEnabled, CAM_DEFAULT, TRUE)
776
778#define EVT_SETUP_CAMERA_MIM() \
779 Call(SetCamPerspective, CAM_DEFAULT, CAM_UPDATE_FROM_ZONE, 25, 16, 650) \
780 Call(SetCamBGColor, CAM_DEFAULT, 0, 0, 0) \
781 Call(SetCamLeadPlayer, CAM_DEFAULT, FALSE) \
782 Call(SetCamEnabled, CAM_DEFAULT, TRUE)
783
784// allow macros with variable number of arguments
785// see https://stackoverflow.com/questions/11761703/overloading-macro-on-number-of-arguments
786// solution provided by R1tschY and edited by Gabriel Staples
787#define __NARG__(args...) \
788 __NARG_I_(args,__RSEQ_N())
789#define __NARG_I_(args...) \
790 __ARG_N(args)
791#define __ARG_N( \
792 _1, _2, _3, _4, _5, _6, _7, _8, _9,_10, \
793 _11,_12,_13,_14,_15,_16,_17,_18,_19,_20, \
794 _21,_22,_23,_24,_25,_26,_27,_28,_29,_30, \
795 _31,_32,_33,_34,_35,_36,_37,_38,_39,_40, \
796 _41,_42,_43,_44,_45,_46,_47,_48,_49,_50, \
797 _51,_52,_53,_54,_55,_56,_57,_58,_59,_60, \
798 _61,_62,_63,N,...) N
799#define __RSEQ_N() \
800 63,62,61,60, \
801 59,58,57,56,55,54,53,52,51,50, \
802 49,48,47,46,45,44,43,42,41,40, \
803 39,38,37,36,35,34,33,32,31,30, \
804 29,28,27,26,25,24,23,22,21,20, \
805 19,18,17,16,15,14,13,12,11,10, \
806 9,8,7,6,5,4,3,2,1,0
807#define _VFUNC_(name, n) name##n
808#define _VFUNC(name, n) _VFUNC_(name, n)
809#define VFUNC(func, args...) _VFUNC(func, __NARG__(args)) (args)
810
811#define PlayEffect(args...) VFUNC(PlayEffect, args)
812#define PlayEffect1(effect) \
813 Call(PlayEffect_impl, effect, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
814#define PlayEffect2(effect, subtype) \
815 Call(PlayEffect_impl, effect, subtype, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
816#define PlayEffect3(effect, subtype, a) \
817 Call(PlayEffect_impl, effect, subtype, a, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
818#define PlayEffect4(effect, subtype, a, b) \
819 Call(PlayEffect_impl, effect, subtype, a, b, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
820#define PlayEffect5(effect, subtype, a, b, c) \
821 Call(PlayEffect_impl, effect, subtype, a, b, c, 0, 0, 0, 0, 0, 0, 0, 0, 0)
822#define PlayEffect6(effect, subtype, a, b, c, d) \
823 Call(PlayEffect_impl, effect, subtype, a, b, c, d, 0, 0, 0, 0, 0, 0, 0, 0)
824#define PlayEffect7(effect, subtype, a, b, c, d, e) \
825 Call(PlayEffect_impl, effect, subtype, a, b, c, d, e, 0, 0, 0, 0, 0, 0, 0)
826#define PlayEffect8(effect, subtype, a, b, c, d, e, f) \
827 Call(PlayEffect_impl, effect, subtype, a, b, c, d, e, f, 0, 0, 0, 0, 0, 0)
828#define PlayEffect9(effect, subtype, a, b, c, d, e, f, g) \
829 Call(PlayEffect_impl, effect, subtype, a, b, c, d, e, f, g, 0, 0, 0, 0, 0)
830#define PlayEffect10(effect, subtype, a, b, c, d, e, f, g, h) \
831 Call(PlayEffect_impl, effect, subtype, a, b, c, d, e, f, g, h, 0, 0, 0, 0)
832#define PlayEffect11(effect, subtype, a, b, c, d, e, f, g, h, i) \
833 Call(PlayEffect_impl, effect, subtype, a, b, c, d, e, f, g, h, i, 0, 0, 0)
834#define PlayEffect12(effect, subtype, a, b, c, d, e, f, g, h, i, j) \
835 Call(PlayEffect_impl, effect, subtype, a, b, c, d, e, f, g, h, i, j, 0, 0)
836#define PlayEffect13(effect, subtype, a, b, c, d, e, f, g, h, i, j, k) \
837 Call(PlayEffect_impl, effect, subtype, a, b, c, d, e, f, g, h, i, j, k, 0)
838#define PlayEffect14(effect, subtype, a, b, c, d, e, f, g, h, i, j, k, l) \
839 Call(PlayEffect_impl, effect, subtype, a, b, c, d, e, f, g, h, i, j, k, l)
840
841#ifdef _LANGUAGE_C_PLUS_PLUS
842} // extern "C"
843#endif
844
845#endif