Paper Mario DX
Paper Mario (N64) modding
 
Loading...
Searching...
No Matches
magikoopa.inc.c
Go to the documentation of this file.
1#include "battle/battle.h"
2#include "script_api/battle.h"
3#include "sprite/npc/Magikoopa.h"
4#include "sprite/npc/FlyingMagikoopa.h"
5#include "effects.h"
6
7#define NAMESPACE A(magikoopa)
8
9extern s32 N(GroundAnims)[];
10extern s32 N(FlyingAnims)[];
11extern s32 N(BroomAnims)[];
12
13extern EvtScript N(EVS_Init);
14extern EvtScript N(EVS_Idle);
15extern EvtScript N(EVS_TakeTurn);
19
20enum N(ActorPartIDs) {
21 PRT_GROUND = 1,
22 PRT_FLYING = 2,
23 PRT_BROOM = 3,
24};
25
26enum N(ActorVars) {
29 AVAR_IsClone = 1,
39 AVAR_LastMove = 11,
49};
50
51enum N(ActorParams) {
53 HEAL_AMT_ONE = 5,
54 HEAL_AMT_ALL = 3,
59 MAX_HEAL_ONE = 2,
60 MAX_HEAL_ALL = 2,
63 MAX_ELECTRIFY = 3,
68 HEAL_CHANCE_1 = 75,
69 HEAL_CHANCE_2 = 80,
70 HEAL_CHANCE_3 = 100,
71 HEAL_ONE_CHANCE = 500,
72 HEAL_ALL_CHANCE = 500,
73};
74
75s32 N(DefenseTable)[] = {
78};
79
80s32 N(FlyingDefense)[] = {
83};
84
85s32 N(StatusTable)[] = {
108};
109
110s32 N(FlyingStatusTable)[] = {
116 STATUS_KEY_DIZZY, 100,
121 STATUS_KEY_STOP, 80,
133};
134
136 {
138 .index = PRT_GROUND,
139 .posOffset = { 0, 0, 0 },
140 .targetOffset = { 2, 35 },
141 .opacity = 255,
142 .idleAnimations = N(GroundAnims),
143 .defenseTable = N(DefenseTable),
144 .eventFlags = 0,
145 .elementImmunityFlags = 0,
146 .projectileTargetOffset = { -5, -12 },
147 },
148};
149
151 {
153 .index = PRT_GROUND,
154 .posOffset = { 0, 0, 0 },
155 .targetOffset = { 2, 35 },
156 .opacity = 255,
157 .idleAnimations = N(GroundAnims),
158 .defenseTable = N(FlyingDefense),
159 .eventFlags = 0,
160 .elementImmunityFlags = 0,
161 .projectileTargetOffset = { -5, -12 },
162 },
163 {
165 .index = PRT_FLYING,
166 .posOffset = { 0, 0, 0 },
167 .targetOffset = { -10, 35 },
168 .opacity = 255,
169 .idleAnimations = N(FlyingAnims),
170 .defenseTable = N(FlyingDefense),
172 .elementImmunityFlags = 0,
173 .projectileTargetOffset = { 0, -8 },
174 },
175 {
177 .index = PRT_BROOM,
178 .posOffset = { 0, 0, 0 },
179 .targetOffset = { 0, 0 },
180 .opacity = 255,
181 .idleAnimations = N(BroomAnims),
182 .defenseTable = N(FlyingDefense),
183 .eventFlags = 0,
184 .elementImmunityFlags = 0,
185 .projectileTargetOffset = { 0, 0 },
186 },
187};
188
189ActorBlueprint NAMESPACE = {
190 .flags = 0,
191 .type = ACTOR_TYPE_MAGIKOOPA,
192 .level = ACTOR_LEVEL_MAGIKOOPA,
193 .maxHP = 11,
194 .partCount = ARRAY_COUNT(N(ActorParts)),
195 .partsData = N(ActorParts),
196 .initScript = &N(EVS_Init),
197 .statusTable = N(StatusTable),
198 .escapeChance = 40,
199 .airLiftChance = 80,
200 .hurricaneChance = 70,
201 .spookChance = 40,
202 .upAndAwayChance = 95,
203 .spinSmashReq = 0,
204 .powerBounceChance = 80,
205 .coinReward = 2,
206 .size = { 36, 40 },
207 .healthBarOffset = { 0, 0 },
208 .statusIconOffset = { -10, 20 },
209 .statusTextOffset = { 10, 32 },
210};
211
213 .flags = ACTOR_FLAG_FLYING,
216 .maxHP = 11,
217 .partCount = ARRAY_COUNT(N(FlyingParts)),
218 .partsData = N(FlyingParts),
219 .initScript = &N(EVS_Flying_Init),
220 .statusTable = N(FlyingStatusTable),
221 .escapeChance = 40,
222 .airLiftChance = 85,
223 .hurricaneChance = 75,
224 .spookChance = 40,
225 .upAndAwayChance = 95,
226 .spinSmashReq = 0,
227 .powerBounceChance = 80,
228 .coinReward = 2,
229 .size = { 48, 40 },
230 .healthBarOffset = { 0, 0 },
231 .statusIconOffset = { -25, 20 },
232 .statusTextOffset = { 1, 34 },
233};
234
235s32 N(GroundAnims)[] = {
246};
247
248s32 N(FlyingAnims)[] = {
259};
260
261s32 N(BroomAnims)[] = {
264};
265
268
269EvtScript N(EVS_Idle) = {
270 Set(LVarF, 0)
271 Label(0)
274 IfEq(LVar1, 1)
275 Call(N(CosInterpMinMax), LVarF, LVar1, Float(254.0), Float(100.0), 20, 0, 0)
276 Add(LVarF, 1)
281 Else
284 EndIf
285 Else
286 Set(LVarF, 0)
290 Else
292 EndIf
293 EndIf
294 Wait(1)
295 Goto(0)
296 Return
297 End
298};
299
300#include "common/GetSelectedMoveID.inc.c"
301
307 EndIf
308 Else
318 EndIf
321 EndIf
322 Return
323 End
324};
325
328
331 IfEq(LVar0, 1)
333 Goto(0)
334 EndIf
338 Goto(0)
339 EndIf
340 Return
341 Label(0)
346 EndIf
354 Sub(LVar2, 1)
358 Set(LVar1, 0)
362 Call(N(StartRumbleWithParams), 150, 10)
363 Thread
364 Call(ShakeCam, CAM_BATTLE, 0, 5, Float(0.7))
370 Add(LVar4, 10)
371 Add(LVar5, 5)
373 EndIf
378 Loop(20)
380 Wait(1)
382 Wait(1)
383 EndLoop
390 Call(N(SetAbsoluteStatusOffsets), -10, 20, 10, 32)
394 Mod(LVar0, 4)
401 Return
402 End
403};
404
405EvtScript N(EVS_Flee) = {
414 Wait(15)
416 EndIf
419 Add(LVar0, 20)
422 Wait(10)
427 Add(LVar0, 200)
435 Return
436 End
437};
438
443 Return
444 End
445};
446
447EvtScript N(EVS_Init) = {
453 IfEq(LVar0, 0)
455 EndIf
468 Return
469 End
470};
471
477 IfEq(LVar0, 0)
479 EndIf
492 Return
493 End
494};
495
498 IfEq(LVar0, 1)
499 Return
500 EndIf
503 IfEq(LVar1, 0)
504 Return
505 EndIf
509 Label(0)
512 Wait(1)
513 Goto(0)
514 EndIf
515 EndIf
521 Else
523 EndIf
526 Thread
527 Add(LVar3, 2)
528 Loop(2)
530 Wait(2)
531 EndLoop
533 Return
534 End
535};
536
572 Return
586 Return
598 Return
599 EndIf
601 IfNe(LVar0, 0)
603 EndIf
609 Wait(10)
613 Return
625 Wait(15)
628 Return
639 Else
641 EndIf
642 EndIf
646 Return
660 Return
661 End
662};
663
711 Return
725 Return
737 Return
738 EndIf
740 IfNe(LVar0, 0)
742 EndIf
748 Wait(10)
752 Return
754 Call(SetActorPos, ACTOR_SELF, 20, 0, 0)
774 Wait(15)
777 Return
788 Else
790 EndIf
791 EndIf
795 Return
809 Return
810 End
811};
812
813// (in) LVarB: actorID to heal
824 Wait(15)
828 Else
830 EndIf
831 Wait(5)
838 Sub(LVar0, 6)
839 Add(LVar1, 12)
840 Sub(LVar2, 2)
842 Else
843 Sub(LVar0, 16)
844 Add(LVar1, 31)
845 Sub(LVar2, 2)
847 EndIf
848 Else
852 Sub(LVar0, 12)
853 Add(LVar1, 14)
854 Sub(LVar2, 2)
856 Else
857 Sub(LVar0, 30)
858 Add(LVar1, 36)
859 Sub(LVar2, 2)
861 EndIf
862 EndIf
863 Wait(30)
867 Else
869 EndIf
870 Wait(5)
871 Thread
872 Wait(5)
875 Wait(30)
878 Thread
886 Wait(10)
890 Return
891 End
892};
893
904 Wait(15)
908 Else
910 EndIf
911 Wait(5)
918 Sub(LVar0, 6)
919 Add(LVar1, 12)
920 Sub(LVar2, 2)
922 Else
923 Sub(LVar0, 16)
924 Add(LVar1, 31)
925 Sub(LVar2, 2)
927 EndIf
928 Else
932 Sub(LVar0, 12)
933 Add(LVar1, 14)
934 Sub(LVar2, 2)
936 Else
937 Sub(LVar0, 30)
938 Add(LVar1, 36)
939 Sub(LVar2, 2)
941 EndIf
942 EndIf
943 Wait(30)
947 Else
949 EndIf
950 Wait(5)
953 Label(0)
959 IfEq(LVar1, 1)
960 Set(LFlag0, TRUE)
961 EndIf
962 EndIf
964 Thread
965 Wait(5)
968 Wait(30)
971 Thread
976 EndIf
979 Goto(0)
980 EndIf
982 Wait(1)
985 Wait(10)
989 Return
990 End
991};
992
998 IfEq(LVar0, 1)
999 Set(LFlag0, TRUE)
1001 EndIf
1004 Set(LFlag1, TRUE)
1005 EndIf
1007 IfEq(LFlag0, TRUE)
1009 EndIf
1015 Else
1018 EndIf
1020 IfEq(LFlag1, FALSE)
1021 IfEq(LFlag0, TRUE)
1024 Sub(LVar0, 17)
1025 Add(LVar1, 33)
1027 EndIf
1032 Sub(LVar0, 6)
1033 Add(LVar1, 13)
1034 Else
1035 Sub(LVar0, 17)
1036 Add(LVar1, 33)
1037 EndIf
1039 Else
1040 IfEq(LFlag0, TRUE)
1043 Sub(LVar0, 30)
1044 Add(LVar1, 36)
1046 EndIf
1051 Sub(LVar0, 12)
1052 Add(LVar1, 14)
1053 Else
1054 Sub(LVar0, 30)
1055 Add(LVar1, 36)
1056 EndIf
1058 EndIf
1059 Wait(30)
1061 Switch(LVar9)
1064 IfEq(LFlag0, TRUE)
1066 EndIf
1068 IfEq(LFlag1, FALSE)
1069 IfEq(LFlag0, TRUE)
1071 EndIf
1073 Else
1074 IfEq(LFlag0, TRUE)
1076 EndIf
1078 EndIf
1079 Wait(5)
1082 Sub(LVar4, 50)
1083 Set(LVar5, 0)
1084 IfEq(LFlag1, FALSE)
1085 IfEq(LFlag0, TRUE)
1087 Sub(LVar0, 20)
1088 Add(LVar1, 20)
1090 EndIf
1094 Sub(LVar0, 8)
1095 Add(LVar1, 8)
1096 Else
1097 Sub(LVar0, 20)
1098 Add(LVar1, 20)
1099 EndIf
1101 Else
1102 IfEq(LFlag0, TRUE)
1104 Sub(LVar0, 20)
1105 Add(LVar1, 20)
1107 EndIf
1111 Sub(LVar0, 8)
1112 Add(LVar1, 8)
1113 Else
1114 Sub(LVar0, 20)
1115 Add(LVar1, 20)
1116 EndIf
1118 EndIf
1119 Wait(50)
1122 EndIf
1123 Wait(15)
1126 IfEq(LFlag0, TRUE)
1128 EndIf
1129 Return
1131 EndSwitch
1132 IfEq(LFlag0, TRUE)
1134 EndIf
1136 IfEq(LFlag1, FALSE)
1137 IfEq(LFlag0, TRUE)
1139 EndIf
1141 Else
1142 IfEq(LFlag0, TRUE)
1144 EndIf
1146 EndIf
1147 Wait(5)
1150 IfEq(LFlag1, FALSE)
1151 IfEq(LFlag0, TRUE)
1153 Sub(LVar0, 20)
1154 Add(LVar1, 20)
1156 EndIf
1160 Sub(LVar0, 8)
1161 Add(LVar1, 8)
1162 Else
1163 Sub(LVar0, 20)
1164 Add(LVar1, 20)
1165 EndIf
1167 Else
1168 IfEq(LFlag0, TRUE)
1170 Sub(LVar0, 20)
1171 Add(LVar1, 20)
1173 EndIf
1177 Sub(LVar0, 8)
1178 Add(LVar1, 8)
1179 Else
1180 Sub(LVar0, 20)
1181 Add(LVar1, 20)
1182 EndIf
1184 EndIf
1185 Wait(18)
1186 IfEq(LFlag0, TRUE)
1187 Wait(2)
1189 Else
1190 Wait(2)
1192 EndIf
1193 Switch(LVar0)
1196 Wait(20)
1199 EndSwitch
1201 IfEq(LFlag0, TRUE)
1203 EndIf
1204 Return
1205 End
1206};
1207
1211 Label(0)
1214 Mod(LVar1, 4)
1215 Switch(LVar1)
1216 CaseEq(0)
1217 Set(LFlagB, TRUE)
1218 CaseEq(1)
1219 Set(LFlagC, TRUE)
1220 CaseEq(2)
1221 Set(LFlagD, TRUE)
1222 CaseEq(3)
1223 Set(LFlagE, TRUE)
1224 EndSwitch
1227 Goto(0)
1228 EndIf
1229 Set(LVar0, -1)
1231 Mod(LVar1, 4)
1232 Switch(LVar1)
1233 CaseEq(0)
1234 IfEq(LFlagC, FALSE)
1235 Set(LVar0, 1)
1236 EndIf
1237 CaseEq(1)
1238 IfEq(LFlagB, FALSE)
1239 Set(LVar0, 0)
1240 EndIf
1241 IfEq(LFlagD, FALSE)
1242 Set(LVar0, 2)
1243 EndIf
1244 CaseEq(2)
1245 IfEq(LFlagC, FALSE)
1246 Set(LVar0, 1)
1247 EndIf
1248 IfEq(LFlagE, FALSE)
1249 Set(LVar0, 3)
1250 EndIf
1251 CaseEq(3)
1252 IfEq(LFlagD, FALSE)
1253 Set(LVar0, 2)
1254 EndIf
1255 EndSwitch
1256 IfNe(LVar0, -1)
1259 Add(LVar0, 4)
1260 EndIf
1261 EndIf
1262 Return
1263 End
1264};
1265
1267 Return
1268 End
1269};
1270
1274 Return
1275 End
1276};
1277
1281 Return
1282 End
1283};
1284
1285s32 N(CloneDefense)[] = {
1286 ELEMENT_NORMAL, 0,
1288};
1289
1290s32 N(FlyingCloneDefense)[] = {
1291 ELEMENT_NORMAL, 0,
1293};
1294
1295s32 N(CloneStatusTable)[] = {
1302 STATUS_KEY_FEAR, 0,
1306 STATUS_KEY_STOP, 0,
1317 STATUS_END,
1318};
1319
1320s32 N(FlyingCloneStatusTable)[] = {
1327 STATUS_KEY_FEAR, 0,
1331 STATUS_KEY_STOP, 0,
1342 STATUS_END,
1343};
1344
1346 {
1348 .index = PRT_GROUND,
1349 .posOffset = { 0, 0, 0 },
1350 .targetOffset = { 2, 35 },
1351 .opacity = 255,
1352 .idleAnimations = N(GroundAnims),
1353 .defenseTable = N(CloneDefense),
1354 .eventFlags = ACTOR_EVENT_FLAG_ILLUSORY,
1355 .elementImmunityFlags = 0,
1356 .projectileTargetOffset = { -5, -12 },
1357 },
1358};
1359
1361 {
1363 .index = PRT_GROUND,
1364 .posOffset = { 0, 0, 0 },
1365 .targetOffset = { -10, 35 },
1366 .opacity = 255,
1367 .idleAnimations = N(FlyingAnims),
1368 .defenseTable = N(FlyingCloneDefense),
1369 .eventFlags = ACTOR_EVENT_FLAG_ILLUSORY,
1370 .elementImmunityFlags = 0,
1371 .projectileTargetOffset = { 0, -8 },
1372 },
1373};
1374
1375ActorBlueprint N(clone) = {
1376 .flags = ACTOR_FLAG_NO_ATTACK,
1377 .type = ACTOR_TYPE_MAGICLONE,
1378 .level = ACTOR_LEVEL_MAGICLONE,
1379 .maxHP = 11,
1380 .partCount = ARRAY_COUNT(N(CloneParts)),
1381 .partsData = N(CloneParts),
1382 .initScript = &N(EVS_Clone_Init),
1383 .statusTable = N(CloneStatusTable),
1384 .escapeChance = 40,
1385 .airLiftChance = 0,
1386 .hurricaneChance = 0,
1387 .spookChance = 0,
1388 .upAndAwayChance = 0,
1389 .spinSmashReq = 0,
1390 .powerBounceChance = 75,
1391 .coinReward = 0,
1392 .size = { 36, 40 },
1393 .healthBarOffset = { 0, 0 },
1394 .statusIconOffset = { -10, 20 },
1395 .statusTextOffset = { 10, 32 },
1396};
1397
1402 .maxHP = 11,
1403 .partCount = ARRAY_COUNT(N(FlyingCloneParts)),
1404 .partsData = N(FlyingCloneParts),
1405 .initScript = &N(EVS_FlyingClone_Init),
1406 .statusTable = N(FlyingCloneStatusTable),
1407 .escapeChance = 40,
1408 .airLiftChance = 0,
1409 .hurricaneChance = 0,
1410 .spookChance = 0,
1411 .upAndAwayChance = 0,
1412 .spinSmashReq = 0,
1413 .powerBounceChance = 75,
1414 .coinReward = 2,
1415 .size = { 48, 40 },
1416 .healthBarOffset = { 0, 0 },
1417 .statusIconOffset = { -25, 20 },
1418 .statusTextOffset = { 1, 34 },
1419};
1420
1422
1424 ACTOR_BY_POS(N(clone), N(SummonPos), 0),
1425};
1426
1429};
1430
1433 IfEq(LVar0, 1)
1434 ExecWait(N(EVS_Flee))
1435 Return
1436 EndIf
1439 Set(LFlag0, FALSE)
1442 Set(LFlag0, TRUE)
1443 EndIf
1444 IfEq(LFlag0, FALSE)
1446 Else
1448 EndIf
1450 Set(LVarA, LVar0)
1459 Wait(25)
1461 IfEq(LFlag0, FALSE)
1465 Add(LVar1, 23)
1466 Else
1470 Add(LVar1, 23)
1471 EndIf
1473 Wait(10)
1476 Wait(30)
1478 Add(LVar2, -3)
1480 Set(LVar9, LVarA)
1481 Wait(15)
1487 Call(RandInt, 1000, LVar0)
1488 IfLt(LVar0, 500)
1493 Else
1498 EndIf
1508 IfEq(LFlag0, FALSE)
1510 Else
1512 EndIf
1513 IfEq(LFlag0, FALSE)
1516 Else
1519 EndIf
1522 Return
1523 End
1524};
1525
1526#include "common/battle/CheckMagikoopaCastTarget.inc.c"
1527
1529 Set(LFlag0, FALSE)
1530 Label(10)
1533 Label(0)
1537 IfGt(LVar1, LVar2)
1539 IfEq(LVar3, 0)
1542 Set(LVar8, LVar0)
1544 Goto(100)
1545 EndIf
1546 EndIf
1547 EndIf
1550 Goto(0)
1551 EndIf
1552 IfEq(LFlag0, FALSE)
1553 Set(LFlag0, TRUE)
1555 Goto(10)
1556 EndIf
1558 IfEq(LVar0, 1)
1559 ExecWait(N(EVS_Flee))
1560 Return
1561 EndIf
1563 Return
1564 // found target
1565 Label(100)
1575 Wait(15)
1579 Else
1581 EndIf
1582 Wait(5)
1589 Sub(LVar0, 6)
1590 Add(LVar1, 12)
1591 Sub(LVar2, 2)
1593 Else
1594 Sub(LVar0, 16)
1595 Add(LVar1, 31)
1596 Sub(LVar2, 2)
1598 EndIf
1599 Else
1603 Sub(LVar0, 12)
1604 Add(LVar1, 14)
1605 Sub(LVar2, 2)
1607 Else
1608 Sub(LVar0, 30)
1609 Add(LVar1, 36)
1610 Sub(LVar2, 2)
1612 EndIf
1613 EndIf
1614 Wait(30)
1618 Else
1620 EndIf
1621 Wait(5)
1622 Thread
1623 Wait(10)
1625 EndThread
1626 Thread
1630 EndThread
1633 Wait(10)
1637 Return
1638 End
1639};
1640
1642 Set(LFlag0, FALSE)
1643 Label(10)
1646 Label(0)
1650 IfGt(LVar1, LVar2)
1652 IfEq(LVar3, 0)
1655 Set(LVar8, LVar0)
1657 Goto(100)
1658 EndIf
1659 EndIf
1660 EndIf
1663 Goto(0)
1664 EndIf
1665 IfEq(LFlag0, FALSE)
1666 Set(LFlag0, TRUE)
1668 Goto(10)
1669 EndIf
1671 IfEq(LVar0, 1)
1672 ExecWait(N(EVS_Flee))
1673 Return
1674 EndIf
1676 Return
1677 // found target
1678 Label(100)
1688 Wait(15)
1692 Else
1694 EndIf
1695 Wait(5)
1702 Sub(LVar0, 6)
1703 Add(LVar1, 12)
1704 Sub(LVar2, 2)
1706 Else
1707 Sub(LVar0, 16)
1708 Add(LVar1, 31)
1709 Sub(LVar2, 2)
1711 EndIf
1712 Else
1716 Sub(LVar0, 12)
1717 Add(LVar1, 14)
1718 Sub(LVar2, 2)
1720 Else
1721 Sub(LVar0, 30)
1722 Add(LVar1, 36)
1723 Sub(LVar2, 2)
1725 EndIf
1726 EndIf
1727 Wait(30)
1731 Else
1733 EndIf
1734 Wait(5)
1735 Thread
1736 Wait(10)
1738 EndThread
1739 Thread
1743 EndThread
1746 Wait(10)
1750 Return
1751 End
1752};
1753
1755 Set(LFlag0, FALSE)
1756 Label(10)
1759 Label(0)
1763 IfGt(LVar1, LVar2)
1765 IfEq(LVar3, 0)
1768 Set(LVar8, LVar0)
1770 Goto(100)
1771 EndIf
1772 EndIf
1773 EndIf
1776 Goto(0)
1777 EndIf
1778 IfEq(LFlag0, FALSE)
1779 Set(LFlag0, TRUE)
1781 Goto(10)
1782 EndIf
1784 IfEq(LVar0, 1)
1785 ExecWait(N(EVS_Flee))
1786 Return
1787 EndIf
1789 Return
1790 // found target
1791 Label(100)
1801 Wait(15)
1805 Else
1807 EndIf
1808 Wait(5)
1815 Sub(LVar0, 6)
1816 Add(LVar1, 12)
1817 Sub(LVar2, 2)
1819 Else
1820 Sub(LVar0, 16)
1821 Add(LVar1, 31)
1822 Sub(LVar2, 2)
1824 EndIf
1825 Else
1829 Sub(LVar0, 12)
1830 Add(LVar1, 14)
1831 Sub(LVar2, 2)
1833 Else
1834 Sub(LVar0, 30)
1835 Add(LVar1, 36)
1836 Sub(LVar2, 2)
1838 EndIf
1839 EndIf
1840 Wait(30)
1844 Else
1846 EndIf
1847 Wait(5)
1848 Thread
1849 Wait(10)
1850 Loop(4)
1852 Call(RandInt, 3, LVar0)
1853 Add(LVar0, 3)
1854 Wait(LVar0)
1855 EndLoop
1856 EndThread
1857 Thread
1861 EndThread
1864 Wait(10)
1868 Return
1869 End
1870};
1871
1873 Set(LFlag0, FALSE)
1874 Label(10)
1877 Label(0)
1881 IfGt(LVar1, LVar2)
1883 IfEq(LVar3, 0)
1886 Set(LVar8, LVar0)
1888 Goto(100)
1889 EndIf
1890 EndIf
1891 EndIf
1894 Goto(0)
1895 EndIf
1896 IfEq(LFlag0, FALSE)
1897 Set(LFlag0, TRUE)
1899 Goto(10)
1900 EndIf
1902 IfEq(LVar0, 1)
1903 ExecWait(N(EVS_Flee))
1904 Return
1905 EndIf
1907 Return
1908 // found target
1909 Label(100)
1919 Wait(15)
1923 Else
1925 EndIf
1926 Wait(5)
1933 Sub(LVar0, 6)
1934 Add(LVar1, 12)
1935 Sub(LVar2, 2)
1937 Else
1938 Sub(LVar0, 16)
1939 Add(LVar1, 31)
1940 Sub(LVar2, 2)
1942 EndIf
1943 Else
1947 Sub(LVar0, 12)
1948 Add(LVar1, 14)
1949 Sub(LVar2, 2)
1951 Else
1952 Sub(LVar0, 30)
1953 Add(LVar1, 36)
1954 Sub(LVar2, 2)
1956 EndIf
1957 EndIf
1958 Wait(30)
1962 Else
1964 EndIf
1965 Wait(5)
1966 Thread
1967 Wait(10)
1969 EndThread
1970 Thread
1974 EndThread
1977 Wait(10)
1981 Return
1982 End
1983};
1984
1986 #define LBL_LOOP_COUNT_INJURED_1 0
1987 #define LBL_LOOP_COUNT_INJURED_2 1
1988 #define LBL_LOOP_COUNT_INJURED_3 2
1989 #define LBL_TRY_HEALING 10
1990 #define LBL_LOOP_CHOOSE_BEST_HEAL 11
1991 #define LBL_TRY_MOVES 20
1992 #define LBL_CHOOSE_MOVE 123
1996 Return
1997 EndIf
1999 IfEq(LVar0, 1)
2001 EndIf
2002 // first heal check: count ~75% of actors with less than 25% HP
2003 Set(LVarA, 0)
2007 Set(LFlag0, FALSE)
2012 IfEq(LVar1, 1)
2013 Set(LFlag0, TRUE)
2014 EndIf
2015 EndIf
2018 MulF(LVar2, Float(100.0))
2019 DivF(LVar2, LVar3)
2020 IfEq(LFlag0, FALSE) // collapsed dry bones check
2021 IfLe(LVar2, HEAL_THRESHOLD_1) // HP% check
2022 Call(RandInt, 99, LVar4)
2023 Add(LVar4, 1)
2024 IfLt(LVar4, HEAL_CHANCE_1) // chance to ignore actor
2025 Add(LVarA, 1)
2026 Set(LVarB, LVar0)
2027 EndIf
2028 EndIf
2029 EndIf
2033 EndIf
2034 IfGt(LVarA, 0)
2036 EndIf
2037 // second heal check: count ~80% of actors with less than 20% HP
2038 Set(LVarA, 0)
2042 Set(LFlag0, FALSE)
2047 IfEq(LVar1, 1)
2048 Set(LFlag0, TRUE)
2049 EndIf
2050 EndIf
2053 MulF(LVar2, Float(100.0))
2054 DivF(LVar2, LVar3)
2055 IfEq(LFlag0, FALSE) // collapsed dry bones check
2056 IfLe(LVar2, HEAL_THRESHOLD_2) // HP% check
2057 Call(RandInt, 99, LVar4)
2058 Add(LVar4, 1)
2059 IfLt(LVar4, HEAL_CHANCE_2) // chance to ignore actor
2060 Add(LVarA, 1)
2061 Set(LVarB, LVar0)
2062 EndIf
2063 EndIf
2064 EndIf
2068 EndIf
2069 IfGt(LVarA, 0)
2071 EndIf
2072 // third heal check: count ~99% of actors with less than 15% HP
2073 Set(LVarA, 0)
2077 Set(LFlag0, FALSE)
2082 IfEq(LVar1, 1)
2083 Set(LFlag0, TRUE)
2084 EndIf
2085 EndIf
2088 MulF(LVar2, Float(100.0))
2089 DivF(LVar2, LVar3)
2090 IfEq(LFlag0, FALSE) // collapsed dry bones check
2091 IfLe(LVar2, HEAL_THRESHOLD_3) // HP% check
2092 Call(RandInt, 99, LVar4)
2093 Add(LVar4, 1)
2094 IfLt(LVar4, HEAL_CHANCE_3) // chance to ignore actor
2095 Add(LVarA, 1)
2096 Set(LVarB, LVar0)
2097 EndIf
2098 EndIf
2099 EndIf
2103 EndIf
2104 IfGt(LVarA, 0)
2106 EndIf
2108 // try healing spells
2111 IfEq(LVar0, 1)
2112 ExecWait(N(EVS_Flee))
2113 Return
2114 EndIf
2115 // single healing target available
2116 IfEq(LVarA, 1)
2119 Call(RandInt, 1000, LVar0)
2122 Return
2123 EndIf
2124 Else
2127 Call(RandInt, 1000, LVar0)
2130 Return
2131 EndIf
2132 EndIf
2133 EndIf
2134 Else
2135 // multiple injured actors were found
2138 Call(RandInt, 1000, LVar0)
2141 Return
2142 EndIf
2143 Else
2144 // choose actor with least HP%
2147 SetF(LVar9, Float(100.0))
2151 Set(LFlag0, FALSE)
2156 IfEq(LVar1, 1)
2157 Set(LFlag0, TRUE)
2158 EndIf
2159 EndIf
2162 MulF(LVar2, Float(100.0))
2163 DivF(LVar2, LVar3)
2164 IfEq(LFlag0, FALSE)
2165 IfLe(LVar2, LVar9)
2166 SetF(LVar9, LVar2)
2167 Set(LVarB, LVar0)
2168 EndIf
2169 EndIf
2173 EndIf
2174 Call(RandInt, 1000, LVar0)
2177 Return
2178 EndIf
2179 EndIf
2180 EndIf
2181 EndIf
2182 // check various buffs and attacks
2184 Set(LVarA, 10)
2185 Set(LVarB, 10)
2186 Set(LVarC, 10)
2187 Set(LVarD, 10)
2188 Set(LVarE, 10)
2189 Set(LVarF, 10)
2191 IfEq(LVar0, 1)
2192 Set(LVarA, 100) // only magic blast
2193 Set(LVarB, 0)
2194 Set(LVarC, 0)
2195 Set(LVarD, 0)
2196 Set(LVarE, 0)
2197 Set(LVarF, 0)
2199 Else
2201 IfEq(LVar0, -1)
2202 Set(LVarB, 0)
2203 EndIf
2204 EndIf
2206 IfNe(LVar0, 0)
2207 Set(LVarB, 0)
2208 EndIf
2210 Switch(LVar0)
2214 Call(RandInt, 99, LVar0)
2215 Add(LVar0, 1)
2216 IfLe(LVar0, 50)
2217 Set(LVarA, 0)
2218 Set(LVarB, 0)
2219 Set(LVarC, 100) // only boost attack
2220 Set(LVarD, 0)
2221 Set(LVarE, 0)
2222 Set(LVarF, 0)
2223 EndIf
2224 EndIf
2228 Call(RandInt, 99, LVar0)
2229 Add(LVar0, 1)
2230 IfLe(LVar0, 50)
2231 Set(LVarA, 0)
2232 Set(LVarB, 0)
2233 Set(LVarC, 0)
2234 Set(LVarD, 100) // only boost defense
2235 Set(LVarE, 0)
2236 Set(LVarF, 0)
2237 EndIf
2238 EndIf
2239 EndSwitch
2240 // set weights to zero for anything we cant cast anymore
2243 Set(LVarC, 0)
2244 EndIf
2247 Set(LVarD, 0)
2248 EndIf
2251 Set(LVarE, 0)
2252 EndIf
2255 Set(LVarF, 0)
2256 EndIf
2257 // make a weighted choice
2259 Set(LVar9, 0)
2260 Add(LVar9, LVarA)
2261 Add(LVar9, LVarB)
2262 Add(LVar9, LVarC)
2263 Add(LVar9, LVarD)
2264 Add(LVar9, LVarE)
2265 Add(LVar9, LVarF)
2266 Sub(LVar9, 1)
2268 Add(LVar0, 1)
2269 IfLe(LVar0, LVarA)
2271 Return
2272 EndIf
2273 Add(LVarA, LVarB)
2274 IfLe(LVar0, LVarA)
2276 Return
2277 EndIf
2278 Add(LVarA, LVarC)
2279 IfLe(LVar0, LVarA)
2281 Return
2282 EndIf
2283 Add(LVarA, LVarD)
2284 IfLe(LVar0, LVarA)
2286 Return
2287 EndIf
2288 Add(LVarA, LVarE)
2289 IfLe(LVar0, LVarA)
2291 Return
2292 EndIf
2294 Return
2295 End
2296};
BSS s32 PopupMenu_SelectedIndex
Bytecode EvtScript[]
#define STATUS_FLAGS_IMMOBILIZED
Definition enums.h:2834
@ BS_FLAGS1_PARTNER_ACTING
Definition enums.h:3587
@ BS_FLAGS1_SUPER_HIT
Definition enums.h:3578
@ BS_FLAGS1_NICE_HIT
Definition enums.h:3575
@ BS_FLAGS1_TRIGGER_EVENTS
Definition enums.h:3574
@ BS_FLAGS1_INCLUDE_POWER_UPS
Definition enums.h:3570
@ BS_FLAGS1_EXECUTING_MOVE
Definition enums.h:3577
@ ELEMENT_END
Definition enums.h:2114
@ ELEMENT_NORMAL
Definition enums.h:2115
@ ITER_NO_MORE
Definition enums.h:2030
@ ITER_NEXT
Definition enums.h:2025
@ ACTOR_EVENT_FLAG_RIDING_BROOMSTICK
Actor is on Magikoopa Broomstick, effect seems to be redundant.
Definition enums.h:3390
@ ACTOR_EVENT_FLAG_ATTACK_CHARGED
Actor has charged an attack that can be removed with Star Beam.
Definition enums.h:3389
@ ACTOR_EVENT_FLAG_ILLUSORY
Player attacks pass through and miss.
Definition enums.h:3374
@ PHASE_FIRST_STRIKE
Definition enums.h:2059
@ STATUS_KEY_PARALYZE
Definition enums.h:2201
@ STATUS_TURN_MOD_DEFAULT
Definition enums.h:2227
@ STATUS_TURN_MOD_PARALYZE
Definition enums.h:2234
@ STATUS_KEY_FROZEN
Definition enums.h:2203
@ STATUS_TURN_MOD_SLEEP
Definition enums.h:2228
@ STATUS_TURN_MOD_DIZZY
Definition enums.h:2232
@ STATUS_KEY_STATIC
Definition enums.h:2207
@ STATUS_END
Definition enums.h:2196
@ STATUS_TURN_MOD_POISON
Definition enums.h:2233
@ STATUS_KEY_FEAR
Definition enums.h:2199
@ STATUS_TURN_MOD_STOP
Definition enums.h:2237
@ STATUS_KEY_SLEEP
Definition enums.h:2202
@ STATUS_KEY_STONE
Definition enums.h:2208
@ STATUS_KEY_STOP
Definition enums.h:2204
@ STATUS_TURN_MOD_FROZEN
Definition enums.h:2230
@ STATUS_KEY_SHRINK
Definition enums.h:2206
@ STATUS_KEY_DIZZY
Definition enums.h:2200
@ STATUS_KEY_POISON
Definition enums.h:2205
@ STATUS_TURN_MOD_STATIC
Definition enums.h:2229
@ STATUS_TURN_MOD_FEAR
Definition enums.h:2231
@ STATUS_KEY_NORMAL
Definition enums.h:2197
@ STATUS_TURN_MOD_SHRINK
Definition enums.h:2235
@ STATUS_KEY_DEFAULT
Definition enums.h:2198
@ HIT_RESULT_NO_DAMAGE
Definition enums.h:1952
@ HIT_RESULT_HIT
Definition enums.h:1950
@ HIT_RESULT_LUCKY
Definition enums.h:1955
@ HIT_RESULT_MISS
Definition enums.h:1956
@ BTL_CAM_DEFAULT
Definition enums.h:4823
@ BTL_CAM_INTERRUPT
Definition enums.h:4822
@ BTL_CAM_ACTOR
Definition enums.h:4835
@ TARGET_FLAG_PRIMARY_ONLY
Definition enums.h:1863
@ TARGET_FLAG_2
Definition enums.h:1850
@ EASING_LINEAR
Definition enums.h:510
@ IDLE_SCRIPT_ENABLE
Definition enums.h:6407
@ IDLE_SCRIPT_DISABLE
Definition enums.h:6406
@ STATUS_FLAG_STATIC
Definition enums.h:2813
@ STATUS_FLAG_SHRINK
Definition enums.h:2819
@ STATUS_FLAG_TRANSPARENT
Definition enums.h:2825
@ SOUND_SPELL_CAST4
Definition enums.h:1501
@ SOUND_STAR_BOUNCE_A
Definition enums.h:975
@ SOUND_SPELL_CAST1
Definition enums.h:1498
@ SOUND_SPELL_CAST2
Definition enums.h:1499
@ SOUND_RECOVER_HEART
Definition enums.h:1406
@ SOUND_MAGIKOOPA_ELECTRIFY
Definition enums.h:1074
@ SOUND_MAGIKOOPA_VANISH
Definition enums.h:1053
@ SOUND_SPELL_CAST3
Definition enums.h:1500
@ SOUND_HEART_BOUNCE
Definition enums.h:925
@ SOUND_FALL_QUICK
Definition enums.h:1090
@ SOUND_MAGIKOOPA_POWER_UP
Definition enums.h:1055
@ SOUND_ELECTRIC_BUZZ
Definition enums.h:1278
@ ACTOR_PLAYER
Definition enums.h:2085
@ ACTOR_SELF
Definition enums.h:2084
@ ACTOR_FLAG_FLYING
Quake Hammer can't hit.
Definition enums.h:3329
@ ACTOR_FLAG_TYPE_CHANGED
Indicates actors type has changed, triggers recheck for if HP bar should be shown based on tattle sta...
Definition enums.h:3332
@ ACTOR_FLAG_NO_ATTACK
Skip attack turn.
Definition enums.h:3339
@ ACTOR_BLUR_ENABLE
Definition enums.h:6413
@ EVENT_HIT
Definition enums.h:2132
@ EVENT_UP_AND_AWAY
Definition enums.h:2176
@ EVENT_SCARE_AWAY
Definition enums.h:2174
@ EVENT_BURN_HIT
Definition enums.h:2136
@ EVENT_BEGIN_FIRST_STRIKE
Definition enums.h:2173
@ EVENT_STAR_BEAM
Definition enums.h:2140
@ EVENT_END_FIRST_STRIKE
Definition enums.h:2171
@ EVENT_IMMUNE
Definition enums.h:2146
@ EVENT_FALL_TRIGGER
Definition enums.h:2134
@ EVENT_BURN_DEATH
Definition enums.h:2157
@ EVENT_ZERO_DAMAGE
Definition enums.h:2144
@ EVENT_SPIN_SMASH_HIT
Definition enums.h:2133
@ EVENT_SPIN_SMASH_DEATH
Definition enums.h:2154
@ EVENT_HIT_COMBO
Definition enums.h:2131
@ EVENT_15
Definition enums.h:2137
@ EVENT_AIR_LIFT_FAILED
Definition enums.h:2152
@ EVENT_BEGIN_AIR_LIFT
Definition enums.h:2175
@ EVENT_DEATH
Definition enums.h:2153
@ EVENT_RECOVER_STATUS
Definition enums.h:2167
@ EVENT_BLOW_AWAY
Definition enums.h:2143
@ ACTOR_PART_FLAG_PRIMARY_TARGET
Definition enums.h:3362
@ ACTOR_PART_FLAG_USE_ABSOLUTE_POSITION
Definition enums.h:3361
@ ACTOR_PART_FLAG_NO_TARGET
Cannot be targeted.
Definition enums.h:3360
@ ACTOR_PART_FLAG_INVISIBLE
Definition enums.h:3350
@ CAM_BATTLE
Definition enums.h:1801
@ DAMAGE_TYPE_POW
Definition enums.h:2861
@ DAMAGE_TYPE_MAGIC
Definition enums.h:2855
@ DAMAGE_TYPE_TRIGGER_LUCKY
Definition enums.h:2881
@ DAMAGE_TYPE_NO_CONTACT
Definition enums.h:2878
@ DAMAGE_TYPE_MULTIPLE_POPUPS
Definition enums.h:2879
EvtScript EVS_Enemy_Hit
EvtScript EVS_Enemy_Death
EvtScript EVS_Enemy_SpinSmashHit
EvtScript EVS_Enemy_AirLift
EvtScript EVS_ForceNextTarget
EvtScript EVS_Enemy_BlowAway
EvtScript EVS_Enemy_Recover
EvtScript EVS_Enemy_BurnHit
EvtScript EVS_Enemy_NoDamageHit
#define LBL_CHOOSE_MOVE
#define LBL_TRY_HEALING
#define LBL_TRY_MOVES
#define LBL_LOOP_COUNT_INJURED_1
#define LBL_LOOP_CHOOSE_BEST_HEAL
#define LBL_LOOP_COUNT_INJURED_2
#define LBL_LOOP_COUNT_INJURED_3
ApiStatus RandInt(Evt *script, b32 isInitialCall)
ApiStatus ShakeCam(Evt *script, b32 isInitialCall)
#define Else
Marks the end of an if statement and the start of the else block.
Definition macros.h:295
#define Switch(LVAR)
Marks the start of a switch statement.
Definition macros.h:311
#define LVar6
Definition macros.h:154
#define LFlagE
Definition macros.h:181
#define Ref(sym)
Address/pointer constant.
Definition macros.h:60
#define DivF(VAR, FLOAT_VALUE)
Definition macros.h:386
#define IfGe(LVAR, RVAR)
Marks the beginning of an if statement that only executes if LVAR >= RVAR.
Definition macros.h:284
#define Set(VAR, INT_VALUE)
Sets the given variable to a given value casted to an integer.
Definition macros.h:365
#define CaseEq(RVAR)
Marks the start of a switch case that executes only if LVAR == RVAR. It also marks the end of any pre...
Definition macros.h:319
#define Sub(VAR, INT_VALUE)
Definition macros.h:377
#define LVarF
Definition macros.h:163
#define IfNe(LVAR, RVAR)
Marks the beginning of an if statement that only executes if LVAR != RVAR.
Definition macros.h:272
#define End
Signals the end of EVT script data. A script missing this will likely crash on load.
Definition macros.h:213
#define Mod(VAR, INT_VALUE)
Definition macros.h:380
#define Add(VAR, INT_VALUE)
Definition macros.h:376
#define EndLoop
Marks the end of a loop.
Definition macros.h:248
#define EndCaseGroup
Marks the end of a switch case group (CaseOrEq and/or CaseAndEq), stopping fallthrough.
Definition macros.h:352
#define Goto(LABEL_ID)
Moves execution to the given label.
Definition macros.h:232
#define LVarC
Definition macros.h:160
#define ARRAY_COUNT(arr)
Definition macros.h:40
#define IfGt(LVAR, RVAR)
Marks the beginning of an if statement that only executes if LVAR <= RVAR.
Definition macros.h:278
#define IfLt(LVAR, RVAR)
Marks the beginning of an if statement that only executes if LVAR < RVAR.
Definition macros.h:275
#define Float(DOUBLE)
Definition macros.h:51
#define LFlag1
Definition macros.h:168
#define Label(LABEL_ID)
Marks this point in the script as a Goto target.
Definition macros.h:227
#define CaseOrEq(RVAR)
Marks the start of a switch case that executes only if LVAR == RVAR.
Definition macros.h:341
#define EndIf
Marks the end of an if statement or an else block.
Definition macros.h:298
#define LFlagD
Definition macros.h:180
#define LVar5
Definition macros.h:153
#define CaseDefault
Marks the start of a switch case that executes unconditionally. It also marks the end of any previous...
Definition macros.h:337
#define LVarB
Definition macros.h:159
#define ExecWait(EVT_SOURCE)
Launches a new child thread.
Definition macros.h:475
#define IfLe(LVAR, RVAR)
Marks the beginning of an if statement that only executes if LVAR > RVAR.
Definition macros.h:281
#define Thread
Marks the start of a thread block.
Definition macros.h:544
#define EndThread
Marks the end of a thread block.
Definition macros.h:547
#define SetF(VAR, FLOAT_VALUE)
Sets the given variable to a given value, but supports Floats.
Definition macros.h:373
#define IfFlag(LVAR, RVAR)
Marks the beginning of an if statement that only executes if the RVAR flag is set on LVAR,...
Definition macros.h:288
#define BitwiseAndConst(VAR, CONST)
VAR &= CONST, but CONST is treated as-is rather than dereferenced with evt_get_variable.
Definition macros.h:439
#define LVar8
Definition macros.h:156
#define LVar2
Definition macros.h:150
#define MulF(VAR, FLOAT_VALUE)
Definition macros.h:385
#define LVar1
Definition macros.h:149
#define LFlag0
Definition macros.h:167
#define LVarA
Definition macros.h:158
#define IfNotFlag(LVAR, RVAR)
Marks the beginning of an if statement that only executes if the RVAR flag is unset on LVAR,...
Definition macros.h:292
#define LVarD
Definition macros.h:161
#define Wait(NUM_FRAMES)
Blocks for the given number of frames.
Definition macros.h:254
#define LVar9
Definition macros.h:157
#define NPC_DISPOSE_LOCATION
Definition macros.h:162
#define LFlagB
Definition macros.h:178
#define PlayEffect(args...)
Definition macros.h:807
#define LFlagC
Definition macros.h:179
#define EndSwitch
Marks the end of a switch statement and any case.
Definition macros.h:362
#define IfEq(LVAR, RVAR)
Marks the beginning of an if statement that only executes if LVAR == RVAR.
Definition macros.h:269
#define Call(FUNC, ARGS...)
Calls a given C EVT API function with any number of arguments.
Definition macros.h:576
#define Loop(TIMES)
Marks the beginning of a loop.
Definition macros.h:245
#define BitwiseOrConst(VAR, CONST)
VAR |= CONST, but CONST is treated as-is rather than dereferenced with evt_get_variable.
Definition macros.h:445
#define LVar4
Definition macros.h:152
#define LVar3
Definition macros.h:151
#define LVarE
Definition macros.h:162
#define LVar0
Definition macros.h:148
#define SetConst(VAR, CONST)
Sets the given variable to a given value, skipping the evt_get_variable call.
Definition macros.h:370
#define Return
Kills the current EVT thread.
Definition macros.h:217
#define ACTOR_BY_POS(_name, _pos, _priority, args...)
Definition battle.h:230
@ AVAR_DryBones_Collapsed
Definition battle.h:100
@ BTL_VAR_Magikoopa_LastIndexBoosted
Definition battle.h:90
FormationRow Formation[]
Definition battle.h:167