diff --git a/asm/code_8023868.s b/asm/code_8023868.s index 5ee25d676..5edea5c99 100644 --- a/asm/code_8023868.s +++ b/asm/code_8023868.s @@ -670,245 +670,5 @@ _08023D9C: .4byte 0x00000372 _08023DA0: .4byte 0x000003a2 thumb_func_end sub_8023CF4 - thumb_func_start sub_8023DA4 -sub_8023DA4: - push {r4-r7,lr} - mov r7, r9 - mov r6, r8 - push {r6,r7} - sub sp, 0x58 - ldr r4, _08023DD8 - ldr r0, [r4] - movs r5, 0xE3 - lsls r5, 2 - adds r0, r5 - ldr r0, [r0] - bl CallPrepareTextbox_8008C54 - ldr r0, [r4] - adds r0, r5 - ldr r0, [r0] - bl sub_80073B8 - ldr r0, [r4] - ldr r1, [r0] - cmp r1, 0x2 - beq _08023DE0 - cmp r1, 0x4 - beq _08023E00 - ldr r2, _08023DDC - b _08023E02 - .align 2, 0 -_08023DD8: .4byte gUnknown_3001B60 -_08023DDC: .4byte sUnknown_80DC988 -_08023DE0: - add r0, sp, 0x8 - bl sub_80920D8 - ldr r0, [r4] - movs r1, 0xE3 - lsls r1, 2 - adds r0, r1 - ldr r3, [r0] - movs r0, 0 - str r0, [sp] - movs r0, 0xA - movs r1, 0 - add r2, sp, 0x8 - bl PrintStringOnWindow - b _08023E3C -_08023E00: - ldr r2, _08023EBC -_08023E02: - adds r0, r5 - ldr r3, [r0] - movs r0, 0 - str r0, [sp] - movs r0, 0xA - movs r1, 0 - bl PrintStringOnWindow - ldr r1, [r4] - ldr r2, _08023EC0 - adds r0, r1, r2 - ldrb r0, [r0] - lsls r0, 3 - adds r3, r0, 0x4 - ldr r4, _08023EC4 - adds r0, r1, r4 - movs r4, 0 - ldrsh r2, [r0, r4] - adds r2, 0x1 - movs r0, 0x7 - str r0, [sp] - adds r1, r5 - ldr r0, [r1] - str r0, [sp, 0x4] - adds r0, r3, 0 - movs r1, 0 - movs r3, 0x2 - bl sub_8012BC4 -_08023E3C: - movs r7, 0 - ldr r1, _08023EC8 - ldr r0, [r1] - ldr r2, _08023ECC - adds r0, r2 - movs r4, 0 - ldrsh r0, [r0, r4] - cmp r7, r0 - blt _08023E50 - b _08023F62 -_08023E50: - mov r8, r1 - add r0, sp, 0x30 - mov r9, r0 -_08023E56: - ldr r3, [r1] - ldr r1, _08023EC4 - adds r0, r3, r1 - movs r2, 0 - ldrsh r1, [r0, r2] - movs r4, 0xDD - lsls r4, 2 - adds r0, r3, r4 - movs r2, 0 - ldrsh r0, [r0, r2] - muls r1, r0 - adds r1, r7 - lsls r1, 1 - adds r0, r3, 0 - adds r0, 0x1A - adds r0, r1 - movs r4, 0 - ldrsh r5, [r0, r4] - ldr r2, _08023ED0 - movs r0, 0x58 - adds r1, r5, 0 - muls r1, r0 - ldr r0, [r2] - adds r4, r0, r1 - movs r6, 0x7 - ldrh r0, [r4] - lsrs r0, 1 - movs r1, 0x1 - ands r0, r1 - cmp r0, 0 - beq _08023ED4 - movs r0, 0 - ldrb r1, [r4, 0x4] - cmp r1, 0x41 - bne _08023E9E - movs r0, 0x1 -_08023E9E: - cmp r0, 0 - beq _08023EA4 - movs r6, 0x6 -_08023EA4: - movs r0, 0 - cmp r1, 0x40 - bne _08023EAC - movs r0, 0x1 -_08023EAC: - cmp r0, 0 - beq _08023EB2 - movs r6, 0x6 -_08023EB2: - ldrb r0, [r4, 0x2] - cmp r0, 0 - beq _08023EEA - movs r6, 0x5 - b _08023EEA - .align 2, 0 -_08023EBC: .4byte sUnknown_80DC980 -_08023EC0: .4byte 0x000003f6 -_08023EC4: .4byte 0x00000376 -_08023EC8: .4byte gUnknown_3001B60 -_08023ECC: .4byte 0x00000372 -_08023ED0: .4byte gRecruitedPokemonRef -_08023ED4: - ldrb r0, [r3, 0x18] - cmp r0, 0 - beq _08023EEA - adds r0, r5, 0 - bl sub_808D750 - lsls r0, 24 - movs r6, 0x2 - cmp r0, 0 - beq _08023EEA - movs r6, 0x4 -_08023EEA: - mov r0, r8 - ldr r1, [r0] - ldr r0, [r1] - cmp r0, 0x4 - bne _08023F02 - movs r2, 0xD5 - lsls r2, 2 - adds r0, r1, r2 - ldrb r1, [r0] - adds r0, r4, 0 - bl sub_8024184 -_08023F02: - adds r1, r4, 0 - adds r1, 0x4C - mov r0, r9 - movs r2, 0xA - bl sub_80922B4 - movs r0, 0x8 - ldrsh r1, [r4, r0] - add r0, sp, 0x44 - bl sub_808D930 - add r0, sp, 0x8 - ldr r1, _08023F80 - adds r2, r6, 0 - mov r3, r9 - bl sprintfStatic - mov r1, r8 - ldr r0, [r1] - movs r2, 0xD6 - lsls r2, 2 - adds r0, r2 - adds r1, r7, 0 - bl GetMenuEntryYCoord - adds r1, r0, 0 - mov r4, r8 - ldr r0, [r4] - movs r2, 0xE3 - lsls r2, 2 - adds r0, r2 - ldr r3, [r0] - movs r0, 0 - str r0, [sp] - movs r0, 0x8 - add r2, sp, 0x8 - bl PrintStringOnWindow - adds r7, 0x1 - mov r1, r8 - ldr r0, [r4] - ldr r4, _08023F84 - adds r0, r4 - movs r2, 0 - ldrsh r0, [r0, r2] - cmp r7, r0 - bge _08023F62 - b _08023E56 -_08023F62: - ldr r0, _08023F88 - ldr r0, [r0] - movs r4, 0xE3 - lsls r4, 2 - adds r0, r4 - ldr r0, [r0] - bl sub_80073E0 - add sp, 0x58 - pop {r3,r4} - mov r8, r3 - mov r9, r4 - pop {r4-r7} - pop {r0} - bx r0 - .align 2, 0 -_08023F80: .4byte sUnknown_80DC998 -_08023F84: .4byte 0x00000372 -_08023F88: .4byte gUnknown_3001B60 - thumb_func_end sub_8023DA4 - .align 2,0 \ No newline at end of file diff --git a/include/code_8023868.h b/include/code_8023868.h index 12de8fefa..b7bb5e92f 100644 --- a/include/code_8023868.h +++ b/include/code_8023868.h @@ -1,6 +1,8 @@ #ifndef GUARD_CODE_8023868_H #define GUARD_CODE_8023868_H +#include "structs/menu.h" + struct unkStruct_3001B60 { u32 unk0; @@ -12,12 +14,13 @@ struct unkStruct_3001B60 u8 unk15; u8 unk16; u8 unk17; - s16 unk18; - s16 unk1A[427]; - s16 unk370; - s16 unk372; - s16 unk374; - s16 unk376; + u8 unk18; + s16 unk1A[413]; + u8 unk354; + MenuInputStruct unk358; + s32 unk38C; + u8 fill390[0x3f6-0x390]; + u8 unk3F6; }; // code_8023868.s diff --git a/include/pokemon.h b/include/pokemon.h index 48851851c..3cf1b8d91 100644 --- a/include/pokemon.h +++ b/include/pokemon.h @@ -146,6 +146,11 @@ static inline bool8 IsMonPartner(PokemonStruct1 *mon) return (mon->dungeonLocation.id == DUNGEON_JOIN_LOCATION_PARTNER); } +static inline bool8 IsMonLeader(PokemonStruct1 *mon) +{ + return (mon->dungeonLocation.id == DUNGEON_JOIN_LOCATION_LEADER); +} + // Needed to match a couple of functions which use species id. // The theory is that there was some internal species conversion which got scrapped later on. static inline s16 SpeciesId(s32 id) diff --git a/src/code_8023868.c b/src/code_8023868.c index 78957161d..f42796240 100644 --- a/src/code_8023868.c +++ b/src/code_8023868.c @@ -5,7 +5,18 @@ #include "pokemon.h" #include "structs/str_text.h" #include "text_util.h" +#include "text_1.h" +#include "text_2.h" +#include "text_3.h" #include "event_flag.h" +#include "menu_input.h" +#include "rescue_team_info.h" + +extern const u8 sUnknown_80DC988[]; +extern const u8 sUnknown_80DC980[]; +extern const u8 sUnknown_80DC998[]; + +extern bool8 sub_808D750(s32 index_); //static // MAKE STATIC WHEN code_8023868.s IS DONE IWRAM_INIT struct unkStruct_3001B60 *gUnknown_3001B60 = {NULL}; @@ -16,11 +27,78 @@ static void SortbyAlphabetNo(s32, s32); static void SortbyInternalNo(s32, s32); static void SortbyName(s32, s32); -//static bool8 sub_8024184(PokemonStruct1 *pokemon, u8 area); +bool8 sub_8024184(PokemonStruct1 *pokemon, u8 area); void sub_80241A8(void); // THE REMAINING CODE FROM THIS FILE IS IN code_8023868.s STARTING WITH sub_8023868 +void sub_8023DA4(void) +{ + s32 i, x; + u8 winTxtBuff[40]; + u8 nameTxtBuff[20]; + u8 txtBuff3[20]; + + CallPrepareTextbox_8008C54(gUnknown_3001B60->unk38C); + sub_80073B8(gUnknown_3001B60->unk38C); + switch (gUnknown_3001B60->unk0) { + case 2: + sub_80920D8(winTxtBuff); + PrintStringOnWindow(10, 0, winTxtBuff, gUnknown_3001B60->unk38C, '\0'); + break; + case 4: + PrintStringOnWindow(10, 0, sUnknown_80DC980, gUnknown_3001B60->unk38C, '\0'); + x = (gUnknown_3001B60->unk3F6 * 8) + 4; + sub_8012BC4(x, 0, gUnknown_3001B60->unk358.unk1E + 1, 2, 7, gUnknown_3001B60->unk38C); + break; + default: + PrintStringOnWindow(10, 0, sUnknown_80DC988, gUnknown_3001B60->unk38C, '\0'); + x = (gUnknown_3001B60->unk3F6 * 8) + 4; + sub_8012BC4(x, 0, gUnknown_3001B60->unk358.unk1E + 1, 2, 7, gUnknown_3001B60->unk38C); + break; + } + + for (i = 0; i < gUnknown_3001B60->unk358.unk1A; i++) { + s32 id = gUnknown_3001B60->unk1A[(gUnknown_3001B60->unk358.unk1E * gUnknown_3001B60->unk358.unk1C) + i]; + PokemonStruct1 *pokePtr = &gRecruitedPokemonRef->pokemon[id]; + s32 r6 = 7; + + if (PokemonFlag2(pokePtr)) { + if (IsMonPartner(pokePtr)) { + r6 = 6; + } + if (IsMonLeader(pokePtr)) { + r6 = 6; + } + if (pokePtr->isTeamLeader) { + r6 = 5; + } + } + else if (gUnknown_3001B60->unk18) { + if (sub_808D750(id)) { + r6 = 4; + } + else { + r6 = 2; + } + } + + if (gUnknown_3001B60->unk0 == 4) { + sub_8024184(pokePtr, gUnknown_3001B60->unk354); + } + // Needed to match. agbcc moment + else if (gUnknown_3001B60->unk0 == 2) { + + } + + sub_80922B4(nameTxtBuff, pokePtr->name, POKEMON_NAME_LENGTH); + sub_808D930(txtBuff3, pokePtr->speciesNum); + sprintfStatic(winTxtBuff, sUnknown_80DC998, r6, nameTxtBuff); + PrintStringOnWindow(8, GetMenuEntryYCoord(&gUnknown_3001B60->unk358, i), winTxtBuff, gUnknown_3001B60->unk38C, '\0'); + } + sub_80073E0(gUnknown_3001B60->unk38C); +} + s32 sub_8023F8C(void) { s32 i; @@ -136,109 +214,59 @@ void sub_80241A8(void) } } -// TODO: Remove hacky if/do -static void SortbyInternalNo(s32 param_1, s32 param_2) +static void SortbyInternalNo(s32 startId, s32 arrId) { - s16 *r4; - s32 iVar4; - s16 *r10; - s16 *r5; - s32 r6; - s32 r1; - s32 r7; - s32 r9; + s32 temp; + s32 i, j; + s16 *arrPtr = &gUnknown_3001B60->unk1A[arrId - 1]; - r10 = &gUnknown_3001B60->unk18 + param_2; - r7 = param_1; - r1 = param_2 - 1; - if (r7 < r1) { - r9 = r1; - do { - r4 = r10; - r6 = r1; - iVar4 = r7 + 1; - for (; r6 > r7; r6--) { - if (GetInternalNo(gRecruitedPokemonRef->pokemon[r5 = r4 - 1, *r5].speciesNum) > GetInternalNo(gRecruitedPokemonRef->pokemon[*r4].speciesNum)) { - r1 = *r4; - *r4 = *r5; - *r5 = r1; - } - r4 = r5; + for (i = startId; i < arrId - 1; i++) { + s16 * currPtr = arrPtr; + for (j = arrId - 1; j > i; j--) { + s16 * belowPtr; + // TODO: Fix ugly assigment below if possible + if (GetInternalNo(gRecruitedPokemonRef->pokemon[*(belowPtr = currPtr - 1)].speciesNum) > GetInternalNo(gRecruitedPokemonRef->pokemon[*currPtr].speciesNum)) { + SWAP(*currPtr, *belowPtr, temp); } - r7 = iVar4; - r1 = r9; - } while (iVar4 < r1); + currPtr--; + } } } -// TODO: Remove hacky if/do -static void SortbyAlphabetNo(s32 param_1, s32 param_2) +static void SortbyAlphabetNo(s32 startId, s32 arrId) { - s16 *r4; - s32 iVar4; - s16 *r10; - s16 *r5; - s32 r6; - s32 r1; - s32 r7; - s32 r9; + s32 temp; + s32 i, j; + s16 *arrPtr = &gUnknown_3001B60->unk1A[arrId - 1]; - r10 = &gUnknown_3001B60->unk18 + param_2; - r7 = param_1; - r1 = param_2 - 1; - if (r7 < r1) { - r9 = r1; - do { - r4 = r10; - r6 = r1; - iVar4 = r7 + 1; - for (; r6 > r7; r6--) { - if (GetAlphabetParentNo(gRecruitedPokemonRef->pokemon[r5 = r4 - 1, *r5].speciesNum, 0) > GetAlphabetParentNo(gRecruitedPokemonRef->pokemon[*r4].speciesNum, 0)) { - r1 = *r4; - *r4 = *r5; - *r5 = r1; - } - r4 = r5; + for (i = startId; i < arrId - 1; i++) { + s16 * currPtr = arrPtr; + for (j = arrId - 1; j > i; j--) { + s16 * belowPtr; + // TODO: Fix ugly assigment below if possible + if (GetAlphabetParentNo(gRecruitedPokemonRef->pokemon[*(belowPtr = currPtr - 1)].speciesNum, 0) > GetAlphabetParentNo(gRecruitedPokemonRef->pokemon[*currPtr].speciesNum, 0)) { + SWAP(*currPtr, *belowPtr, temp); } - r7 = iVar4; - r1 = r9; - } while (iVar4 < r1); + currPtr--; + } } } -// TODO: Remove hacky if/do -static void SortbyName(s32 param_1, s32 param_2) +static void SortbyName(s32 startId, s32 arrId) { - s16 *r4; - s32 iVar4; - s16 *r10; - s16 *r5; - s32 r6; - s32 r1; - s32 r7; - s32 r9; + s32 temp; + s32 i, j; + s16 *arrPtr = &gUnknown_3001B60->unk1A[arrId - 1]; - r10 = &gUnknown_3001B60->unk18 + param_2; - r7 = param_1; - r1 = param_2 - 1; - if (r7 < r1) { - r9 = r1; - do { - r4 = r10; - r6 = r1; - iVar4 = r7 + 1; - for (; r6 > r7; r6--) { - r5 = r4 - 1; - if (ComparePokemonNames(*r5, *r4)) { - r1 = *r4; - *r4 = *r5; - *r5 = r1; - } - r4 = r5; + for (i = startId; i < arrId - 1; i++) { + s16 * currPtr = arrPtr; + for (j = arrId - 1; j > i; j--) { + s16 *belowPtr = currPtr - 1; + if (ComparePokemonNames(*belowPtr, *currPtr)) { + SWAP(*currPtr, *belowPtr, temp); } - r7 = iVar4; - r1 = r9; - } while (iVar4 < r1); + currPtr--; + } } } @@ -246,7 +274,7 @@ UNUSED static PokemonStruct1 *sub_80243E8(void) { u8 buffer[40]; u8 nameBuffer[20]; - PokemonStruct1 *pokeStruct = &gRecruitedPokemonRef->pokemon[gUnknown_3001B60->unk1A[(gUnknown_3001B60->unk376 * gUnknown_3001B60->unk374) + gUnknown_3001B60->unk370]]; + PokemonStruct1 *pokeStruct = &gRecruitedPokemonRef->pokemon[gUnknown_3001B60->unk1A[(gUnknown_3001B60->unk358.unk1E * gUnknown_3001B60->unk358.unk1C) + gUnknown_3001B60->unk358.menuIndex]]; sub_80922B4(nameBuffer, pokeStruct->name, POKEMON_NAME_LENGTH); sprintfStatic(buffer, sUnknown_80DC9A4, nameBuffer);