diff options
author | Marcus Huderle <huderlem@gmail.com> | 2019-02-20 18:05:33 -0600 |
---|---|---|
committer | huderlem <huderlem@gmail.com> | 2019-02-20 18:11:27 -0600 |
commit | 1c6502338e2bf891d6bfbb6e804acff2b674ff29 (patch) | |
tree | 72b01877caed049a355fc97d0d47e748c08477f0 /src | |
parent | 4223bb65f05704ade92ed99d9d5ea58becf1c8ec (diff) |
Decompile contest_link_80F57C4.c
Diffstat (limited to 'src')
-rw-r--r-- | src/contest_link_80F57C4.c | 1593 |
1 files changed, 1575 insertions, 18 deletions
diff --git a/src/contest_link_80F57C4.c b/src/contest_link_80F57C4.c index c72fc9ba3..485065d71 100644 --- a/src/contest_link_80F57C4.c +++ b/src/contest_link_80F57C4.c @@ -1,8 +1,11 @@ #include "global.h" +#include "alloc.h" #include "battle.h" +#include "battle_gfx_sfx_util.h" #include "bg.h" #include "contest.h" #include "contest_link_80F57C4.h" +#include "contest_link_80FC4F4.h" #include "decompress.h" #include "dma3.h" #include "event_data.h" @@ -22,11 +25,13 @@ #include "random.h" #include "save.h" #include "scanline_effect.h" +#include "script.h" #include "sound.h" #include "string_util.h" #include "strings.h" #include "task.h" #include "text.h" +#include "trig.h" #include "tv.h" #include "util.h" #include "window.h" @@ -44,26 +49,38 @@ struct ContestLinkUnk0 u8 unk4; u8 unk5; u8 unk6; - u8 filler7[0x1]; + u8 unk7; u8 spriteId; u8 unk9; u8 unkA; - u8 fillerB[0x9]; + s16 unkC[4]; u8 unk14; u8 filler15[0x3]; }; +struct ContestLinkUnk14 +{ + int unk0; + int unk4; + u32 unk8; + u32 unkC; + u8 unk10; + u8 unk11; + u8 unk12; +}; + struct ContestLinkUnk4 { - u8 filler0[0x50]; + struct ContestLinkUnk14 unk0[4]; }; struct ContestLink80F57C4 { struct ContestLinkUnk0 *unk0; struct ContestLinkUnk4 *unk4; - u8 filler8[0x4]; + u8 *unk8; u8 *unkC[4]; + u8 *unk1C; }; EWRAM_DATA struct ContestLink80F57C4 *gUnknown_0203A034 = NULL; @@ -80,20 +97,23 @@ extern const u8 gUnknown_0858D6D0[]; extern const struct SpriteTemplate gSpriteTemplate_858D7F8; extern const struct SpriteSheet gUnknown_0858D810[]; extern const struct SpritePalette gUnknown_0858D850; +extern const struct SpriteTemplate gSpriteTemplate_858D860; + +extern void sub_81D9DE4(u8); static void sub_80F6A9C(void); static void sub_80F71C8(void); u8 sub_80F7310(u8, u8); s8 sub_80F7364(u8, u8); -void sub_80F7ED0(int, u8 *, int); -void sub_80F7DF4(void); -static void sub_80F6A64(u8, u8); +static void sub_80F7ED0(int, u8 *, int); +static void sub_80F7DF4(void); +static void LoadAllContestMonIcons(u8, u8); static void sub_80F6DC0(void); static void sub_80F6AE8(void); static void sub_80F5CE4(u8); static void sub_80F5C00(void); static void sub_80F68B4(u8); -void sub_80F7880(void); +static void sub_80F7880(void); static void sub_80F5C24(void); static void sub_80F707C(const u8 *); static void sub_80F5ED8(u8); @@ -105,7 +125,8 @@ static void sub_80F68F0(u8); s16 sub_80F6B78(const u8 *, u8); static void sub_80F6E9C(s16, u16, u16, u16); static void sub_80F6058(u8); -void sub_80F7A80(u8, u8); +static void sub_80F7A80(u8, u8); +void sub_80F7CA8(u8); static void sub_80F6EF4(u16); static void sub_80F60F0(u8); static void sub_80F616C(u8); @@ -113,20 +134,29 @@ static void sub_80F6204(u8); static void sub_80F73DC(u8); static void sub_80F74BC(u8); static void sub_80F753C(u8); -void sub_80F77E0(u8, u8); +static void sub_80F77E0(u8, u8); +static void sub_80F7824(u8); static void sub_80F6404(u8); static void sub_80F75A8(struct Sprite *); -void sub_80F7670(u8); +static void sub_80F7670(u8); static void sub_80F7620(struct Sprite *); static void sub_80F66B4(u8); static void sub_80F671C(u8); static void sub_80F677C(u8); static void sub_80F67C4(u8); static void sub_80F6820(u8); -void sub_80F7E64(void); +static void sub_80F7E64(void); static void sub_80F6F68(struct Sprite *); static void sub_80F7014(struct Sprite *); static void sub_80F6FDC(struct Sprite *); +static void sub_80F8508(u8); +static void sub_80F8568(u8); +static void sub_80F8584(u8); +static void sub_80F85A0(u8); +static void sub_80F85BC(u8); +static void sub_80F86B8(u8); +static void sub_80F878C(u8); +static void sub_80F87B4(u8); void sub_80F57C4(void) { @@ -266,7 +296,7 @@ void sub_80F5B00(void) FreeAllSpritePalettes(); sub_80F591C(); sub_80F6A9C(); - sub_80F6A64(0, 1); + LoadAllContestMonIcons(0, 1); sub_80F5AE0(); memset(gUnknown_0203A034->unk0, 0, sizeof(*gUnknown_0203A034->unk0)); memset(gUnknown_0203A034->unk4, 0, sizeof(*gUnknown_0203A034->unk4)); @@ -828,7 +858,7 @@ static void sub_80F68F0(u8 taskId) gUnknown_0203A034->unk0->unkA = 1; } -void sub_80F69B8(u16 species, u8 monIndex, u8 arg2, u8 arg3, u32 personality) +void sub_80F69B8(u16 species, u8 monIndex, u8 srcOffset, u8 useDmaNow, u32 personality) { u8 frameNum; const u8 *iconPtr; @@ -839,8 +869,8 @@ void sub_80F69B8(u16 species, u8 monIndex, u8 arg2, u8 arg3, u32 personality) frameNum = (monIndex == *contestPlayerMonIndex) ? 1 : 0; iconPtr = GetMonIconPtr(species, personality, frameNum); - iconPtr += arg2 * 0x200 + 0x80; - if (arg3) + iconPtr += srcOffset * 0x200 + 0x80; + if (useDmaNow) { RequestDma3Copy(iconPtr, (void *)BG_CHAR_ADDR(1) + monIndex * 0x200, 0x180, 1); var0 = ((monIndex + 10) << 12); @@ -853,12 +883,12 @@ void sub_80F69B8(u16 species, u8 monIndex, u8 arg2, u8 arg3, u32 personality) } } -static void sub_80F6A64(u8 arg0, u8 arg1) +static void LoadAllContestMonIcons(u8 srcOffset, u8 useDmaNow) { int i; for (i = 0; i < 4; i++) - sub_80F69B8(gContestMons[i].species, i, arg0, arg1, gContestMons[i].personality); + sub_80F69B8(gContestMons[i].species, i, srcOffset, useDmaNow, gContestMons[i].personality); } static void sub_80F6A9C(void) @@ -1567,3 +1597,1530 @@ static void sub_80F7620(struct Sprite *sprite) gUnknown_0203A034->unk0->unk6 = 2; } } + +static void sub_80F7670(u8 taskId) +{ + if (++gTasks[taskId].data[0] == 5) + { + gTasks[taskId].data[0] = 0; + if (gUnknown_0203A034->unk0->unk7 < 40) + { + u8 spriteId = CreateSprite(&gSpriteTemplate_858D860, (Random() % 240) - 20, 44, 5); + gSprites[spriteId].data[0] = Random() % 512; + gSprites[spriteId].data[1] = (Random() % 24) + 16; + gSprites[spriteId].data[2] = (Random() % 256) + 48; + gSprites[spriteId].oam.tileNum += Random() % 17; + gUnknown_0203A034->unk0->unk7++; + } + } + + if (gUnknown_0203A034->unk0->unk9) + DestroyTask(taskId); +} + +void sub_80F7768(struct Sprite *sprite) +{ + register s16 var0 asm("r1"); + + sprite->data[3] += sprite->data[0]; + sprite->pos2.x = Sin(sprite->data[3] >> 8, sprite->data[1]); + var0 = sprite->data[4] + sprite->data[2]; + sprite->pos1.x += var0 >> 8; + var0 = var0 & 0xFF; + sprite->data[4] = var0; + sprite->pos1.y++; + if (gUnknown_0203A034->unk0->unk9) + sprite->invisible = 1; + + if (sprite->pos1.x > 248 || sprite->pos1.y > 116) + { + DestroySprite(sprite); + gUnknown_0203A034->unk0->unk7--; + } +} + +static void sub_80F77E0(u8 monIndex, u8 numFrames) +{ + u8 taskId = CreateTask(sub_80F7824, 8); + gTasks[taskId].data[0] = monIndex; + gTasks[taskId].data[1] = numFrames; + gTasks[taskId].data[2] = gContestMons[monIndex].species; +} + +static void sub_80F7824(u8 taskId) +{ + u8 monIndex = gTasks[taskId].data[0]; + if (gTasks[taskId].data[10]++ == gTasks[taskId].data[1]) + { + gTasks[taskId].data[10] = 0; + sub_80F69B8(gTasks[taskId].data[2], monIndex, gTasks[taskId].data[11], FALSE, gContestMons[monIndex].personality); + gTasks[taskId].data[11] ^= 1; + } +} + +// static void sub_80F7880(void) +// { +// int i; +// int var0; +// int var1; +// int var2; +// int var3; +// u32 var4; +// int var5; +// int var6; +// s16 var7; +// s16 var8; +// s16 r2; + +// r2 = gUnknown_02039F08[0]; +// for (i = 1; i < 4; i++) +// { +// if (r2 < gUnknown_02039F08[i]) +// r2 = gUnknown_02039F08[i]; +// } + +// if (r2 < 0) +// { +// r2 = gUnknown_02039F08[0]; +// for (i = 1; i < 4; i++) +// { +// if (r2 > gUnknown_02039F08[i]) +// r2 = gUnknown_02039F08[i]; +// } +// } + +// // _080F78E4 +// for (i = 0; i < 4; i++) +// { +// var0 = gContestMonConditions[i] * 1000; +// var1 = r2; +// if (r2 < 0) +// var1 = -var1; + +// var2 = var0 / var1; +// if (var2 % 10 > 4) +// var2 += 10; + +// gUnknown_0203A034->unk4->unk0[i].unk0 = var2 / 10; +// var3 = gUnknown_02039F18[i]; +// if (var3 < 0) +// var3 = -var3; + +// var0 = var3 * 1000; +// var1 = r2; +// if (r2 < 0) +// var1 = -var1; + +// var2 = var0 / var1; +// if (var2 % 10 > 4) +// var2 += 10; + +// // _080F7966 +// gUnknown_0203A034->unk4->unk0[i].unk4 = var2 / 10; +// if (gUnknown_02039F18[i] < 0) +// gUnknown_0203A034->unk4->unk0[i].unk10 = 1; + +// var4 = gUnknown_0203A034->unk4->unk0[i].unk0 * 22528 / 100; +// if ((var4 & 0xFF) > 0x7F) +// var4 += 0x100; + +// gUnknown_0203A034->unk4->unk0[i].unk8 = var4 >> 8; +// var4 = gUnknown_0203A034->unk4->unk0[i].unk4 * 22528 / 100; +// if ((var4 & 0xFF) > 0x7F) +// var4 += 0x100; + +// gUnknown_0203A034->unk4->unk0[i].unkC = var4 >> 8; +// gUnknown_0203A034->unk4->unk0[i].unk11 = sub_80F7310(i, 1); +// var5 = sub_80F7364(i, 1); +// if (var5 < 0) +// var5 = -var5; + +// gUnknown_0203A034->unk4->unk0[i].unk12 = var5; +// if (gContestFinalStandings[i]) +// { +// var7 = gUnknown_0203A034->unk4->unk0[i].unk8; +// var8 = gUnknown_0203A034->unk4->unk0[i].unkC; +// if (gUnknown_0203A034->unk4->unk0[i].unk10) +// var8 = -var8; + +// if (var7 + var8 == 88) +// { +// if (var8 > 0) +// gUnknown_0203A034->unk4->unk0[i].unkC--; +// else if (var7 > 0) +// gUnknown_0203A034->unk4->unk0[i].unk8--; +// } +// } +// } +// } + +NAKED +static void sub_80F7880(void) +{ + asm_unified("\n\ + push {r4-r7,lr}\n\ + mov r7, r10\n\ + mov r6, r9\n\ + mov r5, r8\n\ + push {r5-r7}\n\ + sub sp, 0x4\n\ + ldr r0, =gUnknown_02039F08\n\ + ldrh r2, [r0]\n\ + adds r4, r0, 0\n\ + adds r3, r4, 0x2\n\ + movs r0, 0x2\n\ + mov r8, r0\n\ +_080F7898:\n\ + lsls r0, r2, 16\n\ + asrs r0, 16\n\ + movs r5, 0\n\ + ldrsh r1, [r3, r5]\n\ + cmp r0, r1\n\ + bge _080F78A6\n\ + ldrh r2, [r3]\n\ +_080F78A6:\n\ + adds r3, 0x2\n\ + movs r0, 0x1\n\ + negs r0, r0\n\ + add r8, r0\n\ + mov r1, r8\n\ + cmp r1, 0\n\ + bge _080F7898\n\ + lsls r0, r2, 16\n\ + str r0, [sp]\n\ + cmp r0, 0\n\ + bge _080F78E4\n\ + ldrh r2, [r4]\n\ + adds r3, r4, 0x2\n\ + movs r4, 0x2\n\ + mov r8, r4\n\ +_080F78C4:\n\ + lsls r0, r2, 16\n\ + asrs r0, 16\n\ + movs r5, 0\n\ + ldrsh r1, [r3, r5]\n\ + cmp r0, r1\n\ + ble _080F78D2\n\ + ldrh r2, [r3]\n\ +_080F78D2:\n\ + adds r3, 0x2\n\ + movs r0, 0x1\n\ + negs r0, r0\n\ + add r8, r0\n\ + lsls r1, r2, 16\n\ + str r1, [sp]\n\ + mov r4, r8\n\ + cmp r4, 0\n\ + bge _080F78C4\n\ +_080F78E4:\n\ + movs r5, 0\n\ + mov r8, r5\n\ + mov r10, r5\n\ +_080F78EA:\n\ + ldr r0, =gContestMonConditions\n\ + mov r1, r8\n\ + lsls r7, r1, 1\n\ + adds r0, r7, r0\n\ + movs r2, 0\n\ + ldrsh r1, [r0, r2]\n\ + lsls r0, r1, 5\n\ + subs r0, r1\n\ + lsls r0, 2\n\ + adds r0, r1\n\ + lsls r0, 3\n\ + ldr r4, [sp]\n\ + asrs r5, r4, 16\n\ + adds r1, r5, 0\n\ + cmp r5, 0\n\ + bge _080F790C\n\ + negs r1, r5\n\ +_080F790C:\n\ + bl __divsi3\n\ + adds r4, r0, 0\n\ + movs r1, 0xA\n\ + bl __modsi3\n\ + cmp r0, 0x4\n\ + ble _080F791E\n\ + adds r4, 0xA\n\ +_080F791E:\n\ + ldr r0, =gUnknown_0203A034\n\ + mov r9, r0\n\ + ldr r0, [r0]\n\ + ldr r0, [r0, 0x4]\n\ + mov r1, r10\n\ + adds r6, r1, r0\n\ + adds r0, r4, 0\n\ + movs r1, 0xA\n\ + bl __divsi3\n\ + str r0, [r6]\n\ + ldr r0, =gUnknown_02039F18\n\ + adds r7, r0\n\ + movs r2, 0\n\ + ldrsh r1, [r7, r2]\n\ + cmp r1, 0\n\ + bge _080F7942\n\ + negs r1, r1\n\ +_080F7942:\n\ + lsls r0, r1, 5\n\ + subs r0, r1\n\ + lsls r0, 2\n\ + adds r0, r1\n\ + lsls r0, 3\n\ + adds r1, r5, 0\n\ + cmp r1, 0\n\ + bge _080F7954\n\ + negs r1, r1\n\ +_080F7954:\n\ + bl __divsi3\n\ + adds r4, r0, 0\n\ + movs r1, 0xA\n\ + bl __modsi3\n\ + cmp r0, 0x4\n\ + ble _080F7966\n\ + adds r4, 0xA\n\ +_080F7966:\n\ + adds r0, r4, 0\n\ + movs r1, 0xA\n\ + bl __divsi3\n\ + str r0, [r6, 0x4]\n\ + movs r4, 0\n\ + ldrsh r0, [r7, r4]\n\ + cmp r0, 0\n\ + bge _080F797C\n\ + movs r0, 0x1\n\ + strb r0, [r6, 0x10]\n\ +_080F797C:\n\ + mov r5, r9\n\ + ldr r0, [r5]\n\ + ldr r0, [r0, 0x4]\n\ + mov r1, r10\n\ + adds r4, r1, r0\n\ + ldr r1, [r4]\n\ + lsls r0, r1, 1\n\ + adds r0, r1\n\ + lsls r0, 2\n\ + subs r0, r1\n\ + lsls r0, 11\n\ + movs r1, 0x64\n\ + bl __divsi3\n\ + adds r1, r0, 0\n\ + movs r5, 0xFF\n\ + ands r0, r5\n\ + cmp r0, 0x7F\n\ + bls _080F79A8\n\ + movs r2, 0x80\n\ + lsls r2, 1\n\ + adds r1, r2\n\ +_080F79A8:\n\ + lsrs r0, r1, 8\n\ + str r0, [r4, 0x8]\n\ + ldr r1, [r4, 0x4]\n\ + lsls r0, r1, 1\n\ + adds r0, r1\n\ + lsls r0, 2\n\ + subs r0, r1\n\ + lsls r0, 11\n\ + movs r1, 0x64\n\ + bl __divsi3\n\ + adds r1, r0, 0\n\ + ands r0, r5\n\ + cmp r0, 0x7F\n\ + bls _080F79CC\n\ + movs r5, 0x80\n\ + lsls r5, 1\n\ + adds r1, r5\n\ +_080F79CC:\n\ + lsrs r0, r1, 8\n\ + str r0, [r4, 0xC]\n\ + mov r0, r8\n\ + lsls r4, r0, 24\n\ + lsrs r4, 24\n\ + adds r0, r4, 0\n\ + movs r1, 0x1\n\ + bl sub_80F7310\n\ + mov r2, r9\n\ + ldr r1, [r2]\n\ + ldr r1, [r1, 0x4]\n\ + add r1, r10\n\ + strb r0, [r1, 0x11]\n\ + adds r0, r4, 0\n\ + movs r1, 0x1\n\ + bl sub_80F7364\n\ + mov r4, r9\n\ + ldr r1, [r4]\n\ + ldr r1, [r1, 0x4]\n\ + add r1, r10\n\ + lsls r0, 24\n\ + asrs r0, 24\n\ + cmp r0, 0\n\ + bge _080F7A02\n\ + negs r0, r0\n\ +_080F7A02:\n\ + strb r0, [r1, 0x12]\n\ + ldr r0, =gContestFinalStandings\n\ + add r0, r8\n\ + ldrb r0, [r0]\n\ + cmp r0, 0\n\ + beq _080F7A60\n\ + mov r5, r9\n\ + ldr r0, [r5]\n\ + ldr r0, [r0, 0x4]\n\ + mov r2, r10\n\ + adds r1, r2, r0\n\ + ldr r5, [r1, 0x8]\n\ + ldrh r3, [r1, 0x8]\n\ + ldr r4, [r1, 0xC]\n\ + ldrh r2, [r1, 0xC]\n\ + ldrb r0, [r1, 0x10]\n\ + cmp r0, 0\n\ + beq _080F7A2C\n\ + lsls r0, r2, 16\n\ + negs r0, r0\n\ + lsrs r2, r0, 16\n\ +_080F7A2C:\n\ + lsls r0, r3, 16\n\ + asrs r3, r0, 16\n\ + lsls r0, r2, 16\n\ + asrs r2, r0, 16\n\ + adds r0, r3, r2\n\ + cmp r0, 0x58\n\ + bne _080F7A60\n\ + cmp r2, 0\n\ + ble _080F7A58\n\ + subs r0, r4, 0x1\n\ + str r0, [r1, 0xC]\n\ + b _080F7A60\n\ + .pool\n\ +_080F7A58:\n\ + cmp r3, 0\n\ + ble _080F7A60\n\ + subs r0, r5, 0x1\n\ + str r0, [r1, 0x8]\n\ +_080F7A60:\n\ + movs r4, 0x14\n\ + add r10, r4\n\ + movs r5, 0x1\n\ + add r8, r5\n\ + mov r0, r8\n\ + cmp r0, 0x3\n\ + bgt _080F7A70\n\ + b _080F78EA\n\ +_080F7A70:\n\ + add sp, 0x4\n\ + pop {r3-r5}\n\ + mov r8, r3\n\ + mov r9, r4\n\ + mov r10, r5\n\ + pop {r4-r7}\n\ + pop {r0}\n\ + bx r0"); +} + +// static void sub_80F7A80(u8 arg0, u8 arg1) +// { +// int i; +// u8 taskId; +// u8 sp8, spC; + +// sp8 = 0; +// spC = 0; +// if (!arg0) +// { +// u32 var0; +// for (i = 0; i < 4; i++) +// { +// int var1 = gUnknown_0203A034->unk4->unk0[i].unk11; +// if (arg1 < var1) +// { +// int x = var1 + 19; +// x -= arg1; +// x--; +// FillBgTilemapBufferRect_Palette0(1, 0x60B3, x, i * 3 + 5, 1, 1); +// taskId = CreateTask(sub_80F7CA8, 10); +// var0 = ((gUnknown_0203A034->unk4->unk0[i].unk8 << 16) / gUnknown_0203A034->unk4->unk0[i].unk11) * (arg1 + 1); +// var0 &= 0xFFFF; +// if (var0 > 0x7FFF) +// var0 += 0x10000; + +// gTasks[taskId].data[0] = i; +// gTasks[taskId].data[1] = var0 >> 16; +// gUnknown_0203A034->unk0->unk14++; +// sp8++; +// } +// } +// } +// else +// { +// u32 var0; +// for (i = 0; i < 4; i++) +// { +// int tile; +// s8 var1 = gUnknown_0203A034->unk4->unk0[i].unk12; +// tile = gUnknown_0203A034->unk4->unk0[i].unk10 ? 0x60A5 : 0x60A3; +// if (arg1 < var1) +// { +// int thing = ((s8)arg1 - 19); +// int x = var1 - thing; +// x--; +// FillBgTilemapBufferRect_Palette0(1, tile, x, i * 3 + 6, 1, 1); +// taskId = CreateTask(sub_80F7CA8, 10); +// var0 = ((gUnknown_0203A034->unk4->unk0[i].unkC << 16) / gUnknown_0203A034->unk4->unk0[i].unk12) * (arg1 + 1); +// var0 &= 0xFFFF; +// if (var0 > 0x7FFF) +// var0 += 0x10000; + +// gTasks[taskId].data[0] = i; +// if (gUnknown_0203A034->unk4->unk0[i].unk10) +// { +// gTasks[taskId].data[2] = 1; +// spC++; +// } +// else +// { +// sp8++; +// } + +// if (gUnknown_0203A034->unk4->unk0[i].unk10) +// gTasks[taskId].data[1] = gUnknown_0203A034->unk4->unk0[i].unk8 - (var0 >> 16); +// else +// gTasks[taskId].data[1] = gUnknown_0203A034->unk4->unk0[i].unk8 + (var0 >> 16); + +// gUnknown_0203A034->unk0->unk14++; +// } +// } +// } + +// if (spC) +// PlaySE(SE_PIN); + +// if (sp8) +// PlaySE(SE_BAN); +// } + +NAKED +static void sub_80F7A80(u8 arg0, u8 arg1) +{ + asm_unified("\n\ + push {r4-r7,lr}\n\ + mov r7, r10\n\ + mov r6, r9\n\ + mov r5, r8\n\ + push {r5-r7}\n\ + sub sp, 0x14\n\ + lsls r0, 24\n\ + lsls r1, 24\n\ + lsrs r1, 24\n\ + mov r8, r1\n\ + movs r1, 0\n\ + str r1, [sp, 0x8]\n\ + movs r3, 0\n\ + str r3, [sp, 0xC]\n\ + cmp r0, 0\n\ + bne _080F7B5C\n\ + mov r9, r3\n\ + ldr r4, =gUnknown_0203A034\n\ + mov r10, r4\n\ + movs r7, 0xA0\n\ + lsls r7, 19\n\ + movs r6, 0\n\ +_080F7AAC:\n\ + mov r1, r10\n\ + ldr r0, [r1]\n\ + ldr r0, [r0, 0x4]\n\ + adds r0, r6, r0\n\ + ldrb r2, [r0, 0x11]\n\ + cmp r8, r2\n\ + bcs _080F7B2E\n\ + adds r2, 0x13\n\ + mov r3, r8\n\ + subs r2, r3\n\ + subs r2, 0x1\n\ + lsls r2, 24\n\ + lsrs r2, 24\n\ + lsrs r3, r7, 24\n\ + movs r0, 0x1\n\ + str r0, [sp]\n\ + str r0, [sp, 0x4]\n\ + ldr r1, =0x000060b3\n\ + bl FillBgTilemapBufferRect_Palette0\n\ + ldr r0, =sub_80F7CA8\n\ + movs r1, 0xA\n\ + bl CreateTask\n\ + lsls r0, 24\n\ + lsrs r5, r0, 24\n\ + mov r0, r10\n\ + ldr r4, [r0]\n\ + ldr r1, [r4, 0x4]\n\ + adds r1, r6, r1\n\ + ldr r0, [r1, 0x8]\n\ + lsls r0, 16\n\ + ldrb r1, [r1, 0x11]\n\ + bl __udivsi3\n\ + mov r1, r8\n\ + adds r1, 0x1\n\ + adds r3, r0, 0\n\ + muls r3, r1\n\ + ldr r0, =0x0000ffff\n\ + ands r0, r3\n\ + ldr r1, =0x00007fff\n\ + cmp r0, r1\n\ + bls _080F7B0A\n\ + movs r1, 0x80\n\ + lsls r1, 9\n\ + adds r3, r1\n\ +_080F7B0A:\n\ + ldr r1, =gTasks\n\ + lsls r0, r5, 2\n\ + adds r0, r5\n\ + lsls r0, 3\n\ + adds r0, r1\n\ + mov r1, r9\n\ + strh r1, [r0, 0x8]\n\ + lsrs r1, r3, 16\n\ + strh r1, [r0, 0xA]\n\ + ldr r1, [r4]\n\ + ldrb r0, [r1, 0x14]\n\ + adds r0, 0x1\n\ + strb r0, [r1, 0x14]\n\ + ldr r0, [sp, 0x8]\n\ + adds r0, 0x1\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + str r0, [sp, 0x8]\n\ +_080F7B2E:\n\ + movs r3, 0xC0\n\ + lsls r3, 18\n\ + adds r7, r3\n\ + adds r6, 0x14\n\ + movs r4, 0x1\n\ + add r9, r4\n\ + mov r0, r9\n\ + cmp r0, 0x3\n\ + ble _080F7AAC\n\ + b _080F7C7E\n\ + .pool\n\ +_080F7B5C:\n\ + movs r1, 0\n\ + mov r9, r1\n\ + mov r10, r1\n\ + movs r3, 0xC0\n\ + lsls r3, 19\n\ + str r3, [sp, 0x10]\n\ +_080F7B68:\n\ + ldr r4, =gUnknown_0203A034\n\ + ldr r0, [r4]\n\ + ldr r0, [r0, 0x4]\n\ + add r0, r10\n\ + ldrb r2, [r0, 0x12]\n\ + ldrb r0, [r0, 0x10]\n\ + ldr r1, =0x000060a3\n\ + cmp r0, 0\n\ + beq _080F7B7C\n\ + adds r1, 0x2\n\ +_080F7B7C:\n\ + lsls r0, r2, 24\n\ + asrs r0, 24\n\ + cmp r8, r0\n\ + bge _080F7C64\n\ + mov r3, r8\n\ + lsls r2, r3, 24\n\ + asrs r2, 24\n\ + subs r2, 0x13\n\ + subs r2, r0, r2\n\ + subs r2, 0x1\n\ + lsls r2, 24\n\ + lsrs r2, 24\n\ + ldr r4, [sp, 0x10]\n\ + lsrs r3, r4, 24\n\ + movs r7, 0x1\n\ + str r7, [sp]\n\ + str r7, [sp, 0x4]\n\ + movs r0, 0x1\n\ + bl FillBgTilemapBufferRect_Palette0\n\ + ldr r0, =sub_80F7CA8\n\ + movs r1, 0xA\n\ + bl CreateTask\n\ + lsls r0, 24\n\ + lsrs r5, r0, 24\n\ + ldr r0, =gUnknown_0203A034\n\ + ldr r6, [r0]\n\ + ldr r1, [r6, 0x4]\n\ + add r1, r10\n\ + ldr r0, [r1, 0xC]\n\ + lsls r0, 16\n\ + ldrb r1, [r1, 0x12]\n\ + bl __udivsi3\n\ + mov r1, r8\n\ + adds r1, 0x1\n\ + adds r3, r0, 0\n\ + muls r3, r1\n\ + ldr r0, =0x0000ffff\n\ + ands r0, r3\n\ + ldr r1, =0x00007fff\n\ + cmp r0, r1\n\ + bls _080F7BDA\n\ + movs r1, 0x80\n\ + lsls r1, 9\n\ + adds r3, r1\n\ +_080F7BDA:\n\ + ldr r1, =gTasks\n\ + lsls r2, r5, 2\n\ + adds r0, r2, r5\n\ + lsls r0, 3\n\ + adds r4, r0, r1\n\ + mov r0, r9\n\ + strh r0, [r4, 0x8]\n\ + ldr r0, [r6, 0x4]\n\ + add r0, r10\n\ + ldrb r0, [r0, 0x10]\n\ + adds r6, r1, 0\n\ + cmp r0, 0\n\ + beq _080F7C1C\n\ + strh r7, [r4, 0xC]\n\ + ldr r0, [sp, 0xC]\n\ + adds r0, 0x1\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + str r0, [sp, 0xC]\n\ + b _080F7C26\n\ + .pool\n\ +_080F7C1C:\n\ + ldr r0, [sp, 0x8]\n\ + adds r0, 0x1\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + str r0, [sp, 0x8]\n\ +_080F7C26:\n\ + ldr r1, =gUnknown_0203A034\n\ + ldr r0, [r1]\n\ + ldr r0, [r0, 0x4]\n\ + mov r4, r10\n\ + adds r1, r4, r0\n\ + ldrb r0, [r1, 0x10]\n\ + ldr r4, =gUnknown_0203A034\n\ + cmp r0, 0\n\ + beq _080F7C4C\n\ + adds r0, r2, r5\n\ + lsls r0, 3\n\ + adds r0, r6\n\ + lsrs r2, r3, 16\n\ + ldr r1, [r1, 0x8]\n\ + subs r1, r2\n\ + b _080F7C58\n\ + .pool\n\ +_080F7C4C:\n\ + adds r0, r2, r5\n\ + lsls r0, 3\n\ + adds r0, r6\n\ + lsrs r2, r3, 16\n\ + ldr r1, [r1, 0x8]\n\ + adds r1, r2\n\ +_080F7C58:\n\ + strh r1, [r0, 0xA]\n\ + ldr r0, [r4]\n\ + ldr r1, [r0]\n\ + ldrb r0, [r1, 0x14]\n\ + adds r0, 0x1\n\ + strb r0, [r1, 0x14]\n\ +_080F7C64:\n\ + movs r0, 0x14\n\ + add r10, r0\n\ + ldr r1, [sp, 0x10]\n\ + movs r3, 0xC0\n\ + lsls r3, 18\n\ + adds r1, r3\n\ + str r1, [sp, 0x10]\n\ + movs r4, 0x1\n\ + add r9, r4\n\ + mov r0, r9\n\ + cmp r0, 0x3\n\ + bgt _080F7C7E\n\ + b _080F7B68\n\ +_080F7C7E:\n\ + ldr r1, [sp, 0xC]\n\ + cmp r1, 0\n\ + beq _080F7C8A\n\ + movs r0, 0x16\n\ + bl PlaySE\n\ +_080F7C8A:\n\ + ldr r3, [sp, 0x8]\n\ + cmp r3, 0\n\ + beq _080F7C96\n\ + movs r0, 0x15\n\ + bl PlaySE\n\ +_080F7C96:\n\ + add sp, 0x14\n\ + pop {r3-r5}\n\ + mov r8, r3\n\ + mov r9, r4\n\ + mov r10, r5\n\ + pop {r4-r7}\n\ + pop {r0}\n\ + bx r0"); +} + +#ifdef NONMATCHING +void sub_80F7CA8(u8 taskId) +{ + register int r4 asm("r4"); + int r9; + u8 r6; + s16 r7; + s16 r12; + int i; + u8 var0; + u16 tileNum; + + r4 = 0; + r9 = 0; + r6 = gTasks[taskId].data[0]; + r7 = gTasks[taskId].data[1]; + r12 = gTasks[taskId].data[2]; + if (r12) + { + if (gUnknown_0203A034->unk0->unkC[r6] <= 0) + r4 = 1; + } + else + { + if (gUnknown_0203A034->unk0->unkC[r6] > 87) + r4 = 1; + } + + if (gUnknown_0203A034->unk0->unkC[r6] == r7) + r9 = 1; + + if (!r9) + { + if (r4) + gUnknown_0203A034->unk0->unkC[r6] = r7; + else if (r12) + gUnknown_0203A034->unk0->unkC[r6] = gUnknown_0203A034->unk0->unkC[r6] - 1; + else + gUnknown_0203A034->unk0->unkC[r6] = gUnknown_0203A034->unk0->unkC[r6] + 1; + } + + if (!r4 && !r9) + { + for (i = 0; i < 11; i++) + { + if (gUnknown_0203A034->unk0->unkC[r6] >= (i + 1) * 8) + { + var0 = 8; + } + else if (gUnknown_0203A034->unk0->unkC[r6] >= i * 8) + { + int var2 = gUnknown_0203A034->unk0->unkC[r6]; + int var1 = var2; + if (var1 < 0) + var1 += 7; + + var0 = var2 - ((var1 >> 3) << 3); + } + else + { + var0 = 0; + } + + if (var0 < 4) + tileNum = 0x504C; + else + tileNum = 0x5057; + + FillBgTilemapBufferRect_Palette0(2, tileNum + var0, i + 7, r6 * 3 + 6, 1, 1); + } + } + + if (r9) + { + gUnknown_0203A034->unk0->unk14--; + DestroyTask(taskId); + } +} +#else +NAKED +void sub_80F7CA8(u8 taskId) +{ + asm_unified("\n\ + push {r4-r7,lr}\n\ + mov r7, r9\n\ + mov r6, r8\n\ + push {r6,r7}\n\ + sub sp, 0x8\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + mov r8, r0\n\ + movs r4, 0\n\ + mov r9, r4\n\ + ldr r1, =gTasks\n\ + lsls r0, 2\n\ + add r0, r8\n\ + lsls r0, 3\n\ + adds r0, r1\n\ + ldrb r6, [r0, 0x8]\n\ + ldrh r7, [r0, 0xA]\n\ + ldrh r1, [r0, 0xC]\n\ + mov r12, r1\n\ + movs r2, 0xC\n\ + ldrsh r0, [r0, r2]\n\ + cmp r0, 0\n\ + beq _080F7CF8\n\ + ldr r2, =gUnknown_0203A034\n\ + ldr r0, [r2]\n\ + ldr r0, [r0]\n\ + lsls r1, r6, 1\n\ + adds r0, 0xC\n\ + adds r0, r1\n\ + movs r3, 0\n\ + ldrsh r0, [r0, r3]\n\ + adds r5, r1, 0\n\ + cmp r0, 0\n\ + bgt _080F7D10\n\ + b _080F7D0E\n\ + .pool\n\ +_080F7CF8:\n\ + ldr r2, =gUnknown_0203A034\n\ + ldr r0, [r2]\n\ + ldr r0, [r0]\n\ + lsls r1, r6, 1\n\ + adds r0, 0xC\n\ + adds r0, r1\n\ + movs r3, 0\n\ + ldrsh r0, [r0, r3]\n\ + adds r5, r1, 0\n\ + cmp r0, 0x57\n\ + ble _080F7D10\n\ +_080F7D0E:\n\ + movs r4, 0x1\n\ +_080F7D10:\n\ + ldr r0, [r2]\n\ + ldr r0, [r0]\n\ + adds r0, 0xC\n\ + adds r2, r0, r5\n\ + ldrh r3, [r2]\n\ + movs r0, 0\n\ + ldrsh r1, [r2, r0]\n\ + lsls r0, r7, 16\n\ + asrs r0, 16\n\ + cmp r1, r0\n\ + bne _080F7D2A\n\ + movs r1, 0x1\n\ + mov r9, r1\n\ +_080F7D2A:\n\ + mov r0, r9\n\ + cmp r0, 0\n\ + bne _080F7D4A\n\ + cmp r4, 0\n\ + beq _080F7D3C\n\ + strh r7, [r2]\n\ + b _080F7D4A\n\ + .pool\n\ +_080F7D3C:\n\ + mov r1, r12\n\ + cmp r1, 0\n\ + beq _080F7D46\n\ + subs r0, r3, 0x1\n\ + b _080F7D48\n\ +_080F7D46:\n\ + adds r0, r3, 0x1\n\ +_080F7D48:\n\ + strh r0, [r2]\n\ +_080F7D4A:\n\ + cmp r4, 0\n\ + bne _080F7DC4\n\ + mov r2, r9\n\ + cmp r2, 0\n\ + bne _080F7DCA\n\ + movs r2, 0\n\ +_080F7D56:\n\ + ldr r0, =gUnknown_0203A034\n\ + ldr r0, [r0]\n\ + ldr r0, [r0]\n\ + adds r0, 0xC\n\ + adds r0, r5\n\ + movs r1, 0\n\ + ldrsh r3, [r0, r1]\n\ + adds r0, r2, 0x1\n\ + lsls r1, r0, 3\n\ + adds r4, r0, 0\n\ + cmp r3, r1\n\ + blt _080F7D78\n\ + movs r0, 0x8\n\ + b _080F7D94\n\ + .pool\n\ +_080F7D78:\n\ + lsls r0, r2, 3\n\ + cmp r3, r0\n\ + blt _080F7D92\n\ + adds r0, r3, 0\n\ + cmp r3, 0\n\ + bge _080F7D86\n\ + adds r0, r3, 0x7\n\ +_080F7D86:\n\ + asrs r0, 3\n\ + lsls r0, 3\n\ + subs r0, r3, r0\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + b _080F7D94\n\ +_080F7D92:\n\ + movs r0, 0\n\ +_080F7D94:\n\ + cmp r0, 0x3\n\ + bhi _080F7DA0\n\ + ldr r3, =0x0000504c\n\ + b _080F7DA2\n\ + .pool\n\ +_080F7DA0:\n\ + ldr r3, =0x00005057\n\ +_080F7DA2:\n\ + adds r1, r0, r3\n\ + adds r2, 0x7\n\ + lsls r2, 24\n\ + lsrs r2, 24\n\ + adds r3, r5, r6\n\ + adds r3, 0x6\n\ + lsls r3, 24\n\ + movs r0, 0x1\n\ + str r0, [sp]\n\ + str r0, [sp, 0x4]\n\ + movs r0, 0x2\n\ + lsrs r3, 24\n\ + bl FillBgTilemapBufferRect_Palette0\n\ + adds r2, r4, 0\n\ + cmp r2, 0xA\n\ + ble _080F7D56\n\ +_080F7DC4:\n\ + mov r0, r9\n\ + cmp r0, 0\n\ + beq _080F7DDC\n\ +_080F7DCA:\n\ + ldr r0, =gUnknown_0203A034\n\ + ldr r0, [r0]\n\ + ldr r1, [r0]\n\ + ldrb r0, [r1, 0x14]\n\ + subs r0, 0x1\n\ + strb r0, [r1, 0x14]\n\ + mov r0, r8\n\ + bl DestroyTask\n\ +_080F7DDC:\n\ + add sp, 0x8\n\ + pop {r3,r4}\n\ + mov r8, r3\n\ + mov r9, r4\n\ + pop {r4-r7}\n\ + pop {r0}\n\ + bx r0\n\ + .pool"); +} +#endif // NONMATCHING + +static void sub_80F7DF4(void) +{ + gUnknown_0203A034 = AllocZeroed(sizeof(*gUnknown_0203A034)); + gUnknown_0203A034->unk0 = AllocZeroed(sizeof(*gUnknown_0203A034->unk0)); + gUnknown_0203A034->unk4 = AllocZeroed(sizeof(*gUnknown_0203A034->unk4)); + gUnknown_0203A034->unk8 = AllocZeroed(BG_SCREEN_SIZE); + gUnknown_0203A034->unkC[0] = AllocZeroed(BG_SCREEN_SIZE); + gUnknown_0203A034->unkC[1] = AllocZeroed(BG_SCREEN_SIZE); + gUnknown_0203A034->unkC[2] = AllocZeroed(BG_SCREEN_SIZE); + gUnknown_0203A034->unkC[3] = AllocZeroed(BG_SCREEN_SIZE); + gUnknown_0203A034->unk1C = AllocZeroed(0x1000); + AllocateMonSpritesGfx(); +} + +static void sub_80F7E64(void) +{ + FREE_AND_SET_NULL(gUnknown_0203A034->unk0); + FREE_AND_SET_NULL(gUnknown_0203A034->unk4); + FREE_AND_SET_NULL(gUnknown_0203A034->unk8); + FREE_AND_SET_NULL(gUnknown_0203A034->unkC[0]); + FREE_AND_SET_NULL(gUnknown_0203A034->unkC[1]); + FREE_AND_SET_NULL(gUnknown_0203A034->unkC[2]); + FREE_AND_SET_NULL(gUnknown_0203A034->unkC[3]); + FREE_AND_SET_NULL(gUnknown_0203A034->unk1C); + FREE_AND_SET_NULL(gUnknown_0203A034); + FreeMonSpritesGfx(); +} + +static void sub_80F7ED0(int windowId, u8 *str, int arg2) +{ + struct TextPrinterTemplate textPrinter; + textPrinter.currentChar = str; + textPrinter.windowId = windowId; + textPrinter.fontId = 7; + textPrinter.x = arg2; + textPrinter.y = 2; + textPrinter.currentX = arg2; + textPrinter.currentY = 2; + textPrinter.letterSpacing = 0; + textPrinter.lineSpacing = 0; + textPrinter.unk = 0; + textPrinter.fgColor = 1; + textPrinter.bgColor = 0; + textPrinter.shadowColor = 8; + AddTextPrinter(&textPrinter, 0, NULL); + PutWindowTilemap(windowId); +} + +void sub_80F7F30(void) +{ + u8 result = sub_80DAE0C(&gPlayerParty[gContestMonPartyIndex]); + if (result) + { + sub_80DAB8C(gSpecialVar_ContestCategory, gSpecialVar_ContestRank); + sub_80DB09C(gSpecialVar_ContestCategory); + } + + gSpecialVar_Result = result; +} + +u16 sub_80F7F7C(void) +{ + u16 result = 0; + struct Pokemon *mon = &gPlayerParty[gContestMonPartyIndex]; + switch (gSpecialVar_ContestCategory) + { + case CONTEST_CATEGORY_COOL: + if (GetMonData(mon, MON_DATA_COOL_RIBBON) > gSpecialVar_ContestRank) + result = 1; + break; + case CONTEST_CATEGORY_BEAUTY: + if (GetMonData(mon, MON_DATA_BEAUTY_RIBBON) > gSpecialVar_ContestRank) + result = 1; + break; + case CONTEST_CATEGORY_CUTE: + if (GetMonData(mon, MON_DATA_CUTE_RIBBON) > gSpecialVar_ContestRank) + result = 1; + break; + case CONTEST_CATEGORY_SMART: + if (GetMonData(mon, MON_DATA_SMART_RIBBON) > gSpecialVar_ContestRank) + result = 1; + break; + case CONTEST_CATEGORY_TOUGH: + if (GetMonData(mon, MON_DATA_TOUGH_RIBBON) > gSpecialVar_ContestRank) + result = 1; + break; + } + + return result; +} + +void sub_80F7FFC(void) +{ + u8 ribbonData; + + if (gContestFinalStandings[gContestPlayerMonIndex] != 0) + return; + + switch (gSpecialVar_ContestCategory) + { + case CONTEST_CATEGORY_COOL: + ribbonData = GetMonData(&gPlayerParty[gContestMonPartyIndex], MON_DATA_COOL_RIBBON); + if (ribbonData <= gSpecialVar_ContestRank && ribbonData < 4) + { + ribbonData++; + SetMonData(&gPlayerParty[gContestMonPartyIndex], MON_DATA_COOL_RIBBON, &ribbonData); + if (GetRibbonCount(&gPlayerParty[gContestMonPartyIndex]) > 4) + sub_80EE4DC(&gPlayerParty[gContestMonPartyIndex], MON_DATA_COOL_RIBBON); + } + break; + case CONTEST_CATEGORY_BEAUTY: + ribbonData = GetMonData(&gPlayerParty[gContestMonPartyIndex], MON_DATA_BEAUTY_RIBBON); + if (ribbonData <= gSpecialVar_ContestRank && ribbonData < 4) + { + ribbonData++; + SetMonData(&gPlayerParty[gContestMonPartyIndex], MON_DATA_BEAUTY_RIBBON, &ribbonData); + if (GetRibbonCount(&gPlayerParty[gContestMonPartyIndex]) > 4) + sub_80EE4DC(&gPlayerParty[gContestMonPartyIndex], MON_DATA_BEAUTY_RIBBON); + } + break; + case CONTEST_CATEGORY_CUTE: + ribbonData = GetMonData(&gPlayerParty[gContestMonPartyIndex], MON_DATA_CUTE_RIBBON); + if (ribbonData <= gSpecialVar_ContestRank && ribbonData < 4) + { + ribbonData++; + SetMonData(&gPlayerParty[gContestMonPartyIndex], MON_DATA_CUTE_RIBBON, &ribbonData); + if (GetRibbonCount(&gPlayerParty[gContestMonPartyIndex]) > 4) + sub_80EE4DC(&gPlayerParty[gContestMonPartyIndex], MON_DATA_CUTE_RIBBON); + } + break; + case CONTEST_CATEGORY_SMART: + ribbonData = GetMonData(&gPlayerParty[gContestMonPartyIndex], MON_DATA_SMART_RIBBON); + if (ribbonData <= gSpecialVar_ContestRank && ribbonData < 4) + { + ribbonData++; + SetMonData(&gPlayerParty[gContestMonPartyIndex], MON_DATA_SMART_RIBBON, &ribbonData); + if (GetRibbonCount(&gPlayerParty[gContestMonPartyIndex]) > 4) + sub_80EE4DC(&gPlayerParty[gContestMonPartyIndex], MON_DATA_SMART_RIBBON); + } + break; + case CONTEST_CATEGORY_TOUGH: + ribbonData = GetMonData(&gPlayerParty[gContestMonPartyIndex], MON_DATA_TOUGH_RIBBON); + if (ribbonData <= gSpecialVar_ContestRank && ribbonData < 4) + { + ribbonData++; + SetMonData(&gPlayerParty[gContestMonPartyIndex], MON_DATA_TOUGH_RIBBON, &ribbonData); + if (GetRibbonCount(&gPlayerParty[gContestMonPartyIndex]) > 4) + sub_80EE4DC(&gPlayerParty[gContestMonPartyIndex], MON_DATA_TOUGH_RIBBON); + } + break; + } +} + +void sub_80F8264(void) +{ + StringCopy(gStringVar1, gContestMons[gSpecialVar_0x8006].trainerName); + sub_81DB5AC(gStringVar1); +} + +void sub_80F8290(void) +{ + StringCopy(gStringVar3, gContestMons[gSpecialVar_0x8006].nickname); +} + +void sub_80F82B4(void) +{ + u8 i; + u8 count; + + for (i = 0, count = 0; i < 4; i++) + { + if (gContestMonConditions[gSpecialVar_0x8006] < gContestMonConditions[i]) + count++; + } + + gSpecialVar_0x8004 = count; +} + +void sub_80F82FC(void) +{ + gSpecialVar_0x8004 = gContestMonConditions[gSpecialVar_0x8006]; +} + +void sub_80F831C(void) +{ + u8 i; + + for (i = 0; i < 4 && gContestFinalStandings[i] != 0; i++) + ; + + gSpecialVar_0x8005 = i; +} + +void sub_80F834C(void) +{ + u8 i; + + for (i = 0; i < 4 && gContestFinalStandings[i] != 0; i++) + ; + + StringCopy(gStringVar3, gContestMons[i].trainerName); + sub_81DB5AC(gStringVar3); +} + +void sub_80F8390(void) +{ + u8 i; + + for (i = 0; i < 4 && gContestFinalStandings[i] != 0; i++) + ; + + StringCopy(gStringVar1, gContestMons[i].nickname); +} + +void sub_80F83D0(void) +{ + SetMainCallback2(sub_80D7B24); +} + +static void sub_80F83E0(u8 taskId) +{ + if (!gPaletteFade.active) + { + DestroyTask(taskId); + SetMainCallback2(sub_80F83D0); + } +} + +void sub_80F840C(void) +{ + ScriptContext2_Enable(); + CreateTask(sub_80F83E0, 10); + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_BLACK); +} + +void sub_80F8438(void) +{ + gSpecialVar_0x8004 = gContestMons[gSpecialVar_0x8006].species; +} + +static void sub_80F8458(u8 taskId) +{ + if (!gPaletteFade.active) + { + DestroyTask(taskId); + SetMainCallback2(sub_80F5B00); + } +} + +void sub_80F8484(void) +{ + ScriptContext2_Enable(); + CreateTask(sub_80F8458, 10); + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_BLACK); +} + +void sub_80F84B0(void) +{ + gSpecialVar_0x8004 = gContestPlayerMonIndex; +} + +void sub_80F84C4(u8 taskId) +{ + u8 newTaskId; + ScriptContext2_Enable(); + newTaskId = CreateTask(sub_80FC580, 0); + SetTaskFuncWithFollowupFunc(newTaskId, sub_80FC580, sub_80F8508); + gTasks[newTaskId].data[9] = taskId; +} + +static void sub_80F8508(u8 taskId) +{ + if (gIsLinkContest & 0x4) + { + sub_80DA8C8(gContestMonPartyIndex); + SetTaskFuncWithFollowupFunc(taskId, sub_80FC6BC, sub_80F8568); + } + else + { + sub_80DA8C8(gContestMonPartyIndex); + gTasks[taskId].func = sub_81D9DE4; + } +} + +static void sub_80F8568(u8 taskId) +{ + SetTaskFuncWithFollowupFunc(taskId, sub_80FC804, sub_80F8584); +} + +static void sub_80F8584(u8 taskId) +{ + SetTaskFuncWithFollowupFunc(taskId, sub_80FCE48, sub_80F85A0); +} + +static void sub_80F85A0(u8 taskId) +{ + SetTaskFuncWithFollowupFunc(taskId, sub_80FC894, sub_80F85BC); +} + +#ifdef NONMATCHING +static void sub_80F85BC(u8 taskId) +{ + u32 i; + u8 sp0[4]; + u8 sp4[4]; + + memset(sp0, 0, sizeof(sp0)); + memset(sp4, 0, sizeof(sp4)); + + for (i = 0; i < gNumLinkContestPlayers; i++) + sp0[i] = gTasks[taskId].data[i + 1]; + + for (i = 0; i < gNumLinkContestPlayers; i++) + { + if (sp0[0] != sp0[i + 1]) + break; + } + + if (i == gNumLinkContestPlayers) + gSpecialVar_0x8004 = 0; + else + gSpecialVar_0x8004 = 1; + + for (i = 0; i < gNumLinkContestPlayers; i++) + sp4[i] = gTasks[taskId].data[i + 5]; + + gUnknown_02039F2B = sub_80F86E0(sp4); + sub_80DB09C(gSpecialVar_ContestCategory); + SetTaskFuncWithFollowupFunc(taskId, sub_80FCF40, sub_80F86B8); +} +#else +NAKED +static void sub_80F85BC(u8 taskId) +{ + asm_unified("\n\ + push {r4-r7,lr}\n\ + mov r7, r9\n\ + mov r6, r8\n\ + push {r6,r7}\n\ + sub sp, 0x8\n\ + lsls r0, 24\n\ + lsrs r6, r0, 24\n\ + movs r0, 0\n\ + str r0, [sp]\n\ + str r0, [sp, 0x4]\n\ + movs r3, 0\n\ + ldr r5, =gNumLinkContestPlayers\n\ + mov r12, r5\n\ + ldr r0, =gSpecialVar_0x8004\n\ + mov r9, r0\n\ + add r1, sp, 0x4\n\ + mov r8, r1\n\ + ldrb r0, [r5]\n\ + cmp r3, r0\n\ + bcs _080F8606\n\ + lsls r0, r6, 2\n\ + adds r0, r6\n\ + lsls r4, r0, 3\n\ + ldr r7, =gTasks + 0x8\n\ +_080F85EC:\n\ + mov r1, sp\n\ + adds r2, r1, r3\n\ + adds r1, r3, 0x1\n\ + lsls r0, r1, 1\n\ + adds r0, r4\n\ + adds r0, r7\n\ + ldrh r0, [r0]\n\ + strb r0, [r2]\n\ + lsls r1, 24\n\ + lsrs r3, r1, 24\n\ + ldrb r0, [r5]\n\ + cmp r3, r0\n\ + bcc _080F85EC\n\ +_080F8606:\n\ + movs r3, 0\n\ + mov r1, r12\n\ + ldrb r0, [r1]\n\ + cmp r3, r0\n\ + bcs _080F862A\n\ + adds r4, r0, 0\n\ + mov r2, sp\n\ +_080F8614:\n\ + adds r0, r3, 0x1\n\ + lsls r0, 24\n\ + lsrs r3, r0, 24\n\ + cmp r3, r4\n\ + bcs _080F862A\n\ + mov r0, sp\n\ + adds r1, r0, r3\n\ + ldrb r0, [r2]\n\ + ldrb r1, [r1]\n\ + cmp r0, r1\n\ + beq _080F8614\n\ +_080F862A:\n\ + mov r1, r12\n\ + ldrb r1, [r1]\n\ + cmp r3, r1\n\ + bne _080F8644\n\ + movs r0, 0\n\ + b _080F8646\n\ + .pool\n\ +_080F8644:\n\ + movs r0, 0x1\n\ +_080F8646:\n\ + mov r1, r9\n\ + strh r0, [r1]\n\ + movs r3, 0\n\ + mov r4, r12\n\ + ldrb r0, [r4]\n\ + cmp r3, r0\n\ + bcs _080F8678\n\ + mov r5, r8\n\ + lsls r0, r6, 2\n\ + adds r0, r6\n\ + lsls r2, r0, 3\n\ + ldr r7, =gTasks + 0x8\n\ +_080F865E:\n\ + adds r1, r5, r3\n\ + adds r0, r3, 0x5\n\ + lsls r0, 1\n\ + adds r0, r2\n\ + adds r0, r7\n\ + ldrh r0, [r0]\n\ + strb r0, [r1]\n\ + adds r0, r3, 0x1\n\ + lsls r0, 24\n\ + lsrs r3, r0, 24\n\ + ldrb r1, [r4]\n\ + cmp r3, r1\n\ + bcc _080F865E\n\ +_080F8678:\n\ + mov r0, r8\n\ + bl sub_80F86E0\n\ + ldr r1, =gUnknown_02039F2B\n\ + strb r0, [r1]\n\ + ldr r0, =gSpecialVar_ContestCategory\n\ + ldrb r0, [r0]\n\ + bl sub_80DB09C\n\ + ldr r1, =sub_80FCF40\n\ + ldr r2, =sub_80F86B8\n\ + adds r0, r6, 0\n\ + bl SetTaskFuncWithFollowupFunc\n\ + add sp, 0x8\n\ + pop {r3,r4}\n\ + mov r8, r3\n\ + mov r9, r4\n\ + pop {r4-r7}\n\ + pop {r0}\n\ + bx r0\n\ + .pool"); +} +#endif // NONMATCHING + +static void sub_80F86B8(u8 taskId) +{ + sub_80DCE58(0); + SetTaskFuncWithFollowupFunc(taskId, sub_80FCFD0, sub_80F8714); +} + +u8 sub_80F86E0(u8 *arg0) +{ + int i; + u8 result = 0; + + for (i = 1; i < gNumLinkContestPlayers; i++) + { + if (arg0[result] < arg0[i]) + result = i; + } + + return result; +} + +void sub_80F8714(u8 taskId) +{ + int i; + + if (gSpecialVar_0x8004 == 1) + { + if (IsLinkTaskFinished()) + gTasks[taskId].func = sub_80F878C; + } + else + { + for (i = 0; i < 4; i++) + StringGetEnd10(gContestMons[i].nickname); + + DestroyTask(taskId); + SetDynamicWarp(0, gSaveBlock1Ptr->location.mapGroup, gSaveBlock1Ptr->location.mapNum, -1); + ScriptContext2_Disable(); + EnableBothScriptContexts(); + } +} + +static void sub_80F878C(u8 taskId) +{ + sub_800AC34(); + gTasks[taskId].func = sub_80F87B4; +} + +static void sub_80F87B4(u8 taskId) +{ + if (!gReceivedRemoteLinkPlayers) + { + DestroyTask(taskId); + ScriptContext2_Disable(); + EnableBothScriptContexts(); + } +} |