summaryrefslogtreecommitdiff
path: root/src/berry_tag_screen.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/berry_tag_screen.c')
-rw-r--r--src/berry_tag_screen.c453
1 files changed, 453 insertions, 0 deletions
diff --git a/src/berry_tag_screen.c b/src/berry_tag_screen.c
new file mode 100644
index 000000000..9fbfd0681
--- /dev/null
+++ b/src/berry_tag_screen.c
@@ -0,0 +1,453 @@
+#include "global.h"
+#include "berry_tag_screen.h"
+#include "berry.h"
+#include "decompress.h"
+#include "event_object_movement.h"
+#include "item_menu.h"
+#include "constants/items.h"
+#include "item_use.h"
+#include "main.h"
+#include "menu.h"
+#include "menu_helpers.h"
+#include "palette.h"
+#include "overworld.h"
+#include "constants/songs.h"
+#include "sound.h"
+#include "sprite.h"
+#include "string_util.h"
+#include "strings.h"
+#include "task.h"
+#include "text.h"
+
+#define OFFSET_7B (123)
+#define FIRST_BERRY ITEM_CHERI_BERRY
+
+struct Struct2000000
+{
+ /*0x00*/ u8 filler_0[0x1FFFF];
+ /*0x1FFFF*/ u8 var_1FFFF;
+};
+
+extern struct Struct2000000 gSharedMem;
+extern u16 gBattle_BG1_Y;
+
+static EWRAM_DATA u8 gUnknown_0203932C = 0;
+static EWRAM_DATA s16 gUnknown_0203932E[5] = {0};
+
+extern const struct CompressedSpriteSheet gUnknown_083C1F74;
+extern const struct CompressedSpritePalette gUnknown_083C1F7C;
+
+extern u8 gBerryCheck_Gfx[];
+extern u8 gBerryCheck_Pal[];
+extern u8 gUnknown_08E788E4[];
+extern u8 gUnknown_08E78A84[];
+
+const u8 *const gUnknown_0841192C[] =
+{
+ ContestStatsText_VerySoft,
+ ContestStatsText_Soft,
+ ContestStatsText_Hard,
+ ContestStatsText_VeryHard,
+ ContestStatsText_SuperHard,
+};
+
+static void sub_8146014(void);
+static void sub_814602C(void);
+static bool8 sub_8146058(void);
+static void sub_8146288(void);
+static bool8 sub_81462B8(void);
+static void sub_814640C(u8 taskId);
+static void sub_8146440(u8 taskId);
+static void sub_8146480(u8 taskid);
+static void sub_81464E4(void);
+static void sub_8146600(u8 berry);
+static void sub_81466A0(void);
+static void sub_81466E8(u8 taskId, s8 direction);
+static void sub_8146798(u8 berry);
+static void sub_8146810(s8 berry);
+static void sub_81468BC(void);
+
+static void sub_8146014(void)
+{
+ AnimateSprites();
+ BuildOamBuffer();
+ RunTasks();
+ UpdatePaletteFade();
+}
+
+static void sub_814602C(void)
+{
+ REG_BG0VOFS = gBattle_BG1_Y;
+ REG_BG1VOFS = gBattle_BG1_Y;
+
+ LoadOam();
+ ProcessSpriteCopyRequests();
+ TransferPlttBuffer();
+}
+
+static bool8 sub_8146058(void)
+{
+ u8 berry;
+ u16 backup;
+
+ switch (gMain.state)
+ {
+ case 0:
+ ClearVideoCallbacks();
+ sub_80F9368();
+ sub_8146288();
+ REG_BLDCNT = 0;
+ gMain.state += 1;
+ break;
+ case 1:
+ ResetPaletteFade();
+ gPaletteFade.bufferTransferDisabled = 1;
+ gMain.state += 1;
+ break;
+ case 2:
+ ResetSpriteData();
+ gMain.state += 1;
+ break;
+ case 3:
+ Text_LoadWindowTemplate(&gWindowTemplate_81E6E18);
+ gMain.state += 1;
+ break;
+ case 4:
+ MultistepInitMenuWindowBegin(&gWindowTemplate_81E6E18);
+ gMain.state += 1;
+ break;
+ case 5:
+ if (!MultistepInitMenuWindowContinue())
+ break;
+ gSharedMem.var_1FFFF = 0;
+ gMain.state += 1;
+ break;
+ case 6:
+ if (!sub_81462B8())
+ break;
+ gSharedMem.var_1FFFF = 0;
+ gMain.state += 1;
+ break;
+ case 7:
+ sub_81464E4();
+ gMain.state += 1;
+ break;
+ case 8:
+ berry = gSpecialVar_ItemId + OFFSET_7B;
+ gUnknown_0203932C = CreateBerrySprite(berry, 56, 64);
+ gMain.state += 1;
+ break;
+ case 9:
+ sub_8146600(gSpecialVar_ItemId + OFFSET_7B);
+ gMain.state += 1;
+ break;
+ case 10:
+ backup = REG_IME;
+ REG_IME = 0;
+ REG_IE |= INTR_FLAG_VBLANK;
+ REG_IME = backup;
+ REG_DISPSTAT |= DISPSTAT_VBLANK_INTR;
+ SetVBlankCallback(sub_814602C);
+ REG_DISPCNT = DISPCNT_MODE_0 | DISPCNT_OBJ_ON | DISPCNT_BG_ALL_ON | DISPCNT_OBJ_1D_MAP;
+ gMain.state += 1;
+ break;
+ case 11:
+ if (sub_8055870() == TRUE)
+ break;
+ gMain.state += 1;
+ break;
+ case 12:
+ BeginNormalPaletteFade(-1, 0, 0x10, 0, 0);
+ gPaletteFade.bufferTransferDisabled = 0;
+ SetMainCallback2(sub_8146014);
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+void BerryTagScreen_814625C(u8 taskId)
+{
+ do
+ {
+ if (sub_8146058() == TRUE)
+ {
+ CreateTask(sub_8146480, 0);
+ return;
+ }
+ } while (sub_80F9344() != TRUE);
+}
+
+static void sub_8146288(void)
+{
+ REG_BG1CNT = BGCNT_PRIORITY(2) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(5) | BGCNT_16COLOR | BGCNT_TXT256x256;
+ REG_BG2CNT = BGCNT_PRIORITY(0) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(6) | BGCNT_16COLOR | BGCNT_TXT256x256;
+ REG_BG3CNT = BGCNT_PRIORITY(3) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(7) | BGCNT_16COLOR | BGCNT_TXT256x256;
+ gBattle_BG1_Y = 0;
+}
+
+bool8 sub_81462B8(void)
+{
+ u16 i;
+
+ switch (gSharedMem.var_1FFFF)
+ {
+ case 0:
+ LZDecompressVram(gBerryCheck_Gfx, (void *)VRAM);
+ gSharedMem.var_1FFFF += 1;
+ break;
+ case 1:
+ LZDecompressVram(gUnknown_08E788E4, (void *)VRAM + 0x2800);
+ gSharedMem.var_1FFFF += 1;
+ break;
+ case 2:
+ LZDecompressVram(gUnknown_08E78A84, (void *)VRAM + 0x3000);
+ gSharedMem.var_1FFFF += 1;
+ break;
+ case 3:
+ for (i = 0; i < 0x400; i++)
+ {
+ if (gSaveBlock2.playerGender == MALE)
+ gBGTilemapBuffers[2][i] = 0x4042;
+ else
+ gBGTilemapBuffers[2][i] = 0x5042;
+ }
+ DmaCopy16Defvars(3, gBGTilemapBuffers[2], (void *)(VRAM + 0x3800), 0x800);
+ gSharedMem.var_1FFFF += 1;
+ break;
+ case 4:
+ LoadCompressedPalette(gBerryCheck_Pal, 0, 96 * 2);
+ gSharedMem.var_1FFFF += 1;
+ break;
+ case 5:
+ LoadCompressedObjectPic(&gUnknown_083C1F74);
+ gSharedMem.var_1FFFF += 1;
+ break;
+ case 6:
+ LoadCompressedObjectPalette(&gUnknown_083C1F7C);
+ gSharedMem.var_1FFFF = 0;
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+static void sub_814640C(u8 taskId)
+{
+ if (!gPaletteFade.active)
+ {
+ SetMainCallback2(sub_80A5B40);
+ sub_80A7DD4();
+ gpu_pal_allocator_reset__manage_upper_four();
+ DestroyTask(taskId);
+ }
+}
+
+static void sub_8146440(u8 taskId)
+{
+ PlaySE(SE_SELECT);
+ BeginNormalPaletteFade(-1, 0, 0, 0x10, 0);
+ gTasks[taskId].func = sub_814640C;
+}
+
+static void sub_8146480(u8 taskid)
+{
+ if (!gPaletteFade.active)
+ {
+ if ((gMain.newAndRepeatedKeys & (DPAD_RIGHT | DPAD_LEFT | DPAD_UP | DPAD_DOWN)) == DPAD_UP)
+ sub_81466E8(taskid, -1);
+ if ((gMain.newAndRepeatedKeys & (DPAD_RIGHT | DPAD_LEFT | DPAD_UP | DPAD_DOWN)) == DPAD_DOWN)
+ sub_81466E8(taskid, 1);
+ if (gMain.newKeys & A_BUTTON || gMain.newKeys & B_BUTTON)
+ sub_8146440(taskid);
+ }
+}
+
+static void sub_81464E4(void)
+{
+ const struct Berry *berryInfo;
+#ifdef UNITS_IMPERIAL
+ u32 size;
+ s32 sizeMajor;
+ s32 sizeMinor;
+#endif
+#if GERMAN
+ u8 buffer[16];
+#endif
+
+ berryInfo = GetBerryInfo(gSpecialVar_ItemId + OFFSET_7B + 1);
+
+ ConvertIntToDecimalStringN(gStringVar1, gSpecialVar_ItemId - FIRST_BERRY + 1, STR_CONV_MODE_LEADING_ZEROS, 2);
+ Menu_PrintText(gStringVar1, 12, 4);
+
+#if ENGLISH
+ Menu_PrintText(berryInfo->name, 14, 4);
+#elif GERMAN
+ StringCopy(buffer, berryInfo->name);
+ StringAppend(buffer, gOtherText_Berry2);
+ Menu_PrintText(buffer, 14, 4);
+#endif
+
+ Menu_PrintText(berryInfo->description1, 4, 14);
+ Menu_PrintText(berryInfo->description2, 4, 16);
+
+#ifdef UNITS_IMPERIAL
+ size = (berryInfo->size * 1000) / 254;
+ if (size % 10 >= 5)
+ size += 10;
+ sizeMinor = (size % 100) / 10;
+ sizeMajor = size / 100;
+#endif
+
+ Menu_PrintText(gOtherText_Size, 11, 7);
+ if (berryInfo->size != 0)
+ {
+#ifdef UNITS_IMPERIAL
+ ConvertIntToDecimalStringN(gStringVar1, sizeMajor, STR_CONV_MODE_LEFT_ALIGN, 2);
+ ConvertIntToDecimalStringN(gStringVar2, sizeMinor, STR_CONV_MODE_LEFT_ALIGN, 2);
+#else
+ ConvertIntToDecimalStringN(gStringVar1, berryInfo->size / 10, STR_CONV_MODE_LEFT_ALIGN, 2);
+ ConvertIntToDecimalStringN(gStringVar2, berryInfo->size % 10, STR_CONV_MODE_LEFT_ALIGN, 2);
+#endif
+ Menu_PrintText(gContestStatsText_Unknown1, 16, 7);
+ }
+ else
+ {
+ Menu_PrintText(gOtherText_ThreeQuestions2, 16, 7);
+ }
+
+ Menu_PrintText(gOtherText_Firm, 11, 9);
+ if (berryInfo->firmness != 0)
+ Menu_PrintText(gUnknown_0841192C[berryInfo->firmness - 1], 16, 9);
+ else
+ Menu_PrintText(gOtherText_ThreeQuestions2, 16, 9);
+}
+
+static void sub_8146600(u8 berry)
+{
+ const struct Berry *berryInfo;
+ u16 i;
+
+ berryInfo = GetBerryInfo(berry + 1);
+ for (i = 0; i < 5; i++)
+ gUnknown_0203932E[i] = (u16)gUnknown_0203932E[i] | 0xFFFF;
+
+ // argument is the center of the circle
+ if (berryInfo->spicy)
+ gUnknown_0203932E[0] = sub_80A7E5C(48);
+ if (berryInfo->dry)
+ gUnknown_0203932E[1] = sub_80A7E5C(88);
+ if (berryInfo->sweet)
+ gUnknown_0203932E[2] = sub_80A7E5C(128);
+ if (berryInfo->bitter)
+ gUnknown_0203932E[3] = sub_80A7E5C(168);
+ if (berryInfo->sour)
+ gUnknown_0203932E[4] = sub_80A7E5C(208);
+}
+
+static void sub_81466A0(void)
+{
+ u16 i;
+
+ for (i = 0; i < 5; i++)
+ {
+ if (gUnknown_0203932E[i] != -1)
+ {
+ DestroySprite(&gSprites[gUnknown_0203932E[i]]);
+ gUnknown_0203932E[i] = -1;
+ }
+ }
+}
+
+static void sub_81466E8(u8 taskId, s8 direction)
+{
+ u8 berryPocket = 3;
+ s16 *data = gTasks[taskId].data;
+
+ if (gBagPocketScrollStates[berryPocket].scrollTop + gBagPocketScrollStates[berryPocket].cursorPos == 0
+ && direction < 0)
+ return;
+ if (gBagPocketScrollStates[berryPocket].scrollTop + gBagPocketScrollStates[berryPocket].cursorPos + 1 == gBagPocketScrollStates[berryPocket].numSlots
+ && direction > 0)
+ return;
+
+ PlaySE(SE_SELECT);
+ if (gBagPocketScrollStates[berryPocket].scrollTop + gBagPocketScrollStates[berryPocket].cursorPos + direction < 0)
+ data[1] = -(gBagPocketScrollStates[berryPocket].scrollTop + gBagPocketScrollStates[berryPocket].cursorPos);
+ else if (gBagPocketScrollStates[berryPocket].scrollTop + gBagPocketScrollStates[berryPocket].cursorPos + direction >= gBagPocketScrollStates[berryPocket].numSlots)
+ data[1] = gBagPocketScrollStates[berryPocket].numSlots - gBagPocketScrollStates[berryPocket].scrollTop - gBagPocketScrollStates[berryPocket].cursorPos - 1;
+ else
+ data[1] = direction;
+
+ gTasks[taskId].func = sub_8146798;
+
+ if (direction < 0)
+ data[0] = -16;
+ else
+ data[0] = 16;
+
+}
+
+static void sub_8146798(u8 taskId)
+{
+ s16 *taskData = gTasks[taskId].data;
+
+ gBattle_BG1_Y = (gBattle_BG1_Y + taskData[0]) & 0xFF;
+ if ((taskData[0] > 0 && gBattle_BG1_Y == 144)
+ || (taskData[0] < 0 && gBattle_BG1_Y == 112))
+ {
+ sub_8146810(gTasks[taskId].data[1]);
+ sub_81468BC();
+ }
+ if (gBattle_BG1_Y == 0)
+ {
+ gTasks[taskId].data[0] = gBattle_BG1_Y;
+ gTasks[taskId].data[1] = gBattle_BG1_Y;
+ gTasks[taskId].func = sub_8146480;
+ }
+}
+
+static void sub_8146810(s8 berry)
+{
+ u8 berryPocket = 3;
+
+ if (berry > 0)
+ {
+ if (gBagPocketScrollStates[berryPocket].cursorPos + berry > 7)
+ {
+ gBagPocketScrollStates[berryPocket].scrollTop += gBagPocketScrollStates[berryPocket].cursorPos - 7 + berry;
+ gBagPocketScrollStates[berryPocket].cursorPos = 7;
+ }
+ else
+ {
+ gBagPocketScrollStates[berryPocket].cursorPos += berry;
+ }
+ }
+ else
+ {
+ if (gBagPocketScrollStates[berryPocket].cursorPos + berry < 0)
+ {
+ gBagPocketScrollStates[berryPocket].scrollTop += gBagPocketScrollStates[berryPocket].cursorPos + berry;
+ gBagPocketScrollStates[berryPocket].cursorPos = 0;
+ }
+ else
+ {
+ gBagPocketScrollStates[berryPocket].cursorPos += berry;
+ }
+ }
+ gSpecialVar_ItemId = gCurrentBagPocketItemSlots[gBagPocketScrollStates[berryPocket].scrollTop + gBagPocketScrollStates[berryPocket].cursorPos].itemId;
+ DestroySprite(&gSprites[gUnknown_0203932C]);
+ sub_81466A0();
+ sub_80A7DD4();
+}
+
+static void sub_81468BC(void)
+{
+ Menu_EraseWindowRect(0, 4, 29, 19);
+ sub_81464E4();
+
+ // center of berry sprite
+ gUnknown_0203932C = CreateBerrySprite(gSpecialVar_ItemId + OFFSET_7B, 56, 64);
+
+ sub_8146600(gSpecialVar_ItemId + OFFSET_7B);
+}