From ffa1f85a64f1544dc71b22b03da082f548c6c4f2 Mon Sep 17 00:00:00 2001 From: PhlexPlexico Date: Sat, 24 Feb 2024 10:21:31 -0600 Subject: [PATCH] Refactor patches and hooks to be spread across more files. (#42) This allows for better organization and locating patches/hooks instead of trying to find a patch in one large file. Adjust song of time reset for no swords to actually reset the sword on B when resetting a cycle. --- code/source/asm/fairy_patches.s | 14 ++ code/source/asm/hms_patches.s | 6 + code/source/asm/hooks.s | 303 ------------------------ code/source/asm/item_override_hooks.s | 247 +++++++++++++++++++ code/source/asm/item_override_patches.s | 110 +++++++++ code/source/asm/patches.s | 209 ---------------- code/source/asm/save_hooks.s | 29 +++ code/source/asm/save_patches.s | 16 ++ code/source/asm/sword_hooks.s | 38 +++ code/source/asm/sword_patches.s | 70 ++++++ code/source/rnd/item_override.cpp | 9 +- code/source/rnd/link.cpp | 6 +- code/source/rnd/savefile.cpp | 1 + 13 files changed, 538 insertions(+), 520 deletions(-) create mode 100644 code/source/asm/fairy_patches.s create mode 100644 code/source/asm/hms_patches.s create mode 100644 code/source/asm/item_override_hooks.s create mode 100644 code/source/asm/item_override_patches.s create mode 100644 code/source/asm/save_hooks.s create mode 100644 code/source/asm/save_patches.s create mode 100644 code/source/asm/sword_hooks.s create mode 100644 code/source/asm/sword_patches.s diff --git a/code/source/asm/fairy_patches.s b/code/source/asm/fairy_patches.s new file mode 100644 index 00000000..f7e35cff --- /dev/null +++ b/code/source/asm/fairy_patches.s @@ -0,0 +1,14 @@ +.arm + +.section .patch_OverrideFairyGiveItem +.global OverrideFairyItemID_patch +OverrideFairyItemID_patch: + b hook_OverrideFairyItem + +.section .patch_OverrideGreatFairySpawn +.global OverrideGreatFairySpawn_patch +OverrideGreatFairySpawn_patch: + nop + @ldmia sp!,{r4 - r6, pc} + @ldmia sp !, {r4 - r6, lr} + @ bx lr \ No newline at end of file diff --git a/code/source/asm/hms_patches.s b/code/source/asm/hms_patches.s new file mode 100644 index 00000000..bb1380f2 --- /dev/null +++ b/code/source/asm/hms_patches.s @@ -0,0 +1,6 @@ +.arm + +.section .patch_HMSGiveItem +.global patch_HMSGiveItem +patch_HMSGiveItem: + b hook_OverrideHMSDekuMask \ No newline at end of file diff --git a/code/source/asm/hooks.s b/code/source/asm/hooks.s index 993a42bc..c435737a 100644 --- a/code/source/asm/hooks.s +++ b/code/source/asm/hooks.s @@ -1,22 +1,6 @@ .arm .text -.global rActiveItemTextId -.rActiveItemTextId_addr: - .word rActiveItemTextId - -.global rActiveItemRow -.rActiveItemRow_addr: - .word rActiveItemRow - -.global rActiveItemGraphicId -.rActiveItemGraphicId_addr: - .word rActiveItemGraphicId - -.global rStoredTextId -.rStoredTextId_addr: - .word rStoredTextId - .global rCustomDungeonItemRetrieved .rCustomDungeonItemRetrieved_addr: .word rCustomDungeonItemRetrieved @@ -79,28 +63,6 @@ hook_DoNotResetTempleFlags: mov r0,#0x0 bx lr -.global hook_ChangeSOHToCustomText -hook_ChangeSOHToCustomText: - push {r0-r2, lr} - bl ItemOverride_SwapSoHGetItemText - pop {r0-r2, lr} - b 0x186814 - -.global hook_DoNotGiveSwordBackOnReset -hook_DoNotGiveSwordBackOnReset: - bhi 0x1C9958 @ original instruction, if gilded sword ignore these. - push {r0-r12, lr} - bl SongOfTimeSwordPlacement @ See rnd/link.cpp - pop {r0-r12, lr} - bx lr - -.global hook_DoNotGiveSwordBackOnResetTwo -hook_DoNotGiveSwordBackOnResetTwo: - push {r0-r12, lr} - bl SongOfTimeSwordPlacement @ See rnd/link.cpp - pop {r0-r12, lr} - bx lr - .global hook_SpawnFastElegyStatues hook_SpawnFastElegyStatues: push {r0-r12, lr} @@ -111,13 +73,6 @@ hook_SpawnFastElegyStatues: beq 0x1E9FBC bx lr -.global hook_CheckCurrentInventory -hook_CheckCurrentInventory: - push {r1-r12, lr} - bl ItemOverride_CheckInventoryItemOverride - pop {r1-r12, lr} - b 0x1F3D6C - .global hook_CheckOcarinaDive hook_CheckOcarinaDive: push {r0-r12, lr} @@ -151,23 +106,6 @@ hook_CheckDungeonSmallKeys: ldrh r0, [r2, #0x52] bx lr -.global hook_SaveFile_Load -hook_SaveFile_Load: - push {r0-r12, lr} - bl SaveFile_LoadExtSaveData - pop {r0-r12, lr} - str r5,[r1,#0x61C] - b 0x48C764 - -.global hook_SaveFile_Init -hook_SaveFile_Init: - push {r0-r12, lr} - cpy r0,r4 - bl SaveFile_Init - pop {r0-r12, lr} - mov r3,#0x0 - b 0x5b8b28 - .global hook_BlastMaskCooldown hook_BlastMaskCooldown: push {r0-r12, lr} @@ -201,21 +139,6 @@ instBlastCd: subne r0,r0,r0 bx lr -.global hook_OverrideItemIdIndex -hook_OverrideItemIdIndex: - push {r0} - ldr r0,.rActiveItemGraphicId_addr - ldr r0,[r0] - cmp r0,#0x0 - pop {r0} - beq noOverrideItemIdIndex - ldr r0,.rActiveItemGraphicId_addr - ldr r0,[r0] - bx lr -noOverrideItemIdIndex: - ldrsh r0, [r0, #-6] - bx lr - @ State handler calls 0x5D for masks, check this value and ignore states where that is equal, since this function @ is also used by song of soaring and get_item. .global hook_RemainsCheckValue @@ -227,43 +150,6 @@ hook_RemainsCheckValue: noIgnoreValues: b 0x22B814 -.global hook_OverrideDrawIndex -hook_OverrideDrawIndex: - ldr r0,.rActiveItemGraphicId_addr - ldr r0,[r0] - cmp r0,#0x0 - beq noOverrideGraphicId - b 0x22F254 -noOverrideGraphicId: - ldrsh r0,[r7,#0x2] - b 0x22F250 - -.global hook_OverrideDrawIndexSecond -hook_OverrideDrawIndexSecond: - ldr r0,.rActiveItemGraphicId_addr - ldr r0,[r0] - cmp r0,#0x0 - beq noOverrideGraphicIdSecond - b 0x22F47C -noOverrideGraphicIdSecond: - ldrsh r0, [r8,#2] - b 0x22F478 - -.global hook_OverrideTextID -hook_OverrideTextID: - push {r3} - ldr r3,.rActiveItemTextId_addr - ldr r3,[r3] - cmp r3,#0x0 - pop {r3} - beq noOverrideTextID - b 0x231104 -noOverrideTextID: - @cpy r2, r5 - cpy r0, r7 - b 0x231100 - - .global hook_OverrideBomberTextID hook_OverrideBomberTextID: cmp r1, #0x5F @@ -274,23 +160,6 @@ noBomberOverride: cmp r1,r0 b 0x1D2768 -.global hook_OverrideItemID -hook_OverrideItemID: - push {r1} - ldr r1,.rActiveItemRow_addr - ldr r1,[r1] - cmp r1,#0x0 - pop {r1} - beq noOverrideItemID - push {r0-r12, lr} - bl ItemOverride_GetItemTextAndItemID - pop {r0-r12, lr} - b 0x231110 -noOverrideItemID: - LDRB R1, [R4,#0x0] - cpy r0,r7 - b 0x23110C - .global hook_EnteringLocation hook_EnteringLocation: push {r0-r12, lr} @@ -299,39 +168,6 @@ hook_EnteringLocation: cpy r9,r0 bx lr -.global hook_DarmaniRewardCheck -hook_DarmaniRewardCheck: - push {r0-r12, lr} - bl ItemOverride_CheckDarmaniGivenItem - cmp r0,#0x1 - pop {r0-r12, lr} - beq doNotSpawnDarmani - b 0x2DE794 -doNotSpawnDarmani: - nop - b 0x2DE96C - -.global hook_CheckOshExtData -hook_CheckOshExtData: - push {lr} - bl ItemOverride_GetOshExtData - pop {lr} - cmp r0,#0x0 - bx lr - -.global hook_IncomingGetItemID -hook_IncomingGetItemID: - push {r0-r12, lr} - @ According to Ghidra, r6 r5 r4 are the required - @ values needed for the GetItem header, if it isn't clear. - cpy r0,r7 - cpy r1,r6 - cpy r2,r5 - cpy r3,r4 - bl ItemOverride_GetItem - pop {r0-r12, lr} - bx lr - .global hook_readGamePad hook_readGamePad: push {r0-r12, lr} @@ -352,34 +188,6 @@ hook_HandleOcarina: cmp r0, #0x16 @ original instruction b 0x604d90 -.global hook_GaboraCheckExtDataNotSword -hook_GaboraCheckExtDataNotSword: - push {r0-r12, lr} - bl ItemOverride_GetGaboraExtData - cmp r0, #0x0 - beq giveRazorSwordReward - cmp r0, #0x1 - beq giveGildedSword - pop {r0-r12,lr} - cmp r0,r0 - bx lr -giveRazorSwordReward: - pop {r0-r12,lr} - cmp r0,#0xFF - b 0x2CBB3C -giveGildedSword: - pop {r0-r12,lr} - cmp r0,r0 - b 0x2CBB38 - -.global hook_OwlExtDataSave -hook_OwlExtDataSave: - push {r0-r12, lr} - bl SaveFile_SaveExtSaveData - pop {r0-r12, lr} - cpy r6,r0 - b 0x317008 - .global hook_checkChestContentSetting hook_checkChestContentSetting: push {r0-r12, lr} @@ -435,117 +243,6 @@ hook_CheckMoTSetting: bl SettingsMaskOfTruthCheck b 0x35C42C -.global hook_GoronMaskGiveItem -hook_GoronMaskGiveItem: - push {r0-r12, lr} - cpy r0,r5 - cpy r1,r4 - mov r2,#0x79 - bl ItemOverride_GetSoHItem - ldr r5,.rActiveItemRow_addr - ldr r5,[r5] - cmp r5,#0x0 - pop {r0-r12, lr} - beq noOverrideDarmaniItemID - push {r0-r12, lr} - cpy r0,r5 - cpy r1,r4 - bl ItemOverride_GetItemTextAndItemID - pop {r0-r12, lr} - cpy r0,r5 - b 0x41DAB4 -noOverrideDarmaniItemID: - cpy r0,r5 - bl 0x233BEC - b 0x41DAB4 - -.global hook_ZoraMaskGiveItem -hook_ZoraMaskGiveItem: - push {r0-r12, lr} - cpy r0,r5 - cpy r1,r4 - mov r2,#0x7A - bl ItemOverride_GetSoHItem - ldr r5,.rActiveItemRow_addr - ldr r5,[r5] - cmp r5,#0x0 - pop {r0-r12, lr} - beq noOverrideMikauItemID - push {r0-r12, lr} - cpy r0,r5 - cpy r1,r4 - bl ItemOverride_GetItemTextAndItemID - pop {r0-r12, lr} - cpy r0,r5 - b 0x41DB84 -noOverrideMikauItemID: - cpy r0,r5 - bl 0x233BEC - b 0x41DB84 - -.global hook_GibdoMaskGiveItem -hook_GibdoMaskGiveItem: - push {r0-r12, lr} - cpy r0,r5 - cpy r1,r4 - mov r2,#0x87 - bl ItemOverride_GetSoHItem - ldr r5,.rActiveItemRow_addr - ldr r5,[r5] - cmp r5,#0x0 - pop {r0-r12, lr} - beq noOverrideGibdoItemID - push {r0-r12, lr} - cpy r0,r5 - cpy r1,r4 - bl ItemOverride_GetItemTextAndItemID - pop {r0-r12, lr} - cpy r0,r5 - b 0x41DC4C -noOverrideGibdoItemID: - cpy r0,r5 - bl 0x233BEC - b 0x41DC4C - -.global hook_CouplesMaskGiveItem -hook_CouplesMaskGiveItem: - push {r0-r12, lr} - cpy r0,r5 - cpy r1,r4 - mov r2,#0x85 - bl ItemOverride_GetSoHItem - ldr r5,.rActiveItemRow_addr - ldr r5,[r5] - cmp r5,#0x0 - pop {r0-r12, lr} - beq noOverrideCouplesItemID - push {r0-r12, lr} - cpy r0,r5 - cpy r1,r4 - bl ItemOverride_GetItemTextAndItemID - pop {r0-r12, lr} - b 0x46e264 -noOverrideCouplesItemID: - b 0x46e22c - -.global hook_AdjustCouplesMaskMessage -hook_AdjustCouplesMaskMessage: - push {r1} - ldr r1,.rStoredTextId_addr - ldr r1,[r1] - cmp r1,#0x0 - pop {r1} - beq normalText - ldr r1,.rStoredTextId_addr - ldr r1,[r1] - push {r0-r12,lr} - bl ItemOverride_RemoveTextId - pop {r0-r12, lr} - b 0x1867C8 -normalText: - mov r1,#0xA2 - b 0x1867C8 - .section .loader .global hook_into_loader hook_into_loader: diff --git a/code/source/asm/item_override_hooks.s b/code/source/asm/item_override_hooks.s new file mode 100644 index 00000000..1dda59c7 --- /dev/null +++ b/code/source/asm/item_override_hooks.s @@ -0,0 +1,247 @@ +.arm +.text + +.global rActiveItemTextId +.rActiveItemTextId_addr: + .word rActiveItemTextId + +.global rActiveItemRow +.rActiveItemRow_addr: + .word rActiveItemRow + +.global rActiveItemGraphicId +.rActiveItemGraphicId_addr: + .word rActiveItemGraphicId + +.global rStoredTextId +.rStoredTextId_addr: + .word rStoredTextId + +.global hook_IncomingGetItemID +hook_IncomingGetItemID: + push {r0-r12, lr} + @ According to Ghidra, r6 r5 r4 are the required + @ values needed for the GetItem header, if it isn't clear. + cpy r0,r7 + cpy r1,r6 + cpy r2,r5 + cpy r3,r4 + bl ItemOverride_GetItem + pop {r0-r12, lr} + bx lr + + +.global hook_CheckCurrentInventory +hook_CheckCurrentInventory: + push {r1-r12, lr} + bl ItemOverride_CheckInventoryItemOverride + pop {r1-r12, lr} + b 0x1F3D6C + +.global hook_OverrideItemIdIndex +hook_OverrideItemIdIndex: + push {r0} + ldr r0,.rActiveItemGraphicId_addr + ldr r0,[r0] + cmp r0,#0x0 + pop {r0} + beq noOverrideItemIdIndex + ldr r0,.rActiveItemGraphicId_addr + ldr r0,[r0] + bx lr +noOverrideItemIdIndex: + ldrsh r0, [r0, #-6] + bx lr + +.global hook_OverrideDrawIndex +hook_OverrideDrawIndex: + ldr r0,.rActiveItemGraphicId_addr + ldr r0,[r0] + cmp r0,#0x0 + beq noOverrideGraphicId + b 0x22F254 +noOverrideGraphicId: + ldrsh r0,[r7,#0x2] + b 0x22F250 + +.global hook_OverrideDrawIndexSecond +hook_OverrideDrawIndexSecond: + ldr r0,.rActiveItemGraphicId_addr + ldr r0,[r0] + cmp r0,#0x0 + beq noOverrideGraphicIdSecond + b 0x22F47C +noOverrideGraphicIdSecond: + ldrsh r0, [r8,#2] + b 0x22F478 + +.global hook_OverrideTextID +hook_OverrideTextID: + push {r3} + ldr r3,.rActiveItemTextId_addr + ldr r3,[r3] + cmp r3,#0x0 + pop {r3} + beq noOverrideTextID + b 0x231104 +noOverrideTextID: + @cpy r2, r5 + cpy r0, r7 + b 0x231100 + +.global hook_OverrideItemID +hook_OverrideItemID: + push {r1} + ldr r1,.rActiveItemRow_addr + ldr r1,[r1] + cmp r1,#0x0 + pop {r1} + beq noOverrideItemID + push {r0-r12, lr} + bl ItemOverride_GetItemTextAndItemID + pop {r0-r12, lr} + b 0x231110 +noOverrideItemID: + LDRB R1, [R4,#0x0] + cpy r0,r7 + b 0x23110C + + + +.global hook_DarmaniRewardCheck +hook_DarmaniRewardCheck: + push {r0-r12, lr} + bl ItemOverride_CheckDarmaniGivenItem + cmp r0,#0x1 + pop {r0-r12, lr} + beq doNotSpawnDarmani + b 0x2DE794 +doNotSpawnDarmani: + nop + b 0x2DE96C + +.global hook_CheckOshExtData +hook_CheckOshExtData: + push {lr} + bl ItemOverride_GetOshExtData + pop {lr} + cmp r0,#0x0 + bx lr + +.global hook_GoronMaskGiveItem +hook_GoronMaskGiveItem: + push {r0-r12, lr} + cpy r0,r5 + cpy r1,r4 + mov r2,#0x79 + bl ItemOverride_GetSoHItem + ldr r5,.rActiveItemRow_addr + ldr r5,[r5] + cmp r5,#0x0 + pop {r0-r12, lr} + beq noOverrideDarmaniItemID + push {r0-r12, lr} + cpy r0,r5 + cpy r1,r4 + bl ItemOverride_GetItemTextAndItemID + pop {r0-r12, lr} + cpy r0,r5 + b 0x41DAB4 +noOverrideDarmaniItemID: + cpy r0,r5 + bl 0x233BEC + b 0x41DAB4 + +.global hook_ZoraMaskGiveItem +hook_ZoraMaskGiveItem: + push {r0-r12, lr} + cpy r0,r5 + cpy r1,r4 + mov r2,#0x7A + bl ItemOverride_GetSoHItem + ldr r5,.rActiveItemRow_addr + ldr r5,[r5] + cmp r5,#0x0 + pop {r0-r12, lr} + beq noOverrideMikauItemID + push {r0-r12, lr} + cpy r0,r5 + cpy r1,r4 + bl ItemOverride_GetItemTextAndItemID + pop {r0-r12, lr} + cpy r0,r5 + b 0x41DB84 +noOverrideMikauItemID: + cpy r0,r5 + bl 0x233BEC + b 0x41DB84 + +.global hook_GibdoMaskGiveItem +hook_GibdoMaskGiveItem: + push {r0-r12, lr} + cpy r0,r5 + cpy r1,r4 + mov r2,#0x87 + bl ItemOverride_GetSoHItem + ldr r5,.rActiveItemRow_addr + ldr r5,[r5] + cmp r5,#0x0 + pop {r0-r12, lr} + beq noOverrideGibdoItemID + push {r0-r12, lr} + cpy r0,r5 + cpy r1,r4 + bl ItemOverride_GetItemTextAndItemID + pop {r0-r12, lr} + cpy r0,r5 + b 0x41DC4C +noOverrideGibdoItemID: + cpy r0,r5 + bl 0x233BEC + b 0x41DC4C + +.global hook_CouplesMaskGiveItem +hook_CouplesMaskGiveItem: + push {r0-r12, lr} + cpy r0,r5 + cpy r1,r4 + mov r2,#0x85 + bl ItemOverride_GetSoHItem + ldr r5,.rActiveItemRow_addr + ldr r5,[r5] + cmp r5,#0x0 + pop {r0-r12, lr} + beq noOverrideCouplesItemID + push {r0-r12, lr} + cpy r0,r5 + cpy r1,r4 + bl ItemOverride_GetItemTextAndItemID + pop {r0-r12, lr} + b 0x46e264 +noOverrideCouplesItemID: + b 0x46e22c + +.global hook_AdjustCouplesMaskMessage +hook_AdjustCouplesMaskMessage: + push {r1} + ldr r1,.rStoredTextId_addr + ldr r1,[r1] + cmp r1,#0x0 + pop {r1} + beq normalText + ldr r1,.rStoredTextId_addr + ldr r1,[r1] + push {r0-r12,lr} + bl ItemOverride_RemoveTextId + pop {r0-r12, lr} + b 0x1867C8 +normalText: + mov r1,#0xA2 + b 0x1867C8 + +.global hook_ChangeSOHToCustomText +hook_ChangeSOHToCustomText: + push {r0-r2, lr} + bl ItemOverride_SwapSoHGetItemText + pop {r0-r2, lr} + b 0x186814 \ No newline at end of file diff --git a/code/source/asm/item_override_patches.s b/code/source/asm/item_override_patches.s new file mode 100644 index 00000000..460ea545 --- /dev/null +++ b/code/source/asm/item_override_patches.s @@ -0,0 +1,110 @@ +.arm + +.section .patch_IncomingGetItemID +.global IncomingGetItemID_patch +IncomingGetItemID_patch: + bl hook_IncomingGetItemID + + +.section .patch_CheckCurrentInventoryOverrideItem +.global patch_CheckCurrentInventoryOverrideItem +patch_CheckCurrentInventoryOverrideItem: + b hook_CheckCurrentInventory + +.section .patch_OverrideItemIdIndex +.global patch_OverrideItemIdIndex +patch_OverrideItemIdIndex: +@TODO: Branch off to hook and load addr that is needed from text ID. + bl hook_OverrideItemIdIndex + +.section .patch_ChangeDrawItemIndex +.global OverrideDrawIndex_patch +OverrideDrawIndex_patch: + b hook_OverrideDrawIndex + +.section .patch_ChangeDrawItemIndexSecond +.global patch_ChangeDrawItemIndexSecond +patch_ChangeDrawItemIndexSecond: + b hook_OverrideDrawIndexSecond + +.section .patch_OverrideTextID +.global OverrideTextID_patch +OverrideTextID_patch: + b hook_OverrideTextID + +.section .patch_OverrideItemID +.global OverrideItemID_patch +OverrideItemID_patch: + b hook_OverrideItemID + +.section .patch_RemoveGoronMaskCheckDarmani +.global patch_RemoveGoronMaskCheckDarmani +patch_RemoveGoronMaskCheckDarmani: + b hook_DarmaniRewardCheck + +.section .patch_CheckOshExtData +.global patch_CheckOshExtData +patch_CheckOshExtData: + bl hook_CheckOshExtData + +.section .patch_OverrideQuiverArchery +.global patch_OverrideQuiverArchery +patch_OverrideQuiverArchery: + mov r2,#0x47 + +.section .patch_OverrideQuiverArcheryTwo +.global patch_OverrideQuiverArcheryTwo +patch_OverrideQuiverArcheryTwo: + mov r2,#0x47 + +.section .patch_OverrideWalletSpiderHouseTwo +.global patch_OverrideWalletSpiderHouseTwo +patch_OverrideWalletSpiderHouseTwo: +@Override to use the progressive wallet instead. + mov r2,#0x48 + +.section .patch_OverrideWalletSpiderHouse +.global patch_OverrideWalletSpiderHouse +patch_OverrideWalletSpiderHouse: +@Override to use the progressive wallet instead. + mov r2,#0x48 + +.section .patch_OverrideProgessiveWalletTwo +.global patch_OverrideProgessiveWalletTwo +patch_OverrideProgessiveWalletTwo: +@Override to use the progressive wallet instead. + mov r2,#0x48 + +.section .patch_GoronMaskGiveItem +.global patch_GoronMaskGiveItem +patch_GoronMaskGiveItem: + b hook_GoronMaskGiveItem + +.section .patch_ZoraMaskGiveItem +.global patch_ZoraMaskGiveItem +patch_ZoraMaskGiveItem: + b hook_ZoraMaskGiveItem + +.section .patch_GibdoMaskGiveItem +.global patch_GibdoMaskGiveItem +patch_GibdoMaskGiveItem: + b hook_GibdoMaskGiveItem + +.section .patch_CouplesMaskGiveItem +.global patch_CouplesMaskGiveItem +patch_CouplesMaskGiveItem: + b hook_CouplesMaskGiveItem + +.section .patch_RemoveCouplesMaskMessage +.global patch_RemoveCouplesMaskMessage +patch_RemoveCouplesMaskMessage: + b hook_AdjustCouplesMaskMessage + + +@ This should remove the overwriting message for when the +@ user receives the Zora Mask. +@ Largely untested, need to check for any UB. +.section .patch_RemoveSOHCutesceneAfterMessage +.global patch_RemoveSOHCutesceneAfterMessage +patch_RemoveSOHCutesceneAfterMessage: + b hook_ChangeSOHToCustomText diff --git a/code/source/asm/patches.s b/code/source/asm/patches.s index 6db9c72e..b6a4b1b7 100644 --- a/code/source/asm/patches.s +++ b/code/source/asm/patches.s @@ -33,11 +33,6 @@ patch_DoNotResetPermFlags: patch_OcarinaDive: bl hook_CheckOcarinaDive -.section .patch_IncomingGetItemID -.global IncomingGetItemID_patch -IncomingGetItemID_patch: - bl hook_IncomingGetItemID - .section .patch_MainLoop .global patch_MainLoop patch_MainLoop: @@ -63,14 +58,6 @@ SleepQueryCallback_patch: Gfx_Update_patch: b hook_Gfx_Update -@ This should remove the overwriting message for when the -@ user receives the Zora Mask. -@ Largely untested, need to check for any UB. -.section .patch_RemoveSOHCutesceneAfterMessage -.global patch_RemoveSOHCutesceneAfterMessage -patch_RemoveSOHCutesceneAfterMessage: - b hook_ChangeSOHToCustomText - .section .patch_OverrideBombersNotebook .global patch_OverrideBombersNotebook patch_OverrideBombersNotebook: @@ -121,22 +108,6 @@ patch_DoNotRemoveKeys: nop nop -@ NOP out the bit of code that checks your sword and gives it back if it -@ is not a razor sword. This should prevent us from ever getting Kokiri sword on -@ cycle reset. -.section .patch_DoNotGiveSwordBackOnReset -.global patch_DoNotGiveSwordBackOnReset -patch_DoNotGiveSwordBackOnReset: - bl hook_DoNotGiveSwordBackOnReset - -.section .patch_RemoveSwordFlagSettingSoT -.global patch_RemoveSwordFlagSettingSoT -patch_RemoveSwordFlagSettingSoT: - nop - nop - nop - nop - .section .patch_RemoveItemBUsabilityOnReset .global patch_RemoveItemBUsabilityOnReset patch_RemoveItemBUsabilityOnReset: @@ -163,16 +134,6 @@ patch_RemoveMysteryMilkUsabilityCheck: patch_SpawnFastElegyStatues: b hook_SpawnFastElegyStatues -.section .patch_CheckCurrentInventoryOverrideItem -.global patch_CheckCurrentInventoryOverrideItem -patch_CheckCurrentInventoryOverrideItem: - b hook_CheckCurrentInventory - -.section .patch_ForceSwordUpgradeOnHuman -.global patch_ForceSwordUpgradeOnHuman -patch_ForceSwordUpgradeOnHuman: - mov r0,#0x0 - .section .patch_CheckDungeonItems .global patch_CheckDungeonItems patch_CheckDungeonItems: @@ -188,16 +149,6 @@ patch_CheckDungeonSmallKeys: patch_DisableMilkTimer: nop -.section .patch_LoadExtData -.global patch_LoadExtData -patch_LoadExtData: - bl hook_SaveFile_Load - -.section .patch_SaveFile_init -.global patch_SaveFile_init -patch_SaveFile_init: - bl hook_SaveFile_Init - .section .patch_GetCustomText .global patch_GetCustomText patch_GetCustomText: @@ -210,116 +161,26 @@ patch_GetCustomText: patch_RemoveMysteryMilkSoSCheck: mov r0, #0x0 -.section .patch_ISGCrouchStabOne -.global patch_ISGCrouchStabOne -patch_ISGCrouchStabOne: - nop - nop - nop - - -.section .patch_ISGCrouchStabTwo -.global patch_ISGCrouchStabTwo -patch_ISGCrouchStabTwo: - nop - nop - nop - .section .patch_BlastMaskCooldown .global patch_BlastMaskCooldown patch_BlastMaskCooldown: bl hook_BlastMaskCooldown -.section .patch_RemoveRazordSwordHealth -.global patch_RemoveRazordSwordHealth -patch_RemoveRazordSwordHealth: - nop - -.section .patch_RemoveRazordSwordHealthTwo -.global patch_RemoveRazordSwordHealthTwo -patch_RemoveRazordSwordHealthTwo: - nop - -.section .patch_RemoveRazordSwordHealthThree -.global patch_RemoveRazordSwordHealthThree -patch_RemoveRazordSwordHealthThree: - nop - -.section .patch_OverrideItemIdIndex -.global patch_OverrideItemIdIndex -patch_OverrideItemIdIndex: -@TODO: Branch off to hook and load addr that is needed from text ID. - bl hook_OverrideItemIdIndex - .section .patch_RemoveRemainsStateCheck .global patch_RemoveRemainsStateCheck patch_RemoveRemainsStateCheck: b hook_RemainsCheckValue -.section .patch_ChangeDrawItemIndex -.global OverrideDrawIndex_patch -OverrideDrawIndex_patch: - b hook_OverrideDrawIndex - -.section .patch_ChangeDrawItemIndexSecond -.global patch_ChangeDrawItemIndexSecond -patch_ChangeDrawItemIndexSecond: - b hook_OverrideDrawIndexSecond - -.section .patch_OverrideTextID -.global OverrideTextID_patch -OverrideTextID_patch: - b hook_OverrideTextID - .section .patch_OverrideBomberTextID .global OverrideBomberTextID_patch OverrideBomberTextID_patch: b hook_OverrideBomberTextID -.section .patch_OverrideItemID -.global OverrideItemID_patch -OverrideItemID_patch: - b hook_OverrideItemID - .section .patch_EnteringLocation .global patch_EnteringLocation patch_EnteringLocation: bl hook_EnteringLocation -.section .patch_RemoveGoronMaskCheckDarmani -.global patch_RemoveGoronMaskCheckDarmani -patch_RemoveGoronMaskCheckDarmani: - b hook_DarmaniRewardCheck - -.section .patch_CheckOshExtData -.global patch_CheckOshExtData -patch_CheckOshExtData: - bl hook_CheckOshExtData - -.section .patch_OverrideQuiverArchery -.global patch_OverrideQuiverArchery -patch_OverrideQuiverArchery: - mov r2,#0x47 - -.section .patch_OverrideQuiverArcheryTwo -.global patch_OverrideQuiverArcheryTwo -patch_OverrideQuiverArcheryTwo: - mov r2,#0x47 - -.section .patch_OverrideFairyGiveItem -.global OverrideFairyItemID_patch -OverrideFairyItemID_patch: - b hook_OverrideFairyItem - - -.section .patch_OverrideGreatFairySpawn -.global OverrideGreatFairySpawn_patch -OverrideGreatFairySpawn_patch: - nop - @ldmia sp!,{r4 - r6, pc} - @ldmia sp !, {r4 - r6, lr} - @ bx lr - .section .patch_ReadGamePad .global patch_ReadGamePad patch_ReadGamePad: @@ -352,33 +213,11 @@ patch_HandleOcarinaHooks: patch_FasterBlockMovement: .float 50.0 -.section .patch_GaboraCheckExtDataNotSword -.global patch_GaboraCheckExtDataNotSword -patch_GaboraCheckExtDataNotSword: - bl hook_GaboraCheckExtDataNotSword - -@ Removes sword being removed from inventory during -.section .patch_DoNotRemoveSwordGabora -.global patch_DoNotRemoveSwordGabora -patch_DoNotRemoveSwordGabora: - nop - -@ Removes sword being removed from inventory during -.section .patch_DoNotRemoveSwordGaboraTwo -.global patch_DoNotRemoveSwordGaboraTwo -patch_DoNotRemoveSwordGaboraTwo: - nop - .section .patch_FasterBlockMovementBack .global patch_FasterBlockMovementBack patch_FasterBlockMovementBack: .float 60.0 -.section .patch_SaveExtDataOnOwl -.global patch_SaveExtDataOnOwl -patch_SaveExtDataOnOwl: - b hook_OwlExtDataSave - @ nop a bne statement to allow ice arrows to be used on any water surface. .section .patch_IceArrowsAnywhere .global patch_IceArrowsAnywhere @@ -406,68 +245,20 @@ patch_RemoveZoraMaskCheckMikau: patch_AromaItemCheck: b hook_AromaItemCheck -.section .patch_OverrideWalletSpiderHouseTwo -.global patch_OverrideWalletSpiderHouseTwo -patch_OverrideWalletSpiderHouseTwo: -@Override to use the progressive wallet instead. - mov r2,#0x48 - -.section .patch_OverrideWalletSpiderHouse -.global patch_OverrideWalletSpiderHouse -patch_OverrideWalletSpiderHouse: -@Override to use the progressive wallet instead. - mov r2,#0x48 - -.section .patch_OverrideProgessiveWalletTwo -.global patch_OverrideProgessiveWalletTwo -patch_OverrideProgessiveWalletTwo: -@Override to use the progressive wallet instead. - mov r2,#0x48 - .section .patch_CheckMoTRequirement .global patch_CheckMoTRequirement patch_CheckMoTRequirement: b hook_CheckMoTSetting -.section .patch_HMSGiveItem -.global patch_HMSGiveItem -patch_HMSGiveItem: - b hook_OverrideHMSDekuMask - .section .patch_RemoveBombers .global patch_RemoveBombers patch_RemoveBombers: nop -.section .patch_GoronMaskGiveItem -.global patch_GoronMaskGiveItem -patch_GoronMaskGiveItem: - b hook_GoronMaskGiveItem - -.section .patch_ZoraMaskGiveItem -.global patch_ZoraMaskGiveItem -patch_ZoraMaskGiveItem: - b hook_ZoraMaskGiveItem - .section .patch_RemoveSoHMaskAppearing .global patch_RemoveSoHMaskAppearing patch_RemoveSoHMaskAppearing: nop - -.section .patch_GibdoMaskGiveItem -.global patch_GibdoMaskGiveItem -patch_GibdoMaskGiveItem: - b hook_GibdoMaskGiveItem - -.section .patch_CouplesMaskGiveItem -.global patch_CouplesMaskGiveItem -patch_CouplesMaskGiveItem: - b hook_CouplesMaskGiveItem - -.section .patch_RemoveCouplesMaskMessage -.global patch_RemoveCouplesMaskMessage -patch_RemoveCouplesMaskMessage: - b hook_AdjustCouplesMaskMessage .section .patch_RemoveJimWhenExitingHideout .global RemoveJimWhenExitingHideout_patch diff --git a/code/source/asm/save_hooks.s b/code/source/asm/save_hooks.s new file mode 100644 index 00000000..7ee0b21a --- /dev/null +++ b/code/source/asm/save_hooks.s @@ -0,0 +1,29 @@ +.arm +.text + + +.global hook_SaveFile_Load +hook_SaveFile_Load: + push {r0-r12, lr} + bl SaveFile_LoadExtSaveData + pop {r0-r12, lr} + str r5,[r1,#0x61C] + b 0x48C764 + +.global hook_SaveFile_Init +hook_SaveFile_Init: + push {r0-r12, lr} + cpy r0,r4 + bl SaveFile_Init + pop {r0-r12, lr} + mov r3,#0x0 + b 0x5b8b28 + + +.global hook_OwlExtDataSave +hook_OwlExtDataSave: + push {r0-r12, lr} + bl SaveFile_SaveExtSaveData + pop {r0-r12, lr} + cpy r6,r0 + b 0x317008 \ No newline at end of file diff --git a/code/source/asm/save_patches.s b/code/source/asm/save_patches.s new file mode 100644 index 00000000..f7ba7c8d --- /dev/null +++ b/code/source/asm/save_patches.s @@ -0,0 +1,16 @@ +.arm + +.section .patch_LoadExtData +.global patch_LoadExtData +patch_LoadExtData: + bl hook_SaveFile_Load + +.section .patch_SaveFile_init +.global patch_SaveFile_init +patch_SaveFile_init: + bl hook_SaveFile_Init + +.section .patch_SaveExtDataOnOwl +.global patch_SaveExtDataOnOwl +patch_SaveExtDataOnOwl: + b hook_OwlExtDataSave \ No newline at end of file diff --git a/code/source/asm/sword_hooks.s b/code/source/asm/sword_hooks.s new file mode 100644 index 00000000..fa37e4b7 --- /dev/null +++ b/code/source/asm/sword_hooks.s @@ -0,0 +1,38 @@ +.arm +.text + +.global hook_DoNotGiveSwordBackOnReset +hook_DoNotGiveSwordBackOnReset: + bhi 0x1C9958 @ original instruction, if gilded sword ignore these. + push {r0-r12, lr} + bl SongOfTimeSwordPlacement @ See rnd/link.cpp + pop {r0-r12, lr} + bx lr + +.global hook_DoNotGiveSwordBackOnResetTwo +hook_DoNotGiveSwordBackOnResetTwo: + push {r0-r12, lr} + bl SongOfTimeSwordPlacement @ See rnd/link.cpp + pop {r0-r12, lr} + bx lr + + +.global hook_GaboraCheckExtDataNotSword +hook_GaboraCheckExtDataNotSword: + push {r0-r12, lr} + bl ItemOverride_GetGaboraExtData + cmp r0, #0x0 + beq giveRazorSwordReward + cmp r0, #0x1 + beq giveGildedSword + pop {r0-r12,lr} + cmp r0,r0 + bx lr +giveRazorSwordReward: + pop {r0-r12,lr} + cmp r0,#0xFF + b 0x2CBB3C +giveGildedSword: + pop {r0-r12,lr} + cmp r0,r0 + b 0x2CBB38 \ No newline at end of file diff --git a/code/source/asm/sword_patches.s b/code/source/asm/sword_patches.s new file mode 100644 index 00000000..4ed491f1 --- /dev/null +++ b/code/source/asm/sword_patches.s @@ -0,0 +1,70 @@ +.arm + +@ NOP out the bit of code that checks your sword and gives it back if it +@ is not a razor sword. This should prevent us from ever getting Kokiri sword on +@ cycle reset. +.section .patch_DoNotGiveSwordBackOnReset +.global patch_DoNotGiveSwordBackOnReset +patch_DoNotGiveSwordBackOnReset: + bl hook_DoNotGiveSwordBackOnReset + +.section .patch_RemoveSwordFlagSettingSoT +.global patch_RemoveSwordFlagSettingSoT +patch_RemoveSwordFlagSettingSoT: + nop + nop + nop + nop + +.section .patch_ForceSwordUpgradeOnHuman +.global patch_ForceSwordUpgradeOnHuman +patch_ForceSwordUpgradeOnHuman: + mov r0,#0x0 + +.section .patch_ISGCrouchStabOne +.global patch_ISGCrouchStabOne +patch_ISGCrouchStabOne: + nop + nop + nop + + +.section .patch_ISGCrouchStabTwo +.global patch_ISGCrouchStabTwo +patch_ISGCrouchStabTwo: + nop + nop + nop + +.section .patch_RemoveRazordSwordHealth +.global patch_RemoveRazordSwordHealth +patch_RemoveRazordSwordHealth: + nop + +.section .patch_RemoveRazordSwordHealthTwo +.global patch_RemoveRazordSwordHealthTwo +patch_RemoveRazordSwordHealthTwo: + nop + +.section .patch_RemoveRazordSwordHealthThree +.global patch_RemoveRazordSwordHealthThree +patch_RemoveRazordSwordHealthThree: + nop + +.section .patch_GaboraCheckExtDataNotSword +.global patch_GaboraCheckExtDataNotSword +patch_GaboraCheckExtDataNotSword: + bl hook_GaboraCheckExtDataNotSword + +@ Removes sword being removed from inventory during +.section .patch_DoNotRemoveSwordGabora +.global patch_DoNotRemoveSwordGabora +patch_DoNotRemoveSwordGabora: + nop + +@ Removes sword being removed from inventory during +.section .patch_DoNotRemoveSwordGaboraTwo +.global patch_DoNotRemoveSwordGaboraTwo +patch_DoNotRemoveSwordGaboraTwo: + nop + diff --git a/code/source/rnd/item_override.cpp b/code/source/rnd/item_override.cpp index 4615ed99..9444ca6d 100644 --- a/code/source/rnd/item_override.cpp +++ b/code/source/rnd/item_override.cpp @@ -45,8 +45,8 @@ namespace rnd { rItemOverrides[0].value.looksLikeItemId = 0x26; rItemOverrides[1].key.scene = 0x6F; rItemOverrides[1].key.type = ItemOverride_Type::OVR_COLLECTABLE; - rItemOverrides[1].value.getItemId = 0x0C; - rItemOverrides[1].value.looksLikeItemId = 0x0C; + rItemOverrides[1].value.getItemId = 0x6E; + rItemOverrides[1].value.looksLikeItemId = 0x6E; rItemOverrides[2].key.scene = 0x12; rItemOverrides[2].key.type = ItemOverride_Type::OVR_COLLECTABLE; rItemOverrides[2].value.getItemId = 0x37; @@ -658,8 +658,9 @@ namespace rnd { ItemOverride override = {0}; s32 incomingNegative = incomingGetItemId < 0; // #if defined ENABLE_DEBUG || DEBUG_PRINT - // util::Print("%s: Our actor ID is %#06x\nScene is %#04x\nIncoming item id is %#04x", __func__, - // fromActor->id, gctx->scene, incomingGetItemId); + // util::Print("%s: Our actor ID is %#06x\nScene is %#04x\nIncoming item id is %#04x\n", __func__, + // fromActor->id, + // gctx->scene, incomingGetItemId); // #endif if (fromActor != NULL && incomingGetItemId != 0) { s16 getItemId = ItemOverride_CheckNpc(fromActor->id, incomingGetItemId, incomingNegative); diff --git a/code/source/rnd/link.cpp b/code/source/rnd/link.cpp index f7b69443..1dba7793 100644 --- a/code/source/rnd/link.cpp +++ b/code/source/rnd/link.cpp @@ -336,13 +336,11 @@ namespace rnd::link { } if (gSettingsContext.startingKokiriSword == (u8)StartingSwordSetting::STARTINGSWORD_NONE && saveData.equipment.sword_shield.sword == game::SwordType::NoSword) { + saveData.equipment.data[0].item_btn_b = game::ItemId::None; + saveData.equipment.sword_shield.sword = game::SwordType::NoSword; return; } -#if defined ENABLE_DEBUG || defined DEBUG_PRINT - rnd::util::Print("%s: Sword is %u and starting sword is %u\n", __func__, saveData.equipment.sword_shield.sword, - gSettingsContext.startingKokiriSword); -#endif // Check sword/shield flag to see what sword to give back. Once we do that, set the form[0] of player // equipment to that sword and return. if (saveData.equipment.sword_shield.sword == game::SwordType::NoSword && diff --git a/code/source/rnd/savefile.cpp b/code/source/rnd/savefile.cpp index f109db96..7426433c 100644 --- a/code/source/rnd/savefile.cpp +++ b/code/source/rnd/savefile.cpp @@ -30,6 +30,7 @@ namespace rnd { rnd::util::GetPointer(0x22b14c)(game::ItemId::BlastMask); rnd::util::GetPointer(0x22b14c)(game::ItemId::KafeiMask); rnd::util::GetPointer(0x22b14c)(game::ItemId::CircusLeaderMask); + rnd::util::GetPointer(0x22b14c)(game::ItemId::LetterToMama); // rnd::util::GetPointer(0x22b14c)(game::ItemId::PowderKeg); // saveData.inventory.inventory_count_register.quiver_upgrade = game::Quiver::Quiver50; saveData.inventory.inventory_count_register.bomb_bag_upgrade = game::BombBag::BombBag40;