From 414aa76c233d64b29ae895d34eddbb1715deb80e Mon Sep 17 00:00:00 2001 From: PhlexPlexico Date: Sun, 25 Feb 2024 17:23:45 -0600 Subject: [PATCH] Adjust removing items to give next trade item if it is not none. (#45) --- code/include/rnd/savefile.h | 1 + code/mm.ld | 4 ++++ code/source/asm/trade_item_hooks.s | 8 ++++++++ code/source/asm/trade_item_patches.s | 5 +++++ code/source/rnd/savefile.cpp | 22 ++++++++++++++++++++++ 5 files changed, 40 insertions(+) diff --git a/code/include/rnd/savefile.h b/code/include/rnd/savefile.h index 1cb8b4a7..c1b65112 100644 --- a/code/include/rnd/savefile.h +++ b/code/include/rnd/savefile.h @@ -36,6 +36,7 @@ namespace rnd { extern "C" void SaveFile_RemoveStoredTradeItem(u16, u8); extern "C" void SaveFile_RemoveTradeItemFromSlot(u16, u8); extern "C" u8 SaveFile_GetItemCurrentlyInSlot(u8); + extern "C" void SaveFile_SetNextTradeSlotItem(u8); typedef struct { u32 version; // Needs to always be the first field of the structure diff --git a/code/mm.ld b/code/mm.ld index e95c8bcb..9d83ad40 100644 --- a/code/mm.ld +++ b/code/mm.ld @@ -67,6 +67,10 @@ SECTIONS{ *(.patch_RemoveTradeItemFromSlot) } + .patch_SwapTradeItemFromExtSlot 0x1AFEA8 : { + *(.patch_SwapTradeItemFromExtSlot) + } + .patch_OverrideCutsceneNextEntrance 0x1B1834 : { *(.patch_OverrideCutsceneNextEntrance) } diff --git a/code/source/asm/trade_item_hooks.s b/code/source/asm/trade_item_hooks.s index 5f16d48e..28a71e06 100644 --- a/code/source/asm/trade_item_hooks.s +++ b/code/source/asm/trade_item_hooks.s @@ -32,6 +32,14 @@ hook_RemoveTradeItemFromExtSlot: cpy r4,r0 bx lr +.global hook_SwapTradeItemFromExtSlot +hook_SwapTradeItemFromExtSlot: + push {r0-r12,lr} + bl SaveFile_SetNextTradeSlotItem + pop {r0-r12,lr} + mov r2, #0xFF + bx lr + .global hook_RemoveKafeiItemFromExtSlot hook_RemoveKafeiItemFromExtSlot: push {r0-r12, lr} diff --git a/code/source/asm/trade_item_patches.s b/code/source/asm/trade_item_patches.s index b36b7ca2..841b866f 100644 --- a/code/source/asm/trade_item_patches.s +++ b/code/source/asm/trade_item_patches.s @@ -5,6 +5,11 @@ patch_RemoveTradeItemFromSlot: bl hook_RemoveTradeItemFromExtSlot +.section .patch_SwapTradeItemFromExtSlot +.global patch_SwapTradeItemFromExtSlot +patch_SwapTradeItemFromExtSlot: + bl hook_SwapTradeItemFromExtSlot + .section .patch_DoNotRemoveTradeItems .global patch_DoNotRemoveTradeItems patch_DoNotRemoveTradeItems: diff --git a/code/source/rnd/savefile.cpp b/code/source/rnd/savefile.cpp index 7426433c..1f169816 100644 --- a/code/source/rnd/savefile.cpp +++ b/code/source/rnd/savefile.cpp @@ -940,6 +940,8 @@ namespace rnd { break; } } + } else if (slot == 17 && item == (u16)game::ItemId::LetterToKafei) { + gExtSaveData.collectedTradeItems[6] = game::ItemId::None; } } @@ -949,6 +951,26 @@ namespace rnd { #endif return (u8)game::GetCommonData().save.inventory.items[slot]; } + + extern "C" void SaveFile_SetNextTradeSlotItem(u8 slot) { + if (slot != 5 && slot != 17) + return; + game::ItemId firstItem = game::ItemId::None; + for (int i = 0; i < 9; i++) { + if (firstItem == game::ItemId::None) { + if (slot == 17 && i > 5 && i < 8 && gExtSaveData.collectedTradeItems[i] != game::ItemId::None) { + firstItem = gExtSaveData.collectedTradeItems[i]; + break; + } else if (slot == 5 && i < 5 && gExtSaveData.collectedTradeItems[i] != game::ItemId::None) { + firstItem = gExtSaveData.collectedTradeItems[i]; + break; + } + } + } + // Place the item in inventory, if there is no item to place it simply places none. + game::SaveData& saveData = game::GetCommonData().save; + saveData.inventory.items[slot] = firstItem; + } // SaveFile_DrawAndShowUIMessage() { // }