diff options
author | ultima-soul <akshayjhanji@hotmail.com> | 2019-01-05 23:02:28 -0800 |
---|---|---|
committer | ultima-soul <akshayjhanji@hotmail.com> | 2019-01-06 13:41:18 -0800 |
commit | 284751e7610f5e9cf266bd0a8bb148464753afa1 (patch) | |
tree | c4d69ec4c29d94f0faf16b01ec8fc0b388855b8e /src | |
parent | 2ca482dc24accca6bbb808f2c4b847e1d2c2dfac (diff) |
Decompile through ClearContestWinnerPicsInContestHall, 10 NONMATCHINGs present.
Diffstat (limited to 'src')
-rw-r--r-- | src/contest.c | 2742 | ||||
-rw-r--r-- | src/graphics.c | 4 |
2 files changed, 2715 insertions, 31 deletions
diff --git a/src/contest.c b/src/contest.c index a0b44e331..a74e2c96b 100644 --- a/src/contest.c +++ b/src/contest.c @@ -103,7 +103,7 @@ u8 sub_80DB120(void); u8 sub_80DB174(u16, u32, u32, u32); void sub_80DB2BC(void); void prints_contest_move_description(u16); -u16 sub_80DE84C(u16); +u16 SanitizeSpecies(u16); void sub_80DB89C(void); u16 GetChosenMove(u8); void sub_80DB918(void); @@ -129,7 +129,7 @@ void sub_80DE424(u8); void sub_80DE69C(u8); void sub_80DEA20(void); void Contest_PrintTextToBg0WindowAt(u32, u8 *, s32, u8, u8); -void Contest_StartTextPrinter(const u8 *, u8); +void Contest_StartTextPrinter(const u8 *, u32); void ContestBG_FillBoxWithIncrementingTile(u8, u16, u8, u8, u8, u8, u8, u8); bool32 Contest_RunTextPrinters(void); void Contest_SetBgCopyFlags(u32); @@ -144,9 +144,9 @@ void sub_80DF750(void); void sub_80DE9DC(u8); void sub_80DCBE8(u8, u8); u8 sub_80DC9EC(u8); -u16 sub_80DE834(u16); +u16 SanitizeMove(u16); void sub_80DE864(u8); -void sub_80DEAA8(u16); +void SelectContestMoveBankTarget(u16); void sub_80DE9B0(u8); void sub_80DC674(u8); void sub_80DE12C(void); @@ -169,7 +169,7 @@ bool8 sub_80DC3C4(void); void sub_80DF9D4(u8 *); void sub_80DF9E0(u8 *, s32); void ContestBG_FillBoxWithTile(u8, u16, u8, u8, u8, u8, u8); -void Contest_PrintTextToBg0WindowStd(u8, const u8 *); +void Contest_PrintTextToBg0WindowStd(u32, const u8 *); s16 sub_80DBD34(u8); void DetermineFinalStandings(void); bool8 sub_80DBF30(s32, s32, struct UnknownContestStruct6 *); @@ -180,7 +180,23 @@ void sub_80DC6A4(u8); void sub_80DC8D0(u8); void sub_80DC81C(u8); void sub_80DC87C(u8); - +void sub_80DCC84(struct Sprite *); +void sub_80DCCD8(struct Sprite *sprite); +u8 sub_80DDA20(void); +void c3_08130B10(u8); +void sub_80DDB6C(u8); +void task08_080CD1CC(u8); +void sub_80DDD20(u8); +void sub_80DDE30(u8); +void sub_80DDF80(u8); +const u8 *GetTurnOrderNumberGfx(u8); +void sub_80DE464(u8); +void sub_80DE4A8(u8); +void sub_80DE5F4(u8); +void sub_80DE65C(u8); +void sub_80DE794(u8); +void sub_80DEA5C(void); +u8 sub_80DEFA8(u8, u8); EWRAM_DATA struct ContestPokemon gContestMons[4] = {0}; @@ -228,6 +244,12 @@ extern const u8 gText_0827E817[]; extern const u8 gText_0827E58A[]; extern const u8 gText_0827D56F[]; extern const u8 gText_0827D597[]; +extern const u8 gText_Contest_Shyness[]; +extern const u8 gText_Contest_Anxiety[]; +extern const u8 gText_Contest_Laziness[]; +extern const u8 gText_Contest_Hesitancy[]; +extern const u8 gText_Contest_Fear[]; +extern const u8 *const gUnknown_08587E10[]; extern const struct ContestPokemon gContestOpponents[96]; extern const u8 gUnknown_085898A4[96]; extern const struct CompressedSpriteSheet gUnknown_08587C00; @@ -249,6 +271,10 @@ extern const struct SubspriteTable gSubspriteTables_8587B80[]; extern const struct CompressedSpriteSheet gUnknown_08587BB0; extern const struct SpritePalette gUnknown_08587BB8; extern const struct SpriteTemplate gSpriteTemplate_8587BC8; +extern bool8 gUnknown_020322D5; +extern void (*const gContestEffectFuncs[])(void); +extern const s8 gContestExcitementTable[][5]; +extern const struct ContestWinner gUnknown_08587FA4[]; void TaskDummy1(u8 taskId) { @@ -1071,11 +1097,11 @@ void sub_80D8B38(u8 taskId) return; case 7: { - u16 move = sub_80DE834(gContestResources->field_4[gContestResources->field_0->unk19215].currMove); + u16 move = SanitizeMove(gContestResources->field_4[gContestResources->field_0->unk19215].currMove); sub_80DE864(gContestResources->field_0->unk19215); sub_80DE9DC(gContestResources->field_0->unk19215); - sub_80DEAA8(move); + SelectContestMoveBankTarget(move); DoMoveAnim(move); gTasks[taskId].data[0] = 8; } @@ -2531,7 +2557,7 @@ u8 sub_80DB120(void) u8 sub_80DB174(u16 species, u32 otId, u32 personality, u32 index) { u8 spriteId; - species = sub_80DE84C(species); + species = SanitizeSpecies(species); if (index == gContestPlayerMonIndex) HandleLoadSpecialPokePic_2(gMonBackPicTable + species, gMonSpritesGfxPtr->sprites[0], species, personality); @@ -2776,9 +2802,9 @@ void sub_80DB884(void) void sub_80DB89C(void) { - FillWindowPixelBuffer(4, 0); - CopyWindowToVram(4, 2); - Contest_SetBgCopyFlags(0); + FillWindowPixelBuffer(4, 0); + CopyWindowToVram(4, 2); + Contest_SetBgCopyFlags(0); } u16 GetChosenMove(u8 a) @@ -2796,20 +2822,20 @@ u16 GetChosenMove(u8 a) ContestAI_ResetAI(a); moveChoice = ContestAI_GetActionToUse(); return gContestMons[a].moves[moveChoice]; - } + } } void sub_80DB918(void) { - s32 i; + s32 i; for (i = 0; i < 4; i++) - sContestantStatus[i].currMove = GetChosenMove(i); + sContestantStatus[i].currMove = GetChosenMove(i); } void sub_80DB944(void) { - s32 i; + s32 i; s32 j; s16 arr[4]; @@ -3016,7 +3042,7 @@ void DetermineFinalStandings(void) void sub_80DBED4(void) { - if ((gIsLinkContest & 1)) + if ((gIsLinkContest & 1)) { gSaveBlock2Ptr->contestLinkResults[gSpecialVar_ContestCategory][gContestFinalStandings[gContestPlayerMonIndex]] = ((gSaveBlock2Ptr->contestLinkResults[gSpecialVar_ContestCategory][gContestFinalStandings[gContestPlayerMonIndex]] + 1) > 0x270F) ? 0x270F : @@ -3027,7 +3053,7 @@ void sub_80DBED4(void) bool8 sub_80DBF30(s32 a, s32 b, struct UnknownContestStruct6 *c) { - bool8 retVal; + bool8 retVal; if (c[a].unk0 < c[b].unk0) retVal = TRUE; @@ -3046,15 +3072,15 @@ bool8 sub_80DBF30(s32 a, s32 b, struct UnknownContestStruct6 *c) void sub_80DBF68(void) { - gBattle_BG0_Y = 0; - gBattle_BG2_Y = 0; - sub_80DB89C(); - Contest_StartTextPrinter((u8*) &gUnknown_0827E8DA, 0); + gBattle_BG0_Y = 0; + gBattle_BG2_Y = 0; + sub_80DB89C(); + Contest_StartTextPrinter((u8*) &gUnknown_0827E8DA, 0); } void sub_80DBF90(void) { - int i; + int i; for(i = 0; i < 4; i++) { @@ -3106,7 +3132,7 @@ u8 sub_80DC028(s16 a, s16 b, u8 c) else gTasks[taskId].data[2] = -1; gTasks[taskId].data[3] = c; - return taskId; + return taskId; } void sub_80DC0F4(u8 taskId) @@ -3474,24 +3500,25 @@ extern const struct CompressedSpriteSheet gUnknown_08589904[]; extern const struct SpritePalette gUnknown_08589924[]; extern const struct SpriteTemplate gSpriteTemplate_858998C[]; +#ifdef NONMATCHING u8 sub_80DC9EC(u8 a) { - u8 r5 = gUnknown_02039F26[a] * 40 + 32; + u8 r5 = gUnknown_02039F26[a] * 40 + 32; u8 r8; u8 r6; volatile u8 zero; - + LoadCompressedObjectPic(&gUnknown_08589904[a]); LoadSpritePalette(&gUnknown_08589924[a]); r6 = CreateSprite(&gSpriteTemplate_858998C[a], 184, r5, 29); - gSprites[r8].oam.tileNum += 64; + gSprites[r8].oam.tileNum += 64; r8 = CreateSprite(&gSpriteTemplate_858998C[a], 248, r5, 29); CopySpriteTiles(0, 3, (void *)VRAM, (u16 *)(VRAM + 0xE000 + gUnknown_02039F26[a] * 5 * 64 + 0x26), (u8 *)(VRAM + 0x10000 + gSprites[r6].oam.tileNum * 32)); CopySpriteTiles(0, 3, (void *)VRAM, (u16 *)(VRAM + 0xE000 + gUnknown_02039F26[a] * 5 * 64 + 0x36), (u8 *)(VRAM + 0x10000 + gSprites[r8].oam.tileNum * 32)); - CpuSet(&r8, (u16 *)(VRAM + 0xE000 + gUnknown_02039F26[a] * 5 * 64 + 0x36), 0x050000c0); + CpuSet(&r8, (u16 *)(VRAM + 0xE000 + gUnknown_02039F26[a] * 5 * 64 + 0x36), 0x050000c0); RequestDma3Copy((void *)(VRAM + 0x10000 + (0x28 + gSprites[r6].oam.tileNum) * 32), (u8 *)(VRAM + 0x10000 + gSprites[r8].oam.tileNum * 32), 0x80, 1); @@ -3506,4 +3533,2661 @@ u8 sub_80DC9EC(u8 a) gSprites[r8].data[0] = r6; return r6; -}
\ No newline at end of file +} +#else +NAKED +u8 sub_80DC9EC(u8 a) +{ + asm(".syntax 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, 0x10\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + str r0, [sp, 0xC]\n\ + ldr r6, =gUnknown_02039F26\n\ + adds r6, r0, r6\n\ + ldrb r0, [r6]\n\ + lsls r5, r0, 2\n\ + adds r5, r0\n\ + lsls r5, 27\n\ + movs r0, 0x80\n\ + lsls r0, 22\n\ + adds r5, r0\n\ + lsrs r5, 24\n\ + ldr r1, [sp, 0xC]\n\ + lsls r4, r1, 3\n\ + ldr r0, =gUnknown_08589904\n\ + adds r0, r4, r0\n\ + bl LoadCompressedObjectPic\n\ + ldr r0, =gUnknown_08589924\n\ + adds r4, r0\n\ + adds r0, r4, 0\n\ + bl LoadSpritePalette\n\ + ldr r2, [sp, 0xC]\n\ + lsls r4, r2, 1\n\ + adds r4, r2\n\ + lsls r4, 3\n\ + ldr r0, =gSpriteTemplate_858998C\n\ + adds r4, r0\n\ + adds r0, r4, 0\n\ + movs r1, 0xB8\n\ + adds r2, r5, 0\n\ + movs r3, 0x1D\n\ + bl CreateSprite\n\ + mov r9, r0\n\ + mov r3, r9\n\ + lsls r3, 24\n\ + lsrs r3, 24\n\ + mov r9, r3\n\ + adds r0, r4, 0\n\ + movs r1, 0xF8\n\ + adds r2, r5, 0\n\ + movs r3, 0x1D\n\ + bl CreateSprite\n\ + mov r8, r0\n\ + mov r0, r8\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + mov r8, r0\n\ + lsls r5, r0, 4\n\ + add r5, r8\n\ + lsls r5, 2\n\ + ldr r1, =gSprites\n\ + adds r5, r1\n\ + ldrh r2, [r5, 0x4]\n\ + lsls r1, r2, 22\n\ + lsrs r1, 22\n\ + adds r1, 0x40\n\ + ldr r3, =0x000003ff\n\ + adds r0, r3, 0\n\ + ands r1, r0\n\ + ldr r0, =0xfffffc00\n\ + ands r0, r2\n\ + orrs r0, r1\n\ + strh r0, [r5, 0x4]\n\ + movs r4, 0xC0\n\ + lsls r4, 19\n\ + ldrb r0, [r6]\n\ + lsls r3, r0, 2\n\ + adds r3, r0\n\ + lsls r3, 6\n\ + ldr r0, =0x0600e026\n\ + adds r3, r0\n\ + ldr r7, =gContestResources\n\ + ldr r0, [r7]\n\ + ldr r0, [r0, 0x34]\n\ + str r0, [sp]\n\ + movs r0, 0\n\ + movs r1, 0x3\n\ + adds r2, r4, 0\n\ + bl CopySpriteTiles\n\ + ldrb r0, [r6]\n\ + lsls r3, r0, 2\n\ + adds r3, r0\n\ + lsls r3, 6\n\ + ldr r1, =0x0600e036\n\ + adds r3, r1\n\ + ldr r0, [r7]\n\ + ldr r0, [r0, 0x38]\n\ + str r0, [sp]\n\ + movs r0, 0\n\ + movs r1, 0x3\n\ + adds r2, r4, 0\n\ + bl CopySpriteTiles\n\ + movs r4, 0\n\ + str r4, [sp, 0x4]\n\ + ldr r0, [r7]\n\ + ldr r1, [r0, 0x34]\n\ + movs r6, 0xA0\n\ + lsls r6, 3\n\ + adds r1, r6\n\ + ldr r2, =0x050000c0\n\ + mov r10, r2\n\ + add r0, sp, 0x4\n\ + bl CpuSet\n\ + str r4, [sp, 0x8]\n\ + add r0, sp, 0x8\n\ + ldr r1, [r7]\n\ + ldr r1, [r1, 0x38]\n\ + adds r1, r6\n\ + mov r2, r10\n\ + bl CpuSet\n\ + ldr r0, [r7]\n\ + ldr r0, [r0, 0x34]\n\ + mov r3, r9\n\ + lsls r4, r3, 4\n\ + add r4, r9\n\ + lsls r4, 2\n\ + ldr r1, =gSprites\n\ + adds r4, r1\n\ + ldrh r1, [r4, 0x4]\n\ + lsls r1, 22\n\ + lsrs r1, 17\n\ + ldr r6, =0x06010000\n\ + adds r1, r6\n\ + movs r2, 0x80\n\ + lsls r2, 4\n\ + mov r10, r2\n\ + movs r3, 0x1\n\ + bl RequestDma3Copy\n\ + ldr r0, [r7]\n\ + ldr r0, [r0, 0x38]\n\ + ldrh r1, [r5, 0x4]\n\ + lsls r1, 22\n\ + lsrs r1, 17\n\ + adds r1, r6\n\ + mov r2, r10\n\ + movs r3, 0x1\n\ + bl RequestDma3Copy\n\ + mov r3, r8\n\ + strh r3, [r4, 0x2E]\n\ + mov r0, r9\n\ + strh r0, [r5, 0x2E]\n\ + mov r1, sp\n\ + ldrh r1, [r1, 0xC]\n\ + strh r1, [r4, 0x30]\n\ + mov r2, sp\n\ + ldrh r2, [r2, 0xC]\n\ + strh r2, [r5, 0x30]\n\ + mov r0, r9\n\ + add sp, 0x10\n\ + pop {r3-r5}\n\ + mov r8, r3\n\ + mov r9, r4\n\ + mov r10, r5\n\ + pop {r4-r7}\n\ + pop {r1}\n\ + bx r1\n\ + .pool\n\ + .syntax divided\n"); +} +#endif + +void sub_80DCB78(u8 spriteId) +{ + u8 spriteId2 = gSprites[spriteId].data[0]; + + FreeSpriteOamMatrix(&gSprites[spriteId2]); + DestroySprite(&gSprites[spriteId2]); + DestroySpriteAndFreeResources(&gSprites[spriteId]); +} + +void sub_80DCBB4(void) +{ + SetGpuReg(REG_OFFSET_BLDCNT, 0x3F40); + SetGpuReg(REG_OFFSET_BLDALPHA, 0x0907); +} + +void sub_80DCBD0(void) +{ + SetGpuReg(REG_OFFSET_BLDCNT, 0); + SetGpuReg(REG_OFFSET_BLDALPHA, 0); +} + +void sub_80DCBE8(u8 a, bool8 b) +{ + u8 r5; + + sub_80DCBB4(); + gContestResources->field_14[gSprites[a].data[1]].unk2_1 = 1; + r5 = gSprites[a].data[0]; + StartSpriteAffineAnim(&gSprites[a], 1); + StartSpriteAffineAnim(&gSprites[r5], 1); + gSprites[a].callback = sub_80DCC84; + gSprites[r5].callback = SpriteCallbackDummy; + if (b == FALSE) + PlaySE(SE_C_PIKON); + else + PlaySE(SE_PC_LOGIN); +} + +void sub_80DCC84(struct Sprite *sprite) +{ + if (sprite->affineAnimEnded) + { + u8 r1 = sprite->data[0]; + + if (gSprites[r1].affineAnimEnded) + { + sprite->invisible = TRUE; + gSprites[r1].invisible = TRUE; + sprite->callback = sub_80DCCD8; + } + } +} + +void sub_80DCCD8(struct Sprite *sprite) +{ + gContestResources->field_14[sprite->data[1]].unk2_1 = 0; + sub_80DCB78(sprite->data[0]); + sub_80DCBD0(); +} + +void sub_80DCD08(void) +{ + if(gHeap[0x1A000] == 1) + gHeap[0x1A000] = 0; + else + gHeap[0x1A000] = 1; + + if(gHeap[0x1A000] == 0) + { + sub_80DAEA4(); + sub_80DB2BC(); + } + else + sub_80DCD48(); +} + +#ifdef NONMATCHING +void sub_80DCD48(void) +{ + u8 r5 = 0; + u8 sp8[8]; + + if (gUnknown_020322D5 != 0) + { + u8 i; + s16 r2; + + + for (i = 0; i < 4; i++) + { + r2 = sContestantStatus[i].unk4; + if (r2 < 0) + { + r2 = -r2; + sp8[0] = CHAR_HYPHEN; + r5++; + } + ConvertIntToDecimalStringN(sp8 + r5, r2, 0, 4); + Text_InitWindowAndPrintText( + &gUnknown_03004210, + sp8, + 592 + gUnknown_02039F26[i] * 22, + gUnknown_083CA310[gUnknown_02039F26[i]][0], + gUnknown_083CA310[gUnknown_02039F26[i]][1]); + r5 = 0; + } + for (i = 0; i < 4; i++) + { + r2 = sContestantStatus[i].appeal2; + if (r2 < 0) + { + r2 = -r2; + sp8[0] = CHAR_HYPHEN; + r5++; + } + ConvertIntToDecimalStringN(sp8 + r5, r2, 0, 4); + Text_InitWindowAndPrintText( + &gUnknown_03004210, + sp8, + 512 + gUnknown_02039F26[i] * 20, + gUnknown_083CA308[gUnknown_02039F26[i]][0], + gUnknown_083CA308[gUnknown_02039F26[i]][1]); + r5 = 0; + } + sub_80AEB30(); + } +} +#else +NAKED +void sub_80DCD48(void) +{ + asm(".syntax unified\n\ + push {r4,r5,lr}\n\ + sub sp, 0xC\n\ + ldr r0, =gUnknown_020322D5\n\ + ldrb r0, [r0]\n\ + cmp r0, 0\n\ + beq _080DCE44\n\ + ldr r0, =gHeap\n\ + movs r1, 0xD0\n\ + lsls r1, 9\n\ + adds r0, r1\n\ + ldrb r0, [r0]\n\ + cmp r0, 0\n\ + beq _080DCE44\n\ + cmp r0, 0\n\ + blt _080DCD7C\n\ + cmp r0, 0x3\n\ + bgt _080DCD7C\n\ + cmp r0, 0x2\n\ + blt _080DCD7C\n\ + bl sub_80DF750\n\ + b _080DCE44\n\ + .pool\n\ +_080DCD7C:\n\ + movs r5, 0\n\ +_080DCD7E:\n\ + adds r0, r5, 0\n\ + movs r1, 0\n\ + bl FillWindowPixelBuffer\n\ + adds r0, r5, 0x1\n\ + lsls r0, 24\n\ + lsrs r5, r0, 24\n\ + cmp r5, 0x3\n\ + bls _080DCD7E\n\ + movs r5, 0\n\ +_080DCD92:\n\ + ldr r0, =gContestResources\n\ + ldr r0, [r0]\n\ + ldr r1, [r0, 0x4]\n\ + lsls r0, r5, 3\n\ + subs r0, r5\n\ + lsls r0, 2\n\ + adds r0, r1\n\ + add r2, sp, 0x4\n\ + ldrh r4, [r0, 0x4]\n\ + movs r1, 0x4\n\ + ldrsh r0, [r0, r1]\n\ + cmp r0, 0\n\ + bge _080DCDBC\n\ + negs r0, r0\n\ + lsls r0, 16\n\ + lsrs r4, r0, 16\n\ + adds r0, r2, 0\n\ + ldr r1, =gText_OneDash\n\ + bl StringCopy\n\ + adds r2, r0, 0\n\ +_080DCDBC:\n\ + lsls r1, r4, 16\n\ + asrs r1, 16\n\ + adds r0, r2, 0\n\ + movs r2, 0\n\ + movs r3, 0x4\n\ + bl ConvertIntToDecimalStringN\n\ + ldr r0, =gUnknown_02039F26\n\ + adds r0, r5, r0\n\ + ldrb r0, [r0]\n\ + movs r1, 0x7\n\ + str r1, [sp]\n\ + add r1, sp, 0x4\n\ + movs r2, 0x37\n\ + movs r3, 0x1\n\ + bl Contest_PrintTextToBg0WindowAt\n\ + adds r0, r5, 0x1\n\ + lsls r0, 24\n\ + lsrs r5, r0, 24\n\ + cmp r5, 0x3\n\ + bls _080DCD92\n\ + movs r5, 0\n\ +_080DCDEA:\n\ + ldr r0, =gContestResources\n\ + ldr r0, [r0]\n\ + ldr r1, [r0, 0x4]\n\ + lsls r0, r5, 3\n\ + subs r0, r5\n\ + lsls r0, 2\n\ + adds r0, r1\n\ + add r2, sp, 0x4\n\ + ldrh r4, [r0, 0x2]\n\ + movs r1, 0x2\n\ + ldrsh r0, [r0, r1]\n\ + cmp r0, 0\n\ + bge _080DCE14\n\ + negs r0, r0\n\ + lsls r0, 16\n\ + lsrs r4, r0, 16\n\ + adds r0, r2, 0\n\ + ldr r1, =gText_OneDash\n\ + bl StringCopy\n\ + adds r2, r0, 0\n\ +_080DCE14:\n\ + lsls r1, r4, 16\n\ + asrs r1, 16\n\ + adds r0, r2, 0\n\ + movs r2, 0\n\ + movs r3, 0x4\n\ + bl ConvertIntToDecimalStringN\n\ + ldr r0, =gUnknown_02039F26\n\ + adds r0, r5, r0\n\ + ldrb r0, [r0]\n\ + movs r1, 0x7\n\ + str r1, [sp]\n\ + add r1, sp, 0x4\n\ + movs r2, 0x5\n\ + movs r3, 0x1\n\ + bl Contest_PrintTextToBg0WindowAt\n\ + adds r0, r5, 0x1\n\ + lsls r0, 24\n\ + lsrs r5, r0, 24\n\ + cmp r5, 0x3\n\ + bls _080DCDEA\n\ + bl sub_80DB2BC\n\ +_080DCE44:\n\ + add sp, 0xC\n\ + pop {r4,r5}\n\ + pop {r0}\n\ + bx r0\n\ + .pool\n\ + .syntax divided\n"); +} +#endif + +void sub_80DCE58(u8 a) +{ + u8 sp0[4]; + u16 sp4[4] = {0}; + s32 i; + s32 r2; + s32 r4; + + for (i = 0; i < 4; i++) + { + sp4[i] = Random(); + for (r2 = 0; r2 < i; r2++) + { + if (sp4[i] == sp4[r2]) + { + i--; + break; + } + } + } + + if (a == 0) + { + for (i = 0; i < 4; i++) + { + gUnknown_02039F26[i] = i; + for (r4 = 0; r4 < i; r4++) + { + if (gContestMonConditions[gUnknown_02039F26[r4]] < gContestMonConditions[i] + || (gContestMonConditions[gUnknown_02039F26[r4]] == gContestMonConditions[i] && sp4[gUnknown_02039F26[r4]] < sp4[i])) + { + for (r2 = i; r2 > r4; r2--) + gUnknown_02039F26[r2] = gUnknown_02039F26[r2 - 1]; + gUnknown_02039F26[r4] = i; + break; + } + } + if (r4 == i) + gUnknown_02039F26[i] = i; + } + memcpy(sp0, gUnknown_02039F26, sizeof(sp0)); + for (i = 0; i < 4; i++) + gUnknown_02039F26[sp0[i]] = i; + } + else + { + memset(sp0, 0xFF, sizeof(sp0)); + for (i = 0; i < 4; i++) + { + u8 r2 = sContestantStatus[i].unkB_0; + + while (1) + { + u8 *ptr = &sp0[r2]; + if (*ptr == 0xFF) + { + *ptr = i; + gUnknown_02039F26[i] = r2; + break; + } + r2++; + } + } + for (i = 0; i < 3; i++) + { + for (r4 = 3; r4 > i; r4--) + { + if (sContestantStatus[r4 - 1].unkB_0 == sContestantStatus[r4].unkB_0 + && gUnknown_02039F26[r4 - 1] < gUnknown_02039F26[r4] + && sp4[r4 - 1] < sp4[r4]) + { + u8 temp = gUnknown_02039F26[r4]; + + gUnknown_02039F26[r4] = gUnknown_02039F26[r4 - 1]; + gUnknown_02039F26[r4 - 1] = temp; + } + } + } + } +} + +void sub_80DD04C(void) +{ + s32 i; + + for (i = 0; i < 4; i++) + { + LoadPalette(&gHeap[0x1A004] + (i + 5) * 32, (gUnknown_02039F26[i] + 5) * 16, 32); + } + sub_80DAEA4(); +} + +#ifdef NONMATCHING +void sub_80DD080(u8 contestant) +{ + bool8 r8; + s32 i; + + sContestantStatus[contestant].appeal2 = 0; + sContestantStatus[contestant].appeal1 = 0; + r8 = sub_80DBA68(contestant); + if (r8) + { + u16 move = sContestantStatus[contestant].currMove; + u8 effect = gContestMoves[move].effect; + u8 rnd; + + sContestantStatus[contestant].moveCategory = gContestMoves[sContestantStatus[contestant].currMove].contestCategory; + if (sContestantStatus[contestant].currMove == sContestantStatus[contestant].prevMove && sContestantStatus[contestant].currMove != MOVE_NONE) + { + sContestantStatus[contestant].disappointedRepeat = TRUE; + sContestantStatus[contestant].moveRepeatCount++; + } + else + { + sContestantStatus[contestant].moveRepeatCount = 0; + } + sContestantStatus[contestant].appeal1 = gContestEffects[effect].appeal; + sContestantStatus[contestant].appeal2 = gContestEffects[effect].appeal; + shared192D0.jam = gContestEffects[effect].jam; + shared192D0.jam2 = shared192D0.jam; + shared192D0.jam2 = gContestEffects[effect].jam; + + shared192D0.contestant = contestant; + for (i = 0; i < 4; i++) + { + sContestantStatus[i].jam = 0; + shared192D0.unnervedPokes[i] = 0; + } + if (sContestantStatus[contestant].hasJudgesAttention && AreMovesContestCombo(sContestantStatus[contestant].prevMove, sContestantStatus[contestant].currMove) == 0) + sContestantStatus[contestant].hasJudgesAttention = 0; + sContestantStatus[contestant].appeal2 += sContestantStatus[contestant].condition; + gContestEffectFuncs[effect](); + if (sContestantStatus[contestant].conditionMod == 1) + sContestantStatus[contestant].appeal2 += sContestantStatus[contestant].condition - 10; + else if (sContestantStatus[contestant].appealTripleCondition) + sContestantStatus[contestant].appeal2 += sContestantStatus[contestant].condition * 3; + + + sContestantStatus[contestant].unk16 = 0; + sContestantStatus[contestant].unk15_6 = 0; + if (sub_80DE1E8(contestant)) + { + u8 r2 = AreMovesContestCombo(sContestantStatus[contestant].prevMove, sContestantStatus[contestant].currMove); + + if (r2 != 0 && sContestantStatus[contestant].hasJudgesAttention) + { + sContestantStatus[contestant].unk16 = r2; + sContestantStatus[contestant].unk15_6 = 1; + sContestantStatus[contestant].hasJudgesAttention = 0; + sContestantStatus[contestant].unk17 = sContestantStatus[contestant].appeal1 * sContestantStatus[contestant].unk16; + sContestantStatus[contestant].unk15_3 = 1; + } + else + { + if (gContestMoves[sContestantStatus[contestant].currMove].comboStarterId != 0) + { + sContestantStatus[contestant].hasJudgesAttention = 1; + sContestantStatus[contestant].unk15_6 = 1; + } + else + { + sContestantStatus[contestant].hasJudgesAttention = 0; + } + } + } + if (sContestantStatus[contestant].disappointedRepeat) + sContestantStatus[contestant].unk18 = (sContestantStatus[contestant].moveRepeatCount + 1) * 10; + if (sContestantStatus[contestant].nervous) + { + sContestantStatus[contestant].hasJudgesAttention = 0; + sContestantStatus[contestant].appeal2 = 0; + sContestantStatus[contestant].appeal1 = 0; + } + shared19328.bits_0 = Contest_GetMoveExcitement(sContestantStatus[contestant].currMove); + if (sContestantStatus[contestant].overrideCategoryExcitementMod) + shared19328.bits_0 = 1; + if (shared19328.bits_0 > 0) + { + if (sContest.applauseLevel + shared19328.bits_0 > 4) + shared19328.unk2 = 60; + else + shared19328.unk2 = 10; + } + else + { + shared19328.unk2 = 0; + } + + rnd = Random() % 3; + for (i = 0; i < 4; i++) + { + if (i != contestant) + { + if (rnd == 0) + break; + rnd--; + } + } + sContestantStatus[contestant].unk1B = i; + } +} + +#else +NAKED +void sub_80DD080(u8 contestant) +{ + asm(".syntax unified\n\ + push {r4-r7,lr}\n\ + mov r7, r9\n\ + mov r6, r8\n\ + push {r6,r7}\n\ + lsls r0, 24\n\ + lsrs r6, r0, 24\n\ + ldr r4, =gContestResources\n\ + ldr r3, [r4]\n\ + ldr r1, [r3, 0x4]\n\ + lsls r7, r6, 3\n\ + subs r0, r7, r6\n\ + lsls r5, r0, 2\n\ + adds r1, r5, r1\n\ + movs r2, 0\n\ + strh r2, [r1, 0x2]\n\ + ldr r0, [r3, 0x4]\n\ + adds r0, r5, r0\n\ + strh r2, [r0]\n\ + adds r0, r6, 0\n\ + bl sub_80DBA68\n\ + lsls r0, 24\n\ + mov r8, r4\n\ + cmp r0, 0\n\ + bne _080DD0B4\n\ + b _080DD3C4\n\ +_080DD0B4:\n\ + ldr r0, [r4]\n\ + ldr r1, [r0, 0x4]\n\ + adds r1, r5, r1\n\ + ldrh r0, [r1, 0x6]\n\ + ldr r2, =gContestMoves\n\ + lsls r0, 3\n\ + adds r0, r2\n\ + ldrb r2, [r0]\n\ + mov r9, r2\n\ + ldrb r0, [r0, 0x1]\n\ + lsls r0, 29\n\ + lsrs r0, 29\n\ + strb r0, [r1, 0xA]\n\ + ldr r0, [r4]\n\ + ldr r0, [r0, 0x4]\n\ + adds r2, r5, r0\n\ + ldrh r0, [r2, 0x6]\n\ + ldrh r1, [r2, 0x8]\n\ + cmp r0, r1\n\ + bne _080DD110\n\ + cmp r0, 0\n\ + beq _080DD110\n\ + ldrb r0, [r2, 0x15]\n\ + movs r1, 0x1\n\ + orrs r0, r1\n\ + strb r0, [r2, 0x15]\n\ + ldr r0, [r4]\n\ + ldr r2, [r0, 0x4]\n\ + adds r2, r5, r2\n\ + ldrb r3, [r2, 0xB]\n\ + lsls r1, r3, 25\n\ + lsrs r1, 29\n\ + adds r1, 0x1\n\ + movs r0, 0x7\n\ + ands r1, r0\n\ + lsls r1, 4\n\ + movs r0, 0x71\n\ + negs r0, r0\n\ + ands r0, r3\n\ + orrs r0, r1\n\ + strb r0, [r2, 0xB]\n\ + b _080DD12C\n\ + .pool\n\ +_080DD110:\n\ + ldr r4, =gContestResources\n\ + ldr r0, [r4]\n\ + ldr r0, [r0, 0x4]\n\ + lsls r3, r6, 3\n\ + subs r1, r3, r6\n\ + lsls r1, 2\n\ + adds r1, r0\n\ + ldrb r2, [r1, 0xB]\n\ + movs r0, 0x71\n\ + negs r0, r0\n\ + ands r0, r2\n\ + strb r0, [r1, 0xB]\n\ + mov r8, r4\n\ + adds r7, r3, 0\n\ +_080DD12C:\n\ + mov r2, r8\n\ + ldr r4, [r2]\n\ + ldr r2, [r4, 0x4]\n\ + subs r0, r7, r6\n\ + lsls r0, 2\n\ + adds r2, r0, r2\n\ + ldr r3, =gContestEffects\n\ + mov r1, r9\n\ + lsls r5, r1, 2\n\ + adds r3, r5, r3\n\ + ldrb r1, [r3, 0x1]\n\ + strh r1, [r2]\n\ + ldr r1, [r4, 0x4]\n\ + adds r0, r1\n\ + ldrh r1, [r0]\n\ + strh r1, [r0, 0x2]\n\ + ldr r1, [r4, 0x8]\n\ + ldrb r0, [r3, 0x2]\n\ + strh r0, [r1, 0x4]\n\ + ldr r1, [r4, 0x8]\n\ + ldrh r0, [r1, 0x4]\n\ + strh r0, [r1, 0x6]\n\ + ldr r0, [r4, 0x8]\n\ + strb r6, [r0, 0x11]\n\ + movs r2, 0\n\ + mov r9, r5\n\ + mov r4, r8\n\ + movs r3, 0\n\ + movs r1, 0\n\ +_080DD166:\n\ + ldr r0, [r4]\n\ + ldr r0, [r0, 0x4]\n\ + adds r0, r1, r0\n\ + strb r3, [r0, 0xE]\n\ + ldr r0, [r4]\n\ + ldr r0, [r0, 0x8]\n\ + adds r0, 0xD\n\ + adds r0, r2\n\ + strb r3, [r0]\n\ + adds r1, 0x1C\n\ + adds r2, 0x1\n\ + cmp r2, 0x3\n\ + ble _080DD166\n\ + ldr r5, =gContestResources\n\ + ldr r0, [r5]\n\ + ldr r1, [r0, 0x4]\n\ + subs r0, r7, r6\n\ + lsls r4, r0, 2\n\ + adds r2, r4, r1\n\ + ldrb r1, [r2, 0x15]\n\ + movs r0, 0x10\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + beq _080DD1B4\n\ + ldrh r0, [r2, 0x8]\n\ + ldrh r1, [r2, 0x6]\n\ + bl AreMovesContestCombo\n\ + lsls r0, 24\n\ + cmp r0, 0\n\ + bne _080DD1B4\n\ + ldr r0, [r5]\n\ + ldr r1, [r0, 0x4]\n\ + adds r1, r4, r1\n\ + ldrb r2, [r1, 0x15]\n\ + movs r0, 0x11\n\ + negs r0, r0\n\ + ands r0, r2\n\ + strb r0, [r1, 0x15]\n\ +_080DD1B4:\n\ + ldr r0, =gContestEffectFuncs\n\ + add r0, r9\n\ + ldr r0, [r0]\n\ + bl _call_via_r0\n\ + ldr r0, =gContestResources\n\ + ldr r0, [r0]\n\ + ldr r1, [r0, 0x4]\n\ + subs r0, r7, r6\n\ + lsls r0, 2\n\ + adds r2, r0, r1\n\ + ldrb r1, [r2, 0x10]\n\ + movs r0, 0x30\n\ + ands r0, r1\n\ + cmp r0, 0x10\n\ + bne _080DD1EC\n\ + ldrh r1, [r2, 0x2]\n\ + subs r1, 0xA\n\ + movs r0, 0xD\n\ + ldrsb r0, [r2, r0]\n\ + b _080DD206\n\ + .pool\n\ +_080DD1EC:\n\ + ldrb r1, [r2, 0x11]\n\ + movs r0, 0x20\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + beq _080DD200\n\ + movs r1, 0xD\n\ + ldrsb r1, [r2, r1]\n\ + lsls r0, r1, 1\n\ + adds r0, r1\n\ + b _080DD204\n\ +_080DD200:\n\ + movs r0, 0xD\n\ + ldrsb r0, [r2, r0]\n\ +_080DD204:\n\ + ldrh r1, [r2, 0x2]\n\ +_080DD206:\n\ + adds r0, r1\n\ + strh r0, [r2, 0x2]\n\ + ldr r5, =gContestResources\n\ + ldr r0, [r5]\n\ + ldr r1, [r0, 0x4]\n\ + subs r0, r7, r6\n\ + lsls r4, r0, 2\n\ + adds r1, r4, r1\n\ + movs r0, 0\n\ + strb r0, [r1, 0x16]\n\ + ldr r0, [r5]\n\ + ldr r1, [r0, 0x4]\n\ + adds r1, r4, r1\n\ + ldrb r2, [r1, 0x15]\n\ + movs r0, 0x41\n\ + negs r0, r0\n\ + ands r0, r2\n\ + strb r0, [r1, 0x15]\n\ + adds r0, r6, 0\n\ + bl sub_80DE1E8\n\ + lsls r0, 24\n\ + cmp r0, 0\n\ + beq _080DD2E2\n\ + ldr r0, [r5]\n\ + ldr r1, [r0, 0x4]\n\ + adds r1, r4, r1\n\ + ldrh r0, [r1, 0x8]\n\ + ldrh r1, [r1, 0x6]\n\ + bl AreMovesContestCombo\n\ + lsls r0, 24\n\ + lsrs r3, r0, 24\n\ + cmp r3, 0\n\ + beq _080DD29C\n\ + ldr r0, [r5]\n\ + ldr r0, [r0, 0x4]\n\ + adds r2, r4, r0\n\ + ldrb r1, [r2, 0x15]\n\ + movs r0, 0x10\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + beq _080DD29C\n\ + strb r3, [r2, 0x16]\n\ + ldr r0, [r5]\n\ + ldr r1, [r0, 0x4]\n\ + adds r1, r4, r1\n\ + ldrb r0, [r1, 0x15]\n\ + movs r2, 0x40\n\ + orrs r0, r2\n\ + strb r0, [r1, 0x15]\n\ + ldr r0, [r5]\n\ + ldr r1, [r0, 0x4]\n\ + adds r1, r4, r1\n\ + ldrb r2, [r1, 0x15]\n\ + movs r0, 0x11\n\ + negs r0, r0\n\ + ands r0, r2\n\ + strb r0, [r1, 0x15]\n\ + ldr r0, [r5]\n\ + ldr r0, [r0, 0x4]\n\ + adds r0, r4, r0\n\ + movs r1, 0\n\ + ldrsh r2, [r0, r1]\n\ + ldrb r1, [r0, 0x16]\n\ + muls r1, r2\n\ + strb r1, [r0, 0x17]\n\ + ldr r0, [r5]\n\ + ldr r1, [r0, 0x4]\n\ + adds r1, r4, r1\n\ + ldrb r0, [r1, 0x15]\n\ + movs r2, 0x8\n\ + b _080DD2C8\n\ + .pool\n\ +_080DD29C:\n\ + ldr r2, =gContestMoves\n\ + ldr r5, =gContestResources\n\ + ldr r0, [r5]\n\ + ldr r1, [r0, 0x4]\n\ + subs r0, r7, r6\n\ + lsls r4, r0, 2\n\ + adds r3, r4, r1\n\ + ldrh r0, [r3, 0x6]\n\ + lsls r0, 3\n\ + adds r0, r2\n\ + ldrb r0, [r0, 0x2]\n\ + cmp r0, 0\n\ + beq _080DD2D8\n\ + ldrb r0, [r3, 0x15]\n\ + movs r1, 0x10\n\ + orrs r0, r1\n\ + strb r0, [r3, 0x15]\n\ + ldr r0, [r5]\n\ + ldr r1, [r0, 0x4]\n\ + adds r1, r4, r1\n\ + ldrb r0, [r1, 0x15]\n\ + movs r2, 0x40\n\ +_080DD2C8:\n\ + orrs r0, r2\n\ + strb r0, [r1, 0x15]\n\ + b _080DD2E2\n\ + .pool\n\ +_080DD2D8:\n\ + ldrb r1, [r3, 0x15]\n\ + movs r0, 0x11\n\ + negs r0, r0\n\ + ands r0, r1\n\ + strb r0, [r3, 0x15]\n\ +_080DD2E2:\n\ + ldr r5, =gContestResources\n\ + ldr r0, [r5]\n\ + ldr r1, [r0, 0x4]\n\ + subs r0, r7, r6\n\ + lsls r4, r0, 2\n\ + adds r2, r4, r1\n\ + ldrb r1, [r2, 0x15]\n\ + movs r0, 0x1\n\ + mov r8, r0\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + beq _080DD30A\n\ + ldrb r0, [r2, 0xB]\n\ + lsls r0, 25\n\ + lsrs r0, 29\n\ + adds r0, 0x1\n\ + lsls r1, r0, 2\n\ + adds r1, r0\n\ + lsls r1, 1\n\ + strb r1, [r2, 0x18]\n\ +_080DD30A:\n\ + ldr r0, [r5]\n\ + ldr r0, [r0, 0x4]\n\ + adds r2, r4, r0\n\ + ldrb r1, [r2, 0xC]\n\ + mov r0, r8\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + beq _080DD334\n\ + ldrb r1, [r2, 0x15]\n\ + movs r0, 0x11\n\ + negs r0, r0\n\ + ands r0, r1\n\ + strb r0, [r2, 0x15]\n\ + ldr r2, [r5]\n\ + ldr r0, [r2, 0x4]\n\ + adds r0, r4, r0\n\ + movs r1, 0\n\ + strh r1, [r0, 0x2]\n\ + ldr r0, [r2, 0x4]\n\ + adds r0, r4, r0\n\ + strh r1, [r0]\n\ +_080DD334:\n\ + ldr r0, [r5]\n\ + ldr r0, [r0, 0x4]\n\ + adds r0, r4, r0\n\ + ldrh r0, [r0, 0x6]\n\ + bl Contest_GetMoveExcitement\n\ + ldr r1, [r5]\n\ + ldr r1, [r1, 0x10]\n\ + strb r0, [r1]\n\ + ldr r2, [r5]\n\ + ldr r0, [r2, 0x4]\n\ + adds r0, r4, r0\n\ + ldrb r1, [r0, 0x11]\n\ + movs r0, 0x10\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + beq _080DD35C\n\ + ldr r0, [r2, 0x10]\n\ + mov r1, r8\n\ + strb r1, [r0]\n\ +_080DD35C:\n\ + ldr r1, [r5]\n\ + ldr r3, [r1, 0x10]\n\ + movs r0, 0\n\ + ldrsb r0, [r3, r0]\n\ + cmp r0, 0\n\ + ble _080DD388\n\ + ldr r0, [r1]\n\ + ldrb r0, [r0, 0x13]\n\ + lsls r0, 24\n\ + asrs r0, 24\n\ + movs r1, 0\n\ + ldrsb r1, [r3, r1]\n\ + adds r0, r1\n\ + cmp r0, 0x4\n\ + ble _080DD384\n\ + movs r0, 0x3C\n\ + b _080DD38A\n\ + .pool\n\ +_080DD384:\n\ + movs r0, 0xA\n\ + b _080DD38A\n\ +_080DD388:\n\ + movs r0, 0\n\ +_080DD38A:\n\ + strb r0, [r3, 0x2]\n\ + bl Random\n\ + lsls r0, 16\n\ + lsrs r0, 16\n\ + movs r1, 0x3\n\ + bl __umodsi3\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + movs r2, 0\n\ + b _080DD3AE\n\ +_080DD3A2:\n\ + subs r0, 0x1\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ +_080DD3A8:\n\ + adds r2, 0x1\n\ + cmp r2, 0x3\n\ + bgt _080DD3B6\n\ +_080DD3AE:\n\ + cmp r2, r6\n\ + beq _080DD3A8\n\ + cmp r0, 0\n\ + bne _080DD3A2\n\ +_080DD3B6:\n\ + ldr r0, =gContestResources\n\ + ldr r0, [r0]\n\ + ldr r1, [r0, 0x4]\n\ + subs r0, r7, r6\n\ + lsls r0, 2\n\ + adds r0, r1\n\ + strb r2, [r0, 0x1B]\n\ +_080DD3C4:\n\ + pop {r3,r4}\n\ + mov r8, r3\n\ + mov r9, r4\n\ + pop {r4-r7}\n\ + pop {r0}\n\ + bx r0\n\ + .pool\n\ + .syntax divided\n"); +} +#endif + +void SetContestantEffectStringID(u8 a, u8 b) +{ + sContestantStatus[a].effectStringId = b; +} + +void SetContestantEffectStringID2(u8 a, u8 b) +{ + sContestantStatus[a].effectStringId2 = b; +} + +void SetStartledString(u8 contestant, u8 jam) +{ + 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_80DD45C(u8 contestant, u8 stringId) +{ + 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.contestant].currMove].contestCategory == CONTEST_CATEGORY_BEAUTY) + StringCopy(gStringVar3, gText_Contest_Anxiety); + else if (gContestMoves[sContestantStatus[shared192D0.contestant].currMove].contestCategory == CONTEST_CATEGORY_CUTE) + StringCopy(gStringVar3, gText_Contest_Laziness); + 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_08587E10[stringId]); + sub_80DB89C(); + Contest_StartTextPrinter(gStringVar4, 1); +} + +void MakeContestantNervous(u8 p) +{ + sContestantStatus[p].nervous = 1; + sContestantStatus[p].currMove = MOVE_NONE; +} + +void sub_80DD590(void) +{ + u8 r12 = 0; + s32 i; + s32 j; + u8 sp0[4]; + u8 sp4[4]; + + for (i = 0; i < 4; i++) + { + sp0[i] = gUnknown_02039F26[i]; + sp4[i] = 0; + } + + for (i = 0; i < 4; i++) + { + for (j = 0; j < 4; j++) + { + if (sContestantStatus[j].nextTurnOrder == i) + { + sp0[j] = i; + sp4[j] = 1; + break; + } + } + if (j == 4) + { + for (j = 0; j < 4; j++) + { + if (sp4[j] == 0 && sContestantStatus[j].nextTurnOrder == 0xFF) + { + r12 = j; + j++; + break; + } + } + for (; j < 4; j++) + { + if (sp4[j] == 0 && sContestantStatus[j].nextTurnOrder == 0xFF + && gUnknown_02039F26[r12] > gUnknown_02039F26[j]) + r12 = j; + } + sp0[r12] = i; + sp4[r12] = 1; + } + } + + for (i = 0; i < 4; i++) + { + shared192D0.turnOrder[i] = sp0[i]; + sContestantStatus[i].nextTurnOrder = 0xFF; + sContestantStatus[i].turnOrderMod = 0; + gUnknown_02039F26[i] = sp0[i]; + } +} + +void sub_80DD6DC(struct Sprite *sprite) +{ + if (sprite->data[1]++ > 84) + { + sprite->data[1] = 0; + sprite->invisible = TRUE; + sprite->callback = SpriteCallbackDummy; + sContest.unk1920A_4 = 0; + } +} + +void sub_80DD720(u8 a) +{ + u8 spriteId = sContest.unk19216; + + switch (a) + { + case 0: + case 1: + gSprites[spriteId].oam.tileNum = gSprites[spriteId].data[0]; + PlaySE(SE_HAZURE); + break; + case 2: + gSprites[spriteId].oam.tileNum = gSprites[spriteId].data[0] + 4; + PlaySE(SE_SEIKAI); + break; + case 3: + gSprites[spriteId].oam.tileNum = gSprites[spriteId].data[0] + 8; + PlaySE(SE_SEIKAI); + break; + case 4: + gSprites[spriteId].oam.tileNum = gSprites[spriteId].data[0] + 12; + PlaySE(SE_TK_WARPIN); + break; + case 5: // exactly the same as case 4 + gSprites[spriteId].oam.tileNum = gSprites[spriteId].data[0] + 12; + PlaySE(SE_TK_WARPIN); + break; + case 6: + gSprites[spriteId].oam.tileNum = gSprites[spriteId].data[0] + 16; + PlaySE(SE_TK_WARPIN); + break; + case 8: + gSprites[spriteId].oam.tileNum = gSprites[spriteId].data[0] + 24; + PlaySE(SE_W215); + break; + case 7: + default: + gSprites[spriteId].oam.tileNum = gSprites[spriteId].data[0] + 20; + PlaySE(SE_TK_WARPIN); + break; + } + gSprites[spriteId].data[1] = 0; + gSprites[spriteId].invisible = FALSE; + gSprites[spriteId].callback = sub_80DD6DC; + sContest.unk1920A_4 = 1; +} + +void sub_80DD940(void) +{ + s32 i; + + for (i = 0; i < 5; i++) + { + const u8 *src; + + if (i < sContest.applauseLevel) + src = gContestApplauseMeterGfx + 64; + else + src = gContestApplauseMeterGfx; + CpuSet(src, (void *)(VRAM + 0x10000 + (gSprites[sContest.applauseMeterSpriteId].oam.tileNum + 17 + i) * 32), 0x04000008); + CpuSet(src + 32, (void *)(VRAM + 0x10000 + (gSprites[sContest.applauseMeterSpriteId].oam.tileNum + 25 + i) * 32), 0x04000008); + + if (sContest.applauseLevel > 4) + sub_80DDA20(); + } +} + +s8 Contest_GetMoveExcitement(u16 move) +{ + return gContestExcitementTable[gSpecialVar_ContestCategory][gContestMoves[move].contestCategory]; +} + +u8 sub_80DDA20(void) +{ + u8 taskId = CreateTask(c3_08130B10, 10); + + gTasks[taskId].data[1] = 1; + gTasks[taskId].data[2] = IndexOfSpritePaletteTag(0x0ABE2); + return taskId; +} + +void c3_08130B10(u8 taskId) +{ + if (++gTasks[taskId].data[0] == 1) + { + gTasks[taskId].data[0] = 0; + if (gTasks[taskId].data[3] == 0) + gTasks[taskId].data[4]++; + else + gTasks[taskId].data[4]--; + BlendPalette(264 + gTasks[taskId].data[2] * 16, 1, gTasks[taskId].data[4], RGB(31, 31, 31)); + if (gTasks[taskId].data[4] == 0 || gTasks[taskId].data[4] == 16) + { + gTasks[taskId].data[3] ^= 1; + if (sContest.applauseLevel < 5) + { + BlendPalette(264 + gTasks[taskId].data[2] * 16, 1, 0, RGB(31, 0, 0)); + DestroyTask(taskId); + } + } + } +} + +void sub_80DDB0C(void) +{ + CreateTask(sub_80DDB6C, 10); + gSprites[sContest.applauseMeterSpriteId].pos2.x = -70; + gSprites[sContest.applauseMeterSpriteId].invisible = FALSE; + sContest.unk1920A_6 = 1; +} + +void sub_80DDB6C(u8 taskId) +{ + struct Sprite *sprite = &gSprites[sContest.applauseMeterSpriteId]; + + gTasks[taskId].data[10] += 1664; + sprite->pos2.x += gTasks[taskId].data[10] >> 8; + gTasks[taskId].data[10] = gTasks[taskId].data[10] & 0xFF; + if (sprite->pos2.x > 0) + sprite->pos2.x = 0; + if (sprite->pos2.x == 0) + { + sContest.unk1920A_6 = 0; + DestroyTask(taskId); + } +} + +void sub_80DDBE8(void) +{ + if (gSprites[sContest.applauseMeterSpriteId].invisible == TRUE) + { + sContest.unk1920A_6 = 0; + } + else + { + CreateTask(task08_080CD1CC, 10); + gSprites[sContest.applauseMeterSpriteId].pos2.x = 0; + sContest.unk1920A_6 = 1; + } +} + +void task08_080CD1CC(u8 taskId) +{ + struct Sprite *sprite = &gSprites[sContest.applauseMeterSpriteId]; + + gTasks[taskId].data[10] += 1664; + sprite->pos2.x -= gTasks[taskId].data[10] >> 8; + gTasks[taskId].data[10] = gTasks[taskId].data[10] & 0xFF; + if (sprite->pos2.x < -70) + sprite->pos2.x = -70; + if (sprite->pos2.x == -70) + { + sprite->invisible = TRUE; + sContest.unk1920A_6 = 0; + DestroyTask(taskId); + } +} + +void sub_80DDCDC(s8 a) +{ + u8 taskId = CreateTask(sub_80DDD20, 5); + + gTasks[taskId].data[0] = a; + sContest.unk1920A_5 = 1; +} + +void sub_80DDD20(u8 taskId) +{ + switch (gTasks[taskId].data[10]) + { + case 0: + sub_80DDB0C(); + gTasks[taskId].data[10]++; + break; + case 1: + if (!sContest.unk1920A_6) + { + gTasks[taskId].data[10]++; + } + break; + case 2: + if (gTasks[taskId].data[11]++ > 20) + { + gTasks[taskId].data[11] = 0; + sub_80DD940(); + sContest.unk1920A_5 = 0; + DestroyTask(taskId); + } + break; + } +} + +void unref_sub_80DDDA8(void) +{ + gSprites[sContest.applauseMeterSpriteId].pos2.x = 0; + gSprites[sContest.applauseMeterSpriteId].invisible = FALSE; +} + +void unref_sub_80DDDE4(void) +{ + gSprites[sContest.applauseMeterSpriteId].invisible = TRUE; +} + +void sub_80DDE0C(void) +{ + CreateTask(sub_80DDE30, 15); + sContest.unk1920A_7 = 1; +} + +void sub_80DDE30(u8 taskId) +{ + if (gTasks[taskId].data[10]++ > 6) + { + gTasks[taskId].data[10] = 0; + if (gTasks[taskId].data[11] == 0) + { + RequestDma3Copy(shared16800, (void *)(VRAM + 0x2000), 0x1000, 1); + } + else + { + RequestDma3Copy(shared15800, (void *)(VRAM + 0x2000), 0x1000, 1); + gTasks[taskId].data[12]++; + } + + gTasks[taskId].data[11] ^= 1; + + if (gTasks[taskId].data[12] == 9) + { + sContest.unk1920A_7 = 0; + DestroyTask(taskId); + } + } +} + +#define tBlendColor data[0] +#define tBlendCoeff data[1] + +void sub_80DDED0(s8 a, s8 b) +{ + u8 taskId = CreateTask(sub_80DDF80, 10); + u16 blendColor; + u8 blendCoeff; + u8 r3; + + if (a > 0) + { + blendColor = RGB(30, 27, 8); + if (b > 0) + { + blendCoeff = 0; + r3 = sContest.applauseLevel * 3; + } + else + { + blendCoeff = sContest.applauseLevel * 3; + r3 = 0; + } + } + else + { + blendColor = 0; + if (b > 0) + { + blendCoeff = 0; + r3 = 12; + } + else + { + blendCoeff = 12; + r3 = 0; + } + } + gTasks[taskId].tBlendColor = blendColor; + gTasks[taskId].tBlendCoeff = blendCoeff; + gTasks[taskId].data[2] = b; + gTasks[taskId].data[3] = r3; + sContest.unk1920B_0 = 0; +} + +void sub_80DDF80(u8 taskId) +{ + if (gTasks[taskId].data[10]++ >= 0) + { + gTasks[taskId].data[10] = 0; + if (gTasks[taskId].data[2] > 0) + gTasks[taskId].tBlendCoeff++; + else + gTasks[taskId].tBlendCoeff--; + BlendPalette(17, 1, gTasks[taskId].tBlendCoeff, gTasks[taskId].tBlendColor); + BlendPalette(26, 1, gTasks[taskId].tBlendCoeff, gTasks[taskId].tBlendColor); + if (gTasks[taskId].tBlendCoeff == gTasks[taskId].data[3]) + { + DestroyTask(taskId); + sContest.unk1920B_0 = 0; + } + } +} + +#undef tBlendColor +#undef tBlendCoeff + +void sub_80DE008(bool8 a) +{ + s32 i; + + for (i = 0; i < 4; i++) + { + if (sContestantStatus[i].turnOrderMod != 0 && a) + { + CpuSet( + GetTurnOrderNumberGfx(i), + (void *)(VRAM + 0x10000 + (gSprites[gContestResources->field_14[i].unk1].oam.tileNum + 6) * 32), + 0x04000008); + gSprites[gContestResources->field_14[i].unk1].pos1.y = gUnknown_08587A70[gUnknown_02039F26[i]]; + gSprites[gContestResources->field_14[i].unk1].invisible = FALSE; + } + else + { + gSprites[gContestResources->field_14[i].unk1].invisible = TRUE; + } + } +} + +const u8 *GetTurnOrderNumberGfx(u8 contestant) +{ + if (sContestantStatus[contestant].turnOrderMod != 1) + return gContestNextTurnRandomGfx; + else + return gContestNextTurnNumbersGfx + sContestantStatus[contestant].nextTurnOrder * 32; +} + +void sub_80DE12C(void) +{ + s32 r7 = 0; + u32 r10 = 2; + u32 r8 = 1; + u32 r9 = 0x11; + + for(r7 = 0; r7 < 4; r7++) + { + u32 r6; + u16 var; + if(shared192D0.unnervedPokes[r7] != 0) + if(Contest_IsMonsTurnDisabled(r7) == FALSE) + { + r6 = gUnknown_02039F26[r7] * 5 + 2; + var = sub_80DB748(3); + ContestBG_FillBoxWithIncrementingTile(0, var, 0x14, r6, r10, r8, r9, r8); + var += 16; + ContestBG_FillBoxWithIncrementingTile(0, var, 0x14, r6 + 1, r10, r8, r9, r8); + PlaySE(SE_C_PASI); + } + } +} + +bool8 sub_80DE1E8(u8 a) +{ + if (sContestantStatus[a].disappointedRepeat || sContestantStatus[a].nervous) + return FALSE; + else + return TRUE; +} + +#ifdef NONMATCHING +void sub_80DE224(void) +{ + s32 i; + u16 bg0Cnt; + u16 bg1Cnt; + u16 bg2Cnt; + u16 var; + + bg1Cnt = GetGpuReg(REG_OFFSET_BG1CNT); + ((struct BgCnt *)&bg1Cnt)->priority = 0; + ((struct BgCnt *)&bg1Cnt)->screenSize = 2; + ((struct BgCnt *)&bg1Cnt)->areaOverflowMode = 0; + ((struct BgCnt *)&bg1Cnt)->charBaseBlock = 0; + + + SetGpuReg(REG_OFFSET_BG1CNT, bg1Cnt); + + bg0Cnt = GetGpuReg(REG_OFFSET_BG0CNT); + ((struct BgCnt *)&bg0Cnt)->priority = 0; + + bg2Cnt = GetGpuReg(REG_OFFSET_BG2CNT); + ((struct BgCnt *)&bg2Cnt)->priority = 0; + + SetGpuReg(REG_OFFSET_BG0CNT, bg0Cnt); + SetGpuReg(REG_OFFSET_BG2CNT, bg2Cnt); + + gBattle_BG1_X = DISPLAY_WIDTH; + gBattle_BG1_Y = DISPLAY_HEIGHT; + SetGpuReg(REG_OFFSET_BG1HOFS, DISPLAY_WIDTH); + SetGpuReg(REG_OFFSET_BG1VOFS, DISPLAY_HEIGHT); + var = 0; + + CpuSet(&var, &sContest.unk19214, 0x05000400); + + CopyToBgTilemapBuffer(1, gUnknown_08C17980, 0, 0); + Contest_SetBgCopyFlags(1); + + for (i = 0; i < 4; i++) + { + gSprites[gContestResources->field_14[i].unk0].oam.priority = 1; + gSprites[gContestResources->field_14[i].unk1].oam.priority = 1; + } + + /* ((vBgCnt *)®_BG1CNT)->priority = 0; + ((vBgCnt *)®_BG1CNT)->screenSize = 1; + ((vBgCnt *)®_BG1CNT)->areaOverflowMode = 0; + + + + DmaClear32(3, (void *)(VRAM + 0xF000), 0x1000); + LZDecompressVram(gUnknown_08D17C3C, (void *)(VRAM + 0xF000)); + + ((vBgCnt *)®_BG1CNT)->charBaseBlock = 0; + + for (i = 0; i < 4; i++) + { + gSprites[shared19338[i].unk0].oam.priority = 1; + gSprites[shared19338[i].unk1].oam.priority = 1; + } + + ((vBgCnt *)®_BG2CNT)->priority = 1; + ((vBgCnt *)®_BG0CNT)->priority = 1; + ((vBgCnt *)®_BG1CNT)->screenSize = 2; */ +} +#else +NAKED +void sub_80DE224(void) +{ + asm(".syntax unified\n\ + push {r4-r7,lr}\n\ + mov r7, r8\n\ + push {r7}\n\ + sub sp, 0xC\n\ + movs r0, 0xA\n\ + bl GetGpuReg\n\ + mov r1, sp\n\ + strh r0, [r1]\n\ + mov r2, sp\n\ + ldrb r1, [r2]\n\ + movs r4, 0x4\n\ + negs r4, r4\n\ + adds r0, r4, 0\n\ + ands r0, r1\n\ + strb r0, [r2]\n\ + ldrb r1, [r2, 0x1]\n\ + movs r0, 0x3F\n\ + ands r0, r1\n\ + movs r1, 0x80\n\ + orrs r0, r1\n\ + strb r0, [r2, 0x1]\n\ + ldrb r1, [r2, 0x1]\n\ + movs r0, 0x21\n\ + negs r0, r0\n\ + ands r0, r1\n\ + strb r0, [r2, 0x1]\n\ + ldrb r1, [r2]\n\ + movs r0, 0xD\n\ + negs r0, r0\n\ + mov r8, r0\n\ + ands r0, r1\n\ + strb r0, [r2]\n\ + mov r0, sp\n\ + ldrh r1, [r0]\n\ + movs r0, 0xA\n\ + bl SetGpuReg\n\ + movs r0, 0x8\n\ + bl GetGpuReg\n\ + mov r6, sp\n\ + adds r6, 0x2\n\ + strh r0, [r6]\n\ + movs r0, 0xC\n\ + bl GetGpuReg\n\ + add r5, sp, 0x4\n\ + strh r0, [r5]\n\ + ldrb r1, [r6]\n\ + adds r0, r4, 0\n\ + ands r0, r1\n\ + movs r1, 0x1\n\ + orrs r0, r1\n\ + strb r0, [r6]\n\ + ldrb r0, [r5]\n\ + ands r4, r0\n\ + orrs r4, r1\n\ + strb r4, [r5]\n\ + ldrh r1, [r6]\n\ + movs r0, 0x8\n\ + bl SetGpuReg\n\ + ldrh r1, [r5]\n\ + movs r0, 0xC\n\ + bl SetGpuReg\n\ + ldr r1, =gBattle_BG1_X\n\ + movs r0, 0xF0\n\ + strh r0, [r1]\n\ + ldr r4, =gBattle_BG1_Y\n\ + movs r0, 0xA0\n\ + strh r0, [r4]\n\ + movs r0, 0x14\n\ + movs r1, 0xF0\n\ + bl SetGpuReg\n\ + ldrh r1, [r4]\n\ + movs r0, 0x16\n\ + bl SetGpuReg\n\ + movs r0, 0\n\ + str r0, [sp, 0x8]\n\ + add r0, sp, 0x8\n\ + ldr r4, =gContestResources\n\ + ldr r1, [r4]\n\ + ldr r1, [r1, 0x28]\n\ + ldr r2, =0x05000400\n\ + bl CpuSet\n\ + ldr r1, =gUnknown_08C17980\n\ + movs r0, 0x1\n\ + movs r2, 0\n\ + movs r3, 0\n\ + bl CopyToBgTilemapBuffer\n\ + movs r0, 0x1\n\ + bl Contest_SetBgCopyFlags\n\ + movs r5, 0\n\ + ldr r7, =gSprites\n\ + movs r6, 0x4\n\ +_080DE2F0:\n\ + ldr r0, [r4]\n\ + ldr r0, [r0, 0x14]\n\ + lsls r3, r5, 2\n\ + adds r0, r3, r0\n\ + ldrb r0, [r0]\n\ + lsls r1, r0, 4\n\ + adds r1, r0\n\ + lsls r1, 2\n\ + adds r1, r7\n\ + ldrb r2, [r1, 0x5]\n\ + mov r0, r8\n\ + ands r0, r2\n\ + orrs r0, r6\n\ + strb r0, [r1, 0x5]\n\ + ldr r0, [r4]\n\ + ldr r0, [r0, 0x14]\n\ + adds r3, r0\n\ + ldrb r0, [r3, 0x1]\n\ + lsls r1, r0, 4\n\ + adds r1, r0\n\ + lsls r1, 2\n\ + adds r1, r7\n\ + ldrb r2, [r1, 0x5]\n\ + mov r0, r8\n\ + ands r0, r2\n\ + orrs r0, r6\n\ + strb r0, [r1, 0x5]\n\ + adds r5, 0x1\n\ + cmp r5, 0x3\n\ + ble _080DE2F0\n\ + add sp, 0xC\n\ + pop {r3}\n\ + mov r8, r3\n\ + pop {r4-r7}\n\ + pop {r0}\n\ + bx r0\n\ + .pool\n\ + .syntax divided\n"); +} +#endif + +#ifdef NONMATCHING +void sub_80DE350(void) +{ + s32 i; + s16 var; + u16 bg1Cnt; + u8 *spriteID; + u16 something; + + RequestDma3Fill(0,(void *)(VRAM + 0x8000), 0x2000, 0x1); + //DmaClearLarge32(3, (void *)(VRAM + 0x8000), 0x2000, 0x1000); + + /*bg1Cnt = 0; + something = 0; + var = bg1Cnt; + spriteID = (u8 *)&gContestResources;*/ + + var = 0; + + + CpuSet(&var, &gContestResources->field_24[1], 0x05000400); + //CpuSet(src, (void *)(VRAM + 0x10000 + (gSprites[sContest.applauseMeterSpriteId].oam.tileNum + 17 + i) + Contest_SetBgCopyFlags(1); + + //DmaClear32(3, (void *)(VRAM + 0xF000), 0x1000); + + bg1Cnt = GetGpuReg(REG_OFFSET_BG1CNT); + something = bg1Cnt; + ((struct BgCnt *) &bg1Cnt)->priority = 1; + ((struct BgCnt *) &bg1Cnt)->screenSize = 1; + ((struct BgCnt *) &bg1Cnt)->areaOverflowMode = 0; + ((struct BgCnt *) &bg1Cnt)->charBaseBlock = 2; + + SetGpuReg(REG_OFFSET_BG1CNT, bg1Cnt); + + gBattle_BG1_X = 0; + gBattle_BG1_Y = 0; + + for (i = 0; i < 4; i++) + { + gSprites[gContestResources->field_14[i].unk0].oam.priority = 0; + gSprites[gContestResources->field_14[i].unk1].oam.priority = 0; + } +} +#else +NAKED +void sub_80DE350(void) +{ + asm(".syntax unified\n\ + push {r4-r7,lr}\n\ + sub sp, 0x8\n\ + ldr r1, =0x06008000\n\ + movs r2, 0x80\n\ + lsls r2, 6\n\ + movs r0, 0\n\ + movs r3, 0x1\n\ + bl RequestDma3Fill\n\ + movs r5, 0\n\ + str r5, [sp]\n\ + ldr r6, =gContestResources\n\ + ldr r0, [r6]\n\ + ldr r1, [r0, 0x28]\n\ + ldr r2, =0x05000400\n\ + mov r0, sp\n\ + bl CpuSet\n\ + movs r0, 0x1\n\ + bl Contest_SetBgCopyFlags\n\ + movs r0, 0xA\n\ + bl GetGpuReg\n\ + add r3, sp, 0x4\n\ + strh r0, [r3]\n\ + ldrb r1, [r3]\n\ + movs r0, 0x4\n\ + negs r0, r0\n\ + ands r0, r1\n\ + movs r1, 0x1\n\ + orrs r0, r1\n\ + strb r0, [r3]\n\ + mov r1, sp\n\ + adds r1, 0x5\n\ + ldrb r2, [r1]\n\ + movs r0, 0x3F\n\ + ands r0, r2\n\ + strb r0, [r1]\n\ + ldrb r2, [r1]\n\ + movs r0, 0x21\n\ + negs r0, r0\n\ + ands r0, r2\n\ + strb r0, [r1]\n\ + ldrb r1, [r3]\n\ + movs r4, 0xD\n\ + negs r4, r4\n\ + adds r0, r4, 0\n\ + ands r0, r1\n\ + movs r1, 0x8\n\ + orrs r0, r1\n\ + strb r0, [r3]\n\ + ldrh r1, [r3]\n\ + movs r0, 0xA\n\ + bl SetGpuReg\n\ + ldr r0, =gBattle_BG1_X\n\ + strh r5, [r0]\n\ + ldr r0, =gBattle_BG1_Y\n\ + strh r5, [r0]\n\ + ldr r7, =gSprites\n\ +_080DE3CA:\n\ + ldr r0, [r6]\n\ + ldr r0, [r0, 0x14]\n\ + lsls r3, r5, 2\n\ + adds r0, r3, r0\n\ + ldrb r0, [r0]\n\ + lsls r1, r0, 4\n\ + adds r1, r0\n\ + lsls r1, 2\n\ + adds r1, r7\n\ + ldrb r2, [r1, 0x5]\n\ + adds r0, r4, 0\n\ + ands r0, r2\n\ + strb r0, [r1, 0x5]\n\ + ldr r0, [r6]\n\ + ldr r0, [r0, 0x14]\n\ + adds r3, r0\n\ + ldrb r0, [r3, 0x1]\n\ + lsls r1, r0, 4\n\ + adds r1, r0\n\ + lsls r1, 2\n\ + adds r1, r7\n\ + ldrb r2, [r1, 0x5]\n\ + adds r0, r4, 0\n\ + ands r0, r2\n\ + strb r0, [r1, 0x5]\n\ + adds r5, 0x1\n\ + cmp r5, 0x3\n\ + ble _080DE3CA\n\ + add sp, 0x8\n\ + pop {r4-r7}\n\ + pop {r0}\n\ + bx r0\n\ + .pool\n\ + .syntax divided\n"); +} +#endif + +void sub_80DE424(u8 taskId) +{ + gBattle_BG1_X = 0; + gBattle_BG1_Y = DISPLAY_HEIGHT; + PlaySE12WithPanning(SE_C_MAKU_D, 0); + gTasks[taskId].func = sub_80DE464; +} + +void sub_80DE464(u8 taskId) +{ + if ((s16)(gBattle_BG1_Y -= 7) < 0) + gBattle_BG1_Y = 0; + if (gBattle_BG1_Y == 0) + { + gTasks[taskId].data[0] = 0; + gTasks[taskId].data[1] = 0; + gTasks[taskId].data[2] = 0; + gTasks[taskId].func = sub_80DE4A8; + } +} + +void sub_80DE4A8(u8 taskId) +{ + s32 i; + + switch (gTasks[taskId].data[0]) + { + case 0: + for (i = 0; i < 4; i++) + sContest.unk19218[i] = gUnknown_02039F26[i]; + sub_80DBF90(); + sub_80DC864(); + sub_80DB69C(); + sub_80DD04C(); + sub_80DE008(TRUE); + sub_80DC44C(); + gTasks[taskId].data[0] = 1; + break; + case 1: + if (gIsLinkContest & 1) + { + u8 taskId2; + + sContest.unk1920B_2 = 1; + if (sub_80DA8A4()) + sub_80DBAA0(); + taskId2 = CreateTask(sub_80FCC88, 0); + SetTaskFuncWithFollowupFunc(taskId2, sub_80FCC88, sub_80DA110); + sub_80DBF68(); + gTasks[taskId].data[0] = 2; + } + else + { + sub_80DBAA0(); + gTasks[taskId].data[0] = 3; + } + break; + case 2: + if (!sContest.unk1920B_2) + gTasks[taskId].data[0] = 3; + break; + case 3: + sub_80DB884(); + sub_80DB2BC(); + gTasks[taskId].data[0] = 0; + gTasks[taskId].func = sub_80DE5F4; + break; + } +} + +void sub_80DE5C0(u8 taskId) +{ + if ((s16)(gBattle_BG1_Y += 7) > DISPLAY_HEIGHT) + gTasks[taskId].func = sub_80DA4F4; +} + +void sub_80DE5F4(u8 taskId) +{ + if (gTasks[taskId].data[2] < 10) + { + gTasks[taskId].data[2]++; + } + else + { + if (gTasks[taskId].data[1] == 0) + { + if (gTasks[taskId].data[0] == 16) + gTasks[taskId].data[1]++; + else + gTasks[taskId].data[0]++; + } + else + { + if (gTasks[taskId].data[0] == 0) + { + gTasks[taskId].data[1] = 0; + gTasks[taskId].data[2] = 0; + gTasks[taskId].func = sub_80DE65C; + } + else + { + gTasks[taskId].data[0]--; + } + } + } +} + +void sub_80DE65C(u8 taskId) +{ + if (gTasks[taskId].data[2] < 10) + { + gTasks[taskId].data[2]++; + } + else + { + gTasks[taskId].data[2] = 0; + PlaySE12WithPanning(SE_C_MAKU_U, 0); + gTasks[taskId].func = sub_80DE5C0; + } +} + +void sub_80DE69C(u8 a) +{ + s32 i; + u8 taskId; + + for (i = 0; i < 4; i++) + { + gSprites[gContestResources->field_14[i].unk0].oam.matrixNum = AllocOamMatrix(); + gSprites[gContestResources->field_14[i].unk0].oam.affineMode = 1; + StartSpriteAffineAnim(&gSprites[gContestResources->field_14[i].unk0], a); + if (a == 2) + { + AnimateSprite(&gSprites[gContestResources->field_14[i].unk0]); + gSprites[gContestResources->field_14[i].unk0].invisible = FALSE; + } + } + taskId = CreateTask(sub_80DE794, 5); + gTasks[taskId].data[0] = a; + sContest.unk1920B_1 = 1; +} + +void sub_80DE794(u8 taskId) +{ + s32 i; + + if (gSprites[gContestResources->field_14[0].unk0].affineAnimEnded) + { + if ((u8)gTasks[taskId].data[0] == 1) + { + for (i = 0; i < 4; i++) + gSprites[gContestResources->field_14[i].unk0].invisible = TRUE; + } + for (i = 0; i < 4; i++) + FreeSpriteOamMatrix(&gSprites[gContestResources->field_14[i].unk0]); + sContest.unk1920B_1 = 0; + DestroyTask(taskId); + } +} + +u16 SanitizeMove(u16 move) +{ + if (move >= MOVES_COUNT) + move = MOVE_POUND; + return move; +} + +u16 SanitizeSpecies(u16 species) +{ + if (species >= NUM_SPECIES) + species = SPECIES_NONE; + return species; +} + +void sub_80DE864(u8 a) +{ + s32 i; + u16 move = SanitizeMove(sContestantStatus[a].currMove); + u16 species = SanitizeSpecies(gContestMons[a].species); + u8 r5_2; + + memset(&gContestResources->field_18->species, 0, 0x14); + ClearBattleAnimationVars(); + for (i = 0; i < 4; i++) + gBattleMonForms[i] = 0; + switch (move) + { + case MOVE_CURSE: + if (gBaseStats[species].type1 == TYPE_GHOST || gBaseStats[species].type2 == TYPE_GHOST) + gAnimMoveTurn = 0; + else + gAnimMoveTurn = 1; + break; + case MOVE_TRANSFORM: + case MOVE_ROLE_PLAY: + r5_2 = sContestantStatus[a].unk1B; + gContestResources->field_18->unk2 = SanitizeSpecies(gContestMons[r5_2].species); + gContestResources->field_18->unk10 = gContestMons[r5_2].personality; + gContestResources->field_18->unk4_0 = 1; + break; + case MOVE_RETURN: + gAnimFriendship = 0xFF; + break; + case MOVE_FRUSTRATION: + gAnimFriendship = 0; + break; + case MOVE_SOLAR_BEAM: + case MOVE_RAZOR_WIND: + case MOVE_SKULL_BASH: + case MOVE_SKY_ATTACK: + if (sContest.unk1925E == 0) + { + sContest.unk1925E = 2; + gAnimMoveTurn = 0; + } + else + { + gAnimMoveTurn = 1; + } + break; + } + sub_80DEA5C(); +} + +void sub_80DE9B0(u8 unused) +{ + memset(&gContestResources->field_18->species, 0, 0x14); + if (sContest.unk1925E != 0) + sContest.unk1925E--; +} + +void sub_80DE9DC(u8 a) +{ + gContestResources->field_18->unk5 = a; + gContestResources->field_18->species = SanitizeSpecies(gContestMons[a].species); + gContestResources->field_18->unk8 = gContestMons[a].personality; + gContestResources->field_18->unkC = gContestMons[a].otId; +} + +void sub_80DEA20(void) +{ + gBattlerSpriteIds[3] = CreateInvisibleSpriteWithCallback(SpriteCallbackDummy); + InitSpriteAffineAnim(&gSprites[gBattlerSpriteIds[gBattlerTarget]]); + sub_80DEA5C(); +} + +void sub_80DEA5C(void) +{ + struct Sprite *sprite = &gSprites[gBattlerSpriteIds[3]]; + + sprite->pos2.x = 0; + sprite->pos2.y = 0; + sprite->pos1.x = GetBattlerSpriteCoord(3, 0); + sprite->pos1.y = GetBattlerSpriteCoord(3, 1); + sprite->invisible = TRUE; +} + +void SelectContestMoveBankTarget(u16 move) +{ + switch (gBattleMoves[move].target) + { + case MOVE_TARGET_USER_OR_SELECTED: + case MOVE_TARGET_USER: + gBattlerTarget = 2; + break; + case MOVE_TARGET_SELECTED: + case MOVE_TARGET_RANDOM: + case MOVE_TARGET_BOTH: + case MOVE_TARGET_FOES_AND_ALLY: + default: + gBattlerTarget = 3; + break; + } +} + +#ifdef NONMATCHING +void Contest_PrintTextToBg0WindowStd(u32 a, const u8 *b) +{ + struct TextPrinterTemplate printerTemplate; + + printerTemplate.currentChar = b; + printerTemplate.windowId = a; + printerTemplate.fontId = 1; + printerTemplate.x = 0; + printerTemplate.y = 1; + printerTemplate.currentX = 0; + printerTemplate.currentY = 1; + printerTemplate.letterSpacing = 0; + printerTemplate.lineSpacing = 0; + + printerTemplate.unk = a & (1 - 0x11); + printerTemplate.unk = 0xF0; + printerTemplate.bgColor = a & (1 - 0x11) & 0x80; + + + + + AddTextPrinter(&printerTemplate, 0, 0); + PutWindowTilemap(a); + Contest_SetBgCopyFlags(0); +} +#else +NAKED +void Contest_PrintTextToBg0WindowStd(u32 a, const u8 *b) +{ + asm(".syntax unified\n\ + push {r4,lr}\n\ + sub sp, 0x10\n\ + adds r4, r0, 0\n\ + str r1, [sp]\n\ + mov r0, sp\n\ + movs r2, 0\n\ + strb r4, [r0, 0x4]\n\ + movs r1, 0x1\n\ + strb r1, [r0, 0x5]\n\ + strb r2, [r0, 0x6]\n\ + strb r1, [r0, 0x7]\n\ + strb r2, [r0, 0x8]\n\ + strb r1, [r0, 0x9]\n\ + strb r2, [r0, 0xA]\n\ + strb r2, [r0, 0xB]\n\ + mov r3, sp\n\ + ldrb r2, [r3, 0xC]\n\ + subs r1, 0x11\n\ + adds r0, r1, 0\n\ + ands r0, r2\n\ + strb r0, [r3, 0xC]\n\ + mov r2, sp\n\ + movs r0, 0xF0\n\ + strb r0, [r2, 0xC]\n\ + ldrb r0, [r2, 0xD]\n\ + ands r1, r0\n\ + strb r1, [r2, 0xD]\n\ + mov r1, sp\n\ + movs r0, 0x80\n\ + strb r0, [r1, 0xD]\n\ + mov r0, sp\n\ + movs r1, 0\n\ + movs r2, 0\n\ + bl AddTextPrinter\n\ + lsls r4, 24\n\ + lsrs r4, 24\n\ + adds r0, r4, 0\n\ + bl PutWindowTilemap\n\ + movs r0, 0\n\ + bl Contest_SetBgCopyFlags\n\ + add sp, 0x10\n\ + pop {r4}\n\ + pop {r0}\n\ + bx r0\n\ + .syntax divided\n"); +} +#endif + +#ifdef NONMATCHING +void Contest_PrintTextToBg0WindowAt(u32 a, u8 *b, s32 c, u8 d, u8 e) +{ + struct TextPrinterTemplate printerTemplate; + + printerTemplate.currentChar = b; + printerTemplate.windowId = a; + printerTemplate.fontId = 1; + printerTemplate.x = c; + printerTemplate.y = d; + printerTemplate.currentX = c; + printerTemplate.currentY = d; + printerTemplate.letterSpacing = 0; + printerTemplate.lineSpacing = 0; + + printerTemplate.unk = a & (1 - 0x10); + printerTemplate.unk = 0xF0; + printerTemplate.bgColor = a & (1 - 0x11) & 0x80; + + + + + AddTextPrinter(&printerTemplate, 0, 0); + PutWindowTilemap(a); + Contest_SetBgCopyFlags(0); +} +#else +NAKED +void Contest_PrintTextToBg0WindowAt(u32 a, u8 *b, s32 c, u8 d, u8 e) +{ + asm(".syntax unified\n\ + push {r4,r5,lr}\n\ + sub sp, 0x10\n\ + adds r5, r0, 0\n\ + ldr r4, [sp, 0x1C]\n\ + str r1, [sp]\n\ + mov r0, sp\n\ + movs r1, 0\n\ + strb r5, [r0, 0x4]\n\ + strb r4, [r0, 0x5]\n\ + strb r2, [r0, 0x6]\n\ + strb r3, [r0, 0x7]\n\ + strb r2, [r0, 0x8]\n\ + strb r3, [r0, 0x9]\n\ + strb r1, [r0, 0xA]\n\ + strb r1, [r0, 0xB]\n\ + mov r3, sp\n\ + ldrb r2, [r3, 0xC]\n\ + subs r1, 0x10\n\ + adds r0, r1, 0\n\ + ands r0, r2\n\ + strb r0, [r3, 0xC]\n\ + mov r2, sp\n\ + movs r0, 0xF0\n\ + strb r0, [r2, 0xC]\n\ + ldrb r0, [r2, 0xD]\n\ + ands r1, r0\n\ + strb r1, [r2, 0xD]\n\ + mov r1, sp\n\ + movs r0, 0x80\n\ + strb r0, [r1, 0xD]\n\ + mov r0, sp\n\ + movs r1, 0\n\ + movs r2, 0\n\ + bl AddTextPrinter\n\ + lsls r5, 24\n\ + lsrs r5, 24\n\ + adds r0, r5, 0\n\ + bl PutWindowTilemap\n\ + movs r0, 0\n\ + bl Contest_SetBgCopyFlags\n\ + add sp, 0x10\n\ + pop {r4,r5}\n\ + pop {r0}\n\ + bx r0\n\ + .syntax divided\n"); +} +#endif + +#ifdef NONMATCHING +void Contest_StartTextPrinter(const u8 *a, u32 b) +{ + struct TextPrinterTemplate printerTemplate; + u8 var; + + printerTemplate.currentChar = a; + printerTemplate.windowId = b; + printerTemplate.fontId = 1; + printerTemplate.x = 0; + printerTemplate.y = 1; + printerTemplate.currentX = 0; + printerTemplate.currentY = 1; + printerTemplate.letterSpacing = 0; + printerTemplate.lineSpacing = 0; + + printerTemplate.unk = b & -0x10; + printerTemplate.unk = 0x10; + printerTemplate.bgColor = b & (1 - 0x10) & 0x80; + + if(!b) + { + var = 0; + AddTextPrinter(&printerTemplate, var, 0); + } + else + { + if(gIsLinkContest & 1) + { + var = 4; + AddTextPrinter(&printerTemplate, var, 0); + } + else + { + var = GetPlayerTextSpeedDelay(); + AddTextPrinter(&printerTemplate, var, 0); + } + } + + PutWindowTilemap(4); + Contest_SetBgCopyFlags(0); + +} +} +#else +NAKED +void Contest_StartTextPrinter(const u8 *a, u32 b) +{ + asm(".syntax unified\n\ + push {r4,r5,lr}\n\ + sub sp, 0x10\n\ + str r0, [sp]\n\ + mov r2, sp\n\ + movs r3, 0\n\ + movs r0, 0x4\n\ + strb r0, [r2, 0x4]\n\ + mov r0, sp\n\ + movs r5, 0x1\n\ + strb r5, [r0, 0x5]\n\ + strb r3, [r0, 0x6]\n\ + strb r5, [r0, 0x7]\n\ + strb r3, [r0, 0x8]\n\ + strb r5, [r0, 0x9]\n\ + strb r3, [r0, 0xA]\n\ + strb r3, [r0, 0xB]\n\ + mov r4, sp\n\ + ldrb r3, [r4, 0xC]\n\ + movs r2, 0x10\n\ + negs r2, r2\n\ + adds r0, r2, 0\n\ + ands r0, r3\n\ + strb r0, [r4, 0xC]\n\ + mov r3, sp\n\ + movs r0, 0x10\n\ + strb r0, [r3, 0xC]\n\ + ldrb r0, [r3, 0xD]\n\ + ands r2, r0\n\ + strb r2, [r3, 0xD]\n\ + mov r2, sp\n\ + movs r0, 0x80\n\ + strb r0, [r2, 0xD]\n\ + cmp r1, 0\n\ + bne _080DEC80\n\ + mov r0, sp\n\ + movs r1, 0\n\ + movs r2, 0\n\ + bl AddTextPrinter\n\ + b _080DECA4\n\ +_080DEC80:\n\ + ldr r0, =gIsLinkContest\n\ + ldrb r1, [r0]\n\ + adds r0, r5, 0\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + beq _080DEC94\n\ + movs r1, 0x4\n\ + b _080DEC9C\n\ + .pool\n\ +_080DEC94:\n\ + bl GetPlayerTextSpeedDelay\n\ + lsls r0, 24\n\ + lsrs r1, r0, 24\n\ +_080DEC9C:\n\ + mov r0, sp\n\ + movs r2, 0\n\ + bl AddTextPrinter\n\ +_080DECA4:\n\ + movs r0, 0x4\n\ + bl PutWindowTilemap\n\ + movs r0, 0\n\ + bl Contest_SetBgCopyFlags\n\ + add sp, 0x10\n\ + pop {r4,r5}\n\ + pop {r0}\n\ + bx r0\n\ + .syntax divided\n"); +} +#endif + +#ifdef NONMATCHING +void ContestBG_FillBoxWithIncrementingTile(u8 a, u16 b, u8 c, u8 d, u8 e, u8 f, u8 g, u8 h) +{ + s16 var = h; + WriteSequenceToBgTilemapBuffer(a, b, c, d, e, f, g, var); + Contest_SetBgCopyFlags(a); +} +#else +NAKED +void ContestBG_FillBoxWithIncrementingTile(u8 a, u16 b, u8 c, u8 d, u8 e, u8 f, u8 g, u8 h) +{ + asm(".syntax unified\n\ + push {r4-r7,lr}\n\ + mov r7, r8\n\ + push {r7}\n\ + sub sp, 0x10\n\ + mov r8, r0\n\ + ldr r0, [sp, 0x28]\n\ + ldr r4, [sp, 0x2C]\n\ + ldr r5, [sp, 0x30]\n\ + ldr r6, [sp, 0x34]\n\ + mov r7, r8\n\ + lsls r7, 24\n\ + lsrs r7, 24\n\ + mov r8, r7\n\ + lsls r1, 16\n\ + lsrs r1, 16\n\ + lsls r2, 24\n\ + lsrs r2, 24\n\ + lsls r3, 24\n\ + lsrs r3, 24\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + lsls r4, 24\n\ + lsrs r4, 24\n\ + lsls r5, 24\n\ + lsrs r5, 24\n\ + str r0, [sp]\n\ + str r4, [sp, 0x4]\n\ + str r5, [sp, 0x8]\n\ + lsls r6, 16\n\ + asrs r6, 16\n\ + str r6, [sp, 0xC]\n\ + mov r0, r8\n\ + bl WriteSequenceToBgTilemapBuffer\n\ + mov r0, r8\n\ + bl Contest_SetBgCopyFlags\n\ + add sp, 0x10\n\ + pop {r3}\n\ + mov r8, r3\n\ + pop {r4-r7}\n\ + pop {r0}\n\ + bx r0\n\ + .syntax divided\n"); +} +#endif + +void ContestBG_FillBoxWithTile(u8 a, u16 b, u8 c, u8 d, u8 e, u8 f, u8 g) +{ + ContestBG_FillBoxWithIncrementingTile(a, b, c, d, e, f, g, 0); +} + +bool32 Contest_RunTextPrinters(void) +{ + RunTextPrinters(); + return IsTextPrinterActive(4); +} + +void Contest_SetBgCopyFlags(u32 var) +{ + sContestBgCopyFlags |= 1 << var; +} + +void ResetContestLinkResults(void) +{ + s32 i; + s32 j; + + for(i = 0; i < 5; i++) + for(j = 0; j < 4; j++) + gSaveBlock2Ptr->contestLinkResults[i][j] = 0; +} + +bool8 sub_80DEDA8(u8 a) +{ + s32 i; + u8 r7 = Random() % 3; + + for (i = 0; i < 3; i++) + { + if (gContestFinalStandings[i] == 0) + break; + } + if (a == 0xFF && i != gContestPlayerMonIndex) + return FALSE; + switch (gSpecialVar_ContestCategory) + { + case CONTEST_CATEGORY_COOL: + r7 += 0; + break; + case CONTEST_CATEGORY_BEAUTY: + r7 += 3; + break; + case CONTEST_CATEGORY_CUTE: + r7 += 6; + break; + case CONTEST_CATEGORY_SMART: + r7 += 9; + break; + case CONTEST_CATEGORY_TOUGH: + r7 += 12; + break; + } + if (a != 0xFE) + { + u8 r4 = sub_80DEFA8(a, 1); + + gSaveBlock1Ptr->contestWinners[r4].personality = gContestMons[i].personality; + gSaveBlock1Ptr->contestWinners[r4].species = gContestMons[i].species; + gSaveBlock1Ptr->contestWinners[r4].trainerId = gContestMons[i].otId; + StringCopy(gSaveBlock1Ptr->contestWinners[r4].monName, gContestMons[i].nickname); + StringCopy(gSaveBlock1Ptr->contestWinners[r4].trainerName, gContestMons[i].trainerName); + if(gIsLinkContest & 1) + gSaveBlock1Ptr->contestWinners[r4].contestRank = 4; + else + gSaveBlock1Ptr->contestWinners[r4].contestRank = gSpecialVar_ContestRank; + + if (a != 0xFF) + gSaveBlock1Ptr->contestWinners[r4].contestCategory = gSpecialVar_ContestCategory; + else + gSaveBlock1Ptr->contestWinners[r4].contestCategory = r7; + } + else + { + gUnknown_02039F3C.personality = gContestMons[i].personality; + gUnknown_02039F3C.trainerId = gContestMons[i].otId; + gUnknown_02039F3C.species = gContestMons[i].species; + StringCopy(gUnknown_02039F3C.monName, gContestMons[i].nickname); + StringCopy(gUnknown_02039F3C.trainerName, gContestMons[i].trainerName); + gUnknown_02039F3C.contestCategory = r7; + } + return TRUE; +} + +u8 sub_80DEFA8(u8 a, u8 b) +{ + s32 i; + + switch (a) + { + case 0: + case 1: + case 2: + case 3: + if (b != 0) + { + for (i = 5; i >= 1; i--) + memcpy(&gSaveBlock1Ptr->contestWinners[i], &gSaveBlock1Ptr->contestWinners[i - 1], sizeof(struct ContestWinner)); + } + return 0; + default: + switch (gSpecialVar_ContestCategory) + { + case CONTEST_CATEGORY_COOL: + return 8; + case CONTEST_CATEGORY_BEAUTY: + return 9; + case CONTEST_CATEGORY_CUTE: + return 10; + case CONTEST_CATEGORY_SMART: + return 11; + case CONTEST_CATEGORY_TOUGH: + default: + return 12; + } + } +} + +void ClearContestWinnerPicsInContestHall(void) +{ + s32 i; + + for (i = 0; i < 8; i++) + gSaveBlock1Ptr->contestWinners[i] = gUnknown_08587FA4[i]; +} + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/graphics.c b/src/graphics.c index 10efd5043..4786f1f22 100644 --- a/src/graphics.c +++ b/src/graphics.c @@ -1023,8 +1023,8 @@ const u32 gBattleAnimSpriteSheet_262[] = INCBIN_U32("graphics/battle_anims/sprit const u32 gBattleAnimSpritePalette_262[] = INCBIN_U32("graphics/battle_anims/sprites/262.gbapal.lz"); const u32 gContestNextTurnGfx[] = INCBIN_U32("graphics/contest/nextturn.4bpp.lz"); -const u8 gUnknown_08D8E9B4[] = INCBIN_U8("graphics/contest/nextturn_numbers.4bpp"); -const u8 gUnknown_08D8EA34[] = INCBIN_U8("graphics/contest/nextturn_random.4bpp"); +const u8 gContestNextTurnNumbersGfx[] = INCBIN_U8("graphics/contest/nextturn_numbers.4bpp"); +const u8 gContestNextTurnRandomGfx[] = INCBIN_U8("graphics/contest/nextturn_random.4bpp"); const u32 gBattleAnimSpriteSheet_264[] = INCBIN_U32("graphics/battle_anims/sprites/264.4bpp.lz"); const u32 gBattleAnimSpritePalette_264[] = INCBIN_U32("graphics/battle_anims/sprites/264.gbapal.lz"); |