diff options
author | yenatch <yenatch@gmail.com> | 2017-03-22 18:34:29 -0400 |
---|---|---|
committer | yenatch <yenatch@gmail.com> | 2017-03-22 18:34:29 -0400 |
commit | 7acbfe40778bfbd03b0e2d357efef9ee9b0a34e9 (patch) | |
tree | 90c0b95146f3d768b536658eac6a63ff9adcaaec /src/item_use.c | |
parent | c0a27d5455014bfe54f7ea73e8a38ce0ed8da6da (diff) | |
parent | e3c26e52ae6ab881ade913ca1fad2cd9629bbcb1 (diff) |
Merge remote-tracking branch 'origin/master'
Conflicts:
Makefile
Diffstat (limited to 'src/item_use.c')
-rw-r--r-- | src/item_use.c | 434 |
1 files changed, 204 insertions, 230 deletions
diff --git a/src/item_use.c b/src/item_use.c index 557705460..b68b72b26 100644 --- a/src/item_use.c +++ b/src/item_use.c @@ -1,21 +1,22 @@ #include "global.h" -#include "task.h" -#include "item.h" -#include "palette.h" -#include "weather.h" -#include "string_util.h" -#include "menu.h" -#include "mail.h" #include "asm.h" -#include "rom4.h" -#include "metatile_behavior.h" -#include "field_player_avatar.h" #include "event_data.h" +#include "field_player_avatar.h" +#include "field_player_avatar.h" +#include "item.h" +#include "mail.h" #include "map_obj_lock.h" +#include "menu.h" +#include "metatile_behavior.h" +#include "palette.h" +#include "rom4.h" #include "script.h" -#include "field_player_avatar.h" -#include "sound.h" #include "songs.h" +#include "sound.h" +#include "string_util.h" +#include "task.h" +#include "weather.h" +#include "fieldmap.h" extern void (* const gExitToOverworldFuncList[])(); extern void (* gUnknown_03005D00)(u8); @@ -38,6 +39,7 @@ extern u8 GetPlayerDirectionTowardsHiddenItem(s16, s16); extern void SetPlayerDirectionTowardsItem(u8); extern void DisplayItemRespondingMessageAndExitItemfinder(u8); extern void RotatePlayerAndExitItemfinder(u8); +extern void sub_80C9838(u8, s16, s16); extern u8 gOtherText_DadsAdvice[]; extern u8 gOtherText_CantGetOffBike[]; @@ -47,15 +49,16 @@ extern u8 gItemFinderDirections[]; extern u16 gScriptItemId; -bool8 ItemfinderCheckForHiddenItems(struct MapEvents *events, int); +bool8 ItemfinderCheckForHiddenItems(struct MapEvents *events, u8 taskId); void RunItemfinderResults(u8); void ExitItemfinder(u8); +void sub_80C9720(u8); void ExecuteSwitchToOverworldFromItemUse(u8 taskId) { u8 taskData; - if(gScriptItemId == 0xAF) + if (gScriptItemId == 0xAF) taskData = gTasks[taskId].data[15] - 1; else taskData = ItemId_GetType(gScriptItemId) - 1; @@ -67,119 +70,119 @@ void ExecuteSwitchToOverworldFromItemUse(u8 taskId) void ItemMenu_ConfirmNormalFade(u8 var) { - ExecuteSwitchToOverworldFromItemUse(var); - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0); + ExecuteSwitchToOverworldFromItemUse(var); + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0); } void ItemMenu_ConfirmComplexFade(u8 var) { - ExecuteSwitchToOverworldFromItemUse(var); - fade_screen(1, 0); + ExecuteSwitchToOverworldFromItemUse(var); + fade_screen(1, 0); } void SetUpItemUseOnFieldCallback(u8 taskId) { - if(gTasks[taskId].data[2] != 1) - { - gUnknown_0300485C = (void *)ExecuteItemUseFromBlackPalette; - ItemMenu_ConfirmNormalFade(taskId); - } - else - gUnknown_03005D00(taskId); + if (gTasks[taskId].data[2] != 1) + { + gUnknown_0300485C = (void *)ExecuteItemUseFromBlackPalette; + ItemMenu_ConfirmNormalFade(taskId); + } + else + gUnknown_03005D00(taskId); } -void HandleDeniedItemUseMessage(u8 var1, u8 playerMenuStatus, const u8 *var3) +void HandleDeniedItemUseMessage(u8 var1, u8 playerMenuStatus, const u8 *text) { - StringExpandPlaceholders(gStringVar4, var3); - - 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; - } + 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); + HandleDeniedItemUseMessage(var1, playerMenuStatus, gOtherText_DadsAdvice); } void DisplayCantGetOffBikeItemMessage(u8 var1, u8 playerMenuStatus) { - HandleDeniedItemUseMessage(var1, playerMenuStatus, gOtherText_CantGetOffBike); + 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; + 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; + struct MailStruct mailStruct; - if(!gPaletteFade.active) - { - mailStruct.itemId = gScriptItemId; - HandleReadMail(&mailStruct, sub_80A5D04, 0); - DestroyTask(taskId); - } + 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; + 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]); - } + 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); + if (ItemId_GetSecondaryId(gScriptItemId) == 0) + GetOnOffBike(2); + if (ItemId_GetSecondaryId(gScriptItemId) == 1) + GetOnOffBike(4); + + sub_8064E2C(); + ScriptContext2_Disable(); + DestroyTask(taskId); } bool32 CanFish(void) @@ -214,31 +217,31 @@ bool32 CanFish(void) void ItemUseOutOfBattle_Rod(u8 taskId) { - if(CanFish() == TRUE) - { - gUnknown_03005D00 = (void *)ItemUseOnFieldCB_Rod; - SetUpItemUseOnFieldCallback(taskId); - } - else - DisplayDadsAdviceCannotUseItemMessage(taskId, gTasks[taskId].data[2]); + 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); + StartFishing(ItemId_GetSecondaryId(gScriptItemId)); + DestroyTask(taskId); } void ItemUseOutOfBattle_Itemfinder(u8 var) { - IncrementGameStat(0x27); - gUnknown_03005D00 = (void *)ItemUseOnFieldCB_Itemfinder; - SetUpItemUseOnFieldCallback(var); + IncrementGameStat(0x27); + gUnknown_03005D00 = (void *)ItemUseOnFieldCB_Itemfinder; + SetUpItemUseOnFieldCallback(var); } void ItemUseOnFieldCB_Itemfinder(u8 taskId) { - if(ItemfinderCheckForHiddenItems(gMapHeader.events, taskId) == TRUE) + if (ItemfinderCheckForHiddenItems(gMapHeader.events, taskId) == TRUE) gTasks[taskId].func = RunItemfinderResults; else DisplayItemMessageOnField(taskId, gOtherText_NoResponse, ExitItemfinder, 0); @@ -247,16 +250,16 @@ void ItemUseOnFieldCB_Itemfinder(u8 taskId) void RunItemfinderResults(u8 taskId) { u8 playerDir; - u8 playerDirToItem; + u8 playerDirToItem; u8 i; s16 *data = gTasks[taskId].data; - if(!data[3]) + if (!data[3]) { - if(data[4] == 4) + if (data[4] == 4) { playerDirToItem = GetPlayerDirectionTowardsHiddenItem(data[0], data[1]); - if(playerDirToItem) + if (playerDirToItem) { SetPlayerDirectionTowardsItem(gItemFinderDirections[playerDirToItem - 1]); gTasks[taskId].func = DisplayItemRespondingMessageAndExitItemfinder; @@ -265,7 +268,7 @@ void RunItemfinderResults(u8 taskId) { playerDir = player_get_direction_lower_nybble(); - // rotate player clockwise depending on current direction. + // rotate player clockwise depending on current direction. for (i = 0; i < 4; i++) if (playerDir == gItemFinderDirections[i]) data[5] = (i + 1) & 3; @@ -274,7 +277,7 @@ void RunItemfinderResults(u8 taskId) data[3] = 0; data[2] = 0; } - return; + return; } PlaySE(SE_DAUGI); // play the itemfinder jingle 4 times before executing the itemfinder. data[4]++; @@ -284,131 +287,102 @@ void RunItemfinderResults(u8 taskId) void ExitItemfinder(u8 taskId) { - MenuZeroFillWindowRect(0, 14, 29, 19); - sub_8064E2C(); - ScriptContext2_Disable(); - DestroyTask(taskId); + MenuZeroFillWindowRect(0, 14, 29, 19); + sub_8064E2C(); + ScriptContext2_Disable(); + DestroyTask(taskId); } -// too much struct math. -__attribute__((naked)) -bool8 ItemfinderCheckForHiddenItems(struct MapEvents *events, int var) +bool8 ItemfinderCheckForHiddenItems(struct MapEvents *events, u8 taskId) { - asm(".syntax unified\n\ - push {r4-r7,lr}\n\ - mov r7, r9\n\ - mov r6, r8\n\ - push {r6,r7}\n\ - sub sp, 0x4\n\ - adds r5, r0, 0\n\ - lsls r1, 24\n\ - lsrs r6, r1, 24\n\ - mov r4, sp\n\ - adds r4, 0x2\n\ - mov r0, sp\n\ - adds r1, r4, 0\n\ - bl PlayerGetDestCoords\n\ - ldr r1, _080C9618 @ =gTasks\n\ - lsls r0, r6, 2\n\ - adds r0, r6\n\ - lsls r0, 3\n\ - adds r0, r1\n\ - movs r1, 0\n\ - strh r1, [r0, 0xC]\n\ - movs r3, 0\n\ - mov r9, r4\n\ - ldrb r0, [r5, 0x3]\n\ - cmp r3, r0\n\ - bge _080C95FC\n\ - subs r1, 0x5\n\ - mov r8, r1\n\ -_080C9580:\n\ - lsls r3, 16\n\ - asrs r1, r3, 16\n\ - ldr r2, [r5, 0x10]\n\ - lsls r0, r1, 1\n\ - adds r0, r1\n\ - lsls r4, r0, 2\n\ - adds r1, r4, r2\n\ - ldrb r0, [r1, 0x5]\n\ - adds r7, r3, 0\n\ - cmp r0, 0x7\n\ - bne _080C95EC\n\ - movs r2, 0x96\n\ - lsls r2, 2\n\ - adds r0, r2, 0\n\ - ldrh r1, [r1, 0xA]\n\ - adds r0, r1\n\ - lsls r0, 16\n\ - lsrs r0, 16\n\ - bl FlagGet\n\ - lsls r0, 24\n\ - cmp r0, 0\n\ - bne _080C95EC\n\ - ldr r1, [r5, 0x10]\n\ - adds r1, r4, r1\n\ - ldrh r2, [r1]\n\ - adds r2, 0x7\n\ - mov r0, sp\n\ - ldrh r0, [r0]\n\ - subs r2, r0\n\ - ldrh r0, [r1, 0x2]\n\ - adds r0, 0x7\n\ - mov r3, r9\n\ - ldrh r1, [r3]\n\ - subs r0, r1\n\ - lsls r0, 16\n\ - lsrs r0, 16\n\ - lsls r2, 16\n\ - asrs r1, r2, 16\n\ - movs r3, 0xE0\n\ - lsls r3, 11\n\ - adds r2, r3\n\ - lsrs r2, 16\n\ - cmp r2, 0xE\n\ - bhi _080C95EC\n\ - lsls r0, 16\n\ - asrs r2, r0, 16\n\ - cmp r2, r8\n\ - blt _080C95EC\n\ - cmp r2, 0x5\n\ - bgt _080C95EC\n\ - adds r0, r6, 0\n\ - bl sub_80C9838\n\ -_080C95EC:\n\ - movs r1, 0x80\n\ - lsls r1, 9\n\ - adds r0, r7, r1\n\ - lsrs r3, r0, 16\n\ - asrs r0, 16\n\ - ldrb r2, [r5, 0x3]\n\ - cmp r0, r2\n\ - blt _080C9580\n\ -_080C95FC:\n\ - adds r0, r6, 0\n\ - bl sub_80C9720\n\ - ldr r0, _080C9618 @ =gTasks\n\ - lsls r1, r6, 2\n\ - adds r1, r6\n\ - lsls r1, 3\n\ - adds r1, r0\n\ - movs r3, 0xC\n\ - ldrsh r0, [r1, r3]\n\ - cmp r0, 0x1\n\ - beq _080C961C\n\ - movs r0, 0\n\ - b _080C961E\n\ - .align 2, 0\n\ -_080C9618: .4byte gTasks\n\ -_080C961C:\n\ - movs r0, 0x1\n\ -_080C961E:\n\ - add sp, 0x4\n\ - pop {r3,r4}\n\ - mov r8, r3\n\ - mov r9, r4\n\ - pop {r4-r7}\n\ - pop {r1}\n\ - bx r1\n\ - .syntax divided"); + 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); } |