diff options
author | ProjectRevoTPP <projectrevotpp@hotmail.com> | 2017-01-01 19:16:57 -0500 |
---|---|---|
committer | YamaArashi <YamaArashi@users.noreply.github.com> | 2017-01-01 16:16:57 -0800 |
commit | 7de050c235adef3031c991bbf4520d785f0a31ad (patch) | |
tree | e6c360ec4edaa676cfea7dea3f85c1a8c6d1a295 | |
parent | 6016d18c1dba45bcd55471ca656d5d53b2118cc6 (diff) |
start decompiling item_use.c (#144)
* begin decompiling item_use.c
* decompile more of item_use.c
* commit what I have currently
* formatting
-rw-r--r-- | asm/item_use.s | 847 | ||||
-rw-r--r-- | include/asm_fieldmap.h | 2 | ||||
-rw-r--r-- | include/field_player_avatar.h | 4 | ||||
-rw-r--r-- | include/global.fieldmap.h | 5 | ||||
-rw-r--r-- | ld_script.txt | 1 | ||||
-rw-r--r-- | src/item_use.c | 410 |
6 files changed, 417 insertions, 852 deletions
diff --git a/asm/item_use.s b/asm/item_use.s index 65953583e..8a1bf766e 100644 --- a/asm/item_use.s +++ b/asm/item_use.s @@ -6,853 +6,6 @@ .text - thumb_func_start sub_80C8FAC -sub_80C8FAC: @ 80C8FAC - push {r4,lr} - lsls r0, 24 - lsrs r4, r0, 24 - ldr r1, _080C8FD0 @ =gScriptItemId - ldrh r0, [r1] - cmp r0, 0xAF - bne _080C8FD8 - ldr r1, _080C8FD4 @ =gTasks - lsls r2, r4, 2 - adds r0, r2, r4 - lsls r0, 3 - adds r0, r1 - ldrh r0, [r0, 0x26] - subs r0, 0x1 - lsls r0, 24 - lsrs r3, r0, 24 - b _080C8FE6 - .align 2, 0 -_080C8FD0: .4byte gScriptItemId -_080C8FD4: .4byte gTasks -_080C8FD8: - ldrh r0, [r1] - bl ItemId_GetType - subs r0, 0x1 - lsls r0, 24 - lsrs r3, r0, 24 - lsls r2, r4, 2 -_080C8FE6: - ldr r0, _080C9008 @ =gTasks - adds r1, r2, r4 - lsls r1, 3 - adds r1, r0 - ldr r2, _080C900C @ =gUnknown_083D61E4 - lsls r0, r3, 2 - adds r0, r2 - ldr r2, [r0] - lsrs r0, r2, 16 - strh r0, [r1, 0x18] - strh r2, [r1, 0x1A] - ldr r0, _080C9010 @ =sub_80A5B00 - str r0, [r1] - pop {r4} - pop {r0} - bx r0 - .align 2, 0 -_080C9008: .4byte gTasks -_080C900C: .4byte gUnknown_083D61E4 -_080C9010: .4byte sub_80A5B00 - thumb_func_end sub_80C8FAC - - thumb_func_start unknown_ItemMenu_Confirm -unknown_ItemMenu_Confirm: @ 80C9014 - push {lr} - sub sp, 0x4 - lsls r0, 24 - lsrs r0, 24 - bl sub_80C8FAC - movs r0, 0x1 - negs r0, r0 - movs r1, 0 - str r1, [sp] - movs r2, 0 - movs r3, 0x10 - bl BeginNormalPaletteFade - add sp, 0x4 - pop {r0} - bx r0 - thumb_func_end unknown_ItemMenu_Confirm - - thumb_func_start sub_80C9038 -sub_80C9038: @ 80C9038 - push {lr} - lsls r0, 24 - lsrs r0, 24 - bl sub_80C8FAC - movs r0, 0x1 - movs r1, 0 - bl fade_screen - pop {r0} - bx r0 - thumb_func_end sub_80C9038 - - thumb_func_start SetUpItemUseOnFieldCallback -SetUpItemUseOnFieldCallback: @ 80C9050 - push {lr} - lsls r0, 24 - lsrs r2, r0, 24 - ldr r1, _080C9078 @ =gTasks - lsls r0, r2, 2 - adds r0, r2 - lsls r0, 3 - adds r0, r1 - movs r1, 0xC - ldrsh r0, [r0, r1] - cmp r0, 0x1 - beq _080C9084 - ldr r1, _080C907C @ =gUnknown_0300485C - ldr r0, _080C9080 @ =sub_80A5CC4 - str r0, [r1] - adds r0, r2, 0 - bl unknown_ItemMenu_Confirm - b _080C908E - .align 2, 0 -_080C9078: .4byte gTasks -_080C907C: .4byte gUnknown_0300485C -_080C9080: .4byte sub_80A5CC4 -_080C9084: - ldr r0, _080C9094 @ =gUnknown_03005D00 - ldr r1, [r0] - adds r0, r2, 0 - bl _call_via_r1 -_080C908E: - pop {r0} - bx r0 - .align 2, 0 -_080C9094: .4byte gUnknown_03005D00 - thumb_func_end SetUpItemUseOnFieldCallback - - thumb_func_start sub_80C9098 -sub_80C9098: @ 80C9098 - push {r4-r6,lr} - adds r4, r1, 0 - adds r1, r2, 0 - lsls r0, 24 - lsrs r6, r0, 24 - lsls r4, 24 - lsrs r4, 24 - ldr r5, _080C90CC @ =gStringVar4 - adds r0, r5, 0 - bl StringExpandPlaceholders - cmp r4, 0 - bne _080C90D4 - movs r0, 0 - movs r1, 0xD - movs r2, 0xD - movs r3, 0x14 - bl MenuZeroFillWindowRect - ldr r2, _080C90D0 @ =sub_80A5C48 - adds r0, r6, 0 - adds r1, r5, 0 - movs r3, 0x1 - bl DisplayItemMessageOnField - b _080C90E0 - .align 2, 0 -_080C90CC: .4byte gStringVar4 -_080C90D0: .4byte sub_80A5C48 -_080C90D4: - ldr r2, _080C90E8 @ =sub_80A5C9C - adds r0, r6, 0 - adds r1, r5, 0 - movs r3, 0 - bl DisplayItemMessageOnField -_080C90E0: - pop {r4-r6} - pop {r0} - bx r0 - .align 2, 0 -_080C90E8: .4byte sub_80A5C9C - thumb_func_end sub_80C9098 - - thumb_func_start DisplayDadsAdviceCannotUseItemMessage -DisplayDadsAdviceCannotUseItemMessage: @ 80C90EC - push {lr} - lsls r0, 24 - lsrs r0, 24 - lsls r1, 24 - lsrs r1, 24 - ldr r2, _080C9100 @ =gOtherText_DadsAdvice - bl sub_80C9098 - pop {r0} - bx r0 - .align 2, 0 -_080C9100: .4byte gOtherText_DadsAdvice - thumb_func_end DisplayDadsAdviceCannotUseItemMessage - - thumb_func_start sub_80C9104 -sub_80C9104: @ 80C9104 - push {lr} - lsls r0, 24 - lsrs r0, 24 - lsls r1, 24 - lsrs r1, 24 - ldr r2, _080C9118 @ =gOtherText_CantGetOffBike - bl sub_80C9098 - pop {r0} - bx r0 - .align 2, 0 -_080C9118: .4byte gOtherText_CantGetOffBike - thumb_func_end sub_80C9104 - - thumb_func_start CheckIfItemIsTMHMOrEvolutionStone -CheckIfItemIsTMHMOrEvolutionStone: @ 80C911C - push {r4,lr} - lsls r0, 16 - lsrs r4, r0, 16 - adds r0, r4, 0 - bl ItemId_GetFieldFunc - ldr r1, _080C9134 @ =ItemUseOutOfBattle_TMHM - cmp r0, r1 - bne _080C9138 - movs r0, 0x1 - b _080C914E - .align 2, 0 -_080C9134: .4byte ItemUseOutOfBattle_TMHM -_080C9138: - adds r0, r4, 0 - bl ItemId_GetFieldFunc - ldr r1, _080C9148 @ =ItemUseOutOfBattle_EvolutionStone - cmp r0, r1 - beq _080C914C - movs r0, 0 - b _080C914E - .align 2, 0 -_080C9148: .4byte ItemUseOutOfBattle_EvolutionStone -_080C914C: - movs r0, 0x2 -_080C914E: - pop {r4} - pop {r1} - bx r1 - thumb_func_end CheckIfItemIsTMHMOrEvolutionStone - - thumb_func_start sub_80C9154 -sub_80C9154: @ 80C9154 - push {r4,lr} - sub sp, 0x24 - lsls r0, 24 - lsrs r4, r0, 24 - ldr r0, _080C9188 @ =gPaletteFade - ldrb r1, [r0, 0x7] - movs r0, 0x80 - ands r0, r1 - cmp r0, 0 - bne _080C9180 - mov r1, sp - ldr r0, _080C918C @ =gScriptItemId - ldrh r0, [r0] - strh r0, [r1, 0x20] - ldr r1, _080C9190 @ =sub_80A5D04 - mov r0, sp - movs r2, 0 - bl sub_80F890C - adds r0, r4, 0 - bl DestroyTask -_080C9180: - add sp, 0x24 - pop {r4} - pop {r0} - bx r0 - .align 2, 0 -_080C9188: .4byte gPaletteFade -_080C918C: .4byte gScriptItemId -_080C9190: .4byte sub_80A5D04 - thumb_func_end sub_80C9154 - - thumb_func_start ItemUseOutOfBattle_Mail -ItemUseOutOfBattle_Mail: @ 80C9194 - push {r4,lr} - sub sp, 0x4 - adds r4, r0, 0 - lsls r4, 24 - lsrs r4, 24 - movs r0, 0x1 - negs r0, r0 - movs r1, 0 - str r1, [sp] - movs r2, 0 - movs r3, 0x10 - bl BeginNormalPaletteFade - ldr r1, _080C91C4 @ =gTasks - lsls r0, r4, 2 - adds r0, r4 - lsls r0, 3 - adds r0, r1 - ldr r1, _080C91C8 @ =sub_80C9154 - str r1, [r0] - add sp, 0x4 - pop {r4} - pop {r0} - bx r0 - .align 2, 0 -_080C91C4: .4byte gTasks -_080C91C8: .4byte sub_80C9154 - thumb_func_end ItemUseOutOfBattle_Mail - - thumb_func_start ItemUseOutOfBattle_Bike -ItemUseOutOfBattle_Bike: @ 80C91CC - push {r4,r5,lr} - sub sp, 0x4 - lsls r0, 24 - lsrs r5, r0, 24 - mov r4, sp - adds r4, 0x2 - mov r0, sp - adds r1, r4, 0 - bl PlayerGetDestCoords - mov r0, sp - movs r1, 0 - ldrsh r0, [r0, r1] - movs r2, 0 - ldrsh r1, [r4, r2] - bl MapGridGetMetatileBehaviorAt - lsls r0, 24 - lsrs r4, r0, 24 - ldr r0, _080C924C @ =0x0000082b - bl FlagGet - lsls r0, 24 - lsrs r0, 24 - cmp r0, 0x1 - beq _080C9238 - adds r0, r4, 0 - bl MetatileBehavior_IsVerticalRail - lsls r0, 24 - lsrs r0, 24 - cmp r0, 0x1 - beq _080C9238 - adds r0, r4, 0 - bl MetatileBehavior_IsHorizontalRail - lsls r0, 24 - lsrs r0, 24 - cmp r0, 0x1 - beq _080C9238 - adds r0, r4, 0 - bl MetatileBehavior_IsIsolatedVerticalRail - lsls r0, 24 - lsrs r0, 24 - cmp r0, 0x1 - beq _080C9238 - adds r0, r4, 0 - bl MetatileBehavior_IsIsolatedHorizontalRail - lsls r0, 24 - lsrs r0, 24 - cmp r0, 0x1 - bne _080C9254 -_080C9238: - ldr r0, _080C9250 @ =gTasks - lsls r1, r5, 2 - adds r1, r5 - lsls r1, 3 - adds r1, r0 - ldrb r1, [r1, 0xC] - adds r0, r5, 0 - bl sub_80C9104 - b _080C928E - .align 2, 0 -_080C924C: .4byte 0x0000082b -_080C9250: .4byte gTasks -_080C9254: - bl sub_8053C44 - cmp r0, 0x1 - bne _080C927C - bl sub_80E5EF4 - lsls r0, 24 - cmp r0, 0 - bne _080C927C - ldr r1, _080C9274 @ =gUnknown_03005D00 - ldr r0, _080C9278 @ =ItemUseOnFieldCB_Bike - str r0, [r1] - adds r0, r5, 0 - bl SetUpItemUseOnFieldCallback - b _080C928E - .align 2, 0 -_080C9274: .4byte gUnknown_03005D00 -_080C9278: .4byte ItemUseOnFieldCB_Bike -_080C927C: - ldr r0, _080C9298 @ =gTasks - lsls r1, r5, 2 - adds r1, r5 - lsls r1, 3 - adds r1, r0 - ldrb r1, [r1, 0xC] - adds r0, r5, 0 - bl DisplayDadsAdviceCannotUseItemMessage -_080C928E: - add sp, 0x4 - pop {r4,r5} - pop {r0} - bx r0 - .align 2, 0 -_080C9298: .4byte gTasks - thumb_func_end ItemUseOutOfBattle_Bike - - thumb_func_start ItemUseOnFieldCB_Bike -ItemUseOnFieldCB_Bike: @ 80C929C - push {r4,r5,lr} - lsls r0, 24 - lsrs r5, r0, 24 - ldr r4, _080C92E0 @ =gScriptItemId - ldrh r0, [r4] - bl ItemId_GetSecondaryId - lsls r0, 24 - cmp r0, 0 - bne _080C92B6 - movs r0, 0x2 - bl GetOnOffBike -_080C92B6: - ldrh r0, [r4] - bl ItemId_GetSecondaryId - lsls r0, 24 - lsrs r0, 24 - cmp r0, 0x1 - bne _080C92CA - movs r0, 0x4 - bl GetOnOffBike -_080C92CA: - bl sub_8064E2C - bl ScriptContext2_Disable - adds r0, r5, 0 - bl DestroyTask - pop {r4,r5} - pop {r0} - bx r0 - .align 2, 0 -_080C92E0: .4byte gScriptItemId - thumb_func_end ItemUseOnFieldCB_Bike - - thumb_func_start CanFish -CanFish: @ 80C92E4 - push {r4-r6,lr} - sub sp, 0x4 - mov r4, sp - adds r4, 0x2 - mov r0, sp - adds r1, r4, 0 - bl GetXYCoordsOneStepInFrontOfPlayer - mov r0, sp - movs r1, 0 - ldrsh r0, [r0, r1] - movs r2, 0 - ldrsh r1, [r4, r2] - bl MapGridGetMetatileBehaviorAt - lsls r0, 16 - lsrs r6, r0, 16 - lsls r0, r6, 24 - lsrs r5, r0, 24 - adds r0, r5, 0 - bl MetatileBehavior_IsWaterfall - lsls r0, 24 - cmp r0, 0 - bne _080C936C - movs r0, 0x10 - bl TestPlayerAvatarFlags - lsls r0, 24 - cmp r0, 0 - bne _080C936C - movs r0, 0x8 - bl TestPlayerAvatarFlags - lsls r0, 24 - cmp r0, 0 - bne _080C933C - bl IsPlayerFacingSurfableFishableWater - lsls r0, 24 - cmp r0, 0 - beq _080C936C -_080C9338: - movs r0, 0x1 - b _080C936E -_080C933C: - adds r0, r5, 0 - bl MetatileBehavior_IsSurfableWaterOrUnderwater - lsls r0, 24 - cmp r0, 0 - beq _080C935C - mov r0, sp - movs r1, 0 - ldrsh r0, [r0, r1] - movs r2, 0 - ldrsh r1, [r4, r2] - bl MapGridIsImpassableAt - lsls r0, 24 - cmp r0, 0 - beq _080C9338 -_080C935C: - lsls r0, r6, 24 - lsrs r0, 24 - bl MetatileBehavior_IsBridge - lsls r0, 24 - lsrs r0, 24 - cmp r0, 0x1 - beq _080C9338 -_080C936C: - movs r0, 0 -_080C936E: - add sp, 0x4 - pop {r4-r6} - pop {r1} - bx r1 - thumb_func_end CanFish - - thumb_func_start ItemUseOutOfBattle_Rod -ItemUseOutOfBattle_Rod: @ 80C9378 - push {r4,lr} - lsls r0, 24 - lsrs r4, r0, 24 - bl CanFish - cmp r0, 0x1 - bne _080C939C - ldr r1, _080C9394 @ =gUnknown_03005D00 - ldr r0, _080C9398 @ =ItemUseOnFieldCB_Rod - str r0, [r1] - adds r0, r4, 0 - bl SetUpItemUseOnFieldCallback - b _080C93AE - .align 2, 0 -_080C9394: .4byte gUnknown_03005D00 -_080C9398: .4byte ItemUseOnFieldCB_Rod -_080C939C: - ldr r0, _080C93B4 @ =gTasks - lsls r1, r4, 2 - adds r1, r4 - lsls r1, 3 - adds r1, r0 - ldrb r1, [r1, 0xC] - adds r0, r4, 0 - bl DisplayDadsAdviceCannotUseItemMessage -_080C93AE: - pop {r4} - pop {r0} - bx r0 - .align 2, 0 -_080C93B4: .4byte gTasks - thumb_func_end ItemUseOutOfBattle_Rod - - thumb_func_start ItemUseOnFieldCB_Rod -ItemUseOnFieldCB_Rod: @ 80C93B8 - push {r4,lr} - adds r4, r0, 0 - lsls r4, 24 - lsrs r4, 24 - ldr r0, _080C93DC @ =gScriptItemId - ldrh r0, [r0] - bl ItemId_GetSecondaryId - lsls r0, 24 - lsrs r0, 24 - bl StartFishing - adds r0, r4, 0 - bl DestroyTask - pop {r4} - pop {r0} - bx r0 - .align 2, 0 -_080C93DC: .4byte gScriptItemId - thumb_func_end ItemUseOnFieldCB_Rod - - thumb_func_start ItemUseOutOfBattle_Itemfinder -ItemUseOutOfBattle_Itemfinder: @ 80C93E0 - push {r4,lr} - adds r4, r0, 0 - lsls r4, 24 - lsrs r4, 24 - movs r0, 0x27 - bl sav12_xor_increment - ldr r1, _080C9400 @ =gUnknown_03005D00 - ldr r0, _080C9404 @ =ItemUseOnFieldCB_Itemfinder - str r0, [r1] - adds r0, r4, 0 - bl SetUpItemUseOnFieldCallback - pop {r4} - pop {r0} - bx r0 - .align 2, 0 -_080C9400: .4byte gUnknown_03005D00 -_080C9404: .4byte ItemUseOnFieldCB_Itemfinder - thumb_func_end ItemUseOutOfBattle_Itemfinder - - thumb_func_start ItemUseOnFieldCB_Itemfinder -ItemUseOnFieldCB_Itemfinder: @ 80C9408 - push {r4,lr} - lsls r0, 24 - lsrs r4, r0, 24 - ldr r0, _080C9430 @ =gMapHeader - ldr r0, [r0, 0x4] - adds r1, r4, 0 - bl ItemfinderCheckForHiddenItems - lsls r0, 24 - lsrs r0, 24 - cmp r0, 0x1 - bne _080C943C - ldr r0, _080C9434 @ =gTasks - lsls r1, r4, 2 - adds r1, r4 - lsls r1, 3 - adds r1, r0 - ldr r0, _080C9438 @ =sub_80C9458 - str r0, [r1] - b _080C9448 - .align 2, 0 -_080C9430: .4byte gMapHeader -_080C9434: .4byte gTasks -_080C9438: .4byte sub_80C9458 -_080C943C: - ldr r1, _080C9450 @ =gOtherText_NoResponse - ldr r2, _080C9454 @ =sub_80C9520 - adds r0, r4, 0 - movs r3, 0 - bl DisplayItemMessageOnField -_080C9448: - pop {r4} - pop {r0} - bx r0 - .align 2, 0 -_080C9450: .4byte gOtherText_NoResponse -_080C9454: .4byte sub_80C9520 - thumb_func_end ItemUseOnFieldCB_Itemfinder - - thumb_func_start sub_80C9458 -sub_80C9458: @ 80C9458 - push {r4-r7,lr} - mov r7, r8 - push {r7} - lsls r0, 24 - lsrs r5, r0, 24 - lsls r6, r5, 2 - adds r0, r6, r5 - lsls r7, r0, 3 - ldr r0, _080C94AC @ =gTasks + 0x8 - mov r8, r0 - adds r4, r7, r0 - movs r1, 0x6 - ldrsh r0, [r4, r1] - cmp r0, 0 - bne _080C950C - movs r2, 0x8 - ldrsh r0, [r4, r2] - cmp r0, 0x4 - bne _080C9500 - movs r1, 0 - ldrsh r0, [r4, r1] - movs r2, 0x2 - ldrsh r1, [r4, r2] - bl sub_80C9908 - lsls r0, 24 - lsrs r0, 24 - cmp r0, 0 - beq _080C94B8 - ldr r1, _080C94B0 @ =gUnknown_083D61F0 - subs r0, 0x1 - adds r0, r1 - ldrb r0, [r0] - bl sub_80C997C - mov r0, r8 - subs r0, 0x8 - adds r0, r7, r0 - ldr r1, _080C94B4 @ =sub_80C99EC - str r1, [r0] - b _080C9516 - .align 2, 0 -_080C94AC: .4byte gTasks + 0x8 -_080C94B0: .4byte gUnknown_083D61F0 -_080C94B4: .4byte sub_80C99EC -_080C94B8: - bl player_get_direction_lower_nybble - lsls r0, 24 - lsrs r2, r0, 24 - movs r1, 0 - adds r3, r6, 0 - ldr r7, _080C94F4 @ =gUnknown_083D61F0 - movs r6, 0x3 -_080C94C8: - adds r0, r1, r7 - adds r1, 0x1 - ldrb r0, [r0] - cmp r2, r0 - bne _080C94D8 - adds r0, r1, 0 - ands r0, r6 - strh r0, [r4, 0xA] -_080C94D8: - lsls r0, r1, 24 - lsrs r1, r0, 24 - cmp r1, 0x3 - bls _080C94C8 - ldr r1, _080C94F8 @ =gTasks - adds r0, r3, r5 - lsls r0, 3 - adds r0, r1 - ldr r1, _080C94FC @ =sub_80C9A38 - str r1, [r0] - movs r0, 0 - strh r0, [r4, 0x6] - strh r0, [r4, 0x4] - b _080C9516 - .align 2, 0 -_080C94F4: .4byte gUnknown_083D61F0 -_080C94F8: .4byte gTasks -_080C94FC: .4byte sub_80C9A38 -_080C9500: - movs r0, 0x48 - bl PlaySE - ldrh r0, [r4, 0x8] - adds r0, 0x1 - strh r0, [r4, 0x8] -_080C950C: - ldrh r0, [r4, 0x6] - adds r0, 0x1 - movs r1, 0x1F - ands r0, r1 - strh r0, [r4, 0x6] -_080C9516: - pop {r3} - mov r8, r3 - pop {r4-r7} - pop {r0} - bx r0 - thumb_func_end sub_80C9458 - - thumb_func_start sub_80C9520 -sub_80C9520: @ 80C9520 - push {r4,lr} - adds r4, r0, 0 - lsls r4, 24 - lsrs r4, 24 - movs r0, 0 - movs r1, 0xE - movs r2, 0x1D - movs r3, 0x13 - bl MenuZeroFillWindowRect - bl sub_8064E2C - bl ScriptContext2_Disable - adds r0, r4, 0 - bl DestroyTask - pop {r4} - pop {r0} - bx r0 - thumb_func_end sub_80C9520 - - thumb_func_start ItemfinderCheckForHiddenItems -ItemfinderCheckForHiddenItems: @ 80C9548 - push {r4-r7,lr} - mov r7, r9 - mov r6, r8 - push {r6,r7} - sub sp, 0x4 - adds r5, r0, 0 - lsls r1, 24 - lsrs r6, r1, 24 - mov r4, sp - adds r4, 0x2 - mov r0, sp - adds r1, r4, 0 - bl PlayerGetDestCoords - ldr r1, _080C9618 @ =gTasks - lsls r0, r6, 2 - adds r0, r6 - lsls r0, 3 - adds r0, r1 - movs r1, 0 - strh r1, [r0, 0xC] - movs r3, 0 - mov r9, r4 - ldrb r0, [r5, 0x3] - cmp r3, r0 - bge _080C95FC - subs r1, 0x5 - mov r8, r1 -_080C9580: - lsls r3, 16 - asrs r1, r3, 16 - ldr r2, [r5, 0x10] - lsls r0, r1, 1 - adds r0, r1 - lsls r4, r0, 2 - adds r1, r4, r2 - ldrb r0, [r1, 0x5] - adds r7, r3, 0 - cmp r0, 0x7 - bne _080C95EC - movs r2, 0x96 - lsls r2, 2 - adds r0, r2, 0 - ldrh r1, [r1, 0xA] - adds r0, r1 - lsls r0, 16 - lsrs r0, 16 - bl FlagGet - lsls r0, 24 - cmp r0, 0 - bne _080C95EC - ldr r1, [r5, 0x10] - adds r1, r4, r1 - ldrh r2, [r1] - adds r2, 0x7 - mov r0, sp - ldrh r0, [r0] - subs r2, r0 - ldrh r0, [r1, 0x2] - adds r0, 0x7 - mov r3, r9 - ldrh r1, [r3] - subs r0, r1 - lsls r0, 16 - lsrs r0, 16 - lsls r2, 16 - asrs r1, r2, 16 - movs r3, 0xE0 - lsls r3, 11 - adds r2, r3 - lsrs r2, 16 - cmp r2, 0xE - bhi _080C95EC - lsls r0, 16 - asrs r2, r0, 16 - cmp r2, r8 - blt _080C95EC - cmp r2, 0x5 - bgt _080C95EC - adds r0, r6, 0 - bl sub_80C9838 -_080C95EC: - movs r1, 0x80 - lsls r1, 9 - adds r0, r7, r1 - lsrs r3, r0, 16 - asrs r0, 16 - ldrb r2, [r5, 0x3] - cmp r0, r2 - blt _080C9580 -_080C95FC: - adds r0, r6, 0 - bl sub_80C9720 - ldr r0, _080C9618 @ =gTasks - lsls r1, r6, 2 - adds r1, r6 - lsls r1, 3 - adds r1, r0 - movs r3, 0xC - ldrsh r0, [r1, r3] - cmp r0, 0x1 - beq _080C961C - movs r0, 0 - b _080C961E - .align 2, 0 -_080C9618: .4byte gTasks -_080C961C: - movs r0, 0x1 -_080C961E: - add sp, 0x4 - pop {r3,r4} - mov r8, r3 - mov r9, r4 - pop {r4-r7} - pop {r1} - bx r1 - thumb_func_end ItemfinderCheckForHiddenItems - thumb_func_start sub_80C962C sub_80C962C: @ 80C962C push {r4-r6,lr} diff --git a/include/asm_fieldmap.h b/include/asm_fieldmap.h index afc1fac7c..10d8c8f6d 100644 --- a/include/asm_fieldmap.h +++ b/include/asm_fieldmap.h @@ -6,7 +6,7 @@ void sub_8055FC0(void); u8 MapGridGetZCoordAt(); bool8 MapGridIsImpassableAt(s16, s16); int MapGridGetMetatileIdAt(int, int); -int MapGridGetMetatileBehaviorAt(int x, int y); // return: (u8|u16|int) args: (int|s16|s32) +u32 MapGridGetMetatileBehaviorAt(int x, int y); // return: (u8|u16|int) args: (int|s16|s32) u8 MapGridGetMetatileLayerTypeAt(/*TODO: arg types*/); void MapGridSetMetatileIdAt(u32, u32, u16); void save_serialize_map(void); diff --git a/include/field_player_avatar.h b/include/field_player_avatar.h index 9e2e7a489..0095c229f 100644 --- a/include/field_player_avatar.h +++ b/include/field_player_avatar.h @@ -71,7 +71,7 @@ u8 GetPlayerAvatarGraphicsIdByStateId(u8 a); // GetPlayerAvatarGenderByGraphicsId // PartyHasMonWithSurf // IsPlayerSurfingNorth -// IsPlayerFacingSurfableFishableWater +bool8 IsPlayerFacingSurfableFishableWater(void); // ClearPlayerAvatarInfo void SetPlayerAvatarStateMask(u8 a); // GetPlayerAvatarGraphicsIdByCurrentState @@ -91,7 +91,7 @@ void InitPlayerAvatar(s16 a, s16 b, u8 c, u8 d); // sub_805A178 // sub_805A1B8 void sub_805A20C(u8 a); -// StartFishing +void StartFishing(u8 a); // Fishing1 // Fishing2 // Fishing3 diff --git a/include/global.fieldmap.h b/include/global.fieldmap.h index 9bcd9c3e7..3759d9d15 100644 --- a/include/global.fieldmap.h +++ b/include/global.fieldmap.h @@ -58,7 +58,8 @@ struct WarpEvent struct CoordEvent { s16 x, y; - u8 filler_4[0x2]; + u8 filler_4; + u8 filler_5; u16 trigger; u16 index; u8 filler_A[0x2]; @@ -76,7 +77,7 @@ struct BgEvent struct MapEvents { - u8 mapObjectCount; + u32 mapObjectCount; u8 warpCount; u8 coordEventCount; u8 bgEventCount; diff --git a/ld_script.txt b/ld_script.txt index 6ed88f4ac..2d2489b74 100644 --- a/ld_script.txt +++ b/ld_script.txt @@ -148,6 +148,7 @@ SECTIONS { asm/rotating_gate.o(.text); src/safari_zone.o(.text); asm/contest_link_80C857C.o(.text); + src/item_use.o(.text); asm/item_use.o(.text); asm/battle_anim_80CA710.o(.text); asm/bike.o(.text); diff --git a/src/item_use.c b/src/item_use.c new file mode 100644 index 000000000..fee70d7d2 --- /dev/null +++ b/src/item_use.c @@ -0,0 +1,410 @@ +#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 "flag.h" +#include "map_obj_lock.h" +#include "script.h" +#include "field_player_avatar.h" +#include "sound.h" + +extern void (* const gUnknown_083D61E4[])(); +extern void (* gUnknown_03005D00)(u8); +extern void (* gUnknown_0300485C)(void); + +extern void sub_80A5B00(u8); +extern void sub_80A5CC4(void); +extern void sub_80C8FAC(u8); +extern void DisplayItemMessageOnField(u8, u8*, TaskFunc, u16); +extern void sub_80A5C48(u8); +extern void sub_80A5C9C(u8); +extern void ItemUseOutOfBattle_TMHM(u8); +extern void ItemUseOutOfBattle_EvolutionStone(u8); +extern void ItemUseOnFieldCB_Bike(u8); +extern void ItemUseOnFieldCB_Rod(u8); +extern void ItemUseOnFieldCB_Itemfinder(u8); +extern void sub_80A5D04(void); +extern bool8 sub_80E5EF4(void); +extern void GetOnOffBike(u8); +extern void sub_80C9458(u8); +extern void sub_80C9520(u8); +extern u8 sub_80C9908(s16, s16); +extern void sub_80C997C(u8); +extern void sub_80C99EC(u8); +extern void sub_80C9A38(u8); + +extern u8 gOtherText_DadsAdvice[]; +extern u8 gOtherText_CantGetOffBike[]; +extern u8 gOtherText_NoResponse[]; + +extern u8 gUnknown_083D61F0[]; + +extern u16 gScriptItemId; + +bool8 ItemfinderCheckForHiddenItems(struct MapEvents *events, int); + +void sub_80C8FAC(u8 taskId) +{ + u8 taskData; + + if(gScriptItemId == 0xAF) + taskData = gTasks[taskId].data[15] - 1; + else + taskData = ItemId_GetType(gScriptItemId) - 1; + + gTasks[taskId].data[8] = (u32)gUnknown_083D61E4[taskData] >> 16; + gTasks[taskId].data[9] = (u32)gUnknown_083D61E4[taskData]; + gTasks[taskId].func = sub_80A5B00; +} + +void unknown_ItemMenu_Confirm(u8 var) +{ + sub_80C8FAC(var); + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0); +} + +void sub_80C9038(u8 var) +{ + sub_80C8FAC(var); + fade_screen(1, 0); +} + +void SetUpItemUseOnFieldCallback(u8 taskId) +{ + if(gTasks[taskId].data[2] != 1) + { + gUnknown_0300485C = (void *)sub_80A5CC4; + unknown_ItemMenu_Confirm(taskId); + } + else + gUnknown_03005D00(taskId); +} + +void sub_80C9098(u8 var1, u8 var2, const u8 *var3) +{ + StringExpandPlaceholders(gStringVar4, var3); + + if(!var2) + { + MenuZeroFillWindowRect(0, 13, 13, 20); + DisplayItemMessageOnField(var1, gStringVar4, sub_80A5C48, 1); + } + else + DisplayItemMessageOnField(var1, gStringVar4, sub_80A5C9C, 0); +} + +void DisplayDadsAdviceCannotUseItemMessage(u8 var1, u8 var2) +{ + sub_80C9098(var1, var2, gOtherText_DadsAdvice); +} + +void sub_80C9104(u8 var1, u8 var2) +{ + sub_80C9098(var1, var2, 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 sub_80C9154(u8 taskId) +{ + struct MailStruct mailStruct; + + if(!gPaletteFade.active) + { + mailStruct.var20 = gScriptItemId; + sub_80F890C(&mailStruct, sub_80A5D04, 0); + DestroyTask(taskId); + } +} + +void ItemUseOutOfBattle_Mail(u8 taskId) +{ + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0); + gTasks[taskId].func = sub_80C9154; +} + +void ItemUseOutOfBattle_Bike(u8 taskId) +{ + s16 x, y; + u8 tileBehavior; + + PlayerGetDestCoords(&x, &y); + tileBehavior = MapGridGetMetatileBehaviorAt(x, y); + + if(FlagGet(0x82B) == TRUE + || MetatileBehavior_IsVerticalRail(tileBehavior) == TRUE + || MetatileBehavior_IsHorizontalRail(tileBehavior) == TRUE + || MetatileBehavior_IsIsolatedVerticalRail(tileBehavior) == TRUE + || MetatileBehavior_IsIsolatedHorizontalRail(tileBehavior) == TRUE) + { + sub_80C9104(taskId, gTasks[taskId].data[2]); + } + else + { + if(sub_8053C44() == TRUE && sub_80E5EF4() == 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) +{ + sav12_xor_increment(0x27); + gUnknown_03005D00 = (void *)ItemUseOnFieldCB_Itemfinder; + SetUpItemUseOnFieldCallback(var); +} + +void ItemUseOnFieldCB_Itemfinder(u8 taskId) +{ + if(ItemfinderCheckForHiddenItems(gMapHeader.events, taskId) == TRUE) + gTasks[taskId].func = sub_80C9458; + else + DisplayItemMessageOnField(taskId, gOtherText_NoResponse, sub_80C9520, 0); +} + +void sub_80C9458(u8 taskId) +{ + u8 var; + u8 playerDir; + u8 i; + s16 *data = gTasks[taskId].data; + + if(!data[3]) + { + if(data[4] == 4) + { + var = sub_80C9908(data[0], data[1]); + if(var) + { + sub_80C997C(gUnknown_083D61F0[var - 1]); + gTasks[taskId].func = sub_80C99EC; + } + else + { + playerDir = player_get_direction_lower_nybble(); + + for (i = 0; i < 4; i++) + if (playerDir == gUnknown_083D61F0[i]) + data[5] = (i + 1) & 3; + + gTasks[taskId].func = sub_80C9A38; + data[3] = 0; + data[2] = 0; + } + return; + } + PlaySE(0x48); + data[4]++; + } + data[3] = (data[3] + 1) & 0x1F; +} + +void sub_80C9520(u8 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) +{ + 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"); +} |