implement $savechar on Episode 3

This commit is contained in:
Martin Michelsen
2024-06-27 23:33:22 -07:00
parent 52644695a3
commit 4bd6ef12a9
38 changed files with 474 additions and 82 deletions
@@ -14,3 +14,4 @@ data:
.data 0x805C4D80 # root_protocol (anchor: send_05)
.data 0x803DB138 # free9
.data 0x800787B0 # TProtocol_wait_send_drain
.data 0x00002370 # sizeof(*char_file_part2)
@@ -14,3 +14,4 @@ data:
.data 0x805CBD60 # root_protocol (anchor: send_05)
.data 0x803DB190 # free9
.data 0x800787B0 # TProtocol_wait_send_drain
.data 0x00002370 # sizeof(*char_file_part2)
@@ -14,3 +14,4 @@ data:
.data 0x805D5580 # root_protocol (anchor: send_05)
.data 0x803DE890 # free9
.data 0x8007889C # TProtocol_wait_send_drain
.data 0x00002370 # sizeof(*char_file_part2)
@@ -14,3 +14,4 @@ data:
.data 0x805C4488 # root_protocol (anchor: send_05)
.data 0x803D9E90 # free9
.data 0x8007848C # TProtocol_wait_send_drain
.data 0x00002370 # sizeof(*char_file_part2)
@@ -14,3 +14,4 @@ data:
.data 0x805CEA50 # root_protocol (anchor: send_05)
.data 0x803DC870 # free9
.data 0x800785F0 # TProtocol_wait_send_drain
.data 0x00002370 # sizeof(*char_file_part2)
@@ -14,3 +14,4 @@ data:
.data 0x805D5ED0 # root_protocol (anchor: send_05)
.data 0x803DE710 # free9
.data 0x80078748 # TProtocol_wait_send_drain
.data 0x00002370 # sizeof(*char_file_part2)
@@ -14,3 +14,4 @@ data:
.data 0x805D5C70 # root_protocol (anchor: send_05)
.data 0x803DE4C0 # free9
.data 0x800786A0 # TProtocol_wait_send_drain
.data 0x00002370 # sizeof(*char_file_part2)
@@ -14,3 +14,4 @@ data:
.data 0x805D17C0 # root_protocol (anchor: send_05)
.data 0x803DD380 # free9
.data 0x80078820 # TProtocol_wait_send_drain
.data 0x00002370 # sizeof(*char_file_part2)
@@ -0,0 +1,17 @@
.meta hide_from_patches_menu
.meta name="GetExtendedPlayerInfo"
.meta description=""
entry_ptr:
reloc0:
.offsetof start
start:
.include GetExtendedPlayerInfoGC
data:
.data 0x8038C0EC # malloc9
.data 0x8057A6F0 # char_file_part1
.data 0x8057A6F4 # char_file_part2
.data 0x8057A150 # root_protocol (anchor: send_05)
.data 0x8038C144 # free9
.data 0x80026B88 # TProtocol_wait_send_drain
.data 0x0000358C # sizeof(*char_file_part2)
@@ -0,0 +1,17 @@
.meta hide_from_patches_menu
.meta name="GetExtendedPlayerInfo"
.meta description=""
entry_ptr:
reloc0:
.offsetof start
start:
.include GetExtendedPlayerInfoGC
data:
.data 0x8038B09C # malloc9
.data 0x80579880 # char_file_part1
.data 0x80579884 # char_file_part2
.data 0x805792E0 # root_protocol (anchor: send_05)
.data 0x8038B0F4 # free9
.data 0x80026A04 # TProtocol_wait_send_drain
.data 0x0000358C # sizeof(*char_file_part2)
@@ -0,0 +1,17 @@
.meta hide_from_patches_menu
.meta name="GetExtendedPlayerInfo"
.meta description=""
entry_ptr:
reloc0:
.offsetof start
start:
.include GetExtendedPlayerInfoGC
data:
.data 0x80358094 # malloc9
.data 0x8058B980 # char_file_part1
.data 0x8058B984 # char_file_part2
.data 0x8058B3A0 # root_protocol (anchor: send_05)
.data 0x803580EC # free9
.data 0x80026FE4 # TProtocol_wait_send_drain
.data 0x000041F4 # sizeof(*char_file_part2)
@@ -0,0 +1,17 @@
.meta hide_from_patches_menu
.meta name="GetExtendedPlayerInfo"
.meta description=""
entry_ptr:
reloc0:
.offsetof start
start:
.include GetExtendedPlayerInfoGC
data:
.data 0x8038CF94 # malloc9
.data 0x8057CB10 # char_file_part1
.data 0x8057CB14 # char_file_part2
.data 0x8057C570 # root_protocol (anchor: send_05)
.data 0x8038CFEC # free9
.data 0x80026BB8 # TProtocol_wait_send_drain
.data 0x0000358C # sizeof(*char_file_part2)
@@ -1,25 +1,31 @@
stwu [r1 - 0x20], r1
stwu [r1 - 0x40], r1
mflr r0
stw [r1 + 0x24], r0
stw [r1 + 0x44], r0
stw [r1 + 0x08], r31
stw [r1 + 0x0C], r30
stw [r1 + 0x10], r29
stw [r1 + 0x14], r28
stw [r1 + 0x18], r27
b get_data_ptr
get_data_ptr_ret:
mflr r30
li r3, 0x279C
lwz r27, [r30 + 0x18] # sizeof(part2)
addi r3, r27, 0x42C # sizeof(header) + sizeof(part1) + sizeof(part2) + sizeof(unused fields after part2)
lwz r0, [r30]
mtctr r0
bctrl # malloc9
mr. r31, r3
beq malloc9_failed
lis r0, 0x3000
ori r0, r0, 0x9C27
stw [r31], r0 # header = 30 00 9C 27
li r0, 0x3000
sth [r31], r0
addi r3, r27, 0x42C
stb [r31 + 2], r3
rlwinm r3, r3, 24, 24, 31
stb [r31 + 3], r3 # header = 30 00 SS SS
lwz r4, [r30 + 0x04]
lwz r4, [r4] # r4 = char_file_part1
@@ -30,16 +36,18 @@ get_data_ptr_ret:
lwz r4, [r30 + 0x08]
lwz r4, [r4] # r4 = char_file_part2
addi r3, r31, 0x0420
li r5, 0x2370 # sizeof(part2)
mr r5, r27
bl memcpy
li r0, 0
stw [r31 + 0x2790], r0
stw [r31 + 0x2794], r0
stw [r31 + 0x2798], r0
add r3, r27, r31
addi r3, r3, 0x420 # r3 = pointer to unused fields after part2
stw [r3 + 0], r0
stw [r3 + 4], r0
stw [r3 + 8], r0
mr r28, r31
li r29, 0x279C
addi r29, r27, 0x42C
send_again:
lwz r3, [r30 + 0x0C]
lwz r3, [r3]
@@ -74,12 +82,13 @@ drain_failed:
li r3, 0
malloc9_failed:
lwz r27, [r1 + 0x18]
lwz r28, [r1 + 0x14]
lwz r29, [r1 + 0x10]
lwz r30, [r1 + 0x0C]
lwz r31, [r1 + 0x08]
lwz r0, [r1 + 0x24]
addi r1, r1, 0x20
lwz r0, [r1 + 0x44]
addi r1, r1, 0x40
mtlr r0
blr
@@ -9,4 +9,5 @@ start:
.include SetExtendedPlayerInfoGC
data:
.data 0x805C5758 # character_file
.data 0x00002370 # sizeof(part2)
# Server adds a PSOGCCharacterFile::Character here
@@ -9,4 +9,5 @@ start:
.include SetExtendedPlayerInfoGC
data:
.data 0x805CC738 # character_file
.data 0x00002370 # sizeof(part2)
# Server adds a PSOGCCharacterFile::Character here
@@ -9,4 +9,5 @@ start:
.include SetExtendedPlayerInfoGC
data:
.data 0x805D5F58 # character_file
.data 0x00002370 # sizeof(part2)
# Server adds a PSOGCCharacterFile::Character here
@@ -9,4 +9,5 @@ start:
.include SetExtendedPlayerInfoGC
data:
.data 0x805C4E60 # character_file
.data 0x00002370 # sizeof(part2)
# Server adds a PSOGCCharacterFile::Character here
@@ -9,4 +9,5 @@ start:
.include SetExtendedPlayerInfoGC
data:
.data 0x805CF428 # character_file
.data 0x00002370 # sizeof(part2)
# Server adds a PSOGCCharacterFile::Character here
@@ -9,4 +9,5 @@ start:
.include SetExtendedPlayerInfoGC
data:
.data 0x805D68A8 # character_file
.data 0x00002370 # sizeof(part2)
# Server adds a PSOGCCharacterFile::Character here
@@ -9,4 +9,5 @@ start:
.include SetExtendedPlayerInfoGC
data:
.data 0x805D6648 # character_file
.data 0x00002370 # sizeof(part2)
# Server adds a PSOGCCharacterFile::Character here
@@ -6,44 +6,8 @@ entry_ptr:
reloc0:
.offsetof start
start:
mflr r12
bl get_data_ptr
get_data_ptr_ret:
mflr r11
lwz r10, [r11]
# Copy part1 data into place
lwz r3, [r10 + 0x08]
addi r4, r11, 0x0004
li r5, 0x41C
bl memcpy
# Copy part2 data into place, but retain the values of a few metadata fields
# so the game won't think the file is corrupt
lwz r3, [r10 + 0x0C]
lwz r7, [r3 + 0x04] # creation_timestamp
lwz r8, [r3 + 0x08] # signature
lwz r9, [r3 + 0x14] # save_count
addi r4, r11, 0x0420
li r5, 0x2268
bl memcpy
lwz r3, [r10 + 0x0C]
stw [r3 + 0x04], r7 # creation_timestamp
stw [r3 + 0x08], r8 # signature
stw [r3 + 0x14], r9 # save_count
li r3, 1
mtlr r12
blr
memcpy:
.include CopyDataWords
blr
get_data_ptr:
bl get_data_ptr_ret
.include SetExtendedPlayerInfoGC
data:
.data 0x805CC738 # character_file
# Server adds a PSOGCCharacterFile::Character here
.data 0x00002268 # sizeof(part2)
# Server adds a PSOGCNTECharacterFileCharacter here
@@ -9,4 +9,5 @@ start:
.include SetExtendedPlayerInfoGC
data:
.data 0x805D2198 # character_file
.data 0x00002370 # sizeof(part2)
# Server adds a PSOGCCharacterFile::Character here
@@ -0,0 +1,13 @@
.meta hide_from_patches_menu
.meta name="SetExtendedPlayerInfo"
.meta description=""
entry_ptr:
reloc0:
.offsetof start
start:
.include SetExtendedPlayerInfoGC
data:
.data 0x8057A6E8 # character_file
.data 0x0000358C # sizeof(*char_file_part2)
# Server adds a PSOGCEp3CharacterFile::Character here
@@ -0,0 +1,13 @@
.meta hide_from_patches_menu
.meta name="SetExtendedPlayerInfo"
.meta description=""
entry_ptr:
reloc0:
.offsetof start
start:
.include SetExtendedPlayerInfoGC
data:
.data 0x80579878 # character_file
.data 0x0000358C # sizeof(*char_file_part2)
# Server adds a PSOGCEp3CharacterFile::Character here
@@ -0,0 +1,13 @@
.meta hide_from_patches_menu
.meta name="SetExtendedPlayerInfo"
.meta description=""
entry_ptr:
reloc0:
.offsetof start
start:
.include SetExtendedPlayerInfoGC
data:
.data 0x8058B978 # character_file
.data 0x0000358C # sizeof(*char_file_part2)
# Server adds a PSOGCEp3CharacterFile::Character here
@@ -0,0 +1,13 @@
.meta hide_from_patches_menu
.meta name="SetExtendedPlayerInfo"
.meta description=""
entry_ptr:
reloc0:
.offsetof start
start:
.include SetExtendedPlayerInfoGC
data:
.data 0x8057CB08 # character_file
.data 0x0000358C # sizeof(*char_file_part2)
# Server adds a PSOGCEp3CharacterFile::Character here
@@ -7,7 +7,7 @@ get_data_ptr_ret:
# Copy part1 data into place
lwz r3, [r10 + 0x08]
addi r4, r11, 0x0004
addi r4, r11, 0x0008
li r5, 0x41C
bl memcpy
@@ -17,8 +17,8 @@ get_data_ptr_ret:
lwz r7, [r3 + 0x04] # creation_timestamp
lwz r8, [r3 + 0x08] # signature
lwz r9, [r3 + 0x14] # save_count
addi r4, r11, 0x0420
li r5, 0x2370
addi r4, r11, 0x0424
lwz r5, [r11 + 4]
bl memcpy
lwz r3, [r10 + 0x0C]
stw [r3 + 0x04], r7 # creation_timestamp