summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/menu_helpers.c478
1 files changed, 478 insertions, 0 deletions
diff --git a/src/menu_helpers.c b/src/menu_helpers.c
new file mode 100644
index 000000000..3c7227629
--- /dev/null
+++ b/src/menu_helpers.c
@@ -0,0 +1,478 @@
+#include "global.h"
+#include "item_menu.h"
+#include "items.h"
+#include "link.h"
+#include "mail_data.h"
+#include "main.h"
+#include "map_constants.h"
+#include "menu.h"
+#include "menu_helpers.h"
+#include "rom4.h"
+#include "songs.h"
+#include "sound.h"
+#include "sprite.h"
+#include "task.h"
+#include "text.h"
+
+extern u8 gUnknown_020388C0[4];
+extern struct YesNoFuncTable gUnknown_020388C4;
+
+extern TaskFunc gUnknown_0300074C;
+
+extern struct SpritePalette gUnknown_083E5968;
+
+extern struct SpriteTemplate gSpriteTemplate_83E59D0;
+extern struct SpriteTemplate gSpriteTemplate_83E59E8;
+extern struct SpriteTemplate gSpriteTemplate_83E5A00;
+
+extern const u8 gUnknown_083E5A18[];
+extern const u8 gUnknown_083E5A1C[];
+
+void sub_80F9020(void)
+{
+ memset(&gBGTilemapBuffers[1], 0, 0x800);
+ memset(&gBGTilemapBuffers[2], 0, 0x800);
+ memset(&gBGTilemapBuffers[3], 0, 0x800);
+}
+
+// display message box, fill box with tile if tile is not zero, print string
+static void PrintMessage(const u8 *str, u16 tile)
+{
+ MenuDisplayMessageBox();
+ if (tile)
+ {
+ sub_80A3FA0(&gBGTilemapBuffers[1][0], 2, 15, 26, 4, tile);
+ }
+ sub_8072044(str);
+}
+
+static void sub_80F9090(u8 taskId)
+{
+ if (MenuUpdateWindowText() == TRUE)
+ {
+ gUnknown_0300074C(taskId);
+ }
+}
+
+void DisplayItemMessageOnField(u8 taskId, const u8 *str, TaskFunc callback, u16 tile)
+{
+ PrintMessage(str, tile);
+ gUnknown_0300074C = callback;
+ gTasks[taskId].func = sub_80F9090;
+}
+
+static void Task_CallYesOrNoCallback(u8 taskId)
+{
+ switch (ProcessMenuInputNoWrap_())
+ {
+ case 0:
+ PlaySE(SE_SELECT);
+ gUnknown_020388C4.yesFunc(taskId);
+ break;
+ case 1:
+ case -1:
+ PlaySE(SE_SELECT);
+ gUnknown_020388C4.noFunc(taskId);
+ }
+}
+
+void DoYesNoFuncWithChoice(u8 taskId, const struct YesNoFuncTable *funcTable)
+{
+ gUnknown_020388C4 = *funcTable;
+ gTasks[taskId].func = Task_CallYesOrNoCallback;
+}
+
+static void PrintStringWithPalette(const u8 *str, u8 paletteNum, u8 left, u8 top)
+{
+ u8 paletteStr[4];
+
+ memcpy(paletteStr, gUnknown_083E5A18, 4);
+
+ if (paletteNum != 0xFF)
+ {
+ paletteStr[2] = paletteNum;
+ StringCopy(gStringVar4, paletteStr);
+ StringAppend(gStringVar4, str);
+ paletteStr[2] = gMenuWindowPtr->paletteNum;
+ StringAppend(gStringVar4, paletteStr);
+ }
+ else
+ {
+ StringCopy(gStringVar4, str);
+ }
+
+ MenuPrint(gStringVar4, left, top);
+}
+
+// unused
+void PrintNumberWithPalette(s32 value, u8 paletteNum, u8 n, u8 mode, u8 left, u8 top)
+{
+ ConvertIntToDecimalStringN(gStringVar1, value, mode, n);
+ if (paletteNum != 0xFF)
+ {
+ PrintStringWithPalette(gStringVar1, paletteNum, left, top);
+ }
+ else
+ {
+ MenuPrint(gStringVar1, left, top);
+ }
+}
+
+// unused
+void PrintTriangleCursorWithPalette(u8 left, u8 top, u8 paletteNum)
+{
+ u8 buffer[2];
+ memcpy(buffer, gUnknown_083E5A1C, 2);
+ PrintStringWithPalette(buffer, paletteNum, left, top);
+}
+
+u8 sub_80F9284(void)
+{
+ if (gSaveBlock2.optionsButtonMode == OPTIONS_BUTTON_MODE_LR)
+ {
+ if (gMain.newKeys & L_BUTTON)
+ {
+ return 1;
+ }
+ if (gMain.newKeys & R_BUTTON)
+ {
+ return 2;
+ }
+ }
+
+ return 0;
+}
+
+u8 sub_80F92BC(void)
+{
+ if (gSaveBlock2.optionsButtonMode == OPTIONS_BUTTON_MODE_LR)
+ {
+ if (gMain.newAndRepeatedKeys & L_BUTTON)
+ {
+ return 1;
+ }
+ if (gMain.newAndRepeatedKeys & R_BUTTON)
+ {
+ return 2;
+ }
+ }
+
+ return 0;
+}
+
+bool8 sub_80F92F4(u16 itemId)
+{
+ if (itemId != ITEM_ENIGMA_BERRY)
+ {
+ return TRUE;
+ }
+
+ if (!(gSaveBlock1.location.mapGroup == MAP_GROUP_TRADE_CENTER && gSaveBlock1.location.mapNum == MAP_ID_TRADE_CENTER))
+ {
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+bool8 sub_80F931C(u16 itemId)
+{
+ if (is_c1_link_related_active() != TRUE)
+ {
+ return TRUE;
+ }
+
+ if (ItemIsMail(itemId) != TRUE)
+ {
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+bool8 sub_80F9344(void)
+{
+ if (is_c1_link_related_active() == TRUE || gReceivedRemoteLinkPlayers == 1)
+ {
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+void sub_80F9368(void)
+{
+ u8 *addr;
+ u32 size;
+
+ REG_DISPCNT = 0;
+ REG_BG3CNT = 0;
+ REG_BG2CNT = 0;
+ REG_BG1CNT = 0;
+ REG_BG0CNT = 0;
+ REG_BG3HOFS = 0;
+ REG_BG3VOFS = 0;
+ REG_BG2HOFS = 0;
+ REG_BG2VOFS = 0;
+ REG_BG1HOFS = 0;
+ REG_BG1VOFS = 0;
+ REG_BG0HOFS = 0;
+ REG_BG0VOFS = 0;
+
+ addr = (u8 *)VRAM;
+ size = 0x18000;
+ while (1)
+ {
+ DmaFill16(3, 0, addr, 0x1000);
+ addr += 0x1000;
+ size -= 0x1000;
+ if (size <= 0x1000)
+ {
+ DmaFill16(3, 0, addr, size);
+ break;
+ }
+ }
+
+ DmaClear32(3, OAM, OAM_SIZE);
+ DmaClear16(3, PLTT, PLTT_SIZE);
+}
+
+void sub_80F9438(void)
+{
+ SetVBlankCallback(NULL);
+ SetHBlankCallback(NULL);
+}
+
+void sub_80F944C(void)
+{
+ u8 i;
+
+ for (i = 0; i < 4; i++)
+ {
+ gUnknown_020388C0[i] = 0xFF;
+ }
+
+ FreeSpritePaletteByTag(6);
+ LoadSpritePalette(&gUnknown_083E5968);
+}
+
+void sub_80F9480(u8 *data, u8 n)
+{
+ u8 i;
+
+ for (i = 0; i < n; i++)
+ {
+ data[i] = 0xFF;
+ }
+}
+
+void sub_80F94A4(u8 animNum, u8 *spriteId, s16 x, s16 y)
+{
+ if (animNum <= 5)
+ {
+ if (*spriteId == 0xFF)
+ {
+ *spriteId = CreateSprite(&gSpriteTemplate_83E5A00, x, y, 0);
+ }
+ animNum -= 4;
+ StartSpriteAnim(&gSprites[*spriteId], animNum);
+ }
+}
+
+void sub_80F94F8(u8 *spriteId)
+{
+ if (*spriteId != 0xFF)
+ {
+ DestroySprite(&gSprites[*spriteId]);
+ *spriteId = 0xFF;
+ }
+}
+
+void sub_80F9520(u8 *data, u8 n)
+{
+ u8 i;
+
+ for (i = 0; i < 8; i++)
+ {
+ sub_80F94F8(&data[i]);
+ }
+}
+
+void CreateVerticalScrollIndicators(u8 id, u16 x, u16 y)
+{
+ if (id >= 4)
+ {
+ return;
+ }
+
+ switch (id)
+ {
+ case 0:
+ if (gUnknown_020388C0[0] == 0xFF)
+ {
+ gUnknown_020388C0[0] = CreateSprite(&gSpriteTemplate_83E59D0, x, y, 0);
+ gSprites[gUnknown_020388C0[0]].data2 = -1;
+ if (gUnknown_020388C0[1] != 0xFF)
+ {
+ gSprites[gUnknown_020388C0[0]].pos2.y = gSprites[gUnknown_020388C0[1]].pos2.y * -1;
+ gSprites[gUnknown_020388C0[0]].data3 = gSprites[gUnknown_020388C0[1]].data3;
+ }
+ else
+ {
+ gSprites[gUnknown_020388C0[0]].data3 = 0;
+ }
+ }
+ break;
+
+ case 1:
+ if (gUnknown_020388C0[1] == 0xFF)
+ {
+ gUnknown_020388C0[1] = CreateSprite(&gSpriteTemplate_83E59D0, x, y, 0);
+ gSprites[gUnknown_020388C0[1]].data2 = 1;
+ if (gUnknown_020388C0[0] != 0xFF)
+ {
+ gSprites[gUnknown_020388C0[1]].pos2.y = gSprites[gUnknown_020388C0[0]].pos2.y * -1;
+ gSprites[gUnknown_020388C0[1]].data3 = gSprites[gUnknown_020388C0[0]].data3;
+ }
+ else
+ {
+ gSprites[gUnknown_020388C0[1]].data3 = 0;
+ }
+ }
+ break;
+
+ case 2:
+ if (gUnknown_020388C0[2] == 0xFF)
+ {
+ gUnknown_020388C0[2] = CreateSprite(&gSpriteTemplate_83E59E8, x, y, 0);
+ gSprites[gUnknown_020388C0[2]].data0 = -1;
+ if (gUnknown_020388C0[3] != 0xFF)
+ {
+ gSprites[gUnknown_020388C0[2]].pos2.x = gSprites[gUnknown_020388C0[3]].pos2.x * -1;
+ gSprites[gUnknown_020388C0[2]].data1 = gSprites[gUnknown_020388C0[3]].data1;
+ }
+ else
+ {
+ gSprites[gUnknown_020388C0[2]].data1 = 0;
+ }
+ }
+ break;
+
+ case 3:
+ if (gUnknown_020388C0[3] == 0xFF)
+ {
+ gUnknown_020388C0[3] = CreateSprite(&gSpriteTemplate_83E59E8, x, y, 0);
+ gSprites[gUnknown_020388C0[3]].data0 = 1;
+ if (gUnknown_020388C0[2] != 0xFF)
+ {
+ gSprites[gUnknown_020388C0[3]].pos2.x = gSprites[gUnknown_020388C0[2]].pos2.x * -1;
+ gSprites[gUnknown_020388C0[3]].data1 = gSprites[gUnknown_020388C0[2]].data1;
+ }
+ else
+ {
+ gSprites[gUnknown_020388C0[3]].data1 = 0;
+ }
+ }
+ break;
+ }
+
+ StartSpriteAnim(&gSprites[gUnknown_020388C0[id]], id & 1);
+}
+
+void sub_80F979C(u8 id, bool8 invisible)
+{
+ if (id < 4 && gUnknown_020388C0[id] != 0xFF)
+ {
+ gSprites[gUnknown_020388C0[id]].invisible = invisible;
+ }
+}
+
+void DestroyVerticalScrollIndicator(u8 id)
+{
+ if (id < 4 && gUnknown_020388C0[id] != 0xFF)
+ {
+ DestroySprite(&gSprites[gUnknown_020388C0[id]]);
+ gUnknown_020388C0[id] = 0xFF;
+ }
+}
+
+void LoadScrollIndicatorPalette(void)
+{
+ LoadSpritePalette(&gUnknown_083E5968);
+}
+
+void BuyMenuFreeMemory(void)
+{
+ FreeSpritePaletteByTag(6);
+}
+
+void sub_80F9834(struct Sprite *sprite)
+{
+ if (sprite->data1 == 0)
+ {
+ sprite->pos2.x += sprite->data0;
+ }
+ if (sprite->data3 == 0)
+ {
+ sprite->pos2.y += sprite->data2;
+ }
+ sprite->data1++;
+ sprite->data3++;
+ if (sprite->data1 > 2)
+ {
+ sprite->data1 = 0;
+ }
+ if (sprite->data3 > 2)
+ {
+ sprite->data3 = 0;
+ }
+ if (sprite->pos2.x == 8 || sprite->pos2.x == -8)
+ {
+ sprite->pos2.x = 0;
+ }
+ if (sprite->pos2.y == 8 || sprite->pos2.y == -8)
+ {
+ sprite->pos2.y = 0;
+ }
+}
+
+void sub_80F98A4(u8 id)
+{
+ if (gUnknown_020388C0[id] != 0xFF && id < 4)
+ {
+ gSprites[gUnknown_020388C0[id]].callback = SpriteCallbackDummy;
+ }
+}
+
+void StartVerticalScrollIndicators(u8 id)
+{
+ if (gUnknown_020388C0[id] != 0xFF && id < 4)
+ {
+ gSprites[gUnknown_020388C0[id]].callback = sub_80F9834;
+ }
+}
+
+static void sub_80F9914(u8 id)
+{
+ if (gUnknown_020388C0[id] != 0xFF && id < 4)
+ {
+ gSprites[gUnknown_020388C0[id]].pos2.x = 0;
+ gSprites[gUnknown_020388C0[id]].pos2.y = 0;
+ gSprites[gUnknown_020388C0[id]].data1 = 0;
+ gSprites[gUnknown_020388C0[id]].data3 = 0;
+ }
+}
+
+void PauseVerticalScrollIndicator(u8 id)
+{
+ sub_80F98A4(id);
+ sub_80F9914(id);
+}
+
+void sub_80F9988(u8 id, u8 priority)
+{
+ if (gUnknown_020388C0[id] != 0xFF && id < 4)
+ {
+ gSprites[gUnknown_020388C0[id]].oam.priority = priority;
+ }
+}