diff options
Diffstat (limited to 'src/item_use.c')
-rw-r--r-- | src/item_use.c | 1198 |
1 files changed, 0 insertions, 1198 deletions
diff --git a/src/item_use.c b/src/item_use.c deleted file mode 100644 index 1750c1584..000000000 --- a/src/item_use.c +++ /dev/null @@ -1,1198 +0,0 @@ -#include "global.h" -#include "item_use.h" -#include "battle.h" -#include "berry.h" -#include "bike.h" -#include "coins.h" -#include "data2.h" -#include "event_data.h" -#include "field_effect.h" -#include "field_fadetransition.h" -#include "field_map_obj_helpers.h" -#include "field_player_avatar.h" -#include "field_weather.h" -#include "fieldmap.h" -#include "item.h" -#include "item_menu.h" -#include "items.h" -#include "mail.h" -#include "main.h" -#include "map_obj_lock.h" -#include "menu.h" -#include "menu_helpers.h" -#include "metatile_behavior.h" -#include "palette.h" -#include "party_menu.h" -#include "pokeblock.h" -#include "pokemon_item_effect.h" -#include "pokemon_menu.h" -#include "rom4.h" -#include "rom_8094928.h" -#include "script.h" -#include "songs.h" -#include "sound.h" -#include "string_util.h" -#include "strings.h" -#include "task.h" -#include "vars.h" - -extern void (* gUnknown_03005D00)(u8); -extern void (* gFieldCallback)(void); -extern void (* gUnknown_0300485C)(void); -extern void (* gUnknown_03004AE4)(u8, u16, TaskFunc); - -extern u8 gUnknown_02038561; -extern u8 gLastFieldPokeMenuOpened; -extern u8 gBankInMenu; - -extern u8 gUnknown_081A1654[]; -extern u8 gUnknown_081A168F[]; - -extern u16 gBattlePartyID[]; - -extern u16 gBattleTypeFlags; - -static const u8 gSSTidalBetaString[] = _("この チケットで ふねに のりほうだい\nはやく のってみたいな"); -static const u8 gSSTidalBetaString2[] = _("この チケットで ふねに のりほうだい\nはやく のってみたいな"); - -static const u8 *const gUnknown_083D61DC[2] = -{ - gSSTidalBetaString, - gSSTidalBetaString2, -}; - -static const MainCallback gExitToOverworldFuncList[] = -{ - sub_808B020, - c2_exit_to_overworld_2_switch, - sub_810B96C, -}; - -static const u8 gItemFinderDirections[] = { DIR_NORTH, DIR_EAST, DIR_SOUTH, DIR_WEST }; - -static const struct YesNoFuncTable gUnknown_083D61F4 = -{ - .yesFunc = sub_80C9FC0, - .noFunc = CleanUpItemMenuMessage, -}; - -void ExecuteSwitchToOverworldFromItemUse(u8 taskId) -{ - u8 taskData; - - if (gScriptItemId == 0xAF) - taskData = gTasks[taskId].data[15] - 1; - else - taskData = ItemId_GetType(gScriptItemId) - 1; - - gTasks[taskId].data[8] = (u32)gExitToOverworldFuncList[taskData] >> 16; - gTasks[taskId].data[9] = (u32)gExitToOverworldFuncList[taskData]; - gTasks[taskId].func = HandleItemMenuPaletteFade; -} - -void ItemMenu_ConfirmNormalFade(u8 var) -{ - ExecuteSwitchToOverworldFromItemUse(var); - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0); -} - -void ItemMenu_ConfirmComplexFade(u8 var) -{ - ExecuteSwitchToOverworldFromItemUse(var); - fade_screen(1, 0); -} - -void SetUpItemUseOnFieldCallback(u8 taskId) -{ - if (gTasks[taskId].data[2] != 1) - { - gFieldCallback = (void *)ExecuteItemUseFromBlackPalette; - ItemMenu_ConfirmNormalFade(taskId); - } - else - gUnknown_03005D00(taskId); -} - -void HandleDeniedItemUseMessage(u8 var1, u8 playerMenuStatus, const u8 *text) -{ - StringExpandPlaceholders(gStringVar4, text); - - switch (playerMenuStatus) - { - case 0: // Item Menu - MenuZeroFillWindowRect(0, 13, 13, 20); - DisplayItemMessageOnField(var1, gStringVar4, CleanUpItemMenuMessage, 1); - break; - default: // Field - DisplayItemMessageOnField(var1, gStringVar4, CleanUpOverworldMessage, 0); - break; - } -} - -void DisplayDadsAdviceCannotUseItemMessage(u8 var1, u8 playerMenuStatus) -{ - HandleDeniedItemUseMessage(var1, playerMenuStatus, gOtherText_DadsAdvice); -} - -void DisplayCantGetOffBikeItemMessage(u8 var1, u8 playerMenuStatus) -{ - HandleDeniedItemUseMessage(var1, playerMenuStatus, gOtherText_CantGetOffBike); -} - -u8 CheckIfItemIsTMHMOrEvolutionStone(u16 itemId) -{ - if (ItemId_GetFieldFunc(itemId) == ItemUseOutOfBattle_TMHM) - return 1; - else if (ItemId_GetFieldFunc(itemId) == ItemUseOutOfBattle_EvolutionStone) - return 2; - else - return 0; -} - -void ItemMenu_ReadMail(u8 taskId) -{ - struct MailStruct mailStruct; - - if (!gPaletteFade.active) - { - mailStruct.itemId = gScriptItemId; - HandleReadMail(&mailStruct, sub_80A5D04, 0); - DestroyTask(taskId); - } -} - -void ItemUseOutOfBattle_Mail(u8 taskId) -{ - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0); - gTasks[taskId].func = ItemMenu_ReadMail; -} - -void ItemUseOutOfBattle_Bike(u8 taskId) -{ - s16 x, y; - u8 tileBehavior; - - PlayerGetDestCoords(&x, &y); - tileBehavior = MapGridGetMetatileBehaviorAt(x, y); - - if (FlagGet(SYS_CYCLING_ROAD) == TRUE // on cycling road? - || MetatileBehavior_IsVerticalRail(tileBehavior) == TRUE - || MetatileBehavior_IsHorizontalRail(tileBehavior) == TRUE - || MetatileBehavior_IsIsolatedVerticalRail(tileBehavior) == TRUE - || MetatileBehavior_IsIsolatedHorizontalRail(tileBehavior) == TRUE) - { - DisplayCantGetOffBikeItemMessage(taskId, gTasks[taskId].data[2]); - } - else - { - if (IsBikingAllowedByMap() == TRUE && IsBikingDisallowedByPlayer() == FALSE) - { - gUnknown_03005D00 = (void *)ItemUseOnFieldCB_Bike; - SetUpItemUseOnFieldCallback(taskId); - } - else - DisplayDadsAdviceCannotUseItemMessage(taskId, gTasks[taskId].data[2]); - } -} - -void ItemUseOnFieldCB_Bike(u8 taskId) -{ - if (ItemId_GetSecondaryId(gScriptItemId) == 0) - GetOnOffBike(2); - if (ItemId_GetSecondaryId(gScriptItemId) == 1) - GetOnOffBike(4); - - sub_8064E2C(); - ScriptContext2_Disable(); - DestroyTask(taskId); -} - -bool32 CanFish(void) -{ - s16 x, y; - u16 tileBehavior; - - GetXYCoordsOneStepInFrontOfPlayer(&x, &y); - tileBehavior = MapGridGetMetatileBehaviorAt(x, y); - - if (MetatileBehavior_IsWaterfall(tileBehavior)) - return FALSE; - - if (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_4)) - return FALSE; - - if (!TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_SURFING)) - { - if (IsPlayerFacingSurfableFishableWater()) - return TRUE; - } - else - { - if (MetatileBehavior_IsSurfableWaterOrUnderwater(tileBehavior) && !MapGridIsImpassableAt(x, y)) - return TRUE; - if (MetatileBehavior_IsBridge(tileBehavior) == TRUE) - return TRUE; - } - - return FALSE; -} - -void ItemUseOutOfBattle_Rod(u8 taskId) -{ - if (CanFish() == TRUE) - { - gUnknown_03005D00 = (void *)ItemUseOnFieldCB_Rod; - SetUpItemUseOnFieldCallback(taskId); - } - else - DisplayDadsAdviceCannotUseItemMessage(taskId, gTasks[taskId].data[2]); -} - -void ItemUseOnFieldCB_Rod(u8 taskId) -{ - StartFishing(ItemId_GetSecondaryId(gScriptItemId)); - DestroyTask(taskId); -} - -void ItemUseOutOfBattle_Itemfinder(u8 var) -{ - IncrementGameStat(0x27); - gUnknown_03005D00 = (void *)ItemUseOnFieldCB_Itemfinder; - SetUpItemUseOnFieldCallback(var); -} - -void ItemUseOnFieldCB_Itemfinder(u8 taskId) -{ - if (ItemfinderCheckForHiddenItems(gMapHeader.events, taskId) == TRUE) - gTasks[taskId].func = RunItemfinderResults; - else - DisplayItemMessageOnField(taskId, gOtherText_NoResponse, ExitItemfinder, 0); -} - -void RunItemfinderResults(u8 taskId) -{ - u8 playerDir; - u8 playerDirToItem; - u8 i; - s16 *data = gTasks[taskId].data; - - if (!data[3]) - { - if (data[4] == 4) - { - playerDirToItem = GetPlayerDirectionTowardsHiddenItem(data[0], data[1]); - if (playerDirToItem) - { - SetPlayerDirectionTowardsItem(gItemFinderDirections[playerDirToItem - 1]); - gTasks[taskId].func = DisplayItemRespondingMessageAndExitItemfinder; - } - else // player is above hidden item. - { - playerDir = player_get_direction_lower_nybble(); - - // rotate player clockwise depending on current direction. - for (i = 0; i < 4; i++) - if (playerDir == gItemFinderDirections[i]) - data[5] = (i + 1) & 3; - - gTasks[taskId].func = RotatePlayerAndExitItemfinder; - data[3] = 0; - data[2] = 0; - } - return; - } - PlaySE(SE_DAUGI); // play the itemfinder jingle 4 times before executing the itemfinder. - data[4]++; - } - data[3] = (data[3] + 1) & 0x1F; -} - -void ExitItemfinder(u8 taskId) -{ - MenuZeroFillWindowRect(0, 14, 29, 19); - sub_8064E2C(); - ScriptContext2_Disable(); - DestroyTask(taskId); -} - -bool8 ItemfinderCheckForHiddenItems(struct MapEvents *events, u8 taskId) -{ - int distanceX, distanceY; - u16 x, y; - s16 newDistanceX, newDistanceY, i; - - PlayerGetDestCoords(&x, &y); - gTasks[taskId].data[2] = FALSE; - - for (i = 0; i < events->bgEventCount; i++) - { - if ((events -> bgEvents[i].kind == 7) && !FlagGet(events -> bgEvents[i].bgUnion.hiddenItem.hiddenItemId + 600)) - { - // do a distance lookup of each item so long as the index remains less than the objects on the current map. - distanceX = (u16)events -> bgEvents[i].x + 7; - newDistanceX = distanceX - x; - distanceY = (u16)events -> bgEvents[i].y + 7; - newDistanceY = distanceY - y; - - // is item in range? - if ((u16)(newDistanceX + 7) < 15 && (newDistanceY >= -5) && (newDistanceY < 6)) - sub_80C9838(taskId, newDistanceX, newDistanceY); // send coordinates of the item relative to the player - } - } - sub_80C9720(taskId); - - // hidden item detected? - if(gTasks[taskId].data[2] == TRUE) - return TRUE; - else - return FALSE; -} - -bool8 HiddenItemAtPos(struct MapEvents *events, s16 x, s16 y) -{ - u8 bgEventCount = events->bgEventCount; - struct BgEvent *bgEvent = events->bgEvents; - int i; - - for(i = 0; i < bgEventCount; i++) - { - if(bgEvent[i].kind == 7 && x == (u16)bgEvent[i].x && y == (u16)bgEvent[i].y) // hidden item and coordinates matches x and y passed? - { - if(!FlagGet(bgEvent[i].bgUnion.hiddenItem.hiddenItemId + 600)) - return TRUE; - else - return FALSE; - } - } - return FALSE; -} - -bool8 sub_80C9688(struct MapConnection *connection, int x, int y) -{ - struct MapHeader *mapHeader; - u16 localX, localY; - u32 localOffset; - s32 localLength; - - mapHeader = mapconnection_get_mapheader(connection); - - switch(connection->direction) - { - // same weird temp variable behavior seen in HiddenItemAtPos - case 2: - localOffset = connection->offset + 7; - localX = x - localOffset; - localLength = mapHeader->mapData->height - 7; - localY = localLength + y; // additions are reversed for some reason - break; - case 1: - localOffset = connection->offset + 7; - localX = x - localOffset; - localLength = gMapHeader.mapData->height + 7; - localY = y - localLength; - break; - case 3: - localLength = mapHeader->mapData->width - 7; - localX = localLength + x; // additions are reversed for some reason - localOffset = connection->offset + 7; - localY = y - localOffset; - break; - case 4: - localLength = gMapHeader.mapData->width + 7; - localX = x - localLength; - localOffset = connection->offset + 7; - localY = y - localOffset; - break; - default: - return FALSE; - } - return HiddenItemAtPos(mapHeader->events, localX, localY); -} - -// weird math -#ifdef NONMATCHING -void sub_80C9720(u8 taskId) -{ - s16 x, y; - s16 curX, curY; - s16 width = gMapHeader.mapData->width + 7; - s16 height = gMapHeader.mapData->height + 7; - - PlayerGetDestCoords(&x, &y); - - for (curX = x - 7; curX <= x + 7; curX++) - { - for (curY = y - 5; curY <= y + 5; curY++) - { - if (7 > curX - || curX >= width - || 7 > curY - || curY >= height) - { - struct MapConnection *conn = sub_8056BA0(curX, curY); - if (conn && sub_80C9688(conn, curX, curY) == TRUE) - sub_80C9838(taskId, curX - x, curY - y); - } - } - } -} -#else -__attribute__((naked)) -void sub_80C9720(u8 taskId) -{ - asm(".syntax 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\ - lsrs r0, 24\n\ - str r0, [sp, 0x4]\n\ - ldr r0, _080C9834 @ =gMapHeader\n\ - ldr r1, [r0]\n\ - ldr r0, [r1]\n\ - adds r0, 0x7\n\ - lsls r0, 16\n\ - lsrs r0, 16\n\ - str r0, [sp, 0x8]\n\ - ldr r0, [r1, 0x4]\n\ - adds r0, 0x7\n\ - lsls r0, 16\n\ - lsrs r0, 16\n\ - str r0, [sp, 0xC]\n\ - mov r4, sp\n\ - adds r4, 0x2\n\ - mov r0, sp\n\ - adds r1, r4, 0\n\ - bl PlayerGetDestCoords\n\ - mov r0, sp\n\ - ldrh r0, [r0]\n\ - subs r0, 0x7\n\ - lsls r0, 16\n\ - lsrs r3, r0, 16\n\ - asrs r0, 16\n\ - mov r1, sp\n\ - movs r2, 0\n\ - ldrsh r1, [r1, r2]\n\ - adds r1, 0x7\n\ - cmp r0, r1\n\ - bgt _080C9824\n\ -_080C976E:\n\ - mov r5, sp\n\ - ldrh r0, [r5, 0x2]\n\ - subs r0, 0x5\n\ - lsls r0, 16\n\ - lsrs r4, r0, 16\n\ - lsls r2, r4, 16\n\ - asrs r1, r2, 16\n\ - movs r6, 0x2\n\ - ldrsh r0, [r5, r6]\n\ - adds r0, 0x5\n\ - lsls r3, 16\n\ - mov r8, r3\n\ - cmp r1, r0\n\ - bgt _080C980E\n\ - movs r0, 0x7\n\ - str r0, [sp, 0x10]\n\ - mov r1, r8\n\ - asrs r1, 16\n\ - mov r9, r1\n\ - mov r10, r0\n\ -_080C9796:\n\ - ldr r3, [sp, 0x10]\n\ - cmp r3, r9\n\ - bgt _080C97B8\n\ - ldr r5, [sp, 0x8]\n\ - lsls r0, r5, 16\n\ - asrs r0, 16\n\ - cmp r9, r0\n\ - bge _080C97B8\n\ - asrs r1, r2, 16\n\ - cmp r10, r1\n\ - bgt _080C97B8\n\ - ldr r6, [sp, 0xC]\n\ - lsls r0, r6, 16\n\ - asrs r0, 16\n\ - lsls r7, r4, 16\n\ - cmp r1, r0\n\ - blt _080C97F6\n\ -_080C97B8:\n\ - mov r0, r8\n\ - asrs r5, r0, 16\n\ - lsls r4, 16\n\ - asrs r6, r4, 16\n\ - adds r0, r5, 0\n\ - adds r1, r6, 0\n\ - bl sub_8056BA0\n\ - adds r7, r4, 0\n\ - cmp r0, 0\n\ - beq _080C97F6\n\ - adds r1, r5, 0\n\ - adds r2, r6, 0\n\ - bl sub_80C9688\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - cmp r0, 0x1\n\ - bne _080C97F6\n\ - mov r0, sp\n\ - ldrh r1, [r0]\n\ - subs r1, r5, r1\n\ - lsls r1, 16\n\ - asrs r1, 16\n\ - ldrh r2, [r0, 0x2]\n\ - subs r2, r6, r2\n\ - lsls r2, 16\n\ - asrs r2, 16\n\ - ldr r0, [sp, 0x4]\n\ - bl sub_80C9838\n\ -_080C97F6:\n\ - movs r1, 0x80\n\ - lsls r1, 9\n\ - adds r0, r7, r1\n\ - lsrs r4, r0, 16\n\ - lsls r2, r4, 16\n\ - asrs r1, r2, 16\n\ - mov r3, sp\n\ - movs r5, 0x2\n\ - ldrsh r0, [r3, r5]\n\ - adds r0, 0x5\n\ - cmp r1, r0\n\ - ble _080C9796\n\ -_080C980E:\n\ - movs r1, 0x80\n\ - lsls r1, 9\n\ - add r1, r8\n\ - lsrs r3, r1, 16\n\ - asrs r1, 16\n\ - mov r0, sp\n\ - movs r6, 0\n\ - ldrsh r0, [r0, r6]\n\ - adds r0, 0x7\n\ - cmp r1, r0\n\ - ble _080C976E\n\ -_080C9824:\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\n\ - .align 2, 0\n\ -_080C9834: .4byte gMapHeader\n\ - .syntax divided"); -} -#endif - -void sub_80C9838(u8 taskId, s16 x, s16 y) -{ - s16 *data = gTasks[taskId].data; - s16 var1, var2, var3, var4; - - if(data[2] == FALSE) - { - data[0] = x; - data[1] = y; - data[2] = TRUE; - } - else - { - // data[0] and data[1] contain the player's coordinates. - // x and y contain the item's coordinates. - if(data[0] < 0) - var1 = data[0] * -1; // item is to the left - else - var1 = data[0]; // item is to the right - - if(data[1] < 0) - var2 = data[1] * -1; // item is to the north - else - var2 = data[1]; // item is to the south - - if(x < 0) - var3 = x * -1; - else - var3 = x; - - if(y < 0) - var4 = y * -1; - else - var4 = y; - - if(var1 + var2 > var3 + var4) - { - data[0] = x; - data[1] = y; - } - else - { - if(var1 + var2 == var3 + var4 && (var2 > var4 || (var2 == var4 && data[1] < y))) - { - data[0] = x; - data[1] = y; - } - } - } -} - -u8 GetPlayerDirectionTowardsHiddenItem(s16 itemX, s16 itemY) -{ - s16 abX, abY; - - if(itemX == 0 && itemY == 0) - return DIR_NONE; // player is standing on the item. - - // get absolute X distance. - if(itemX < 0) - abX = itemX * -1; - else - abX = itemX; - - // get absolute Y distance. - if(itemY < 0) - abY = itemY * -1; - else - abY = itemY; - - if(abX > abY) - { - if(itemX < 0) - return DIR_EAST; - else - return DIR_NORTH; - } - else - { - if(abX < abY) - { - if(itemY < 0) - return DIR_SOUTH; - else - return DIR_WEST; - } - if(abX == abY) - { - if(itemY < 0) - return DIR_SOUTH; - else - return DIR_WEST; - } - return DIR_NONE; // should never get here. return something so it doesnt crash. - } -} - -void SetPlayerDirectionTowardsItem(u8 direction) -{ - FieldObjectClearAnimIfSpecialAnimFinished(&gMapObjects[GetFieldObjectIdByLocalIdAndMap(0xFF, 0, 0)]); - FieldObjectClearAnim(&gMapObjects[GetFieldObjectIdByLocalIdAndMap(0xFF, 0, 0)]); - UnfreezeMapObject(&gMapObjects[GetFieldObjectIdByLocalIdAndMap(0xFF, 0, 0)]); - PlayerTurnInPlace(direction); -} - -void DisplayItemRespondingMessageAndExitItemfinder(u8 taskId) -{ - if(FieldObjectCheckIfSpecialAnimFinishedOrInactive(&gMapObjects[GetFieldObjectIdByLocalIdAndMap(0xFF, 0, 0)]) == TRUE) - DisplayItemMessageOnField(taskId, gOtherText_ItemfinderResponding, ExitItemfinder, 0); -} - -void RotatePlayerAndExitItemfinder(u8 taskId) -{ - s16 *data = gTasks[taskId].data; - - if(FieldObjectCheckIfSpecialAnimFinishedOrInactive(&gMapObjects[GetFieldObjectIdByLocalIdAndMap(0xFF, 0, 0)]) == TRUE - || data[2] == FALSE) - { - SetPlayerDirectionTowardsItem(gItemFinderDirections[data[5]]); - data[2] = 1; - data[5] = (data[5] + 1) & 3; - data[3]++; - - if(data[3] == 4) - DisplayItemMessageOnField(taskId, gOtherText_ItemfinderItemUnderfoot, ExitItemfinder, 0); - } -} - -void ItemUseOutOfBattle_PokeblockCase(u8 taskId) -{ - if(sub_80F9344() == TRUE) - { - DisplayDadsAdviceCannotUseItemMessage(taskId, gTasks[taskId].data[2]); - } - else if(gTasks[taskId].data[2] != TRUE) - { - sub_810BA7C(0); - ItemMenu_ConfirmNormalFade(taskId); - } - else - { - gFieldCallback = (void *)sub_8080E28; - sub_810BA7C(1); - ItemMenu_ConfirmComplexFade(taskId); - } -} - -void ItemUseOutOfBattle_CoinCase(u8 taskId) -{ - ConvertIntToDecimalStringN(gStringVar1, GetCoins(), 0, 4); - StringExpandPlaceholders(gStringVar4, gOtherText_Coins3); - - if(!gTasks[taskId].data[2]) - { - MenuZeroFillWindowRect(0, 0xD, 0xD, 0x14); - DisplayItemMessageOnField(taskId, gStringVar4, CleanUpItemMenuMessage, 1); - } - else - { - DisplayItemMessageOnField(taskId, gStringVar4, CleanUpOverworldMessage, 0); - } -} - -void sub_80C9BB8(u8 var) -{ - if(gMain.newKeys & A_BUTTON) - CleanUpItemMenuMessage(var); -} - -void sub_80C9BD8(u8 var) -{ - if(gMain.newKeys & A_BUTTON) - CleanUpOverworldMessage(var); -} - -// unused -void ItemUseOutOfBattle_SSTicket(u8 taskId) -{ - if(gTasks[taskId].data[2] == 0) - { - MenuZeroFillWindowRect(0, 0xD, 0xD, 0x14); - DisplayItemMessageOnField(taskId, gUnknown_083D61DC[ItemId_GetSecondaryId(gScriptItemId)], sub_80C9BB8, 1); - } - else - { - DisplayItemMessageOnField(taskId, gUnknown_083D61DC[ItemId_GetSecondaryId(gScriptItemId)], sub_80C9BD8, 0); - } -} - -void sub_80C9C7C(u8 taskId) -{ - if(IsPlayerFacingPlantedBerryTree() == TRUE) - { - gUnknown_03005D00 = sub_80C9D00; - gFieldCallback = ExecuteItemUseFromBlackPalette; - gTasks[taskId].data[8] = (u32)c2_exit_to_overworld_2_switch >> 16; - gTasks[taskId].data[9] = (u32)c2_exit_to_overworld_2_switch; - gTasks[taskId].func = HandleItemMenuPaletteFade; - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, 0); - } - else - { - ItemId_GetFieldFunc(gScriptItemId)(taskId); - } -} - -void sub_80C9D00(u8 taskId) -{ - RemoveBagItem(gScriptItemId, 1); - ScriptContext2_Enable(); - ScriptContext1_SetupScript(gUnknown_081A1654); - DestroyTask(taskId); -} - -void ItemUseOutOfBattle_WailmerPail(u8 taskId) -{ - if(TryToWaterBerryTree() == TRUE) - { - gUnknown_03005D00 = sub_80C9D74; - SetUpItemUseOnFieldCallback(taskId); - } - else - { - DisplayDadsAdviceCannotUseItemMessage(taskId, gTasks[taskId].data[2]); - } -} - -void sub_80C9D74(u8 taskId) -{ - ScriptContext2_Enable(); - ScriptContext1_SetupScript(gUnknown_081A168F); - DestroyTask(taskId); -} - -void sub_80C9D98(u8 taskId) -{ - gUnknown_02038561 = 0; - ItemMenu_ConfirmNormalFade(taskId); -} - -void ItemUseOutOfBattle_Medicine(u8 taskId) -{ - gUnknown_03004AE4 = UseMedicine; - sub_80C9D98(taskId); -} - -void ItemUseOutOfBattle_SacredAsh(u8 taskId) -{ - u8 i; - - gLastFieldPokeMenuOpened = 0; - - for(i = 0; i < 6; i++) - { - if(GetMonData(&gPlayerParty[i], MON_DATA_SPECIES) != 0 && GetMonData(&gPlayerParty[i], MON_DATA_HP) == 0) - { - gLastFieldPokeMenuOpened = i; - break; - } - } - gUnknown_03004AE4 = sub_8070048; - gUnknown_02038561 = 4; - ItemMenu_ConfirmNormalFade(taskId); -} - -void ItemUseOutOfBattle_PPRecovery(u8 taskId) -{ - gUnknown_03004AE4 = DoPPRecoveryItemEffect; - sub_80C9D98(taskId); -} - -void ItemUseOutOfBattle_PPUp(u8 taskId) -{ - gUnknown_03004AE4 = DoPPUpItemEffect; - sub_80C9D98(taskId); -} - -void ItemUseOutOfBattle_RareCandy(u8 taskId) -{ - gUnknown_03004AE4 = DoRareCandyItemEffect; - sub_80C9D98(taskId); -} - -void ItemUseOutOfBattle_TMHM(u8 taskId) -{ - MenuZeroFillWindowRect(0, 0xD, 0xD, 0x14); - - if(gScriptItemId >= ITEM_HM01) - DisplayItemMessageOnField(taskId, gOtherText_BootedHM, sub_80C9EE4, 1); // HM - else - DisplayItemMessageOnField(taskId, gOtherText_BootedTM, sub_80C9EE4, 1); // TM -} - -void sub_80C9EE4(u8 taskId) -{ - PlaySE(2); - gTasks[taskId].func = sub_80C9F10; -} - -void sub_80C9F10(u8 taskId) -{ - if(gMain.newKeys & A_BUTTON || gMain.newKeys & B_BUTTON) - { - StringCopy(gStringVar1, gMoveNames[ItemIdToBattleMoveId(gScriptItemId)]); - StringExpandPlaceholders(gStringVar4, gOtherText_ContainsMove); - DisplayItemMessageOnField(taskId, gStringVar4, sub_80C9F80, 1); - } -} - -void sub_80C9F80(u8 var) -{ - DisplayYesNoMenu(7, 7, 1); - sub_80A3FA0(gBGTilemapBuffers[1], 8, 8, 5, 4, 1); - DoYesNoFuncWithChoice(var, &gUnknown_083D61F4); -} - -void sub_80C9FC0(u8 var) -{ - gUnknown_03004AE4 = TeachMonTMMove; - sub_80C9D98(var); -} - -void sub_80C9FDC(void) -{ - RemoveBagItem(gScriptItemId, 1); - sub_80A3E0C(); - CopyItemName(gScriptItemId, gStringVar2); - StringExpandPlaceholders(gStringVar4, gOtherText_UsedItem); -} - -void ItemUseOutOfBattle_Repel(u8 var) -{ - if(VarGet(VAR_REPEL_STEP_COUNT) == FALSE) - { - VarSet(VAR_REPEL_STEP_COUNT, ItemId_GetHoldEffectParam(gScriptItemId)); - sub_80C9FDC(); - DisplayItemMessageOnField(var, gStringVar4, CleanUpItemMenuMessage, 1); - } - else - { - DisplayItemMessageOnField(var, gOtherText_RepelLingers, CleanUpItemMenuMessage, 1); - } -} - -void sub_80CA07C(void) -{ - sub_80A3E0C(); - CopyItemName(gScriptItemId, gStringVar2); -} - -void sub_80CA098(u8 taskId) -{ - if(++gTasks[taskId].data[15] > 7) - { - PlaySE(0x75); - DisplayItemMessageOnField(taskId, gStringVar4, CleanUpItemMenuMessage, 1); - } -} - -void ItemUseOutOfBattle_BlackWhiteFlute(u8 taskId) -{ - if(gScriptItemId == 43) - { - FlagSet(SYS_ENC_UP_ITEM); - FlagReset(SYS_ENC_DOWN_ITEM); - sub_80CA07C(); - StringExpandPlaceholders(gStringVar4, gOtherText_UsedFlute); - gTasks[taskId].func = sub_80CA098; - gTasks[taskId].data[15] = 0; - } - else if(gScriptItemId == 42) - { - FlagSet(SYS_ENC_DOWN_ITEM); - FlagReset(SYS_ENC_UP_ITEM); - sub_80CA07C(); - StringExpandPlaceholders(gStringVar4, gOtherText_UsedRepel); - gTasks[taskId].func = sub_80CA098; - gTasks[taskId].data[15] = 0; - } -} - -void task08_080A1C44(u8 taskId) -{ - player_avatar_init_params_reset(); - sub_80878A8(); - DestroyTask(taskId); -} - -void sub_80CA18C(u8 taskId) -{ - sub_8053014(); - sub_80C9FDC(); - gTasks[taskId].data[0] = 0; - DisplayItemMessageOnField(taskId, gStringVar4, task08_080A1C44, 0); -} - -bool8 sub_80CA1C8(void) -{ - if(gMapHeader.mapType == MAP_TYPE_UNDERGROUND) - return TRUE; - else - return FALSE; -} - -void ItemUseOutOfBattle_EscapeRope(u8 taskId) -{ - if(sub_80CA1C8() == TRUE) // is map type an area you can use escape rope? - { - gUnknown_03005D00 = sub_80CA18C; - SetUpItemUseOnFieldCallback(taskId); - } - else - { - DisplayDadsAdviceCannotUseItemMessage(taskId, gTasks[taskId].data[2]); - } -} - -void ItemUseOutOfBattle_EvolutionStone(u8 var) -{ - gUnknown_03004AE4 = DoEvolutionStoneItemEffect; - sub_80C9D98(var); -} - -void ItemUseInBattle_PokeBall(u8 var) -{ - if(PlayerPartyAndPokemonStorageFull() == FALSE) // have room for mon? - { - RemoveBagItem(gScriptItemId, 1); - sub_80A7094(var); - } - else - { - MenuZeroFillWindowRect(0, 0xD, 0xD, 0x14); - DisplayItemMessageOnField(var, gOtherText_BoxIsFull, CleanUpItemMenuMessage, 1); - } -} - -void sub_80CA294(u8 var) -{ - if(gMain.newKeys & A_BUTTON || gMain.newKeys & B_BUTTON) - sub_80A7094(var); -} - -void sub_80CA2BC(u8 taskId) -{ - if(++gTasks[taskId].data[15] > 7) - { - PlaySE(1); - RemoveBagItem(gScriptItemId, 1); - DisplayItemMessageOnField(taskId, sub_803F378(gScriptItemId), sub_80CA294, 1); - } -} - -void ItemUseInBattle_StatIncrease(u8 taskId) -{ - u16 partyId = gBattlePartyID[gBankInMenu]; - - MenuZeroFillWindowRect(0, 0xD, 0xD, 0x14); - - if(ExecuteTableBasedItemEffect_(&gPlayerParty[partyId], gScriptItemId, partyId, 0) != FALSE) - { - DisplayItemMessageOnField(taskId, gOtherText_WontHaveAnyEffect, CleanUpItemMenuMessage, 1); - } - else - { - gTasks[taskId].func = sub_80CA2BC; - gTasks[taskId].data[15] = 0; - } -} - -void sub_80CA394(u8 taskId) -{ - if(!gPaletteFade.active) - { - sub_8094E4C(); - gpu_pal_allocator_reset__manage_upper_four(); - DestroyTask(taskId); - } -} - -void sub_80CA3C0(u8 taskId) -{ - gTasks[taskId].func = sub_80CA394; - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0); -} - -void ItemUseInBattle_Medicine(u8 var) -{ - gUnknown_03004AE4 = UseMedicine; - sub_80CA3C0(var); -} - -void unref_sub_80CA410(u8 var) -{ - gUnknown_03004AE4 = sub_8070048; - sub_80CA3C0(var); -} - -void ItemUseInBattle_PPRecovery(u8 var) -{ - gUnknown_03004AE4 = DoPPRecoveryItemEffect; - sub_80CA3C0(var); -} - -void unref_sub_80CA448(u8 var) -{ - MenuZeroFillWindowRect(0, 0xD, 0xD, 0x14); - - if(ExecuteTableBasedItemEffect__(0, gScriptItemId, 0) == FALSE) - { - RemoveBagItem(gScriptItemId, 1); - GetMonNickname(&gPlayerParty[0], gStringVar1); - StringExpandPlaceholders(gStringVar4, gOtherText_SnapConfusion); - DisplayItemMessageOnField(var, gStringVar4, sub_80A7094, 1); - } - else - { - DisplayItemMessageOnField(var, gOtherText_WontHaveAnyEffect, CleanUpItemMenuMessage, 1); - } -} - -void ItemUseInBattle_Escape(u8 taskId) -{ - MenuZeroFillWindowRect(0, 0xD, 0xD, 0x14); - - if((gBattleTypeFlags & BATTLE_TYPE_TRAINER) == FALSE) - { - sub_80C9FDC(); - DisplayItemMessageOnField(taskId, gStringVar4, sub_80A7094, 1); - } - else - { - DisplayDadsAdviceCannotUseItemMessage(taskId, gTasks[taskId].data[2]); - } -} - -void ItemUseOutOfBattle_EnigmaBerry(u8 taskId) -{ - switch(GetItemEffectType(gScriptItemId) - 1) - { - case 1: - case 2: - case 3: - case 4: - case 5: - case 6: - case 10: - case 11: - case 12: - case 13: - case 14: - case 15: - case 16: - gTasks[taskId].data[15] = 1; - ItemUseOutOfBattle_Medicine(taskId); - break; - case 9: - gTasks[taskId].data[15] = 1; - ItemUseOutOfBattle_SacredAsh(taskId); - break; - case 0: - gTasks[taskId].data[15] = 1; - ItemUseOutOfBattle_RareCandy(taskId); - break; - case 18: - case 19: - gTasks[taskId].data[15] = 1; - ItemUseOutOfBattle_PPUp(taskId); - break; - case 20: - gTasks[taskId].data[15] = 1; - ItemUseOutOfBattle_PPRecovery(taskId); - break; - default: - gTasks[taskId].data[15] = 4; - ItemUseOutOfBattle_CannotUse(taskId); - } -} - -void ItemUseInBattle_EnigmaBerry(u8 taskId) -{ - switch(GetItemEffectType(gScriptItemId)) - { - case 0: - ItemUseInBattle_StatIncrease(taskId); - break; - case 2: - case 3: - case 4: - case 5: - case 6: - case 7: - case 8: - case 9: - case 11: - ItemUseInBattle_Medicine(taskId); - break; - case 21: - ItemUseInBattle_PPRecovery(taskId); - break; - default: - ItemUseOutOfBattle_CannotUse(taskId); - } -} - -void ItemUseOutOfBattle_CannotUse(u8 taskId) -{ - DisplayDadsAdviceCannotUseItemMessage(taskId, gTasks[taskId].data[2]); -} |