diff --git a/asm/include/main_02059118.inc b/asm/include/main_02059224.inc similarity index 100% rename from asm/include/main_02059118.inc rename to asm/include/main_02059224.inc diff --git a/asm/main_02059118.s b/asm/main_02059224.s similarity index 99% rename from asm/main_02059118.s rename to asm/main_02059224.s index caaca56d..b4af24b3 100644 --- a/asm/main_02059118.s +++ b/asm/main_02059224.s @@ -1,82 +1,8 @@ .include "asm/macros.inc" - .include "main_02059118.inc" + .include "main_02059224.inc" .text - arm_func_start WriteMonsterInfoToSave -WriteMonsterInfoToSave: ; 0x02059118 - stmdb sp!, {r4, r5, r6, r7, r8, lr} - sub sp, sp, #0x10 - mov r3, r0 - mov r2, r1 - add r0, sp, #0 - mov r1, r3 - bl sub_02050990 - ldr r6, _0205921C ; =TEAM_MEMBER_TABLE_PTR - ldr r5, _02059220 ; =0x0000022B - mov r8, #0 - add r7, sp, #0 - mov r4, #0x44 -_02059148: - ldr r1, [r6] - mov r0, r7 - mla r1, r8, r4, r1 - bl WriteMonsterToSave - add r8, r8, #1 - cmp r8, r5 - blt _02059148 - ldr r1, _0205921C ; =TEAM_MEMBER_TABLE_PTR - add r0, sp, #0 - ldr r1, [r1] - mov r2, #0x40 - add r1, r1, #0x78 - add r1, r1, #0x9800 - bl CopyBitsTo - ldr r1, _0205921C ; =TEAM_MEMBER_TABLE_PTR - add r0, sp, #0 - ldr r1, [r1] - mov r2, #4 - add r1, r1, #0x1880 - add r1, r1, #0x8000 - bl CopyBitsTo - ldr r1, _0205921C ; =TEAM_MEMBER_TABLE_PTR - add r0, sp, #0 - ldr r1, [r1] - mov r2, #4 - add r1, r1, #0x81 - add r1, r1, #0x9800 - bl CopyBitsTo - ldr r1, _0205921C ; =TEAM_MEMBER_TABLE_PTR - add r0, sp, #0 - ldr r1, [r1] - mov r2, #0x50 - add r1, r1, #0x82 - add r1, r1, #0x9800 - bl CopyBitsTo - ldr r5, _0205921C ; =TEAM_MEMBER_TABLE_PTR - mov r7, #0 - add r6, sp, #0 - mov r4, #0x44 -_020591E4: - ldr r1, [r5] - mov r0, r6 - add r1, r1, #0x98 - add r1, r1, #0x9800 - mla r1, r7, r4, r1 - bl WriteMonsterToSave - add r7, r7, #1 - cmp r7, #4 - blt _020591E4 - add r0, sp, #0 - bl sub_020509BC - ldr r0, [sp, #8] - add sp, sp, #0x10 - ldmia sp!, {r4, r5, r6, r7, r8, pc} - .align 2, 0 -_0205921C: .word TEAM_MEMBER_TABLE_PTR -_02059220: .word 0x0000022B - arm_func_end WriteMonsterInfoToSave - arm_func_start ReadMonsterInfoFromSave ReadMonsterInfoFromSave: ; 0x02059224 stmdb sp!, {r4, r5, r6, r7, r8, lr} diff --git a/include/common.h b/include/common.h index a52cb02b..e70b9fcd 100644 --- a/include/common.h +++ b/include/common.h @@ -4,6 +4,8 @@ #include "item.h" #include "move.h" +#define MAX_GROUND_TEAM_MEMBERS 555 + struct ground_move { // 0x0: flags: 1-byte bitfield // See move::flags0 for details @@ -98,7 +100,7 @@ struct team_member_table { // // Subsequent entries are normal recruits. If a member is released, all subsequent members will // be shifted up, so there should be no gaps in the list. - struct ground_monster members[555]; + struct ground_monster members[MAX_GROUND_TEAM_MEMBERS]; // 0x936C: Currently active team members for each team, listed in team order. The first index is // the team ID (see enum team_id), the second is the roster index within the given team. // diff --git a/include/main_02059060.h b/include/main_02059060.h index ed489953..520cfe98 100644 --- a/include/main_02059060.h +++ b/include/main_02059060.h @@ -1,6 +1,13 @@ #ifndef PMDSKY_MAIN_02059060_H #define PMDSKY_MAIN_02059060_H +struct WriteMonsterInfoToSave_struct { + u32 unk0; + u32 unk4; + s32 result; + u32 unkC; +}; + // Returns the name of the explorer maze team. If the language of the team name is different from the // language of selected in this game a default team name is written to the buffer instead. // dest: [output] Buffer @@ -8,5 +15,6 @@ void GetExplorerMazeTeamName(u8 *dest); u64 sub_020590C0(void); void sub_020590DC(u64 param0); struct ground_monster* GetExplorerMazeMonster(s16 entry_number); +s32 WriteMonsterInfoToSave(void* start_addr, u32 total_len); #endif //PMDSKY_MAIN_02059060_H diff --git a/main.lsf b/main.lsf index 748f4e77..f4825f2d 100644 --- a/main.lsf +++ b/main.lsf @@ -130,7 +130,7 @@ Static main Object asm/main_02058F24.o Object src/main_02058FA4.o Object src/main_02059060.o - Object asm/main_02059118.o + Object asm/main_02059224.o Object src/dungeon_init_2.o Object asm/main_0206A750.o Object src/main_0206C98C.o diff --git a/src/main_02059060.c b/src/main_02059060.c index e4294187..5df56b97 100644 --- a/src/main_02059060.c +++ b/src/main_02059060.c @@ -5,8 +5,12 @@ extern struct team_member_table *TEAM_MEMBER_TABLE_PTR; -s32 GetLanguageType(void); -void StrncpySimpleNoPadSafe(u8* dest, const u8* src, u32 n); +extern s32 GetLanguageType(void); +extern void StrncpySimpleNoPadSafe(u8* dest, const u8* src, u32 n); +extern void sub_02050990(struct WriteMonsterInfoToSave_struct *ptr, void *start_addr, u32 total_len); +extern void WriteMonsterToSave(struct WriteMonsterInfoToSave_struct *write_info, struct ground_monster *monster); +extern void CopyBitsTo(void *ctx, void *src, s32 nbits); +extern void sub_020509BC(struct WriteMonsterInfoToSave_struct *ptr); void GetExplorerMazeTeamName(u8 *dest) { @@ -46,3 +50,29 @@ struct ground_monster* GetExplorerMazeMonster(s16 entry_number) { return TEAM_MEMBER_TABLE_PTR->explorer_maze_monsters + entry_number; } + +s32 WriteMonsterInfoToSave(void* start_addr, u32 total_len) +{ + struct WriteMonsterInfoToSave_struct local_struct; + + sub_02050990(&local_struct, start_addr, total_len); + + for (s32 i = 0; i < MAX_GROUND_TEAM_MEMBERS; i++) + { + WriteMonsterToSave(&local_struct, &TEAM_MEMBER_TABLE_PTR->members[i]); + } + + CopyBitsTo(&local_struct, &TEAM_MEMBER_TABLE_PTR->field_0x9878, 64); + CopyBitsTo(&local_struct, &TEAM_MEMBER_TABLE_PTR->explorer_maze_team_native_language, 4); + CopyBitsTo(&local_struct, &TEAM_MEMBER_TABLE_PTR->field_0x9881, 4); + CopyBitsTo(&local_struct, &TEAM_MEMBER_TABLE_PTR->explorer_maze_team_name, 80); + + for (s32 i = 0; i < 4; i++) + { + WriteMonsterToSave(&local_struct, &TEAM_MEMBER_TABLE_PTR->explorer_maze_monsters[i]); + } + + sub_020509BC(&local_struct); + + return local_struct.result; +} diff --git a/tools/extract_function/extract_function.py b/tools/extract_function/extract_function.py index 5bc5f95d..e296d95e 100644 --- a/tools/extract_function/extract_function.py +++ b/tools/extract_function/extract_function.py @@ -157,8 +157,6 @@ def trim_merge_file_name(file_name: str) -> str: merge_prev_file = trim_merge_file_name(merge_prev_file) merge_next_file = trim_merge_file_name(merge_next_file) -print(merge_prev_file) -print(merge_next_file) print('Updating', LSF_FILE_PATH) with open(LSF_FILE_PATH, 'w') as lsf_file: