through sub_810A554

This commit is contained in:
PikalaxALT
2020-01-18 19:54:25 -05:00
parent 3a235a4fc0
commit 0ed743a582
8 changed files with 473 additions and 1255 deletions
-1168
View File
File diff suppressed because it is too large Load Diff
-62
View File
@@ -1,62 +0,0 @@
#include "constants/region_map.h"
#include "constants/flags.h"
#include "constants/moves.h"
#include "constants/item_menu.h"
.include "asm/macros.inc"
.include "constants/constants.inc"
.section .rodata
.align 2
gUnknown_8452F18:: @ 8452F18
.byte 0x00, 0x03, 0x01, 0x04
.byte 0x00, 0x02, 0x04, 0x0b
.byte 0x03, 0x01, 0x04, 0x0b
gUnknown_8452F24:: @ 8452F24
.byte 0x06, 0x03, 0x01, 0x04
gUnknown_8452F28:: @ 8452F28
.byte 0x03, 0x04
.byte 0x04, 0x0b
.byte 0x03, 0x04
gUnknown_8452F2E:: @ 8452F2E
.byte 0x07, 0x04
gUnknown_8452F30:: @ 8452F30
.byte 0x05, 0x04
gUnknown_8452F32:: @ 8452F32
.byte 0x04, 0x0b
gUnknown_8452F34:: @ 8452F34
.4byte sub_8109BB8
.4byte sub_810A370
.4byte sub_810A568
.4byte sub_810AB40
.4byte sub_810A468
.4byte sub_8109BB8
.4byte NULL
gUnknown_8452F50:: @ 8452F50
.4byte sub_8109EA8
.4byte sub_8109DB0
gUnknown_8452F58:: @ 8452F58
.4byte sub_810A940
.4byte sub_810A720
gUnknown_8452F60:: @ 8452F60
.string "{COLOR_HIGHLIGHT_SHADOW RED TRANSPARENT GREEN}$"
gUnknown_8452F66:: @ 8452F66
.string "{COLOR_HIGHLIGHT_SHADOW LIGHT_GRAY TRANSPARENT BLACK}$"
gUnknown_8452F6C:: @ 8452F6C
.byte 0, 8, 72, 1, 72, 72
.2byte 0, 2, 111, 111
.byte 0
.align 2
gUnknown_8452F7C:: @ 8452F7C
.incbin "graphics/interface/select_button.4bpp"
+2 -2
View File
@@ -567,7 +567,7 @@ gText_KeyItems2:: @ 0x84162DE
gText_DepositItem:: @ 84162E8
.string "DEPOSIT ITEM$"
gUnknown_84162F5:: @ 84162F5
gText_CloseBag:: @ 84162F5
.string "CLOSE BAG$"
gOtherText_StrVar1:: @ 84162FF
@@ -577,7 +577,7 @@ gText_IsSelected:: @ 8416301
.string " is\n"
.string "selected.$"
gUnknown_841630F:: @ 841630F
gText_CantWriteMailHere:: @ 841630F
.string "You can't write\n"
.string "MAIL here.$"
+1 -1
View File
@@ -27,7 +27,7 @@ void CreateYesNoMenuWithCallbacks(u8 taskId, const struct WindowTemplate *templa
u8 GetLRKeysState(void);
u8 GetLRKeysPressedAndHeld(void);
bool8 itemid_link_can_give_berry(u16 itemId);
bool8 itemid_80BF6D8_mail_related(u16 itemId);
bool8 CanWriteMailHere(u16 itemId);
void ResetVramOamAndBgCntRegs(void);
#endif //GUARD_MENU_HELPERS_H
+2 -1
View File
@@ -1047,6 +1047,7 @@ extern const u8 gOtherText_Deselect[];
extern const u8 gText_Items2[];
extern const u8 gText_PokeBalls2[];
extern const u8 gText_KeyItems2[];
extern const u8 gUnknown_84162F5[];
extern const u8 gText_CloseBag[];
extern const u8 gText_CantWriteMailHere[];
#endif //GUARD_STRINGS_H
-1
View File
@@ -519,7 +519,6 @@ SECTIONS {
data/pokedex_screen.o(.rodata);
src/list_menu.o(.rodata);
src/item_menu.o(.rodata);
data/item_menu.o(.rodata);
src/save_location.o(.rodata);
src/bag.o(.rodata);
src/trainer_pokemon_sprites.o(.rodata);
+467 -19
View File
@@ -2,6 +2,7 @@
#include "gflib.h"
#include "bag.h"
#include "battle_controllers.h"
#include "berry_pouch.h"
#include "decompress.h"
#include "field_player_avatar.h"
#include "graphics.h"
@@ -16,8 +17,11 @@
#include "menu_indicators.h"
#include "new_menu_helpers.h"
#include "overworld.h"
#include "party_menu.h"
#include "pokemon_storage_system.h"
#include "scanline_effect.h"
#include "strings.h"
#include "tm_case.h"
#include "constants/items.h"
#include "constants/songs.h"
@@ -85,16 +89,29 @@ void sub_81095AC(u8 taskId, u32 itemIndex);
void sub_810967C(u8 taskId, u32 itemIndex);
void sub_8109854(u8 a0);
void sub_8109BB8(u8 taskId);
void sub_8109BE4(u8 taskId);
void Task_ItemMenuAction_Use(u8 taskId);
void Task_ItemMenuAction_Toss(u8 taskId);
void sub_8109D38(u8 taskId);
void sub_8109DB0(u8 taskId);
void sub_8109DEC(u8 taskId);
void sub_8109EA8(u8 taskId);
void sub_8109F44(u8 taskId);
void Task_ItemMenuAction_ToggleSelect(u8 taskId);
void Task_ItemMenuAction_Give(u8 taskId);
void sub_810A170(u8 taskId);
void Task_ItemMenuAction_Cancel(u8 taskId);
void sub_8109DB0(u8 taskId);
void sub_8109EA8(u8 taskId);
void sub_810A18C(u8 taskId);
void sub_810A1D0(u8 taskId);
void sub_810A324(u8 taskId);
void sub_810A370(u8 taskId);
void sub_810A434(void);
void sub_810A448(void);
void sub_810A45C(void);
void sub_810A468(u8 taskId);
void sub_810A52C(void);
void sub_810A540(void);
void sub_810A554(void);
void sub_810A568(u8 taskId);
void sub_810A720(u8 taskId);
void sub_810A940(u8 taskId);
@@ -162,17 +179,99 @@ const struct MenuAction gUnknown_8452EB8[] = {
[ITEMMENUACTION_DUMMY] = {gString_Dummy, {.void_u8 = NULL}}
};
extern const u8 gUnknown_8452F18[][4];
extern const u8 gUnknown_8452F24[];
extern const u8 gUnknown_8452F28[][2];
extern const u8 gUnknown_8452F2E[];
extern const u8 gUnknown_8452F30[];
extern const u8 gUnknown_8452F32[];
extern const TaskFunc gUnknown_8452F34[];
extern const u8 gUnknown_8452F60[];
extern const u8 gUnknown_8452F66[];
extern const struct ScrollArrowsTemplate gUnknown_8452F6C;
extern const u8 gUnknown_8452F7C[];
const u8 gUnknown_8452F18[][4] = {
{
ITEMMENUACTION_USE,
ITEMMENUACTION_GIVE,
ITEMMENUACTION_TOSS,
ITEMMENUACTION_CANCEL
}, {
ITEMMENUACTION_USE,
ITEMMENUACTION_REGISTER,
ITEMMENUACTION_CANCEL,
ITEMMENUACTION_DUMMY
}, {
ITEMMENUACTION_GIVE,
ITEMMENUACTION_TOSS,
ITEMMENUACTION_CANCEL,
ITEMMENUACTION_DUMMY
}
};
const u8 gUnknown_8452F24[] = {
ITEMMENUACTION_CHECK,
ITEMMENUACTION_GIVE,
ITEMMENUACTION_TOSS,
ITEMMENUACTION_CANCEL
};
const u8 gUnknown_8452F28[][2] = {
{
ITEMMENUACTION_GIVE,
ITEMMENUACTION_CANCEL
}, {
ITEMMENUACTION_CANCEL,
ITEMMENUACTION_DUMMY
}, {
ITEMMENUACTION_GIVE,
ITEMMENUACTION_CANCEL
}
};
const u8 gUnknown_8452F2E[] = {
ITEMMENUACTION_OPEN,
ITEMMENUACTION_CANCEL
};
const u8 gUnknown_8452F30[] = {
ITEMMENUACTION_BATTLE_USE,
ITEMMENUACTION_CANCEL
};
const u8 gUnknown_8452F32[] = {
ITEMMENUACTION_CANCEL,
ITEMMENUACTION_DUMMY
};
const TaskFunc gUnknown_8452F34[] = {
sub_8109BB8,
sub_810A370,
sub_810A568,
sub_810AB40,
sub_810A468,
sub_8109BB8,
NULL
};
const struct YesNoFuncTable gUnknown_8452F50 = {
sub_8109EA8,
sub_8109DB0
};
const struct YesNoFuncTable gUnknown_8452F58 = {
sub_810A940,
sub_810A720
};
const u8 gUnknown_8452F60[] = _("{COLOR_HIGHLIGHT_SHADOW RED TRANSPARENT GREEN}");
const u8 gUnknown_8452F66[] = _("{COLOR_HIGHLIGHT_SHADOW LIGHT_GRAY TRANSPARENT BLACK}");
const struct ScrollArrowsTemplate gUnknown_8452F6C = {
.firstArrowType = SCROLL_ARROW_LEFT,
.firstX = 8,
.firstY = 72,
.secondArrowType = SCROLL_ARROW_RIGHT,
.secondX = 72,
.secondY = 72,
.fullyUpThreshold = 0,
.fullyDownThreshold = 2,
.tileTag = 111,
.palTag = 111,
.palNum = 0,
};
const u8 gUnknown_8452F7C[] = INCBIN_U8("graphics/interface/select_button.4bpp");
void GoToBagMenu(u8 location, u8 a1, MainCallback a2)
{
@@ -620,7 +719,7 @@ void sub_8108818(s32 itemIndex)
if (itemIndex != gUnknown_203AD10->nItems[gUnknown_203ACFC.pocket])
description = ItemId_GetDescription(BagGetItemIdByPocketPosition(gUnknown_203ACFC.pocket + 1, itemIndex));
else
description = gUnknown_84162F5;
description = gText_CloseBag;
FillWindowPixelBuffer(1, PIXEL_FILL(0));
sub_810B8F0(1, 2, description, 0, 3, 2, 0, 0, 0);
}
@@ -941,9 +1040,9 @@ void sub_8108F0C(u8 taskId)
ListMenuGetScrollAndRow(data[0], &gUnknown_203ACFC.cursorPos[gUnknown_203ACFC.pocket], &gUnknown_203ACFC.itemsAbove[gUnknown_203ACFC.pocket]);
switch (input)
{
case -1:
case LIST_NOTHING_CHOSEN:
return;
case -2:
case LIST_CANCEL:
PlaySE(SE_SELECT);
gSpecialVar_ItemId = ITEM_NONE;
sub_8108CB4();
@@ -1123,9 +1222,9 @@ void sub_81094B0(u8 taskId)
}
switch (input)
{
case -1:
case LIST_NOTHING_CHOSEN:
return;
case -2:
case LIST_CANCEL:
PlaySE(SE_SELECT);
gUnknown_203AD10->field_04 = 0xFF;
ListMenuGetScrollAndRow(data[0], &cursorPos, &itemsAbove);
@@ -1202,7 +1301,7 @@ void sub_8109854(u8 a0)
ScheduleBgCopyTilemapToVram(1);
}
void sub_8109890(void)
void sub_8109890(u8 taskId)
{
u8 r6;
u8 r4;
@@ -1301,3 +1400,352 @@ void sub_8109890(void)
StringExpandPlaceholders(gStringVar4, gOtherText_StrVar1);
sub_810B8F0(r4, 2, gStringVar4, 0, 2, 1, 0, 0, 1);
}
void sub_8109BB8(u8 taskId)
{
sub_8109890(taskId);
gTasks[taskId].func = sub_8109BE4;
}
void sub_8109BE4(u8 taskId)
{
s8 input;
if ((u8)sub_80BF72C() != TRUE)
{
input = Menu_ProcessInputNoWrapAround();
switch (input)
{
case -1:
PlaySE(SE_SELECT);
gUnknown_8452EB8[ITEMMENUACTION_CANCEL].func.void_u8(taskId);
break;
case -2:
break;
default:
PlaySE(SE_SELECT);
gUnknown_8452EB8[gUnknown_203AD24[input]].func.void_u8(taskId);
break;
}
}
}
void Task_ItemMenuAction_Use(u8 taskId)
{
if (ItemId_GetFieldFunc(gSpecialVar_ItemId) != NULL)
{
sub_810BA3C(10);
sub_810BA3C(6);
PutWindowTilemap(0);
PutWindowTilemap(1);
ScheduleBgCopyTilemapToVram(0);
if (CalculatePlayerPartyCount() == 0 && ItemId_GetType(gSpecialVar_ItemId) == 1)
sub_810A170(taskId);
else
ItemId_GetFieldFunc(gSpecialVar_ItemId)(taskId);
}
}
void Task_ItemMenuAction_Toss(u8 taskId)
{
s16 *data = gTasks[taskId].data;
ClearWindowTilemap(sub_810BAD8(10));
ClearWindowTilemap(sub_810BAD8(6));
sub_810BA3C(10);
sub_810BA3C(6);
PutWindowTilemap(0);
data[8] = 1;
if (data[2] == 1)
{
sub_8109D38(taskId);
}
else
{
sub_810971C(data[1], gText_TossOutHowManyStrVar1s);
gTasks[taskId].func = sub_8109DEC;
}
}
void sub_8109D38(u8 taskId)
{
s16 *data = gTasks[taskId].data;
ConvertIntToDecimalStringN(gStringVar2, data[8], STR_CONV_MODE_LEFT_ALIGN, 3);
StringExpandPlaceholders(gStringVar4, gText_ThrowAwayStrVar2OfThisItemQM);
sub_810B8F0(sub_810B9DC(6, 1), 2, gStringVar4, 0, 2, 1, 0, 0, 1);
sub_810BAE8(taskId, &gUnknown_8452F50);
}
void sub_8109DB0(u8 taskId)
{
s16 *data = gTasks[taskId].data;
sub_810BA3C(6);
PutWindowTilemap(1);
ScheduleBgCopyTilemapToVram(0);
bag_menu_print_cursor_(data[0], 1);
sub_810910C(taskId);
}
void sub_8109DEC(u8 taskId)
{
s16 *data = gTasks[taskId].data;
if (AdjustQuantityAccordingToDPadInput(&data[8], data[2]) == TRUE)
{
sub_81097E4(data[8], 3);
}
else if (JOY_NEW(A_BUTTON))
{
PlaySE(SE_SELECT);
ClearWindowTilemap(sub_810BAD8(6));
sub_810BA3C(6);
sub_810BA3C(0);
ScheduleBgCopyTilemapToVram(0);
sub_8108978();
sub_8109D38(taskId);
}
else if (JOY_NEW(B_BUTTON))
{
PlaySE(SE_SELECT);
sub_810BA3C(6);
sub_810BA3C(0);
PutWindowTilemap(0);
PutWindowTilemap(1);
ScheduleBgCopyTilemapToVram(0);
bag_menu_print_cursor_(data[0], 1);
sub_8108978();
sub_810910C(taskId);
}
}
void sub_8109EA8(u8 taskId)
{
s16 *data = gTasks[taskId].data;
sub_810BA3C(6);
CopyItemName(BagGetItemIdByPocketPosition(gUnknown_203ACFC.pocket + 1, data[1]), gStringVar1);
ConvertIntToDecimalStringN(gStringVar2, data[8], STR_CONV_MODE_LEFT_ALIGN, 3);
StringExpandPlaceholders(gStringVar4, gText_ThrewAwayStrVar2StrVar1s);
sub_810B8F0(sub_810B9DC(6, 3), 2, gStringVar4, 0, 2, 1, 0, 0, 1);
gTasks[taskId].func = sub_8109F44;
}
void sub_8109F44(u8 taskId)
{
s16 *data = gTasks[taskId].data;
if (JOY_NEW(A_BUTTON) || JOY_NEW(B_BUTTON))
{
PlaySE(SE_SELECT);
RemoveBagItem(gSpecialVar_ItemId, data[8]);
sub_810BA3C(6);
DestroyListMenuTask(data[0], &gUnknown_203ACFC.cursorPos[gUnknown_203ACFC.pocket], &gUnknown_203ACFC.itemsAbove[gUnknown_203ACFC.pocket]);
sub_8108DC8(gUnknown_203ACFC.pocket);
sub_81089F4(gUnknown_203ACFC.pocket);
sub_810842C(gUnknown_203ACFC.pocket);
data[0] = ListMenuInit(&gMultiuseListMenuTemplate, gUnknown_203ACFC.cursorPos[gUnknown_203ACFC.pocket], gUnknown_203ACFC.itemsAbove[gUnknown_203ACFC.pocket]);
PutWindowTilemap(1);
ScheduleBgCopyTilemapToVram(0);
bag_menu_print_cursor_(data[0], 1);
sub_810910C(taskId);
}
}
void Task_ItemMenuAction_ToggleSelect(u8 taskId)
{
u16 itemId;
s16 *data = gTasks[taskId].data;
itemId = BagGetItemIdByPocketPosition(gUnknown_203ACFC.pocket + 1, data[1]);
if (gSaveBlock1Ptr->registeredItem == itemId)
gSaveBlock1Ptr->registeredItem = ITEM_NONE;
else
gSaveBlock1Ptr->registeredItem = itemId;
DestroyListMenuTask(data[0], &gUnknown_203ACFC.cursorPos[gUnknown_203ACFC.pocket], &gUnknown_203ACFC.itemsAbove[gUnknown_203ACFC.pocket]);
sub_810842C(gUnknown_203ACFC.pocket);
data[0] = ListMenuInit(&gMultiuseListMenuTemplate, gUnknown_203ACFC.cursorPos[gUnknown_203ACFC.pocket], gUnknown_203ACFC.itemsAbove[gUnknown_203ACFC.pocket]);
CopyWindowToVram(0, 1);
Task_ItemMenuAction_Cancel(taskId);
}
void Task_ItemMenuAction_Give(u8 taskId)
{
s16 *data = gTasks[taskId].data;
u16 itemId = BagGetItemIdByPocketPosition(gUnknown_203ACFC.pocket + 1, data[1]);
sub_810BA3C(10);
sub_810BA3C(6);
PutWindowTilemap(0);
PutWindowTilemap(1);
CopyWindowToVram(0, 1);
if (!CanWriteMailHere(itemId))
DisplayItemMessageInBag(taskId, 2, gText_CantWriteMailHere, sub_810A1D0);
else if (!itemid_is_unique(itemId))
{
if (CalculatePlayerPartyCount() == 0)
{
sub_810A170(taskId);
}
else
{
gUnknown_203AD10->exitCB = CB2_ChooseMonToGiveItem;
gTasks[taskId].func = ItemMenu_StartFadeToExitCallback;
}
}
else
sub_810A18C(taskId);
}
void sub_810A170(u8 taskId)
{
DisplayItemMessageInBag(taskId, 2, gText_ThereIsNoPokemon, sub_810A1D0);
}
void sub_810A18C(u8 taskId)
{
CopyItemName(gSpecialVar_ItemId, gStringVar1);
StringExpandPlaceholders(gStringVar4, gText_ItemCantBeHeld);
DisplayItemMessageInBag(taskId, 2, gStringVar4, sub_810A1D0);
}
void sub_810A1D0(u8 taskId)
{
if (JOY_NEW(A_BUTTON))
{
PlaySE(SE_SELECT);
sub_810A1F8(taskId);
}
}
void sub_810A1F8(u8 taskId)
{
s16 *data = gTasks[taskId].data;
sub_810BA9C(5);
DestroyListMenuTask(data[0], &gUnknown_203ACFC.cursorPos[gUnknown_203ACFC.pocket], &gUnknown_203ACFC.itemsAbove[gUnknown_203ACFC.pocket]);
sub_8108DC8(gUnknown_203ACFC.pocket);
sub_81089F4(gUnknown_203ACFC.pocket);
sub_810842C(gUnknown_203ACFC.pocket);
data[0] = ListMenuInit(&gMultiuseListMenuTemplate, gUnknown_203ACFC.cursorPos[gUnknown_203ACFC.pocket], gUnknown_203ACFC.itemsAbove[gUnknown_203ACFC.pocket]);
ScheduleBgCopyTilemapToVram(0);
bag_menu_print_cursor_(data[0], 1);
sub_810910C(taskId);
}
void sub_810A288(u8 taskId)
{
s16 *data = gTasks[taskId].data;
u16 itemsAbove;
u16 cursorPos;
ListMenuGetScrollAndRow(data[0], &cursorPos, &itemsAbove);
sub_8108818(cursorPos + itemsAbove);
PutWindowTilemap(0);
ScheduleBgCopyTilemapToVram(0);
bag_menu_print_cursor_(data[0], 1);
sub_810910C(taskId);
}
void Task_ItemMenuAction_Cancel(u8 taskId)
{
sub_810BA3C(10);
sub_810BA3C(6);
PutWindowTilemap(0);
PutWindowTilemap(1);
ScheduleBgCopyTilemapToVram(0);
bag_menu_print_cursor_(gTasks[taskId].data[0], 1);
sub_810910C(taskId);
}
void sub_810A324(u8 taskId)
{
if (ItemId_GetBattleFunc(gSpecialVar_ItemId) != NULL)
{
sub_810BA3C(10);
sub_810BA3C(6);
PutWindowTilemap(0);
PutWindowTilemap(1);
CopyWindowToVram(0, 1);
ItemId_GetBattleFunc(gSpecialVar_ItemId)(taskId);
}
}
void sub_810A370(u8 taskId)
{
s16 *data = gTasks[taskId].data;
u16 itemId = BagGetItemIdByPocketPosition(gUnknown_203ACFC.pocket + 1, data[1]);
if (!CanWriteMailHere(itemId))
{
DisplayItemMessageInBag(taskId, 2, gText_CantWriteMailHere, sub_810A1D0);
}
else if (itemId == ITEM_TM_CASE)
{
ItemMenu_SetExitCallback(sub_810A434);
ItemMenu_StartFadeToExitCallback(taskId);
}
else if (itemId == ITEM_BERRY_POUCH)
{
ItemMenu_SetExitCallback(sub_810A448);
ItemMenu_StartFadeToExitCallback(taskId);
}
else if (gUnknown_203ACFC.pocket != POCKET_KEY_ITEMS - 1 && !itemid_is_unique(itemId))
{
sub_8108CB4();
gTasks[taskId].func = ItemMenu_StartFadeToExitCallback;
}
else
{
sub_810A18C(taskId);
}
}
void sub_810A434(void)
{
InitTMCase(1, sub_810A45C, FALSE);
}
void sub_810A448(void)
{
InitBerryPouch(1, sub_810A45C, FALSE);
}
void sub_810A45C(void)
{
CB2_SelectBagItemToGive();
}
void sub_810A468(u8 taskId)
{
s16 *data = gTasks[taskId].data;
u16 itemId = BagGetItemIdByPocketPosition(gUnknown_203ACFC.pocket + 1, data[1]);
if (ItemIsMail(itemId) == TRUE)
{
DisplayItemMessageInBag(taskId, 2, gText_CantWriteMailHere, sub_810A1D0);
}
else if (itemId == ITEM_TM_CASE)
{
ItemMenu_SetExitCallback(sub_810A52C);
ItemMenu_StartFadeToExitCallback(taskId);
}
else if (itemId == ITEM_BERRY_POUCH)
{
ItemMenu_SetExitCallback(sub_810A540);
ItemMenu_StartFadeToExitCallback(taskId);
}
else if (gUnknown_203ACFC.pocket != POCKET_KEY_ITEMS - 1 && !itemid_is_unique(itemId))
{
sub_8108CB4();
gTasks[taskId].func = ItemMenu_StartFadeToExitCallback;
}
else
{
sub_810A18C(taskId);
}
}
void sub_810A52C(void)
{
InitTMCase(3, sub_810A554, FALSE);
}
void sub_810A540(void)
{
InitBerryPouch(3, sub_810A554, FALSE);
}
void sub_810A554(void)
{
GoToBagMenu(4, 3, sub_808CE60);
}
+1 -1
View File
@@ -107,7 +107,7 @@ bool8 itemid_link_can_give_berry(u16 itemId)
return FALSE;
}
bool8 itemid_80BF6D8_mail_related(u16 itemId)
bool8 CanWriteMailHere(u16 itemId)
{
if (IsUpdateLinkStateCBActive() != TRUE && InUnionRoom() != TRUE)
return TRUE;