diff options
Diffstat (limited to 'src')
-rwxr-xr-x | src/contest_link_80F57C4.c | 1290 | ||||
-rw-r--r-- | src/contest_painting.c | 3 | ||||
-rw-r--r-- | src/tv.c | 4 |
3 files changed, 1290 insertions, 7 deletions
diff --git a/src/contest_link_80F57C4.c b/src/contest_link_80F57C4.c index 95171ba68..721a4f870 100755 --- a/src/contest_link_80F57C4.c +++ b/src/contest_link_80F57C4.c @@ -2,34 +2,132 @@ #include "battle.h" #include "bg.h" #include "contest.h" +#include "contest_link_80F57C4.h" +#include "contest_painting.h" #include "decompress.h" +#include "dma3.h" #include "event_data.h" +#include "field_specials.h" #include "gpu_regs.h" #include "graphics.h" +#include "international_string_util.h" #include "link.h" +#include "link_rfu.h" +#include "load_save.h" +#include "main.h" +#include "overworld.h" #include "palette.h" +#include "pokedex.h" +#include "pokemon.h" +#include "pokemon_icon.h" #include "random.h" +#include "save.h" +#include "scanline_effect.h" +#include "sound.h" #include "string_util.h" #include "strings.h" #include "task.h" #include "text.h" +#include "tv.h" +#include "util.h" #include "window.h" +#include "constants/game_stat.h" +#include "constants/rgb.h" +#include "constants/songs.h" +#include "constants/vars.h" + +struct ContestLinkUnk0 +{ + u8 unk0; + u8 unk1; + u8 taskId; + u8 unk3; + u8 unk4; + u8 unk5; + u8 unk6; + u8 filler7[0x1]; + u8 spriteId; + u8 unk9; + u8 unkA; + u8 fillerB[0x9]; + u8 unk14; + u8 filler15[0x3]; +}; + +struct ContestLinkUnk4 +{ + u8 filler0[0x50]; +}; struct ContestLink80F57C4 { - u8 filler0[0xC]; + struct ContestLinkUnk0 *unk0; + struct ContestLinkUnk4 *unk4; + u8 filler8[0x4]; u8 *unkC[4]; }; +extern const struct CompressedSpriteSheet gMonFrontPicTable[]; + extern struct ContestLink80F57C4 *gUnknown_0203A034; extern const struct BgTemplate gUnknown_0858D888[4]; extern const struct WindowTemplate gUnknown_0858D898[]; +extern const struct CompressedSpriteSheet gUnknown_0858D878[]; +extern const struct CompressedSpritePalette gUnknown_0858D880[]; +extern const struct SpriteSheet gUnknown_0858D8E0; +extern const struct SpriteTemplate gSpriteTemplate_858D8C8; +extern const u8 gUnknown_0858D8E8[]; +extern const u8 gUnknown_0858D6D0[]; +extern const struct SpriteTemplate gSpriteTemplate_858D7F8; +extern const struct SpriteSheet gUnknown_0858D810[]; +extern const struct SpritePalette gUnknown_0858D850; -void sub_80F71C8(void); +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_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_80F5C24(void); +static void sub_80F707C(const u8 *); +static void sub_80F5ED8(u8); +static void sub_80F5F14(u8); +static void sub_80F5F30(u8); +static void sub_80F5F74(u8); +static void sub_80F7144(void); +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_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_80F6404(u8); +void sub_80F75A8(struct Sprite *); +void sub_80F7670(u8); +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_80F6F68(struct Sprite *); +static void sub_80F7014(struct Sprite *); +static void sub_80F6FDC(struct Sprite *); void sub_80F57C4(void) { @@ -155,3 +253,1191 @@ void sub_80F5AE0(void) CopyBgTilemapBufferToVram(1); } + +void sub_80F5B00(void) +{ + gPaletteFade.bufferTransferDisabled = 1; + SetVBlankCallback(NULL); + sub_80F7DF4(); + sub_80F57C4(); + ScanlineEffect_Clear(); + ResetPaletteFade(); + ResetSpriteData(); + ResetTasks(); + FreeAllSpritePalettes(); + sub_80F591C(); + sub_80F6A9C(); + sub_80F6A64(0, 1); + sub_80F5AE0(); + memset(gUnknown_0203A034->unk0, 0, sizeof(*gUnknown_0203A034->unk0)); + memset(gUnknown_0203A034->unk4, 0, sizeof(*gUnknown_0203A034->unk4)); + sub_80F6DC0(); + sub_80F6AE8(); + BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, RGB_BLACK); + gPaletteFade.bufferTransferDisabled = 0; + gUnknown_0203A034->unk0->taskId = CreateTask(sub_80F5CE4, 5); + SetMainCallback2(sub_80F5C00); + gBattle_WIN1H = 0x00F0; + gBattle_WIN1V = 0x80A0; + CreateTask(sub_80F68B4, 20); + sub_80F7880(); + if (gIsLinkContest & 0x2) + gPaletteFade.bufferTransferDisabled = 1; + else + PlayBGM(MUS_CON_K); + + SetVBlankCallback(sub_80F5C24); +} + +static void sub_80F5C00(void) +{ + AnimateSprites(); + BuildOamBuffer(); + RunTasks(); + UpdatePaletteFade(); + CopyBgTilemapBufferToVram(1); + CopyBgTilemapBufferToVram(2); +} + +static void sub_80F5C24(void) +{ + SetGpuReg(REG_OFFSET_BG0HOFS, gBattle_BG0_X); + SetGpuReg(REG_OFFSET_BG0VOFS, gBattle_BG0_Y); + SetGpuReg(REG_OFFSET_BG1HOFS, gBattle_BG1_X); + SetGpuReg(REG_OFFSET_BG1VOFS, gBattle_BG1_Y); + SetGpuReg(REG_OFFSET_BG2HOFS, gBattle_BG2_X); + SetGpuReg(REG_OFFSET_BG2VOFS, gBattle_BG2_Y); + SetGpuReg(REG_OFFSET_BG3HOFS, gBattle_BG3_X); + SetGpuReg(REG_OFFSET_BG3VOFS, gBattle_BG3_Y); + SetGpuReg(REG_OFFSET_WIN0H, gBattle_WIN0H); + SetGpuReg(REG_OFFSET_WIN0V, gBattle_WIN0V); + SetGpuReg(REG_OFFSET_WIN1H, gBattle_WIN1H); + SetGpuReg(REG_OFFSET_WIN1V, gBattle_WIN1V); + LoadOam(); + ProcessSpriteCopyRequests(); + TransferPlttBuffer(); + ScanlineEffect_InitHBlankDmaTransfer(); +} + +static void sub_80F5CE4(u8 taskId) +{ + u16 var; + + if (gIsLinkContest & 1) + { + switch (gTasks[taskId].data[0]) + { + case 0: + sub_80DBED4(); + if (gContestFinalStandings[gContestPlayerMonIndex] == 0) + { + IncrementGameStat(GAME_STAT_WON_LINK_CONTEST); + gSpecialVar_0x8005 = 8; + InterviewBefore(); + if (gSpecialVar_Result != 1) + InterviewAfter(); + } + + sub_813BADC(2); + sub_80DEDA8(gSpecialVar_ContestRank); + sub_80DEDA8(0xFE); + gUnknown_02039F5C = 1; + gUnknown_02039F5D = sub_80DEFA8(0xFE, 0); + var = VarGet(VAR_0x4086); + VarSet(VAR_0x4086, 0); + SetContinueGameWarpStatusToDynamicWarp(); + TrySavingData(SAVE_LINK); + ClearContinueGameWarpStatus2(); + VarSet(VAR_0x4086, var); + gTasks[taskId].data[0]++; + break; + case 1: + gTasks[taskId].data[0]++; + if (!(gIsLinkContest & 0x2)) + gTasks[taskId].data[0] = 100; + break; + case 2: + if (IsLinkTaskFinished()) + { + sub_800ADF8(); + gTasks[taskId].data[0]++; + } + return; + case 3: + if (IsLinkTaskFinished() == TRUE) + { + PlayBGM(MUS_CON_K); + gPaletteFade.bufferTransferDisabled = 0; + gTasks[taskId].data[0]++; + break; + } + return; + } + } + + if (!gPaletteFade.active) + { + gTasks[taskId].data[0] = 0; + if (gIsLinkContest & 0x1) + { + sub_80F707C(gText_CommunicationStandby); + gTasks[taskId].func = sub_80F5ED8; + } + else + { + IncrementGameStat(GAME_STAT_ENTERED_CONTEST); + if (gContestFinalStandings[gContestPlayerMonIndex] == 0) + IncrementGameStat(GAME_STAT_WON_CONTEST); + + sub_80DEDA8(gSpecialVar_ContestRank); + sub_80DEDA8(0xFE); + gUnknown_02039F5C = 1; + gUnknown_02039F5D = sub_80DEFA8(0xFE, 0); + sub_813BADC(2); + gTasks[taskId].func = sub_80F5F74; + } + } +} + +static void sub_80F5ED8(u8 taskId) +{ + if (gReceivedRemoteLinkPlayers) + { + CreateTask(sub_80F5F14, 0); + gTasks[taskId].func = TaskDummy; + } +} + +static void sub_80F5F14(u8 taskId) +{ + SetTaskFuncWithFollowupFunc(taskId, sub_80FC998, sub_80F5F30); +} + +static void sub_80F5F30(u8 taskId) +{ + if (IsLinkTaskFinished()) + { + DestroyTask(taskId); + gTasks[gUnknown_0203A034->unk0->taskId].func = sub_80F5F74; + sub_80F7144(); + } +} + +static void sub_80F5F74(u8 taskId) +{ + s16 var0; + + if (gTasks[taskId].data[0] == 0) + { + CreateTask(sub_80F68F0, 20); + var0 = sub_80F6B78(gText_AnnouncingResults, gUnknown_0203A034->unk0->unk0); + sub_80F6E9C(var0, 144, 120, 1088); + gTasks[taskId].data[0]++; + } + else if (gTasks[taskId].data[0] == 1) + { + if (gUnknown_0203A034->unk0->unk4 == 0) + { + gTasks[taskId].data[1] = 0; + gTasks[taskId].data[0]++; + } + } + else if (gTasks[taskId].data[0] == 2) + { + if (++gTasks[taskId].data[1] == 21) + { + gTasks[taskId].data[1] = 0; + gTasks[taskId].data[0]++; + } + } + else if (gTasks[taskId].data[0] == 3) + { + var0 = sub_80F6B78(gText_PreliminaryResults, gUnknown_0203A034->unk0->unk0); + sub_80F6E9C(var0, 144, -1, 1088); + gTasks[taskId].data[0]++; + } + else if (gTasks[taskId].data[0] == 4) + { + if (gUnknown_0203A034->unk0->unk4 == 2) + { + gTasks[taskId].data[0] = 0; + gTasks[taskId].func = sub_80F6058; + } + } +} + +static void sub_80F6058(u8 taskId) +{ + switch (gTasks[taskId].data[0]) + { + case 0: + if (!gUnknown_0203A034->unk0->unkA) + { + sub_80F7A80(0, gTasks[taskId].data[2]++); + if (!gUnknown_0203A034->unk0->unk14) + gTasks[taskId].data[0] = 2; + else + gTasks[taskId].data[0]++; + } + break; + case 1: + if (!gUnknown_0203A034->unk0->unk14) + gTasks[taskId].data[0] = 0; + break; + case 2: + sub_80F6EF4(1088); + gTasks[taskId].data[0] = 0; + gTasks[taskId].data[2] = 0; + gTasks[taskId].func = sub_80F60F0; + break; + } +} + +static void sub_80F60F0(u8 taskId) +{ + s16 var0; + + if (gUnknown_0203A034->unk0->unk4 == 0) + { + if (++gTasks[taskId].data[1] == 21) + { + gTasks[taskId].data[1] = 0; + var0 = sub_80F6B78(gText_Round2Results, gUnknown_0203A034->unk0->unk0); + sub_80F6E9C(var0, 144, -1, 1088); + } + } + else if (gUnknown_0203A034->unk0->unk4 == 2) + { + gTasks[taskId].func = sub_80F616C; + } +} + +static void sub_80F616C(u8 taskId) +{ + switch (gTasks[taskId].data[0]) + { + case 0: + if (!gUnknown_0203A034->unk0->unkA) + { + sub_80F7A80(1, gTasks[taskId].data[2]++); + if (!gUnknown_0203A034->unk0->unk14) + gTasks[taskId].data[0] = 2; + else + gTasks[taskId].data[0]++; + } + break; + case 1: + if (!gUnknown_0203A034->unk0->unk14) + gTasks[taskId].data[0] = 0; + break; + case 2: + sub_80F6EF4(1088); + gTasks[taskId].data[0] = 0; + gTasks[taskId].func = sub_80F6204; + break; + } +} + +static void sub_80F6204(u8 taskId) +{ + int i; + u8 newTaskId; + u8 buffer[100]; + s16 var0; + + switch (gTasks[taskId].data[0]) + { + case 0: + if (!gUnknown_0203A034->unk0->unk4) + gTasks[taskId].data[0]++; + break; + case 1: + if (++gTasks[taskId].data[1] == 31) + { + gTasks[taskId].data[1] = 0; + gTasks[taskId].data[0]++; + } + break; + case 2: + for (i = 0; i < 4; i++) + { + newTaskId = CreateTask(sub_80F73DC, 10); + gTasks[newTaskId].data[0] = gContestFinalStandings[i]; + gTasks[newTaskId].data[1] = i; + } + gTasks[taskId].data[0]++; + break; + case 3: + if (gUnknown_0203A034->unk0->unk5 == 4) + { + if (++gTasks[taskId].data[1] == 31) + { + gTasks[taskId].data[1] = 0; + CreateTask(sub_80F74BC, 10); + gTasks[taskId].data[0]++; + for (i = 0; i < 4 && gContestFinalStandings[i] != 0; i++) + ; + + sub_80F77E0(i, 14); + } + } + break; + case 4: + if (++gTasks[taskId].data[1] == 21) + { + gTasks[taskId].data[1] = 0; + for (i = 0; i < 4 && gContestFinalStandings[i] != 0; i++) + ; + + StringCopy(gStringVar1, gContestMons[i].trainerName); + sub_81DB5AC(gStringVar1); + StringCopy(gStringVar2, gContestMons[i].nickname); + StringExpandPlaceholders(buffer, gText_Var1sVar2Won); + var0 = sub_80F6B78(buffer, gUnknown_0203A034->unk0->unk0); + sub_80F6E9C(var0, 144, -1, 1088); + gTasks[taskId].data[0]++; + } + break; + case 5: + gTasks[taskId].data[0] = 0; + gTasks[taskId].func = sub_80F6404; + break; + } +} + +static void sub_80F6404(u8 taskId) +{ + int i; + u8 spriteId; + u16 species; + u32 otId; + u32 personality; + const struct CompressedSpritePalette *pokePal; + + switch (gTasks[taskId].data[0]) + { + case 0: + gBattle_WIN0H = 0x00F0; + gBattle_WIN0V = 0x5050; + for (i = 0; i < 4 && gContestFinalStandings[i] != 0; i++) + ; + + species = gContestMons[i].species; + personality = gContestMons[i].personality; + otId = gContestMons[i].otId; + if (i == gContestPlayerMonIndex) + { + HandleLoadSpecialPokePic_2( + &gMonFrontPicTable[species], + gMonSpritesGfxPtr->sprites[1], + species, + personality); + } + else + { + HandleLoadSpecialPokePic_DontHandleDeoxys( + &gMonFrontPicTable[species], + gMonSpritesGfxPtr->sprites[1], + species, + personality); + } + + pokePal = GetMonSpritePalStructFromOtIdPersonality(species, otId, personality); + LoadCompressedSpritePalette(pokePal); + SetMultiuseSpriteTemplateToPokemon(species, B_POSITION_OPPONENT_LEFT); + gMultiuseSpriteTemplate.paletteTag = pokePal->tag; + spriteId = CreateSprite(&gMultiuseSpriteTemplate, 272, 80, 10); + gSprites[spriteId].data[1] = species; + gSprites[spriteId].oam.priority = 0; + gSprites[spriteId].callback = sub_80F75A8; + gUnknown_0203A034->unk0->spriteId = spriteId; + LoadCompressedSpriteSheet(gUnknown_0858D878); + LoadCompressedSpritePalette(gUnknown_0858D880); + CreateTask(sub_80F7670, 10); + gTasks[taskId].data[0]++; + break; + case 1: + if (++gTasks[taskId].data[3] == 1) + { + u8 counter; + gTasks[taskId].data[3] = 0; + gTasks[taskId].data[2] += 2; + if (gTasks[taskId].data[2] > 32) + gTasks[taskId].data[2] = 32; + + counter = gTasks[taskId].data[2]; + gBattle_WIN0V = ((80 - counter) << 8) | (80 + counter); + if (counter == 32) + gTasks[taskId].data[0]++; + } + break; + case 2: + if (gUnknown_0203A034->unk0->unk6 == 1) + gTasks[taskId].data[0]++; + break; + case 3: + if (++gTasks[taskId].data[1] == 121) + { + gTasks[taskId].data[1] = 0; + gSprites[gUnknown_0203A034->unk0->spriteId].callback = sub_80F7620; + gTasks[taskId].data[0]++; + } + break; + case 4: + if (gUnknown_0203A034->unk0->unk6 == 2) + { + u8 top = (gBattle_WIN0V >> 8); + top += 2; + if (top > 80) + top = 80; + + gBattle_WIN0V = (top << 8) | (160 - top);; + if (top == 80) + gTasks[taskId].data[0]++; + } + break; + case 5: + if (gUnknown_0203A034->unk0->unk6 == 2) + { + gUnknown_0203A034->unk0->unk9 = 1; + gTasks[taskId].data[0] = 0; + gTasks[taskId].func = sub_80F66B4; + } + break; + } +} + +static void sub_80F66B4(u8 taskId) +{ + int i; + u16 nationalDexNum; + + if (gMain.newKeys & A_BUTTON) + { + if (!(gIsLinkContest & 0x1)) + { + for (i = 0; i < 4; i++) + { + nationalDexNum = SpeciesToNationalPokedexNum(gContestMons[i].species); + GetSetPokedexFlag(nationalDexNum, FLAG_SET_SEEN); + } + } + + gTasks[taskId].data[10] = 0; + gTasks[taskId].func = sub_80F671C; + } +} + +static void sub_80F671C(u8 taskId) +{ + if (gIsLinkContest & 0x1) + { + if (!gTasks[taskId].data[10]) + { + sub_80F707C(gText_CommunicationStandby); + sub_800AC34(); + gTasks[taskId].func = sub_80F677C; + } + } + else + { + gTasks[taskId].func = sub_80F67C4; + } +} + +static void sub_80F677C(u8 taskId) +{ + if (!gReceivedRemoteLinkPlayers) + { + if (gIsLinkContest & 0x2) + sub_800E084(); + + sub_80F7144(); + gTasks[taskId].func = sub_80F67C4; + } +} + +static void sub_80F67C4(u8 taskId) +{ + if (!(gIsLinkContest & 0x1)) + BravoTrainerPokemonProfile_BeforeInterview2(gContestFinalStandings[gContestPlayerMonIndex]); + + BeginHardwarePaletteFade(0xFF, 0, 0, 16, 0); + gTasks[taskId].func = sub_80F6820; +} + +static void sub_80F6820(u8 taskId) +{ + if (!gPaletteFade.active) + { + if (gTasks[taskId].data[1] == 0) + { + DestroyTask(gUnknown_0203A034->unk0->unk3); + BlendPalettes(0x0000FFFF, 16, RGB_BLACK); + gTasks[taskId].data[1]++; + } + else if (gTasks[taskId].data[1] == 1) + { + BlendPalettes(0xFFFF0000, 16, RGB_BLACK); + gTasks[taskId].data[1]++; + } + else + { + SetGpuReg(REG_OFFSET_BLDCNT, 0); + SetGpuReg(REG_OFFSET_BLDY, 0); + DestroyTask(taskId); + FreeAllWindowBuffers(); + SetMainCallback2(CB2_ReturnToFieldContinueScriptPlayMapMusic); + sub_80F7E64(); + } + } +} + +static void sub_80F68B4(u8 taskId) +{ + gBattle_BG3_X += 2; + gBattle_BG3_Y += 1; + if (gBattle_BG3_X > 255) + gBattle_BG3_X -= 255; + if (gBattle_BG3_Y > 255) + gBattle_BG3_Y -= 255; +} + +static void sub_80F68F0(u8 taskId) +{ + if (++gTasks[taskId].data[0] == 2) + { + gTasks[taskId].data[0] = 0; + if (gTasks[taskId].data[2] == 0) + gTasks[taskId].data[1]++; + else + gTasks[taskId].data[1]--; + + if (gTasks[taskId].data[1] == 16) + gTasks[taskId].data[2] = 1; + else if (gTasks[taskId].data[1] == 0) + gTasks[taskId].data[2] = 0; + + BlendPalette(0x6B, 1, gTasks[taskId].data[1], RGB(30, 22, 11)); + BlendPalette(0x68, 1, gTasks[taskId].data[1], RGB_WHITE); + BlendPalette(0x6E, 1, gTasks[taskId].data[1], RGB(30, 29, 29)); + } + + if (gTasks[taskId].data[1] == 0) + gUnknown_0203A034->unk0->unkA = 0; + else + gUnknown_0203A034->unk0->unkA = 1; +} + +void sub_80F69B8(u16 species, u8 monIndex, u8 arg2, u8 arg3, u32 personality) +{ + u8 frameNum; + const u8 *iconPtr; + u16 var0; + u16 var1; + + u8 *contestPlayerMonIndex = &gContestPlayerMonIndex; // fake match + frameNum = (monIndex == *contestPlayerMonIndex) ? 1 : 0; + + iconPtr = GetMonIconPtr(species, personality, frameNum); + iconPtr += arg2 * 0x200 + 0x80; + if (arg3) + { + RequestDma3Copy(iconPtr, (void *)BG_CHAR_ADDR(1) + monIndex * 0x200, 0x180, 1); + var0 = ((monIndex + 10) << 12); + var1 = (monIndex * 0x10 + 0x200); + WriteSequenceToBgTilemapBuffer(1, var1 | var0, 3, monIndex * 3 + 4, 4, 3, 17, 1); + } + else + { + RequestDma3Copy(iconPtr, (void *)BG_CHAR_ADDR(1) + monIndex * 0x200, 0x180, 1); + } +} + +static void sub_80F6A64(u8 arg0, u8 arg1) +{ + int i; + + for (i = 0; i < 4; i++) + sub_80F69B8(gContestMons[i].species, i, arg0, arg1, gContestMons[i].personality); +} + +static void sub_80F6A9C(void) +{ + int i; + register u16 species asm("r0"); + + for (i = 0; i < 4; i++) + { + species = GetIconSpecies(gContestMons[i].species, 0); + LoadPalette(gMonIconPalettes[gMonIconPaletteIndices[species]], i * 0x10 + 0xA0, 0x20); + } +} + +static void sub_80F6AE8(void) +{ + u16 sheet; + u8 spriteId; + + if (gIsLinkContest & 0x2) + { + sub_800E0E8(); + CreateWirelessStatusIndicatorSprite(8, 8); + gSprites[gWirelessStatusIndicatorSpriteId].subpriority = 1; + sheet = LoadSpriteSheet(&gUnknown_0858D8E0); + RequestDma3Fill(0xFFFFFFFF, (void *)BG_CHAR_ADDR(4) + sheet * 0x20, 0x80, 1); + spriteId = CreateSprite(&gSpriteTemplate_858D8C8, 8, 8, 0); + gSprites[spriteId].oam.objMode = ST_OAM_OBJ_WINDOW; + } +} + +// s16 sub_80F6B78(const u8 *text, u8 spriteId) +// { +// int i; +// int origWidth, strWidth; +// const u8 *r8; +// u8 sp10[0x10]; +// struct WindowTemplate windowTemplate; +// int spC; +// u8 *windowTileData; +// u8 windowId; + +// memset(windowTemplate, 0, sizeof(*windowTemplate)); +// windowTemplate.width = 30; +// windowTemplate.height = 2; +// windowId = AddWindow(&windowTemplate); +// FillWindowPixelBuffer(windowId, 0x11); +// origWidth = GetStringWidth(1, text, 0) + 9; +// strWidth = origWidth; +// if (strWidth < 0) +// strWidth += 7; + +// strWidth >>= 3; +// if (strWidth > 30) +// strWidth = 30; + +// AddTextPrinterParameterized3(windowId, 1, (strWidth * 8 - origWidth) / 2, 1, gUnknown_0858D8E8, -1, text); +// windowTileData = (u8 *)GetWindowAttribute(windowId, WINDOW_TILE_DATA); +// r8 = gUnknown_0858D6D0; +// // .... +// } + +NAKED +s16 sub_80F6B78(const u8 *text, u8 spriteId) +{ + 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, 0x44\n\ + adds r5, r0, 0\n\ + lsls r1, 24\n\ + lsrs r7, r1, 24\n\ + add r4, sp, 0x20\n\ + adds r0, r4, 0\n\ + movs r1, 0\n\ + movs r2, 0x8\n\ + bl memset\n\ + movs r0, 0x1E\n\ + strb r0, [r4, 0x3]\n\ + movs r0, 0x2\n\ + strb r0, [r4, 0x4]\n\ + adds r0, r4, 0\n\ + bl AddWindow\n\ + lsls r6, r0, 24\n\ + lsrs r4, r6, 24\n\ + adds r0, r4, 0\n\ + movs r1, 0x11\n\ + bl FillWindowPixelBuffer\n\ + movs r0, 0x1\n\ + adds r1, r5, 0\n\ + movs r2, 0\n\ + bl GetStringWidth\n\ + adds r2, r0, 0\n\ + adds r2, 0x9\n\ + cmp r2, 0\n\ + bge _080F6BC4\n\ + adds r2, 0x7\n\ +_080F6BC4:\n\ + asrs r2, 3\n\ + mov r10, r2\n\ + cmp r2, 0x1E\n\ + ble _080F6BD0\n\ + movs r1, 0x1E\n\ + mov r10, r1\n\ +_080F6BD0:\n\ + mov r1, r10\n\ + lsls r2, r1, 3\n\ + subs r2, r0\n\ + lsrs r0, r2, 31\n\ + adds r2, r0\n\ + asrs r2, 1\n\ + lsls r2, 24\n\ + lsrs r2, 24\n\ + ldr r0, =gUnknown_0858D8E8\n\ + str r0, [sp]\n\ + movs r0, 0x1\n\ + negs r0, r0\n\ + str r0, [sp, 0x4]\n\ + str r5, [sp, 0x8]\n\ + adds r0, r4, 0\n\ + movs r1, 0x1\n\ + movs r3, 0x1\n\ + bl AddTextPrinterParameterized3\n\ + adds r0, r4, 0\n\ + movs r1, 0x7\n\ + bl GetWindowAttribute\n\ + mov r9, r0\n\ + ldr r2, =gUnknown_0858D6D0\n\ + mov r8, r2\n\ + lsls r1, r7, 4\n\ + adds r1, r7\n\ + lsls r1, 2\n\ + ldr r3, =gSprites\n\ + adds r1, r3\n\ + ldrh r0, [r1, 0x4]\n\ + lsls r0, 22\n\ + lsrs r0, 17\n\ + ldr r2, =0x06010000\n\ + adds r0, r2\n\ + str r0, [sp, 0xC]\n\ + str r6, [sp, 0x38]\n\ + mov r7, sp\n\ + adds r7, 0x1C\n\ + str r7, [sp, 0x2C]\n\ + mov r0, r10\n\ + adds r0, 0x2\n\ + str r0, [sp, 0x30]\n\ + movs r5, 0\n\ + add r7, sp, 0x10\n\ + mov r12, r7\n\ + adds r6, r1, 0\n\ + adds r6, 0x2E\n\ + movs r4, 0x2\n\ +_080F6C34:\n\ + adds r0, r6, r5\n\ + movs r7, 0\n\ + ldrsh r1, [r0, r7]\n\ + lsls r0, r1, 4\n\ + adds r0, r1\n\ + lsls r0, 2\n\ + adds r0, r3\n\ + ldrh r0, [r0, 0x4]\n\ + lsls r0, 22\n\ + lsrs r0, 17\n\ + adds r0, r2\n\ + mov r1, r12\n\ + adds r1, 0x4\n\ + mov r12, r1\n\ + subs r1, 0x4\n\ + stm r1!, {r0}\n\ + adds r5, 0x2\n\ + subs r4, 0x1\n\ + cmp r4, 0\n\ + bge _080F6C34\n\ + mov r7, r8\n\ + adds r7, 0x80\n\ + mov r2, r8\n\ + adds r2, 0x40\n\ + str r2, [sp, 0x28]\n\ + mov r0, r8\n\ + adds r0, 0x20\n\ + str r0, [sp, 0x3C]\n\ + mov r1, r8\n\ + adds r1, 0xA0\n\ + str r1, [sp, 0x40]\n\ + adds r2, 0x20\n\ + str r2, [sp, 0x34]\n\ + add r5, sp, 0xC\n\ + movs r6, 0\n\ + movs r4, 0x3\n\ +_080F6C7C:\n\ + str r6, [sp, 0x1C]\n\ + ldm r5!, {r1}\n\ + ldr r0, [sp, 0x2C]\n\ + ldr r2, =0x05000100\n\ + bl CpuSet\n\ + subs r4, 0x1\n\ + cmp r4, 0\n\ + bge _080F6C7C\n\ + ldr r5, [sp, 0xC]\n\ + ldr r6, =0x04000008\n\ + mov r0, r8\n\ + adds r1, r5, 0\n\ + adds r2, r6, 0\n\ + bl CpuSet\n\ + movs r0, 0x80\n\ + lsls r0, 1\n\ + adds r1, r5, r0\n\ + adds r0, r7, 0\n\ + adds r2, r6, 0\n\ + bl CpuSet\n\ + movs r2, 0x80\n\ + lsls r2, 2\n\ + adds r1, r5, r2\n\ + adds r0, r7, 0\n\ + adds r2, r6, 0\n\ + bl CpuSet\n\ + movs r7, 0xC0\n\ + lsls r7, 2\n\ + adds r1, r5, r7\n\ + ldr r0, [sp, 0x28]\n\ + adds r2, r6, 0\n\ + bl CpuSet\n\ + movs r4, 0\n\ + cmp r4, r10\n\ + bge _080F6D32\n\ + adds r7, r6, 0\n\ +_080F6CCE:\n\ + adds r6, r4, 0x1\n\ + adds r0, r6, 0\n\ + cmp r6, 0\n\ + bge _080F6CDA\n\ + adds r0, r4, 0\n\ + adds r0, 0x8\n\ +_080F6CDA:\n\ + asrs r0, 3\n\ + lsls r1, r0, 2\n\ + add r1, sp\n\ + adds r1, 0xC\n\ + lsls r0, 3\n\ + subs r0, r6, r0\n\ + lsls r0, 5\n\ + ldr r1, [r1]\n\ + adds r5, r1, r0\n\ + mov r0, r8\n\ + adds r0, 0xC0\n\ + adds r1, r5, 0\n\ + adds r2, r7, 0\n\ + bl CpuSet\n\ + movs r0, 0x80\n\ + lsls r0, 1\n\ + adds r1, r5, r0\n\ + mov r0, r9\n\ + adds r2, r7, 0\n\ + bl CpuSet\n\ + movs r0, 0xF0\n\ + lsls r0, 2\n\ + add r0, r9\n\ + movs r2, 0x80\n\ + lsls r2, 2\n\ + adds r1, r5, r2\n\ + adds r2, r7, 0\n\ + bl CpuSet\n\ + movs r0, 0xC0\n\ + lsls r0, 2\n\ + adds r1, r5, r0\n\ + mov r0, r8\n\ + adds r0, 0xE0\n\ + adds r2, r7, 0\n\ + bl CpuSet\n\ + movs r1, 0x20\n\ + add r9, r1\n\ + adds r4, r6, 0\n\ + cmp r4, r10\n\ + blt _080F6CCE\n\ +_080F6D32:\n\ + adds r2, r4, 0x1\n\ + adds r0, r2, 0\n\ + cmp r2, 0\n\ + bge _080F6D3E\n\ + adds r0, r4, 0\n\ + adds r0, 0x8\n\ +_080F6D3E:\n\ + asrs r0, 3\n\ + lsls r1, r0, 2\n\ + add r1, sp\n\ + adds r1, 0xC\n\ + lsls r0, 3\n\ + subs r0, r2, r0\n\ + lsls r0, 5\n\ + ldr r1, [r1]\n\ + adds r5, r1, r0\n\ + ldr r4, =0x04000008\n\ + ldr r0, [sp, 0x3C]\n\ + adds r1, r5, 0\n\ + adds r2, r4, 0\n\ + bl CpuSet\n\ + movs r2, 0x80\n\ + lsls r2, 1\n\ + adds r1, r5, r2\n\ + ldr r0, [sp, 0x40]\n\ + adds r2, r4, 0\n\ + bl CpuSet\n\ + movs r7, 0x80\n\ + lsls r7, 2\n\ + adds r1, r5, r7\n\ + ldr r0, [sp, 0x40]\n\ + adds r2, r4, 0\n\ + bl CpuSet\n\ + movs r0, 0xC0\n\ + lsls r0, 2\n\ + adds r1, r5, r0\n\ + ldr r0, [sp, 0x34]\n\ + adds r2, r4, 0\n\ + bl CpuSet\n\ + ldr r1, [sp, 0x38]\n\ + lsrs r0, r1, 24\n\ + bl RemoveWindow\n\ + ldr r2, [sp, 0x30]\n\ + lsls r1, r2, 3\n\ + movs r0, 0xF0\n\ + subs r0, r1\n\ + asrs r0, 1\n\ + add sp, 0x44\n\ + pop {r3-r5}\n\ + mov r8, r3\n\ + mov r9, r4\n\ + mov r10, r5\n\ + pop {r4-r7}\n\ + pop {r1}\n\ + bx r1\n\ + .pool"); +} + +static void sub_80F6DC0(void) +{ + int i; + struct SpriteTemplate template; + u8 spriteIds[8]; + + template = gSpriteTemplate_858D7F8; + for (i = 0; i < 8; i++) + LoadSpriteSheet(&gUnknown_0858D810[i]); + + LoadSpritePalette(&gUnknown_0858D850); + for (i = 0; i < 8; i++) + { + spriteIds[i] = CreateSprite(&template, 272, 144, 10); + template.tileTag++; + } + + gSprites[spriteIds[0]].data[0] = spriteIds[1]; + gSprites[spriteIds[0]].data[1] = spriteIds[2]; + gSprites[spriteIds[0]].data[2] = spriteIds[3]; + + gSprites[spriteIds[4]].data[0] = spriteIds[5]; + gSprites[spriteIds[4]].data[1] = spriteIds[6]; + gSprites[spriteIds[4]].data[2] = spriteIds[7]; + + gUnknown_0203A034->unk0->unk0 = spriteIds[0]; + gUnknown_0203A034->unk0->unk4 = 0; + gUnknown_0203A034->unk0->unk1 = spriteIds[4]; + sub_80F7144(); +} + +static void sub_80F6E9C(s16 arg0, u16 y, u16 arg2, u16 arg3) +{ + struct Sprite *sprite = &gSprites[gUnknown_0203A034->unk0->unk0]; + sprite->pos1.x = 272; + sprite->pos1.y = y; + sprite->pos2.x = 0; + sprite->pos2.y = 0; + sprite->data[4] = arg0 + 32; + sprite->data[5] = arg2; + sprite->data[6] = arg3; + sprite->data[7] = 0; + sprite->callback = sub_80F6F68; + gUnknown_0203A034->unk0->unk4 = 1; +} + +static void sub_80F6EF4(u16 arg0) +{ + struct Sprite *sprite = &gSprites[gUnknown_0203A034->unk0->unk0]; + sprite->pos1.x += sprite->pos2.x; + sprite->pos1.y += sprite->pos2.y; + sprite->pos2.y = 0; + sprite->pos2.x = 0; + sprite->data[6] = arg0; + sprite->data[7] = 0; + sprite->callback = sub_80F7014; + gUnknown_0203A034->unk0->unk4 = 3; +} + +static void sub_80F6F40(struct Sprite *sprite) +{ + sprite->pos1.x = 272; + sprite->pos1.y = 144; + sprite->pos2.y = 0; + sprite->pos2.x = 0; + sprite->callback = SpriteCallbackDummy; + gUnknown_0203A034->unk0->unk4 = 0; +} + +static void sub_80F6F68(struct Sprite *sprite) +{ + int i; + s16 var0; + + var0 = (u16)sprite->data[7] + (u16)sprite->data[6]; + sprite->pos1.x -= var0 >> 8; + sprite->data[7] = (sprite->data[6] + sprite->data[7]) & 0xFF; + if (sprite->pos1.x < sprite->data[4]) + sprite->pos1.x = sprite->data[4]; + + for (i = 0; i < 3; i++) + { + struct Sprite *sprite2 = &gSprites[sprite->data[i]]; + sprite2->pos1.x = sprite->pos1.x + sprite->pos2.x + (i + 1) * 64; + } + + if (sprite->pos1.x == sprite->data[4]) + sprite->callback = sub_80F6FDC; +} + +static void sub_80F6FDC(struct Sprite *sprite) +{ + gUnknown_0203A034->unk0->unk4 = 2; + if ((u16)sprite->data[5] != 0xFFFF) + { + if (--sprite->data[5] == -1) + sub_80F6EF4(sprite->data[6]); + } +} + +static void sub_80F7014(struct Sprite *sprite) +{ + int i; + s16 var0; + + var0 = (u16)sprite->data[7] + (u16)sprite->data[6]; + sprite->pos1.x -= var0 >> 8; + sprite->data[7] = (sprite->data[6] + sprite->data[7]) & 0xFF; + for (i = 0; i < 3; i++) + { + struct Sprite *sprite2 = &gSprites[sprite->data[i]]; + sprite2->pos1.x = sprite->pos1.x + sprite->pos2.x + (i + 1) * 64; + } + + if (sprite->pos1.x + sprite->pos2.x < -224) + sub_80F6F40(sprite); +} + +static void sub_80F707C(const u8 *text) +{ + int i; + u16 x; + struct Sprite *sprite; + + x = sub_80F6B78(text, gUnknown_0203A034->unk0->unk1); + sprite = &gSprites[gUnknown_0203A034->unk0->unk1]; + sprite->pos1.x = x + 32; + sprite->pos1.y = 80; + sprite->invisible = 0; + for (i = 0; i < 3; i++) + { + gSprites[sprite->data[i]].pos1.x = sprite->pos1.x + sprite->pos2.x + (i + 1) * 64; + gSprites[sprite->data[i]].pos1.y = sprite->pos1.y; + gSprites[sprite->data[i]].invisible = 0; + } + + gBattle_WIN0H = 0x00F0; + gBattle_WIN0V = ((sprite->pos1.y - 16) << 8) | (sprite->pos1.y + 16); + SetGpuReg(REG_OFFSET_WININ, WININ_WIN1_BG_ALL | WININ_WIN1_OBJ | WININ_WIN1_CLR + | WININ_WIN0_BG1 | WININ_WIN0_BG2 | WININ_WIN0_BG3 | WININ_WIN0_OBJ | WININ_WIN0_CLR); +} + +static void sub_80F7144(void) +{ + int i; + struct Sprite *sprite; + + sprite = &gSprites[gUnknown_0203A034->unk0->unk1]; + sprite->invisible = 1; + for (i = 0; i < 3; i++) + gSprites[sprite->data[i]].invisible = 1; + + gBattle_WIN0H = 0; + gBattle_WIN0V = 0; + SetGpuReg(REG_OFFSET_WIN0H, gBattle_WIN0H); + SetGpuReg(REG_OFFSET_WIN0V, gBattle_WIN0V); + SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG_ALL | WININ_WIN0_OBJ | WININ_WIN0_CLR + | WININ_WIN1_BG_ALL | WININ_WIN1_OBJ | WININ_WIN1_CLR); +} + +static void sub_80F71C8(void) +{ + u8 palette; + int x, y; + + x = 5; + y = 1; + if (gIsLinkContest & 0x1) + { + CopyToBgTilemapBufferRect(2, gUnknown_08DC6498, 5, 1, 5, 2); + x = 10; + } + else if (gSpecialVar_ContestRank == 0) + { + CopyToBgTilemapBufferRect(2, gUnknown_08DC63F8, 5, 1, 10, 2); + x = 15; + } + else if (gSpecialVar_ContestRank == 1) + { + CopyToBgTilemapBufferRect(2, gUnknown_08DC6420, 5, 1, 10, 2); + x = 15; + } + else if (gSpecialVar_ContestRank == 2) + { + CopyToBgTilemapBufferRect(2, gUnknown_08DC6448, 5, 1, 10, 2); + x = 15; + } + else + { + CopyToBgTilemapBufferRect(2, gUnknown_08DC6470, 5, 1, 10, 2); + x = 15; + } + + if (gSpecialVar_ContestCategory == 0) + { + palette = 0; + CopyToBgTilemapBufferRect(2, gUnknown_08DC64AC, x, y, 5, 2); + } + else if (gSpecialVar_ContestCategory == 1) + { + palette = 1; + CopyToBgTilemapBufferRect(2, gUnknown_08DC64C0, x, y, 5, 2); + } + else if (gSpecialVar_ContestCategory == 2) + { + palette = 2; + CopyToBgTilemapBufferRect(2, gUnknown_08DC64D4, x, y, 5, 2); + } + else if (gSpecialVar_ContestCategory == 3) + { + palette = 3; + CopyToBgTilemapBufferRect(2, gUnknown_08DC64E8, x, y, 5, 2); + } + else + { + palette = 4; + CopyToBgTilemapBufferRect(2, gUnknown_08DC64FC, x, y, 5, 2); + } + + x += 5; + CopyToBgTilemapBufferRect(2, gUnknown_08DC6510, x, y, 6, 2); + CopyToBgTilemapBufferRect_ChangePalette(2, gUnknown_0203A034->unkC[2], 0, 0, 32, 4, palette); +} + +// fakematching? +u8 sub_80F7310(u8 monIndex, u8 arg1) +{ + u32 var0; + u32 var1; + + var0 = gContestMonConditions[monIndex] << 16; + var1 = var0 / 0x3F; + if (var1 & 0xFFFF) + var1 += 0x10000; + + var1 >>= 16; + if (var1 == 0 && var0) + var1 = 1; + + if (arg1 && var1 > 10) + var1 = 10; + + return var1; +} diff --git a/src/contest_painting.c b/src/contest_painting.c index 9de3d733d..0ed169a77 100644 --- a/src/contest_painting.c +++ b/src/contest_painting.c @@ -20,9 +20,6 @@ #include "window.h" #include "constants/rgb.h" -extern u8 gUnknown_02039F5C; -extern u8 gUnknown_02039F5D; - extern u16 (*gUnknown_03006190)[][32]; extern struct ContestWinner *gUnknown_030061C0; extern u16 *gContestPaintingMonPalette; @@ -1516,7 +1516,7 @@ void BravoTrainerPokemonProfile_BeforeInterview1(u16 a0) } } -void BravoTrainerPokemonProfile_BeforeInterview2(u8 a0) +void BravoTrainerPokemonProfile_BeforeInterview2(u8 contestStandingPlace) { TVShow *show; @@ -1524,7 +1524,7 @@ void BravoTrainerPokemonProfile_BeforeInterview2(u8 a0) sCurTVShowSlot = FindEmptyTVSlotWithinFirstFiveShowsOfArray(gSaveBlock1Ptr->tvShows); if (sCurTVShowSlot != -1) { - show->bravoTrainer.contestResult = a0; + show->bravoTrainer.contestResult = contestStandingPlace; show->bravoTrainer.contestCategory = gSpecialVar_ContestCategory; show->bravoTrainer.contestRank = gSpecialVar_ContestRank; show->bravoTrainer.species = GetMonData(&gPlayerParty[gContestMonPartyIndex], MON_DATA_SPECIES, NULL); |