From f8f194e19ba3298b05b6aab72ce39b90334ff3da Mon Sep 17 00:00:00 2001 From: Martin Michelsen Date: Sat, 10 Aug 2024 18:04:29 -0700 Subject: [PATCH] port AllCards to all Ep3 versions --- .../Episode3/AllCards.3SE0.patch.s | 61 ++----------------- .../Episode3/AllCards.3SJ0.patch.s | 17 ++++++ .../Episode3/AllCards.3SJT.patch.s | 61 ++----------------- .../Episode3/AllCards.3SP0.patch.s | 17 ++++++ .../Episode3/AllCards.ppc.inc.s | 54 ++++++++++++++++ .../Episode3/VIPCard.3SP0.patch.s | 4 -- 6 files changed, 98 insertions(+), 116 deletions(-) create mode 100644 system/client-functions/Episode3/AllCards.3SJ0.patch.s create mode 100644 system/client-functions/Episode3/AllCards.3SP0.patch.s create mode 100644 system/client-functions/Episode3/AllCards.ppc.inc.s diff --git a/system/client-functions/Episode3/AllCards.3SE0.patch.s b/system/client-functions/Episode3/AllCards.3SE0.patch.s index 7df0335e..8bd6183a 100644 --- a/system/client-functions/Episode3/AllCards.3SE0.patch.s +++ b/system/client-functions/Episode3/AllCards.3SE0.patch.s @@ -10,59 +10,8 @@ reloc0: .offsetof start start: - stwu [r1 - 0x20], r1 - mflr r0 - stw [r1 + 0x24], r0 - stw [r1 + 0x10], r31 - stw [r1 + 0x14], r30 - stw [r1 + 0x18], r29 - stw [r1 + 0x1C], r28 - - # Ep3PlayerDataSegment* seg = get_player_data_segment(0) - lis r3, 0x802A - ori r3, r3, 0x1BAC - mtctr r3 - li r3, 0 - bctrl - mr r31, r3 - - # decrypt_ep3_player_data_segment(seg) - lis r3, 0x802A - ori r3, r3, 0x15BC - mtctr r3 - mr r3, r31 - bctrl - - # Ep3PlayerDataSegment_on_card_obtained(seg, card_id) for each card, 99 times - lis r28, 0x802A - ori r28, r28, 0x17AC - li r30, 1 # r30 = card_id -obtain_card_99times: - li r29, 99 # r29 = obtain count -obtain_card_again: - mr r3, r31 - mr r4, r30 - mtctr r28 - bctrl - subi r29, r29, 1 - cmplwi r29, 0 - bne obtain_card_again - addi r30, r30, 1 - cmplwi r30, 0x2F0 - ble obtain_card_99times - - # encrypt_ep3_player_data_segment(seg) - lis r3, 0x802A - ori r3, r3, 0x160C - mtctr r3 - mr r3, r31 - bctrl - - lwz r31, [r1 + 0x10] - lwz r30, [r1 + 0x14] - lwz r29, [r1 + 0x18] - lwz r28, [r1 + 0x1C] - lwz r0, [r1 + 0x24] - addi r1, r1, 0x20 - mtlr r0 - blr + .include AllCards + .data 0x802A1BAC # get_player_data_segment + .data 0x802A15BC # decrypt_ep3_player_data_segment + .data 0x802A17AC # Ep3PlayerDataSegment_on_card_obtained + .data 0x802A160C # encrypt_ep3_player_data_segment diff --git a/system/client-functions/Episode3/AllCards.3SJ0.patch.s b/system/client-functions/Episode3/AllCards.3SJ0.patch.s new file mode 100644 index 00000000..9dab78aa --- /dev/null +++ b/system/client-functions/Episode3/AllCards.3SJ0.patch.s @@ -0,0 +1,17 @@ +# This patch gives you the maximum number of each card. It only works if used +# in-game, which means it must be used by running `$patch AllCards`. + +.meta hide_from_patches_menu +.meta name="Get all cards" +.meta description="This patch gives you\nthe maximum number\nof each card." + +entry_ptr: +reloc0: + .offsetof start + +start: + .include AllCards + .data 0x802A1154 # get_player_data_segment + .data 0x802A0B64 # decrypt_ep3_player_data_segment + .data 0x802A0D54 # Ep3PlayerDataSegment_on_card_obtained + .data 0x802A0BB4 # encrypt_ep3_player_data_segment diff --git a/system/client-functions/Episode3/AllCards.3SJT.patch.s b/system/client-functions/Episode3/AllCards.3SJT.patch.s index 8f3cf1f5..b6409a23 100644 --- a/system/client-functions/Episode3/AllCards.3SJT.patch.s +++ b/system/client-functions/Episode3/AllCards.3SJT.patch.s @@ -10,59 +10,8 @@ reloc0: .offsetof start start: - stwu [r1 - 0x20], r1 - mflr r0 - stw [r1 + 0x24], r0 - stw [r1 + 0x10], r31 - stw [r1 + 0x14], r30 - stw [r1 + 0x18], r29 - stw [r1 + 0x1C], r28 - - # Ep3PlayerDataSegment* seg = get_player_data_segment(0) - lis r3, 0x8029 - ori r3, r3, 0x987C - mtctr r3 - li r3, 0 - bctrl - mr r31, r3 - - # decrypt_ep3_player_data_segment(seg) - lis r3, 0x8029 - ori r3, r3, 0x92A4 - mtctr r3 - mr r3, r31 - bctrl - - # Ep3PlayerDataSegment_on_card_obtained(seg, card_id) for each card, 99 times - lis r28, 0x8029 - ori r28, r28, 0x94C0 - li r30, 1 # r30 = card_id -obtain_card_99times: - li r29, 99 # r29 = obtain count -obtain_card_again: - mr r3, r31 - mr r4, r30 - mtctr r28 - bctrl - subi r29, r29, 1 - cmplwi r29, 0 - bne obtain_card_again - addi r30, r30, 1 - cmplwi r30, 0x2F0 - ble obtain_card_99times - - # encrypt_ep3_player_data_segment(seg) - lis r3, 0x8029 - ori r3, r3, 0x92F8 - mtctr r3 - mr r3, r31 - bctrl - - lwz r31, [r1 + 0x10] - lwz r30, [r1 + 0x14] - lwz r29, [r1 + 0x18] - lwz r28, [r1 + 0x1C] - lwz r0, [r1 + 0x24] - addi r1, r1, 0x20 - mtlr r0 - blr + .include AllCards + .data 0x8029987C # get_player_data_segment + .data 0x802992A4 # decrypt_ep3_player_data_segment + .data 0x802994C0 # Ep3PlayerDataSegment_on_card_obtained + .data 0x802992F8 # encrypt_ep3_player_data_segment diff --git a/system/client-functions/Episode3/AllCards.3SP0.patch.s b/system/client-functions/Episode3/AllCards.3SP0.patch.s new file mode 100644 index 00000000..cd0f4497 --- /dev/null +++ b/system/client-functions/Episode3/AllCards.3SP0.patch.s @@ -0,0 +1,17 @@ +# This patch gives you the maximum number of each card. It only works if used +# in-game, which means it must be used by running `$patch AllCards`. + +.meta hide_from_patches_menu +.meta name="Get all cards" +.meta description="This patch gives you\nthe maximum number\nof each card." + +entry_ptr: +reloc0: + .offsetof start + +start: + .include AllCards + .data 0x802A25A4 # get_player_data_segment + .data 0x802A1FB4 # decrypt_ep3_player_data_segment + .data 0x802A21A4 # Ep3PlayerDataSegment_on_card_obtained + .data 0x802A2004 # encrypt_ep3_player_data_segment diff --git a/system/client-functions/Episode3/AllCards.ppc.inc.s b/system/client-functions/Episode3/AllCards.ppc.inc.s new file mode 100644 index 00000000..e6ecfd8b --- /dev/null +++ b/system/client-functions/Episode3/AllCards.ppc.inc.s @@ -0,0 +1,54 @@ +start: + stwu [r1 - 0x20], r1 + mflr r0 + stw [r1 + 0x24], r0 + stmw [r1 + 0x0C], r27 + + b get_data +get_data_ret: + mflr r27 + + # Ep3PlayerDataSegment* seg = get_player_data_segment(0) + lwz r3, [r27] + mtctr r3 + li r3, 0 + bctrl + mr r31, r3 + + # decrypt_ep3_player_data_segment(seg) + lwz r3, [r27 + 4] + mtctr r3 + mr r3, r31 + bctrl + + # Ep3PlayerDataSegment_on_card_obtained(seg, card_id) for each card, 99 times + lwz r28, [r27 + 8] # Ep3PlayerDataSegment_on_card_obtained + li r30, 1 # r30 = card_id +obtain_card_99times: + li r29, 99 # r29 = obtain count +obtain_card_again: + mr r3, r31 + mr r4, r30 + mtctr r28 + bctrl + subi r29, r29, 1 + cmplwi r29, 0 + bne obtain_card_again + addi r30, r30, 1 + cmplwi r30, 0x2F0 + ble obtain_card_99times + + # encrypt_ep3_player_data_segment(seg) + lwz r3, [r27 + 0x0C] # encrypt_ep3_player_data_segment + mtctr r3 + mr r3, r31 + bctrl + + lmw r27, [r1 + 0x0C] + lwz r0, [r1 + 0x24] + addi r1, r1, 0x20 + mtlr r0 + blr + +get_data: + bl get_data_ret diff --git a/system/client-functions/Episode3/VIPCard.3SP0.patch.s b/system/client-functions/Episode3/VIPCard.3SP0.patch.s index 33c0d159..6bfbe3c7 100644 --- a/system/client-functions/Episode3/VIPCard.3SP0.patch.s +++ b/system/client-functions/Episode3/VIPCard.3SP0.patch.s @@ -1,7 +1,3 @@ -# This patch can't be used currently because the EU version of Episode 3 doesn't -# natively support B2, and there is no buffer-overflow exploit (yet) to address -# this. - .meta name="Get VIP card" .meta description="Gives you a VIP card"