summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/battle/anim/glow.c2
-rw-r--r--src/battle/anim/love_bg.c6
-rw-r--r--src/battle/anim/scary_face.c10
-rw-r--r--src/battle/battle_controller_player.c4
-rw-r--r--src/contest.c259
-rw-r--r--src/contest_ai.c13
-rw-r--r--src/contest_effect.c1163
-rw-r--r--src/data/contest_moves.h532
8 files changed, 1838 insertions, 151 deletions
diff --git a/src/battle/anim/glow.c b/src/battle/anim/glow.c
index 63466c0ff..174655080 100644
--- a/src/battle/anim/glow.c
+++ b/src/battle/anim/glow.c
@@ -13,7 +13,7 @@ extern u8 gAnimBankTarget;
extern u16 gUnknown_083D7A5C[5];
-extern struct INCBIN_U8 gBattleAnimSpritePalette_206;
+extern const u8 gBattleAnimSpritePalette_206[];
// glow (a whitening effect where the Pokemon glows white in a cycle.)
// Used in Heal Bell.
diff --git a/src/battle/anim/love_bg.c b/src/battle/anim/love_bg.c
index c3828c681..72d9325f2 100644
--- a/src/battle/anim/love_bg.c
+++ b/src/battle/anim/love_bg.c
@@ -10,9 +10,9 @@ extern s16 gBattleAnimArgs[];
extern u8 gAnimBankAttacker;
extern u8 gAnimBankTarget;
-extern struct INCBIN_U8 gAttractTilemap;
-extern struct INCBIN_U8 gAttractGfx;
-extern struct INCBIN_U8 gAttractPal;
+extern const u8 gAttractTilemap[];
+extern const u8 gAttractGfx[];
+extern const u8 gAttractPal[];
extern u16 gBattle_BG1_Y;
extern u16 gBattle_BG1_X;
diff --git a/src/battle/anim/scary_face.c b/src/battle/anim/scary_face.c
index 8d51521ee..8bc7bbd07 100644
--- a/src/battle/anim/scary_face.c
+++ b/src/battle/anim/scary_face.c
@@ -10,11 +10,11 @@ extern s16 gBattleAnimArgs[];
extern u8 gAnimBankAttacker;
extern u8 gAnimBankTarget;
-extern struct INCBIN_U8 gBattleAnimBackgroundTilemap_ScaryFaceContest;
-extern struct INCBIN_U8 gBattleAnimBackgroundTilemap_ScaryFacePlayer;
-extern struct INCBIN_U8 gBattleAnimBackgroundTilemap_ScaryFaceOpponent;
-extern struct INCBIN_U8 gBattleAnimBackgroundImage_ScaryFace;
-extern struct INCBIN_U8 gBattleAnimBackgroundPalette_ScaryFace;
+extern const u8 gBattleAnimBackgroundTilemap_ScaryFaceContest[];
+extern const u8 gBattleAnimBackgroundTilemap_ScaryFacePlayer[];
+extern const u8 gBattleAnimBackgroundTilemap_ScaryFaceOpponent[];
+extern const u8 gBattleAnimBackgroundImage_ScaryFace[];
+extern const u8 gBattleAnimBackgroundPalette_ScaryFace[];
extern u16 gBattle_BG1_Y;
extern u16 gBattle_BG1_X;
diff --git a/src/battle/battle_controller_player.c b/src/battle/battle_controller_player.c
index 3e259a21b..f9190eb39 100644
--- a/src/battle/battle_controller_player.c
+++ b/src/battle/battle_controller_player.c
@@ -614,7 +614,7 @@ struct ChooseMoveStruct
u8 pp[4];
u8 unkC[0x12-0xC];
u8 unk12;
- u8 unk13;
+ u8 effectStringId;
u8 filler14[0x20-0x14];
};
@@ -637,7 +637,7 @@ void sub_802C68C(void)
PlaySE(SE_SELECT);
if (r6->moves[gMoveSelectionCursor[gActiveBank]] == MOVE_CURSE)
- r4 = (r6->unk12 != TYPE_GHOST && (r6->unk13 ^ 7)) ? 0x10 : 0;
+ r4 = (r6->unk12 != TYPE_GHOST && (r6->effectStringId ^ 7)) ? 0x10 : 0;
else
r4 = gBattleMoves[r6->moves[gMoveSelectionCursor[gActiveBank]]].target;
diff --git a/src/contest.c b/src/contest.c
index 84e5d807b..2d953241a 100644
--- a/src/contest.c
+++ b/src/contest.c
@@ -8,6 +8,7 @@
#include "battle_anim.h"
#include "blend_palette.h"
#include "contest.h"
+#include "contest_effect.h"
#include "contest_link_80C857C.h"
#include "data2.h"
#include "decompress.h"
@@ -35,7 +36,6 @@
extern u8 gUnknown_020297ED;
-extern u8 AreMovesContestCombo(u16, u16); // I don't think this is a bool
extern void sub_80C8A38(u8);
extern void sub_80C8AD0(u8);
extern void sub_80C8C80(u8);
@@ -61,7 +61,6 @@ extern u16 gBattle_BG0_Y;
extern u16 gBattle_BG0_X;
extern u16 gBattle_BG1_X;
extern u16 gBattle_WIN0H;
-extern u32 gContestRngValue; // saved RNG value
extern struct SpriteTemplate gUnknown_02024E8C;
@@ -188,7 +187,6 @@ void sub_80AE6E4(u8, u8);
u8 CreateJudgeSprite(void);
u8 sub_80AE8B4(void);
u8 sub_80AE9FC(u16, u32, u32);
-bool8 IsSpeciesNotUnown(u16);
void sub_80AEB30(void);
void sub_80AEBEC(u16);
void sub_80AED58(void);
@@ -201,7 +199,6 @@ void sub_80AF1B8(void);
void sub_80AF2A0(u8);
void sub_80AF2FC(void);
void sub_80AF3C0(void);
-bool8 Contest_IsMonsTurnDisabled(u8);
s16 sub_80AF688(u8);
void DetermineFinalStandings(void);
bool8 sub_80AF828(s32, s32, struct UnknownContestStruct6 *);
@@ -248,7 +245,6 @@ void sub_80B146C(u8, u8);
void sub_80B159C(void);
void sub_80B1710(u8);
void sub_80B1928(void);
-s8 Contest_GetMoveExcitement(u16);
u8 sub_80B1A2C(void);
void c3_08130B10(u8);
void sub_80B1B14(void);
@@ -264,7 +260,6 @@ void sub_80B1F4C(u8);
void sub_80B1FD0(bool8);
const u8 *GetTurnOrderNumberGfx(u8);
void sub_80B20C4(void);
-bool8 sub_80B214C(u8);
void sub_80B2184(void);
void sub_80B2280(void);
void sub_80B237C(u8);
@@ -390,8 +385,8 @@ void ClearContestVars(void)
for (i = 0; i < 4; i++)
{
sContestantStatus[i].unkB_0 = 0;
- sContestantStatus[i].unk13 = 0xFF;
- sContestantStatus[i].unk14 = 0xFF;
+ sContestantStatus[i].effectStringId = CONTEST_STRING_NONE;
+ sContestantStatus[i].effectStringId2 = CONTEST_STRING_NONE;
}
memset(&shared192D0, 0, sizeof(shared192D0));
@@ -402,7 +397,7 @@ void ClearContestVars(void)
sub_80B0F28(0);
for (i = 0; i < 4; i++)
{
- sContestantStatus[i].unk19 = 0xFF;
+ sContestantStatus[i].nextTurnOrder = 0xFF;
sContest.unk19218[i] = gUnknown_02038696[i];
}
sub_80B159C();
@@ -710,13 +705,13 @@ void sub_80ABCDC(u8 taskId)
if (sContestantStatus[gContestPlayerMonIndex].prevMove != MOVE_NONE
&& sub_80B214C(gContestPlayerMonIndex)
&& AreMovesContestCombo(sContestantStatus[gContestPlayerMonIndex].prevMove, move) != 0
- && sContestantStatus[gContestPlayerMonIndex].unk15_4)
+ && sContestantStatus[gContestPlayerMonIndex].hasJudgesAttention)
{
r5 = StringCopy(sp8, gUnknownText_UnknownFormatting2);
}
else if (move != 0
&& sContestantStatus[gContestPlayerMonIndex].prevMove == move
- && gContestMoves[move].effect != CONTEST_EFFECT_REPEATABLE)
+ && gContestMoves[move].effect != CONTEST_EFFECT_REPETITION_NOT_BORING)
{
// Gray the text because it is a repeated move
r5 = StringCopy(sp8, gUnknownText_UnknownFormatting3);
@@ -1091,7 +1086,7 @@ void sub_80AC2CC(u8 taskId)
{
case 0:
sub_80B0D7C();
- for (i = 0; sContest.unk19214 != shared192D0.unk0[i]; i++)
+ for (i = 0; sContest.unk19214 != shared192D0.turnOrder[i]; i++)
;
sContest.unk19215 = i;
r7 = sContest.unk19215;
@@ -1118,8 +1113,8 @@ void sub_80AC2CC(u8 taskId)
gTasks[taskId].data[0] = 2;
return;
case 2:
- if (sContestantStatus[r7].unkC_1 != 0
- || sContestantStatus[r7].unkB_7)
+ if (sContestantStatus[r7].numTurnsSkipped != 0
+ || sContestantStatus[r7].noMoreTurns)
{
gTasks[taskId].data[0] = 31;
}
@@ -1156,7 +1151,7 @@ void sub_80AC2CC(u8 taskId)
}
return;
case 5:
- if (sContestantStatus[r7].unkC_0)
+ if (sContestantStatus[r7].nervous)
{
gTasks[taskId].data[0] = 33;
}
@@ -1203,7 +1198,7 @@ void sub_80AC2CC(u8 taskId)
}
else
{
- if (!sContestantStatus[r7].unk15_4)
+ if (!sContestantStatus[r7].hasJudgesAttention)
sub_80B03A8(r7);
sub_80B20C4();
gTasks[taskId].data[0] = 23;
@@ -1219,25 +1214,25 @@ void sub_80AC2CC(u8 taskId)
return;
case 23:
gTasks[taskId].data[1] = 0;
- if (sContestantStatus[r7].unk13 != 0xFF)
+ if (sContestantStatus[r7].effectStringId != CONTEST_STRING_NONE)
{
- sub_80B146C(r7, sContestantStatus[r7].unk13);
- sContestantStatus[r7].unk13 = 0xFF;
+ sub_80B146C(r7, sContestantStatus[r7].effectStringId);
+ sContestantStatus[r7].effectStringId = CONTEST_STRING_NONE;
gTasks[taskId].data[0] = 24;
}
else
{
- if (sContestantStatus[r7].unk14 != 0xFF)
+ if (sContestantStatus[r7].effectStringId2 != CONTEST_STRING_NONE)
{
for (i = 0; i < 4; i++)
{
- if (i != r7 && sContestantStatus[i].unk13 != 0xFF)
+ if (i != r7 && sContestantStatus[i].effectStringId != CONTEST_STRING_NONE)
break;
}
if (i == 4)
{
- sub_80B146C(r7, sContestantStatus[r7].unk14);
- sContestantStatus[r7].unk14 = 0xFF;
+ sub_80B146C(r7, sContestantStatus[r7].effectStringId2);
+ sContestantStatus[r7].effectStringId2 = CONTEST_STRING_NONE;
gTasks[taskId].data[0] = 24;
}
else
@@ -1256,15 +1251,15 @@ void sub_80AC2CC(u8 taskId)
gTasks[taskId].data[0] = 23;
return;
case 48:
- if (sContestantStatus[r7].unk11_0 == 1)
+ if (sContestantStatus[r7].turnOrderModAction == 1)
{
sub_80B1710(5);
}
- else if (sContestantStatus[r7].unk11_0 == 2)
+ else if (sContestantStatus[r7].turnOrderModAction == 2)
{
sub_80B1710(6);
}
- else if (sContestantStatus[r7].unk11_0 == 3)
+ else if (sContestantStatus[r7].turnOrderModAction == 3)
{
sub_80B1710(7);
}
@@ -1292,7 +1287,7 @@ void sub_80AC2CC(u8 taskId)
gTasks[taskId].data[0] = 35;
return;
case 35:
- if (sContestantStatus[r7].unk10_4 == 1)
+ if (sContestantStatus[r7].conditionMod == 1)
sub_80B1710(8);
gTasks[taskId].data[0] = 36;
return;
@@ -1338,7 +1333,7 @@ void sub_80AC2CC(u8 taskId)
for (r2 = 0; r2 < 4; r2++)
{
if (r2 != r7 && gUnknown_02038696[r2] == i
- && sContestantStatus[r2].unk13 != 0xFF)
+ && sContestantStatus[r2].effectStringId != CONTEST_STRING_NONE)
{
r4 = 1;
break;
@@ -1350,8 +1345,8 @@ void sub_80AC2CC(u8 taskId)
if (r4)
{
gTasks[taskId].data[1] = gUnknown_02038696[r2];
- sub_80B146C(r2, sContestantStatus[r2].unk13);
- sContestantStatus[r2].unk13 = 0xFF;
+ sub_80B146C(r2, sContestantStatus[r2].effectStringId);
+ sContestantStatus[r2].effectStringId = CONTEST_STRING_NONE;
gTasks[taskId].data[0] = 27;
}
else
@@ -1370,7 +1365,7 @@ void sub_80AC2CC(u8 taskId)
case 28:
for (i = 0; gTasks[taskId].data[1] != gUnknown_02038696[i]; i++)
;
- sub_80AFBA0(sContestantStatus[i].appeal2 + sContestantStatus[i].unkE, -sContestantStatus[i].unkE, i);
+ sub_80AFBA0(sContestantStatus[i].appeal2 + sContestantStatus[i].jam, -sContestantStatus[i].jam, i);
gTasks[taskId].data[0] = 29;
return;
case 29:
@@ -1409,10 +1404,10 @@ void sub_80AC2CC(u8 taskId)
PlaySE(SE_C_PASI);
else
PlaySE(SE_C_SYU);
- if (sContestantStatus[i].unk15_5)
+ if (sContestantStatus[i].judgesAttentionWasRemoved)
{
sub_80B03A8(i);
- sContestantStatus[i].unk15_5 = 0;
+ sContestantStatus[i].judgesAttentionWasRemoved = 0;
}
gTasks[taskId].data[1]++;
gTasks[taskId].data[0] = 26;
@@ -1421,8 +1416,8 @@ void sub_80AC2CC(u8 taskId)
if (gTasks[taskId].data[10]++ > 9)
{
gTasks[taskId].data[10] = 0;
- if (sContestantStatus[r7].unkC_1 != 0
- || sContestantStatus[r7].unk11_2)
+ if (sContestantStatus[r7].numTurnsSkipped != 0
+ || sContestantStatus[r7].turnSkipped)
{
sub_80AF138();
StringCopy(gStringVar1, gContestMons[r7].nickname);
@@ -1479,7 +1474,7 @@ void sub_80AC2CC(u8 taskId)
{
if (++gTasks[taskId].data[10] > 50)
{
- if (!sContestantStatus[r7].unk15_4)
+ if (!sContestantStatus[r7].hasJudgesAttention)
{
sub_80AFBA0(
sContestantStatus[r7].appeal2,
@@ -1536,14 +1531,14 @@ void sub_80AC2CC(u8 taskId)
}
return;
case 41:
- if (shared19328.bits_8 && r7 != shared19328.bits_9)
+ if (shared19328.excitementFrozen && r7 != shared19328.excitementFreezer)
{
gTasks[taskId].data[0] = 57;
}
else
{
r4 = shared19328.bits_0;
- if (sContestantStatus[r7].unk11_4)
+ if (sContestantStatus[r7].overrideCategoryExcitementMod)
{
r4 = 1;
StringCopy(gStringVar3, gMoveNames[sContestantStatus[r7].currMove]);
@@ -1680,7 +1675,7 @@ void sub_80AC2CC(u8 taskId)
return;
case 57:
sub_80AF138();
- StringCopy(gStringVar3, gContestMons[shared19328.bits_9].nickname);
+ StringCopy(gStringVar3, gContestMons[shared19328.excitementFreezer].nickname);
StringCopy(gStringVar1, gContestMons[r7].nickname);
StringCopy(gStringVar2, gMoveNames[sContestantStatus[r7].currMove]);
StringExpandPlaceholders(gStringVar4, ContestString_CrowdWatches);
@@ -1704,8 +1699,8 @@ void sub_80AC2CC(u8 taskId)
}
return;
case 33:
- if (sContestantStatus[r7].unk15_4)
- sContestantStatus[r7].unk15_4 = 0;
+ if (sContestantStatus[r7].hasJudgesAttention)
+ sContestantStatus[r7].hasJudgesAttention = 0;
sub_80B09B0(r7);
StringCopy(gStringVar1, gContestMons[r7].nickname);
StringCopy(gStringVar2, gMoveNames[sContestantStatus[r7].currMove]);
@@ -2679,14 +2674,14 @@ bool8 sub_80AEE54(u8 a, u8 b)
u16 r8;
s32 r4;
- if (sContestantStatus[a].unk10_4 == 0)
+ if (sContestantStatus[a].conditionMod == 0)
return FALSE;
r9 = gUnknown_02038696[a] * 5 + 2;
- if (sContestantStatus[a].unk10_4 == 1)
+ if (sContestantStatus[a].conditionMod == 1)
{
r8 = sub_80AEE4C(a);
r4 = 0;
- while (sContestantStatus[a].unkD / 10 > r4)
+ while (sContestantStatus[a].condition / 10 > r4)
{
*(u16 *)(VRAM + 0xC026 + (r9 + r4) * 64) = r8;
r4++;
@@ -2694,14 +2689,14 @@ bool8 sub_80AEE54(u8 a, u8 b)
if (b != 0)
{
PlaySE(SE_EXPMAX);
- sContestantStatus[a].unk10_4 = 0;
+ sContestantStatus[a].conditionMod = 0;
}
}
else
{
r8 = 0;
r4 = 3;
- while (sContestantStatus[a].unkD / 10 < r4)
+ while (sContestantStatus[a].condition / 10 < r4)
{
*(u16 *)(VRAM + 0xBFE6 + (r9 + r4) * 64) = r8;
r4--;
@@ -2709,7 +2704,7 @@ bool8 sub_80AEE54(u8 a, u8 b)
if (b != 0)
{
PlaySE(SE_FU_ZAKU2);
- sContestantStatus[a].unk10_4 = 0;
+ sContestantStatus[a].conditionMod = 0;
}
}
return TRUE;
@@ -2726,7 +2721,7 @@ void sub_80AEF50(void)
u16 r6 = sub_80AEE4C(i);
r4 = 0;
- while (r4 < sContestantStatus[i].unkD / 10)
+ while (r4 < sContestantStatus[i].condition / 10)
{
*(u16 *)(VRAM + 0xC026 + (r8 + r4) * 64) = r6;
r4++;
@@ -2772,11 +2767,11 @@ bool8 sub_80AF038(u8 a)
u16 r4 = 0;
u8 r6 = gUnknown_02038696[a] * 5 + 2;
- if (sContestantStatus[a].unk10_0 != 0 || sContestantStatus[a].unk10_1 != 0 || sContestantStatus[a].unk12 != 0 || sContestantStatus[a].unkF != 0)
+ if (sContestantStatus[a].resistant != 0 || sContestantStatus[a].immune != 0 || sContestantStatus[a].jamSafetyCount != 0 || sContestantStatus[a].jamReduction != 0)
r4 = sub_80AEFE8(a, 0);
- else if (sContestantStatus[a].unkC_0)
+ else if (sContestantStatus[a].nervous)
r4 = sub_80AEFE8(a, 1);
- else if (sContestantStatus[a].unkC_1 != 0 || sContestantStatus[a].unkB_7)
+ else if (sContestantStatus[a].numTurnsSkipped != 0 || sContestantStatus[a].noMoreTurns)
r4 = sub_80AEFE8(a, 2);
else
r5 = FALSE;
@@ -2950,7 +2945,7 @@ void sub_80AF3C0(void)
bool8 sub_80AF404(u8 a)
{
- if (sContestantStatus[a].unkC_1 != 0 || sContestantStatus[a].unkB_7)
+ if (sContestantStatus[a].numTurnsSkipped != 0 || sContestantStatus[a].noMoreTurns)
return FALSE;
else
return TRUE;
@@ -2965,34 +2960,34 @@ void sub_80AF438(void)
// This is bitfield hell...
sContestantStatus[i].appeal2 = 0;
sContestantStatus[i].appeal1 = 0;
- sContestantStatus[i].unk12 = 0;
- if (sContestantStatus[i].unkC_1 > 0)
- sContestantStatus[i].unkC_1--;
- sContestantStatus[i].unkE = 0;
- sContestantStatus[i].unk10_0 = 0;
- sContestantStatus[i].unkF = 0;
- sContestantStatus[i].unk10_1 = 0;
- sContestantStatus[i].unk10_2 = 0;
- sContestantStatus[i].unk10_3 = 0;
- sContestantStatus[i].unkC_0 = 0;
- sContestantStatus[i].unk13 = 0xFF;
- sContestantStatus[i].unk14 = -1;
- sContestantStatus[i].unk10_4 = 0;
+ sContestantStatus[i].jamSafetyCount = 0;
+ if (sContestantStatus[i].numTurnsSkipped > 0)
+ sContestantStatus[i].numTurnsSkipped--;
+ sContestantStatus[i].jam = 0;
+ sContestantStatus[i].resistant = 0;
+ sContestantStatus[i].jamReduction = 0;
+ sContestantStatus[i].immune = 0;
+ sContestantStatus[i].moreEasilyStartled = 0;
+ sContestantStatus[i].usedRepeatableMove = 0;
+ sContestantStatus[i].nervous = 0;
+ sContestantStatus[i].effectStringId = CONTEST_STRING_NONE;
+ sContestantStatus[i].effectStringId2 = CONTEST_STRING_NONE;
+ sContestantStatus[i].conditionMod = 0;
sContestantStatus[i].unk15_2 = sContestantStatus[i].disappointedRepeat;
sContestantStatus[i].disappointedRepeat = FALSE;
- sContestantStatus[i].unk11_0 = 0;
- sContestantStatus[i].unk11_5 = 0;
- if (sContestantStatus[i].unk11_2)
+ sContestantStatus[i].turnOrderModAction = 0;
+ sContestantStatus[i].appealTripleCondition = 0;
+ if (sContestantStatus[i].turnSkipped)
{
- sContestantStatus[i].unkC_1 = 1;
- sContestantStatus[i].unk11_2 = 0;
+ sContestantStatus[i].numTurnsSkipped = 1;
+ sContestantStatus[i].turnSkipped = 0;
}
- if (sContestantStatus[i].unk11_3)
+ if (sContestantStatus[i].exploded)
{
- sContestantStatus[i].unkB_7 = 1;
- sContestantStatus[i].unk11_3 = 0;
+ sContestantStatus[i].noMoreTurns = 1;
+ sContestantStatus[i].exploded = 0;
}
- sContestantStatus[i].unk11_4 = 0;
+ sContestantStatus[i].overrideCategoryExcitementMod = 0;
}
for (i = 0; i < 4; i++)
{
@@ -3001,12 +2996,12 @@ void sub_80AF438(void)
sContest.unk19248[sContest.turnNumber][i] = Contest_GetMoveExcitement(sContestantStatus[i].currMove);
sContestantStatus[i].currMove = MOVE_NONE;
}
- shared19328.bits_8 = 0;
+ shared19328.excitementFrozen = 0;
}
bool8 Contest_IsMonsTurnDisabled(u8 a)
{
- if (sContestantStatus[a].unkC_1 != 0 || sContestantStatus[a].unkB_7)
+ if (sContestantStatus[a].numTurnsSkipped != 0 || sContestantStatus[a].noMoreTurns)
return TRUE;
else
return FALSE;
@@ -4210,7 +4205,7 @@ void unref_sub_80B0994(u8 a)
void sub_80B09B0(u8 a)
{
- if (sContestantStatus[a].unk15_4)
+ if (sContestantStatus[a].hasJudgesAttention)
sub_80B0368(a);
else
sub_80B03A8(a);
@@ -4544,34 +4539,34 @@ void sub_80B114C(u8 contestant)
}
sContestantStatus[contestant].appeal1 = gContestEffects[effect].appeal;
sContestantStatus[contestant].appeal2 = gContestEffects[effect].appeal;
- shared192D0.unk4 = gContestEffects[effect].jam;
- shared192D0.unk6 = gContestEffects[effect].jam;
- shared192D0.unk11 = contestant;
+ shared192D0.jam = gContestEffects[effect].jam;
+ shared192D0.jam2 = gContestEffects[effect].jam;
+ shared192D0.contestant = contestant;
for (i = 0; i < 4; i++)
{
- sContestantStatus[i].unkE = 0;
- shared192D0.unkD[i] = 0;
+ sContestantStatus[i].jam = 0;
+ shared192D0.unnervedPokes[i] = 0;
}
- if (sContestantStatus[contestant].unk15_4 && AreMovesContestCombo(sContestantStatus[contestant].prevMove, sContestantStatus[contestant].currMove) == 0)
- sContestantStatus[contestant].unk15_4 = 0;
+ if (sContestantStatus[contestant].hasJudgesAttention && AreMovesContestCombo(sContestantStatus[contestant].prevMove, sContestantStatus[contestant].currMove) == 0)
+ sContestantStatus[contestant].hasJudgesAttention = 0;
gContestEffectFuncs[effect]();
- if (sContestantStatus[contestant].unk10_4 == 1)
- sContestantStatus[contestant].appeal2 += sContestantStatus[contestant].unkD - 10;
- else if (sContestantStatus[contestant].unk11_5)
- sContestantStatus[contestant].appeal2 += sContestantStatus[contestant].unkD * 3;
+ if (sContestantStatus[contestant].conditionMod == 1)
+ sContestantStatus[contestant].appeal2 += sContestantStatus[contestant].condition - 10;
+ else if (sContestantStatus[contestant].appealTripleCondition)
+ sContestantStatus[contestant].appeal2 += sContestantStatus[contestant].condition * 3;
else
- sContestantStatus[contestant].appeal2 += sContestantStatus[contestant].unkD;
+ sContestantStatus[contestant].appeal2 += sContestantStatus[contestant].condition;
sContestantStatus[contestant].unk16 = 0;
sContestantStatus[contestant].unk15_6 = 0;
if (sub_80B214C(contestant))
{
u8 r2 = AreMovesContestCombo(sContestantStatus[contestant].prevMove, sContestantStatus[contestant].currMove);
- if (r2 != 0 && sContestantStatus[contestant].unk15_4)
+ if (r2 != 0 && sContestantStatus[contestant].hasJudgesAttention)
{
sContestantStatus[contestant].unk16 = r2;
sContestantStatus[contestant].unk15_6 = 1;
- sContestantStatus[contestant].unk15_4 = 0;
+ sContestantStatus[contestant].hasJudgesAttention = 0;
sContestantStatus[contestant].unk17 = sContestantStatus[contestant].appeal1 * sContestantStatus[contestant].unk16;
sContestantStatus[contestant].unk15_3 = 1;
}
@@ -4579,25 +4574,25 @@ void sub_80B114C(u8 contestant)
{
if (gContestMoves[sContestantStatus[contestant].currMove].comboStarterId != 0)
{
- sContestantStatus[contestant].unk15_4 = 1;
+ sContestantStatus[contestant].hasJudgesAttention = 1;
sContestantStatus[contestant].unk15_6 = 1;
}
else
{
- sContestantStatus[contestant].unk15_4 = 0;
+ sContestantStatus[contestant].hasJudgesAttention = 0;
}
}
}
if (sContestantStatus[contestant].disappointedRepeat)
sContestantStatus[contestant].unk18 = (sContestantStatus[contestant].moveRepeatCount + 1) * 10;
- if (sContestantStatus[contestant].unkC_0)
+ if (sContestantStatus[contestant].nervous)
{
- sContestantStatus[contestant].unk15_4 = 0;
+ sContestantStatus[contestant].hasJudgesAttention = 0;
sContestantStatus[contestant].appeal2 = 0;
sContestantStatus[contestant].appeal1 = 0;
}
shared19328.bits_0 = Contest_GetMoveExcitement(sContestantStatus[contestant].currMove);
- if (sContestantStatus[contestant].unk11_4)
+ if (sContestantStatus[contestant].overrideCategoryExcitementMod)
shared19328.bits_0 = 1;
if (shared19328.bits_0 > 0)
{
@@ -4625,52 +4620,52 @@ void sub_80B114C(u8 contestant)
}
}
-void sub_80B13EC(u8 a, u8 b)
+void SetContestantEffectStringID(u8 a, u8 b)
{
- sContestantStatus[a].unk13 = b;
+ sContestantStatus[a].effectStringId = b;
}
-void sub_80B1404(u8 a, u8 b)
+void SetContestantEffectStringID2(u8 a, u8 b)
{
- sContestantStatus[a].unk14 = b;
+ sContestantStatus[a].effectStringId2 = b;
}
-void sub_80B141C(u8 a, u8 b)
+void SetStartledString(u8 contestant, u8 jam)
{
- if (b >= 60)
- sub_80B13EC(a, 53);
- else if (b >= 40)
- sub_80B13EC(a, 52);
- else if (b >= 30)
- sub_80B13EC(a, 51);
- else if (b >= 20)
- sub_80B13EC(a, 50);
- else if (b >= 10)
- sub_80B13EC(a, 49);
+ if (jam >= 60)
+ SetContestantEffectStringID(contestant, CONTEST_STRING_TRIPPED_OVER);
+ else if (jam >= 40)
+ SetContestantEffectStringID(contestant, CONTEST_STRING_LEAPT_UP);
+ else if (jam >= 30)
+ SetContestantEffectStringID(contestant, CONTEST_STRING_UTTER_CRY);
+ else if (jam >= 20)
+ SetContestantEffectStringID(contestant, CONTEST_STRING_TURNED_BACK);
+ else if (jam >= 10)
+ SetContestantEffectStringID(contestant, CONTEST_STRING_LOOKED_DOWN);
}
-void sub_80B146C(u8 a, u8 b)
+void sub_80B146C(u8 contestant, u8 stringId)
{
- StringCopy(gStringVar1, gContestMons[a].nickname);
- StringCopy(gStringVar2, gMoveNames[sContestantStatus[a].currMove]);
- if (gContestMoves[sContestantStatus[shared192D0.unk11].currMove].contestCategory == CONTEST_CATEGORY_COOL)
+ StringCopy(gStringVar1, gContestMons[contestant].nickname);
+ StringCopy(gStringVar2, gMoveNames[sContestantStatus[contestant].currMove]);
+ if (gContestMoves[sContestantStatus[shared192D0.contestant].currMove].contestCategory == CONTEST_CATEGORY_COOL)
StringCopy(gStringVar3, gText_Contest_Shyness);
- else if (gContestMoves[sContestantStatus[shared192D0.unk11].currMove].contestCategory == CONTEST_CATEGORY_BEAUTY)
+ else if (gContestMoves[sContestantStatus[shared192D0.contestant].currMove].contestCategory == CONTEST_CATEGORY_BEAUTY)
StringCopy(gStringVar3, gText_Contest_Anxiety);
- else if (gContestMoves[sContestantStatus[shared192D0.unk11].currMove].contestCategory == CONTEST_CATEGORY_CUTE)
+ else if (gContestMoves[sContestantStatus[shared192D0.contestant].currMove].contestCategory == CONTEST_CATEGORY_CUTE)
StringCopy(gStringVar3, gText_Contest_Laziness);
- else if (gContestMoves[sContestantStatus[shared192D0.unk11].currMove].contestCategory == CONTEST_CATEGORY_SMART)
+ else if (gContestMoves[sContestantStatus[shared192D0.contestant].currMove].contestCategory == CONTEST_CATEGORY_SMART)
StringCopy(gStringVar3, gText_Contest_Hesitancy);
else
StringCopy(gStringVar3, gText_Contest_Fear);
- StringExpandPlaceholders(gStringVar4, gUnknown_083CC188[b]);
+ StringExpandPlaceholders(gStringVar4, gUnknown_083CC188[stringId]);
sub_80AF138();
Text_InitWindow8002EB0(&gMenuWindow, gStringVar4, 776, 1, 15);
}
-void sub_80B157C(u8 p)
+void MakeContestantNervous(u8 p)
{
- sContestantStatus[p].unkC_0 = 1;
+ sContestantStatus[p].nervous = 1;
sContestantStatus[p].currMove = MOVE_NONE;
}
@@ -4693,7 +4688,7 @@ void sub_80B159C(void)
{
for (j = 0; j < 4; j++)
{
- if (sContestantStatus[j].unk19 == i)
+ if (sContestantStatus[j].nextTurnOrder == i)
{
sp0[j] = i;
sp4[j] = 1;
@@ -4704,7 +4699,7 @@ void sub_80B159C(void)
{
for (j = 0; j < 4; j++)
{
- if (sp4[j] == 0 && sContestantStatus[j].unk19 == 0xFF)
+ if (sp4[j] == 0 && sContestantStatus[j].nextTurnOrder == 0xFF)
{
r12 = j;
j++;
@@ -4713,7 +4708,7 @@ void sub_80B159C(void)
}
for (; j < 4; j++)
{
- if (sp4[j] == 0 && sContestantStatus[j].unk19 == 0xFF
+ if (sp4[j] == 0 && sContestantStatus[j].nextTurnOrder == 0xFF
&& gUnknown_02038696[r12] > gUnknown_02038696[j])
r12 = j;
}
@@ -4724,9 +4719,9 @@ void sub_80B159C(void)
for (i = 0; i < 4; i++)
{
- shared192D0.unk0[i] = sp0[i];
- sContestantStatus[i].unk19 = 0xFF;
- sContestantStatus[i].unk10_6 = 0;
+ shared192D0.turnOrder[i] = sp0[i];
+ sContestantStatus[i].nextTurnOrder = 0xFF;
+ sContestantStatus[i].turnOrderMod = 0;
gUnknown_02038696[i] = sp0[i];
}
}
@@ -5069,7 +5064,7 @@ void sub_80B1FD0(bool8 a)
for (i = 0; i < 4; i++)
{
- if (sContestantStatus[i].unk10_6 != 0 && a)
+ if (sContestantStatus[i].turnOrderMod != 0 && a)
{
CpuCopy32(
GetTurnOrderNumberGfx(i),
@@ -5087,10 +5082,10 @@ void sub_80B1FD0(bool8 a)
const u8 *GetTurnOrderNumberGfx(u8 contestant)
{
- if (sContestantStatus[contestant].unk10_6 != 1)
+ if (sContestantStatus[contestant].turnOrderMod != 1)
return gContestNextTurnRandomGfx;
else
- return gContestNextTurnNumbersGfx + sContestantStatus[contestant].unk19 * 64;
+ return gContestNextTurnNumbersGfx + sContestantStatus[contestant].nextTurnOrder * 64;
}
void sub_80B20C4(void)
@@ -5099,7 +5094,7 @@ void sub_80B20C4(void)
for (i = 0; i < 4; i++)
{
- if (shared192D0.unkD[i] != 0 && !Contest_IsMonsTurnDisabled(i))
+ if (shared192D0.unnervedPokes[i] != 0 && !Contest_IsMonsTurnDisabled(i))
{
u8 r4 = gUnknown_02038696[i] * 5 + 2;
u16 r0 = sub_80AEFE8(i, 3);
@@ -5115,7 +5110,7 @@ void sub_80B20C4(void)
bool8 sub_80B214C(u8 a)
{
- if (sContestantStatus[a].disappointedRepeat || sContestantStatus[a].unkC_0)
+ if (sContestantStatus[a].disappointedRepeat || sContestantStatus[a].nervous)
return FALSE;
else
return TRUE;
diff --git a/src/contest_ai.c b/src/contest_ai.c
index 1e249083b..e570dbafb 100644
--- a/src/contest_ai.c
+++ b/src/contest_ai.c
@@ -2,12 +2,9 @@
#include "contest.h"
#include "random.h"
#include "contest_ai.h"
+#include "contest_effect.h"
#include "ewram.h"
-extern u8 AreMovesContestCombo(u16, u16);
-extern bool8 sub_80B214C(u8);
-extern bool8 Contest_IsMonsTurnDisabled(u8);
-
extern u16 gSpecialVar_ContestCategory;
extern u8 *gAIScriptPtr;
@@ -383,7 +380,7 @@ static u8 sub_8128A7C(u8 var)
int i;
for(i = 0; i < 4; i++)
- if(shared192D0.unk0[i] == var)
+ if(shared192D0.turnOrder[i] == var)
break;
return i;
@@ -497,7 +494,7 @@ static void ContestAICmd_unk_0A(void)
static void ContestAICmd_get_user_order(void)
{
- eContestAI->scriptResult = shared192D0.unk0[eContestAI->unk41];
+ eContestAI->scriptResult = shared192D0.turnOrder[eContestAI->unk41];
gAIScriptPtr += 1;
}
@@ -543,7 +540,7 @@ static void ContestAICmd_unk_0F(void)
static void ContestAICmd_get_user_condition_maybe(void)
{
- eContestAI->scriptResult = sContestantStatus[eContestAI->unk41].unkD / 10;
+ eContestAI->scriptResult = sContestantStatus[eContestAI->unk41].condition / 10;
gAIScriptPtr += 1;
}
@@ -1150,7 +1147,7 @@ static void ContestAICmd_get_condition(void)
{
int var = sub_8128A7C(gAIScriptPtr[1]);
- eContestAI->scriptResult = sContestantStatus[var].unkD / 10;
+ eContestAI->scriptResult = sContestantStatus[var].condition / 10;
gAIScriptPtr += 2;
}
diff --git a/src/contest_effect.c b/src/contest_effect.c
new file mode 100644
index 000000000..2932d8e6e
--- /dev/null
+++ b/src/contest_effect.c
@@ -0,0 +1,1163 @@
+#include "global.h"
+#include "ewram.h"
+#include "random.h"
+#include "contest.h"
+
+static void ContestEffect_HighlyAppealing(void);
+static void ContestEffect_UserMoreEasilyStartled(void);
+static void ContestEffect_GreatAppealButNoMoreMoves(void);
+static void ContestEffect_RepetitionNotBoring(void);
+static void ContestEffect_AvoidStartleOnce(void);
+static void ContestEffect_AvoidStartle(void);
+static void ContestEffect_AvoidStartleSlightly(void);
+static void ContestEffect_UserLessEasilyStartled(void);
+static void ContestEffect_StartleFrontMon(void);
+static void ContestEffect_StartlePrevMons(void);
+static void ContestEffect_StartlePrevMon2(void);
+static void ContestEffect_StartlePrevMons2(void);
+static void ContestEffect_ShiftJudgeAttention(void);
+static void ContestEffect_StartleMonWithJudgesAttention(void);
+static void ContestEffect_JamsOthersButMissOneTurn(void);
+static void ContestEffect_StartleMonsSameTypeAppeal(void);
+static void ContestEffect_StartleMonsCoolAppeal(void);
+static void ContestEffect_StartleMonsBeautyAppeal(void);
+static void ContestEffect_StartleMonsCuteAppeal(void);
+static void ContestEffect_StartleMonsSmartAppeal(void);
+static void ContestEffect_StartleMonsToughAppeal(void);
+static void ContestEffect_MakeFollowingMonNervous(void);
+static void ContestEffect_MakeFollowingMonsNervous(void);
+static void ContestEffect_WorsenConditionOfPrevMons(void);
+static void ContestEffect_BadlyStartlesMonsInGoodCondition(void);
+static void ContestEffect_BetterIfFirst(void);
+static void ContestEffect_BetterIfLast(void);
+static void ContestEffect_AppealAsGoodAsPrevOnes(void);
+static void ContestEffect_AppealAsGoodAsPrevOne(void);
+static void ContestEffect_BetterWhenLater(void);
+static void ContestEffect_QualityDependsOnTiming(void);
+static void ContestEffect_BetterIfSameType(void);
+static void ContestEffect_BetterIfDiffType(void);
+static void ContestEffect_AffectedByPrevAppeal(void);
+static void ContestEffect_ImproveConditionPreventNervousness(void);
+static void ContestEffect_BetterWithGoodCondition(void);
+static void ContestEffect_NextAppealEarlier(void);
+static void ContestEffect_NextAppealLater(void);
+static void ContestEffect_MakeScramblingTurnOrderEasier(void);
+static void ContestEffect_ScrambleNextTurnOrder(void);
+static void ContestEffect_ExciteAudienceInAnyContest(void);
+static void ContestEffect_BadlyStartleMonsWithGoodAppeals(void);
+static void ContestEffect_BetterWhenAudienceExcited(void);
+static void ContestEffect_DontExciteAudience(void);
+static void JamByMoveCategory(u8);
+static bool8 CanUnnerveContestant(u8);
+static u8 WasAtLeastOneOpponentJammed(void);
+static void JamContestant(u8, u8);
+static s16 RoundTowardsZero(s16);
+static s16 RoundUp(s16);
+
+#include "data/contest_moves.h"
+
+bool8 AreMovesContestCombo(u16 lastMove, u16 nextMove) {
+ u8 nextMoveComboMoves[4];
+ u8 lastMoveComboStarterId = gContestMoves[lastMove].comboStarterId;
+ nextMoveComboMoves[0] = gContestMoves[nextMove].comboMoves[0];
+ nextMoveComboMoves[1] = gContestMoves[nextMove].comboMoves[1];
+ nextMoveComboMoves[2] = gContestMoves[nextMove].comboMoves[2];
+ nextMoveComboMoves[3] = gContestMoves[nextMove].comboMoves[3];
+
+ if (lastMoveComboStarterId == 0)
+ return 0;
+
+ if (lastMoveComboStarterId == nextMoveComboMoves[0] || lastMoveComboStarterId == nextMoveComboMoves[1] || lastMoveComboStarterId == nextMoveComboMoves[2] || lastMoveComboStarterId == nextMoveComboMoves[3])
+ return gComboStarterLookupTable[lastMoveComboStarterId];
+
+ return 0;
+}
+
+// A highly appealing move.
+static void ContestEffect_HighlyAppealing(void)
+{
+}
+
+// After this move, the user is more easily startled.
+static void ContestEffect_UserMoreEasilyStartled(void)
+{
+ sContestantStatus[shared192D0.contestant].moreEasilyStartled = TRUE;
+ SetContestantEffectStringID(shared192D0.contestant, CONTEST_STRING_MORE_CONSCIOUS);
+}
+
+// Makes a great appeal, but allows no more to the end.
+static void ContestEffect_GreatAppealButNoMoreMoves(void)
+{
+ sContestantStatus[shared192D0.contestant].exploded = TRUE;
+ SetContestantEffectStringID(shared192D0.contestant, CONTEST_STRING_NO_APPEAL);
+}
+
+// Can be used repeatedly without boring the JUDGE.
+static void ContestEffect_RepetitionNotBoring(void)
+{
+ sContestantStatus[shared192D0.contestant].usedRepeatableMove = TRUE;
+ sContestantStatus[shared192D0.contestant].disappointedRepeat = FALSE;
+ sContestantStatus[shared192D0.contestant].moveRepeatCount = 0;
+}
+
+// Can avoid being startled by others once.
+static void ContestEffect_AvoidStartleOnce(void)
+{
+ sContestantStatus[shared192D0.contestant].jamSafetyCount = 1;
+ SetContestantEffectStringID(shared192D0.contestant, CONTEST_STRING_SETTLE_DOWN);
+}
+
+// Can avoid being startled by others.
+static void ContestEffect_AvoidStartle(void)
+{
+ sContestantStatus[shared192D0.contestant].immune = TRUE;
+ SetContestantEffectStringID(shared192D0.contestant, CONTEST_STRING_OBLIVIOUS_TO_OTHERS);
+}
+
+// Can avoid being startled by others a little.
+static void ContestEffect_AvoidStartleSlightly(void)
+{
+ sContestantStatus[shared192D0.contestant].jamReduction = 20;
+ SetContestantEffectStringID(shared192D0.contestant,CONTEST_STRING_LESS_AWARE);
+}
+
+// After this move, the user is less likely to be startled.
+static void ContestEffect_UserLessEasilyStartled(void)
+{
+ sContestantStatus[shared192D0.contestant].resistant = TRUE;
+ SetContestantEffectStringID(shared192D0.contestant,CONTEST_STRING_STOPPED_CARING);
+}
+
+// Slightly startles the POKéMON in front.
+static void ContestEffect_StartleFrontMon(void)
+{
+ u8 idx = 0;
+ u8 a = shared192D0.contestant;
+
+ if (shared192D0.turnOrder[a] != 0) {
+ int i;
+
+ for (i = 0; i < 4; i++)
+ {
+ if (shared192D0.turnOrder[a] - 1 == shared192D0.turnOrder[i])
+ break;
+ }
+ shared192D0.jamQueue[0] = i;
+ shared192D0.jamQueue[1] = 0xFF;
+ idx = WasAtLeastOneOpponentJammed();
+ }
+ if (idx == 0)
+ SetContestantEffectStringID2(shared192D0.contestant, CONTEST_STRING_MESSED_UP2);
+ SetContestantEffectStringID(shared192D0.contestant, CONTEST_STRING_ATTEMPT_STARTLE);
+}
+
+// Slightly startles those that have made appeals.
+static void ContestEffect_StartlePrevMons(void)
+{
+ u8 idx = 0;
+ u8 a = shared192D0.contestant;
+
+ if (shared192D0.turnOrder[a] != 0) {
+ int i;
+ int j = 0;
+
+ for (i = 0; i < 4; i++)
+ if (shared192D0.turnOrder[a] > shared192D0.turnOrder[i])
+ shared192D0.jamQueue[j++] = i;
+ shared192D0.jamQueue[j] = 0xFF;
+ idx = WasAtLeastOneOpponentJammed();
+ }
+ if (idx == 0)
+ SetContestantEffectStringID2(shared192D0.contestant, CONTEST_STRING_MESSED_UP2);
+ SetContestantEffectStringID(shared192D0.contestant, CONTEST_STRING_ATTEMPT_STARTLE);
+}
+
+// Startles the POKéMON that appealed before the user.
+static void ContestEffect_StartlePrevMon2(void)
+{
+ u8 rval = Random() % 10;
+ int jam;
+
+ if (rval < 2)
+ jam = 20;
+ else if (rval < 8)
+ jam = 40;
+ else
+ jam = 60;
+ shared192D0.jam = jam;
+ ContestEffect_StartleFrontMon();
+}
+
+// Startles all POKéMON that appealed before the user.
+static void ContestEffect_StartlePrevMons2(void)
+{
+ u8 numStartled = 0;
+ u8 contestant = shared192D0.contestant;
+
+ if (shared192D0.turnOrder[contestant] != 0)
+ {
+ int i;
+
+ for (i = 0; i < 4; i++)
+ {
+ if (shared192D0.turnOrder[contestant] > shared192D0.turnOrder[i])
+ {
+ shared192D0.jamQueue[0] = i;
+ shared192D0.jamQueue[1] = 0xFF;
+ {
+ u8 rval = Random() % 10;
+ int jam;
+
+ if (rval == 0)
+ jam = 0;
+ else if (rval <= 2)
+ jam = 10;
+ else if (rval <= 4)
+ jam = 20;
+ else if (rval <= 6)
+ jam = 30;
+ else if (rval <= 8)
+ jam = 40;
+ else
+ jam = 60;
+ shared192D0.jam = jam;
+ }
+ if (WasAtLeastOneOpponentJammed())
+ numStartled++;
+ }
+ }
+ }
+ SetContestantEffectStringID(shared192D0.contestant, CONTEST_STRING_ATTEMPT_STARTLE);
+ if (numStartled == 0)
+ SetContestantEffectStringID2(shared192D0.contestant, CONTEST_STRING_MESSED_UP2);
+}
+
+// Shifts the JUDGE’s attention from others.
+static void ContestEffect_ShiftJudgeAttention(void)
+{
+ bool32 hitAny = FALSE;
+ u8 contestant = shared192D0.contestant;
+
+ if (shared192D0.turnOrder[shared192D0.contestant] != 0)
+ {
+ int i;
+
+ for (i = 0; i < 4; i++)
+ {
+ if (shared192D0.turnOrder[contestant] > shared192D0.turnOrder[i] &&
+ sContestantStatus[i].hasJudgesAttention &&
+ CanUnnerveContestant(i))
+ {
+ sContestantStatus[i].hasJudgesAttention = FALSE;
+ sContestantStatus[i].judgesAttentionWasRemoved = TRUE;
+ SetContestantEffectStringID(i, CONTEST_STRING_JUDGE_LOOK_AWAY2);
+ hitAny = TRUE;
+ }
+ }
+ }
+ SetContestantEffectStringID(shared192D0.contestant,CONTEST_STRING_DAZZLE_ATTEMPT);
+ if (!hitAny)
+ {
+ SetContestantEffectStringID2(shared192D0.contestant, CONTEST_STRING_MESSED_UP2);
+ }
+}
+
+// Startles the POKéMON that has the JUDGE’s attention.
+static void ContestEffect_StartleMonWithJudgesAttention(void)
+{
+ u8 numStartled = 0;
+ u8 contestant = shared192D0.contestant;
+
+ if (shared192D0.turnOrder[shared192D0.contestant] != 0)
+ {
+ int i;
+
+ for (i = 0; i < 4; i++)
+ {
+ if (shared192D0.turnOrder[contestant] > shared192D0.turnOrder[i])
+ {
+ if (sContestantStatus[i].hasJudgesAttention)
+ shared192D0.jam = 50;
+ else
+ shared192D0.jam = 10;
+ shared192D0.jamQueue[0] = i;
+ shared192D0.jamQueue[1] = 0xFF;
+ if (WasAtLeastOneOpponentJammed())
+ numStartled++;
+ }
+ }
+ }
+ SetContestantEffectStringID(shared192D0.contestant, CONTEST_STRING_ATTEMPT_STARTLE);
+ if (numStartled == 0)
+ SetContestantEffectStringID2(shared192D0.contestant, CONTEST_STRING_MESSED_UP2);
+}
+
+// Jams the others, and misses one turn of appeals.
+static void ContestEffect_JamsOthersButMissOneTurn(void)
+{
+ sContestantStatus[shared192D0.contestant].turnSkipped = TRUE;
+ ContestEffect_StartlePrevMons();
+ SetContestantEffectStringID(shared192D0.contestant, CONTEST_STRING_ATTEMPT_STARTLE);
+}
+
+// Startles POKéMON that made a same-type appeal.
+static void ContestEffect_StartleMonsSameTypeAppeal(void)
+{
+ u16 move = sContestantStatus[shared192D0.contestant].currMove;
+ JamByMoveCategory(gContestMoves[move].contestCategory);
+ SetContestantEffectStringID(shared192D0.contestant, CONTEST_STRING_ATTEMPT_STARTLE);
+}
+
+// Badly startles POKéMON that made COOL appeals.
+static void ContestEffect_StartleMonsCoolAppeal(void)
+{
+ JamByMoveCategory(CONTEST_CATEGORY_COOL);
+ SetContestantEffectStringID(shared192D0.contestant, CONTEST_STRING_ATTEMPT_STARTLE);
+}
+
+// Badly startles POKéMON that made BEAUTY appeals.
+static void ContestEffect_StartleMonsBeautyAppeal(void)
+{
+ JamByMoveCategory(CONTEST_CATEGORY_BEAUTY);
+ SetContestantEffectStringID(shared192D0.contestant, CONTEST_STRING_ATTEMPT_STARTLE);
+}
+
+// Badly startles POKéMON that made CUTE appeals.
+static void ContestEffect_StartleMonsCuteAppeal(void)
+{
+ JamByMoveCategory(CONTEST_CATEGORY_CUTE);
+ SetContestantEffectStringID(shared192D0.contestant, CONTEST_STRING_ATTEMPT_STARTLE);
+}
+
+// Badly startles POKéMON that made SMART appeals.
+static void ContestEffect_StartleMonsSmartAppeal(void)
+{
+ JamByMoveCategory(CONTEST_CATEGORY_SMART);
+ SetContestantEffectStringID(shared192D0.contestant, CONTEST_STRING_ATTEMPT_STARTLE);
+}
+
+// Badly startles POKéMON that made TOUGH appeals.
+static void ContestEffect_StartleMonsToughAppeal(void)
+{
+ JamByMoveCategory(CONTEST_CATEGORY_TOUGH);
+ SetContestantEffectStringID(shared192D0.contestant, CONTEST_STRING_ATTEMPT_STARTLE);
+}
+
+// Makes one POKéMON after the user nervous.
+static void ContestEffect_MakeFollowingMonNervous(void)
+{
+ bool32 hitAny = FALSE;
+
+ if (shared192D0.turnOrder[shared192D0.contestant] != 3)
+ {
+ int i;
+
+ for (i = 0; i < 4; i++)
+ {
+ if (shared192D0.turnOrder[shared192D0.contestant] + 1 == shared192D0.turnOrder[i])
+ {
+ if (CanUnnerveContestant(i))
+ {
+ MakeContestantNervous(i);
+ SetContestantEffectStringID(i, CONTEST_STRING_NERVOUS);
+ hitAny = TRUE;
+ }
+ else
+ {
+ SetContestantEffectStringID(i, CONTEST_STRING_UNAFFECTED);
+ hitAny = TRUE;
+ }
+ }
+ }
+ }
+ SetContestantEffectStringID(shared192D0.contestant, CONTEST_STRING_UNNERVE_ATTEMPT);
+ if (!hitAny)
+ SetContestantEffectStringID2(shared192D0.contestant, CONTEST_STRING_MESSED_UP2);
+}
+
+// Makes all POKéMON after the user nervous.
+static void ContestEffect_MakeFollowingMonsNervous(void)
+{
+ u8 numUnnerved = 0;
+ bool32 contestantUnnerved = FALSE;
+ u8 contestantIds[5];
+ int i;
+ int numAfter;
+ s16 oddsMod[4];
+ s16 odds[4];
+
+ memset(contestantIds, 0xFF, ARRAY_COUNT(contestantIds));
+ for (i = 0, numAfter = 0; i < 4; i++)
+ {
+ if (shared192D0.turnOrder[shared192D0.contestant] < shared192D0.turnOrder[i] &&
+ !sContestantStatus[i].nervous && !Contest_IsMonsTurnDisabled(i))
+ contestantIds[numAfter++] = i;
+ }
+
+ if (numAfter == 1)
+ {
+ odds[0] = 60;
+ }
+ else if (numAfter == 2)
+ {
+ odds[0] = 30;
+ odds[1] = 30;
+ }
+ else if (numAfter == 3)
+ {
+ odds[0] = 20;
+ odds[1] = 20;
+ odds[2] = 20;
+ }
+ else
+ {
+ for (i = 0; i < 4; i++)
+ odds[i] = 0;
+ }
+ for (i = 0; i < 4; i++)
+ {
+ if (sContestantStatus[i].hasJudgesAttention && sub_80B214C(i))
+ oddsMod[i] = gComboStarterLookupTable[gContestMoves[sContestantStatus[i].prevMove].comboStarterId] * 10;
+ else
+ oddsMod[i] = 0;
+ oddsMod[i] -= (sContestantStatus[i].condition / 10) * 10;
+ }
+ if (odds[0] != 0)
+ {
+ for (i = 0; contestantIds[i] != 0xFF; i++)
+ {
+ if (Random() % 100 < odds[i] + oddsMod[contestantIds[i]])
+ {
+ if (CanUnnerveContestant(contestantIds[i]))
+ {
+ MakeContestantNervous(contestantIds[i]);
+ SetContestantEffectStringID(contestantIds[i], CONTEST_STRING_NERVOUS);
+ numUnnerved++;
+ } else
+ contestantUnnerved = TRUE;
+ } else
+ contestantUnnerved = TRUE;
+ if (contestantUnnerved)
+ {
+ contestantUnnerved = FALSE;
+ SetContestantEffectStringID(contestantIds[i], CONTEST_STRING_UNAFFECTED);
+ numUnnerved++;
+ }
+ shared192D0.unnervedPokes[contestantIds[i]] = 1;
+ }
+ }
+ SetContestantEffectStringID(shared192D0.contestant, CONTEST_STRING_UNNERVE_WAITING);
+ if (numUnnerved == 0)
+ SetContestantEffectStringID2(shared192D0.contestant, CONTEST_STRING_MESSED_UP2);
+}
+
+// Worsens the condition of those that made appeals.
+static void ContestEffect_WorsenConditionOfPrevMons(void)
+{
+ u8 numHit = 0;
+ int i;
+
+ for (i = 0; i < 4; i++)
+ {
+ if (shared192D0.turnOrder[shared192D0.contestant] > shared192D0.turnOrder[i] &&
+ sContestantStatus[i].condition > 0 &&
+ CanUnnerveContestant(i))
+ {
+ sContestantStatus[i].condition = 0;
+ sContestantStatus[i].conditionMod = 2;
+ SetContestantEffectStringID(i, CONTEST_STRING_REGAINED_FORM);
+ numHit++;
+ }
+ }
+
+ SetContestantEffectStringID(shared192D0.contestant, CONTEST_STRING_TAUNT_WELL);
+ if (numHit == 0)
+ SetContestantEffectStringID2(shared192D0.contestant, CONTEST_STRING_IGNORED);
+}
+
+// Badly startles POKéMON in good condition.
+static void ContestEffect_BadlyStartlesMonsInGoodCondition(void)
+{
+ u8 numHit = 0;
+ int i;
+
+ for (i = 0; i < 4; i++)
+ {
+ if (shared192D0.turnOrder[shared192D0.contestant] > shared192D0.turnOrder[i])
+ {
+ if (sContestantStatus[i].condition > 0)
+ shared192D0.jam = 40;
+ else
+ shared192D0.jam = 10;
+ shared192D0.jamQueue[0] = i;
+ shared192D0.jamQueue[1] = 0xFF;
+ if (WasAtLeastOneOpponentJammed())
+ numHit++;
+ }
+ }
+ SetContestantEffectStringID(shared192D0.contestant, CONTEST_STRING_JAM_WELL);
+ if (numHit == 0)
+ SetContestantEffectStringID2(shared192D0.contestant, CONTEST_STRING_IGNORED);
+}
+
+// The appeal works great if performed first.
+static void ContestEffect_BetterIfFirst(void)
+{
+ if (gUnknown_02038696[shared192D0.contestant] == 0)
+ {
+ u16 move = sContestantStatus[shared192D0.contestant].currMove;
+ sContestantStatus[shared192D0.contestant].appeal2 += 2 * gContestEffects[gContestMoves[move].effect].appeal;
+ SetContestantEffectStringID(shared192D0.contestant, CONTEST_STRING_HUSTLE_STANDOUT);
+ }
+}
+
+// The appeal works great if performed last.
+static void ContestEffect_BetterIfLast(void)
+{
+ if (gUnknown_02038696[shared192D0.contestant] == 3)
+ {
+ u16 move = sContestantStatus[shared192D0.contestant].currMove;
+ sContestantStatus[shared192D0.contestant].appeal2 += 2 * gContestEffects[gContestMoves[move].effect].appeal;
+ SetContestantEffectStringID(shared192D0.contestant, CONTEST_STRING_WORK_HARD_UNNOTICED);
+ }
+}
+
+// Makes the appeal as good as those before it.
+static void ContestEffect_AppealAsGoodAsPrevOnes(void)
+{
+ int i;
+ int appealSum;
+
+ for (i = 0, appealSum = 0; i < 4; i++)
+ {
+ if (shared192D0.turnOrder[shared192D0.contestant] > shared192D0.turnOrder[i])
+ appealSum += sContestantStatus[i].appeal2;
+ }
+ if (appealSum < 0)
+ appealSum = 0;
+ if (shared192D0.turnOrder[shared192D0.contestant] == 0 || appealSum == 0)
+ SetContestantEffectStringID(shared192D0.contestant, CONTEST_STRING_APPEAL_NOT_WELL);
+ else
+ {
+ sContestantStatus[shared192D0.contestant].appeal2 += appealSum / 2;
+ SetContestantEffectStringID(shared192D0.contestant, CONTEST_STRING_WORK_BEFORE);
+ }
+ sContestantStatus[shared192D0.contestant].appeal2 = RoundTowardsZero(sContestantStatus[shared192D0.contestant].appeal2);
+}
+
+// Makes the appeal as good as the one before it.
+static void ContestEffect_AppealAsGoodAsPrevOne(void)
+{
+ s16 appeal = 0;
+
+ if (shared192D0.turnOrder[shared192D0.contestant] != 0)
+ {
+ int i;
+ for (i = 0; i < 4; i++)
+ {
+ if (shared192D0.turnOrder[shared192D0.contestant] - 1 == shared192D0.turnOrder[i])
+ appeal = sContestantStatus[i].appeal2;
+ }
+ }
+ if (shared192D0.turnOrder[shared192D0.contestant] == 0 || appeal <= 0)
+ SetContestantEffectStringID(shared192D0.contestant, CONTEST_STRING_APPEAL_NOT_WELL2);
+ else
+ {
+ sContestantStatus[shared192D0.contestant].appeal2 += appeal;
+ SetContestantEffectStringID(shared192D0.contestant, CONTEST_STRING_WORK_PRECEDING);
+ }
+}
+
+// The appeal works better the later it is performed.
+static void ContestEffect_BetterWhenLater(void)
+{
+ u8 whichTurn = shared192D0.turnOrder[shared192D0.contestant];
+ if (whichTurn == 0)
+ sContestantStatus[shared192D0.contestant].appeal2 = 10;
+ else
+ sContestantStatus[shared192D0.contestant].appeal2 = 20 * whichTurn;
+ if (whichTurn == 0)
+ SetContestantEffectStringID(shared192D0.contestant, CONTEST_STRING_APPEAL_NOT_SHOWN_WELL);
+ else if (whichTurn == 1)
+ SetContestantEffectStringID(shared192D0.contestant, CONTEST_STRING_APPEAL_SLIGHTLY_WELL);
+ else if (whichTurn == 2)
+ SetContestantEffectStringID(shared192D0.contestant, CONTEST_STRING_APPEAL_PRETTY_WELL);
+ else
+ SetContestantEffectStringID(shared192D0.contestant, CONTEST_STRING_APPEAL_EXCELLENTLY);
+}
+
+// The appeal’s quality varies depending on its timing.
+static void ContestEffect_QualityDependsOnTiming(void)
+{
+ u8 rval = Random() % 10;
+ s16 appeal;
+
+ if (rval < 3)
+ {
+ appeal = 10;
+ SetContestantEffectStringID(shared192D0.contestant, CONTEST_STRING_APPEAL_NOT_VERY_WELL);
+ } else if (rval < 6)
+ {
+ appeal = 20;
+ SetContestantEffectStringID(shared192D0.contestant, CONTEST_STRING_APPEAL_SLIGHTLY_WELL2);
+ } else if (rval < 8)
+ {
+ appeal = 40;
+ SetContestantEffectStringID(shared192D0.contestant, CONTEST_STRING_APPEAL_PRETTY_WELL2);
+ } else if (rval < 9)
+ {
+ appeal = 60;
+ SetContestantEffectStringID(shared192D0.contestant, CONTEST_STRING_APPEAL_VERY_WELL);
+ }
+ else
+ {
+ appeal = 80;
+ SetContestantEffectStringID(shared192D0.contestant, CONTEST_STRING_APPEAL_EXCELLENTLY2);
+ }
+ sContestantStatus[shared192D0.contestant].appeal2 = appeal;
+}
+
+#ifdef NONMATCHING
+// Not even close, send help
+// Works well if it’s the same type as the one before.
+static void ContestEffect_BetterIfSameType(void)
+{
+ s8 r4;
+ s8 r2;
+
+ for (r4 = shared192D0.turnOrder[shared192D0.contestant]; r4 > 0; r4--)
+ {
+ for (r2 = 0; r2 < 4; r2++)
+ {
+ if (shared192D0.turnOrder[r2] == r4 - 1)
+ break;
+ }
+ if (!(sContestantStatus[r2].noMoreTurns || sContestantStatus[r2].nervous || sContestantStatus[r2].numTurnsSkipped))
+ {
+ u16 move = sContestantStatus[shared192D0.contestant].currMove;
+
+ if (gContestMoves[move].contestCategory == gContestMoves[sContestantStatus[r2].currMove].contestCategory)
+ {
+ sContestantStatus[shared192D0.contestant].appeal2 += gContestEffects[gContestMoves[move].effect].appeal * 2;
+ SetContestantEffectStringID(shared192D0.contestant, CONTEST_STRING_SAME_TYPE_GOOD);
+ }
+ break;
+ }
+ }
+}
+#else
+__attribute__((naked)) void ContestEffect_BetterIfSameType(void)
+{
+ asm_unified("\tpush {r4-r7,lr}\n"
+ "\tldr r1, _080B8940 @ =gSharedMem + 0x192D0\n"
+ "\tldrb r0, [r1, 0x11]\n"
+ "\tadds r0, r1\n"
+ "\tmovs r2, 0\n"
+ "\tldrsb r2, [r0, r2]\n"
+ "\tsubs r0, r2, 0x1\n"
+ "\tlsls r0, 24\n"
+ "\tlsrs r4, r0, 24\n"
+ "\tmov r12, r1\n"
+ "\tcmp r2, 0\n"
+ "\tbeq _080B8994\n"
+ "\tldrb r5, [r1]\n"
+ "\tmov r6, r12\n"
+ "\tsubs r6, 0x70\n"
+ "_080B88EA:\n"
+ "\tmovs r2, 0\n"
+ "\tlsls r0, r4, 24\n"
+ "\tasrs r1, r0, 24\n"
+ "\tadds r4, r0, 0\n"
+ "\tcmp r5, r1\n"
+ "\tbeq _080B8910\n"
+ "\tldr r3, _080B8940 @ =gSharedMem + 0x192D0\n"
+ "_080B88F8:\n"
+ "\tlsls r0, r2, 24\n"
+ "\tmovs r2, 0x80\n"
+ "\tlsls r2, 17\n"
+ "\tadds r0, r2\n"
+ "\tlsrs r2, r0, 24\n"
+ "\tasrs r0, 24\n"
+ "\tcmp r0, 0x3\n"
+ "\tbgt _080B8910\n"
+ "\tadds r0, r3\n"
+ "\tldrb r0, [r0]\n"
+ "\tcmp r0, r1\n"
+ "\tbne _080B88F8\n"
+ "_080B8910:\n"
+ "\tlsls r2, 24\n"
+ "\tasrs r1, r2, 24\n"
+ "\tlsls r0, r1, 3\n"
+ "\tsubs r0, r1\n"
+ "\tlsls r0, 2\n"
+ "\tadds r3, r0, r6\n"
+ "\tldrb r1, [r3, 0xB]\n"
+ "\tmovs r0, 0x80\n"
+ "\tands r0, r1\n"
+ "\tadds r7, r2, 0\n"
+ "\tcmp r0, 0\n"
+ "\tbne _080B8932\n"
+ "\tldrb r1, [r3, 0xC]\n"
+ "\tmovs r0, 0x7\n"
+ "\tands r0, r1\n"
+ "\tcmp r0, 0\n"
+ "\tbeq _080B8944\n"
+ "_080B8932:\n"
+ "\tmovs r1, 0xFF\n"
+ "\tlsls r1, 24\n"
+ "\tadds r0, r4, r1\n"
+ "\tlsrs r4, r0, 24\n"
+ "\tcmp r0, 0\n"
+ "\tblt _080B8994\n"
+ "\tb _080B88EA\n"
+ "\t.align 2, 0\n"
+ "_080B8940: .4byte gSharedMem + 0x192D0\n"
+ "_080B8944:\n"
+ "\tmov r2, r12\n"
+ "\tldrb r1, [r2, 0x11]\n"
+ "\tlsls r0, r1, 3\n"
+ "\tsubs r0, r1\n"
+ "\tlsls r0, 2\n"
+ "\tmov r3, r12\n"
+ "\tsubs r3, 0x70\n"
+ "\tadds r5, r0, r3\n"
+ "\tldrh r0, [r5, 0x6]\n"
+ "\tldr r4, _080B899C @ =gContestMoves\n"
+ "\tlsls r0, 3\n"
+ "\tadds r6, r0, r4\n"
+ "\tldrb r2, [r6, 0x1]\n"
+ "\tlsls r2, 29\n"
+ "\tasrs r1, r7, 24\n"
+ "\tlsls r0, r1, 3\n"
+ "\tsubs r0, r1\n"
+ "\tlsls r0, 2\n"
+ "\tadds r0, r3\n"
+ "\tldrh r0, [r0, 0x6]\n"
+ "\tlsls r0, 3\n"
+ "\tadds r0, r4\n"
+ "\tldrb r0, [r0, 0x1]\n"
+ "\tlsls r0, 29\n"
+ "\tcmp r2, r0\n"
+ "\tbne _080B8994\n"
+ "\tldr r1, _080B89A0 @ =gContestEffects\n"
+ "\tldrb r0, [r6]\n"
+ "\tlsls r0, 2\n"
+ "\tadds r0, r1\n"
+ "\tldrb r0, [r0, 0x1]\n"
+ "\tlsls r0, 1\n"
+ "\tldrh r1, [r5, 0x2]\n"
+ "\tadds r0, r1\n"
+ "\tstrh r0, [r5, 0x2]\n"
+ "\tmov r2, r12\n"
+ "\tldrb r0, [r2, 0x11]\n"
+ "\tmovs r1, 0x1F\n"
+ "\tbl SetContestantEffectStringID\n"
+ "_080B8994:\n"
+ "\tpop {r4-r7}\n"
+ "\tpop {r0}\n"
+ "\tbx r0\n"
+ "\t.align 2, 0\n"
+ "_080B899C: .4byte gContestMoves\n"
+ "_080B89A0: .4byte gContestEffects");
+}
+#endif
+
+// Works well if different in type than the one before.
+static void ContestEffect_BetterIfDiffType(void)
+{
+ if (shared192D0.turnOrder[shared192D0.contestant] != 0)
+ {
+ u16 move = sContestantStatus[shared192D0.contestant].currMove;
+ int i;
+
+ for (i = 0; i < 4; i++)
+ {
+ if (shared192D0.turnOrder[shared192D0.contestant] - 1 == shared192D0.turnOrder[i] &&
+ gContestMoves[move].contestCategory != gContestMoves[sContestantStatus[i].currMove].contestCategory)
+ {
+ sContestantStatus[shared192D0.contestant].appeal2 += gContestEffects[gContestMoves[move].effect].appeal * 2;
+ SetContestantEffectStringID(shared192D0.contestant, CONTEST_STRING_DIFF_TYPE_GOOD);
+ break;
+ }
+ }
+ }
+}
+
+// Affected by how well the appeal in front goes.
+static void ContestEffect_AffectedByPrevAppeal(void)
+{
+ if (shared192D0.turnOrder[shared192D0.contestant] != 0)
+ {
+ int i;
+
+ for (i = 0; i < 4; i++)
+ {
+ if (shared192D0.turnOrder[shared192D0.contestant] - 1 == shared192D0.turnOrder[i])
+ {
+ if (sContestantStatus[shared192D0.contestant].appeal2 > sContestantStatus[i].appeal2)
+ {
+ sContestantStatus[shared192D0.contestant].appeal2 *= 2;
+ SetContestantEffectStringID(shared192D0.contestant, CONTEST_STRING_STOOD_OUT_AS_MUCH);
+ }
+ else if (sContestantStatus[shared192D0.contestant].appeal2 < sContestantStatus[i].appeal2)
+ {
+ sContestantStatus[shared192D0.contestant].appeal2 = 0;
+ SetContestantEffectStringID(shared192D0.contestant, CONTEST_STRING_NOT_AS_WELL);
+ }
+ }
+ }
+ }
+}
+
+// Ups the user’s condition. Helps prevent nervousness.
+static void ContestEffect_ImproveConditionPreventNervousness(void)
+{
+ if (sContestantStatus[shared192D0.contestant].condition < 30)
+ {
+ sContestantStatus[shared192D0.contestant].condition += 10;
+ sContestantStatus[shared192D0.contestant].conditionMod = 1;
+ SetContestantEffectStringID(shared192D0.contestant, CONTEST_STRING_CONDITION_ROSE);
+ }
+ else
+ SetContestantEffectStringID(shared192D0.contestant, CONTEST_STRING_NO_CONDITION_IMPROVE);
+}
+
+// The appeal works well if the user’s condition is good.
+static void ContestEffect_BetterWithGoodCondition(void)
+{
+ sContestantStatus[shared192D0.contestant].appealTripleCondition = TRUE;
+ if (sContestantStatus[shared192D0.contestant].condition != 0)
+ SetContestantEffectStringID(shared192D0.contestant, CONTEST_STRING_HOT_STATUS);
+ else
+ SetContestantEffectStringID(shared192D0.contestant, CONTEST_STRING_BAD_CONDITION_WEAK_APPEAL);
+}
+
+// The next appeal can be made earlier next turn.
+static void ContestEffect_NextAppealEarlier(void)
+{
+ s8 i;
+ s8 j;
+ u8 turnOrder[4];
+
+ if (sContest.turnNumber != 4)
+ {
+ for (i = 0; i < 4; i++)
+ turnOrder[i] = sContestantStatus[i].nextTurnOrder;
+
+ turnOrder[shared192D0.contestant] = 0xFF;
+
+ for (i = 0; i < 4; i++)
+ {
+ for (j = 0; j < 4; j++)
+ {
+ if (j != shared192D0.contestant &&
+ i == turnOrder[j] &&
+ turnOrder[j] == sContestantStatus[j].nextTurnOrder)
+ {
+ turnOrder[j]++;
+ break;
+ }
+ }
+ if (j == 4)
+ break;
+ }
+
+ turnOrder[shared192D0.contestant] = 0;
+ sContestantStatus[shared192D0.contestant].turnOrderMod = 1;
+
+ for (i = 0; i < 4; i++)
+ {
+ sContestantStatus[i].nextTurnOrder = turnOrder[i];
+ }
+ sContestantStatus[shared192D0.contestant].turnOrderModAction = 1;
+ SetContestantEffectStringID(shared192D0.contestant, CONTEST_STRING_MOVE_UP_LINE);
+ }
+}
+
+// The next appeal can be made later next turn.
+static void ContestEffect_NextAppealLater(void)
+{
+ s8 i;
+ s8 j;
+ u8 turnOrder[4];
+
+ if (sContest.turnNumber != 4)
+ {
+ for (i = 0; i < 4; i++)
+ turnOrder[i] = sContestantStatus[i].nextTurnOrder;
+
+ turnOrder[shared192D0.contestant] = 0xFF;
+
+ for (i = 3; i > -1; i--)
+ {
+ for (j = 0; j < 4; j++)
+ {
+ if (j != shared192D0.contestant &&
+ i == turnOrder[j] &&
+ turnOrder[j] == sContestantStatus[j].nextTurnOrder)
+ {
+ turnOrder[j]--;
+ break;
+ }
+ }
+ if (j == 4)
+ break;
+ }
+
+ turnOrder[shared192D0.contestant] = 3;
+ sContestantStatus[shared192D0.contestant].turnOrderMod = 1;
+
+ for (i = 0; i < 4; i++)
+ {
+ sContestantStatus[i].nextTurnOrder = turnOrder[i];
+ }
+ sContestantStatus[shared192D0.contestant].turnOrderModAction = 2;
+ SetContestantEffectStringID(shared192D0.contestant, CONTEST_STRING_MOVE_BACK_LINE);
+ }
+}
+
+// Makes the next turn’s order more easily scrambled.
+static void ContestEffect_MakeScramblingTurnOrderEasier(void)
+{
+ // dummied out?
+}
+
+// Scrambles the order of appeals on the next turn.
+static void ContestEffect_ScrambleNextTurnOrder(void)
+{
+ s8 i;
+ s8 j;
+ u8 turnOrder[4];
+ u8 unselectedContestants[4];
+
+ if (sContest.turnNumber != 4)
+ {
+ for (i = 0; i < 4; i++)
+ {
+ turnOrder[i] = sContestantStatus[i].nextTurnOrder;
+ unselectedContestants[i] = i;
+ }
+
+ for (i = 0; i < 4; i++)
+ {
+ u8 rval = Random() % (4 - i);
+
+ for (j = 0; j < 4; j++)
+ {
+ if (unselectedContestants[j] != 0xFF)
+ {
+ if (rval == 0)
+ {
+ turnOrder[j] = i;
+ unselectedContestants[j] = 0xFF;
+ break;
+ }
+ else
+ rval--;
+ }
+ }
+ }
+
+ for (i = 0; i < 4; i++)
+ {
+ sContestantStatus[i].nextTurnOrder = turnOrder[i];
+ sContestantStatus[i].turnOrderMod = 2;
+ }
+ sContestantStatus[shared192D0.contestant].turnOrderModAction = 3;
+ SetContestantEffectStringID(shared192D0.contestant, CONTEST_STRING_SCRAMBLE_ORDER);
+ }
+}
+
+// An appeal that excites the audience in any CONTEST.
+static void ContestEffect_ExciteAudienceInAnyContest(void)
+{
+ if (gContestMoves[sContestantStatus[shared192D0.contestant].currMove].contestCategory != gSpecialVar_ContestCategory)
+ {
+ sContestantStatus[shared192D0.contestant].overrideCategoryExcitementMod = TRUE;
+ }
+}
+
+// Badly startles all POKéMON that made good appeals.
+static void ContestEffect_BadlyStartleMonsWithGoodAppeals(void)
+{
+ int i;
+ u8 numJammed = 0;
+
+ for (i = 0; i < 4; i++)
+ {
+ if (shared192D0.turnOrder[shared192D0.contestant] > shared192D0.turnOrder[i])
+ {
+ if (sContestantStatus[i].appeal2 > 0)
+ {
+ shared192D0.jam = sContestantStatus[i].appeal2 / 2;
+ shared192D0.jam = RoundUp(shared192D0.jam);
+ }
+ else
+ shared192D0.jam = 10;
+ shared192D0.jamQueue[0] = i;
+ shared192D0.jamQueue[1] = 0xFF;
+ if (WasAtLeastOneOpponentJammed())
+ numJammed++;
+ }
+ }
+ if (numJammed == 0)
+ SetContestantEffectStringID2(shared192D0.contestant, CONTEST_STRING_MESSED_UP2);
+ SetContestantEffectStringID(shared192D0.contestant, CONTEST_STRING_ATTEMPT_STARTLE);
+}
+
+// The appeal works best the more the crowd is excited.
+static void ContestEffect_BetterWhenAudienceExcited(void)
+{
+ s16 appeal;
+
+ if (sContest.applauseLevel == 0)
+ {
+ appeal = 10;
+ SetContestantEffectStringID(shared192D0.contestant, CONTEST_STRING_APPEAL_NOT_VERY_WELL);
+ }
+ else if (sContest.applauseLevel == 1)
+ {
+ appeal = 20;
+ SetContestantEffectStringID(shared192D0.contestant, CONTEST_STRING_APPEAL_SLIGHTLY_WELL2);
+ }
+ else if (sContest.applauseLevel == 2)
+ {
+ appeal = 30;
+ SetContestantEffectStringID(shared192D0.contestant, CONTEST_STRING_APPEAL_PRETTY_WELL2);
+ }
+ else if (sContest.applauseLevel == 3)
+ {
+ appeal = 50;
+ SetContestantEffectStringID(shared192D0.contestant, CONTEST_STRING_APPEAL_VERY_WELL);
+ }
+ else
+ {
+ appeal = 60;
+ SetContestantEffectStringID(shared192D0.contestant, CONTEST_STRING_APPEAL_EXCELLENTLY2);
+ }
+ sContestantStatus[shared192D0.contestant].appeal2 = appeal;
+}
+
+// Temporarily stops the crowd from growing excited.
+static void ContestEffect_DontExciteAudience(void)
+{
+ if (!shared19328.excitementFrozen)
+ {
+ shared19328.excitementFrozen = TRUE;
+ shared19328.excitementFreezer = shared192D0.contestant;
+ SetContestantEffectStringID(shared192D0.contestant, CONTEST_STRING_ATTRACTED_ATTENTION);
+ }
+}
+
+static void JamByMoveCategory(u8 category)
+{
+ int i;
+ int numJammed = 0;
+
+ for (i = 0; i < 4; i++)
+ {
+ if (shared192D0.turnOrder[shared192D0.contestant] > shared192D0.turnOrder[i])
+ {
+ if (category == gContestMoves[sContestantStatus[i].currMove].contestCategory)
+ shared192D0.jam = 40;
+ else
+ shared192D0.jam = 10;
+ shared192D0.jamQueue[0] = i;
+ shared192D0.jamQueue[1] = 0xFF;
+ if (WasAtLeastOneOpponentJammed())
+ numJammed++;
+ }
+ }
+
+ if (numJammed == 0)
+ SetContestantEffectStringID2(shared192D0.contestant, CONTEST_STRING_MESSED_UP2);
+}
+
+static bool8 CanUnnerveContestant(u8 i)
+{
+ shared192D0.unnervedPokes[i] = 1;
+ if (sContestantStatus[i].immune)
+ {
+ SetContestantEffectStringID(i, CONTEST_STRING_AVOID_SEEING);
+ return FALSE;
+ }
+ else if (sContestantStatus[i].jamSafetyCount != 0)
+ {
+ sContestantStatus[i].jamSafetyCount--;
+ SetContestantEffectStringID(i, CONTEST_STRING_AVERT_GAZE);
+ return FALSE;
+ }
+ else if (!sContestantStatus[i].noMoreTurns && sContestantStatus[i].numTurnsSkipped == 0)
+ {
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+static bool8 WasAtLeastOneOpponentJammed(void)
+{
+ s16 jamBuffer[4] = {0};
+ int i;
+
+ for (i = 0; shared192D0.jamQueue[i] != 0xFF; i++)
+ {
+ u8 contestant = shared192D0.jamQueue[i];
+ if (CanUnnerveContestant(contestant))
+ {
+ shared192D0.jam2 = shared192D0.jam;
+ if (sContestantStatus[contestant].moreEasilyStartled)
+ shared192D0.jam2 *= 2;
+ if (sContestantStatus[contestant].resistant)
+ {
+ shared192D0.jam2 = 10;
+ SetContestantEffectStringID(contestant, CONTEST_STRING_LITTLE_DISTRACTED);
+ }
+ else if ((shared192D0.jam2 -= sContestantStatus[contestant].jamReduction) <= 0)
+ {
+ shared192D0.jam2 = 0;
+ SetContestantEffectStringID(contestant, CONTEST_STRING_NOT_FAZED);
+ }
+ else
+ {
+ JamContestant(contestant, shared192D0.jam2);
+ SetStartledString(contestant, shared192D0.jam2);
+ jamBuffer[contestant] = shared192D0.jam2;
+ }
+ }
+ }
+
+ for (i = 0; i < 4; i++)
+ {
+ if (jamBuffer[i] != 0)
+ return TRUE;
+ }
+ return FALSE;
+}
+
+static void JamContestant(u8 i, u8 jam)
+{
+ sContestantStatus[i].appeal2 -= jam;
+ sContestantStatus[i].jam += jam;
+}
+
+static s16 RoundTowardsZero(s16 score)
+{
+ s16 absScore = abs(score) % 10;
+ if (score < 0)
+ {
+ if (absScore != 0)
+ score -= 10 - absScore;
+ }
+ else
+ score -= absScore;
+ return score;
+}
+
+static s16 RoundUp(s16 score)
+{
+ s16 absScore = abs(score) % 10;
+ if (absScore != 0)
+ score += 10 - absScore;
+ return score;
+}
diff --git a/src/data/contest_moves.h b/src/data/contest_moves.h
new file mode 100644
index 000000000..9d269e789
--- /dev/null
+++ b/src/data/contest_moves.h
@@ -0,0 +1,532 @@
+#ifndef POKERUBY_CONTEST_MOVES_H
+#define POKERUBY_CONTEST_MOVES_H
+
+const struct ContestMove gContestMoves[] = {
+ {CONTEST_EFFECT_HIGHLY_APPEALING, CONTEST_CATEGORY_COOL, 0, {0, 0, 0, 0}}, // NONE
+ {CONTEST_EFFECT_HIGHLY_APPEALING, CONTEST_CATEGORY_TOUGH, COMBO_STARTER_POUND, {0, 0, 0, 0}}, // POUND
+ {CONTEST_EFFECT_AFFECTED_BY_PREV_APPEAL, CONTEST_CATEGORY_TOUGH, 0, {COMBO_STARTER_FOCUS_ENERGY, 0, 0, 0}}, // KARATE_CHOP
+ {CONTEST_EFFECT_STARTLE_MON_WITH_JUDGES_ATTENTION, CONTEST_CATEGORY_TOUGH, 0, {COMBO_STARTER_POUND, 0, 0, 0}}, // DOUBLE_SLAP
+ {CONTEST_EFFECT_BETTER_IF_SAME_TYPE, CONTEST_CATEGORY_TOUGH, 0, {0, 0, 0, 0}}, // COMET_PUNCH
+ {CONTEST_EFFECT_HIGHLY_APPEALING, CONTEST_CATEGORY_TOUGH, 0, {COMBO_STARTER_FOCUS_ENERGY, COMBO_STARTER_MIND_READER, 0, 0}}, // MEGA_PUNCH
+ {CONTEST_EFFECT_BETTER_WHEN_AUDIENCE_EXCITED, CONTEST_CATEGORY_SMART, 0, {0, 0, 0, 0}}, // PAY_DAY
+ {CONTEST_EFFECT_HIGHLY_APPEALING, CONTEST_CATEGORY_BEAUTY, COMBO_STARTER_FIRE_PUNCH, {COMBO_STARTER_SUNNY_DAY, COMBO_STARTER_THUNDER_PUNCH, COMBO_STARTER_ICE_PUNCH, 0}}, // FIRE_PUNCH
+ {CONTEST_EFFECT_HIGHLY_APPEALING, CONTEST_CATEGORY_BEAUTY, COMBO_STARTER_ICE_PUNCH, {COMBO_STARTER_THUNDER_PUNCH, COMBO_STARTER_FIRE_PUNCH, 0, 0}}, // ICE_PUNCH
+ {CONTEST_EFFECT_HIGHLY_APPEALING, CONTEST_CATEGORY_COOL, COMBO_STARTER_THUNDER_PUNCH, {COMBO_STARTER_CHARGE, COMBO_STARTER_FIRE_PUNCH, COMBO_STARTER_ICE_PUNCH, 0}}, // THUNDER_PUNCH
+ {CONTEST_EFFECT_HIGHLY_APPEALING, CONTEST_CATEGORY_TOUGH, COMBO_STARTER_SCRATCH, {COMBO_STARTER_LEER, 0, 0, 0}}, // SCRATCH
+ {CONTEST_EFFECT_HIGHLY_APPEALING, CONTEST_CATEGORY_TOUGH, COMBO_STARTER_VICE_GRIP, {0, 0, 0, 0}}, // VICE_GRIP
+ {CONTEST_EFFECT_BADLY_STARTLE_MONS_WITH_GOOD_APPEALS, CONTEST_CATEGORY_COOL, 0, {COMBO_STARTER_VICE_GRIP, 0, 0, 0}}, // GUILLOTINE
+ {CONTEST_EFFECT_AFFECTED_BY_PREV_APPEAL, CONTEST_CATEGORY_COOL, 0, {0, 0, 0, 0}}, // RAZOR_WIND
+ {CONTEST_EFFECT_IMPROVE_CONDITION_PREVENT_NERVOUSNESS, CONTEST_CATEGORY_BEAUTY, COMBO_STARTER_SWORDS_DANCE, {0, 0, 0, 0}}, // SWORDS_DANCE
+ {CONTEST_EFFECT_BADLY_STARTLE_MONS_WITH_GOOD_APPEALS, CONTEST_CATEGORY_COOL, 0, {COMBO_STARTER_SWORDS_DANCE, 0, 0, 0}}, // CUT
+ {CONTEST_EFFECT_SCRAMBLE_NEXT_TURN_ORDER, CONTEST_CATEGORY_SMART, 0, {0, 0, 0, 0}}, // GUST
+ {CONTEST_EFFECT_BETTER_IF_SAME_TYPE, CONTEST_CATEGORY_COOL, 0, {0, 0, 0, 0}}, // WING_ATTACK
+ {CONTEST_EFFECT_SCRAMBLE_NEXT_TURN_ORDER, CONTEST_CATEGORY_SMART, 0, {0, 0, 0, 0}}, // WHIRLWIND
+ {CONTEST_EFFECT_AVOID_STARTLE, CONTEST_CATEGORY_SMART, 0, {0, 0, 0, 0}}, // FLY
+ {CONTEST_EFFECT_DONT_EXCITE_AUDIENCE, CONTEST_CATEGORY_TOUGH, 0, {COMBO_STARTER_VICE_GRIP, 0, 0, 0}}, // BIND
+ {CONTEST_EFFECT_STARTLE_MONS_SAME_TYPE_APPEAL, CONTEST_CATEGORY_TOUGH, 0, {COMBO_STARTER_POUND, 0, 0, 0}}, // SLAM
+ {CONTEST_EFFECT_HIGHLY_APPEALING, CONTEST_CATEGORY_COOL, 0, {COMBO_STARTER_GROWTH, 0, 0, 0}}, // VINE_WHIP
+ {CONTEST_EFFECT_BADLY_STARTLE_FRONT_MON, CONTEST_CATEGORY_TOUGH, 0, {0, COMBO_STARTER_LEER, 0, 0}}, // STOMP
+ {CONTEST_EFFECT_BETTER_IF_SAME_TYPE, CONTEST_CATEGORY_COOL, 0, {0, 0, 0, 0}}, // DOUBLE_KICK
+ {CONTEST_EFFECT_HIGHLY_APPEALING, CONTEST_CATEGORY_COOL, 0, {COMBO_STARTER_FOCUS_ENERGY, COMBO_STARTER_MIND_READER, 0, 0}}, // MEGA_KICK
+ {CONTEST_EFFECT_USER_MORE_EASILY_STARTLED, CONTEST_CATEGORY_COOL, 0, {COMBO_STARTER_MIND_READER, 0, 0, 0}}, // JUMP_KICK
+ {CONTEST_EFFECT_BADLY_STARTLE_PREV_MONS, CONTEST_CATEGORY_COOL, 0, {0, 0, 0, 0}}, // ROLLING_KICK
+ {CONTEST_EFFECT_STARTLE_MON_WITH_JUDGES_ATTENTION, CONTEST_CATEGORY_CUTE, COMBO_STARTER_SAND_ATTACK, {COMBO_STARTER_MUD_SLAP, COMBO_STARTER_SANDSTORM, 0, 0}}, // SAND_ATTACK
+ {CONTEST_EFFECT_STARTLE_PREV_MON, CONTEST_CATEGORY_TOUGH, 0, {COMBO_STARTER_FOCUS_ENERGY, 0, 0, 0}}, // HEADBUTT
+ {CONTEST_EFFECT_HIGHLY_APPEALING, CONTEST_CATEGORY_COOL, COMBO_STARTER_HORN_ATTACK, {COMBO_STARTER_LEER, 0, 0, 0}}, // HORN_ATTACK
+ {CONTEST_EFFECT_STARTLE_MON_WITH_JUDGES_ATTENTION, CONTEST_CATEGORY_COOL, 0, {COMBO_STARTER_HORN_ATTACK, COMBO_STARTER_PECK, 0, 0}}, // FURY_ATTACK
+ {CONTEST_EFFECT_BADLY_STARTLE_MONS_WITH_GOOD_APPEALS, CONTEST_CATEGORY_COOL, 0, {COMBO_STARTER_HORN_ATTACK, 0, 0, 0}}, // HORN_DRILL
+ {CONTEST_EFFECT_HIGHLY_APPEALING, CONTEST_CATEGORY_TOUGH, 0, {COMBO_STARTER_DEFENSE_CURL, COMBO_STARTER_LEER, COMBO_STARTER_HARDEN, 0}}, // TACKLE
+ {CONTEST_EFFECT_BADLY_STARTLE_FRONT_MON, CONTEST_CATEGORY_TOUGH, 0, {0, 0, 0, 0}}, // BODY_SLAM
+ {CONTEST_EFFECT_DONT_EXCITE_AUDIENCE, CONTEST_CATEGORY_TOUGH, 0, {0, 0, 0, 0}}, // WRAP
+ {CONTEST_EFFECT_USER_MORE_EASILY_STARTLED, CONTEST_CATEGORY_TOUGH, 0, {COMBO_STARTER_FOCUS_ENERGY, COMBO_STARTER_HARDEN, 0, 0}}, // TAKE_DOWN
+ {CONTEST_EFFECT_JAMS_OTHERS_BUT_MISS_ONE_TURN, CONTEST_CATEGORY_TOUGH, 0, {COMBO_STARTER_RAGE, 0, 0, 0}}, // THRASH
+ {CONTEST_EFFECT_USER_MORE_EASILY_STARTLED, CONTEST_CATEGORY_TOUGH, 0, {COMBO_STARTER_FOCUS_ENERGY, COMBO_STARTER_HARDEN, 0, 0}}, // DOUBLE_EDGE
+ {CONTEST_EFFECT_BETTER_IF_LAST, CONTEST_CATEGORY_CUTE, 0, {COMBO_STARTER_CHARM, 0, 0, 0}}, // TAIL_WHIP
+ {CONTEST_EFFECT_STARTLE_PREV_MON, CONTEST_CATEGORY_SMART, 0, {0, 0, 0, 0}}, // POISON_STING
+ {CONTEST_EFFECT_STARTLE_PREV_MON, CONTEST_CATEGORY_COOL, 0, {0, 0, 0, 0}}, // TWINEEDLE
+ {CONTEST_EFFECT_STARTLE_MON_WITH_JUDGES_ATTENTION, CONTEST_CATEGORY_COOL, 0, {0, 0, 0, 0}}, // PIN_MISSILE
+ {CONTEST_EFFECT_DONT_EXCITE_AUDIENCE, CONTEST_CATEGORY_COOL, COMBO_STARTER_LEER, {COMBO_STARTER_RAGE, COMBO_STARTER_SCARY_FACE, 0, 0}}, // LEER
+ {CONTEST_EFFECT_BADLY_STARTLE_PREV_MONS, CONTEST_CATEGORY_TOUGH, 0, {COMBO_STARTER_LEER, COMBO_STARTER_SCARY_FACE, 0, 0}}, // BITE
+ {CONTEST_EFFECT_BETTER_IF_LAST, CONTEST_CATEGORY_CUTE, 0, {COMBO_STARTER_CHARM, 0, 0, 0}}, // GROWL
+ {CONTEST_EFFECT_SCRAMBLE_NEXT_TURN_ORDER, CONTEST_CATEGORY_COOL, 0, {0, 0, 0, 0}}, // ROAR
+ {CONTEST_EFFECT_MAKE_FOLLOWING_MONS_NERVOUS, CONTEST_CATEGORY_CUTE, COMBO_STARTER_SING, {0, 0, 0, 0}}, // SING
+ {CONTEST_EFFECT_SCRAMBLE_NEXT_TURN_ORDER, CONTEST_CATEGORY_SMART, 0, {0, 0, 0, 0}}, // SUPERSONIC
+ {CONTEST_EFFECT_BETTER_IF_SAME_TYPE, CONTEST_CATEGORY_COOL, 0, {0, 0, 0, 0}}, // SONIC_BOOM
+ {CONTEST_EFFECT_MAKE_FOLLOWING_MONS_NERVOUS, CONTEST_CATEGORY_SMART, 0, {0, 0, 0, 0}}, // DISABLE
+ {CONTEST_EFFECT_BADLY_STARTLE_FRONT_MON, CONTEST_CATEGORY_SMART, 0, {0, 0, 0, 0}}, // ACID
+ {CONTEST_EFFECT_HIGHLY_APPEALING, CONTEST_CATEGORY_BEAUTY, 0, {COMBO_STARTER_SUNNY_DAY, 0, 0, 0}}, // EMBER
+ {CONTEST_EFFECT_HIGHLY_APPEALING, CONTEST_CATEGORY_BEAUTY, 0, {COMBO_STARTER_SUNNY_DAY, 0, 0, 0}}, // FLAMETHROWER
+ {CONTEST_EFFECT_AVOID_STARTLE, CONTEST_CATEGORY_BEAUTY, 0, {0, 0, 0, 0}}, // MIST
+ {CONTEST_EFFECT_HIGHLY_APPEALING, CONTEST_CATEGORY_CUTE, 0, {COMBO_STARTER_RAIN_DANCE, COMBO_STARTER_WATER_SPORT, COMBO_STARTER_MUD_SPORT, 0}}, // WATER_GUN
+ {CONTEST_EFFECT_HIGHLY_APPEALING, CONTEST_CATEGORY_BEAUTY, 0, {COMBO_STARTER_RAIN_DANCE, 0, 0, 0}}, // HYDRO_PUMP
+ {CONTEST_EFFECT_AFFECTED_BY_PREV_APPEAL, CONTEST_CATEGORY_BEAUTY, COMBO_STARTER_SURF, {COMBO_STARTER_RAIN_DANCE, COMBO_STARTER_DIVE, 0, 0}}, // SURF
+ {CONTEST_EFFECT_STARTLE_MONS_SAME_TYPE_APPEAL, CONTEST_CATEGORY_BEAUTY, 0, {0, 0, 0, 0}}, // ICE_BEAM
+ {CONTEST_EFFECT_HIGHLY_APPEALING, CONTEST_CATEGORY_BEAUTY, 0, {COMBO_STARTER_POWDER_SNOW, COMBO_STARTER_HAIL, 0, 0}}, // BLIZZARD
+ {CONTEST_EFFECT_SCRAMBLE_NEXT_TURN_ORDER, CONTEST_CATEGORY_BEAUTY, 0, {COMBO_STARTER_CALM_MIND, 0, 0, 0}}, // PSYBEAM
+ {CONTEST_EFFECT_BADLY_STARTLE_PREV_MONS, CONTEST_CATEGORY_BEAUTY, 0, {COMBO_STARTER_RAIN_DANCE, 0, 0, 0}}, // BUBBLE_BEAM
+ {CONTEST_EFFECT_STARTLE_MONS_SAME_TYPE_APPEAL, CONTEST_CATEGORY_BEAUTY, 0, {0, 0, 0, 0}}, // AURORA_BEAM
+ {CONTEST_EFFECT_JAMS_OTHERS_BUT_MISS_ONE_TURN, CONTEST_CATEGORY_COOL, 0, {0, 0, 0, 0}}, // HYPER_BEAM
+ {CONTEST_EFFECT_HIGHLY_APPEALING, CONTEST_CATEGORY_COOL, COMBO_STARTER_PECK, {0, 0, 0, 0}}, // PECK
+ {CONTEST_EFFECT_HIGHLY_APPEALING, CONTEST_CATEGORY_COOL, 0, {COMBO_STARTER_PECK, 0, 0, 0}}, // DRILL_PECK
+ {CONTEST_EFFECT_USER_MORE_EASILY_STARTLED, CONTEST_CATEGORY_COOL, 0, {COMBO_STARTER_MIND_READER, 0, 0, 0}}, // SUBMISSION
+ {CONTEST_EFFECT_BADLY_STARTLE_FRONT_MON, CONTEST_CATEGORY_TOUGH, 0, {0, 0, 0, 0}}, // LOW_KICK
+ {CONTEST_EFFECT_AVOID_STARTLE_ONCE, CONTEST_CATEGORY_TOUGH, 0, {COMBO_STARTER_TAUNT, 0, 0, 0}}, // COUNTER
+ {CONTEST_EFFECT_STARTLE_MONS_SAME_TYPE_APPEAL, CONTEST_CATEGORY_TOUGH, 0, {COMBO_STARTER_FAKE_OUT, 0, 0, 0}}, // SEISMIC_TOSS
+ {CONTEST_EFFECT_STARTLE_MONS_SAME_TYPE_APPEAL, CONTEST_CATEGORY_TOUGH, 0, {0, 0, 0, 0}}, // STRENGTH
+ {CONTEST_EFFECT_STARTLE_PREV_MON, CONTEST_CATEGORY_SMART, 0, {COMBO_STARTER_GROWTH, 0, 0, 0}}, // ABSORB
+ {CONTEST_EFFECT_BADLY_STARTLE_FRONT_MON, CONTEST_CATEGORY_SMART, 0, {COMBO_STARTER_GROWTH, 0, 0, 0}}, // MEGA_DRAIN
+ {CONTEST_EFFECT_STARTLE_PREV_MONS, CONTEST_CATEGORY_SMART, 0, {0, 0, 0, 0}}, // LEECH_SEED
+ {CONTEST_EFFECT_IMPROVE_CONDITION_PREVENT_NERVOUSNESS, CONTEST_CATEGORY_BEAUTY, COMBO_STARTER_GROWTH, {0, 0, 0, 0}}, // GROWTH
+ {CONTEST_EFFECT_AFFECTED_BY_PREV_APPEAL, CONTEST_CATEGORY_COOL, 0, {COMBO_STARTER_GROWTH, 0, 0, 0}}, // RAZOR_LEAF
+ {CONTEST_EFFECT_HIGHLY_APPEALING, CONTEST_CATEGORY_COOL, 0, {COMBO_STARTER_SUNNY_DAY, COMBO_STARTER_GROWTH, 0, 0}}, // SOLAR_BEAM
+ {CONTEST_EFFECT_WORSEN_CONDITION_OF_PREV_MONS, CONTEST_CATEGORY_SMART, 0, {COMBO_STARTER_SWEET_SCENT, 0, 0, 0}}, // POISON_POWDER
+ {CONTEST_EFFECT_BADLY_STARTLE_MONS_WITH_GOOD_APPEALS, CONTEST_CATEGORY_SMART, 0, {COMBO_STARTER_SWEET_SCENT, 0, 0, 0}}, // STUN_SPORE
+ {CONTEST_EFFECT_BADLY_STARTLE_PREV_MONS, CONTEST_CATEGORY_SMART, 0, {COMBO_STARTER_SWEET_SCENT, 0, 0, 0}}, // SLEEP_POWDER
+ {CONTEST_EFFECT_JAMS_OTHERS_BUT_MISS_ONE_TURN, CONTEST_CATEGORY_BEAUTY, 0, {COMBO_STARTER_GROWTH, 0, 0, 0}}, // PETAL_DANCE
+ {CONTEST_EFFECT_STARTLE_PREV_MON, CONTEST_CATEGORY_SMART, COMBO_STARTER_STRING_SHOT, {0, 0, 0, 0}}, // STRING_SHOT
+ {CONTEST_EFFECT_BETTER_WHEN_LATER, CONTEST_CATEGORY_COOL, COMBO_STARTER_DRAGON_RAGE, {COMBO_STARTER_DRAGON_BREATH, COMBO_STARTER_DRAGON_DANCE, 0, 0}}, // DRAGON_RAGE
+ {CONTEST_EFFECT_DONT_EXCITE_AUDIENCE, CONTEST_CATEGORY_BEAUTY, 0, {COMBO_STARTER_SUNNY_DAY, 0, 0, 0}}, // FIRE_SPIN
+ {CONTEST_EFFECT_HIGHLY_APPEALING, CONTEST_CATEGORY_COOL, 0, {COMBO_STARTER_CHARGE, 0, 0, 0}}, // THUNDER_SHOCK
+ {CONTEST_EFFECT_HIGHLY_APPEALING, CONTEST_CATEGORY_COOL, 0, {COMBO_STARTER_CHARGE, 0, 0, 0}}, // THUNDERBOLT
+ {CONTEST_EFFECT_BADLY_STARTLE_MONS_WITH_GOOD_APPEALS, CONTEST_CATEGORY_COOL, 0, {COMBO_STARTER_CHARGE, 0, 0, 0}}, // THUNDER_WAVE
+ {CONTEST_EFFECT_STARTLE_PREV_MONS, CONTEST_CATEGORY_COOL, 0, {COMBO_STARTER_CHARGE, COMBO_STARTER_RAIN_DANCE, COMBO_STARTER_LOCK_ON, 0}}, // THUNDER
+ {CONTEST_EFFECT_BETTER_IF_SAME_TYPE, CONTEST_CATEGORY_TOUGH, COMBO_STARTER_ROCK_THROW, {0, 0, 0, 0}}, // ROCK_THROW
+ {CONTEST_EFFECT_BADLY_STARTLE_PREV_MONS, CONTEST_CATEGORY_TOUGH, COMBO_STARTER_EARTHQUAKE, {0, 0, 0, 0}}, // EARTHQUAKE
+ {CONTEST_EFFECT_BADLY_STARTLE_MONS_WITH_GOOD_APPEALS, CONTEST_CATEGORY_TOUGH, 0, {COMBO_STARTER_EARTHQUAKE, 0, 0, 0}}, // FISSURE
+ {CONTEST_EFFECT_AVOID_STARTLE, CONTEST_CATEGORY_SMART, 0, {0, 0, 0, 0}}, // DIG
+ {CONTEST_EFFECT_WORSEN_CONDITION_OF_PREV_MONS, CONTEST_CATEGORY_SMART, 0, {0, 0, 0, 0}}, // TOXIC
+ {CONTEST_EFFECT_STARTLE_PREV_MON, CONTEST_CATEGORY_SMART, COMBO_STARTER_CONFUSION, {COMBO_STARTER_PSYCHIC, COMBO_STARTER_KINESIS, COMBO_STARTER_CALM_MIND, 0}}, // CONFUSION
+ {CONTEST_EFFECT_BADLY_STARTLE_PREV_MONS, CONTEST_CATEGORY_SMART, COMBO_STARTER_PSYCHIC, {COMBO_STARTER_KINESIS, COMBO_STARTER_CONFUSION, COMBO_STARTER_CALM_MIND, 0}}, // PSYCHIC
+ {CONTEST_EFFECT_BADLY_STARTLE_PREV_MONS, CONTEST_CATEGORY_SMART, COMBO_STARTER_HYPNOSIS, {0, 0, 0, 0}}, // HYPNOSIS
+ {CONTEST_EFFECT_IMPROVE_CONDITION_PREVENT_NERVOUSNESS, CONTEST_CATEGORY_BEAUTY, 0, {COMBO_STARTER_CALM_MIND, 0, 0, 0}}, // MEDITATE
+ {CONTEST_EFFECT_NEXT_APPEAL_EARLIER, CONTEST_CATEGORY_COOL, 0, {COMBO_STARTER_DOUBLE_TEAM, 0, 0, 0}}, // AGILITY
+ {CONTEST_EFFECT_NEXT_APPEAL_EARLIER, CONTEST_CATEGORY_COOL, 0, {COMBO_STARTER_DOUBLE_TEAM, 0, 0, 0}}, // QUICK_ATTACK
+ {CONTEST_EFFECT_REPETITION_NOT_BORING, CONTEST_CATEGORY_COOL, COMBO_STARTER_RAGE, {0, 0, 0, 0}}, // RAGE
+ {CONTEST_EFFECT_AVOID_STARTLE, CONTEST_CATEGORY_COOL, 0, {COMBO_STARTER_DOUBLE_TEAM, COMBO_STARTER_PSYCHIC, COMBO_STARTER_KINESIS, COMBO_STARTER_CONFUSION}}, // TELEPORT
+ {CONTEST_EFFECT_STARTLE_MONS_SAME_TYPE_APPEAL, CONTEST_CATEGORY_SMART, 0, {0, 0, 0, 0}}, // NIGHT_SHADE
+ {CONTEST_EFFECT_APPEAL_AS_GOOD_AS_PREV_ONE, CONTEST_CATEGORY_CUTE, 0, {0, 0, 0, 0}}, // MIMIC
+ {CONTEST_EFFECT_BADLY_STARTLE_PREV_MONS, CONTEST_CATEGORY_SMART, 0, {0, 0, 0, 0}}, // SCREECH
+ {CONTEST_EFFECT_AVOID_STARTLE_ONCE, CONTEST_CATEGORY_COOL, COMBO_STARTER_DOUBLE_TEAM, {0, 0, 0, 0}}, // DOUBLE_TEAM
+ {CONTEST_EFFECT_STARTLE_MONS_SAME_TYPE_APPEAL, CONTEST_CATEGORY_SMART, 0, {0, 0, 0, 0}}, // RECOVER
+ {CONTEST_EFFECT_AVOID_STARTLE_ONCE, CONTEST_CATEGORY_TOUGH, COMBO_STARTER_HARDEN, {0, 0, 0, 0}}, // HARDEN
+ {CONTEST_EFFECT_AVOID_STARTLE_ONCE, CONTEST_CATEGORY_CUTE, 0, {0, 0, 0, 0}}, // MINIMIZE
+ {CONTEST_EFFECT_SHIFT_JUDGE_ATTENTION, CONTEST_CATEGORY_SMART, 0, {COMBO_STARTER_SMOG, 0, 0, 0}}, // SMOKESCREEN
+ {CONTEST_EFFECT_SCRAMBLE_NEXT_TURN_ORDER, CONTEST_CATEGORY_SMART, 0, {0, 0, 0, 0}}, // CONFUSE_RAY
+ {CONTEST_EFFECT_AVOID_STARTLE, CONTEST_CATEGORY_CUTE, 0, {COMBO_STARTER_RAIN_DANCE, 0, 0, 0}}, // WITHDRAW
+ {CONTEST_EFFECT_AVOID_STARTLE_ONCE, CONTEST_CATEGORY_CUTE, COMBO_STARTER_DEFENSE_CURL, {0, 0, 0, 0}}, // DEFENSE_CURL
+ {CONTEST_EFFECT_AVOID_STARTLE, CONTEST_CATEGORY_COOL, 0, {0, 0, 0, 0}}, // BARRIER
+ {CONTEST_EFFECT_AVOID_STARTLE, CONTEST_CATEGORY_BEAUTY, 0, {COMBO_STARTER_CALM_MIND, 0, 0, 0}}, // LIGHT_SCREEN
+ {CONTEST_EFFECT_WORSEN_CONDITION_OF_PREV_MONS, CONTEST_CATEGORY_BEAUTY, 0, {0, 0, 0, 0}}, // HAZE
+ {CONTEST_EFFECT_AVOID_STARTLE, CONTEST_CATEGORY_SMART, 0, {COMBO_STARTER_CALM_MIND, 0, 0, 0}}, // REFLECT
+ {CONTEST_EFFECT_BADLY_STARTLE_PREV_MONS, CONTEST_CATEGORY_COOL, COMBO_STARTER_FOCUS_ENERGY, {0, 0, 0, 0}}, // FOCUS_ENERGY
+ {CONTEST_EFFECT_AVOID_STARTLE, CONTEST_CATEGORY_TOUGH, 0, {0, 0, 0, 0}}, // BIDE
+ {CONTEST_EFFECT_REPETITION_NOT_BORING, CONTEST_CATEGORY_CUTE, 0, {0, 0, 0, 0}}, // METRONOME
+ {CONTEST_EFFECT_APPEAL_AS_GOOD_AS_PREV_ONE, CONTEST_CATEGORY_SMART, 0, {0, 0, 0, 0}}, // MIRROR_MOVE
+ {CONTEST_EFFECT_GREAT_APPEAL_BUT_NO_MORE_MOVES, CONTEST_CATEGORY_BEAUTY, 0, {0, 0, 0, 0}}, // SELF_DESTRUCT
+ {CONTEST_EFFECT_HIGHLY_APPEALING, CONTEST_CATEGORY_TOUGH, 0, {COMBO_STARTER_SOFT_BOILED, 0, 0, 0}}, // EGG_BOMB
+ {CONTEST_EFFECT_BADLY_STARTLE_FRONT_MON, CONTEST_CATEGORY_TOUGH, 0, {0, 0, 0, 0}}, // LICK
+ {CONTEST_EFFECT_BADLY_STARTLE_PREV_MONS, CONTEST_CATEGORY_TOUGH, COMBO_STARTER_SMOG, {0, 0, 0, 0}}, // SMOG
+ {CONTEST_EFFECT_BADLY_STARTLE_FRONT_MON, CONTEST_CATEGORY_TOUGH, COMBO_STARTER_SLUDGE, {COMBO_STARTER_SLUDGE_BOMB, 0, 0, 0}}, // SLUDGE
+ {CONTEST_EFFECT_STARTLE_MON_WITH_JUDGES_ATTENTION, CONTEST_CATEGORY_TOUGH, COMBO_STARTER_BONE_CLUB, {COMBO_STARTER_BONEMERANG, COMBO_STARTER_BONE_RUSH, 0, 0}}, // BONE_CLUB
+ {CONTEST_EFFECT_HIGHLY_APPEALING, CONTEST_CATEGORY_BEAUTY, 0, {COMBO_STARTER_SUNNY_DAY, 0, 0, 0}}, // FIRE_BLAST
+ {CONTEST_EFFECT_BETTER_IF_LAST, CONTEST_CATEGORY_TOUGH, 0, {COMBO_STARTER_RAIN_DANCE, 0, 0, 0}}, // WATERFALL
+ {CONTEST_EFFECT_DONT_EXCITE_AUDIENCE, CONTEST_CATEGORY_TOUGH, 0, {COMBO_STARTER_RAIN_DANCE, 0, 0, 0}}, // CLAMP
+ {CONTEST_EFFECT_BETTER_IF_FIRST, CONTEST_CATEGORY_COOL, 0, {0, 0, 0, 0}}, // SWIFT
+ {CONTEST_EFFECT_BADLY_STARTLE_FRONT_MON, CONTEST_CATEGORY_TOUGH, 0, {0, 0, 0, 0}}, // SKULL_BASH
+ {CONTEST_EFFECT_STARTLE_MON_WITH_JUDGES_ATTENTION, CONTEST_CATEGORY_COOL, 0, {0, 0, 0, 0}}, // SPIKE_CANNON
+ {CONTEST_EFFECT_STARTLE_PREV_MON, CONTEST_CATEGORY_TOUGH, 0, {0, 0, 0, 0}}, // CONSTRICT
+ {CONTEST_EFFECT_IMPROVE_CONDITION_PREVENT_NERVOUSNESS, CONTEST_CATEGORY_CUTE, 0, {0, 0, 0, 0}}, // AMNESIA
+ {CONTEST_EFFECT_DONT_EXCITE_AUDIENCE, CONTEST_CATEGORY_SMART, COMBO_STARTER_KINESIS, {COMBO_STARTER_PSYCHIC, COMBO_STARTER_CONFUSION, 0, 0}}, // KINESIS
+ {CONTEST_EFFECT_HIGHLY_APPEALING, CONTEST_CATEGORY_BEAUTY, COMBO_STARTER_SOFT_BOILED, {0, 0, 0, 0}}, // SOFT_BOILED
+ {CONTEST_EFFECT_USER_MORE_EASILY_STARTLED, CONTEST_CATEGORY_COOL, 0, {COMBO_STARTER_MIND_READER, 0, 0, 0}}, // HI_JUMP_KICK
+ {CONTEST_EFFECT_BADLY_STARTLE_PREV_MONS, CONTEST_CATEGORY_TOUGH, 0, {COMBO_STARTER_LEER, 0, 0, 0}}, // GLARE
+ {CONTEST_EFFECT_STARTLE_PREV_MONS, CONTEST_CATEGORY_SMART, 0, {COMBO_STARTER_HYPNOSIS, COMBO_STARTER_CALM_MIND, 0, 0}}, // DREAM_EATER
+ {CONTEST_EFFECT_WORSEN_CONDITION_OF_PREV_MONS, CONTEST_CATEGORY_SMART, 0, {0, 0, 0, 0}}, // POISON_GAS
+ {CONTEST_EFFECT_BETTER_IF_SAME_TYPE, CONTEST_CATEGORY_TOUGH, 0, {0, 0, 0, 0}}, // BARRAGE
+ {CONTEST_EFFECT_STARTLE_PREV_MON, CONTEST_CATEGORY_SMART, 0, {0, 0, 0, 0}}, // LEECH_LIFE
+ {CONTEST_EFFECT_BADLY_STARTLE_PREV_MONS, CONTEST_CATEGORY_BEAUTY, 0, {0, 0, 0, 0}}, // LOVELY_KISS
+ {CONTEST_EFFECT_AFFECTED_BY_PREV_APPEAL, CONTEST_CATEGORY_COOL, 0, {0, 0, 0, 0}}, // SKY_ATTACK
+ {CONTEST_EFFECT_REPETITION_NOT_BORING, CONTEST_CATEGORY_SMART, 0, {0, 0, 0, 0}}, // TRANSFORM
+ {CONTEST_EFFECT_STARTLE_PREV_MONS, CONTEST_CATEGORY_CUTE, 0, {COMBO_STARTER_RAIN_DANCE, 0, 0, 0}}, // BUBBLE
+ {CONTEST_EFFECT_BADLY_STARTLE_FRONT_MON, CONTEST_CATEGORY_COOL, 0, {0, 0, 0, 0}}, // DIZZY_PUNCH
+ {CONTEST_EFFECT_BADLY_STARTLE_PREV_MONS, CONTEST_CATEGORY_BEAUTY, 0, {0, 0, 0, 0}}, // SPORE
+ {CONTEST_EFFECT_SHIFT_JUDGE_ATTENTION, CONTEST_CATEGORY_BEAUTY, 0, {0, 0, 0, 0}}, // FLASH
+ {CONTEST_EFFECT_BADLY_STARTLE_MONS_WITH_GOOD_APPEALS, CONTEST_CATEGORY_SMART, 0, {COMBO_STARTER_CALM_MIND, 0, 0, 0}}, // PSYWAVE
+ {CONTEST_EFFECT_BETTER_IF_LAST, CONTEST_CATEGORY_CUTE, 0, {0, 0, 0, 0}}, // SPLASH
+ {CONTEST_EFFECT_IMPROVE_CONDITION_PREVENT_NERVOUSNESS, CONTEST_CATEGORY_TOUGH, 0, {0, 0, 0, 0}}, // ACID_ARMOR
+ {CONTEST_EFFECT_AFFECTED_BY_PREV_APPEAL, CONTEST_CATEGORY_TOUGH, 0, {COMBO_STARTER_RAIN_DANCE, COMBO_STARTER_SWORDS_DANCE, 0, 0}}, // CRABHAMMER
+ {CONTEST_EFFECT_GREAT_APPEAL_BUT_NO_MORE_MOVES, CONTEST_CATEGORY_BEAUTY, 0, {0, 0, 0, 0}}, // EXPLOSION
+ {CONTEST_EFFECT_STARTLE_MON_WITH_JUDGES_ATTENTION, CONTEST_CATEGORY_TOUGH, 0, {COMBO_STARTER_SCRATCH, 0, 0, 0}}, // FURY_SWIPES
+ {CONTEST_EFFECT_HIGHLY_APPEALING, CONTEST_CATEGORY_TOUGH, COMBO_STARTER_BONEMERANG, {COMBO_STARTER_BONE_CLUB, COMBO_STARTER_BONE_RUSH, 0, 0}}, // BONEMERANG
+ {CONTEST_EFFECT_AVOID_STARTLE_ONCE, CONTEST_CATEGORY_CUTE, COMBO_STARTER_REST, {COMBO_STARTER_BELLY_DRUM, COMBO_STARTER_CHARM, COMBO_STARTER_YAWN, 0}}, // REST
+ {CONTEST_EFFECT_BADLY_STARTLE_PREV_MONS, CONTEST_CATEGORY_TOUGH, 0, {COMBO_STARTER_ROCK_THROW, 0, 0, 0}}, // ROCK_SLIDE
+ {CONTEST_EFFECT_BADLY_STARTLE_FRONT_MON, CONTEST_CATEGORY_COOL, 0, {0, 0, 0, 0}}, // HYPER_FANG
+ {CONTEST_EFFECT_IMPROVE_CONDITION_PREVENT_NERVOUSNESS, CONTEST_CATEGORY_CUTE, 0, {0, 0, 0, 0}}, // SHARPEN
+ {CONTEST_EFFECT_BETTER_IF_SAME_TYPE, CONTEST_CATEGORY_BEAUTY, 0, {0, 0, 0, 0}}, // CONVERSION
+ {CONTEST_EFFECT_STARTLE_PREV_MONS, CONTEST_CATEGORY_BEAUTY, 0, {COMBO_STARTER_LOCK_ON, 0, 0, 0}}, // TRI_ATTACK
+ {CONTEST_EFFECT_BADLY_STARTLE_MONS_WITH_GOOD_APPEALS, CONTEST_CATEGORY_TOUGH, 0, {COMBO_STARTER_SCARY_FACE, 0, 0, 0}}, // SUPER_FANG
+ {CONTEST_EFFECT_AFFECTED_BY_PREV_APPEAL, CONTEST_CATEGORY_COOL, 0, {COMBO_STARTER_SWORDS_DANCE, COMBO_STARTER_SCRATCH, 0, 0}}, // SLASH
+ {CONTEST_EFFECT_AVOID_STARTLE_ONCE, CONTEST_CATEGORY_SMART, 0, {0, 0, 0, 0}}, // SUBSTITUTE
+ {CONTEST_EFFECT_HIGHLY_APPEALING, CONTEST_CATEGORY_COOL, 0, {0, 0, 0, 0}}, // STRUGGLE
+ {CONTEST_EFFECT_APPEAL_AS_GOOD_AS_PREV_ONE, CONTEST_CATEGORY_SMART, 0, {0, 0, 0, 0}}, // SKETCH
+ {CONTEST_EFFECT_HIGHLY_APPEALING, CONTEST_CATEGORY_COOL, 0, {COMBO_STARTER_FOCUS_ENERGY, 0, 0, 0}}, // TRIPLE_KICK
+ {CONTEST_EFFECT_APPEAL_AS_GOOD_AS_PREV_ONES, CONTEST_CATEGORY_TOUGH, 0, {0, 0, 0, 0}}, // THIEF
+ {CONTEST_EFFECT_MAKE_FOLLOWING_MONS_NERVOUS, CONTEST_CATEGORY_SMART, 0, {COMBO_STARTER_STRING_SHOT, 0, 0, 0}}, // SPIDER_WEB
+ {CONTEST_EFFECT_DONT_EXCITE_AUDIENCE, CONTEST_CATEGORY_SMART, COMBO_STARTER_MIND_READER, {0, 0, 0, 0}}, // MIND_READER
+ {CONTEST_EFFECT_BADLY_STARTLE_PREV_MONS, CONTEST_CATEGORY_SMART, 0, {COMBO_STARTER_HYPNOSIS, 0, 0, 0}}, // NIGHTMARE
+ {CONTEST_EFFECT_HIGHLY_APPEALING, CONTEST_CATEGORY_BEAUTY, 0, {COMBO_STARTER_SUNNY_DAY, 0, 0, 0}}, // FLAME_WHEEL
+ {CONTEST_EFFECT_HIGHLY_APPEALING, CONTEST_CATEGORY_CUTE, 0, {COMBO_STARTER_REST, 0, 0, 0}}, // SNORE
+ {CONTEST_EFFECT_NEXT_APPEAL_LATER, CONTEST_CATEGORY_TOUGH, COMBO_STARTER_CURSE, {0, 0, 0, 0}}, // CURSE
+ {CONTEST_EFFECT_BETTER_WHEN_LATER, CONTEST_CATEGORY_CUTE, 0, {COMBO_STARTER_ENDURE, 0, 0, 0}}, // FLAIL
+ {CONTEST_EFFECT_BETTER_IF_SAME_TYPE, CONTEST_CATEGORY_BEAUTY, 0, {0, 0, 0, 0}}, // CONVERSION_2
+ {CONTEST_EFFECT_AFFECTED_BY_PREV_APPEAL, CONTEST_CATEGORY_COOL, 0, {0, 0, 0, 0}}, // AEROBLAST
+ {CONTEST_EFFECT_STARTLE_MON_WITH_JUDGES_ATTENTION, CONTEST_CATEGORY_BEAUTY, 0, {0, 0, 0, 0}}, // COTTON_SPORE
+ {CONTEST_EFFECT_BETTER_IF_LAST, CONTEST_CATEGORY_COOL, 0, {COMBO_STARTER_ENDURE, 0, 0, 0}}, // REVERSAL
+ {CONTEST_EFFECT_BETTER_WHEN_LATER, CONTEST_CATEGORY_TOUGH, 0, {COMBO_STARTER_CURSE, 0, 0, 0}}, // SPITE
+ {CONTEST_EFFECT_HIGHLY_APPEALING, CONTEST_CATEGORY_BEAUTY, COMBO_STARTER_POWDER_SNOW, {COMBO_STARTER_HAIL, 0, 0, 0}}, // POWDER_SNOW
+ {CONTEST_EFFECT_AVOID_STARTLE, CONTEST_CATEGORY_CUTE, 0, {COMBO_STARTER_HARDEN, 0, 0, 0}}, // PROTECT
+ {CONTEST_EFFECT_NEXT_APPEAL_EARLIER, CONTEST_CATEGORY_COOL, 0, {0, 0, 0, 0}}, // MACH_PUNCH
+ {CONTEST_EFFECT_STARTLE_MON_WITH_JUDGES_ATTENTION, CONTEST_CATEGORY_TOUGH, COMBO_STARTER_SCARY_FACE, {COMBO_STARTER_RAGE, COMBO_STARTER_LEER, 0, 0}}, // SCARY_FACE
+ {CONTEST_EFFECT_BETTER_IF_FIRST, CONTEST_CATEGORY_SMART, 0, {COMBO_STARTER_FAKE_OUT, COMBO_STARTER_LEER, COMBO_STARTER_POUND, 0}}, // FAINT_ATTACK
+ {CONTEST_EFFECT_MAKE_FOLLOWING_MONS_NERVOUS, CONTEST_CATEGORY_CUTE, 0, {COMBO_STARTER_CHARM, 0, 0, 0}}, // SWEET_KISS
+ {CONTEST_EFFECT_IMPROVE_CONDITION_PREVENT_NERVOUSNESS, CONTEST_CATEGORY_CUTE, COMBO_STARTER_BELLY_DRUM, {0, 0, 0, 0}}, // BELLY_DRUM
+ {CONTEST_EFFECT_STARTLE_MON_WITH_JUDGES_ATTENTION, CONTEST_CATEGORY_TOUGH, COMBO_STARTER_SLUDGE_BOMB, {COMBO_STARTER_SLUDGE, 0, 0, 0}}, // SLUDGE_BOMB
+ {CONTEST_EFFECT_STARTLE_MON_WITH_JUDGES_ATTENTION, CONTEST_CATEGORY_CUTE, COMBO_STARTER_MUD_SLAP, {COMBO_STARTER_SAND_ATTACK, COMBO_STARTER_MUD_SPORT, COMBO_STARTER_SANDSTORM, 0}}, // MUD_SLAP
+ {CONTEST_EFFECT_STARTLE_MON_WITH_JUDGES_ATTENTION, CONTEST_CATEGORY_TOUGH, 0, {COMBO_STARTER_RAIN_DANCE, COMBO_STARTER_LOCK_ON, 0, 0}}, // OCTAZOOKA
+ {CONTEST_EFFECT_MAKE_FOLLOWING_MONS_NERVOUS, CONTEST_CATEGORY_SMART, 0, {0, 0, 0, 0}}, // SPIKES
+ {CONTEST_EFFECT_HIGHLY_APPEALING, CONTEST_CATEGORY_COOL, 0, {COMBO_STARTER_LOCK_ON, 0, 0, 0}}, // ZAP_CANNON
+ {CONTEST_EFFECT_WORSEN_CONDITION_OF_PREV_MONS, CONTEST_CATEGORY_SMART, 0, {0, 0, 0, 0}}, // FORESIGHT
+ {CONTEST_EFFECT_GREAT_APPEAL_BUT_NO_MORE_MOVES, CONTEST_CATEGORY_SMART, 0, {COMBO_STARTER_MEAN_LOOK, COMBO_STARTER_CURSE, COMBO_STARTER_ENDURE, 0}}, // DESTINY_BOND
+ {CONTEST_EFFECT_BADLY_STARTLE_MONS_WITH_GOOD_APPEALS, CONTEST_CATEGORY_BEAUTY, 0, {COMBO_STARTER_MEAN_LOOK, COMBO_STARTER_SING, 0, 0}}, // PERISH_SONG
+ {CONTEST_EFFECT_BADLY_STARTLE_PREV_MONS, CONTEST_CATEGORY_BEAUTY, 0, {0, 0, 0, 0}}, // ICY_WIND
+ {CONTEST_EFFECT_AVOID_STARTLE_ONCE, CONTEST_CATEGORY_COOL, 0, {COMBO_STARTER_TAUNT, 0, 0, 0}}, // DETECT
+ {CONTEST_EFFECT_HIGHLY_APPEALING, CONTEST_CATEGORY_TOUGH, COMBO_STARTER_BONE_RUSH, {COMBO_STARTER_FOCUS_ENERGY, COMBO_STARTER_BONE_CLUB, COMBO_STARTER_BONEMERANG, 0}}, // BONE_RUSH
+ {CONTEST_EFFECT_DONT_EXCITE_AUDIENCE, CONTEST_CATEGORY_SMART, COMBO_STARTER_LOCK_ON, {0, 0, 0, 0}}, // LOCK_ON
+ {CONTEST_EFFECT_JAMS_OTHERS_BUT_MISS_ONE_TURN, CONTEST_CATEGORY_COOL, 0, {0, 0, 0, 0}}, // OUTRAGE
+ {CONTEST_EFFECT_SCRAMBLE_NEXT_TURN_ORDER, CONTEST_CATEGORY_TOUGH, COMBO_STARTER_SANDSTORM, {0, 0, 0, 0}}, // SANDSTORM
+ {CONTEST_EFFECT_STARTLE_MON_WITH_JUDGES_ATTENTION, CONTEST_CATEGORY_SMART, 0, {COMBO_STARTER_GROWTH, 0, 0, 0}}, // GIGA_DRAIN
+ {CONTEST_EFFECT_AVOID_STARTLE_ONCE, CONTEST_CATEGORY_TOUGH, COMBO_STARTER_ENDURE, {0, 0, 0, 0}}, // ENDURE
+ {CONTEST_EFFECT_STARTLE_MONS_SAME_TYPE_APPEAL, CONTEST_CATEGORY_CUTE, COMBO_STARTER_CHARM, {0, 0, 0, 0}}, // CHARM
+ {CONTEST_EFFECT_DONT_EXCITE_AUDIENCE, CONTEST_CATEGORY_TOUGH, 0, {COMBO_STARTER_DEFENSE_CURL, COMBO_STARTER_HARDEN, 0, 0}}, // ROLLOUT
+ {CONTEST_EFFECT_BADLY_STARTLE_PREV_MONS, CONTEST_CATEGORY_COOL, 0, {COMBO_STARTER_SWORDS_DANCE, 0, 0, 0}}, // FALSE_SWIPE
+ {CONTEST_EFFECT_BETTER_IF_FIRST, CONTEST_CATEGORY_CUTE, 0, {0, 0, 0, 0}}, // SWAGGER
+ {CONTEST_EFFECT_BETTER_IF_SAME_TYPE, CONTEST_CATEGORY_CUTE, 0, {0, 0, 0, 0}}, // MILK_DRINK
+ {CONTEST_EFFECT_BADLY_STARTLE_FRONT_MON, CONTEST_CATEGORY_COOL, 0, {COMBO_STARTER_CHARGE, 0, 0, 0}}, // SPARK
+ {CONTEST_EFFECT_REPETITION_NOT_BORING, CONTEST_CATEGORY_COOL, 0, {COMBO_STARTER_SWORDS_DANCE, 0, 0, 0}}, // FURY_CUTTER
+ {CONTEST_EFFECT_BETTER_IF_SAME_TYPE, CONTEST_CATEGORY_COOL, 0, {0, 0, 0, 0}}, // STEEL_WING
+ {CONTEST_EFFECT_MAKE_FOLLOWING_MONS_NERVOUS, CONTEST_CATEGORY_BEAUTY, COMBO_STARTER_MEAN_LOOK, {COMBO_STARTER_CURSE, 0, 0, 0}}, // MEAN_LOOK
+ {CONTEST_EFFECT_MAKE_FOLLOWING_MONS_NERVOUS, CONTEST_CATEGORY_CUTE, 0, {0, 0, 0, 0}}, // ATTRACT
+ {CONTEST_EFFECT_REPETITION_NOT_BORING, CONTEST_CATEGORY_CUTE, 0, {COMBO_STARTER_REST, 0, 0, 0}}, // SLEEP_TALK
+ {CONTEST_EFFECT_BETTER_IF_LAST, CONTEST_CATEGORY_BEAUTY, 0, {0, 0, 0, 0}}, // HEAL_BELL
+ {CONTEST_EFFECT_EXCITE_AUDIENCE_IN_ANY_CONTEST, CONTEST_CATEGORY_CUTE, 0, {0, 0, 0, 0}}, // RETURN
+ {CONTEST_EFFECT_REPETITION_NOT_BORING, CONTEST_CATEGORY_CUTE, 0, {0, 0, 0, 0}}, // PRESENT
+ {CONTEST_EFFECT_EXCITE_AUDIENCE_IN_ANY_CONTEST, CONTEST_CATEGORY_CUTE, 0, {0, 0, 0, 0}}, // FRUSTRATION
+ {CONTEST_EFFECT_AVOID_STARTLE, CONTEST_CATEGORY_BEAUTY, 0, {0, 0, 0, 0}}, // SAFEGUARD
+ {CONTEST_EFFECT_BADLY_STARTLE_FRONT_MON, CONTEST_CATEGORY_SMART, 0, {COMBO_STARTER_ENDURE, 0, 0, 0}}, // PAIN_SPLIT
+ {CONTEST_EFFECT_HIGHLY_APPEALING, CONTEST_CATEGORY_BEAUTY, 0, {COMBO_STARTER_SUNNY_DAY, 0, 0, 0}}, // SACRED_FIRE
+ {CONTEST_EFFECT_BETTER_WHEN_AUDIENCE_EXCITED, CONTEST_CATEGORY_TOUGH, 0, {0, 0, 0, 0}}, // MAGNITUDE
+ {CONTEST_EFFECT_STARTLE_MON_WITH_JUDGES_ATTENTION, CONTEST_CATEGORY_COOL, 0, {COMBO_STARTER_FOCUS_ENERGY, COMBO_STARTER_MIND_READER, 0, 0}}, // DYNAMIC_PUNCH
+ {CONTEST_EFFECT_BETTER_IF_SAME_TYPE, CONTEST_CATEGORY_COOL, 0, {0, 0, 0, 0}}, // MEGAHORN
+ {CONTEST_EFFECT_BADLY_STARTLE_PREV_MONS, CONTEST_CATEGORY_COOL, COMBO_STARTER_DRAGON_BREATH, {COMBO_STARTER_DRAGON_RAGE, COMBO_STARTER_DRAGON_DANCE, 0, 0}}, // DRAGON_BREATH
+ {CONTEST_EFFECT_MAKE_FOLLOWING_MONS_NERVOUS, CONTEST_CATEGORY_CUTE, 0, {0, 0, 0, 0}}, // BATON_PASS
+ {CONTEST_EFFECT_MAKE_FOLLOWING_MONS_NERVOUS, CONTEST_CATEGORY_CUTE, 0, {0, 0, 0, 0}}, // ENCORE
+ {CONTEST_EFFECT_BADLY_STARTLE_MONS_WITH_GOOD_APPEALS, CONTEST_CATEGORY_SMART, 0, {0, 0, 0, 0}}, // PURSUIT
+ {CONTEST_EFFECT_AVOID_STARTLE_ONCE, CONTEST_CATEGORY_COOL, 0, {0, 0, 0, 0}}, // RAPID_SPIN
+ {CONTEST_EFFECT_BADLY_STARTLE_PREV_MONS, CONTEST_CATEGORY_CUTE, COMBO_STARTER_SWEET_SCENT, {0, 0, 0, 0}}, // SWEET_SCENT
+ {CONTEST_EFFECT_BADLY_STARTLE_FRONT_MON, CONTEST_CATEGORY_COOL, 0, {0, 0, 0, 0}}, // IRON_TAIL
+ {CONTEST_EFFECT_HIGHLY_APPEALING, CONTEST_CATEGORY_COOL, 0, {COMBO_STARTER_METAL_SOUND, 0, 0, 0}}, // METAL_CLAW
+ {CONTEST_EFFECT_NEXT_APPEAL_LATER, CONTEST_CATEGORY_COOL, 0, {COMBO_STARTER_FAKE_OUT, 0, 0, 0}}, // VITAL_THROW
+ {CONTEST_EFFECT_QUALITY_DEPENDS_ON_TIMING, CONTEST_CATEGORY_BEAUTY, 0, {COMBO_STARTER_SUNNY_DAY, 0, 0, 0}}, // MORNING_SUN
+ {CONTEST_EFFECT_QUALITY_DEPENDS_ON_TIMING, CONTEST_CATEGORY_SMART, 0, {COMBO_STARTER_SUNNY_DAY, 0, 0, 0}}, // SYNTHESIS
+ {CONTEST_EFFECT_QUALITY_DEPENDS_ON_TIMING, CONTEST_CATEGORY_BEAUTY, 0, {COMBO_STARTER_SUNNY_DAY, 0, 0, 0}}, // MOONLIGHT
+ {CONTEST_EFFECT_REPETITION_NOT_BORING, CONTEST_CATEGORY_SMART, 0, {0, 0, 0, 0}}, // HIDDEN_POWER
+ {CONTEST_EFFECT_AFFECTED_BY_PREV_APPEAL, CONTEST_CATEGORY_COOL, 0, {COMBO_STARTER_FOCUS_ENERGY, 0, 0, 0}}, // CROSS_CHOP
+ {CONTEST_EFFECT_SCRAMBLE_NEXT_TURN_ORDER, CONTEST_CATEGORY_COOL, 0, {0, 0, 0, 0}}, // TWISTER
+ {CONTEST_EFFECT_BETTER_WHEN_AUDIENCE_EXCITED, CONTEST_CATEGORY_TOUGH, COMBO_STARTER_RAIN_DANCE, {0, 0, 0, 0}}, // RAIN_DANCE
+ {CONTEST_EFFECT_BETTER_WHEN_AUDIENCE_EXCITED, CONTEST_CATEGORY_BEAUTY, COMBO_STARTER_SUNNY_DAY, {0, 0, 0, 0}}, // SUNNY_DAY
+ {CONTEST_EFFECT_BADLY_STARTLE_FRONT_MON, CONTEST_CATEGORY_TOUGH, 0, {COMBO_STARTER_SCARY_FACE, 0, 0, 0}}, // CRUNCH
+ {CONTEST_EFFECT_AVOID_STARTLE_ONCE, CONTEST_CATEGORY_BEAUTY, 0, {COMBO_STARTER_TAUNT, 0, 0, 0}}, // MIRROR_COAT
+ {CONTEST_EFFECT_BETTER_IF_SAME_TYPE, CONTEST_CATEGORY_SMART, 0, {0, 0, 0, 0}}, // PSYCH_UP
+ {CONTEST_EFFECT_NEXT_APPEAL_EARLIER, CONTEST_CATEGORY_COOL, 0, {0, 0, 0, 0}}, // EXTREME_SPEED
+ {CONTEST_EFFECT_IMPROVE_CONDITION_PREVENT_NERVOUSNESS, CONTEST_CATEGORY_TOUGH, 0, {0, 0, 0, 0}}, // ANCIENT_POWER
+ {CONTEST_EFFECT_SHIFT_JUDGE_ATTENTION, CONTEST_CATEGORY_SMART, 0, {0, 0, 0, 0}}, // SHADOW_BALL
+ {CONTEST_EFFECT_DONT_EXCITE_AUDIENCE, CONTEST_CATEGORY_SMART, 0, {COMBO_STARTER_PSYCHIC, COMBO_STARTER_KINESIS, COMBO_STARTER_CONFUSION, COMBO_STARTER_CALM_MIND}}, // FUTURE_SIGHT
+ {CONTEST_EFFECT_BETTER_WITH_GOOD_CONDITION, CONTEST_CATEGORY_TOUGH, 0, {0, 0, 0, 0}}, // ROCK_SMASH
+ {CONTEST_EFFECT_DONT_EXCITE_AUDIENCE, CONTEST_CATEGORY_BEAUTY, 0, {COMBO_STARTER_RAIN_DANCE, 0, 0, 0}}, // WHIRLPOOL
+ {CONTEST_EFFECT_BADLY_STARTLE_MONS_WITH_GOOD_APPEALS, CONTEST_CATEGORY_SMART, 0, {0, 0, 0, 0}}, // BEAT_UP
+ {CONTEST_EFFECT_STARTLE_MONS_SAME_TYPE_APPEAL, CONTEST_CATEGORY_CUTE, COMBO_STARTER_FAKE_OUT, {0, 0, 0, 0}}, // FAKE_OUT
+ {CONTEST_EFFECT_SCRAMBLE_NEXT_TURN_ORDER, CONTEST_CATEGORY_CUTE, 0, {0, 0, 0, 0}}, // UPROAR
+ {CONTEST_EFFECT_AVOID_STARTLE_ONCE, CONTEST_CATEGORY_TOUGH, COMBO_STARTER_STOCKPILE, {0, 0, 0, 0}}, // STOCKPILE
+ {CONTEST_EFFECT_HIGHLY_APPEALING, CONTEST_CATEGORY_TOUGH, 0, {COMBO_STARTER_STOCKPILE, 0, 0, 0}}, // SPIT_UP
+ {CONTEST_EFFECT_IMPROVE_CONDITION_PREVENT_NERVOUSNESS, CONTEST_CATEGORY_TOUGH, 0, {COMBO_STARTER_STOCKPILE, 0, 0, 0}}, // SWALLOW
+ {CONTEST_EFFECT_HIGHLY_APPEALING, CONTEST_CATEGORY_BEAUTY, 0, {COMBO_STARTER_SUNNY_DAY, 0, 0, 0}}, // HEAT_WAVE
+ {CONTEST_EFFECT_BADLY_STARTLE_PREV_MONS, CONTEST_CATEGORY_BEAUTY, COMBO_STARTER_HAIL, {0, 0, 0, 0}}, // HAIL
+ {CONTEST_EFFECT_MAKE_FOLLOWING_MONS_NERVOUS, CONTEST_CATEGORY_TOUGH, 0, {0, 0, 0, 0}}, // TORMENT
+ {CONTEST_EFFECT_MAKE_FOLLOWING_MONS_NERVOUS, CONTEST_CATEGORY_SMART, 0, {COMBO_STARTER_CHARM, 0, 0, 0}}, // FLATTER
+ {CONTEST_EFFECT_BADLY_STARTLE_FRONT_MON, CONTEST_CATEGORY_BEAUTY, 0, {COMBO_STARTER_SUNNY_DAY, 0, 0, 0}}, // WILL_O_WISP
+ {CONTEST_EFFECT_GREAT_APPEAL_BUT_NO_MORE_MOVES, CONTEST_CATEGORY_TOUGH, 0, {0, 0, 0, 0}}, // MEMENTO
+ {CONTEST_EFFECT_BETTER_IF_LAST, CONTEST_CATEGORY_CUTE, 0, {0, 0, 0, 0}}, // FACADE
+ {CONTEST_EFFECT_NEXT_APPEAL_LATER, CONTEST_CATEGORY_TOUGH, 0, {COMBO_STARTER_FOCUS_ENERGY, 0, 0, 0}}, // FOCUS_PUNCH
+ {CONTEST_EFFECT_STARTLE_PREV_MON, CONTEST_CATEGORY_SMART, 0, {0, 0, 0, 0}}, // SMELLING_SALT
+ {CONTEST_EFFECT_DONT_EXCITE_AUDIENCE, CONTEST_CATEGORY_CUTE, 0, {0, 0, 0, 0}}, // FOLLOW_ME
+ {CONTEST_EFFECT_BETTER_WHEN_AUDIENCE_EXCITED, CONTEST_CATEGORY_BEAUTY, 0, {0, 0, 0, 0}}, // NATURE_POWER
+ {CONTEST_EFFECT_BETTER_IF_SAME_TYPE, CONTEST_CATEGORY_SMART, COMBO_STARTER_CHARGE, {0, 0, 0, 0}}, // CHARGE
+ {CONTEST_EFFECT_MAKE_FOLLOWING_MONS_NERVOUS, CONTEST_CATEGORY_SMART, COMBO_STARTER_TAUNT, {0, 0, 0, 0}}, // TAUNT
+ {CONTEST_EFFECT_MAKE_FOLLOWING_MONS_NERVOUS, CONTEST_CATEGORY_SMART, 0, {0, 0, 0, 0}}, // HELPING_HAND
+ {CONTEST_EFFECT_BETTER_IF_SAME_TYPE, CONTEST_CATEGORY_SMART, 0, {0, 0, 0, 0}}, // TRICK
+ {CONTEST_EFFECT_APPEAL_AS_GOOD_AS_PREV_ONES, CONTEST_CATEGORY_CUTE, 0, {0, 0, 0, 0}}, // ROLE_PLAY
+ {CONTEST_EFFECT_DONT_EXCITE_AUDIENCE, CONTEST_CATEGORY_CUTE, 0, {0, 0, 0, 0}}, // WISH
+ {CONTEST_EFFECT_QUALITY_DEPENDS_ON_TIMING, CONTEST_CATEGORY_CUTE, 0, {0, 0, 0, 0}}, // ASSIST
+ {CONTEST_EFFECT_AVOID_STARTLE, CONTEST_CATEGORY_SMART, 0, {0, 0, 0, 0}}, // INGRAIN
+ {CONTEST_EFFECT_USER_MORE_EASILY_STARTLED, CONTEST_CATEGORY_TOUGH, 0, {COMBO_STARTER_LOCK_ON, 0, 0, 0}}, // SUPERPOWER
+ {CONTEST_EFFECT_AVOID_STARTLE, CONTEST_CATEGORY_BEAUTY, 0, {0, 0, 0, 0}}, // MAGIC_COAT
+ {CONTEST_EFFECT_REPETITION_NOT_BORING, CONTEST_CATEGORY_SMART, 0, {0, 0, 0, 0}}, // RECYCLE
+ {CONTEST_EFFECT_NEXT_APPEAL_LATER, CONTEST_CATEGORY_TOUGH, 0, {0, 0, 0, 0}}, // REVENGE
+ {CONTEST_EFFECT_BADLY_STARTLE_FRONT_MON, CONTEST_CATEGORY_COOL, 0, {COMBO_STARTER_FOCUS_ENERGY, 0, 0, 0}}, // BRICK_BREAK
+ {CONTEST_EFFECT_MAKE_FOLLOWING_MONS_NERVOUS, CONTEST_CATEGORY_CUTE, COMBO_STARTER_YAWN, {0, 0, 0, 0}}, // YAWN
+ {CONTEST_EFFECT_BADLY_STARTLE_FRONT_MON, CONTEST_CATEGORY_SMART, 0, {COMBO_STARTER_FAKE_OUT, 0, 0, 0}}, // KNOCK_OFF
+ {CONTEST_EFFECT_BETTER_IF_LAST, CONTEST_CATEGORY_TOUGH, 0, {COMBO_STARTER_ENDURE, 0, 0, 0}}, // ENDEAVOR
+ {CONTEST_EFFECT_BETTER_WHEN_LATER, CONTEST_CATEGORY_BEAUTY, 0, {COMBO_STARTER_ENDURE, COMBO_STARTER_EARTHQUAKE, COMBO_STARTER_SUNNY_DAY, 0}}, // ERUPTION
+ {CONTEST_EFFECT_APPEAL_AS_GOOD_AS_PREV_ONES, CONTEST_CATEGORY_SMART, 0, {0, 0, 0, 0}}, // SKILL_SWAP
+ {CONTEST_EFFECT_WORSEN_CONDITION_OF_PREV_MONS, CONTEST_CATEGORY_SMART, 0, {0, 0, 0, 0}}, // IMPRISON
+ {CONTEST_EFFECT_IMPROVE_CONDITION_PREVENT_NERVOUSNESS, CONTEST_CATEGORY_CUTE, 0, {COMBO_STARTER_WATER_SPORT, COMBO_STARTER_SING, 0, 0}}, // REFRESH
+ {CONTEST_EFFECT_BETTER_WHEN_LATER, CONTEST_CATEGORY_TOUGH, 0, {COMBO_STARTER_CURSE, 0, 0, 0}}, // GRUDGE
+ {CONTEST_EFFECT_BADLY_STARTLE_MONS_WITH_GOOD_APPEALS, CONTEST_CATEGORY_SMART, 0, {0, 0, 0, 0}}, // SNATCH
+ {CONTEST_EFFECT_BETTER_WITH_GOOD_CONDITION, CONTEST_CATEGORY_SMART, 0, {0, 0, 0, 0}}, // SECRET_POWER
+ {CONTEST_EFFECT_AVOID_STARTLE_ONCE, CONTEST_CATEGORY_BEAUTY, COMBO_STARTER_DIVE, {COMBO_STARTER_RAIN_DANCE, COMBO_STARTER_SURF, 0, 0}}, // DIVE
+ {CONTEST_EFFECT_STARTLE_MON_WITH_JUDGES_ATTENTION, CONTEST_CATEGORY_TOUGH, 0, {COMBO_STARTER_FOCUS_ENERGY, COMBO_STARTER_FAKE_OUT, 0, 0}}, // ARM_THRUST
+ {CONTEST_EFFECT_AFFECTED_BY_PREV_APPEAL, CONTEST_CATEGORY_SMART, 0, {0, 0, 0, 0}}, // CAMOUFLAGE
+ {CONTEST_EFFECT_IMPROVE_CONDITION_PREVENT_NERVOUSNESS, CONTEST_CATEGORY_BEAUTY, 0, {0, 0, 0, 0}}, // TAIL_GLOW
+ {CONTEST_EFFECT_STARTLE_PREV_MON, CONTEST_CATEGORY_SMART, 0, {COMBO_STARTER_CALM_MIND, 0, 0, 0}}, // LUSTER_PURGE
+ {CONTEST_EFFECT_BADLY_STARTLE_FRONT_MON, CONTEST_CATEGORY_SMART, 0, {COMBO_STARTER_CALM_MIND, 0, 0, 0}}, // MIST_BALL
+ {CONTEST_EFFECT_BETTER_IF_LAST, CONTEST_CATEGORY_BEAUTY, 0, {0, 0, 0, 0}}, // FEATHER_DANCE
+ {CONTEST_EFFECT_JAMS_OTHERS_BUT_MISS_ONE_TURN, CONTEST_CATEGORY_CUTE, 0, {0, 0, 0, 0}}, // TEETER_DANCE
+ {CONTEST_EFFECT_HIGHLY_APPEALING, CONTEST_CATEGORY_BEAUTY, 0, {COMBO_STARTER_SUNNY_DAY, 0, 0, 0}}, // BLAZE_KICK
+ {CONTEST_EFFECT_HIGHLY_APPEALING, CONTEST_CATEGORY_CUTE, COMBO_STARTER_MUD_SPORT, {COMBO_STARTER_MUD_SLAP, COMBO_STARTER_WATER_SPORT, 0, 0}}, // MUD_SPORT
+ {CONTEST_EFFECT_DONT_EXCITE_AUDIENCE, CONTEST_CATEGORY_BEAUTY, 0, {0, 0, 0, 0}}, // ICE_BALL
+ {CONTEST_EFFECT_BADLY_STARTLE_FRONT_MON, CONTEST_CATEGORY_SMART, 0, {0, 0, 0, 0}}, // NEEDLE_ARM
+ {CONTEST_EFFECT_BETTER_WHEN_LATER, CONTEST_CATEGORY_CUTE, 0, {COMBO_STARTER_YAWN, 0, 0, 0}}, // SLACK_OFF
+ {CONTEST_EFFECT_BADLY_STARTLE_PREV_MONS, CONTEST_CATEGORY_COOL, 0, {0, 0, 0, 0}}, // HYPER_VOICE
+ {CONTEST_EFFECT_WORSEN_CONDITION_OF_PREV_MONS, CONTEST_CATEGORY_SMART, 0, {0, 0, 0, 0}}, // POISON_FANG
+ {CONTEST_EFFECT_BADLY_STARTLE_FRONT_MON, CONTEST_CATEGORY_COOL, 0, {COMBO_STARTER_SWORDS_DANCE, 0, 0, 0}}, // CRUSH_CLAW
+ {CONTEST_EFFECT_JAMS_OTHERS_BUT_MISS_ONE_TURN, CONTEST_CATEGORY_BEAUTY, 0, {COMBO_STARTER_SUNNY_DAY, 0, 0, 0}}, // BLAST_BURN
+ {CONTEST_EFFECT_JAMS_OTHERS_BUT_MISS_ONE_TURN, CONTEST_CATEGORY_BEAUTY, 0, {COMBO_STARTER_RAIN_DANCE, 0, 0, 0}}, // HYDRO_CANNON
+ {CONTEST_EFFECT_BETTER_IF_SAME_TYPE, CONTEST_CATEGORY_COOL, 0, {0, 0, 0, 0}}, // METEOR_MASH
+ {CONTEST_EFFECT_STARTLE_PREV_MON, CONTEST_CATEGORY_SMART, 0, {0, 0, 0, 0}}, // ASTONISH
+ {CONTEST_EFFECT_HIGHLY_APPEALING, CONTEST_CATEGORY_SMART, 0, {COMBO_STARTER_RAIN_DANCE, COMBO_STARTER_SUNNY_DAY, COMBO_STARTER_HAIL, COMBO_STARTER_SANDSTORM}}, // WEATHER_BALL
+ {CONTEST_EFFECT_BETTER_IF_LAST, CONTEST_CATEGORY_SMART, 0, {0, 0, 0, 0}}, // AROMATHERAPY
+ {CONTEST_EFFECT_BETTER_IF_LAST, CONTEST_CATEGORY_SMART, 0, {0, 0, 0, 0}}, // FAKE_TEARS
+ {CONTEST_EFFECT_STARTLE_MONS_SAME_TYPE_APPEAL, CONTEST_CATEGORY_COOL, 0, {0, 0, 0, 0}}, // AIR_CUTTER
+ {CONTEST_EFFECT_USER_MORE_EASILY_STARTLED, CONTEST_CATEGORY_BEAUTY, 0, {COMBO_STARTER_SUNNY_DAY, 0, 0, 0}}, // OVERHEAT
+ {CONTEST_EFFECT_WORSEN_CONDITION_OF_PREV_MONS, CONTEST_CATEGORY_SMART, 0, {0, 0, 0, 0}}, // ODOR_SLEUTH
+ {CONTEST_EFFECT_DONT_EXCITE_AUDIENCE, CONTEST_CATEGORY_SMART, 0, {COMBO_STARTER_ROCK_THROW, 0, 0, 0}}, // ROCK_TOMB
+ {CONTEST_EFFECT_IMPROVE_CONDITION_PREVENT_NERVOUSNESS, CONTEST_CATEGORY_BEAUTY, 0, {0, 0, 0, 0}}, // SILVER_WIND
+ {CONTEST_EFFECT_BADLY_STARTLE_PREV_MONS, CONTEST_CATEGORY_SMART, COMBO_STARTER_METAL_SOUND, {0, 0, 0, 0}}, // METAL_SOUND
+ {CONTEST_EFFECT_BADLY_STARTLE_PREV_MONS, CONTEST_CATEGORY_SMART, 0, {0, 0, 0, 0}}, // GRASS_WHISTLE
+ {CONTEST_EFFECT_WORSEN_CONDITION_OF_PREV_MONS, CONTEST_CATEGORY_CUTE, 0, {0, 0, 0, 0}}, // TICKLE
+ {CONTEST_EFFECT_IMPROVE_CONDITION_PREVENT_NERVOUSNESS, CONTEST_CATEGORY_COOL, 0, {0, 0, 0, 0}}, // COSMIC_POWER
+ {CONTEST_EFFECT_BETTER_WHEN_LATER, CONTEST_CATEGORY_BEAUTY, 0, {COMBO_STARTER_RAIN_DANCE, 0, 0, 0}}, // WATER_SPOUT
+ {CONTEST_EFFECT_SCRAMBLE_NEXT_TURN_ORDER, CONTEST_CATEGORY_BEAUTY, 0, {0, 0, 0, 0}}, // SIGNAL_BEAM
+ {CONTEST_EFFECT_BETTER_IF_FIRST, CONTEST_CATEGORY_SMART, 0, {0, 0, 0, 0}}, // SHADOW_PUNCH
+ {CONTEST_EFFECT_BADLY_STARTLE_FRONT_MON, CONTEST_CATEGORY_COOL, 0, {0, 0, 0, 0}}, // EXTRASENSORY
+ {CONTEST_EFFECT_STARTLE_MONS_SAME_TYPE_APPEAL, CONTEST_CATEGORY_COOL, 0, {COMBO_STARTER_FOCUS_ENERGY, 0, 0, 0}}, // SKY_UPPERCUT
+ {CONTEST_EFFECT_DONT_EXCITE_AUDIENCE, CONTEST_CATEGORY_SMART, 0, {COMBO_STARTER_SANDSTORM, 0, 0, 0}}, // SAND_TOMB
+ {CONTEST_EFFECT_BADLY_STARTLE_MONS_WITH_GOOD_APPEALS, CONTEST_CATEGORY_BEAUTY, 0, {0, 0, 0, 0}}, // SHEER_COLD
+ {CONTEST_EFFECT_STARTLE_MON_WITH_JUDGES_ATTENTION, CONTEST_CATEGORY_TOUGH, 0, {COMBO_STARTER_RAIN_DANCE, 0, 0, 0}}, // MUDDY_WATER
+ {CONTEST_EFFECT_BADLY_STARTLE_MONS_WITH_GOOD_APPEALS, CONTEST_CATEGORY_COOL, 0, {COMBO_STARTER_GROWTH, 0, 0, 0}}, // BULLET_SEED
+ {CONTEST_EFFECT_BETTER_IF_FIRST, CONTEST_CATEGORY_COOL, 0, {0, 0, 0, 0}}, // AERIAL_ACE
+ {CONTEST_EFFECT_STARTLE_MONS_SAME_TYPE_APPEAL, CONTEST_CATEGORY_BEAUTY, 0, {0, 0, 0, 0}}, // ICICLE_SPEAR
+ {CONTEST_EFFECT_AVOID_STARTLE, CONTEST_CATEGORY_TOUGH, 0, {0, 0, 0, 0}}, // IRON_DEFENSE
+ {CONTEST_EFFECT_MAKE_FOLLOWING_MONS_NERVOUS, CONTEST_CATEGORY_CUTE, 0, {0, 0, 0, 0}}, // BLOCK
+ {CONTEST_EFFECT_IMPROVE_CONDITION_PREVENT_NERVOUSNESS, CONTEST_CATEGORY_COOL, 0, {0, 0, 0, 0}}, // HOWL
+ {CONTEST_EFFECT_STARTLE_MONS_SAME_TYPE_APPEAL, CONTEST_CATEGORY_COOL, 0, {COMBO_STARTER_DRAGON_BREATH, COMBO_STARTER_DRAGON_RAGE, COMBO_STARTER_DRAGON_DANCE, 0}}, // DRAGON_CLAW
+ {CONTEST_EFFECT_JAMS_OTHERS_BUT_MISS_ONE_TURN, CONTEST_CATEGORY_COOL, 0, {COMBO_STARTER_GROWTH, 0, 0, 0}}, // FRENZY_PLANT
+ {CONTEST_EFFECT_IMPROVE_CONDITION_PREVENT_NERVOUSNESS, CONTEST_CATEGORY_BEAUTY, 0, {0, 0, 0, 0}}, // BULK_UP
+ {CONTEST_EFFECT_AVOID_STARTLE, CONTEST_CATEGORY_CUTE, 0, {0, 0, 0, 0}}, // BOUNCE
+ {CONTEST_EFFECT_BADLY_STARTLE_PREV_MONS, CONTEST_CATEGORY_TOUGH, 0, {0, 0, 0, 0}}, // MUD_SHOT
+ {CONTEST_EFFECT_WORSEN_CONDITION_OF_PREV_MONS, CONTEST_CATEGORY_SMART, 0, {0, 0, 0, 0}}, // POISON_TAIL
+ {CONTEST_EFFECT_APPEAL_AS_GOOD_AS_PREV_ONES, CONTEST_CATEGORY_CUTE, 0, {0, 0, 0, 0}}, // COVET
+ {CONTEST_EFFECT_USER_MORE_EASILY_STARTLED, CONTEST_CATEGORY_COOL, 0, {COMBO_STARTER_CHARGE, 0, 0, 0}}, // VOLT_TACKLE
+ {CONTEST_EFFECT_BETTER_IF_FIRST, CONTEST_CATEGORY_BEAUTY, 0, {COMBO_STARTER_GROWTH, 0, 0, 0}}, // MAGICAL_LEAF
+ {CONTEST_EFFECT_HIGHLY_APPEALING, CONTEST_CATEGORY_CUTE, COMBO_STARTER_WATER_SPORT, {COMBO_STARTER_RAIN_DANCE, COMBO_STARTER_MUD_SPORT, 0, 0}}, // WATER_SPORT
+ {CONTEST_EFFECT_AVOID_STARTLE_ONCE, CONTEST_CATEGORY_SMART, COMBO_STARTER_CALM_MIND, {0, 0, 0, 0}}, // CALM_MIND
+ {CONTEST_EFFECT_AFFECTED_BY_PREV_APPEAL, CONTEST_CATEGORY_COOL, 0, {0, 0, 0, 0}}, // LEAF_BLADE
+ {CONTEST_EFFECT_IMPROVE_CONDITION_PREVENT_NERVOUSNESS, CONTEST_CATEGORY_COOL, COMBO_STARTER_DRAGON_DANCE, {COMBO_STARTER_DRAGON_RAGE, COMBO_STARTER_DRAGON_BREATH, 0, 0}}, // DRAGON_DANCE
+ {CONTEST_EFFECT_BETTER_IF_SAME_TYPE, CONTEST_CATEGORY_TOUGH, 0, {0, 0, 0, 0}}, // ROCK_BLAST
+ {CONTEST_EFFECT_BETTER_IF_FIRST, CONTEST_CATEGORY_COOL, 0, {COMBO_STARTER_CHARGE, 0, 0, 0}}, // SHOCK_WAVE
+ {CONTEST_EFFECT_SCRAMBLE_NEXT_TURN_ORDER, CONTEST_CATEGORY_BEAUTY, 0, {COMBO_STARTER_RAIN_DANCE, 0, 0, 0}}, // WATER_PULSE
+ {CONTEST_EFFECT_DONT_EXCITE_AUDIENCE, CONTEST_CATEGORY_COOL, 0, {0, 0, 0, 0}}, // DOOM_DESIRE
+ {CONTEST_EFFECT_USER_MORE_EASILY_STARTLED, CONTEST_CATEGORY_SMART, 0, {COMBO_STARTER_CALM_MIND, 0, 0, 0}}, // PSYCHO_BOOST
+};
+
+const struct ContestEffect gContestEffects[] = {
+ {0, 40, 0}, // CONTEST_EFFECT_HIGHLY_APPEALING
+ {0, 60, 0}, // CONTEST_EFFECT_USER_MORE_EASILY_STARTLED
+ {0, 80, 0}, // CONTEST_EFFECT_GREAT_APPEAL_BUT_NO_MORE_MOVES
+ {0, 30, 0}, // CONTEST_EFFECT_REPETITION_NOT_BORING
+ {1, 20, 0}, // CONTEST_EFFECT_AVOID_STARTLE_ONCE
+ {1, 10, 0}, // CONTEST_EFFECT_AVOID_STARTLE
+ {1, 30, 0}, // CONTEST_EFFECT_AVOID_STARTLE_SLIGHTLY
+ {1, 30, 0}, // CONTEST_EFFECT_USER_LESS_EASILY_STARTLED
+ {2, 30, 20}, // CONTEST_EFFECT_STARTLE_FRONT_MON
+ {3, 30, 10}, // CONTEST_EFFECT_SLIGHTLY_STARTLE_PREV_MONS
+ {2, 20, 30}, // CONTEST_EFFECT_STARTLE_PREV_MON
+ {3, 20, 20}, // CONTEST_EFFECT_STARTLE_PREV_MONS
+ {2, 10, 40}, // CONTEST_EFFECT_BADLY_STARTLE_FRONT_MON
+ {3, 10, 30}, // CONTEST_EFFECT_BADLY_STARTLE_PREV_MONS
+ {2, 30, 20}, // CONTEST_EFFECT_STARTLE_PREV_MON_2
+ {3, 30, 10}, // CONTEST_EFFECT_STARTLE_PREV_MONS_2
+ {4, 30, 0}, // CONTEST_EFFECT_SHIFT_JUDGE_ATTENTION
+ {3, 20, 10}, // CONTEST_EFFECT_STARTLE_MON_WITH_JUDGES_ATTENTION
+ {3, 40, 40}, // CONTEST_EFFECT_JAMS_OTHERS_BUT_MISS_ONE_TURN
+ {3, 20, 10}, // CONTEST_EFFECT_STARTLE_MONS_SAME_TYPE_APPEAL
+ {3, 20, 10}, // CONTEST_EFFECT_STARTLE_MONS_COOL_APPEAL
+ {3, 20, 10}, // CONTEST_EFFECT_STARTLE_MONS_BEAUTY_APPEAL
+ {3, 20, 10}, // CONTEST_EFFECT_STARTLE_MONS_CUTE_APPEAL
+ {3, 20, 10}, // CONTEST_EFFECT_STARTLE_MONS_SMART_APPEAL
+ {3, 20, 10}, // CONTEST_EFFECT_STARTLE_MONS_TOUGH_APPEAL
+ {4, 20, 0}, // CONTEST_EFFECT_MAKE_FOLLOWING_MON_NERVOUS
+ {4, 20, 0}, // CONTEST_EFFECT_MAKE_FOLLOWING_MONS_NERVOUS
+ {4, 30, 0}, // CONTEST_EFFECT_WORSEN_CONDITION_OF_PREV_MONS
+ {3, 30, 10}, // CONTEST_EFFECT_BADLY_STARTLES_MONS_IN_GOOD_CONDITION
+ {5, 20, 0}, // CONTEST_EFFECT_BETTER_IF_FIRST
+ {5, 20, 0}, // CONTEST_EFFECT_BETTER_IF_LAST
+ {5, 10, 0}, // CONTEST_EFFECT_APPEAL_AS_GOOD_AS_PREV_ONES
+ {5, 10, 0}, // CONTEST_EFFECT_APPEAL_AS_GOOD_AS_PREV_ONE
+ {5, 10, 0}, // CONTEST_EFFECT_BETTER_WHEN_LATER
+ {5, 10, 0}, // CONTEST_EFFECT_QUALITY_DEPENDS_ON_TIMING
+ {5, 20, 0}, // CONTEST_EFFECT_BETTER_IF_SAME_TYPE
+ {5, 20, 0}, // CONTEST_EFFECT_BETTER_IF_DIFF_TYPE
+ {5, 30, 0}, // CONTEST_EFFECT_AFFECTED_BY_PREV_APPEAL
+ {5, 10, 0}, // CONTEST_EFFECT_IMPROVE_CONDITION_PREVENT_NERVOUSNESS
+ {5, 10, 0}, // CONTEST_EFFECT_BETTER_WITH_GOOD_CONDITION
+ {6, 30, 0}, // CONTEST_EFFECT_NEXT_APPEAL_EARLIER
+ {6, 30, 0}, // CONTEST_EFFECT_NEXT_APPEAL_LATER
+ {6, 30, 0}, // CONTEST_EFFECT_MAKE_SCRAMBLING_TURN_ORDER_EASIER
+ {6, 30, 0}, // CONTEST_EFFECT_SCRAMBLE_NEXT_TURN_ORDER
+ {5, 10, 0}, // CONTEST_EFFECT_EXCITE_AUDIENCE_IN_ANY_CONTEST
+ {3, 20, 10}, // CONTEST_EFFECT_BADLY_STARTLE_MONS_WITH_GOOD_APPEALS
+ {5, 10, 0}, // CONTEST_EFFECT_BETTER_WHEN_AUDIENCE_EXCITED
+ {4, 30, 0} // CONTEST_EFFECT_DONT_EXCITE_AUDIENCE
+};
+
+// A lookup table with TRUE for each combo starter ID and FALSE for ID 0,
+// which means "not a combo starter move".
+const bool8 gComboStarterLookupTable[] = {
+ FALSE,
+ TRUE,
+ TRUE,
+ TRUE,
+ TRUE,
+ TRUE,
+ TRUE,
+ TRUE,
+ TRUE,
+ TRUE,
+ TRUE,
+ TRUE,
+ TRUE,
+ TRUE,
+ TRUE,
+ TRUE,
+ TRUE,
+ TRUE,
+ TRUE,
+ TRUE,
+ TRUE,
+ TRUE,
+ TRUE,
+ TRUE,
+ TRUE,
+ TRUE,
+ TRUE,
+ TRUE,
+ TRUE,
+ TRUE,
+ TRUE,
+ TRUE,
+ TRUE,
+ TRUE,
+ TRUE,
+ TRUE,
+ TRUE,
+ TRUE,
+ TRUE,
+ TRUE,
+ TRUE,
+ TRUE,
+ TRUE,
+ TRUE,
+ TRUE,
+ TRUE,
+ TRUE,
+ TRUE,
+ TRUE,
+ TRUE,
+ TRUE,
+ TRUE,
+ TRUE,
+ TRUE,
+ TRUE,
+ TRUE,
+ TRUE,
+ TRUE,
+ TRUE,
+ TRUE,
+ TRUE,
+ TRUE,
+ TRUE
+};
+
+void (*const gContestEffectFuncs[])(void) = {
+ ContestEffect_HighlyAppealing,
+ ContestEffect_UserMoreEasilyStartled,
+ ContestEffect_GreatAppealButNoMoreMoves,
+ ContestEffect_RepetitionNotBoring,
+ ContestEffect_AvoidStartleOnce,
+ ContestEffect_AvoidStartle,
+ ContestEffect_AvoidStartleSlightly,
+ ContestEffect_UserLessEasilyStartled,
+ ContestEffect_StartleFrontMon,
+ ContestEffect_StartlePrevMons,
+ ContestEffect_StartleFrontMon,
+ ContestEffect_StartlePrevMons,
+ ContestEffect_StartleFrontMon,
+ ContestEffect_StartlePrevMons,
+ ContestEffect_StartlePrevMon2,
+ ContestEffect_StartlePrevMons2,
+ ContestEffect_ShiftJudgeAttention,
+ ContestEffect_StartleMonWithJudgesAttention,
+ ContestEffect_JamsOthersButMissOneTurn,
+ ContestEffect_StartleMonsSameTypeAppeal,
+ ContestEffect_StartleMonsCoolAppeal,
+ ContestEffect_StartleMonsBeautyAppeal,
+ ContestEffect_StartleMonsCuteAppeal,
+ ContestEffect_StartleMonsSmartAppeal,
+ ContestEffect_StartleMonsToughAppeal,
+ ContestEffect_MakeFollowingMonNervous,
+ ContestEffect_MakeFollowingMonsNervous,
+ ContestEffect_WorsenConditionOfPrevMons,
+ ContestEffect_BadlyStartlesMonsInGoodCondition,
+ ContestEffect_BetterIfFirst,
+ ContestEffect_BetterIfLast,
+ ContestEffect_AppealAsGoodAsPrevOnes,
+ ContestEffect_AppealAsGoodAsPrevOne,
+ ContestEffect_BetterWhenLater,
+ ContestEffect_QualityDependsOnTiming,
+ ContestEffect_BetterIfSameType,
+ ContestEffect_BetterIfDiffType,
+ ContestEffect_AffectedByPrevAppeal,
+ ContestEffect_ImproveConditionPreventNervousness,
+ ContestEffect_BetterWithGoodCondition,
+ ContestEffect_NextAppealEarlier,
+ ContestEffect_NextAppealLater,
+ ContestEffect_MakeScramblingTurnOrderEasier,
+ ContestEffect_ScrambleNextTurnOrder,
+ ContestEffect_ExciteAudienceInAnyContest,
+ ContestEffect_BadlyStartleMonsWithGoodAppeals,
+ ContestEffect_BetterWhenAudienceExcited,
+ ContestEffect_DontExciteAudience
+};
+
+#endif //POKERUBY_CONTEST_MOVES_H