pokeplatinum/src/unk_02094EDC.c
2026-03-15 13:56:52 -07:00

1079 lines
26 KiB
C

#include "unk_02094EDC.h"
#include <nitro.h>
#include <string.h>
#include "constants/contests.h"
#include "generated/contest_effects.h"
#include "generated/pokemon_contest_ranks.h"
#include "generated/pokemon_contest_types.h"
#include "struct_defs/struct_020951B0.h"
#include "struct_defs/struct_020954F0.h"
#include "struct_defs/struct_020F568C.h"
#include "battle/pokemon_sprite_data.h"
#include "overlay006/struct_ov6_02248BE8.h"
#include "character_sprite.h"
#include "contest.h"
#include "graphics.h"
#include "heap.h"
#include "math_util.h"
#include "message.h"
#include "narc.h"
#include "pokemon.h"
#include "pokemon_sprite.h"
#include "render_text.h"
#include "string_gf.h"
#include "unk_020298BC.h"
#include "res/text/bank/contest_effects.h"
#include "res/text/bank/contest_text.h"
const UnkStruct_020F568C Unk_020F568C[CONTEST_EFFECT_MAX] = {
[CONTEST_EFFECT_NONE] = {
0x0,
0x0,
0x0,
},
[CONTEST_EFFECT_FIRST_NEXT_TURN] = {
ContestEffects_Text_PerformFirst,
ContestEffects_Text_NextTurn1,
0x14,
0x0,
0x2,
0x1,
0x7,
0xffff,
0x0,
0xffff,
0x0,
0xffff,
0x0,
},
[CONTEST_EFFECT_LAST_NEXT_TURN] = {
ContestEffects_Text_PerformLast,
ContestEffects_Text_NextTurn2,
0x14,
0x2,
0x2,
0x3,
0x7,
0xffff,
0x0,
0xffff,
0x0,
0xffff,
0x0,
},
[CONTEST_EFFECT_DOUBLED_JUDGE] = {
ContestEffects_Text_EachDoubled,
ContestEffects_Text_JudgePlusTwo,
0x0,
0x4,
0x2,
0x5,
0x2,
0x6,
0x2,
0x7,
0x2,
0xffff,
0x0,
},
[CONTEST_EFFECT_2_HEARTS_WHEN_VOLTAGE_UP] = {
ContestEffects_Text_IfTheVoltage,
ContestEffects_Text_GoesUpPlusTwo,
0x14,
0x8,
0x8,
0xffff,
0x0,
0xffff,
0x0,
0xffff,
0x0,
0xffff,
0x0,
},
[CONTEST_EFFECT_BASIC] = {
ContestEffects_Text_BasicAct,
ContestEffects_Text_Unused,
0x1E,
0xffff,
0x0,
0xffff,
0x0,
0xffff,
0x0,
0xffff,
0x0,
0xffff,
0x0,
},
[CONTEST_EFFECT_UNIQUE_JUDGE] = {
ContestEffects_Text_IfJudgesAre,
ContestEffects_Text_NotDoubledPlusThree,
0xA,
0x9,
0x2,
0xA,
0x2,
0xffff,
0x0,
0xffff,
0x0,
0xB,
0x2,
},
[CONTEST_EFFECT_CONSECUTIVE_USE] = {
ContestEffects_Text_PerformableTwo,
ContestEffects_Text_TurnsInARow,
0x14,
0xC,
0x2,
0xffff,
0x0,
0xffff,
0x0,
0xffff,
0x0,
0xffff,
0x0,
},
[CONTEST_EFFECT_VOLTAGE] = {
ContestEffects_Text_VoltagePts,
ContestEffects_Text_AreAdded,
0x0,
0xD,
0x5,
0xffff,
0x0,
0xffff,
0x0,
0xffff,
0x0,
0xffff,
0x0,
},
[CONTEST_EFFECT_ALL_SAME_JUDGE] = {
ContestEffects_Text_IfAllChoose,
ContestEffects_Text_SameJudgePlusFifteen,
0x0,
0xE,
0x2,
0xF,
0x2,
0xffff,
0x0,
0xffff,
0x0,
0x10,
0x2,
},
[CONTEST_EFFECT_LOWERS_VOLTAGE] = {
ContestEffects_Text_LowersVoltage,
ContestEffects_Text_OfJudgesByOne,
0x14,
0x11,
0x0,
0xffff,
0x0,
0xffff,
0x0,
0xffff,
0x0,
0xffff,
0x0,
},
[CONTEST_EFFECT_DOUBLE_NEXT_TURN] = {
ContestEffects_Text_DoubleScoreIn,
ContestEffects_Text_NextTurn3,
0x0,
0x12,
0x9,
0xffff,
0x0,
0xffff,
0x0,
0xffff,
0x0,
0xffff,
0x0,
},
[CONTEST_EFFECT_STEAL_VOLTAGE] = {
ContestEffects_Text_GetVoltage,
ContestEffects_Text_FromOneAhead,
0x0,
0x13,
0x7,
0xffff,
0x0,
0xffff,
0x0,
0xffff,
0x0,
0xffff,
0x0,
},
[CONTEST_EFFECT_SUPPRESS_VOLTAGE] = {
ContestEffects_Text_NoVoltageUp,
ContestEffects_Text_ThisTurn1,
0x14,
0x14,
0x0,
0xffff,
0x0,
0xffff,
0x0,
0xffff,
0x0,
0xffff,
0x0,
},
[CONTEST_EFFECT_RANDOM_ORDER] = {
ContestEffects_Text_RandomOrder,
ContestEffects_Text_NextTurn4,
0x14,
0x15,
0x0,
0xffff,
0x0,
0xffff,
0x0,
0xffff,
0x0,
0xffff,
0x0,
},
[CONTEST_EFFECT_DOUBLE_FINAL_ACT] = {
ContestEffects_Text_DoubleScore,
ContestEffects_Text_ForFinalAct,
0x14,
0x16,
0x9,
0xffff,
0x0,
0xffff,
0x0,
0xffff,
0x0,
0xffff,
0x0,
},
[CONTEST_EFFECT_LOW_VOLTAGE_ADVANTAGE] = {
ContestEffects_Text_HighScoreFor1,
ContestEffects_Text_LowVoltage,
0x0,
0x17,
0x5,
0xffff,
0x0,
0xffff,
0x0,
0xffff,
0x0,
0xffff,
0x0,
},
[CONTEST_EFFECT_FIRST_PERFORMANCE_ADVANTAGE] = {
ContestEffects_Text_IfFirst,
ContestEffects_Text_PerformancePlusTwo1,
0x14,
0x18,
0x0,
0xffff,
0x0,
0xffff,
0x0,
0xffff,
0x0,
0xffff,
0x0,
},
[CONTEST_EFFECT_FINAL_PERFORMANCE_ADVANTAGE] = {
ContestEffects_Text_IfFinal,
ContestEffects_Text_PerformancePlusTwo2,
0x14,
0x19,
0x0,
0xffff,
0x0,
0xffff,
0x0,
0xffff,
0x0,
0xffff,
0x0,
},
[CONTEST_EFFECT_NO_VOLTAGE_DOWN] = {
ContestEffects_Text_NoVoltageDown,
ContestEffects_Text_ThisTurn2,
0x14,
0x1A,
0x0,
0xffff,
0x0,
0xffff,
0x0,
0xffff,
0x0,
0xffff,
0x0,
},
[CONTEST_EFFECT_TWO_VOLTAGE_IN_A_ROW_ADVANTAGE] = {
ContestEffects_Text_IfVoltageGoes,
ContestEffects_Text_UpInARowPlusThree,
0xA,
0x1B,
0x0,
0xffff,
0x0,
0xffff,
0x0,
0xffff,
0x0,
0xffff,
0x0,
},
[CONTEST_EFFECT_HIGH_SCORE_LATER_TURN] = {
ContestEffects_Text_HighScoreFor2,
ContestEffects_Text_ALaterTurn,
0x0,
0x1C,
0x2,
0x1D,
0x2,
0x1E,
0x2,
0x1F,
0x2,
0xffff,
0x0,
},
[CONTEST_EFFECT_MAX_VOLTAGE_ADVANTAGE] = {
ContestEffects_Text_AfterVoltage,
ContestEffects_Text_HitsMaxPlusThree,
0x14,
0x20,
0x0,
0xffff,
0x0,
0xffff,
0x0,
0xffff,
0x0,
0xffff,
0x0,
},
[CONTEST_EFFECT_PITY_POINTS] = {
ContestEffects_Text_IfRatedThe,
ContestEffects_Text_WorstPlusThree,
0xA,
0x21,
0x2,
0xffff,
0x0,
0xffff,
0x0,
0xffff,
0x0,
0xffff,
0x0,
},
};
BOOL sub_02094EDC(Contest *contest)
{
if (contest->isLinkContest == FALSE || (contest->isLinkContest == TRUE && contest->unk_00.unk_10C == contest->unk_00.playerContestantID)) {
return TRUE;
}
return FALSE;
}
void sub_02094F04(Contest *contest, enum HeapID heapID, int param2, enum PokemonContestType contestType, enum PokemonContestRank contestRank, int competitionType, BOOL isGameCompleted, BOOL isNatDexObtained)
{
int v0, v1;
u8 *v2;
u8 v3 = 0;
u16 v4;
int v5 = 0;
int v6;
int v7, isPracticeCompetiton;
UnkStruct_ov6_02248BE8 *v9;
int v10, v11;
UnkStruct_ov6_02248BE8 v12;
isPracticeCompetiton = FALSE;
v7 = FALSE;
switch (competitionType) {
case CONTEST_COMPETITION_PRACTICE_VISUAL:
case CONTEST_COMPETITION_PRACTICE_DANCE:
case CONTEST_COMPETITION_PRACTICE_ACTING:
isPracticeCompetiton = TRUE;
break;
case CONTEST_COMPETITION_VISUAL:
case CONTEST_COMPETITION_DANCE:
case CONTEST_COMPETITION_ACTING:
v7 = TRUE;
break;
}
v9 = LoadMemberFromNARC(NARC_INDEX_CONTEST__DATA__CONTEST_DATA, 0, 0, heapID, 1);
v6 = NARC_GetMemberSizeByIndexPair(NARC_INDEX_CONTEST__DATA__CONTEST_DATA, 0) / sizeof(UnkStruct_ov6_02248BE8);
v2 = Heap_AllocAtEnd(heapID, v6 + 1);
if (isGameCompleted == TRUE && isNatDexObtained == TRUE) {
v5 = 1;
}
for (v0 = 0; v0 < v6; v0++) {
if (contestRank != v9[v0].unk_20_0) {
continue;
}
if (v5 == 1) {
if (v9[v0].unk_20_10 == 1) {
continue;
}
} else {
if ((v9[v0].unk_20_10 == 2) || (v9[v0].unk_20_10 == 3)) {
continue;
}
}
if (isPracticeCompetiton == TRUE) {
if (v9[v0].unk_20_9 == 0) {
continue;
}
} else if (v7 == 1) {
if (v9[v0].unk_20_8 == 0) {
continue;
}
} else {
if ((v9[v0].unk_20_9 == 1) || (v9[v0].unk_20_8 == 1)) {
continue;
}
}
if (contestType == CONTEST_TYPE_COOL && v9[v0].unk_20_3
|| contestType == CONTEST_TYPE_BEAUTY && v9[v0].unk_20_4
|| contestType == CONTEST_TYPE_CUTE && v9[v0].unk_20_5
|| contestType == CONTEST_TYPE_SMART && v9[v0].unk_20_6
|| contestType == CONTEST_TYPE_TOUGH && v9[v0].unk_20_7) {
v2[v3++] = v0;
}
}
v2[v3] = 0xff;
if (v7 == 0) {
GF_ASSERT(v3 >= param2);
v10 = 0;
for (v0 = 0; v0 < v3; v0++) {
if (v9[v2[v0]].unk_20_10 == 3) {
v10++;
}
}
if (v10 > 0) {
v11 = Contest_GetRNGNext(contest) % v10;
for (v0 = 0; v0 < v3; v0++) {
if (v9[v2[v0]].unk_20_10 == 3) {
if (v11 == 0) {
v12 = v9[v2[v0]];
break;
} else {
v11--;
}
}
}
}
for (v0 = 4 - param2; v0 < 4; v0++) {
v4 = Contest_GetRNGNext(contest) % v3;
if (v9[v2[v4]].unk_20_10 == 3) {
v0--;
continue;
}
contest->unk_00.unk_10[v0] = v9[v2[v4]];
for (v1 = v4; v2[v1] != 0xff; v1++) {
v2[v1] = v2[v1 + 1];
}
v3--;
}
if (v10 > 0) {
v4 = 4 - param2;
v4 += Contest_GetRNGNext(contest) % param2;
contest->unk_00.unk_10[v4] = v12;
}
} else {
GF_ASSERT(v3 >= 4);
for (v0 = 0; v0 < 4; v0++) {
contest->unk_00.unk_10[v0] = v9[v2[v0]];
}
}
Heap_Free(v2);
Heap_Free(v9);
}
void sub_020951B0(Contest *contest, enum HeapID heapID)
{
int i, v1;
UnkStruct_020951B0 *v2;
UnkStruct_020951B0 *v3;
int v4;
int v5;
v2 = LoadMemberFromNARC(NARC_INDEX_CONTEST__DATA__CONTEST_DATA, 2, FALSE, heapID, TRUE);
switch (contest->unk_00.competitionType) {
case CONTEST_COMPETITION_VISUAL:
case CONTEST_COMPETITION_DANCE:
case CONTEST_COMPETITION_ACTING:
v4 = 0;
break;
default:
v4 = contest->unk_00.connectionCount;
break;
}
for (i = v4; i < CONTEST_NUM_PARTICIPANTS; i++) {
switch (contest->unk_00.unk_112) {
case 0:
v5 = contest->unk_00.unk_10[i].unk_22;
break;
case 1:
v5 = contest->unk_00.unk_10[i].unk_23;
break;
case 2:
v5 = contest->unk_00.unk_10[i].unk_24;
break;
case 3:
v5 = contest->unk_00.unk_10[i].unk_25;
break;
case 4:
v5 = contest->unk_00.unk_10[i].unk_26;
break;
case 5:
v5 = contest->unk_00.unk_10[i].unk_27;
break;
case 6:
v5 = contest->unk_00.unk_10[i].unk_28;
break;
case 7:
v5 = contest->unk_00.unk_10[i].unk_29;
break;
case 8:
v5 = contest->unk_00.unk_10[i].unk_2A;
break;
case 9:
v5 = contest->unk_00.unk_10[i].unk_2B;
break;
case 10:
v5 = contest->unk_00.unk_10[i].unk_2C;
break;
case 11:
v5 = contest->unk_00.unk_10[i].unk_2D;
break;
default:
GF_ASSERT(FALSE);
v5 = 0;
break;
}
v3 = &v2[v5];
sub_0202A25C(contest->unk_00.unk_E8[i]);
sub_0202A3B0(contest->unk_00.unk_E8[i], contest->unk_00.contestMons[i], v3->unk_51);
for (v1 = 0; v1 < v3->unk_50; v1++) {
sub_0202A3EC(contest->unk_00.unk_E8[i], v1, v3->unk_00[v1].unk_00, v3->unk_00[v1].unk_01, v3->unk_00[v1].unk_02, v3->unk_00[v1].unk_03);
}
sub_0202A35C(contest->unk_00.unk_E8[i], v3->unk_52);
sub_0202A378(contest->unk_00.unk_E8[i], contest->unk_00.contestRank);
}
Heap_Free(v2);
}
void sub_02095338(Contest *contest)
{
int i;
for (i = 0; i < CONTEST_NUM_PARTICIPANTS; i++) {
sub_0202A25C(contest->unk_00.unk_E8[i]);
sub_0202A3B0(contest->unk_00.unk_E8[i], contest->unk_00.contestMons[i], -1);
sub_0202A35C(contest->unk_00.unk_E8[i], 0);
sub_0202A378(contest->unk_00.unk_E8[i], contest->unk_00.contestRank);
}
}
void sub_02095380(const UnkStruct_ov6_02248BE8 *param0, Pokemon *mon, enum HeapID heapID)
{
int i;
u16 v1;
u32 personality = sub_02074128(param0->unk_14, param0->unk_20_12, 0);
Pokemon_InitWith(mon, param0->unk_14, 10, INIT_IVS_RANDOM, TRUE, personality, OTID_NOT_SHINY, 0xf0f0f0f);
for (i = 0; i < LEARNED_MOVES_MAX; i++) {
v1 = param0->unk_0C[i];
Pokemon_SetValue(mon, MON_DATA_MOVE1 + i, &v1);
}
MessageLoader *contestOpponentNames = MessageLoader_Init(MSG_LOADER_LOAD_ON_DEMAND, NARC_INDEX_MSGDATA__PL_MSG, TEXT_BANK_CONTEST_OPPONENT_NAMES, heapID);
String *monNickname = MessageLoader_GetNewString(contestOpponentNames, param0->unk_16);
String *monOTName = MessageLoader_GetNewString(contestOpponentNames, param0->unk_18);
Pokemon_SetValue(mon, MON_DATA_NICKNAME_STRING, monNickname);
Pokemon_SetValue(mon, MON_DATA_OT_NAME_STRING, monOTName);
String_Free(monNickname);
String_Free(monOTName);
MessageLoader_Free(contestOpponentNames);
u8 cool, beauty, cute, smart, tough, sheen;
cool = param0->cool;
beauty = param0->beauty;
cute = param0->cute;
smart = param0->smart;
tough = param0->tough;
sheen = param0->sheen;
Pokemon_SetValue(mon, MON_DATA_COOL, &cool);
Pokemon_SetValue(mon, MON_DATA_BEAUTY, &beauty);
Pokemon_SetValue(mon, MON_DATA_CUTE, &cute);
Pokemon_SetValue(mon, MON_DATA_SMART, &smart);
Pokemon_SetValue(mon, MON_DATA_TOUGH, &tough);
Pokemon_SetValue(mon, MON_DATA_SHEEN, &sheen);
}
PokemonSprite *sub_02095484(PokemonSpriteManager *param0, int param1, Pokemon *param2, int param3, PokemonSpriteData *pokemonSpriteData, enum HeapID heapID, int param6, int param7, int param8)
{
PokemonSpriteTemplate v0;
PokemonSprite *v1;
int v2, v3, v4;
Pokemon_BuildSpriteTemplate(&v0, param2, param3);
v2 = Pokemon_SpriteYOffset(param2, param3);
if (pokemonSpriteData != NULL) {
GF_ASSERT(pokemonSpriteData->tiles != NULL);
CharacterSprite_LoadSpriteFrame0(v0.narcID, v0.character, heapID, pokemonSpriteData->tiles);
pokemonSpriteData->palette = v0.palette;
pokemonSpriteData->narcID = v0.narcID;
}
v1 = PokemonSpriteManager_CreateSprite(param0, &v0, param6, param7 + v2, param8, param1, NULL, NULL);
return v1;
}
void sub_020954F0(Contest *contest, enum HeapID heapID, int param2, enum PokemonContestType contestType, enum PokemonContestRank contestRank)
{
int v0, v1;
u8 v2 = 0, v3 = 0;
u16 v4;
int v5;
UnkStruct_020954F0 *v6;
u8 *v7, *v8;
v6 = LoadMemberFromNARC(NARC_INDEX_CONTEST__DATA__CONTEST_DATA, 1, 0, heapID, 1);
v5 = NARC_GetMemberSizeByIndexPair(NARC_INDEX_CONTEST__DATA__CONTEST_DATA, 1) / sizeof(UnkStruct_020954F0);
v7 = Heap_AllocAtEnd(heapID, v5 + 1);
v8 = Heap_AllocAtEnd(heapID, v5 + 1);
for (v0 = 0; v0 < v5; v0++) {
if (contestRank != v6[v0].unk_04_10) {
continue;
}
if (contestType == CONTEST_TYPE_COOL && v6[v0].unk_04_0) {
if (v6[v0].unk_04_0 > 1) {
v8[v3++] = v0;
} else {
v7[v2++] = v0;
}
} else if (contestType == CONTEST_TYPE_BEAUTY && v6[v0].unk_04_2) {
if (v6[v0].unk_04_2 > 1) {
v8[v3++] = v0;
} else {
v7[v2++] = v0;
}
} else if (contestType == CONTEST_TYPE_CUTE && v6[v0].unk_04_4) {
if (v6[v0].unk_04_4 > 1) {
v8[v3++] = v0;
} else {
v7[v2++] = v0;
}
} else if (contestType == CONTEST_TYPE_SMART && v6[v0].unk_04_6) {
if (v6[v0].unk_04_6 > 1) {
v8[v3++] = v0;
} else {
v7[v2++] = v0;
}
} else if (contestType == CONTEST_TYPE_TOUGH && v6[v0].unk_04_8) {
if (v6[v0].unk_04_8 > 1) {
v8[v3++] = v0;
} else {
v7[v2++] = v0;
}
}
}
v7[v2] = 0xff;
v8[v3] = 0xff;
GF_ASSERT(v2 >= 2);
for (v0 = 0; v0 < 2; v0++) {
contest->unk_00.unk_C0[v0] = v6[v7[v0]];
}
GF_ASSERT(v3 >= 1);
v4 = Contest_GetRNGNext(contest) % v3;
contest->unk_00.unk_C0[2] = v6[v8[v4]];
{
UnkStruct_020954F0 v9;
contest->unk_00.unk_10E = param2;
v9 = contest->unk_00.unk_C0[param2];
contest->unk_00.unk_C0[param2] = contest->unk_00.unk_C0[2];
contest->unk_00.unk_C0[2] = v9;
}
Heap_Free(v8);
Heap_Free(v7);
Heap_Free(v6);
}
s8 sub_02095734(enum ContestEffects contestEffect)
{
GF_ASSERT(contestEffect < (NELEMS(Unk_020F568C)));
return Unk_020F568C[contestEffect].unk_04;
}
void Contest_LoadTwoLineContestEffectMessages(int moveContestEffectID, u32 *lineOneEffectMessageID, u32 *lineTwoEffectMessageID)
{
GF_ASSERT(moveContestEffectID < (NELEMS(Unk_020F568C)));
*lineOneEffectMessageID = Unk_020F568C[moveContestEffectID].lineOneEffectMessageID;
*lineTwoEffectMessageID = Unk_020F568C[moveContestEffectID].lineTwoEffectMessageID;
}
u32 sub_0209577C(int param0)
{
GF_ASSERT(param0 < (NELEMS(Unk_020F568C)));
return 46 + (param0 - 1);
}
void sub_02095790(int contestMoveEffect, int param1, u32 *destMessageID, u32 *param3)
{
GF_ASSERT(contestMoveEffect < (NELEMS(Unk_020F568C)));
switch (param1) {
case 0:
default:
*destMessageID = Unk_020F568C[contestMoveEffect].unk_06;
*param3 = Unk_020F568C[contestMoveEffect].unk_08;
break;
case 1:
*destMessageID = Unk_020F568C[contestMoveEffect].unk_0A;
*param3 = Unk_020F568C[contestMoveEffect].unk_0C;
break;
case 2:
*destMessageID = Unk_020F568C[contestMoveEffect].unk_0E;
*param3 = Unk_020F568C[contestMoveEffect].unk_10;
break;
case 3:
*destMessageID = Unk_020F568C[contestMoveEffect].unk_12;
*param3 = Unk_020F568C[contestMoveEffect].unk_14;
break;
case 4:
*destMessageID = Unk_020F568C[contestMoveEffect].unk_16;
*param3 = Unk_020F568C[contestMoveEffect].unk_18;
break;
}
}
u32 Contest_GetContestRankTitleMessageID(enum PokemonContestRank contestRank, int competitionType, BOOL isLinkContest)
{
u32 messageID;
if (isLinkContest == TRUE) {
return Contest_Text_Link;
}
switch (competitionType) {
case CONTEST_COMPETITION_PRACTICE_VISUAL:
case CONTEST_COMPETITION_PRACTICE_DANCE:
case CONTEST_COMPETITION_PRACTICE_ACTING:
return Contest_Text_Practice;
}
switch (contestRank) {
case CONTEST_RANK_NORMAL:
messageID = Contest_Text_NormalRank;
break;
case CONTEST_RANK_GREAT:
messageID = Contest_Text_GreatRank;
break;
case CONTEST_RANK_ULTRA:
messageID = Contest_Text_UltraRank;
break;
case CONTEST_RANK_MASTER:
default:
messageID = Contest_Text_MasterRank;
break;
}
return messageID;
}
u32 Contest_GetRankMessageID(enum PokemonContestRank contestRank)
{
u32 messageID;
switch (contestRank) {
case CONTEST_RANK_NORMAL:
messageID = Contest_Text_NormalRank;
break;
case CONTEST_RANK_GREAT:
messageID = Contest_Text_GreatRank;
break;
case CONTEST_RANK_ULTRA:
messageID = Contest_Text_UltraRank;
break;
case CONTEST_RANK_MASTER:
messageID = Contest_Text_MasterRank;
break;
case CONTEST_RANK_LINK:
default:
messageID = Contest_Text_Link;
break;
}
return messageID;
}
u32 Contest_GetContestTypeMessageID(enum PokemonContestType contestType)
{
return Contest_GetFullContestTypeMessageID(contestType, 2);
}
u32 Contest_GetFullContestTypeMessageID(enum PokemonContestType contestType, int competitionType)
{
u32 messageID;
if (competitionType == CONTEST_COMPETITION_PRACTICE_DANCE) {
return Contest_Text_Contest;
}
switch (contestType) {
case CONTEST_TYPE_COOL:
messageID = Contest_Text_CoolContest;
break;
case CONTEST_TYPE_BEAUTY:
messageID = Contest_Text_BeautyContest;
break;
case CONTEST_TYPE_CUTE:
messageID = Contest_Text_CuteContest;
break;
case CONTEST_TYPE_SMART:
messageID = Contest_Text_SmartContest;
break;
case CONTEST_TYPE_TOUGH:
default:
messageID = Contest_Text_ToughContest;
break;
}
return messageID;
}
int Contest_ContestantIDToContestantEntryNum(int contestantID)
{
return CONTEST_NUM_PARTICIPANTS - contestantID - 1;
}
int Contest_ContestantEntryNumToContestantID(int contestantEntryNum)
{
return CONTEST_NUM_PARTICIPANTS - contestantEntryNum - 1;
}
BOOL Contest_IsPracticeCompetition(Contest *contest)
{
switch (contest->unk_00.competitionType) {
case CONTEST_COMPETITION_PRACTICE_VISUAL:
case CONTEST_COMPETITION_PRACTICE_DANCE:
case CONTEST_COMPETITION_PRACTICE_ACTING:
return TRUE;
}
return FALSE;
}
int sub_02095928(Contest *contest, int param1)
{
int v0, v1, v2;
const u16 *v3;
const u16 v4[][8] = {
{ 10, 20, 30, 40, 50, 60, 70, 80 },
{ 90, 110, 130, 150, 170, 190, 210, 230 },
{ 170, 200, 230, 260, 290, 320, 350, 380 },
{ 320, 360, 400, 440, 480, 520, 560, 600 },
{ 100, 200, 300, 400, 450, 500, 550, 600 },
};
v0 = 0;
v1 = contest->unk_00.unk_118[param1].unk_00;
if (contest->isLinkContest == TRUE) {
v3 = v4[CONTEST_RANK_LINK];
} else {
v3 = v4[contest->unk_00.contestRank];
}
for (v2 = 0; v2 < 8; v2++) {
if (v1 < v3[v2]) {
return v0;
}
v0++;
}
return v0;
}
int sub_0209598C(Contest *contest, int param1)
{
int v0, v1, v2;
const u8 *v3;
const u8 v4[][3] = {
{ 3, 5, 8 },
{ 5, 10, 15 },
{ 7, 15, 23 },
{ 10, 20, 30 },
{ 10, 20, 30 },
};
v0 = 0;
v1 = contest->unk_00.unk_118[param1].unk_02;
if (v1 == 0) {
return 0;
}
if (contest->isLinkContest == TRUE) {
v3 = v4[CONTEST_RANK_LINK];
} else {
v3 = v4[contest->unk_00.contestRank];
}
v0 = 1;
for (v2 = 0; v2 < 3; v2++) {
if (v1 <= v3[v2]) {
return v0;
}
v0++;
}
return v0;
}
void SetLockTextWithAutoScroll(BOOL lockTextWithAutoScroll)
{
if (lockTextWithAutoScroll == FALSE) {
RenderControlFlags_SetCanABSpeedUpPrint(TRUE);
RenderControlFlags_SetAutoScrollFlags(AUTO_SCROLL_NO_WAIT);
RenderControlFlags_SetSpeedUpOnTouch(TRUE);
} else {
RenderControlFlags_SetAutoScrollFlags(AUTO_SCROLL_ENABLED);
RenderControlFlags_SetCanABSpeedUpPrint(FALSE);
RenderControlFlags_SetSpeedUpOnTouch(FALSE);
}
}
void LockTextSpeed()
{
RenderControlFlags_SetCanABSpeedUpPrint(FALSE);
RenderControlFlags_SetAutoScrollFlags(AUTO_SCROLL_DISABLED);
RenderControlFlags_SetSpeedUpOnTouch(FALSE);
}
u32 CalcMonDataRibbon(enum PokemonContestRank contestRank, enum PokemonContestType contestType)
{
u32 monDataRibbon;
switch (contestType) {
case CONTEST_TYPE_COOL:
monDataRibbon = MON_DATA_SUPER_COOL_RIBBON + contestRank;
break;
case CONTEST_TYPE_BEAUTY:
monDataRibbon = MON_DATA_SUPER_BEAUTY_RIBBON + contestRank;
break;
case CONTEST_TYPE_CUTE:
monDataRibbon = MON_DATA_SUPER_CUTE_RIBBON + contestRank;
break;
case CONTEST_TYPE_SMART:
monDataRibbon = MON_DATA_SUPER_SMART_RIBBON + contestRank;
break;
case CONTEST_TYPE_TOUGH:
monDataRibbon = MON_DATA_SUPER_TOUGH_RIBBON + contestRank;
break;
default:
GF_ASSERT(0);
return MON_DATA_SUPER_COOL_RIBBON;
}
return monDataRibbon;
}
u32 sub_02095A74(enum PokemonContestRank contestRank, BOOL isLinkContest)
{
u8 v0[12];
int arrayLength = 0;
if (contestRank == CONTEST_RANK_MASTER || isLinkContest == TRUE) {
return LCRNG_Next() % 12;
}
MI_CpuClear8(v0, 12);
v0[arrayLength++] = 2;
v0[arrayLength++] = 3;
v0[arrayLength++] = 4;
if (contestRank >= CONTEST_RANK_GREAT) {
v0[arrayLength++] = 0;
v0[arrayLength++] = 1;
v0[arrayLength++] = 5;
}
if (contestRank >= CONTEST_RANK_ULTRA) {
v0[arrayLength++] = 6;
v0[arrayLength++] = 7;
v0[arrayLength++] = 8;
}
return v0[LCRNG_Next() % arrayLength];
}