diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/contest_link_80F57C4.c | 1729 | ||||
-rw-r--r-- | src/easy_chat.c | 3591 | ||||
-rw-r--r-- | src/flying.c | 312 |
3 files changed, 5280 insertions, 352 deletions
diff --git a/src/contest_link_80F57C4.c b/src/contest_link_80F57C4.c index 381fb34fa..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,27 +125,38 @@ 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); static void sub_80F6204(u8); -void sub_80F73DC(u8); -void sub_80F74BC(u8); -void sub_80F77E0(u8, u8); +static void sub_80F73DC(u8); +static void sub_80F74BC(u8); +static void sub_80F753C(u8); +static void sub_80F77E0(u8, u8); +static void sub_80F7824(u8); static void sub_80F6404(u8); -void sub_80F75A8(struct Sprite *); -void sub_80F7670(u8); -void sub_80F7620(struct Sprite *); +static void sub_80F75A8(struct Sprite *); +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) { @@ -265,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)); @@ -827,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; @@ -838,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); @@ -852,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) @@ -1439,3 +1470,1657 @@ u8 sub_80F7310(u8 monIndex, u8 arg1) return var1; } + +s8 sub_80F7364(u8 arg0, u8 arg1) +{ + u32 r4; + u32 r2; + s16 val; + s8 ret; + + val = gUnknown_02039F18[arg0]; + if (val < 0) + r4 = -val << 16; + else + r4 = val << 16; + + r2 = r4 / 80; + if (r2 & 0xFFFF) + r2 += 0x10000; + + r2 >>= 16; + if (r2 == 0 && r4 != 0) + r2 = 1; + + if (arg1 != 0 && r2 > 10) + r2 = 10; + + if (gUnknown_02039F18[arg0] < 0) + ret = -r2; + else + ret = r2; + + return ret; +} + +static void sub_80F73DC(u8 taskId) +{ + u16 firstTileNum; + + if (gTasks[taskId].data[10] == 0) + { + gTasks[taskId].data[11] = (3 - gTasks[taskId].data[0]) * 40; + gTasks[taskId].data[10]++; + } + else if (gTasks[taskId].data[10] == 1) + { + if (--gTasks[taskId].data[11] == -1) + { + firstTileNum = gTasks[taskId].data[0] * 2 + 0x5043; + WriteSequenceToBgTilemapBuffer(2, firstTileNum, 1, gTasks[taskId].data[1] * 3 + 5, 2, 1, 17, 1); + WriteSequenceToBgTilemapBuffer(2, firstTileNum + 0x10, 1, gTasks[taskId].data[1] * 3 + 6, 2, 1, 17, 1); + gUnknown_0203A034->unk0->unk5++; + DestroyTask(taskId); + PlaySE(SE_JYUNI); + } + } +} + +static void sub_80F74BC(u8 taskId) +{ + int i; + for (i = 0; i < 4 && gContestFinalStandings[i] != 0; i++) + ; + + CopyToBgTilemapBufferRect_ChangePalette(2, i * 0xC0 + 0x100 + gUnknown_0203A034->unkC[2], 0, i * 3 + 4, 32, 3, 9); + gTasks[taskId].data[10] = i; + gTasks[taskId].data[12] = 1; + gTasks[taskId].func = sub_80F753C; + gUnknown_0203A034->unk0->unk3 = taskId; +} + +static void sub_80F753C(u8 taskId) +{ + if (++gTasks[taskId].data[11] == 1) + { + gTasks[taskId].data[11] = 0; + BlendPalette(0x91, 1, gTasks[taskId].data[12], RGB(13, 28, 27)); + if (gTasks[taskId].data[13] == 0) + { + if (++gTasks[taskId].data[12] == 16) + gTasks[taskId].data[13] = 1; + } + else + { + if (--gTasks[taskId].data[12] == 0) + gTasks[taskId].data[13] = 0; + } + } +} + +static void sub_80F75A8(struct Sprite *sprite) +{ + if (sprite->data[0] < 10) + { + if (++sprite->data[0] == 10) + { + PlayCry1(sprite->data[1], 0); + sprite->data[1] = 0; + } + } + else + { + s16 delta = (u16)sprite->data[1] + 0x600; + sprite->pos1.x -= delta >> 8; + sprite->data[1] = (sprite->data[1] + 0x600) & 0xFF; + if (sprite->pos1.x < 120) + sprite->pos1.x = 120; + + if (sprite->pos1.x == 120) + { + sprite->callback = SpriteCallbackDummy; + sprite->data[1] = 0; + gUnknown_0203A034->unk0->unk6 = 1; + } + } +} + +static void sub_80F7620(struct Sprite *sprite) +{ + s16 delta = (u16)sprite->data[1] + 0x600; + sprite->pos1.x -= delta >> 8; + sprite->data[1] = (sprite->data[1] + 0x600) & 0xFF; + if (sprite->pos1.x < -32) + { + sprite->callback = SpriteCallbackDummy; + sprite->invisible = 1; + 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(); + } +} diff --git a/src/easy_chat.c b/src/easy_chat.c index 7158253d1..5c55cd2ca 100644 --- a/src/easy_chat.c +++ b/src/easy_chat.c @@ -2,20 +2,28 @@ // Includes #include "global.h" #include "alloc.h" -#include "constants/songs.h" -#include "sound.h" -#include "overworld.h" -#include "task.h" -#include "main.h" -#include "link.h" +#include "bg.h" +#include "dewford_trend.h" +#include "dynamic_placeholder_text_util.h" +#include "easy_chat.h" +#include "event_data.h" #include "field_weather.h" -#include "window.h" +#include "gpu_regs.h" +#include "graphics.h" +#include "international_string_util.h" +#include "link.h" +#include "main.h" +#include "menu.h" +#include "overworld.h" #include "palette.h" -#include "event_data.h" -#include "easy_chat.h" +#include "sound.h" #include "string_util.h" - -// Static type declarations +#include "strings.h" +#include "task.h" +#include "text_window.h" +#include "window.h" +#include "constants/flags.h" +#include "constants/songs.h" #define EZCHAT_TASK_STATE 0 #define EZCHAT_TASK_KIND 1 @@ -24,37 +32,86 @@ #define EZCHAT_TASK_UNK06 6 #define EZCHAT_TASK_SIZE 7 -// Static RAM declarations - -EWRAM_DATA struct -{ - u8 kind; - u8 unk_01; - u8 unk_02; - u8 unk_03; - u8 unk_04; - s8 unk_05; - s8 unk_06; - u8 unk_07; - u8 unk_08; - u8 unk_09; - u8 unk_0a; - u8 unk_0b; - u8 unk_0c; - u8 unk_0d; - u8 unk_0e[0x4]; - u8 sizeParam; - u8 unk_13; - u8 unk_14[0x20]; - const u8 *src; - const u16 *words; - u16 ecWordBuffer[9]; -} *gUnknown_0203A118 = NULL; - -EWRAM_DATA void *gUnknown_0203A11C = 0; -EWRAM_DATA void *gUnknown_0203A120 = 0; +struct EasyChatScreenTemplate +{ + u8 unk_00; + u8 numColumns; + u8 numRows; + u8 unk_03_0:7; + u8 unk_03_7:1; + const u8 *titleText; + const u8 *instructionsText1; + const u8 *instructionsText2; + const u8 *confirmText1; + const u8 *confirmText2; +}; + +struct EasyChatScreen +{ + /*0x00*/ u8 kind; + /*0x01*/ u8 templateId; + /*0x02*/ u8 numColumns; + /*0x03*/ u8 numRows; + /*0x04*/ u8 state; + /*0x05*/ s8 mainCursorColumn; + /*0x06*/ s8 mainCursorRow; + /*0x07*/ u8 unk_07; + /*0x08*/ u8 unk_08; + /*0x09*/ u8 unk_09; + /*0x0A*/ s8 unk_0a; + /*0x0B*/ s8 unk_0b; + /*0x0C*/ u8 unk_0c; + /*0x0D*/ u8 unk_0d; + /*0x0E*/ u8 unk_0e; + /*0x0F*/ u8 unk_0f; + /*0x10*/ s8 unk_10; + /*0x11*/ s8 unk_11; + /*0x12*/ u8 sizeParam; + /*0x13*/ u8 unk_13; + /*0x14*/ u8 unk_14[0x20]; + /*0x34*/ const u8 *titleText; + /*0x38*/ u16 *words; + /*0x3C*/ u16 ecWordBuffer[9]; +}; + +struct Unk203A11C +{ + u16 unk0; + u16 windowId; + u16 unk4; + u8 unk6; + u8 unk7; + s8 unk8; + u8 filler9[0x1]; + u8 unkA; + u8 unkB[0xC1]; + u8 unkCC[0x20C]; + int unk2D8; + int unk2DC; + int unk2E0; + int unk2E4; + int unk2E8; + int unk2EC; + int unk2F0; + int unk2F4; + int unk2F8; + int unk2FC; + u16 unk300[BG_SCREEN_SIZE / 2]; + u16 unkB00[BG_SCREEN_SIZE / 2]; +}; -// Static ROM declarations +struct Unk08597C30 +{ + u8 unk0_0:5; + u8 unk0_5:3; + u8 unk1; + u8 unk2; + u8 unk3; +}; + +EWRAM_DATA struct EasyChatScreen *gEasyChatScreen = NULL; +EWRAM_DATA struct Unk203A11C *gUnknown_0203A11C = 0; +EWRAM_DATA void *gUnknown_0203A120 = 0; static void sub_811A2C0(u8); static void sub_811A278(void); @@ -68,47 +125,185 @@ static bool8 EasyChat_AllocateResources(u8, u16 *, u8); static void EasyChat_FreeResources(void); static u16 sub_811AAAC(void); static u16 sub_811AB68(void); -u16 sub_811ACDC(void); -u16 sub_811AE44(void); -u16 sub_811AF00(void); -u16 sub_811AF8C(void); -u16 sub_811AFEC(void); -u16 sub_811B040(void); -u16 sub_811B08C(void); -u16 sub_811B0BC(void); -u16 sub_811B0E8(void); -u16 sub_811B0F8(void); -u16 sub_811B150(void); +static u16 sub_811ACDC(void); +static u16 sub_811AE44(void); +static u16 sub_811AF00(void); +static u16 sub_811AF8C(void); +static u16 sub_811AFEC(void); +static u16 sub_811B040(void); +static u16 sub_811B08C(void); +static u16 sub_811B0BC(void); +static u16 sub_811B0E8(void); +static u16 sub_811B0F8(void); +static u16 sub_811B150(void); u16 sub_811B1B4(void); u8 sub_811BA68(void); -u8 sub_811BCC8(u8); -void sub_811BDF0(u8 *); +static u8 sub_811BCC8(u8); +static void sub_811BDF0(u8 *); void sub_811BF78(void); -bool8 sub_811BF8C(void); -bool8 sub_811BFA4(void); -void sub_811C13C(void); -/*static*/ void sub_811C158(u16); -/*static*/ bool8 sub_811C170(void); +static bool8 sub_811BF8C(void); +static bool8 sub_811BFA4(void); +static void sub_811C13C(void); +static void sub_811C158(u16); +static bool8 sub_811C170(void); bool8 sub_811F28C(void); void sub_811F2B8(void); u8 sub_811F3AC(void); - -// .rodata +int sub_811BA3C(void); +int sub_811B184(void); +int sub_811B264(void); +static int sub_811B32C(void); +static int sub_811B2B0(void); +static int sub_811B33C(void); +static int sub_811B368(void); +static u16 sub_811B528(int); +static u16 sub_811B794(u32); +static int sub_811B394(void); +static u8 sub_811B2A4(void); +static void sub_811B3E4(void); +static void sub_811BE9C(void); +static int sub_811B4EC(void); +static void sub_811B418(void); +static void sub_811B454(void); +static int sub_811BD64(void); +static int sub_811BDB0(void); +static int sub_811BD2C(void); +int sub_811BCF4(void); +static u16 sub_811B8E8(void); +int sub_811F3B8(u8); +void sub_811F548(int, u16); +static int sub_811B908(void); +u16 sub_811F5B0(void); +static void sub_811B488(u16); +u16 sub_811B940(void); +u16 sub_811F578(u16); +int sub_811BF88(int); +static u16 sub_811B8C8(void); +static int sub_811B568(u32); +static int sub_811B634(u32); +static int sub_811B6C4(u32); +static void sub_811B978(void); +static void sub_811B744(void); +static u8 sub_811B9C8(void); +static void sub_811B768(void); +static u8 sub_811B960(u8); +static void sub_811B9A0(void); +static u8 sub_811BA1C(void); +static int sub_811BF20(void); +static u16 sub_811BF40(void); +static bool8 sub_811CE94(void); +static void sub_811CF64(void); +static void sub_811CF04(void); +static void sub_811D60C(void); +static void sub_811D424(u16 *); +static void sub_811D230(void); +void sub_811E948(void); +static void sub_811CFCC(void); +static void sub_811D0BC(void); +static void sub_811D2C8(void); +static void sub_811D684(void); +void sub_811DE90(void); +void sub_811DEC4(void); +void sub_811DE5C(u8, u8, u8, u8); +void sub_811E5D4(void); +void sub_811E720(void); +void sub_811E828(void); +static bool8 sub_811C2D4(void); +static bool8 sub_811C30C(void); +static bool8 sub_811C3E4(void); +static bool8 sub_811C48C(void); +static bool8 sub_811C404(void); +static bool8 sub_811C448(void); +static bool8 sub_811C4D0(void); +static bool8 sub_811C518(void); +static bool8 sub_811C554(void); +static bool8 sub_811C620(void); +static bool8 sub_811C830(void); +static bool8 sub_811C8F0(void); +static bool8 sub_811C99C(void); +static bool8 sub_811CA5C(void); +static bool8 sub_811C780(void); +static bool8 sub_811C78C(void); +static bool8 sub_811C7D4(void); +static bool8 sub_811CB18(void); +static bool8 sub_811CB98(void); +static bool8 sub_811CB24(void); +static bool8 sub_811CC90(void); +static bool8 sub_811CC08(void); +static bool8 sub_811C6C0(void); +static bool8 sub_811CD14(void); +static bool8 sub_811CD54(void); +static bool8 sub_811CD94(void); +static bool8 sub_811CDD4(void); +static bool8 sub_811CE14(void); +static bool8 sub_811CE54(void); +void sub_811DF60(u8, u8); +int sub_811E920(int); +void sub_811DF90(void); +static void sub_811D104(u8); +static void sub_811D214(u8); +void sub_811DFB0(void); +static void sub_811D6D4(void); +static void sub_811D9CC(int); +void sub_811E3AC(void); +bool8 sub_811E418(void); +void sub_811DFC8(void); +void sub_811E6E0(int); +static bool8 sub_811DAA4(void); +void sub_811E64C(void); +void sub_811E050(void); +void sub_811E4AC(void); +void sub_811E6B0(void); +void sub_811E55C(void); +bool8 sub_811E4D0(void); +bool8 sub_811E5B8(void); +void sub_811E578(void); +void sub_811E088(void); +void sub_811DDAC(s16, u8); +bool8 sub_811DE10(void); +static void sub_811D9B4(void); +static void sub_811D698(u32); +void sub_811E288(void); +void sub_811E794(void); +void sub_811E380(void); +void sub_811E7F8(void); +void sub_811E30C(void); +static void sub_811D7A4(void); +static void sub_811D7C8(void); +int sub_811DE48(void); +static void sub_811D7EC(void); +static void sub_811D830(void); +void sub_811D058(u8, u8, const u8 *, u8, u8, u8, u8, u8, u8); +void sub_811DD84(void); +static void sub_811D6F4(void); +static void sub_811D758(void); +static void sub_811D794(void); +const u8 *sub_811F424(u8); +static void sub_811D864(u8, u8); +static void sub_811D950(u8, u8); +void sub_811DADC(u8); +u8 *CopyEasyChatWordPadded(u8 *, u16, u16); extern const struct { u16 word; MainCallback callback; } gUnknown_08597530[4]; -extern const struct { - u8 unk_00; - u8 unk_01; - u8 unk_02; - u8 unk_03; - u8 *data; - u8 filler_08[16]; -} gUnknown_08597550[]; -// .text +extern const struct EasyChatScreenTemplate gEasyChatScreenTemplates[21]; +extern const u8 gUnknown_08597748[][7]; +extern const u16 gUnknown_08597764[]; +extern const u16 gUnknown_0859776C[][2]; +extern const struct BgTemplate gUnknown_08597C54[4]; +extern const struct WindowTemplate gUnknown_08597C64[]; +extern const u32 gUnknown_08597B54[]; +extern const struct Unk08597C30 gUnknown_08597C30[]; +extern const u16 gUnknown_08597B14[]; +extern const u16 gUnknown_08597B34[]; +extern const u16 gUnknown_08597C1C[]; +extern const u16 gUnknown_08597C24[]; +extern const struct WindowTemplate gUnknown_08597C84; +extern const u8 gUnknown_08597C8C[4]; +extern const u8 *const gUnknown_08597C90[4]; void sub_811A20C(u8 kind, u16 *words, MainCallback callback, u8 sizeParam) { @@ -444,66 +639,66 @@ void sub_811A938(void) static bool8 EasyChat_AllocateResources(u8 kind, u16 *words, u8 sizeParam) { - u8 r6; + u8 templateId; int i; - gUnknown_0203A118 = malloc(sizeof(*gUnknown_0203A118)); - if (gUnknown_0203A118 == NULL) + gEasyChatScreen = malloc(sizeof(*gEasyChatScreen)); + if (gEasyChatScreen == NULL) { return FALSE; } - gUnknown_0203A118->kind = kind; - gUnknown_0203A118->words = words; - gUnknown_0203A118->unk_05 = 0; - gUnknown_0203A118->unk_06 = 0; - gUnknown_0203A118->unk_09 = 0; - gUnknown_0203A118->sizeParam = sizeParam; - gUnknown_0203A118->unk_13 = 0; - r6 = sub_811BCC8(kind); + gEasyChatScreen->kind = kind; + gEasyChatScreen->words = words; + gEasyChatScreen->mainCursorColumn = 0; + gEasyChatScreen->mainCursorRow = 0; + gEasyChatScreen->unk_09 = 0; + gEasyChatScreen->sizeParam = sizeParam; + gEasyChatScreen->unk_13 = 0; + templateId = sub_811BCC8(kind); if (kind == 0x10) { - sub_811BDF0(gUnknown_0203A118->unk_14); - gUnknown_0203A118->src = gUnknown_0203A118->unk_14; - gUnknown_0203A118->unk_04 = 7; + sub_811BDF0(gEasyChatScreen->unk_14); + gEasyChatScreen->titleText = gEasyChatScreen->unk_14; + gEasyChatScreen->state = 7; } else { - gUnknown_0203A118->unk_04 = 0; - gUnknown_0203A118->src = gUnknown_08597550[r6].data; + gEasyChatScreen->state = 0; + gEasyChatScreen->titleText = gEasyChatScreenTemplates[templateId].titleText; } - gUnknown_0203A118->unk_02 = gUnknown_08597550[r6].unk_01; - gUnknown_0203A118->unk_03 = gUnknown_08597550[r6].unk_02; - gUnknown_0203A118->unk_07 = gUnknown_0203A118->unk_02 * gUnknown_0203A118->unk_03; - gUnknown_0203A118->unk_01 = r6; - if (gUnknown_0203A118->unk_07 > 9) + gEasyChatScreen->numColumns = gEasyChatScreenTemplates[templateId].numColumns; + gEasyChatScreen->numRows = gEasyChatScreenTemplates[templateId].numRows; + gEasyChatScreen->unk_07 = gEasyChatScreen->numColumns * gEasyChatScreen->numRows; + gEasyChatScreen->templateId = templateId; + if (gEasyChatScreen->unk_07 > 9) { - gUnknown_0203A118->unk_07 = 9; + gEasyChatScreen->unk_07 = 9; } if (words != NULL) { - CpuCopy16(words, gUnknown_0203A118->ecWordBuffer, gUnknown_0203A118->unk_07 * sizeof(u16)); + CpuCopy16(words, gEasyChatScreen->ecWordBuffer, gEasyChatScreen->unk_07 * sizeof(u16)); } else { - for (i = 0; i < gUnknown_0203A118->unk_07; i ++) + for (i = 0; i < gEasyChatScreen->unk_07; i ++) { - gUnknown_0203A118->ecWordBuffer[i] = -1; + gEasyChatScreen->ecWordBuffer[i] = -1; } - gUnknown_0203A118->words = gUnknown_0203A118->ecWordBuffer; + gEasyChatScreen->words = gEasyChatScreen->ecWordBuffer; } - gUnknown_0203A118->unk_0d = (sub_811F3AC() - 1) / 2 + 1; + gEasyChatScreen->unk_0d = (sub_811F3AC() - 1) / 2 + 1; return TRUE; } static void EasyChat_FreeResources(void) { - if (gUnknown_0203A118 != NULL) - FREE_AND_SET_NULL(gUnknown_0203A118); + if (gEasyChatScreen != NULL) + FREE_AND_SET_NULL(gEasyChatScreen); } static u16 sub_811AAAC(void) { - switch (gUnknown_0203A118->unk_04) + switch (gEasyChatScreen->state) { case 0: return sub_811AB68(); @@ -549,263 +744,3011 @@ static u16 sub_811AB68(void) if (gMain.newKeys & A_BUTTON) { sub_811BF78(); - gUnknown_0203A118->unk_04 = 2; - gUnknown_0203A118->unk_0a = 0; - gUnknown_0203A118->unk_0b = 0; - gUnknown_0203A118->unk_0c = 0; + gEasyChatScreen->state = 2; + gEasyChatScreen->unk_0a = 0; + gEasyChatScreen->unk_0b = 0; + gEasyChatScreen->unk_0c = 0; return 9; } else if (gMain.newKeys & B_BUTTON) - { // FIXME: See note below + { return sub_811B150(); } else if (gMain.newKeys & START_BUTTON) - { // FIXME: See note below + { return sub_811B1B4(); } else if (gMain.newKeys & DPAD_UP) { - gUnknown_0203A118->unk_06--; + gEasyChatScreen->mainCursorRow--; } else if (gMain.newKeys & DPAD_LEFT) - { // FIXME: See note below - gUnknown_0203A118->unk_05--; + { + gEasyChatScreen->mainCursorColumn--; } else if (gMain.newKeys & DPAD_DOWN) - { // FIXME: See note below - gUnknown_0203A118->unk_06++; + { + gEasyChatScreen->mainCursorRow++; } else if (gMain.newKeys & DPAD_RIGHT) - { // FIXME: See note below - gUnknown_0203A118->unk_05++; + { + gEasyChatScreen->mainCursorColumn++; } else { return 0; } - if (gUnknown_0203A118->unk_06 < 0) + + if (gEasyChatScreen->mainCursorRow < 0) + gEasyChatScreen->mainCursorRow = gEasyChatScreenTemplates[gEasyChatScreen->templateId].numRows; + + if (gEasyChatScreen->mainCursorRow > gEasyChatScreenTemplates[gEasyChatScreen->templateId].numRows) + gEasyChatScreen->mainCursorRow = 0; + + if (gEasyChatScreen->mainCursorRow == gEasyChatScreenTemplates[gEasyChatScreen->templateId].numRows) { - gUnknown_0203A118->unk_06 = gUnknown_08597550[gUnknown_0203A118->unk_01].unk_02; + if (gEasyChatScreen->mainCursorColumn > 2) + gEasyChatScreen->mainCursorColumn = 2; + + gEasyChatScreen->state = 1; + return 3; } - if (gUnknown_0203A118->unk_06 > gUnknown_08597550[gUnknown_0203A118->unk_01].unk_02) + + if (gEasyChatScreen->mainCursorColumn < 0) + gEasyChatScreen->mainCursorColumn = gEasyChatScreenTemplates[gEasyChatScreen->templateId].numColumns - 1; + + if (gEasyChatScreen->mainCursorColumn >= gEasyChatScreenTemplates[gEasyChatScreen->templateId].numColumns) + gEasyChatScreen->mainCursorColumn = 0; + + if (sub_811AB44() && gEasyChatScreen->mainCursorColumn == 1 && gEasyChatScreen->mainCursorRow == 4) + gEasyChatScreen->mainCursorColumn = 0; + + return 2; +} +#else +NAKED +static u16 sub_811AB68(void) +{ + asm_unified("\n\ + push {r4-r7,lr}\n\ + ldr r0, =gMain\n\ + ldrh r1, [r0, 0x2E]\n\ + movs r0, 0x1\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + beq _0811ABB8\n\ + bl sub_811BF78\n\ + ldr r1, =gEasyChatScreen\n\ + ldr r3, [r1]\n\ + movs r2, 0\n\ + movs r0, 0x2\n\ + strb r0, [r3, 0x4]\n\ + ldr r0, [r1]\n\ + strb r2, [r0, 0xA]\n\ + ldr r0, [r1]\n\ + strb r2, [r0, 0xB]\n\ + ldr r0, [r1]\n\ + strb r2, [r0, 0xC]\n\ + movs r0, 0x9\n\ + b RETURN\n\ + .pool\n\ +_0811AB9C:\n\ + movs r0, 0x20\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + bne _0811AC68_dpad_left\n\ + movs r0, 0x80\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + bne _0811AC58_dpad_down\n\ + movs r0, 0x10\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + bne _0811AC48_dpad_right\n\ + movs r0, 0\n\ + b RETURN\n\ +_0811ABB8:\n\ + movs r0, 0x2\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + bne _0811AC78_b_button\n\ + movs r0, 0x8\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + bne _0811AC7E_start_button\n\ + movs r0, 0x40\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + beq _0811AB9C\n\ + ldr r2, =gEasyChatScreen\n\ + ldr r1, [r2]\n\ + ldrb r0, [r1, 0x6]\n\ + subs r0, 0x1\n\ +_0811ABD8:\n\ + strb r0, [r1, 0x6]\n\ +_0811ABDA:\n\ + adds r7, r2, 0\n\ + adds r4, r7, 0\n\ + ldr r2, [r4]\n\ + movs r0, 0x6\n\ + ldrsb r0, [r2, r0]\n\ + ldr r6, =gEasyChatScreenTemplates\n\ + cmp r0, 0\n\ + bge _0811ABF8\n\ + ldrb r0, [r2, 0x1]\n\ + lsls r1, r0, 1\n\ + adds r1, r0\n\ + lsls r1, 3\n\ + adds r1, r6\n\ + ldrb r0, [r1, 0x2]\n\ + strb r0, [r2, 0x6]\n\ +_0811ABF8:\n\ + ldr r3, [r4]\n\ + movs r2, 0x6\n\ + ldrsb r2, [r3, r2]\n\ + adds r5, r6, 0\n\ + ldrb r1, [r3, 0x1]\n\ + lsls r0, r1, 1\n\ + adds r0, r1\n\ + lsls r0, 3\n\ + adds r0, r5\n\ + ldrb r0, [r0, 0x2]\n\ + cmp r2, r0\n\ + ble _0811AC14\n\ + movs r0, 0\n\ + strb r0, [r3, 0x6]\n\ +_0811AC14:\n\ + ldr r3, [r4]\n\ + movs r2, 0x6\n\ + ldrsb r2, [r3, r2]\n\ + ldrb r1, [r3, 0x1]\n\ + lsls r0, r1, 1\n\ + adds r0, r1\n\ + lsls r0, 3\n\ + adds r1, r0, r5\n\ + ldrb r0, [r1, 0x2]\n\ + cmp r2, r0\n\ + bne _0811AC88\n\ + movs r0, 0x5\n\ + ldrsb r0, [r3, r0]\n\ + cmp r0, 0x2\n\ + ble _0811AC36\n\ + movs r0, 0x2\n\ + strb r0, [r3, 0x5]\n\ +_0811AC36:\n\ + ldr r1, [r4]\n\ + movs r0, 0x1\n\ + strb r0, [r1, 0x4]\n\ + movs r0, 0x3\n\ + b RETURN\n\ + .pool\n\ +_0811AC48_dpad_right:\n\ + ldr r2, =gEasyChatScreen\n\ + ldr r1, [r2]\n\ + ldrb r0, [r1, 0x5]\n\ + adds r0, 0x1\n\ + strb r0, [r1, 0x5]\n\ + b _0811ABDA\n\ + .pool\n\ +_0811AC58_dpad_down:\n\ + ldr r2, =gEasyChatScreen\n\ + ldr r1, [r2]\n\ + ldrb r0, [r1, 0x6]\n\ + adds r0, 0x1\n\ + b _0811ABD8\n\ + .pool\n\ +_0811AC68_dpad_left:\n\ + ldr r2, =gEasyChatScreen\n\ + ldr r1, [r2]\n\ + ldrb r0, [r1, 0x5]\n\ + subs r0, 0x1\n\ + strb r0, [r1, 0x5]\n\ + b _0811ABDA\n\ + .pool\n\ +_0811AC78_b_button:\n\ + bl sub_811B150\n\ + b _0811AC82\n\ +_0811AC7E_start_button:\n\ + bl sub_811B1B4\n\ +_0811AC82:\n\ + lsls r0, 16\n\ + lsrs r0, 16\n\ + b RETURN\n\ +_0811AC88:\n\ + movs r0, 0x5\n\ + ldrsb r0, [r3, r0]\n\ + cmp r0, 0\n\ + bge _0811AC96\n\ + ldrb r0, [r1, 0x1]\n\ + subs r0, 0x1\n\ + strb r0, [r3, 0x5]\n\ +_0811AC96:\n\ + ldr r3, [r4]\n\ + movs r2, 0x5\n\ + ldrsb r2, [r3, r2]\n\ + ldrb r1, [r3, 0x1]\n\ + lsls r0, r1, 1\n\ + adds r0, r1\n\ + lsls r0, 3\n\ + adds r0, r6\n\ + ldrb r0, [r0, 0x1]\n\ + cmp r2, r0\n\ + blt _0811ACB0\n\ + movs r0, 0\n\ + strb r0, [r3, 0x5]\n\ +_0811ACB0:\n\ + bl sub_811AB44\n\ + cmp r0, 0\n\ + beq _0811ACCA\n\ + ldr r2, [r7]\n\ + ldr r0, [r2, 0x4]\n\ + ldr r1, =0x00ffff00\n\ + ands r0, r1\n\ + ldr r1, =0x00040100\n\ + cmp r0, r1\n\ + bne _0811ACCA\n\ + movs r0, 0\n\ + strb r0, [r2, 0x5]\n\ +_0811ACCA:\n\ + movs r0, 0x2\n\ +RETURN:\n\ + pop {r4-r7}\n\ + pop {r1}\n\ + bx r1\n\ + .pool"); +} +#endif // NONMATCHING + +#ifdef NONMATCHING +static u16 sub_811ACDC(void) +{ + int numFooterColumns; + + if (gMain.newKeys & A_BUTTON) + { + switch (gEasyChatScreen->mainCursorColumn) + { + case 0: + return sub_811B184(); + case 1: + return sub_811B150(); + case 2: + return sub_811B1B4(); + case 3: + return sub_811B264(); + } + } + + if (gMain.newKeys & B_BUTTON) + return sub_811B150(); + else if (gMain.newKeys & START_BUTTON) + return sub_811B1B4(); + else if (gMain.newKeys & DPAD_UP) + gEasyChatScreen->mainCursorRow--; + else if (gMain.newKeys & DPAD_LEFT) + gEasyChatScreen->mainCursorColumn--; + else if (gMain.newKeys & DPAD_DOWN) + gEasyChatScreen->mainCursorRow = 0; + else if (gMain.newKeys & DPAD_RIGHT) + gEasyChatScreen->mainCursorColumn++; + else + return 0; + + if (gEasyChatScreen->mainCursorRow == gEasyChatScreenTemplates[gEasyChatScreen->templateId].numRows) { - gUnknown_0203A118->unk_06 = 0; + numFooterColumns = sub_811BA3C() ? 4 : 3; + if (gEasyChatScreen->mainCursorColumn < 0) + gEasyChatScreen->mainCursorColumn = numFooterColumns - 1; + + if (gEasyChatScreen->mainCursorColumn >= numFooterColumns) + gEasyChatScreen->mainCursorColumn = 0; + + return 3; } - if (gUnknown_0203A118->unk_06 == gUnknown_08597550[gUnknown_0203A118->unk_01].unk_02) + + if (gEasyChatScreen->mainCursorColumn >= gEasyChatScreenTemplates[gEasyChatScreen->templateId].numColumns) + gEasyChatScreen->mainCursorColumn = gEasyChatScreenTemplates[gEasyChatScreen->templateId].numColumns - 1; + + if (sub_811AB44() && gEasyChatScreen->mainCursorColumn == 1 && gEasyChatScreen->mainCursorRow == 4) + gEasyChatScreen->mainCursorColumn = 0; + + gEasyChatScreen->state = 0; + return 2; +} +#else +NAKED +static u16 sub_811ACDC(void) +{ + asm_unified("\n\ + push {r4-r6,lr}\n\ + ldr r2, =gMain\n\ + ldrh r1, [r2, 0x2E]\n\ + movs r0, 0x1\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + beq _0811AD4A\n\ + ldr r0, =gEasyChatScreen\n\ + ldr r0, [r0]\n\ + ldrb r0, [r0, 0x5]\n\ + lsls r0, 24\n\ + asrs r0, 24\n\ + cmp r0, 0x1\n\ + beq _0811AD3E\n\ + b _0811AD24\n\ + .pool\n\ +_0811AD04:\n\ + movs r0, 0x20\n\ + ands r0, r2\n\ + lsls r0, 16\n\ + lsrs r3, r0, 16\n\ + cmp r3, 0\n\ + bne _0811ADE0\n\ + movs r0, 0x80\n\ + ands r0, r2\n\ + cmp r0, 0\n\ + bne _0811ADD0\n\ + movs r0, 0x10\n\ + ands r0, r2\n\ + cmp r0, 0\n\ + bne _0811ADC0\n\ + movs r0, 0\n\ + b _0811AE32\n\ +_0811AD24:\n\ + cmp r0, 0x1\n\ + bgt _0811AD2E\n\ + cmp r0, 0\n\ + beq _0811AD38\n\ + b _0811AD4A\n\ +_0811AD2E:\n\ + cmp r0, 0x2\n\ + beq _0811ADF6\n\ + cmp r0, 0x3\n\ + beq _0811AD44\n\ + b _0811AD4A\n\ +_0811AD38:\n\ + bl sub_811B184\n\ + b _0811ADFA\n\ +_0811AD3E:\n\ + bl sub_811B150\n\ + b _0811ADFA\n\ +_0811AD44:\n\ + bl sub_811B264\n\ + b _0811ADFA\n\ +_0811AD4A:\n\ + ldrh r2, [r2, 0x2E]\n\ + movs r0, 0x2\n\ + ands r0, r2\n\ + cmp r0, 0\n\ + bne _0811ADF0\n\ + movs r0, 0x8\n\ + ands r0, r2\n\ + cmp r0, 0\n\ + bne _0811ADF6\n\ + movs r0, 0x40\n\ + ands r0, r2\n\ + cmp r0, 0\n\ + beq _0811AD04\n\ + ldr r2, =gEasyChatScreen\n\ + ldr r1, [r2]\n\ + ldrb r0, [r1, 0x6]\n\ + subs r0, 0x1\n\ + strb r0, [r1, 0x6]\n\ +_0811AD6E:\n\ + adds r6, r2, 0\n\ +_0811AD70:\n\ + adds r5, r6, 0\n\ + ldr r4, [r5]\n\ + movs r3, 0x6\n\ + ldrsb r3, [r4, r3]\n\ + ldr r2, =gEasyChatScreenTemplates\n\ + ldrb r1, [r4, 0x1]\n\ + lsls r0, r1, 1\n\ + adds r0, r1\n\ + lsls r0, 3\n\ + adds r1, r0, r2\n\ + ldrb r0, [r1, 0x2]\n\ + cmp r3, r0\n\ + bne _0811AE00\n\ + bl sub_811BA3C\n\ + movs r2, 0x3\n\ + cmp r0, 0\n\ + beq _0811AD96\n\ + movs r2, 0x4\n\ +_0811AD96:\n\ + ldr r1, [r5]\n\ + movs r0, 0x5\n\ + ldrsb r0, [r1, r0]\n\ + cmp r0, 0\n\ + bge _0811ADA4\n\ + subs r0, r2, 0x1\n\ + strb r0, [r1, 0x5]\n\ +_0811ADA4:\n\ + ldr r1, [r5]\n\ + movs r0, 0x5\n\ + ldrsb r0, [r1, r0]\n\ + cmp r0, r2\n\ + blt _0811ADB2\n\ + movs r0, 0\n\ + strb r0, [r1, 0x5]\n\ +_0811ADB2:\n\ + movs r0, 0x3\n\ + b _0811AE32\n\ + .pool\n\ +_0811ADC0:\n\ + ldr r2, =gEasyChatScreen\n\ + ldr r1, [r2]\n\ + ldrb r0, [r1, 0x5]\n\ + adds r0, 0x1\n\ + strb r0, [r1, 0x5]\n\ + b _0811AD6E\n\ + .pool\n\ +_0811ADD0:\n\ + ldr r1, =gEasyChatScreen\n\ + ldr r0, [r1]\n\ + strb r3, [r0, 0x6]\n\ + adds r6, r1, 0\n\ + b _0811AD70\n\ + .pool\n\ +_0811ADE0:\n\ + ldr r2, =gEasyChatScreen\n\ + ldr r1, [r2]\n\ + ldrb r0, [r1, 0x5]\n\ + subs r0, 0x1\n\ + strb r0, [r1, 0x5]\n\ + b _0811AD6E\n\ + .pool\n\ +_0811ADF0:\n\ + bl sub_811B150\n\ + b _0811ADFA\n\ +_0811ADF6:\n\ + bl sub_811B1B4\n\ +_0811ADFA:\n\ + lsls r0, 16\n\ + lsrs r0, 16\n\ + b _0811AE32\n\ +_0811AE00:\n\ + movs r0, 0x5\n\ + ldrsb r0, [r4, r0]\n\ + ldrb r1, [r1, 0x1]\n\ + cmp r0, r1\n\ + blt _0811AE0E\n\ + subs r0, r1, 0x1\n\ + strb r0, [r4, 0x5]\n\ +_0811AE0E:\n\ + bl sub_811AB44\n\ + cmp r0, 0\n\ + beq _0811AE28\n\ + ldr r2, [r6]\n\ + ldr r0, [r2, 0x4]\n\ + ldr r1, =0x00ffff00\n\ + ands r0, r1\n\ + ldr r1, =0x00040100\n\ + cmp r0, r1\n\ + bne _0811AE28\n\ + movs r0, 0\n\ + strb r0, [r2, 0x5]\n\ +_0811AE28:\n\ + ldr r0, =gEasyChatScreen\n\ + ldr r1, [r0]\n\ + movs r0, 0\n\ + strb r0, [r1, 0x4]\n\ + movs r0, 0x2\n\ +_0811AE32:\n\ + pop {r4-r6}\n\ + pop {r1}\n\ + bx r1\n\ + .pool"); +} +#endif // NONMATCHING + +static u16 sub_811AE44(void) +{ + if (gMain.newKeys & B_BUTTON) + return sub_811B32C(); + + if (gMain.newKeys & A_BUTTON) { - if (gUnknown_0203A118->unk_05 > 2) + if (gEasyChatScreen->unk_0a != -1) + return sub_811B2B0(); + + switch (gEasyChatScreen->unk_0b) { - gUnknown_0203A118->unk_05 = 2; + case 0: + return sub_811B33C(); + case 1: + return sub_811B368(); + case 2: + return sub_811B32C(); } - gUnknown_0203A118->unk_04 = 1; - return 3; } - /* - * FIXME: right, down, left, b, and start - * should be inserted here, but aren't - */ - if (gUnknown_0203A118->unk_05 < 0) + + if (gMain.newKeys & SELECT_BUTTON) + return sub_811B33C(); + + if (gMain.newAndRepeatedKeys & DPAD_UP) + return sub_811B528(2); + + if (gMain.newAndRepeatedKeys & DPAD_DOWN) + return sub_811B528(3); + + if (gMain.newAndRepeatedKeys & DPAD_LEFT) + return sub_811B528(1); + + if (gMain.newAndRepeatedKeys & DPAD_RIGHT) + return sub_811B528(0); + + return 0; +} + +static u16 sub_811AF00(void) +{ + if (gMain.newKeys & B_BUTTON) { - gUnknown_0203A118->unk_05 = gUnknown_08597550[gUnknown_0203A118->unk_01].unk_01 - 1; + gEasyChatScreen->state = 2; + return 14; } - if (gUnknown_0203A118->unk_05 >= gUnknown_08597550[gUnknown_0203A118->unk_01].unk_01) + + if (gMain.newKeys & A_BUTTON) + return sub_811B394(); + + if (gMain.newKeys & START_BUTTON) + return sub_811B794(4); + + if (gMain.newKeys & SELECT_BUTTON) + return sub_811B794(5); + + if (gMain.newAndRepeatedKeys & DPAD_UP) + return sub_811B794(2); + + if (gMain.newAndRepeatedKeys & DPAD_DOWN) + return sub_811B794(3); + + if (gMain.newAndRepeatedKeys & DPAD_LEFT) + return sub_811B794(1); + + if (gMain.newAndRepeatedKeys & DPAD_RIGHT) + return sub_811B794(0); + + return 0; +} + +static u16 sub_811AF8C(void) +{ + u8 var0; + + switch (Menu_ProcessInputNoWrapClearOnChoose()) { - gUnknown_0203A118->unk_05 = 0; + case MENU_B_PRESSED: // B Button + case 1: // No + gEasyChatScreen->state = sub_811B2A4(); + return 7; + case 0: // Yes + gSpecialVar_Result = 0; + var0 = gEasyChatScreen->kind - 17; + if (var0 < 2) + sub_811B3E4(); + + return 24; + default: + return 0; } - if (sub_811AB44() && gUnknown_0203A118->unk_05 == 1 && gUnknown_0203A118->unk_06 == 4) +} + +static u16 sub_811AFEC(void) +{ + switch (Menu_ProcessInputNoWrapClearOnChoose()) { - gUnknown_0203A118->unk_05 = 0; + case MENU_B_PRESSED: // B Button + case 1: // No + gEasyChatScreen->state = sub_811B2A4(); + return 7; + case 0: // Yes + sub_811BE9C(); + gSpecialVar_Result = sub_811B4EC(); + sub_811B3E4(); + return 24; + default: + return 0; } - return 2; } -#else -__attribute__((naked)) static u16 sub_811AB68(void) -{ - asm_unified("\tpush {r4-r7,lr}\n" - "\tldr r0, =gMain\n" - "\tldrh r1, [r0, 0x2E]\n" - "\tmovs r0, 0x1\n" - "\tands r0, r1\n" - "\tcmp r0, 0\n" - "\tbeq _0811ABB8\n" - "\tbl sub_811BF78\n" - "\tldr r1, =gUnknown_0203A118\n" - "\tldr r3, [r1]\n" - "\tmovs r2, 0\n" - "\tmovs r0, 0x2\n" - "\tstrb r0, [r3, 0x4]\n" - "\tldr r0, [r1]\n" - "\tstrb r2, [r0, 0xA]\n" - "\tldr r0, [r1]\n" - "\tstrb r2, [r0, 0xB]\n" - "\tldr r0, [r1]\n" - "\tstrb r2, [r0, 0xC]\n" - "\tmovs r0, 0x9\n" - "\tb _0811ACCC_return_r0\n" - "\t.pool\n" - "_0811AB9C:\n" - "\tmovs r0, 0x20\n" - "\tands r0, r1\n" - "\tcmp r0, 0\n" - "\tbne _0811AC68_dpad_left\n" - "\tmovs r0, 0x80\n" - "\tands r0, r1\n" - "\tcmp r0, 0\n" - "\tbne _0811AC58_dpad_down\n" - "\tmovs r0, 0x10\n" - "\tands r0, r1\n" - "\tcmp r0, 0\n" - "\tbne _0811AC48_dpad_right\n" - "\tmovs r0, 0\n" - "\tb _0811ACCC_return_r0\n" - "_0811ABB8:\n" - "\tmovs r0, 0x2\n" - "\tands r0, r1\n" - "\tcmp r0, 0\n" - "\tbne _0811AC78_b_button\n" - "\tmovs r0, 0x8\n" - "\tands r0, r1\n" - "\tcmp r0, 0\n" - "\tbne _0811AC7E_start_button\n" - "\tmovs r0, 0x40\n" - "\tands r0, r1\n" - "\tcmp r0, 0\n" - "\tbeq _0811AB9C\n" - "\tldr r2, =gUnknown_0203A118\n" - "\tldr r1, [r2]\n" - "\tldrb r0, [r1, 0x6]\n" - "\tsubs r0, 0x1\n" - "_0811ABD8:\n" - "\tstrb r0, [r1, 0x6]\n" - "_0811ABDA:\n" - "\tadds r7, r2, 0\n" - "\tadds r4, r7, 0\n" - "\tldr r2, [r4]\n" - "\tmovs r0, 0x6\n" - "\tldrsb r0, [r2, r0]\n" - "\tldr r6, =gUnknown_08597550\n" - "\tcmp r0, 0\n" - "\tbge _0811ABF8\n" - "\tldrb r0, [r2, 0x1]\n" - "\tlsls r1, r0, 1\n" - "\tadds r1, r0\n" - "\tlsls r1, 3\n" - "\tadds r1, r6\n" - "\tldrb r0, [r1, 0x2]\n" - "\tstrb r0, [r2, 0x6]\n" - "_0811ABF8:\n" - "\tldr r3, [r4]\n" - "\tmovs r2, 0x6\n" - "\tldrsb r2, [r3, r2]\n" - "\tadds r5, r6, 0\n" - "\tldrb r1, [r3, 0x1]\n" - "\tlsls r0, r1, 1\n" - "\tadds r0, r1\n" - "\tlsls r0, 3\n" - "\tadds r0, r5\n" - "\tldrb r0, [r0, 0x2]\n" - "\tcmp r2, r0\n" - "\tble _0811AC14\n" - "\tmovs r0, 0\n" - "\tstrb r0, [r3, 0x6]\n" - "_0811AC14:\n" - "\tldr r3, [r4]\n" - "\tmovs r2, 0x6\n" - "\tldrsb r2, [r3, r2]\n" - "\tldrb r1, [r3, 0x1]\n" - "\tlsls r0, r1, 1\n" - "\tadds r0, r1\n" - "\tlsls r0, 3\n" - "\tadds r1, r0, r5\n" - "\tldrb r0, [r1, 0x2]\n" - "\tcmp r2, r0\n" - "\tbne _0811AC88\n" - "\tmovs r0, 0x5\n" - "\tldrsb r0, [r3, r0]\n" - "\tcmp r0, 0x2\n" - "\tble _0811AC36\n" - "\tmovs r0, 0x2\n" - "\tstrb r0, [r3, 0x5]\n" - "_0811AC36:\n" - "\tldr r1, [r4]\n" - "\tmovs r0, 0x1\n" - "\tstrb r0, [r1, 0x4]\n" - "\tmovs r0, 0x3\n" - "\tb _0811ACCC_return_r0\n" - "\t.pool\n" - "_0811AC48_dpad_right:\n" - "\tldr r2, =gUnknown_0203A118\n" - "\tldr r1, [r2]\n" - "\tldrb r0, [r1, 0x5]\n" - "\tadds r0, 0x1\n" - "\tstrb r0, [r1, 0x5]\n" - "\tb _0811ABDA\n" - "\t.pool\n" - "_0811AC58_dpad_down:\n" - "\tldr r2, =gUnknown_0203A118\n" - "\tldr r1, [r2]\n" - "\tldrb r0, [r1, 0x6]\n" - "\tadds r0, 0x1\n" - "\tb _0811ABD8\n" - "\t.pool\n" - "_0811AC68_dpad_left:\n" - "\tldr r2, =gUnknown_0203A118\n" - "\tldr r1, [r2]\n" - "\tldrb r0, [r1, 0x5]\n" - "\tsubs r0, 0x1\n" - "\tstrb r0, [r1, 0x5]\n" - "\tb _0811ABDA\n" - "\t.pool\n" - "_0811AC78_b_button:\n" - "\tbl sub_811B150\n" - "\tb _0811AC82\n" - "_0811AC7E_start_button:\n" - "\tbl sub_811B1B4\n" - "_0811AC82:\n" - "\tlsls r0, 16\n" - "\tlsrs r0, 16\n" - "\tb _0811ACCC_return_r0\n" - "_0811AC88:\n" - "\tmovs r0, 0x5\n" - "\tldrsb r0, [r3, r0]\n" - "\tcmp r0, 0\n" - "\tbge _0811AC96\n" - "\tldrb r0, [r1, 0x1]\n" - "\tsubs r0, 0x1\n" - "\tstrb r0, [r3, 0x5]\n" - "_0811AC96:\n" - "\tldr r3, [r4]\n" - "\tmovs r2, 0x5\n" - "\tldrsb r2, [r3, r2]\n" - "\tldrb r1, [r3, 0x1]\n" - "\tlsls r0, r1, 1\n" - "\tadds r0, r1\n" - "\tlsls r0, 3\n" - "\tadds r0, r6\n" - "\tldrb r0, [r0, 0x1]\n" - "\tcmp r2, r0\n" - "\tblt _0811ACB0\n" - "\tmovs r0, 0\n" - "\tstrb r0, [r3, 0x5]\n" - "_0811ACB0:\n" - "\tbl sub_811AB44\n" - "\tcmp r0, 0\n" - "\tbeq _0811ACCA\n" - "\tldr r2, [r7]\n" - "\tldr r0, [r2, 0x4]\n" - "\tldr r1, =0x00ffff00\n" - "\tands r0, r1\n" - "\tldr r1, =0x00040100\n" - "\tcmp r0, r1\n" - "\tbne _0811ACCA\n" - "\tmovs r0, 0\n" - "\tstrb r0, [r2, 0x5]\n" - "_0811ACCA:\n" - "\tmovs r0, 0x2\n" - "_0811ACCC_return_r0:\n" - "\tpop {r4-r7}\n" - "\tpop {r1}\n" - "\tbx r1\n" - "\t.pool"); -} -#endif + +static u16 sub_811B040(void) +{ + switch (Menu_ProcessInputNoWrapClearOnChoose()) + { + case MENU_B_PRESSED: // B Button + case 1: // No + gEasyChatScreen->state = 1; + return 7; + case 0: // Yes + sub_811B418(); + gEasyChatScreen->state = 1; + return 8; + default: + return 0; + } +} + +static u16 sub_811B08C(void) +{ + if (gMain.newKeys & A_BUTTON) + return 26; + + if (gMain.newKeys & B_BUTTON) + return sub_811B150(); + + return 0; +} + +static u16 sub_811B0BC(void) +{ + if (gMain.newKeys & (A_BUTTON | B_BUTTON)) + { + gEasyChatScreen->state = sub_811B2A4(); + return 7; + } + + return 0; +} + +static u16 sub_811B0E8(void) +{ + gEasyChatScreen->state = 10; + return 6; +} + +static u16 sub_811B0F8(void) +{ + switch (Menu_ProcessInputNoWrapClearOnChoose()) + { + case MENU_B_PRESSED: // B Button + case 1: // No + sub_811B454(); + gEasyChatScreen->unk_08 = 0; + gEasyChatScreen->state = 8; + return 31; + case 0: // Yes + gSpecialVar_Result = sub_811B4EC(); + sub_811B3E4(); + return 24; + default: + return 0; + } +} + +static u16 sub_811B150(void) +{ + if (gEasyChatScreen->kind == 19 || gEasyChatScreen->kind == 11) + { + gEasyChatScreen->unk_08 = gEasyChatScreen->state; + gEasyChatScreen->state = 8; + return 34; + } + else + { + gEasyChatScreen->unk_08 = gEasyChatScreen->state; + gEasyChatScreen->state = 4; + return 5; + } +} + +int sub_811B184(void) +{ + gEasyChatScreen->unk_08 = gEasyChatScreen->state; + if (gEasyChatScreen->kind != 6) + { + gEasyChatScreen->state = 5; + return 4; + } + else + { + gEasyChatScreen->unk_08 = gEasyChatScreen->state; + gEasyChatScreen->state = 8; + return 32; + } +} + +u16 sub_811B1B4(void) +{ + gEasyChatScreen->unk_08 = gEasyChatScreen->state; + if (gEasyChatScreen->kind == 17) + { + if (sub_811BD64()) + { + gEasyChatScreen->state = 8; + return 29; + } + + if (sub_811BDB0()) + { + gEasyChatScreen->state = 8; + return 30; + } + + gEasyChatScreen->state = 6; + return 6; + } + else if (gEasyChatScreen->kind == 18) + { + if (sub_811BDB0()) + { + gEasyChatScreen->state = 8; + return 30; + } + + if (sub_811BD64()) + { + gEasyChatScreen->state = 8; + return 29; + } + + gEasyChatScreen->state = 6; + return 6; + } + else if (gEasyChatScreen->kind == 9 || gEasyChatScreen->kind == 13) + { + if (!sub_811BD2C()) + { + gEasyChatScreen->state = 8; + return 33; + } + + gEasyChatScreen->state = 6; + return 6; + } + else if (gEasyChatScreen->kind == 19 || gEasyChatScreen->kind == 11) + { + if (sub_811BCF4()) + { + gEasyChatScreen->state = 8; + return 34; + } + + gEasyChatScreen->state = 6; + return 6; + } + else if (gEasyChatScreen->kind == 20) + { + gEasyChatScreen->state = 6; + return 6; + } + else + { + if (sub_811BCF4() == 1 || !sub_811B4EC()) + { + gEasyChatScreen->state = 4; + return 5; + } + + gEasyChatScreen->state = 6; + return 6; + } +} + +int sub_811B264(void) +{ + gEasyChatScreen->unk_08 = gEasyChatScreen->state; + switch (gEasyChatScreen->kind) + { + case 15: + return 25; + case 17: + sub_811B3E4(); + return 28; + case 18: + sub_811B3E4(); + return 27; + default: + return 0; + } +} + +static u8 sub_811B2A4(void) +{ + return gEasyChatScreen->unk_08; +} + +static int sub_811B2B0(void) +{ + u16 var1; + + if (gEasyChatScreen->unk_09 == 0) + { + u8 var0 = sub_811F3B8(sub_811B8E8()); + sub_811F548(0, var0); + } + else + { + sub_811F548(1, sub_811B908()); + } + + var1 = sub_811F5B0(); + if (var1 == 0) + return 0; + + gEasyChatScreen->unk_0f = (var1 - 1) / 2; + gEasyChatScreen->unk_0e = 0; + gEasyChatScreen->unk_10 = 0; + gEasyChatScreen->unk_11 = 0; + gEasyChatScreen->state = 3; + return 11; +} + +static int sub_811B32C(void) +{ + gEasyChatScreen->state = 0; + return 10; +} + +static int sub_811B33C(void) +{ + gEasyChatScreen->unk_0a = 0; + gEasyChatScreen->unk_0b = 0; + gEasyChatScreen->unk_0c = 0; + if (!gEasyChatScreen->unk_09) + gEasyChatScreen->unk_09 = 1; + else + gEasyChatScreen->unk_09 = 0; + + return 23; +} + +static int sub_811B368(void) +{ + if (gEasyChatScreen->kind == 6) + { + PlaySE(SE_HAZURE); + return 0; + } + else + { + sub_811B488(0xFFFF); + return 1; + } +} + +static int sub_811B394(void) +{ + u16 easyChatWord = sub_811F578(sub_811B940()); + if (sub_811BF88(easyChatWord)) + { + PlaySE(SE_HAZURE); + return 0; + } + else + { + sub_811B488(easyChatWord); + if (gEasyChatScreen->kind != 6) + { + gEasyChatScreen->state = 0; + return 12; + } + else + { + gEasyChatScreen->state = 9; + return 13; + } + } +} + +static void sub_811B3E4(void) +{ + int i; + for (i = 0; i < gEasyChatScreen->unk_07; i++) + gEasyChatScreen->words[i] = gEasyChatScreen->ecWordBuffer[i]; +} + +static void sub_811B418(void) +{ + int i; + for (i = 0; i < gEasyChatScreen->unk_07; i++) + gEasyChatScreen->ecWordBuffer[i] = 0xFFFF; +} + +static void sub_811B454(void) +{ + int i; + for (i = 0; i < gEasyChatScreen->unk_07; i++) + gEasyChatScreen->ecWordBuffer[i] = gEasyChatScreen->words[i]; +} + +static void sub_811B488(u16 easyChatWord) +{ + u16 index = sub_811B8C8(); + gEasyChatScreen->ecWordBuffer[index] = easyChatWord; +} + +static u8 sub_811B4AC(void) +{ + u16 i; + for (i = 0; i < gEasyChatScreen->unk_07; i++) + { + if (gEasyChatScreen->ecWordBuffer[i] != gEasyChatScreen->words[i]) + return 1; + } + + return 0; +} + +static int sub_811B4EC(void) +{ + u8 var0 = gEasyChatScreen->kind - 17; + if (var0 < 2) + { + if (sub_811BD64()) + return 0; + + if (sub_811BDB0()) + return 0; + + return 1; + } + else + { + return sub_811B4AC(); + } +} + +static u16 sub_811B528(int arg0) +{ + if (gEasyChatScreen->unk_0a != -1) + { + if (gEasyChatScreen->unk_09 == 0) + return sub_811B568(arg0); + else + return sub_811B634(arg0); + } + else + { + return sub_811B6C4(arg0); + } +} + +static int sub_811B568(u32 arg0) +{ + switch (arg0) + { + case 2: + if (gEasyChatScreen->unk_0b != -gEasyChatScreen->unk_0c) + { + if (gEasyChatScreen->unk_0b) + { + gEasyChatScreen->unk_0b--; + return 15; + } + else + { + gEasyChatScreen->unk_0c--; + return 17; + } + } + break; + case 3: + if (gEasyChatScreen->unk_0b + gEasyChatScreen->unk_0c < gEasyChatScreen->unk_0d - 1) + { + int var0; + if (gEasyChatScreen->unk_0b < 3) + { + gEasyChatScreen->unk_0b++; + var0 = 15; + } + else + { + gEasyChatScreen->unk_0c++; + var0 = 16; + } + + sub_811B978(); + return var0; + } + break; + case 1: + if (gEasyChatScreen->unk_0a) + gEasyChatScreen->unk_0a--; + else + sub_811B744(); + + return 15; + case 0: + if (gEasyChatScreen->unk_0a < 1) + { + gEasyChatScreen->unk_0a++; + if (sub_811B9C8()) + sub_811B744(); + } + else + { + sub_811B744(); + } + return 15; + } + + return 0; +} + +static int sub_811B634(u32 arg0) +{ + switch (arg0) + { + case 2: + if (gEasyChatScreen->unk_0b > 0) + gEasyChatScreen->unk_0b--; + else + gEasyChatScreen->unk_0b = 3; + + sub_811B978(); + return 15; + case 3: + if (gEasyChatScreen->unk_0b < 3) + gEasyChatScreen->unk_0b++; + else + gEasyChatScreen->unk_0b = 0; + + sub_811B978(); + return 15; + case 0: + gEasyChatScreen->unk_0a++; + if (sub_811B9C8()) + sub_811B744(); + + return 15; + case 1: + gEasyChatScreen->unk_0a--; + if (gEasyChatScreen->unk_0a < 0) + sub_811B744(); + + return 15; + } + + return 0; +} + +static int sub_811B6C4(u32 arg0) +{ + switch (arg0) + { + case 2: + if (gEasyChatScreen->unk_0b) + gEasyChatScreen->unk_0b--; + else + gEasyChatScreen->unk_0b = 2; + + return 15; + case 3: + if (gEasyChatScreen->unk_0b < 2) + gEasyChatScreen->unk_0b++; + else + gEasyChatScreen->unk_0b = 0; + + return 15; + case 1: + gEasyChatScreen->unk_0b++; + sub_811B768(); + return 15; + case 0: + gEasyChatScreen->unk_0a = 0; + gEasyChatScreen->unk_0b++; + return 15; + } + + return 0; +} + +static void sub_811B744(void) +{ + gEasyChatScreen->unk_0a = 0xFF; + if (gEasyChatScreen->unk_0b) + gEasyChatScreen->unk_0b--; +} + +static void sub_811B768(void) +{ + if (gEasyChatScreen->unk_09 == 0) + { + gEasyChatScreen->unk_0a = 1; + sub_811B978(); + } + else + { + gEasyChatScreen->unk_0a = sub_811B960(gEasyChatScreen->unk_0b); + } +} + +static u16 sub_811B794(u32 arg0) +{ + u16 result; + switch (arg0) + { + case 2: + if (gEasyChatScreen->unk_11 + gEasyChatScreen->unk_0e > 0) + { + if (gEasyChatScreen->unk_11 > 0) + { + gEasyChatScreen->unk_11--; + result = 18; + } + else + { + gEasyChatScreen->unk_0e--; + result = 19; + } + + sub_811B9A0(); + return result; + } + break; + case 3: + if (gEasyChatScreen->unk_11 + gEasyChatScreen->unk_0e < gEasyChatScreen->unk_0f) + { + if (gEasyChatScreen->unk_11 < 3) + { + gEasyChatScreen->unk_11++; + result = 18; + } + else + { + gEasyChatScreen->unk_0e++; + result = 20; + } + + sub_811B9A0(); + return result; + } + break; + case 1: + if (gEasyChatScreen->unk_10 > 0) + gEasyChatScreen->unk_10--; + else + gEasyChatScreen->unk_10 = 1; + + sub_811B9A0(); + return 18; + case 0: + if (gEasyChatScreen->unk_10 < 1) + { + gEasyChatScreen->unk_10++; + if (sub_811BA1C()) + gEasyChatScreen->unk_10 = 0; + } + else + { + gEasyChatScreen->unk_10 = 0; + } + return 18; + case 4: + if (gEasyChatScreen->unk_0e) + { + if (gEasyChatScreen->unk_0e > 3) + gEasyChatScreen->unk_0e -= 4; + else + gEasyChatScreen->unk_0e = 0; + + return 21; + } + break; + case 5: + if (gEasyChatScreen->unk_0e <= gEasyChatScreen->unk_0f - 4) + { + gEasyChatScreen->unk_0e += 4; + if (gEasyChatScreen->unk_0e > gEasyChatScreen->unk_0f - 3) + gEasyChatScreen->unk_0e = gEasyChatScreen->unk_0f + 0xFD; + + sub_811B9A0(); + return 22; + } + break; + } + + return 0; +} + +static u16 sub_811B8C8(void) +{ + return (gEasyChatScreen->mainCursorRow * gEasyChatScreen->numColumns) + gEasyChatScreen->mainCursorColumn; +} + +static u16 sub_811B8E8(void) +{ + return 2 * (gEasyChatScreen->unk_0b + gEasyChatScreen->unk_0c) + gEasyChatScreen->unk_0a; +} + +static int sub_811B908(void) +{ + int var0 = (u8)gEasyChatScreen->unk_0a < 7 ? gEasyChatScreen->unk_0a : 0; + int var1 = (u8)gEasyChatScreen->unk_0b < 4 ? gEasyChatScreen->unk_0b : 0; + return gUnknown_08597748[var1][var0]; +} + +u16 sub_811B940(void) +{ + return 2 * (gEasyChatScreen->unk_11 + gEasyChatScreen->unk_0e) + gEasyChatScreen->unk_10; +} + +static u8 sub_811B960(u8 arg0) +{ + switch (arg0) + { + case 0: + default: + return 6; + case 1: + return 5; + } +} + +static void sub_811B978(void) +{ + while (sub_811B9C8()) + { + if (gEasyChatScreen->unk_0a) + gEasyChatScreen->unk_0a--; + else + break; + } +} + +static void sub_811B9A0(void) +{ + while (sub_811BA1C()) + { + if (gEasyChatScreen->unk_10) + gEasyChatScreen->unk_10--; + else + break; + } +} + +static u8 sub_811B9C8(void) +{ + if (gEasyChatScreen->unk_09 == 0) + return sub_811B8E8() >= sub_811F3AC() ? 1 : 0; + else + return gEasyChatScreen->unk_0a > sub_811B960(gEasyChatScreen->unk_0b) ? 1 : 0; +} + +static u8 sub_811BA1C(void) +{ + return sub_811B940() >= sub_811F5B0() ? 1 : 0; +} + +int sub_811BA3C(void) +{ + return gEasyChatScreenTemplates[gEasyChatScreen->templateId].unk_03_7; +} + +u8 sub_811BA5C(void) +{ + return gEasyChatScreen->kind; +} + +u8 sub_811BA68(void) +{ + return gEasyChatScreenTemplates[gEasyChatScreen->templateId].unk_03_0; +} + +const u8 *sub_811BA88(void) +{ + return gEasyChatScreen->titleText; +} + +u16 *sub_811BA94(void) +{ + return gEasyChatScreen->ecWordBuffer; +} + +u8 sub_811BAA0(void) +{ + return gEasyChatScreen->numRows; +} + +u8 sub_811BAAC(void) +{ + return gEasyChatScreen->numColumns; +} + +u8 sub_811BAB8(void) +{ + return gEasyChatScreen->mainCursorColumn; +} + +u8 sub_811BAC4(void) +{ + return gEasyChatScreen->mainCursorRow; +} + +static void GetEasyChatInstructionsText(const u8 **str1, const u8 **str2) +{ + *str1 = gEasyChatScreenTemplates[gEasyChatScreen->templateId].instructionsText1; + *str2 = gEasyChatScreenTemplates[gEasyChatScreen->templateId].instructionsText2; +} + +static void GetEasyChatConfirmText(const u8 **str1, const u8 **str2) +{ + *str1 = gEasyChatScreenTemplates[gEasyChatScreen->templateId].confirmText1; + *str2 = gEasyChatScreenTemplates[gEasyChatScreen->templateId].confirmText2; +} + +static void sub_811BB40(const u8 **str1, const u8 **str2) +{ + switch (gEasyChatScreen->kind) + { + case 4: + *str1 = gText_StopGivingPkmnMail; + *str2 = NULL; + break; + case 15: + case 16: + *str1 = gText_LikeToQuitQuiz; + *str2 = gText_ChallengeQuestionMark; + break; + default: + *str1 = gText_QuitEditing; + *str2 = NULL; + break; + } + +} + +static void GetEasyChatConfirmDeletionText(const u8 **str1, const u8 **str2) +{ + *str1 = gText_AllTextBeingEditedWill; + *str2 = gText_BeDeletedThatOkay; +} + +void sub_811BB9C(u8 *arg0, u8 *arg1) +{ + *arg0 = gEasyChatScreen->unk_0a; + *arg1 = gEasyChatScreen->unk_0b; +} + +u8 sub_811BBB0(void) +{ + return gEasyChatScreen->unk_09; +} + +u8 sub_811BBBC(void) +{ + return gEasyChatScreen->unk_0c; +} + +void sub_811BBC8(u8 *arg0, u8 *arg1) +{ + *arg0 = gEasyChatScreen->unk_10; + *arg1 = gEasyChatScreen->unk_11; +} + +u8 sub_811BBDC(void) +{ + return gEasyChatScreen->unk_0e; +} + +u8 sub_811BBE8(void) +{ + return gEasyChatScreen->unk_0f; +} + +static u8 unref_sub_811BBF4(void) +{ + return 0; +} + +int sub_811BBF8(void) +{ + switch (gEasyChatScreen->state) + { + case 2: + if (gEasyChatScreen->unk_09 == 0 && gEasyChatScreen->unk_0c) + return 1; + break; + case 3: + if (gEasyChatScreen->unk_0e) + return 1; + break; + } + + return 0; +} + +int sub_811BC2C(void) +{ + switch (gEasyChatScreen->state) + { + case 2: + if (gEasyChatScreen->unk_09 == 0 && gEasyChatScreen->unk_0c + 4 <= gEasyChatScreen->unk_0d - 1) + return 1; + break; + case 3: + if (gEasyChatScreen->unk_0e + 4 <= gEasyChatScreen->unk_0f) + return 1; + break; + } + + return 0; +} + +static int sub_811BC70(void) +{ + return sub_811BA3C(); +} + +u8 sub_811BC7C(const u16 *arg0, u8 arg1) +{ + u8 i; + + for (i = 0; i < arg1; i++) + { + if (arg0[i] != gEasyChatScreen->ecWordBuffer[i]) + return 1; + } + + return 0; +} + +u8 sub_811BCBC(void) +{ + return gEasyChatScreen->sizeParam; +} + +static u8 sub_811BCC8(u8 entryType) +{ + u32 i; + + for (i = 0; i < ARRAY_COUNT(gEasyChatScreenTemplates); i++) + { + if (gEasyChatScreenTemplates[i].unk_00 == entryType) + return i; + } + + return 0; +} + +int sub_811BCF4(void) +{ + int i; + + for (i = 0; i < gEasyChatScreen->unk_07; i++) + { + if (gEasyChatScreen->ecWordBuffer[i] != 0xFFFF) + return 0; + } + + return 1; +} + +static int sub_811BD2C(void) +{ + int i; + + for (i = 0; i < gEasyChatScreen->unk_07; i++) + { + if (gEasyChatScreen->ecWordBuffer[i] == 0xFFFF) + return 0; + } + + return 1; +} + +static int sub_811BD64(void) +{ + int i; + struct SaveBlock1 *saveBlock1; + + if (gEasyChatScreen->kind == 17) + return sub_811BCF4(); + + saveBlock1 = gSaveBlock1Ptr; + for (i = 0; i < 9; i++) + { + if (saveBlock1->lilycoveLady.quiz.unk_002[i] != 0xFFFF) + return 0; + } + + return 1; +} + +static int sub_811BDB0(void) +{ + struct LilycoveLadyQuiz *quiz; + if (gEasyChatScreen->kind == 18) + return sub_811BCF4(); + + quiz = &gSaveBlock1Ptr->lilycoveLady.quiz; + return quiz->unk_014 == 0xFFFF ? 1 : 0; +} + +static void sub_811BDF0(u8 *arg0) +{ + u8 name[32]; + struct SaveBlock1 *saveBlock1 = gSaveBlock1Ptr; + DynamicPlaceholderTextUtil_Reset(); + if (StringLength(saveBlock1->lilycoveLady.quiz.playerName) != 0) + { + TVShowConvertInternationalString(name, saveBlock1->lilycoveLady.quiz.playerName, saveBlock1->lilycoveLady.quiz.language); + DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, name); + } + else + { + DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, gText_Lady); + } + + DynamicPlaceholderTextUtil_ExpandPlaceholders(arg0, gText_F700sQuiz); +} + +static void sub_811BE54(void) +{ + int i; + u16 *ecWord; + u8 *str; + + ecWord = gEasyChatScreen->ecWordBuffer; + str = gStringVar2; + i = 0; + while (i < gEasyChatScreen->unk_07) + { + str = CopyEasyChatWordPadded(str, *ecWord, 0); + *str = 0; + str++; + ecWord++; + i++; + } + + str--; + str[0] = 0xFF; +} + +static void sub_811BE9C(void) +{ + switch (gEasyChatScreen->kind) + { + case 0: + FlagSet(FLAG_SYS_CHAT_USED); + break; + case 20: + if (sub_811BF20()) + gSpecialVar_0x8004 = 2; + else + gSpecialVar_0x8004 = 0; + break; + case 9: + sub_811BE54(); + gSpecialVar_0x8004 = sub_81226D8(gEasyChatScreen->ecWordBuffer); + break; + case 13: + gSpecialVar_0x8004 = sub_811BF40(); + break; + } +} + +static int sub_811BF20(void) +{ + return sub_811BC7C(gUnknown_08597764, 4) == 0; +} + +static u16 sub_811BF40(void) +{ + int i; + for (i = 0; i < 5; i++) + { + if (!sub_811BC7C(gUnknown_0859776C[i], 2)) + return i + 1; + } + + return 0; +} + +void sub_811BF78(void) +{ + gEasyChatScreen->unk_13 = 0; +} + +int sub_811BF88(int easyChatWord) +{ + return 0; +} + +static bool8 sub_811BF8C(void) +{ + if (!sub_811CE94()) + return 0; + else + return 1; +} + +static bool8 sub_811BFA4(void) +{ + switch (gUnknown_0203A11C->unk0) + { + case 0: + ResetBgsAndClearDma3BusyFlags(0); + InitBgsFromTemplates(0, gUnknown_08597C54, ARRAY_COUNT(gUnknown_08597C54)); + SetBgTilemapBuffer(3, gUnknown_0203A11C->unkB00); + SetBgTilemapBuffer(1, gUnknown_0203A11C->unk300); + InitWindows(gUnknown_08597C64); + DeactivateAllTextPrinters(); + sub_811CF64(); + sub_811CF04(); + CpuFastFill(0, (void *)VRAM + 0x1000000, 0x400); + break; + case 1: + DecompressAndLoadBgGfxUsingHeap(3, gEasyChatWindow_Gfx, 0, 0, 0); + CopyToBgTilemapBuffer(3, gEasyChatWindow_Tilemap, 0, 0); + sub_811D60C(); + sub_811D424(gUnknown_0203A11C->unk300); + sub_811D230(); + sub_811E948(); + CopyBgTilemapBufferToVram(3); + break; + case 2: + DecompressAndLoadBgGfxUsingHeap(1, gUnknown_08597B54, 0, 0, 0); + CopyBgTilemapBufferToVram(1); + break; + case 3: + sub_811CFCC(); + sub_811D0BC(); + sub_811D2C8(); + sub_811D684(); + break; + case 4: + sub_811DE90(); + if (sub_811BA5C() != 16) + sub_811DEC4(); + break; + case 5: + if (IsDma3ManagerBusyWithBgCopy()) + { + return TRUE; + } + else + { + sub_811DE5C(0, 0, 0, 0); + SetGpuReg(REG_OFFSET_WININ, WIN_RANGE(0, 63)); + SetGpuReg(REG_OFFSET_WINOUT, WIN_RANGE(0, 59)); + ShowBg(3); + ShowBg(1); + ShowBg(2); + ShowBg(0); + sub_811E5D4(); + sub_811E720(); + sub_811E828(); + } + break; + default: + return FALSE; + } + + gUnknown_0203A11C->unk0++; + return TRUE; +} + +static void sub_811C13C(void) +{ + if (gUnknown_0203A11C) + FREE_AND_SET_NULL(gUnknown_0203A11C); +} + +static void sub_811C158(u16 arg0) +{ + gUnknown_0203A11C->unk4 = arg0; + gUnknown_0203A11C->unk0 = 0; + sub_811C170(); +} + +static bool8 sub_811C170(void) +{ + switch (gUnknown_0203A11C->unk4) + { + case 0: return FALSE; + case 1: return sub_811C2D4(); + case 2: return sub_811C30C(); + case 3: return sub_811C3E4(); + case 4: return sub_811C48C(); + case 5: return sub_811C404(); + case 6: return sub_811C448(); + case 7: return sub_811C4D0(); + case 8: return sub_811C518(); + case 9: return sub_811C554(); + case 10: return sub_811C620(); + case 11: return sub_811C830(); + case 12: return sub_811C8F0(); + case 13: return sub_811C99C(); + case 14: return sub_811CA5C(); + case 15: return sub_811C780(); + case 16: return sub_811C78C(); + case 17: return sub_811C7D4(); + case 18: return sub_811CB18(); + case 19: return sub_811CB98(); + case 20: return sub_811CB24(); + case 21: return sub_811CC90(); + case 22: return sub_811CC08(); + case 23: return sub_811C6C0(); + case 24: return FALSE; + case 25: return FALSE; + case 26: return FALSE; + case 27: return FALSE; + case 28: return FALSE; + case 29: return sub_811CD14(); + case 30: return sub_811CD54(); + case 31: return sub_811CD94(); + case 32: return sub_811CDD4(); + case 33: return sub_811CE14(); + case 34: return sub_811CE54(); + default: return FALSE; + } +} + +static bool8 sub_811C2D4(void) +{ + switch (gUnknown_0203A11C->unk0) + { + case 0: + sub_811D2C8(); + gUnknown_0203A11C->unk0++; + break; + case 1: + return IsDma3ManagerBusyWithBgCopy(); + } + + return TRUE; +} + +static bool8 sub_811C30C(void) +{ + u8 i; + u16 *ecWordBuffer; + u16 *ecWord; + u8 var0; + u8 cursorColumn, cursorRow, numColumns; + s16 var1; + int stringWidth; + int trueStringWidth; + u8 var2; + u8 sp0[64]; + + ecWordBuffer = sub_811BA94(); + var0 = sub_811BA68(); + cursorColumn = sub_811BAB8(); + cursorRow = sub_811BAC4(); + numColumns = sub_811BAAC(); + ecWord = &ecWordBuffer[cursorRow * numColumns]; + var1 = 8 * gUnknown_08597C30[var0].unk0_0 + 13; + for (i = 0; i < cursorColumn; i++) + { + if (*ecWord == 0xFFFF) + { + stringWidth = 72; + } + else + { + CopyEasyChatWord(sp0, *ecWord); + stringWidth = GetStringWidth(1, sp0, 0); + } + + trueStringWidth = stringWidth + 17; + var1 += trueStringWidth; + ecWord++; + } + + var2 = 8 * (gUnknown_08597C30[var0].unk0_5 + cursorRow * 2); + sub_811DF60(var1, var2 + 8); + return FALSE; +} + +static bool8 sub_811C3E4(void) +{ + u8 var0 = sub_811E920(sub_811BAB8()); + sub_811DF60(var0, 96); + return FALSE; +} + +static bool8 sub_811C404(void) +{ + switch (gUnknown_0203A11C->unk0) + { + case 0: + sub_811DF90(); + sub_811D104(2); + sub_811D214(1); + gUnknown_0203A11C->unk0++; + break; + case 1: + return IsDma3ManagerBusyWithBgCopy(); + } + + return TRUE; +} + +static bool8 sub_811C448(void) +{ + switch (gUnknown_0203A11C->unk0) + { + case 0: + sub_811DF90(); + sub_811D104(3); + sub_811D214(0); + gUnknown_0203A11C->unk0++; + break; + case 1: + return IsDma3ManagerBusyWithBgCopy(); + } + + return TRUE; +} + +static bool8 sub_811C48C(void) +{ + switch (gUnknown_0203A11C->unk0) + { + case 0: + sub_811DF90(); + sub_811D104(1); + sub_811D214(1); + gUnknown_0203A11C->unk0++; + break; + case 1: + return IsDma3ManagerBusyWithBgCopy(); + } + + return TRUE; +} + +static bool8 sub_811C4D0(void) +{ + switch (gUnknown_0203A11C->unk0) + { + case 0: + sub_811DFB0(); + sub_811D104(0); + sub_811D2C8(); + ShowBg(0); + gUnknown_0203A11C->unk0++; + break; + case 1: + return IsDma3ManagerBusyWithBgCopy(); + } + + return TRUE; +} + +static bool8 sub_811C518(void) +{ + switch (gUnknown_0203A11C->unk0) + { + case 0: + sub_811DFB0(); + sub_811D104(0); + sub_811D2C8(); + gUnknown_0203A11C->unk0++; + // Fall through + case 1: + return IsDma3ManagerBusyWithBgCopy(); + } + + return TRUE; +} + +static bool8 sub_811C554(void) +{ + switch (gUnknown_0203A11C->unk0) + { + case 0: + sub_811DF90(); + HideBg(0); + sub_811DE5C(0, 0, 0, 0); + sub_811D6D4(); + gUnknown_0203A11C->unk0++; + break; + case 1: + if (!IsDma3ManagerBusyWithBgCopy()) + { + sub_811D9CC(0); + gUnknown_0203A11C->unk0++; + } + break; + case 2: + if (!IsDma3ManagerBusyWithBgCopy() && !sub_811DAA4()) + gUnknown_0203A11C->unk0++; + break; + case 3: + if (!IsDma3ManagerBusyWithBgCopy()) + { + sub_811E3AC(); + gUnknown_0203A11C->unk0++; + } + break; + case 4: + if (!sub_811E418()) + { + sub_811DFC8(); + sub_811E6E0(0); + sub_811E64C(); + gUnknown_0203A11C->unk0++; + return FALSE; + } + break; + default: + return FALSE; + } + + return TRUE; +} + +static bool8 sub_811C620(void) +{ + switch (gUnknown_0203A11C->unk0) + { + case 0: + sub_811E050(); + sub_811E4AC(); + sub_811E6B0(); + gUnknown_0203A11C->unk0++; + break; + case 1: + if (sub_811E4D0() == TRUE) + break; + + sub_811D9CC(1); + gUnknown_0203A11C->unk0++; + // Fall through + case 2: + if (!sub_811DAA4()) + gUnknown_0203A11C->unk0++; + break; + case 3: + if (!IsDma3ManagerBusyWithBgCopy()) + { + sub_811DFB0(); + ShowBg(0); + gUnknown_0203A11C->unk0++; + } + break; + case 4: + return FALSE; + } + + return TRUE; +} + +static bool8 sub_811C6C0(void) +{ + switch (gUnknown_0203A11C->unk0) + { + case 0: + sub_811E050(); + sub_811E6B0(); + sub_811E55C(); + sub_811D9CC(5); + gUnknown_0203A11C->unk0++; + break; + case 1: + if (!sub_811DAA4() && !sub_811E5B8()) + { + sub_811D6D4(); + gUnknown_0203A11C->unk0++; + } + break; + case 2: + if (!IsDma3ManagerBusyWithBgCopy()) + { + sub_811D9CC(6); + sub_811E578(); + gUnknown_0203A11C->unk0++; + } + break; + case 3: + if (!sub_811DAA4() && !sub_811E5B8()) + { + sub_811E64C(); + sub_811DFC8(); + gUnknown_0203A11C->unk0++; + return FALSE; + } + break; + case 4: + return FALSE; + } + + return TRUE; +} + +static bool8 sub_811C780(void) +{ + sub_811E088(); + return FALSE; +} + +static bool8 sub_811C78C(void) +{ + switch (gUnknown_0203A11C->unk0) + { + case 0: + sub_811DDAC(1, 4); + gUnknown_0203A11C->unk0++; + // Fall through + case 1: + if (!sub_811DE10()) + { + sub_811E088(); + sub_811E64C(); + return FALSE; + } + break; + } + + return TRUE; +} + +static bool8 sub_811C7D4(void) +{ + switch (gUnknown_0203A11C->unk0) + { + case 0: + sub_811DDAC(-1, 4); + gUnknown_0203A11C->unk0++; + // Fall through + case 1: + if (!sub_811DE10()) + { + sub_811E64C(); + gUnknown_0203A11C->unk0++; + return FALSE; + } + break; + case 2: + return FALSE; + } + + return TRUE; +} + +static bool8 sub_811C830(void) +{ + switch (gUnknown_0203A11C->unk0) + { + case 0: + sub_811E050(); + sub_811E4AC(); + sub_811E6B0(); + gUnknown_0203A11C->unk0++; + break; + case 1: + if (!sub_811E4D0()) + { + sub_811D9B4(); + gUnknown_0203A11C->unk0++; + } + break; + case 2: + if (!IsDma3ManagerBusyWithBgCopy()) + { + sub_811D9CC(2); + gUnknown_0203A11C->unk0++; + } + break; + case 3: + if (!sub_811DAA4()) + { + sub_811D698(2); + gUnknown_0203A11C->unk0++; + } + break; + case 4: + if (!IsDma3ManagerBusyWithBgCopy()) + { + sub_811E288(); + sub_811E6E0(1); + sub_811E64C(); + sub_811E794(); + gUnknown_0203A11C->unk0++; + return FALSE; + } + break; + case 5: + return FALSE; + } + + return TRUE; +} + +static bool8 sub_811C8F0(void) +{ + switch (gUnknown_0203A11C->unk0) + { + case 0: + sub_811D2C8(); + gUnknown_0203A11C->unk0++; + break; + case 1: + sub_811E380(); + sub_811E6B0(); + sub_811E7F8(); + sub_811D9B4(); + gUnknown_0203A11C->unk0++; + break; + case 2: + if (!IsDma3ManagerBusyWithBgCopy()) + { + sub_811D9CC(3); + gUnknown_0203A11C->unk0++; + } + break; + case 3: + if (!sub_811DAA4()) + { + ShowBg(0); + gUnknown_0203A11C->unk0++; + } + break; + case 4: + if (!IsDma3ManagerBusyWithBgCopy()) + { + sub_811DFB0(); + gUnknown_0203A11C->unk0++; + return FALSE; + } + break; + case 5: + return FALSE; + } + + return TRUE; +} + +static bool8 sub_811C99C(void) +{ + switch (gUnknown_0203A11C->unk0) + { + case 0: + sub_811D2C8(); + gUnknown_0203A11C->unk0++; + break; + case 1: + sub_811E380(); + sub_811E6B0(); + sub_811E7F8(); + sub_811D9B4(); + gUnknown_0203A11C->unk0++; + break; + case 2: + if (!IsDma3ManagerBusyWithBgCopy()) + { + sub_811D9CC(3); + gUnknown_0203A11C->unk0++; + } + break; + case 3: + if (!sub_811DAA4()) + { + sub_811D104(3); + gUnknown_0203A11C->unk0++; + } + break; + case 4: + if (!IsDma3ManagerBusyWithBgCopy()) + { + ShowBg(0); + gUnknown_0203A11C->unk0++; + } + break; + case 5: + if (!IsDma3ManagerBusyWithBgCopy()) + { + sub_811DFB0(); + gUnknown_0203A11C->unk0++; + return FALSE; + } + break; + case 6: + return FALSE; + } + + return TRUE; +} + +static bool8 sub_811CA5C(void) +{ + switch (gUnknown_0203A11C->unk0) + { + case 0: + sub_811E380(); + sub_811E6B0(); + sub_811E7F8(); + sub_811D9B4(); + gUnknown_0203A11C->unk0++; + break; + case 1: + if (!IsDma3ManagerBusyWithBgCopy()) + { + sub_811D9CC(4); + gUnknown_0203A11C->unk0++; + } + break; + case 2: + if (!sub_811DAA4()) + { + sub_811D6D4(); + gUnknown_0203A11C->unk0++; + } + break; + case 3: + if (!IsDma3ManagerBusyWithBgCopy()) + { + sub_811E3AC(); + gUnknown_0203A11C->unk0++; + } + break; + case 4: + if (!sub_811E418()) + { + sub_811DFC8(); + sub_811E6E0(0); + sub_811E64C(); + gUnknown_0203A11C->unk0++; + return FALSE; + } + break; + } + + return TRUE; +} + +static bool8 sub_811CB18(void) +{ + sub_811E30C(); + return FALSE; +} + +static bool8 sub_811CB24(void) +{ + switch (gUnknown_0203A11C->unk0) + { + case 0: + sub_811D7A4(); + gUnknown_0203A11C->unk0++; + break; + case 1: + if (!IsDma3ManagerBusyWithBgCopy()) + { + sub_811DDAC(1, 4); + gUnknown_0203A11C->unk0++; + } + break; + case 2: + if (!sub_811DE10()) + { + sub_811E30C(); + sub_811E64C(); + sub_811E794(); + gUnknown_0203A11C->unk0++; + return FALSE; + } + break; + case 3: + return FALSE; + } + + return TRUE; +} + +static bool8 sub_811CB98(void) +{ + switch (gUnknown_0203A11C->unk0) + { + case 0: + sub_811D7C8(); + gUnknown_0203A11C->unk0++; + break; + case 1: + if (!IsDma3ManagerBusyWithBgCopy()) + { + sub_811DDAC(-1, 4); + gUnknown_0203A11C->unk0++; + } + break; + case 2: + if (!sub_811DE10()) + { + sub_811E64C(); + sub_811E794(); + gUnknown_0203A11C->unk0++; + return FALSE; + } + break; + case 3: + return FALSE; + } + + return TRUE; +} + +static bool8 sub_811CC08(void) +{ + switch (gUnknown_0203A11C->unk0) + { + case 0: + sub_811D7EC(); + gUnknown_0203A11C->unk0++; + break; + case 1: + if (!IsDma3ManagerBusyWithBgCopy()) + { + s16 var0 = sub_811BBDC() - sub_811DE48(); + sub_811DDAC(var0, 8); + gUnknown_0203A11C->unk0++; + } + break; + case 2: + if (!sub_811DE10()) + { + sub_811E30C(); + sub_811E64C(); + sub_811E794(); + gUnknown_0203A11C->unk0++; + return FALSE; + } + break; + case 3: + return FALSE; + } + + return TRUE; +} + +static bool8 sub_811CC90(void) +{ + switch (gUnknown_0203A11C->unk0) + { + case 0: + sub_811D830(); + gUnknown_0203A11C->unk0++; + break; + case 1: + if (!IsDma3ManagerBusyWithBgCopy()) + { + s16 var0 = sub_811BBDC() - sub_811DE48(); + sub_811DDAC(var0, 8); + gUnknown_0203A11C->unk0++; + } + break; + case 2: + if (!sub_811DE10()) + { + sub_811E64C(); + sub_811E794(); + gUnknown_0203A11C->unk0++; + return FALSE; + } + break; + case 3: + return FALSE; + } + + return TRUE; +} + +static bool8 sub_811CD14(void) +{ + switch (gUnknown_0203A11C->unk0) + { + case 0: + sub_811DF90(); + sub_811D104(4); + gUnknown_0203A11C->unk0++; + break; + case 1: + return IsDma3ManagerBusyWithBgCopy(); + } + + return TRUE; +} + +static bool8 sub_811CD54(void) +{ + switch (gUnknown_0203A11C->unk0) + { + case 0: + sub_811DF90(); + sub_811D104(5); + gUnknown_0203A11C->unk0++; + break; + case 1: + return IsDma3ManagerBusyWithBgCopy(); + } + + return TRUE; +} + +static bool8 sub_811CD94(void) +{ + switch (gUnknown_0203A11C->unk0) + { + case 0: + sub_811DF90(); + sub_811D104(6); + gUnknown_0203A11C->unk0++; + break; + case 1: + return IsDma3ManagerBusyWithBgCopy(); + } + + return TRUE; +} + +static bool8 sub_811CDD4(void) +{ + switch (gUnknown_0203A11C->unk0) + { + case 0: + sub_811DF90(); + sub_811D104(7); + gUnknown_0203A11C->unk0++; + break; + case 1: + return IsDma3ManagerBusyWithBgCopy(); + } + + return TRUE; +} + +static bool8 sub_811CE14(void) +{ + switch (gUnknown_0203A11C->unk0) + { + case 0: + sub_811DF90(); + sub_811D104(8); + gUnknown_0203A11C->unk0++; + break; + case 1: + return IsDma3ManagerBusyWithBgCopy(); + } + + return TRUE; +} + +static bool8 sub_811CE54(void) +{ + switch (gUnknown_0203A11C->unk0) + { + case 0: + sub_811DF90(); + sub_811D104(9); + gUnknown_0203A11C->unk0++; + break; + case 1: + return IsDma3ManagerBusyWithBgCopy(); + } + + return TRUE; +} + +static bool8 sub_811CE94(void) +{ + gUnknown_0203A11C = Alloc(sizeof(*gUnknown_0203A11C)); + if (!gUnknown_0203A11C) + return FALSE; + + gUnknown_0203A11C->unk0 = 0; + gUnknown_0203A11C->unk2D8 = 0; + gUnknown_0203A11C->unk2DC = 0; + gUnknown_0203A11C->unk2E0 = 0; + gUnknown_0203A11C->unk2E4 = 0; + gUnknown_0203A11C->unk2E8 = 0; + gUnknown_0203A11C->unk2EC = 0; + gUnknown_0203A11C->unk2F0 = 0; + gUnknown_0203A11C->unk2F4 = 0; + gUnknown_0203A11C->unk2F8 = 0; + gUnknown_0203A11C->unk2FC = 0; + gUnknown_0203A11C->unkA = sub_811BC70(); + return TRUE; +} + +static void sub_811CF04(void) +{ + ChangeBgX(3, 0, 0); + ChangeBgY(3, 0, 0); + ChangeBgX(1, 0, 0); + ChangeBgY(1, 0, 0); + ChangeBgX(2, 0, 0); + ChangeBgY(2, 0, 0); + ChangeBgX(0, 0, 0); + ChangeBgY(0, 0, 0); + SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_OBJ_ON | DISPCNT_WIN0_ON); +} + +static void sub_811CF64(void) +{ + ResetPaletteFade(); + LoadPalette(gEasyChatMode_Pal, 0, 32); + LoadPalette(gUnknown_08597B14, 1 * 16, 32); + LoadPalette(gUnknown_08597B34, 4 * 16, 32); + LoadPalette(gUnknown_08597C1C, 10 * 16, 8); + LoadPalette(gUnknown_08597C24, 11 * 16, 12); + LoadPalette(gUnknown_08597C24, 15 * 16, 12); + LoadPalette(gUnknown_08597C24, 3 * 16, 12); +} + +static void sub_811CFCC(void) +{ + int xOffset; + const u8 *titleText = sub_811BA88(); + if (!titleText) + return; + + xOffset = GetStringCenterAlignXOffset(1, titleText, 144); + FillWindowPixelBuffer(0, 0); + sub_811D058(0, 1, titleText, xOffset, 1, 0xFF, 0, 2, 3); + PutWindowTilemap(0); + CopyWindowToVram(0, 3); +} + +void sub_811D028(u8 windowId, u8 fontId, const u8 *str, u8 x, u8 y, u8 speed, void (*callback)(struct TextPrinterTemplate *, u16)) +{ + AddTextPrinterParameterized(windowId, fontId, str, x, y, speed, callback); +} + +void sub_811D058(u8 windowId, u8 fontId, const u8 *str, u8 left, u8 top, u8 speed, u8 red, u8 green, u8 blue) +{ + u8 color[3]; + color[0] = red; + color[1] = green; + color[2] = blue; + AddTextPrinterParameterized3(windowId, fontId, left, top, color, speed, str); +} + +static void sub_811D0BC(void) +{ + FillBgTilemapBufferRect(0, 0, 0, 0, 32, 20, 17); + LoadUserWindowBorderGfx(1, 1, 0xE0); + sub_8098858(1, 1, 14); + sub_811D104(0); + PutWindowTilemap(1); + CopyBgTilemapBufferToVram(0); +} + +static void sub_811D104(u8 arg0) +{ + const u8 *text2 = NULL; + const u8 *text1 = NULL; + switch (arg0) + { + case 0: + GetEasyChatInstructionsText(&text1, &text2); + break; + case 2: + sub_811BB40(&text1, &text2); + break; + case 3: + GetEasyChatConfirmText(&text1, &text2); + break; + case 1: + GetEasyChatConfirmDeletionText(&text1, &text2); + break; + case 4: + text1 = gText_CreateAQuiz; + break; + case 5: + text1 = gText_SelectTheAnswer; + break; + case 6: + text1 = gText_OnlyOnePhrase; + text2 = gText_OriginalSongWillBeUsed; + break; + case 7: + text1 = gText_LyricsCantBeDeleted; + break; + case 8: + text1 = gText_CombineTwoWordsOrPhrases3; + break; + case 9: + text1 = gText_YouCannotQuitHere; + text2 = gText_SectionMustBeCompleted; + break; + } + + FillWindowPixelBuffer(1, 0x11); + if (text1) + sub_811D028(1, 1, text1, 0, 1, 0xFF, 0); + + if (text2) + sub_811D028(1, 1, text2, 0, 17, 0xFF, 0); + + CopyWindowToVram(1, 3); +} + +static void sub_811D214(u8 initialCursorPos) +{ + CreateYesNoMenu(&gUnknown_08597C84, 1, 14, initialCursorPos); +} + +static void sub_811D230(void) +{ + u8 var0; + struct WindowTemplate template; + + var0 = sub_811BA68(); + template.bg = 3; + template.tilemapLeft = gUnknown_08597C30[var0].unk0_0; + template.tilemapTop = gUnknown_08597C30[var0].unk0_5; + template.width = gUnknown_08597C30[var0].unk1; + template.height = gUnknown_08597C30[var0].unk2; + template.paletteNum = 11; + template.baseBlock = 0x6C; + gUnknown_0203A11C->windowId = AddWindow(&template); + PutWindowTilemap(gUnknown_0203A11C->windowId); +} + +static void sub_811D2C8(void) +{ + u8 spC[4]; + u16 *ecWord; + u8 numColumns, numRows; + u8 *str; + int var0; + int var1; + int i, j, k; + + ecWord = sub_811BA94(); + numColumns = sub_811BAAC(); + numRows = sub_811BAA0(); + var0 = sub_811BA68(); + var1 = 0; + if (var0 == 7) + var1 = 1; + + FillWindowPixelBuffer(gUnknown_0203A11C->windowId, 0x11); + for (i = 0; i < numRows; i++) + { + memcpy(spC, gUnknown_08597C8C, sizeof(gUnknown_08597C8C)); + if (var1) + spC[2] = 6; + + str = gUnknown_0203A11C->unkB; + gUnknown_0203A11C->unkB[0] = EOS; + str = StringAppend(str, spC); + for (j = 0; j < numColumns; j++) + { + if (*ecWord != 0xFFFF) + { + str = CopyEasyChatWord(str, *ecWord); + ecWord++; + } + else + { + ecWord++; + if (!var1) + { + str = WriteColorChangeControlCode(str, 0, 4); + for (k = 0; k < 12; k++) + { + *str = CHAR_HYPHEN; + str++; + } + + str = WriteColorChangeControlCode(str, 0, 2); + } + } + + if (var1) + spC[2] = 3; + + str = StringAppend(str, spC); + if (var0 == 2 || var0 == 7 || var0 == 8) + { + if (j == 0 && i == 4) + break; + } + } + + *str = EOS; + sub_811D028(gUnknown_0203A11C->windowId, 1, gUnknown_0203A11C->unkB, 0, i * 16 + 1, 0xFF, 0); + } + + CopyWindowToVram(gUnknown_0203A11C->windowId, 3); +} + +static void sub_811D424(u16 *tilemap) +{ + u8 var0; + int right, bottom; + int x, y; + + var0 = sub_811BA68(); + CpuFastFill(0, tilemap, BG_SCREEN_SIZE); + if (var0 == 2 || var0 == 8) + { + right = gUnknown_08597C30[var0].unk0_0 + gUnknown_08597C30[var0].unk1; + bottom = gUnknown_08597C30[var0].unk0_5 + gUnknown_08597C30[var0].unk2; + for (y = gUnknown_08597C30[var0].unk0_5; y < bottom; y++) + { + x = gUnknown_08597C30[var0].unk0_0 - 1; + tilemap[y * 32 + x] = 0x1005; + x++; + for (; x < right; x++) + tilemap[y * 32 + x] = 0x1000; + + tilemap[y* 32 + x] = 0x1007; + } + } + else + { + y = gUnknown_08597C30[var0].unk0_5 - 1; + x = gUnknown_08597C30[var0].unk0_0 - 1; + right = gUnknown_08597C30[var0].unk0_0 + gUnknown_08597C30[var0].unk1; + bottom = gUnknown_08597C30[var0].unk0_5 + gUnknown_08597C30[var0].unk2; + tilemap[y * 32 + x] = 0x1001; + x++; + for (; x < right; x++) + tilemap[y * 32 + x] = 0x1002; + + tilemap[y * 32 + x] = 0x1003; + y++; + for (; y < bottom; y++) + { + x = gUnknown_08597C30[var0].unk0_0 - 1; + tilemap[y * 32 + x] = 0x1005; + x++; + for (; x < right; x++) + tilemap[y * 32 + x] = 0x1000; + + tilemap[y* 32 + x] = 0x1007; + } + + x = gUnknown_08597C30[var0].unk0_0 - 1; + tilemap[y * 32 + x] = 0x1009; + x++; + for (; x < right; x++) + tilemap[y * 32 + x] = 0x100A; + + tilemap[y * 32 + x] = 0x100B; + } +} + +static void sub_811D60C(void) +{ + u8 var0; + u16 *tilemap; + + tilemap = GetBgTilemapBuffer(3); + var0 = sub_811BA68(); + switch (gUnknown_08597C30[var0].unk3) + { + case 2: + tilemap += 0x2A0; + CopyToBgTilemapBufferRect(3, tilemap, 0, 11, 32, 2); + break; + case 1: + tilemap += 0x300; + CopyToBgTilemapBufferRect(3, tilemap, 0, 11, 32, 2); + break; + case 3: + CopyToBgTilemapBufferRect(3, tilemap, 0, 10, 32, 4); + break; + } +} + +static void sub_811D684(void) +{ + PutWindowTilemap(2); + CopyBgTilemapBufferToVram(2); +} + +static void sub_811D698(u32 arg0) +{ + sub_811DD84(); + FillWindowPixelBuffer(2, 0x11); + switch (arg0) + { + case 0: + sub_811D6F4(); + break; + case 1: + sub_811D758(); + break; + case 2: + sub_811D794(); + break; + } + + CopyWindowToVram(2, 2); +} + +static void sub_811D6D4(void) +{ + if (!sub_811BBB0()) + sub_811D698(0); + else + sub_811D698(1); +} + +static void sub_811D6F4(void) +{ + int i; + int x, y; + + i = 0; + y = 97; + while (1) + { + for (x = 0; x < 2; x++) + { + u8 index = sub_811F3B8(i++); + if (index == 22) + { + sub_811DDAC(sub_811BBBC(), 0); + return; + } + + sub_811D028(2, 1, sub_811F424(index), x * 84 + 10, y, 0xFF, NULL); + } + + y += 16; + } +} + +static void sub_811D758(void) +{ + u32 i; + + for (i = 0; i < 4; i++) + sub_811D028(2, 1, gUnknown_08597C90[i], 10, 97 + i * 16, 0xFF, NULL); +} + +static void sub_811D794(void) +{ + sub_811D864(0, 4); +} + +static void sub_811D7A4(void) +{ + u8 var0 = sub_811BBDC() + 3; + sub_811D950(var0, 1); + sub_811D864(var0, 1); +} + +static void sub_811D7C8(void) +{ + u8 var0 = sub_811BBDC(); + sub_811D950(var0, 1); + sub_811D864(var0, 1); +} + +static void sub_811D7EC(void) +{ + u8 var0 = sub_811BBDC(); + u8 var1 = var0 + 4; + u8 var2 = sub_811BBE8() + 1; + if (var1 > var2) + var1 = var2; + + if (var0 < var1) + { + u8 var3 = var1 - var0; + sub_811D950(var0, var3); + sub_811D864(var0, var3); + } +} + +static void sub_811D830(void) +{ + u8 var0 = sub_811BBDC(); + u8 var1 = sub_811DE48(); + if (var0 < var1) + { + u8 var2 = var1 - var0; + sub_811D950(var0, var2); + sub_811D864(var0, var2); + } +} + +static void sub_811D864(u8 arg0, u8 arg1) +{ + int i, j; + u16 easyChatWord; + u8 *str; + int y; + int var0; + + var0 = arg0 * 2; + y = (arg0 * 16 + 96) & 0xFF; + y++; + for (i = 0; i < arg1; i++) + { + for (j = 0; j < 2; j++) + { + easyChatWord = sub_811F578(var0++); + if (easyChatWord != 0xFFFF) + { + CopyEasyChatWordPadded(gUnknown_0203A11C->unkCC, easyChatWord, 0); + if (!sub_811BF88(easyChatWord)) + sub_811D028(2, 1, gUnknown_0203A11C->unkCC, (j * 13 + 3) * 8, y, 0xFF, NULL); + else + sub_811D058(2, 1, gUnknown_0203A11C->unkCC, (j * 13 + 3) * 8, y, 0xFF, 1, 5, 3); + } + } + + y += 16; + } + + CopyWindowToVram(2, 2); +} + +static void sub_811D950(u8 arg0, u8 arg1) +{ + int y; + int var0; + int var1; + int var2; + + y = (arg0 * 16 + 96) & 0xFF; + var2 = arg1 * 16; + var0 = y + var2; + if (var0 > 255) + { + var1 = var0 - 256; + var2 = 256 - y; + } + else + { + var1 = 0; + } + + FillWindowPixelRect(2, 0x11, 0, y, 224, var2); + if (var1) + FillWindowPixelRect(2, 0x11, 0, 0, 224, var1); +} + +static void sub_811D9B4(void) +{ + FillWindowPixelBuffer(2, 0x11); + CopyWindowToVram(2, 2); +} + +static void sub_811D9CC(int arg0) +{ + switch (arg0) + { + case 0: + gUnknown_0203A11C->unk6 = 0; + gUnknown_0203A11C->unk7 = 10; + break; + case 1: + gUnknown_0203A11C->unk6 = 9; + gUnknown_0203A11C->unk7 = 0; + break; + case 2: + gUnknown_0203A11C->unk6 = 11; + gUnknown_0203A11C->unk7 = 17; + break; + case 3: + gUnknown_0203A11C->unk6 = 17; + gUnknown_0203A11C->unk7 = 0; + break; + case 4: + gUnknown_0203A11C->unk6 = 17; + gUnknown_0203A11C->unk7 = 10; + break; + case 5: + gUnknown_0203A11C->unk6 = 18; + gUnknown_0203A11C->unk7 = 22; + break; + case 6: + gUnknown_0203A11C->unk6 = 22; + gUnknown_0203A11C->unk7 = 18; + break; + } + + gUnknown_0203A11C->unk8 = gUnknown_0203A11C->unk6 < gUnknown_0203A11C->unk7 ? 1 : -1; +} + +static bool8 sub_811DAA4(void) +{ + u8 var0, var1; + if (gUnknown_0203A11C->unk6 == gUnknown_0203A11C->unk7) + return FALSE; + + gUnknown_0203A11C->unk6 += gUnknown_0203A11C->unk8; + sub_811DADC(gUnknown_0203A11C->unk6); + var0 = gUnknown_0203A11C->unk6; + var1 = gUnknown_0203A11C->unk7; + return (var0 ^ var1) > 0; +} diff --git a/src/flying.c b/src/flying.c index d3ea3f11b..48df12a06 100644 --- a/src/flying.c +++ b/src/flying.c @@ -1,13 +1,16 @@ #include "global.h" #include "battle_anim.h" +#include "palette.h" +#include "trig.h" +#include "constants/battle_anim.h" #include "constants/rgb.h" -extern void sub_810DE70(struct Sprite *); -extern void sub_810DFA8(struct Sprite *); -extern void sub_810E044(struct Sprite *); -extern void sub_810E13C(struct Sprite *); -extern void sub_810E1C8(struct Sprite *); -extern void sub_810E314(struct Sprite *); +void sub_810DE70(struct Sprite *); +void sub_810DFA8(struct Sprite *); +void sub_810E044(struct Sprite *); +void sub_810E13C(struct Sprite *); +void sub_810E1C8(struct Sprite *); +void sub_810E314(struct Sprite *); extern void sub_810EA4C(struct Sprite *); extern void sub_810EAA0(struct Sprite *); extern void sub_810EC34(struct Sprite *); @@ -18,6 +21,13 @@ extern void sub_810EEF8(struct Sprite *); extern void sub_810F004(struct Sprite *); extern void sub_810F084(struct Sprite *); +static void sub_810DE98(struct Sprite *); +static void sub_810DF18(u8); +static void sub_810E028(struct Sprite *); +static void sub_810E184(struct Sprite *); +static void sub_810E24C(struct Sprite *); +void sub_810E520(struct Sprite *); + const struct SpriteTemplate gUnknown_08596270 = { .tileTag = ANIM_TAG_GUST, @@ -326,3 +336,293 @@ const struct SpriteTemplate gUnknown_08596514 = .affineAnims = gDummySpriteAffineAnimTable, .callback = sub_810F084, }; + + +void sub_810DE70(struct Sprite *sprite) +{ + InitSpritePosToAnimTarget(sprite, FALSE); + sprite->pos1.y += 20; + sprite->data[1] = 191; + sprite->callback = sub_810DE98; + sprite->callback(sprite); +} + +static void sub_810DE98(struct Sprite *sprite) { + sprite->pos2.x = Sin(sprite->data[1], 32); + sprite->pos2.y = Cos(sprite->data[1], 8); + sprite->data[1] += 5; + sprite->data[1] &= 0xFF; + if (++sprite->data[0] == 71) + DestroyAnimSprite(sprite); +} + +void sub_810DED8(u8 taskId) +{ + gTasks[taskId].data[0] = gBattleAnimArgs[1]; + gTasks[taskId].data[1] = gBattleAnimArgs[0]; + gTasks[taskId].data[2] = IndexOfSpritePaletteTag(ANIM_TAG_GUST); + gTasks[taskId].func = sub_810DF18; +} + +static void sub_810DF18(u8 taskId) +{ + u8 data2; + u16 temp; + int i, base; + + if (gTasks[taskId].data[10]++ == gTasks[taskId].data[1]) + { + gTasks[taskId].data[10] = 0; + data2 = gTasks[taskId].data[2]; + temp = gPlttBufferFaded[16 * data2 + 0x108]; + i = 7; + base = data2 * 16; + + do + { + gPlttBufferFaded[base + 0x101 + i] = gPlttBufferFaded[base + 0x100 + i]; + i--; + } + while (i > 0); + + gPlttBufferFaded[base + 0x101] = temp; + } + + if (--gTasks[taskId].data[0] == 0) + DestroyAnimVisualTask(taskId); +} + +void sub_810DFA8(struct Sprite *sprite) +{ + InitSpritePosToAnimAttacker(sprite, TRUE); + if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER) + gBattleAnimArgs[2] = -gBattleAnimArgs[2]; + + sprite->data[0] = gBattleAnimArgs[4]; + sprite->data[1] = sprite->pos1.x; + sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2) + gBattleAnimArgs[2]; + sprite->data[3] = sprite->pos1.y; + sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET) + gBattleAnimArgs[3]; + InitAnimLinearTranslation(sprite); + sprite->callback = RunStoredCallbackWhenAffineAnimEnds; + StoreSpriteCallbackInData6(sprite, sub_810E028); +} + +static void sub_810E028(struct Sprite *sprite) +{ + if (AnimTranslateLinear(sprite)) + DestroyAnimSprite(sprite); +} + +void sub_810E044(struct Sprite *sprite) +{ + if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER) + { + gBattleAnimArgs[0] = -gBattleAnimArgs[0]; + gBattleAnimArgs[1] = -gBattleAnimArgs[1]; + gBattleAnimArgs[2] = -gBattleAnimArgs[2]; + gBattleAnimArgs[3] = -gBattleAnimArgs[3]; + } + + if (IsContest()) + { + gBattleAnimArgs[1] = -gBattleAnimArgs[1]; + gBattleAnimArgs[3] = -gBattleAnimArgs[3]; + } + + sprite->pos1.x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2); + sprite->pos1.y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET); + sprite->pos1.x += gBattleAnimArgs[0]; + sprite->pos1.y += gBattleAnimArgs[1]; + sprite->data[0] = gBattleAnimArgs[4]; + + if (gBattleAnimArgs[6] == 0) + { + sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2); + sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET); + } + else + { + SetAverageBattlerPositions(gBattleAnimTarget, 1, &sprite->data[2], &sprite->data[4]); + } + + sprite->data[2] = sprite->data[2] + gBattleAnimArgs[2]; + sprite->data[4] = sprite->data[4] + gBattleAnimArgs[3]; + sprite->callback = StartAnimLinearTranslation; + + StoreSpriteCallbackInData6(sprite, DestroyAnimSprite); + SeekSpriteAnim(sprite, gBattleAnimArgs[5]); +} + +void sub_810E13C(struct Sprite *sprite) +{ + InitSpritePosToAnimAttacker(sprite, TRUE); + sprite->data[0] = gBattleAnimArgs[2]; + sprite->data[1] = gBattleAnimArgs[3]; + sprite->callback = sub_810E184; + gSprites[GetAnimBattlerSpriteId(ANIM_ATTACKER)].invisible = 1; +} + +static void sub_810E184(struct Sprite *sprite) +{ + if (sprite->data[0] > 0) + { + sprite->data[0]--; + } + else + { + sprite->data[2] += sprite->data[1]; + sprite->pos2.y -= (sprite->data[2] >> 8); + } + + if (sprite->pos1.y + sprite->pos2.y < -32) + DestroyAnimSprite(sprite); +} + +void sub_810E1C8(struct Sprite *sprite) +{ + if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER) + { + sprite->pos1.x = 272; + sprite->pos1.y = -32; + StartSpriteAffineAnim(sprite, 1); + } + else + { + sprite->pos1.x = -32; + sprite->pos1.y = -32; + } + + sprite->data[0] = gBattleAnimArgs[0]; + sprite->data[1] = sprite->pos1.x; + sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2); + sprite->data[3] = sprite->pos1.y; + sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET); + + InitAnimLinearTranslation(sprite); + sprite->callback = sub_810E24C; +} + +static void sub_810E24C(struct Sprite *sprite) +{ + sprite->data[0] = 1; + AnimTranslateLinear(sprite); + if (((u16)sprite->data[3] >> 8) > 200) + { + sprite->pos1.x += sprite->pos2.x; + sprite->pos2.x = 0; + sprite->data[3] &= 0xFF; + } + + if ((u32)(sprite->pos1.x + sprite->pos2.x + 32) > 304 || sprite->pos1.y + sprite->pos2.y > 160) + { + gSprites[GetAnimBattlerSpriteId(ANIM_ATTACKER)].invisible = 0; + DestroyAnimSprite(sprite); + } +} + +void sub_810E2C8(struct Sprite *sprite) +{ + if (sprite->data[0]-- <= 0) + { + if (sprite->oam.affineMode & ST_OAM_AFFINE_ON_MASK) + { + FreeOamMatrix(sprite->oam.matrixNum); + sprite->oam.affineMode = 0; + } + + DestroySprite(sprite); + gAnimVisualTaskCount--; + } +} + +// FAKEMATCHING +void sub_810E314(struct Sprite *sprite) +{ + s16 *data; + u8 slot; + s16 spriteCoord; + int t1, t2; + u32 arg2; + u32 matrixNum; + u8 sinIndex; + register s16 sinVal asm ("r4"); + register int sinVal2 asm ("r0"); + + data = sprite->data; + + if (gBattleAnimArgs[7] & 0x100) + slot = gBattleAnimAttacker; + else + slot = gBattleAnimTarget; + + if (GetBattlerSide(slot) == B_SIDE_PLAYER) + gBattleAnimArgs[0] = -gBattleAnimArgs[0]; + + sprite->pos1.x = GetBattlerSpriteCoord(slot, 0) + gBattleAnimArgs[0]; + spriteCoord = GetBattlerSpriteCoord(slot, 1); + sprite->pos1.y = spriteCoord + gBattleAnimArgs[1]; + data[4] = sprite->pos1.y << 8; + + t1 = (spriteCoord + (u16) gBattleAnimArgs[6]) << 1; + data[7] = (data[7] & 1) | t1; + ((u8 *) data)[0] |= 4; + + arg2 = (u16) gBattleAnimArgs[2]; + data[1] = (u8) gBattleAnimArgs[2]; + arg2 <<= 16; + data[5] = arg2 >> 24; + data[2] = gBattleAnimArgs[3]; + data[3] = gBattleAnimArgs[4]; + data[6] = gBattleAnimArgs[5]; + + if ((u16) (data[1] - 64) <= 0x7f) + { + if (!IsContest()) + sprite->oam.priority = GetBattlerSpriteBGPriority(slot) + 1; + else + sprite->oam.priority = GetBattlerSpriteBGPriority(slot); + + ((u8 *) data)[14] = data[7] & -2; + + if (!(data[2] & 0x8000)) + { + sprite->hFlip ^= 1; + sprite->animNum = sprite->hFlip; + + sprite->animBeginning = 1; + sprite->animEnded = 0; + } + } + else + { + sprite->oam.priority = GetBattlerSpriteBGPriority(slot); + ((u8 *) data)[14] |= 1; + + if (data[2] & 0x8000) + { + sprite->hFlip ^= 1; + sprite->animNum = sprite->hFlip; + + sprite->animBeginning = 1; + sprite->animEnded = 0; + } + } + + t2 = (u16) data[1] >> 6 << 4; + ((u8 *) data)[0] = (15 & data[0]) | t2; + + sprite->pos2.x = (gSineTable[(u16) data[1]] * (u8) data[6]) >> 8; + + matrixNum = sprite->oam.matrixNum; + + sinIndex = (-sprite->pos2.x >> 1) + data[5]; + sinVal = gSineTable[sinIndex]; + + gOamMatrices[matrixNum].a = gOamMatrices[matrixNum].d = gSineTable[sinIndex + 64]; + gOamMatrices[matrixNum].b = sinVal; + sinVal2 = -sinVal; + gOamMatrices[matrixNum].c = sinVal2; + + sprite->callback = sub_810E520; +} |